{"openapi":"3.1.0","info":{"title":"Annie API","version":"1.0.1"},"paths":{"/admin/stats/overview":{"get":{"tags":["admin"],"summary":"Get Overview Stats","description":"Get aggregate entity counts.","operationId":"get_overview_stats_admin_stats_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/stats/users":{"get":{"tags":["admin"],"summary":"Get User Stats","description":"Get user signup trends over time.","operationId":"get_user_stats_admin_stats_users_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/usage":{"get":{"tags":["admin"],"summary":"Get Usage Stats","description":"Get platform usage metrics over time.","operationId":"get_usage_stats_admin_stats_usage_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/conversations":{"get":{"tags":["admin"],"summary":"Get Conversation Stats","description":"Get conversation trends over time.","operationId":"get_conversation_stats_admin_stats_conversations_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users":{"get":{"tags":["admin"],"summary":"List Users","description":"List all users with resource counts.","operationId":"list_users_admin_users_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}":{"get":{"tags":["admin"],"summary":"Get User","description":"Get detailed user info.","operationId":"get_user_admin_users__user_id__get","parameters":[{"name":"user_id","in":"path","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"}}}}}}},"/admin/connectors":{"get":{"tags":["admin"],"summary":"List Connectors","description":"List all connectors across all users.","operationId":"list_connectors_admin_connectors_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/connectors/health":{"get":{"tags":["admin"],"summary":"Get Connector Health","description":"Get connector health summary.","operationId":"get_connector_health_admin_connectors_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/feature-flags":{"get":{"tags":["admin"],"summary":"Admin List Feature Flags","description":"List all feature flags.","operationId":"admin_list_feature_flags_admin_feature_flags_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["admin"],"summary":"Admin Create Feature Flag","description":"Create a new feature flag.","operationId":"admin_create_feature_flag_admin_feature_flags_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFeatureFlagRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/feature-flags/{flag_id}":{"get":{"tags":["admin"],"summary":"Admin Get Feature Flag","description":"Get a feature flag with its user overrides.","operationId":"admin_get_feature_flag_admin_feature_flags__flag_id__get","parameters":[{"name":"flag_id","in":"path","required":true,"schema":{"type":"string","title":"Flag Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["admin"],"summary":"Admin Update Feature Flag","description":"Update a feature flag.","operationId":"admin_update_feature_flag_admin_feature_flags__flag_id__patch","parameters":[{"name":"flag_id","in":"path","required":true,"schema":{"type":"string","title":"Flag Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFeatureFlagRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Admin Delete Feature Flag","description":"Delete a feature flag.","operationId":"admin_delete_feature_flag_admin_feature_flags__flag_id__delete","parameters":[{"name":"flag_id","in":"path","required":true,"schema":{"type":"string","title":"Flag Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/feature-flags/{flag_id}/users/{user_id}":{"put":{"tags":["admin"],"summary":"Admin Set User Flag Override","description":"Set or update a user override for a feature flag.","operationId":"admin_set_user_flag_override_admin_feature_flags__flag_id__users__user_id__put","parameters":[{"name":"flag_id","in":"path","required":true,"schema":{"type":"string","title":"Flag Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetUserOverrideRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Admin Remove User Flag Override","description":"Remove a user override for a feature flag.","operationId":"admin_remove_user_flag_override_admin_feature_flags__flag_id__users__user_id__delete","parameters":[{"name":"flag_id","in":"path","required":true,"schema":{"type":"string","title":"Flag Id"}},{"name":"user_id","in":"path","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"}}}}}}},"/admin/users/{user_id}/feature-flags":{"get":{"tags":["admin"],"summary":"Admin Get User Flag Overrides","description":"Get all feature flag overrides for a specific user.","operationId":"admin_get_user_flag_overrides_admin_users__user_id__feature_flags_get","parameters":[{"name":"user_id","in":"path","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"}}}}}}},"/admin/users/{user_id}/grant-admin":{"post":{"tags":["admin"],"summary":"Grant Admin Role","description":"Grant admin access to a user by their ID.","operationId":"grant_admin_role_admin_users__user_id__grant_admin_post","parameters":[{"name":"user_id","in":"path","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"}}}}}}},"/admin/users/{user_id}/revoke-admin":{"post":{"tags":["admin"],"summary":"Revoke Admin Role","description":"Revoke admin access from a user by their ID.","operationId":"revoke_admin_role_admin_users__user_id__revoke_admin_post","parameters":[{"name":"user_id","in":"path","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"}}}}}}},"/admin/users/{user_id}/user-type":{"patch":{"tags":["admin"],"summary":"Set User Type","description":"Set user type and optional SDK limits (monthly base + overage).","operationId":"set_user_type_admin_users__user_id__user_type_patch","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetUserTypeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/plans":{"get":{"tags":["admin"],"summary":"Admin List Plans","description":"List all plans in the catalog.","operationId":"admin_list_plans_admin_plans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/users/{user_id}/plan":{"get":{"tags":["admin"],"summary":"Admin Get User Plan","description":"Get a user's plan, merged features, and usage summary.","operationId":"admin_get_user_plan_admin_users__user_id__plan_get","parameters":[{"name":"user_id","in":"path","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"}}}}}},"post":{"tags":["admin"],"summary":"Admin Change User Plan","description":"Change a user's plan (upgrade/downgrade).","operationId":"admin_change_user_plan_admin_users__user_id__plan_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePlanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/plan/overrides":{"patch":{"tags":["admin"],"summary":"Admin Update User Overrides","description":"Update per-user feature overrides.","operationId":"admin_update_user_overrides_admin_users__user_id__plan_overrides_patch","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOverridesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/plan/history":{"get":{"tags":["admin"],"summary":"Admin Get User Plan History","description":"Get plan change history for a user.","operationId":"admin_get_user_plan_history_admin_users__user_id__plan_history_get","parameters":[{"name":"user_id","in":"path","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"}}}}}}},"/admin/users/{user_id}/sdk/summary":{"get":{"tags":["admin"],"summary":"Admin User Sdk Summary","description":"Spend and volume for one account, with daily/endpoint/model/key splits.","operationId":"admin_user_sdk_summary_admin_users__user_id__sdk_summary_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":180,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/sdk/requests":{"get":{"tags":["admin"],"summary":"Admin User Sdk Requests","description":"The billed requests themselves, newest first, each with its own cost.","operationId":"admin_user_sdk_requests_admin_users__user_id__sdk_requests_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"endpoint","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint"}},{"name":"success","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"}},{"name":"conversation_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conversation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/sdk/conversations":{"get":{"tags":["admin"],"summary":"Admin User Sdk Conversations","description":"Conversations with the steps billed against them and their total cost.","operationId":"admin_user_sdk_conversations_admin_users__user_id__sdk_conversations_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/sdk/conversations/{conversation_id}":{"get":{"tags":["admin"],"summary":"Admin User Sdk Conversation Detail","description":"One conversation: its billed steps in order, plus the event timeline.","operationId":"admin_user_sdk_conversation_detail_admin_users__user_id__sdk_conversations__conversation_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/sdk/context":{"get":{"tags":["admin"],"summary":"Admin User Sdk Context","description":"Harness configuration: semantic layer size, skills, tools, docs, personas.","operationId":"admin_user_sdk_context_admin_users__user_id__sdk_context_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/sdk/context/{kind}":{"get":{"tags":["admin"],"summary":"Admin User Sdk Context Items","description":"The actual entries behind one context count (tables, skills, examples...).","operationId":"admin_user_sdk_context_items_admin_users__user_id__sdk_context__kind__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"kind","in":"path","required":true,"schema":{"type":"string","title":"Kind"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/sdk/benchmarks":{"get":{"tags":["admin"],"summary":"Admin User Sdk Benchmarks","description":"Recent benchmark runs for the account.","operationId":"admin_user_sdk_benchmarks_admin_users__user_id__sdk_benchmarks_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/sdk/benchmarks/{run_id}":{"get":{"tags":["admin"],"summary":"Admin User Sdk Benchmark Run","description":"One benchmark run with its per-case outcomes.","operationId":"admin_user_sdk_benchmark_run_admin_users__user_id__sdk_benchmarks__run_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/admin/setup/grant-admin":{"post":{"tags":["admin-setup"],"summary":"Grant Admin Access","description":"Grant admin access to a user by email.\n\nThis endpoint is intentionally unprotected so the first admin can bootstrap access.\nOnce you have admin access, you can remove or protect this endpoint.","operationId":"grant_admin_access_public_admin_setup_grant_admin_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantAdminRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ai/generate":{"post":{"tags":["ai"],"summary":"Generate","description":"Generate endpoint that auto-classifies intent and creates resources.\n\nThis endpoint:\n1. Validates the prompt using guardrails\n2. Classifies intent (if mode is 'auto') - insight, dashboard, or data_model\n3. Creates the appropriate resource\n4. Returns a redirect URL or helpful message\n\nMode options:\n- 'auto': Let AI classify the request type (default)\n- 'insight': Force creation of a single insight\n- 'dashboard': Force creation of a dashboard with multiple insights\n- 'data_model': Force creation of a data model (data transformation)\n\nReturns:\n- For successful creation: { action: 'redirect', url: '/insights/{id}', resource_type: 'insight' }\n- For rejected/other requests: { action: 'message', message: 'Helpful explanation...' }","operationId":"generate_ai_generate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateWithActionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ai/generate-insight":{"post":{"tags":["ai"],"summary":"Generate Insight","description":"Generate configuration from natural language prompt.\n\nThis endpoint converts a user's natural language description into a\nstructured configuration with query_config (source and steps).\n\nMode determines the output optimization:\n- 'insight': Optimized for visualization, includes chart_type\n- 'data_model': Optimized for data transformation, no chart_type","operationId":"generate_insight_ai_generate_insight_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateConfigRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ai/generate-dashboard":{"post":{"tags":["ai"],"summary":"Generate Dashboard","description":"Generate a complete dashboard with KPIs, charts, name, and filters.\n\nThis is the unified dashboard generation endpoint that creates all dashboard\ncomponents concurrently for maximum speed:\n- KPIs (3-5 metrics)\n- Charts (6-8 visualizations)\n- Dashboard name and description\n- Filters (3-5 filters)\n\nArgs:\n    source_id: The source to generate the dashboard from\n    prompt: Optional user prompt to customize the dashboard\n    save: Whether to persist the dashboard (default: True)\n\nReturns:\n    GenerateDashboardResponse with all generated components.\n    If save=True, includes dashboard ID and insight IDs.\n    If save=False, returns generated content without persisting.","operationId":"generate_dashboard_ai_generate_dashboard_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateDashboardRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateDashboardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api-keys":{"get":{"tags":["api-keys"],"summary":"List Api Keys","description":"List all active (non-revoked) API keys for the current user.","operationId":"list_api_keys_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyListResponse"}}}}}},"post":{"tags":["api-keys"],"summary":"Create Api Key","description":"Create a new API key. The full key is returned only in this response.","operationId":"create_api_key_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api-keys/{api_key_id}":{"delete":{"tags":["api-keys"],"summary":"Revoke Api Key","description":"Revoke an API key (soft delete).","operationId":"revoke_api_key_api_keys__api_key_id__delete","parameters":[{"name":"api_key_id","in":"path","required":true,"schema":{"type":"string","title":"Api Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api-usage/settings":{"patch":{"tags":["api-usage"],"summary":"Update Api Usage Settings","description":"Set the customer-authorized SDK overage allowance.","operationId":"update_api_usage_settings_api_usage_settings_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiUsageSettingsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiUsageSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api-usage":{"get":{"tags":["api-usage"],"summary":"Get Api Usage","description":"Get API usage statistics for the current user.\n\n``status``/``endpoint`` filter the log list only; the monthly counter and\nthe daily/endpoint aggregates always describe the full traffic.","operationId":"get_api_usage_api_usage_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","pattern":"^(all|success|error)$","default":"all","title":"Status"}},{"name":"endpoint","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiUsageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat":{"post":{"tags":["chat"],"summary":"Create Chat","description":"Create a new chat.","operationId":"create_chat_chat_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateChatRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["chat"],"summary":"List Chats","description":"List all chats for the current user.","operationId":"list_chats_chat_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat/{chat_id}":{"get":{"tags":["chat"],"summary":"Get Chat","description":"Get a chat by ID.","operationId":"get_chat_chat__chat_id__get","parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["chat"],"summary":"Update Chat","description":"Update a chat.","operationId":"update_chat_chat__chat_id__patch","parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["chat"],"summary":"Delete Chat","description":"Delete a chat.","operationId":"delete_chat_chat__chat_id__delete","parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat/stream":{"post":{"tags":["chat"],"summary":"Stream Chat","description":"Streaming chat endpoint using Server-Sent Events (SSE).\n\nHistory is loaded server-side from the chat_id to prevent prompt injection\nvia client-controlled history. The client only sends the new message and\nthe chat_id.\n\nThis endpoint enables an agentic conversation where the AI can:\n- Explore and search data sources\n- Generate insights and visualizations\n- Plan and create dashboards\n\nThe response is streamed as SSE events with the following types:\n- text_delta: Partial text from the assistant\n- tool_start: Tool execution starting\n- tool_result: Tool execution completed with result\n- error: An error occurred\n- done: Stream complete","operationId":"stream_chat_chat_stream_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cloud/usage":{"get":{"tags":["cloud"],"summary":"Get Cloud Usage","description":"Get the current user's cloud storage usage.\n\nReturns table count and storage size with their respective limits.","operationId":"get_cloud_usage_cloud_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloudUsageResponse"}}}}}}},"/connectors":{"post":{"tags":["connectors"],"summary":"Create Connector","description":"Create a new connector.\n\nArgs:\n    connector_request: The connector creation parameters\n    connector_service: Connector service (injected via DI)\n\nReturns:\n    ConnectorResponse: The created connector information","operationId":"create_connector_connectors_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConnectorRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["connectors"],"summary":"List Connectors","description":"List all connectors for the user.\n\nArgs:\n    connector_type: Optional filter by connector type\n    limit: Maximum number of results\n    offset: Number of records to skip\n    connector_service: Connector service (injected via DI)\n\nReturns:\n    ConnectorListResponse: List of connectors and metadata","operationId":"list_connectors_connectors_get","parameters":[{"name":"connector_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ConnectorType"},{"type":"null"}],"title":"Connector Type"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connectors/{connector_id}":{"delete":{"tags":["connectors"],"summary":"Delete Connector","description":"Delete a connector.\n\nArgs:\n    connector_id: ID of the connector to delete\n    connector_service: Connector service (injected via DI)\n\nReturns:\n    dict: Success status","operationId":"delete_connector_connectors__connector_id__delete","parameters":[{"name":"connector_id","in":"path","required":true,"schema":{"type":"string","title":"Connector Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Connector Connectors  Connector Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["connectors"],"summary":"Get Connector","description":"Get a single connector by ID.\n\nArgs:\n    connector_id: ID of the connector to retrieve\n    connector_service: Connector service (injected via DI)\n\nReturns:\n    ConnectorResponse: The connector information","operationId":"get_connector_connectors__connector_id__get","parameters":[{"name":"connector_id","in":"path","required":true,"schema":{"type":"string","title":"Connector Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["connectors"],"summary":"Update Connector","description":"Update a connector.\n\nArgs:\n    connector_id: ID of the connector to update\n    request: Fields to update\n    connector_service: Connector service (injected via DI)\n\nReturns:\n    ConnectorResponse: The updated connector","operationId":"update_connector_connectors__connector_id__patch","parameters":[{"name":"connector_id","in":"path","required":true,"schema":{"type":"string","title":"Connector Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateConnectorRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connectors/{connector_id}/tables":{"get":{"tags":["connectors"],"summary":"List Connector Tables","description":"List all tables for a connector.\n\nArgs:\n    connector_id: ID of the connector\n    limit: Maximum number of results\n    offset: Number of records to skip\n    connector_service: Connector service (injected via DI)\n\nReturns:\n    ConnectorTableListResponse: List of tables and metadata","operationId":"list_connector_tables_connectors__connector_id__tables_get","parameters":[{"name":"connector_id","in":"path","required":true,"schema":{"type":"string","title":"Connector Id"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorTableListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connectors/jobs/{job_id}":{"get":{"tags":["connectors"],"summary":"Get Ingest Job Status","description":"Get the status of an ingestion job.\n\nArgs:\n    job_id: ID of the ingestion job\n    connector_service: Connector service (injected via DI)\n\nReturns:\n    IngestJobResponse: The job status information","operationId":"get_ingest_job_status_connectors_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connectors/{connector_id}/mcp/test":{"post":{"tags":["connectors"],"summary":"Test Mcp Connection","description":"Test MCP server connectivity for a connector.\n\nArgs:\n    connector_id: ID of the connector\n    connector_service: Connector service (injected via DI)\n\nReturns:\n    dict: Connection test result","operationId":"test_mcp_connection_connectors__connector_id__mcp_test_post","parameters":[{"name":"connector_id","in":"path","required":true,"schema":{"type":"string","title":"Connector Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Test Mcp Connection Connectors  Connector Id  Mcp Test Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connectors/{connector_id}/mcp/tools":{"get":{"tags":["connectors"],"summary":"List Mcp Tools","description":"Discover available tools from the MCP server of a connector.\n\nArgs:\n    connector_id: ID of the connector\n    connector_service: Connector service (injected via DI)\n\nReturns:\n    dict: List of available tools","operationId":"list_mcp_tools_connectors__connector_id__mcp_tools_get","parameters":[{"name":"connector_id","in":"path","required":true,"schema":{"type":"string","title":"Connector Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Mcp Tools Connectors  Connector Id  Mcp Tools Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connectors/tables/{table_id}/ingest":{"post":{"tags":["connectors"],"summary":"Trigger Table Ingestion","description":"Trigger an ingestion job for a specific connector table.\n\nArgs:\n    table_id: ID of the connector table\n    connector_service: Connector service (injected via DI)\n\nReturns:\n    dict: Job ID and status","operationId":"trigger_table_ingestion_connectors_tables__table_id__ingest_post","parameters":[{"name":"table_id","in":"path","required":true,"schema":{"type":"string","title":"Table Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Table Ingestion Connectors Tables  Table Id  Ingest Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/databases":{"post":{"tags":["databases"],"summary":"Create Database","description":"Create a new database connection.","operationId":"create_database_databases_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDatabaseRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["databases"],"summary":"List Databases","description":"List user's database connections.","operationId":"list_databases_databases_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/databases/{database_id}":{"get":{"tags":["databases"],"summary":"Get Database","description":"Get a database connection by ID.","operationId":"get_database_databases__database_id__get","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","title":"Database Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["databases"],"summary":"Update Database","description":"Update a database connection.","operationId":"update_database_databases__database_id__patch","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","title":"Database Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDatabaseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["databases"],"summary":"Delete Database","description":"Delete a database connection.","operationId":"delete_database_databases__database_id__delete","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","title":"Database Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/databases/{database_id}/test":{"post":{"tags":["databases"],"summary":"Test Connection","description":"Test a database connection.","operationId":"test_connection_databases__database_id__test_post","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","title":"Database Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestConnectionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/databases/{database_id}/datasets":{"get":{"tags":["databases"],"summary":"List Datasets","description":"List datasets/schemas in a database.","operationId":"list_datasets_databases__database_id__datasets_get","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","title":"Database Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/databases/{database_id}/datasets/{dataset}/tables":{"get":{"tags":["databases"],"summary":"List Tables","description":"List tables in a dataset/schema.","operationId":"list_tables_databases__database_id__datasets__dataset__tables_get","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","title":"Database Id"}},{"name":"dataset","in":"path","required":true,"schema":{"type":"string","title":"Dataset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/databases/{database_id}/datasets/{dataset}/tables/{table}/schema":{"get":{"tags":["databases"],"summary":"Get Table Schema","description":"Get column schema for a table.","operationId":"get_table_schema_databases__database_id__datasets__dataset__tables__table__schema_get","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","title":"Database Id"}},{"name":"dataset","in":"path","required":true,"schema":{"type":"string","title":"Dataset"}},{"name":"table","in":"path","required":true,"schema":{"type":"string","title":"Table"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableSchemaResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/databases/{database_id}/import":{"post":{"tags":["databases"],"summary":"Import Tables","description":"Import selected tables as Annie sources.","operationId":"import_tables_databases__database_id__import_post","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","title":"Database Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportTablesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportTablesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/databases/{database_id}/sources":{"get":{"tags":["databases"],"summary":"List Database Sources","description":"List sources linked to a database.","operationId":"list_database_sources_databases__database_id__sources_get","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","title":"Database Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Database Sources Databases  Database Id  Sources Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/data-models":{"post":{"tags":["data-models"],"summary":"Create Data Model","description":"Create a new data model.\n\nArgs:\n    request: Data model creation request\n    data_model_service: Data model service (injected via DI)\n    source_service: Source service (injected via DI)\n    context: Request context (injected via DI)","operationId":"create_data_model_data_models_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDataModelRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataModelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/data-models/{data_model_id}":{"get":{"tags":["data-models"],"summary":"Get Data Model","description":"Get a single data model by ID.\n\nArgs:\n    data_model_id: Data model ID\n    data_model_service: Data model service (injected via DI)","operationId":"get_data_model_data_models__data_model_id__get","parameters":[{"name":"data_model_id","in":"path","required":true,"schema":{"type":"string","title":"Data Model Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataModelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["data-models"],"summary":"Update Data Model","description":"Update a data model.\n\nArgs:\n    data_model_id: Data model ID\n    request: Update request containing optional fields to update\n    data_model_service: Data model service (injected via DI)\n    context: Request context (injected via DI)\n\nReturns:\n    DataModelResponse: Updated data model","operationId":"update_data_model_data_models__data_model_id__patch","parameters":[{"name":"data_model_id","in":"path","required":true,"schema":{"type":"string","title":"Data Model Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchDataModelRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataModelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["data-models"],"summary":"Delete Data Model","description":"Delete a data model.\n\nArgs:\n    data_model_id: Data model ID\n    data_model_service: Data model service (injected via DI)\n    context: Request context (injected via DI)\n\nReturns:\n    dict: Success message","operationId":"delete_data_model_data_models__data_model_id__delete","parameters":[{"name":"data_model_id","in":"path","required":true,"schema":{"type":"string","title":"Data Model Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/feature-flags":{"get":{"tags":["feature-flags"],"summary":"Resolve Feature Flags","description":"Resolve all feature flags for the current authenticated user.","operationId":"resolve_feature_flags_feature_flags_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/files":{"post":{"tags":["files"],"summary":"Upload File","description":"Upload a CSV file and create a source.\n\nThis endpoint:\n1. Validates plan limits\n2. Checks cloud storage limits\n3. Uploads the CSV file\n4. Creates a source entry\n\nArgs:\n    file: The CSV file to upload\n    request: JSON-encoded UploadFileRequest containing display_name\n    source_service: Source service (injected via DI)\n    plan_service: Plan service for limit validation (injected via DI)\n    cloud_service: Cloud storage service (injected via DI)\n\nReturns:\n    UploadFileResponse: Upload status and source ID","operationId":"upload_file_files_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_file_files_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadFileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"tags":["health"],"summary":"Health Check","description":"Health check endpoint.\n\nReturns:\n    dict: Health status","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"tags":["health"],"summary":"Root","description":"Root endpoint with API information.\n\nReturns:\n    dict: API information","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dashboards":{"get":{"tags":["dashboards"],"summary":"List Dashboards","description":"List user's dashboards.\n\nArgs:\n    limit: Maximum number of dashboards to return\n    offset: Offset for pagination\n    service: Dashboard service (injected via DI)\n\nReturns:\n    List of dashboard metadata dictionaries","operationId":"list_dashboards_dashboards_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["dashboards"],"summary":"Create Dashboard","description":"Create a new dashboard.\n\nArgs:\n    request: Dashboard creation request\n    service: Dashboard service (injected via DI)\n\nReturns:\n    Created dashboard metadata","operationId":"create_dashboard_dashboards_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDashboardRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["dashboards"],"summary":"Batch Delete Dashboards","description":"Delete multiple dashboards by IDs.\n\nArgs:\n    request: BatchDeleteDashboardsRequest containing dashboard_ids to delete\n    service: Dashboard service (injected via DI)\n\nReturns:\n    BatchDeleteDashboardsResponse: Count of deleted dashboards and any failed IDs","operationId":"batch_delete_dashboards_dashboards_delete","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchDeleteDashboardsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchDeleteDashboardsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboards/{dashboard_id}":{"get":{"tags":["dashboards"],"summary":"Get Dashboard","description":"Get dashboard metadata with insights list and config.\n\nArgs:\n    dashboard_id: Dashboard ID\n    service: Dashboard service (injected via DI)\n\nReturns:\n    Dashboard metadata with insights list and config","operationId":"get_dashboard_dashboards__dashboard_id__get","parameters":[{"name":"dashboard_id","in":"path","required":true,"schema":{"type":"string","title":"Dashboard Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["dashboards"],"summary":"Update Dashboard","description":"Update a dashboard.\n\nArgs:\n    dashboard_id: Dashboard ID\n    request: Dashboard update request\n    service: Dashboard service (injected via DI)\n\nReturns:\n    Updated dashboard metadata","operationId":"update_dashboard_dashboards__dashboard_id__patch","parameters":[{"name":"dashboard_id","in":"path","required":true,"schema":{"type":"string","title":"Dashboard Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDashboardRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["dashboards"],"summary":"Delete Dashboard","description":"Delete a dashboard.\n\nArgs:\n    dashboard_id: Dashboard ID\n    service: Dashboard service (injected via DI)\n\nReturns:\n    No content on success","operationId":"delete_dashboard_dashboards__dashboard_id__delete","parameters":[{"name":"dashboard_id","in":"path","required":true,"schema":{"type":"string","title":"Dashboard Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboards/{dashboard_id}/insights":{"post":{"tags":["dashboards"],"summary":"Add Insight To Dashboard","description":"Add an insight to a dashboard.\n\nArgs:\n    dashboard_id: Dashboard ID\n    request: Add insight request with insight_id\n    service: Dashboard service (injected via DI)\n\nReturns:\n    Updated dashboard metadata","operationId":"add_insight_to_dashboard_dashboards__dashboard_id__insights_post","parameters":[{"name":"dashboard_id","in":"path","required":true,"schema":{"type":"string","title":"Dashboard Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddInsightRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/insights":{"get":{"tags":["insights"],"summary":"List Insights","description":"List insights for the user.\n\nArgs:\n    limit: Maximum number of insights to return\n    offset: Number of records to skip\n    type: Optional chart type filter (bar, line, pie, donut, kpi, horizontal_bar)\n    source_id: Optional source ID filter\n    insight_service: Insight service (injected via DI)\n    data_model_service: Data model service (injected via DI)","operationId":"list_insights_insights_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"source_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsightListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["insights"],"summary":"Create Insight","description":"Create a new insight.\n\nArgs:\n    request: Insight creation request\n    insight_service: Insight service (injected via DI)\n    data_model_service: Data model service (injected via DI)\n    context: Request context (injected via DI)","operationId":"create_insight_insights_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInsightRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsightResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["insights"],"summary":"Batch Delete Insights","description":"Delete multiple insights by IDs.\n\nArgs:\n    request: BatchDeleteInsightsRequest containing insight_ids to delete\n    insight_service: Insight service (injected via DI)\n    context: Request context (injected via DI)\n\nReturns:\n    BatchDeleteInsightsResponse: Count of deleted insights and any failed IDs","operationId":"batch_delete_insights_insights_delete","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchDeleteInsightsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchDeleteInsightsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/insights/search":{"get":{"tags":["insights"],"summary":"Search Insights","description":"Search insights for the user (for search bar).\nResults are deduplicated by name.\n\nArgs:\n    limit: Maximum number of insights to return\n    offset: Number of records to skip\n    insight_service: Insight service (injected via DI)\n    data_model_service: Data model service (injected via DI)","operationId":"search_insights_insights_search_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsightListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/insights/{insight_id}":{"get":{"tags":["insights"],"summary":"Get Insight","description":"Get a single insight by ID.\n\nArgs:\n    insight_id: Insight ID\n    insight_service: Insight service (injected via DI)\n    data_model_service: Data model service (injected via DI)","operationId":"get_insight_insights__insight_id__get","parameters":[{"name":"insight_id","in":"path","required":true,"schema":{"type":"string","title":"Insight Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsightResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["insights"],"summary":"Update Insight","description":"Update an insight.\n\nArgs:\n    insight_id: Insight ID\n    request: Update request containing optional fields to update\n    insight_service: Insight service (injected via DI)\n    data_model_service: Data model service (injected via DI)\n    context: Request context (injected via DI)\n\nReturns:\n    InsightResponse: Updated insight","operationId":"update_insight_insights__insight_id__patch","parameters":[{"name":"insight_id","in":"path","required":true,"schema":{"type":"string","title":"Insight Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchInsightRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsightResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["insights"],"summary":"Delete Insight","description":"Delete an insight.\n\nArgs:\n    insight_id: Insight ID\n    insight_service: Insight service (injected via DI)\n    context: Request context (injected via DI)\n\nReturns:\n    No content on success","operationId":"delete_insight_insights__insight_id__delete","parameters":[{"name":"insight_id","in":"path","required":true,"schema":{"type":"string","title":"Insight Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding":{"get":{"tags":["onboarding"],"summary":"Get Onboarding","description":"Get onboarding data for the current user.\n\nReturns:\n    dict: The user's onboarding data or None if not found","operationId":"get_onboarding_onboarding_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["onboarding"],"summary":"Update Onboarding","description":"Upsert (insert or update) onboarding data for the current user.\n\nArgs:\n    update_data: The onboarding data to update\n    service: Onboarding service (injected via DI)\n\nReturns:\n    dict: The updated or created onboarding data","operationId":"update_onboarding_onboarding_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/plans/current":{"get":{"tags":["plans"],"summary":"Get Current Plan","description":"Get the current user's plan, merged features, and usage summary.","operationId":"get_current_plan_plans_current_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CurrentPlanResponse"}}}}}}},"/plans/available":{"get":{"tags":["plans"],"summary":"Get Available Plans","description":"Get all active plans (for upgrade page).","operationId":"get_available_plans_plans_available_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AvailablePlanResponse"},"type":"array","title":"Response Get Available Plans Plans Available Get"}}}}}}},"/plans/history":{"get":{"tags":["plans"],"summary":"Get Plan History","description":"Get the current user's plan change history.","operationId":"get_plan_history_plans_history_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PlanHistoryResponse"},"type":"array","title":"Response Get Plan History Plans History Get"}}}}}}},"/query":{"post":{"tags":["query"],"summary":"Execute Query","description":"Execute a step-based query with transformations applied in sequence.\n\nThis endpoint uses a pipeline approach where each step transforms the data:\n1. Start with a source table or data model\n2. Apply transformations in order (filter → summarize → order → limit)\n3. Return the final result\n\nExamples:\n\nSimple filtered query:\n```json\n{\n    \"source\": \"orders\",\n    \"steps\": [\n        {\n            \"type\": \"filter\",\n            \"conditions\": [\n                {\"column\": \"status\", \"operator\": \"equals\", \"value\": \"completed\"},\n                {\"column\": \"amount\", \"operator\": \"gte\", \"value\": 100}\n            ]\n        },\n        {\n            \"type\": \"order_by\",\n            \"columns\": [{\"column\": \"created_at\", \"direction\": \"desc\"}]\n        },\n        {\n            \"type\": \"limit\",\n            \"value\": 50\n        }\n    ]\n}\n```\n\nAggregation query:\n```json\n{\n    \"source\": \"sales\",\n    \"steps\": [\n        {\n            \"type\": \"filter\",\n            \"conditions\": [\n                {\"column\": \"date\", \"operator\": \"gte\", \"value\": \"2024-01-01\"}\n            ]\n        },\n        {\n            \"type\": \"summarize\",\n            \"aggregations\": [\n                {\n                    \"column\": \"revenue\",\n                    \"function\": \"sum\",\n                    \"label\": \"total_revenue\",\n                    \"format\": \"currency:usd\"\n                },\n                {\n                    \"column\": \"order_id\",\n                    \"function\": \"count_distinct\",\n                    \"label\": \"order_count\"\n                }\n            ],\n            \"breakdowns\": [\n                {\"column\": \"region\", \"label\": \"Region\"},\n                {\"column\": \"product_category\", \"label\": \"Category\"}\n            ]\n        },\n        {\n            \"type\": \"order_by\",\n            \"columns\": [{\"column\": \"total_revenue\", \"direction\": \"desc\"}]\n        },\n        {\n            \"type\": \"limit\",\n            \"value\": 10\n        }\n    ]\n}\n```\n\nArgs:\n    query_request: Step-based query specification\n    query_service: Unified query service (injected via DI)\n    context: Request context (injected via DI)\n\nReturns:\n    QueryResponse with data, metadata","operationId":"execute_query_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRequest"}}},"required":true},"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"}}}}}}},"/query/distinct-values":{"post":{"tags":["query"],"summary":"Get Distinct Values","description":"Get distinct values for a column in a source table.\n\nThis endpoint is used to populate filter dropdowns in dashboards.\nIt returns unique values sorted by frequency (most common first).\n\nSupports both cloud sources and external database sources.","operationId":"get_distinct_values_query_distinct_values_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DistinctValuesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DistinctValuesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/relationships":{"get":{"tags":["relationships"],"summary":"List Relationships","description":"List all relationships for the authenticated user.\n\nArgs:\n    limit: Maximum number of relationships to return\n    offset: Number of records to skip\n    relationship_service: Relationship service (injected via DI)","operationId":"list_relationships_relationships_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Maximum number of relationships to return","default":100,"title":"Limit"},"description":"Maximum number of relationships to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of records to skip","default":0,"title":"Offset"},"description":"Number of records to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelationshipListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["relationships"],"summary":"Create Relationship","description":"Create a new relationship between two sources.\n\nArgs:\n    request: CreateRelationshipRequest with relationship details\n    relationship_service: Relationship service (injected via DI)","operationId":"create_relationship_relationships_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRelationshipRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelationshipResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/relationships/{relationship_id}":{"get":{"tags":["relationships"],"summary":"Get Relationship","description":"Get a specific relationship by ID.\n\nArgs:\n    relationship_id: Relationship ID\n    relationship_service: Relationship service (injected via DI)","operationId":"get_relationship_relationships__relationship_id__get","parameters":[{"name":"relationship_id","in":"path","required":true,"schema":{"type":"string","title":"Relationship Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelationshipResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["relationships"],"summary":"Update Relationship","description":"Update a relationship.\n\nArgs:\n    relationship_id: Relationship ID\n    request: UpdateRelationshipRequest with fields to update\n    relationship_service: Relationship service (injected via DI)","operationId":"update_relationship_relationships__relationship_id__patch","parameters":[{"name":"relationship_id","in":"path","required":true,"schema":{"type":"string","title":"Relationship Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRelationshipRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelationshipResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["relationships"],"summary":"Delete Relationship","description":"Delete a relationship.\n\nArgs:\n    relationship_id: Relationship ID\n    relationship_service: Relationship service (injected via DI)","operationId":"delete_relationship_relationships__relationship_id__delete","parameters":[{"name":"relationship_id","in":"path","required":true,"schema":{"type":"string","title":"Relationship Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/relationships/source/{source_id}":{"get":{"tags":["relationships"],"summary":"Get Relationships For Source","description":"Get all relationships involving a specific source.\n\nArgs:\n    source_id: Source ID\n    relationship_service: Relationship service (injected via DI)","operationId":"get_relationships_for_source_relationships_source__source_id__get","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RelationshipResponse"},"title":"Response Get Relationships For Source Relationships Source  Source Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/relationships/source/{source_id}/columns":{"get":{"tags":["relationships"],"summary":"Get Related Columns For Source","description":"Get all related columns for a source based on its relationships.\n\nThis endpoint returns information about columns that can be accessed\nfrom related sources via defined relationships. This is used by the\nexplore page to show available columns from related sources.\n\nArgs:\n    source_id: Source ID to get related columns for\n    relationship_service: Relationship service (injected via DI)\n\nReturns:\n    SourceWithRelatedColumnsResponse with related column groups","operationId":"get_related_columns_for_source_relationships_source__source_id__columns_get","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceWithRelatedColumnsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sdk/query":{"post":{"tags":["sdk"],"summary":"Sdk Query","description":"Convert a natural language query to DSL and SQL.\n\nDEPRECATED: SDK v1 is superseded by SDK v3 (POST /v3/sdk/step). This\nendpoint keeps working and returns Deprecation/Link headers; it will be\nremoved in a future release.\n\nThe SDK sends a natural language query along with schema context\n(table names, columns, types). Annie generates a DSL representation\nand compiles it to SQL in the requested dialect.\n\nThe SDK then executes the SQL locally against the customer's database.\nData never leaves the customer's infrastructure.","operationId":"sdk_query_sdk_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SDKQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SDKQueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"deprecated":true}},"/sdk/explain":{"post":{"tags":["sdk"],"summary":"Sdk Explain","description":"Generate AI insights about query results.\n\nDEPRECATED: SDK v1 is superseded by SDK v3 (POST /v3/sdk/step).\n\nAfter executing a query locally, the SDK can send the results\n(first 50 rows) to get natural language insights about the data.","operationId":"sdk_explain_sdk_explain_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SDKExplainRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SDKExplainResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"deprecated":true}},"/v2/sdk/query":{"post":{"tags":["sdk-v2"],"summary":"Sdk V2 Query","description":"Natural language to SQL via agentic loop with tool calling.\n\nDEPRECATED: SDK v2 is superseded by SDK v3 (POST /v3/sdk/step). This\nendpoint keeps working and returns Deprecation/Link headers; it will be\nremoved in a future release.","operationId":"sdk_v2_query_v2_sdk_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SDKv2QueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SDKv2QueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"deprecated":true}},"/v2/sdk/explain":{"post":{"tags":["sdk-v2"],"summary":"Sdk V2 Explain","description":"Generate AI insights about query results.\n\nDEPRECATED: SDK v2 is superseded by SDK v3 (POST /v3/sdk/step).","operationId":"sdk_v2_explain_v2_sdk_explain_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SDKv2ExplainRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SDKv2ExplainResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"deprecated":true}},"/v2/sdk/semantic-layer":{"get":{"tags":["sdk-v2"],"summary":"Get Semantic Layer","description":"Fetch full semantic layer metadata for given tables.","operationId":"get_semantic_layer_v2_sdk_semantic_layer_get","parameters":[{"name":"table_names","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated table names","title":"Table Names"},"description":"Comma-separated table names"},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Read a frozen version (id); default Current","title":"Version"},"description":"Read a frozen version (id); default Current"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/semantic-layer/tables":{"get":{"tags":["sdk-v2"],"summary":"Get Semantic Layer Tables","description":"List the user's semantic tables for Current (default) or a frozen version.","operationId":"get_semantic_layer_tables_v2_sdk_semantic_layer_tables_get","parameters":[{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Read a frozen version (id); default Current","title":"Version"},"description":"Read a frozen version (id); default Current"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["sdk-v2"],"summary":"Upsert Semantic Table","description":"Create or update table-level semantic metadata.","operationId":"upsert_semantic_table_v2_sdk_semantic_layer_tables_put","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SemanticTableRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/semantic-layer/shadow-preview":{"get":{"tags":["sdk-v2"],"summary":"Get Shadow Preview","description":"Synthetic preview rows for one semantic-layer table ENTRY.\n\nKeyed by entry id, not table name: several entries can share a physical\ntable (e.g. an untagged one and an it/de-tagged one) and the preview must\nshow the columns of the entry being edited, not whichever entry the\ntag-blind resolver would pick.\n\nGenerated by the deterministic shadow generator (services/evals/shadow):\nsame definition -> same rows, bit for bit. Purely illustrative: Annie never\nhas the customer's real data.","operationId":"get_shadow_preview_v2_sdk_semantic_layer_shadow_preview_get","parameters":[{"name":"entry","in":"query","required":true,"schema":{"type":"string","description":"Semantic-table ENTRY id to preview","title":"Entry"},"description":"Semantic-table ENTRY id to preview"},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Read a frozen version (id); default Current","title":"Version"},"description":"Read a frozen version (id); default Current"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/semantic-layer/entry/{entry_id}":{"get":{"tags":["sdk-v2"],"summary":"Get Semantic Table Entry","description":"One semantic-table entry with its own columns and metrics (by id).","operationId":"get_semantic_table_entry_v2_sdk_semantic_layer_entry__entry_id__get","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/semantic-layer/versions":{"get":{"tags":["sdk-v2"],"summary":"List Semantic Layer Versions","description":"List the account's named versions (newest first).","operationId":"list_semantic_layer_versions_v2_sdk_semantic_layer_versions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["sdk-v2"],"summary":"Save Semantic Layer Version","description":"Freeze Current into a new immutable named version.","operationId":"save_semantic_layer_version_v2_sdk_semantic_layer_versions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVersionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/semantic-layer/versions/{version_id}":{"patch":{"tags":["sdk-v2"],"summary":"Update Semantic Layer Version","description":"Edit a version's note (the snapshot itself stays immutable).","operationId":"update_semantic_layer_version_v2_sdk_semantic_layer_versions__version_id__patch","parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateVersionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sdk-v2"],"summary":"Delete Semantic Layer Version","description":"Delete a named version (cascades its frozen rows).","operationId":"delete_semantic_layer_version_v2_sdk_semantic_layer_versions__version_id__delete","parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/semantic-layer/versions/{version_id}/restore":{"post":{"tags":["sdk-v2"],"summary":"Restore Semantic Layer Version","description":"Overwrite Current with a copy of this version (destructive).","operationId":"restore_semantic_layer_version_v2_sdk_semantic_layer_versions__version_id__restore_post","parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/semantic-layer/versions/{version_id}/diff":{"get":{"tags":["sdk-v2"],"summary":"Diff Semantic Layer Version","description":"Structural diff of a version against a base (default: Current).\n\nShows what the version adds/removes/changes vs the base (base → target).","operationId":"diff_semantic_layer_version_v2_sdk_semantic_layer_versions__version_id__diff_get","parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}},{"name":"against","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Base to compare against: a version id, or omitted for Current","title":"Against"},"description":"Base to compare against: a version id, or omitted for Current"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/semantic-layer/diff":{"get":{"tags":["sdk-v2"],"summary":"Diff Semantic Layer","description":"Structural diff between any two harness states (base → target).\n\nEach side is a version id, or ``current``/omitted for the editable Current\nstate. Symmetric counterpart to the per-version diff, for the compare page.","operationId":"diff_semantic_layer_v2_sdk_semantic_layer_diff_get","parameters":[{"name":"base","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Base side: a version id, or 'current'/omitted","title":"Base"},"description":"Base side: a version id, or 'current'/omitted"},{"name":"target","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Target side: a version id, or 'current'/omitted","title":"Target"},"description":"Target side: a version id, or 'current'/omitted"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/semantic-layer/tables/{table_name}":{"delete":{"tags":["sdk-v2"],"summary":"Delete Semantic Table","description":"Delete a table entry (one by ``id``, or all entries for the table_name).","operationId":"delete_semantic_table_v2_sdk_semantic_layer_tables__table_name__delete","parameters":[{"name":"table_name","in":"path","required":true,"schema":{"type":"string","title":"Table Name"}},{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Delete one specific entry by id","title":"Id"},"description":"Delete one specific entry by id"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/semantic-layer/columns/{table_name}":{"put":{"tags":["sdk-v2"],"summary":"Upsert Column Metadata","description":"Create or update column metadata for a table.","operationId":"upsert_column_metadata_v2_sdk_semantic_layer_columns__table_name__put","parameters":[{"name":"table_name","in":"path","required":true,"schema":{"type":"string","title":"Table Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColumnMetadataRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/semantic-layer/columns/{table_name}/{column_name}":{"delete":{"tags":["sdk-v2"],"summary":"Delete Column Metadata","description":"Delete column metadata (one row by ``id``, or by column within an entry).","operationId":"delete_column_metadata_v2_sdk_semantic_layer_columns__table_name___column_name__delete","parameters":[{"name":"table_name","in":"path","required":true,"schema":{"type":"string","title":"Table Name"}},{"name":"column_name","in":"path","required":true,"schema":{"type":"string","title":"Column Name"}},{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Delete one specific entry by id","title":"Id"},"description":"Delete one specific entry by id"},{"name":"semantic_table_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Owning entry (required when not deleting by id)","title":"Semantic Table Id"},"description":"Owning entry (required when not deleting by id)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/semantic-layer/metrics/{table_name}":{"put":{"tags":["sdk-v2"],"summary":"Upsert Metric Definition","description":"Create or update a metric definition for a table.","operationId":"upsert_metric_definition_v2_sdk_semantic_layer_metrics__table_name__put","parameters":[{"name":"table_name","in":"path","required":true,"schema":{"type":"string","title":"Table Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetricDefinitionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/semantic-layer/metrics/{table_name}/{metric_name}":{"delete":{"tags":["sdk-v2"],"summary":"Delete Metric Definition","description":"Delete a metric definition (one row by ``id``, or by name within an entry).","operationId":"delete_metric_definition_v2_sdk_semantic_layer_metrics__table_name___metric_name__delete","parameters":[{"name":"table_name","in":"path","required":true,"schema":{"type":"string","title":"Table Name"}},{"name":"metric_name","in":"path","required":true,"schema":{"type":"string","title":"Metric Name"}},{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Delete one specific entry by id","title":"Id"},"description":"Delete one specific entry by id"},{"name":"semantic_table_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Owning entry (required when not deleting by id)","title":"Semantic Table Id"},"description":"Owning entry (required when not deleting by id)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/semantic-layer/relationships":{"get":{"tags":["sdk-v2"],"summary":"Get Relationships","description":"List all table relationships for the current user.","operationId":"get_relationships_v2_sdk_semantic_layer_relationships_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["sdk-v2"],"summary":"Upsert Relationship","description":"Create or update a table relationship (join definition).","operationId":"upsert_relationship_v2_sdk_semantic_layer_relationships_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableRelationshipRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/semantic-layer/relationships/{relationship_id}":{"delete":{"tags":["sdk-v2"],"summary":"Delete Relationship","description":"Delete a table relationship.","operationId":"delete_relationship_v2_sdk_semantic_layer_relationships__relationship_id__delete","parameters":[{"name":"relationship_id","in":"path","required":true,"schema":{"type":"string","title":"Relationship Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/semantic-layer/export/{entry_id}":{"get":{"tags":["sdk-v2"],"summary":"Export Table Config","description":"Export one table entry (metadata, its columns, its metrics) as JSON.","operationId":"export_table_config_v2_sdk_semantic_layer_export__entry_id__get","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableConfigExport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/semantic-layer/import/{table_name}":{"post":{"tags":["sdk-v2"],"summary":"Import Table Config","description":"Import table configuration from JSON. Upserts table, columns, and metrics.","operationId":"import_table_config_v2_sdk_semantic_layer_import__table_name__post","parameters":[{"name":"table_name","in":"path","required":true,"schema":{"type":"string","title":"Table Name"}},{"name":"entry_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Target entry id (the entry open in the editor) — takes precedence over the id inside the JSON","title":"Entry Id"},"description":"Target entry id (the entry open in the editor) — takes precedence over the id inside the JSON"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableConfigImportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/sql-examples":{"get":{"tags":["sdk-v2"],"summary":"List Sql Examples","description":"List all SQL examples for the current user.","operationId":"list_sql_examples_v2_sdk_sql_examples_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SqlExampleResponse"},"type":"array","title":"Response List Sql Examples V2 Sdk Sql Examples Get"}}}}}},"post":{"tags":["sdk-v2"],"summary":"Create Sql Example","description":"Create a SQL example, or update the existing one with the same question.\n\nTreated as an upsert keyed on (user_id, question): re-saving a question that\nalready exists overwrites its SQL/note rather than failing on the unique\nconstraint. This makes the \"edit\" and \"delete + re-add same question\" flows\nidempotent instead of returning a 500.","operationId":"create_sql_example_v2_sdk_sql_examples_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSqlExampleRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SqlExampleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/sql-examples/{example_id}":{"put":{"tags":["sdk-v2"],"summary":"Update Sql Example","description":"Update an existing SQL example. Re-embeds if question changed.","operationId":"update_sql_example_v2_sdk_sql_examples__example_id__put","parameters":[{"name":"example_id","in":"path","required":true,"schema":{"type":"string","title":"Example Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSqlExampleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SqlExampleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sdk-v2"],"summary":"Delete Sql Example","description":"Delete a SQL example.","operationId":"delete_sql_example_v2_sdk_sql_examples__example_id__delete","parameters":[{"name":"example_id","in":"path","required":true,"schema":{"type":"string","title":"Example Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/eval-suites":{"get":{"tags":["sdk-v2"],"summary":"List Eval Suites","description":"List the account's benchmarks with case counts and last-run briefs\n(latest run of any status + latest completed run) for the index cards.","operationId":"list_eval_suites_v2_sdk_eval_suites_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["sdk-v2"],"summary":"Create Eval Suite","description":"Create a benchmark.","operationId":"create_eval_suite_v2_sdk_eval_suites_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveEvalSuiteRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/eval-suites/{suite_id}":{"put":{"tags":["sdk-v2"],"summary":"Update Eval Suite","description":"Update a benchmark's name/description/run defaults.","operationId":"update_eval_suite_v2_sdk_eval_suites__suite_id__put","parameters":[{"name":"suite_id","in":"path","required":true,"schema":{"type":"string","title":"Suite Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveEvalSuiteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sdk-v2"],"summary":"Delete Eval Suite","description":"Delete a benchmark and its cases. Historical runs survive through their\nsnapshots unless ``delete_history`` is set.","operationId":"delete_eval_suite_v2_sdk_eval_suites__suite_id__delete","parameters":[{"name":"suite_id","in":"path","required":true,"schema":{"type":"string","title":"Suite Id"}},{"name":"delete_history","in":"query","required":false,"schema":{"type":"boolean","description":"Also delete this benchmark's runs","default":false,"title":"Delete History"},"description":"Also delete this benchmark's runs"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/eval-cases":{"get":{"tags":["sdk-v2"],"summary":"List Eval Cases","description":"List the account's benchmark cases, optionally scoped to one benchmark.","operationId":"list_eval_cases_v2_sdk_eval_cases_get","parameters":[{"name":"suite_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suite Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["sdk-v2"],"summary":"Create Eval Case","description":"Create a benchmark case (question + evaluation criteria at minimum).","operationId":"create_eval_case_v2_sdk_eval_cases_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveEvalCaseRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/eval-cases/{case_id}":{"put":{"tags":["sdk-v2"],"summary":"Update Eval Case","description":"Update a benchmark case by id (its benchmark is immutable).","operationId":"update_eval_case_v2_sdk_eval_cases__case_id__put","parameters":[{"name":"case_id","in":"path","required":true,"schema":{"type":"string","title":"Case Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveEvalCaseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sdk-v2"],"summary":"Delete Eval Case","description":"Delete a benchmark case.","operationId":"delete_eval_case_v2_sdk_eval_cases__case_id__delete","parameters":[{"name":"case_id","in":"path","required":true,"schema":{"type":"string","title":"Case Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/eval-cases/suggest-checks":{"post":{"tags":["sdk-v2"],"summary":"Suggest Eval Checks","description":"Propose typed checks extracted from free-text criteria (advisory only:\nthe user confirms each suggestion before it is saved).","operationId":"suggest_eval_checks_v2_sdk_eval_cases_suggest_checks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuggestChecksRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/eval-cases/preview-gold-sql":{"post":{"tags":["sdk-v2"],"summary":"Preview Eval Gold Sql","description":"Validate and execute an expected SQL against the exact hybrid\nCSV/synthetic context a run would use, before saving it as gold.","operationId":"preview_eval_gold_sql_v2_sdk_eval_cases_preview_gold_sql_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewGoldSqlRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/eval-cases/{case_id}/test":{"post":{"tags":["sdk-v2"],"summary":"Test Eval Case","description":"Run one case through the full agent + judge path without saving a run.\n\nThe response is intentionally inline and ephemeral: no ``eval_runs`` or\n``eval_case_results`` rows are created, so iterative case authoring does\nnot pollute benchmark history or affect previous-run comparisons.","operationId":"test_eval_case_v2_sdk_eval_cases__case_id__test_post","parameters":[{"name":"case_id","in":"path","required":true,"schema":{"type":"string","title":"Case Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestEvalCaseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/eval-cases/run":{"post":{"tags":["sdk-v2"],"summary":"Run Eval Cases","description":"Run cases synchronously against a freshly generated hybrid shadow DB.\n\nLegacy/internal-testing endpoint: drives the real v3 agent per case (LLM\ncalls), so a large suite takes a while and the report is ephemeral. The\nproduct flow uses persisted runs (``POST /eval-runs``).","operationId":"run_eval_cases_v2_sdk_eval_cases_run_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunEvalCasesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/eval-runs":{"post":{"tags":["sdk-v2"],"summary":"Create Eval Run","description":"Enqueue a persisted benchmark run and execute it in the background.\n\nThe run row (snapshots + context) is the durable artifact: the response\nreturns immediately and the report is polled via ``GET /eval-runs/{id}``.","operationId":"create_eval_run_v2_sdk_eval_runs_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEvalRunRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["sdk-v2"],"summary":"List Eval Runs","description":"Run history, newest first.","operationId":"list_eval_runs_v2_sdk_eval_runs_get","parameters":[{"name":"suite_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suite Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/eval-runs/context-preview":{"get":{"tags":["sdk-v2"],"summary":"Eval Run Context Preview","description":"The schema/fixture composition a run would freeze right now (shown in\nthe run form; the worker refuses to start when it changes before claim).","operationId":"eval_run_context_preview_v2_sdk_eval_runs_context_preview_get","parameters":[{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},{"name":"tags","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tags"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/eval-runs/{run_id}":{"get":{"tags":["sdk-v2"],"summary":"Get Eval Run","description":"One run with its per-case results (the persisted report).","operationId":"get_eval_run_v2_sdk_eval_runs__run_id__get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sdk-v2"],"summary":"Delete Eval Run","description":"Delete a finished run and all its persisted case artifacts.","operationId":"delete_eval_run_v2_sdk_eval_runs__run_id__delete","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/eval-runs/{run_id}/cancel":{"post":{"tags":["sdk-v2"],"summary":"Cancel Eval Run","description":"Cancel a queued or running benchmark run (observed between cases).","operationId":"cancel_eval_run_v2_sdk_eval_runs__run_id__cancel_post","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/playground/datasets":{"get":{"tags":["sdk-v2"],"summary":"List Playground Datasets","description":"List active table fixture statuses and removable orphaned fixtures.","operationId":"list_playground_datasets_v2_sdk_playground_datasets_get","parameters":[{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},{"name":"tags","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tags"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlaygroundDatasetResponse"},"title":"Response List Playground Datasets V2 Sdk Playground Datasets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/playground/datasets/{table_name}":{"post":{"tags":["sdk-v2"],"summary":"Upload Playground Dataset","description":"Validate and atomically create or replace one physical-table fixture.","operationId":"upload_playground_dataset_v2_sdk_playground_datasets__table_name__post","parameters":[{"name":"table_name","in":"path","required":true,"schema":{"type":"string","title":"Table Name"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},{"name":"tags","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tags"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_playground_dataset_v2_sdk_playground_datasets__table_name__post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaygroundDatasetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/playground/datasets/{dataset_id}":{"delete":{"tags":["sdk-v2"],"summary":"Delete Playground Dataset","description":"Delete a fixture by UUID, scoped to the authenticated account.","operationId":"delete_playground_dataset_v2_sdk_playground_datasets__dataset_id__delete","parameters":[{"name":"dataset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Dataset Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/playground/chat":{"post":{"tags":["sdk-v2"],"summary":"Playground Chat Route","description":"Advance a playground conversation through the REAL SDK (SSE).\n\nRuns ``annie_sdk.v3.Agent`` in-process over the shadow DuckDB, self-calling\n``/v3/sdk/step``: every turn is billed on the user's dedicated \"Playground\"\nAPI key and logged with playground provenance. Conversation state is the\nopaque SDK ``dump()`` blob, echoed back in the ``done`` event.","operationId":"playground_chat_route_v2_sdk_playground_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaygroundChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/playground/shadow-query":{"post":{"tags":["sdk-v2"],"summary":"Playground Shadow Query","description":"Run authored SQL over the shadow DB and return the rows.\n\nBacks the row previews in the data-mart and SQL-example editors: the\nstructural checks say what shape the SQL has, this says what it does.\nExecution happens in an ephemeral in-memory DuckDB holding generated rows\n(plus the account's CSV fixtures), the same data the playground runs on.\nCustomer data is never touched, and user SQL never reaches Annie's app DB.","operationId":"playground_shadow_query_v2_sdk_playground_shadow_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShadowQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/data-marts":{"get":{"tags":["sdk-v2"],"summary":"List Data Marts","description":"List the account's data marts.","operationId":"list_data_marts_v2_sdk_data_marts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/DataMartResponse"},"type":"array","title":"Response List Data Marts V2 Sdk Data Marts Get"}}}}}},"post":{"tags":["sdk-v2"],"summary":"Create Data Mart","description":"Create a data mart (validated + column lineage resolved server-side).","operationId":"create_data_mart_v2_sdk_data_marts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveDataMartRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataMartResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/data-marts/{mart_id}":{"put":{"tags":["sdk-v2"],"summary":"Update Data Mart","description":"Update a data mart (revalidates and re-resolves lineage).","operationId":"update_data_mart_v2_sdk_data_marts__mart_id__put","parameters":[{"name":"mart_id","in":"path","required":true,"schema":{"type":"string","title":"Mart Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveDataMartRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataMartResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sdk-v2"],"summary":"Delete Data Mart","description":"Delete a data mart.","operationId":"delete_data_mart_v2_sdk_data_marts__mart_id__delete","parameters":[{"name":"mart_id","in":"path","required":true,"schema":{"type":"string","title":"Mart Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/sdk/data-marts/preview":{"post":{"tags":["sdk-v2"],"summary":"Preview Data Mart","description":"Dry-run a mart definition while the user types.\n\nReturns validation errors + the resolved columns (lineage): the exact table\nshape the agent will see. Deliberately NO data execution: customer data\nlives in the customer's database (SDK mode), and Annie's own app DB must\nnever run user-supplied SQL.","operationId":"preview_data_mart_v2_sdk_data_marts_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewDataMartRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/sdk/agents":{"get":{"tags":["sdk-v3"],"summary":"List Agents","description":"List the account's agent personas, the default agent first.\n\nThe default agent is always present — synthesized with the built-in\npersona when the account never customized it.","operationId":"list_agents_v3_sdk_agents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentListResponse"}}}}}}},"/v3/sdk/agents/{agent_id}":{"get":{"tags":["sdk-v3"],"summary":"Get Agent","description":"Fetch one agent persona. Unknown named agents are 404 (fail-closed).","operationId":"get_agent_v3_sdk_agents__agent_id__get","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["sdk-v3"],"summary":"Upsert Agent","description":"Create or overwrite one agent persona.","operationId":"upsert_agent_v3_sdk_agents__agent_id__put","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePersonaRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["sdk-v3"],"summary":"Rename Agent","description":"Rename one named agent.\n\nThe id is what the SDK passes, so a rename changes how runs select this\nagent: steps naming the old id stop resolving. The default agent is the\ncontract for \"no agent id was sent\" and cannot be renamed.","operationId":"rename_agent_v3_sdk_agents__agent_id__patch","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameAgentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sdk-v3"],"summary":"Delete Agent","description":"Delete a named agent; for the default agent, reset to the built-in.\n\nA named agent stops resolving after deletion (steps naming it will 404);\nthe default agent always resolves, so deleting it just reverts its\ncontent. Idempotent either way.","operationId":"delete_agent_v3_sdk_agents__agent_id__delete","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/sdk/agents/{agent_id}/assignments":{"get":{"tags":["sdk-v3"],"summary":"Get Agent Assignments","description":"The skills and tools this agent holds.","operationId":"get_agent_assignments_v3_sdk_agents__agent_id__assignments_get","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentAssignmentsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["sdk-v3"],"summary":"Set Agent Assignments","description":"Replace what this agent holds, leaving the other agents untouched.","operationId":"set_agent_assignments_v3_sdk_agents__agent_id__assignments_put","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveAgentAssignmentsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentAssignmentsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/sdk/persona":{"get":{"tags":["sdk-v3"],"summary":"Get Persona","description":"Return the default agent's persona, or the built-in when unset.","operationId":"get_persona_v3_sdk_persona_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaResponse"}}}}}},"put":{"tags":["sdk-v3"],"summary":"Set Persona","description":"Set or overwrite the default agent's persona.","operationId":"set_persona_v3_sdk_persona_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePersonaRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sdk-v3"],"summary":"Reset Persona","description":"Reset the default agent to the built-in persona.","operationId":"reset_persona_v3_sdk_persona_delete","responses":{"204":{"description":"Successful Response"}}}},"/v3/sdk/skills":{"get":{"tags":["sdk-v3"],"summary":"List Skills","operationId":"list_skills_v3_sdk_skills_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillListResponse"}}}}}}},"/v3/sdk/skills/{skill_id}":{"get":{"tags":["sdk-v3"],"summary":"Get Skill","operationId":"get_skill_v3_sdk_skills__skill_id__get","parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","title":"Skill Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["sdk-v3"],"summary":"Save Skill","operationId":"save_skill_v3_sdk_skills__skill_id__put","parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","title":"Skill Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveSkillRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sdk-v3"],"summary":"Delete Skill","operationId":"delete_skill_v3_sdk_skills__skill_id__delete","parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","title":"Skill Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/sdk/skills/{skill_id}/agents":{"put":{"tags":["sdk-v3"],"summary":"Set Skill Agents","description":"Reassign a skill on its own, without the form's Save.","operationId":"set_skill_agents_v3_sdk_skills__skill_id__agents_put","parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","title":"Skill Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetAgentsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/sdk/tools":{"get":{"tags":["sdk-v3"],"summary":"List Tools","operationId":"list_tools_v3_sdk_tools_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolListResponse"}}}}}}},"/v3/sdk/tools/{tool_id}":{"get":{"tags":["sdk-v3"],"summary":"Get Tool","operationId":"get_tool_v3_sdk_tools__tool_id__get","parameters":[{"name":"tool_id","in":"path","required":true,"schema":{"type":"string","title":"Tool Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["sdk-v3"],"summary":"Save Tool","operationId":"save_tool_v3_sdk_tools__tool_id__put","parameters":[{"name":"tool_id","in":"path","required":true,"schema":{"type":"string","title":"Tool Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveToolRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sdk-v3"],"summary":"Delete Tool","operationId":"delete_tool_v3_sdk_tools__tool_id__delete","parameters":[{"name":"tool_id","in":"path","required":true,"schema":{"type":"string","title":"Tool Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/sdk/tools/{tool_id}/agents":{"put":{"tags":["sdk-v3"],"summary":"Set Tool Agents","description":"Reassign a tool on its own, without the form's Save.","operationId":"set_tool_agents_v3_sdk_tools__tool_id__agents_put","parameters":[{"name":"tool_id","in":"path","required":true,"schema":{"type":"string","title":"Tool Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetAgentsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/sdk/usage":{"get":{"tags":["sdk-v3"],"summary":"Sdk V3 Usage","description":"Poll the monthly SDK budget without spending a turn.\n\nFree and unbilled — the response mirrors the ``usage`` block that rides\nevery ``/step`` response, plus the configured limits themselves.","operationId":"sdk_v3_usage_v3_sdk_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SdkUsageResponse"}}}}}}},"/v3/sdk/step":{"post":{"tags":["sdk-v3"],"summary":"Sdk V3 Step","description":"Advance the agent by exactly one turn.\n\nOne ``/step`` = one public turn = one billed unit. The route may make\nbounded internal model calls to load skills or answer through the docs sub\nagent; those calls never become public or separately billed turns. The SDK\nloops over public turns, executing ``query`` calls against the local DB and\nresending the sampled result until the agent emits terminal ``text`` (or\npauses on ``ask``). Enforces the single monthly SDK budget before billing —\nthe same limit v2 requests draw from, counted across all SDK usage this\nmonth.","operationId":"sdk_v3_step_v3_sdk_step_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/sdk/documents":{"get":{"tags":["sdk-v3-documents"],"summary":"List Documents","operationId":"list_documents_v3_sdk_documents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentListResponse"}}}}}},"post":{"tags":["sdk-v3-documents"],"summary":"Upload Document","operationId":"upload_document_v3_sdk_documents_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_document_v3_sdk_documents_post"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/sdk/documents/{document_id}":{"post":{"tags":["sdk-v3-documents"],"summary":"Replace Document","operationId":"replace_document_v3_sdk_documents__document_id__post","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Document Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_replace_document_v3_sdk_documents__document_id__post"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["sdk-v3-documents"],"summary":"Get Document","operationId":"get_document_v3_sdk_documents__document_id__get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["sdk-v3-documents"],"summary":"Update Document","operationId":"update_document_v3_sdk_documents__document_id__patch","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Document Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sdk-v3-documents"],"summary":"Delete Document","operationId":"delete_document_v3_sdk_documents__document_id__delete","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Document Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/sdk/documents/{document_id}/file":{"get":{"tags":["sdk-v3-documents"],"summary":"Download Document","description":"The original PDF, for rendering the document as the user sees it.","operationId":"download_document_v3_sdk_documents__document_id__file_get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/sdk/documents/{document_id}/preview":{"get":{"tags":["sdk-v3-documents"],"summary":"Preview Document","operationId":"preview_document_v3_sdk_documents__document_id__preview_get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentPreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/sdk/documents/{document_id}/retry":{"post":{"tags":["sdk-v3-documents"],"summary":"Retry Document","operationId":"retry_document_v3_sdk_documents__document_id__retry_post","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Document Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sdk-conversations":{"get":{"tags":["sdk-conversations"],"summary":"List Sdk Conversations","operationId":"list_sdk_conversations_sdk_conversations_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"end_user","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":128},{"type":"null"}],"title":"End User"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["running","idle","awaiting_answer","budget_exhausted"],"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"has_errors","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Errors"}},{"name":"failure_category","in":"query","required":false,"schema":{"anyOf":[{"enum":["timeout","scoping_rejected","docs_unavailable","chart_error","syntax_or_validation","db_error","other"],"type":"string"},{"type":"null"}],"title":"Failure Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SdkConversationListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sdk-conversations/stats":{"get":{"tags":["sdk-conversations"],"summary":"Get Sdk Conversation Stats","operationId":"get_sdk_conversation_stats_sdk_conversations_stats_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Days"}},{"name":"end_user","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":128},{"type":"null"}],"title":"End User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SdkConversationStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sdk-conversations/users":{"get":{"tags":["sdk-conversations"],"summary":"List Sdk Conversation End Users","operationId":"list_sdk_conversation_end_users_sdk_conversations_users_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SdkConversationEndUsersResponse"}}}}}}},"/sdk-conversations/settings":{"get":{"tags":["sdk-conversations"],"summary":"Get Sdk Conversation Settings","operationId":"get_sdk_conversation_settings_sdk_conversations_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SdkConversationSettingsResponse"}}}}}},"patch":{"tags":["sdk-conversations"],"summary":"Update Sdk Conversation Settings","operationId":"update_sdk_conversation_settings_sdk_conversations_settings_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSdkConversationSettingsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SdkConversationSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sdk-conversations/{conversation_id}":{"get":{"tags":["sdk-conversations"],"summary":"Get Sdk Conversation","operationId":"get_sdk_conversation_sdk_conversations__conversation_id__get","parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SdkConversationDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources/by-name/{table_name}":{"get":{"tags":["sources"],"summary":"Get Source By Table Name","description":"Get a source by its table name.\n\nThis endpoint is more efficient than fetching all sources and filtering client-side.\n\nArgs:\n    table_name: The table name to look up\n    include_related_columns: If true, include related columns from connected sources\n    source_service: Source service (injected via DI)\n    relationship_service: Relationship service (injected via DI)\n\nReturns:\n    SourceResponse or SourceWithRelationsResponse: The source details","operationId":"get_source_by_table_name_sources_by_name__table_name__get","parameters":[{"name":"table_name","in":"path","required":true,"schema":{"type":"string","title":"Table Name"}},{"name":"include_related_columns","in":"query","required":false,"schema":{"type":"boolean","description":"Include related columns from connected sources via relationships","default":false,"title":"Include Related Columns"},"description":"Include related columns from connected sources via relationships"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SourceResponse"},{"$ref":"#/components/schemas/SourceWithRelationsResponse"}],"title":"Response Get Source By Table Name Sources By Name  Table Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources":{"get":{"tags":["sources"],"summary":"List Sources","description":"List sources for the authenticated user.\n\nArgs:\n    limit: Maximum number of sources to return\n    offset: Number of records to skip\n    source_service: Source service (injected via DI)","operationId":"list_sources_sources_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Maximum number of sources to return (default 100)","default":10,"title":"Limit"},"description":"Maximum number of sources to return (default 100)"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of records to skip before collecting results","default":0,"title":"Offset"},"description":"Number of records to skip before collecting results"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["sources"],"summary":"Create Source","description":"Create a new source entry (without file upload).\n\nArgs:\n    request: CreateSourceRequest containing display_name\n    source_service: Source service (injected via DI)\n\nReturns:\n    CreateSourceResponse: The created source details","operationId":"create_source_sources_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSourceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSourceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sources"],"summary":"Batch Delete Sources","description":"Delete multiple sources by IDs.\n\nArgs:\n    request: BatchDeleteSourcesRequest containing source_ids to delete\n    source_service: Source service (injected via DI)\n\nReturns:\n    BatchDeleteSourcesResponse: Count of deleted sources and any failed IDs","operationId":"batch_delete_sources_sources_delete","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchDeleteSourcesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchDeleteSourcesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources/{source_id}":{"get":{"tags":["sources"],"summary":"Get Source","description":"Get a specific source by ID.\n\nArgs:\n    source_id: Source ID\n    include_related_columns: If true, include related columns from connected sources\n    source_service: Source service (injected via DI)\n    relationship_service: Relationship service (injected via DI)\n\nReturns:\n    SourceResponse or SourceWithRelationsResponse: The source details","operationId":"get_source_sources__source_id__get","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}},{"name":"include_related_columns","in":"query","required":false,"schema":{"type":"boolean","description":"Include related columns from connected sources via relationships","default":false,"title":"Include Related Columns"},"description":"Include related columns from connected sources via relationships"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SourceResponse"},{"$ref":"#/components/schemas/SourceWithRelationsResponse"}],"title":"Response Get Source Sources  Source Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sources"],"summary":"Delete Source","description":"Delete a source by ID.\n\nArgs:\n    source_id: Source ID to delete\n    source_service: Source service (injected via DI)","operationId":"delete_source_sources__source_id__delete","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["sources"],"summary":"Update Source","description":"Update a source by ID.\n\nArgs:\n    source_id: Source ID to update\n    request: UpdateSourceRequest with fields to update\n    source_service: Source service (injected via DI)\n\nReturns:\n    SourceResponse: The updated source","operationId":"update_source_sources__source_id__patch","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSourceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sql-generation/sql-examples":{"post":{"tags":["sql-generation"],"summary":"Generate Sql For Example","description":"Generate SQL for a question (session-auth, used by the settings UI).\n\nGenerates against the account's semantic layer, then binds the result on the\nshadow DB and retries when it does not run (services/sql_generation/\ngenerator.py). Costs 1 query token however many attempts that takes, and\nnothing at all when no model was called.","operationId":"generate_sql_for_example_sql_generation_sql_examples_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateExampleSqlRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sql-generation/data-marts":{"post":{"tags":["sql-generation"],"summary":"Generate Sql For Data Mart","description":"Draft a mart's SELECT from its name and description (session-auth, UI).\n\nSame engine as the SQL-example button: generate against the account's\nsemantic layer, then bind on the shadow DB and retry when it does not run.\nCosts 1 query token however many attempts that takes, and nothing at all\nwhen no model was called.","operationId":"generate_sql_for_data_mart_sql_generation_data_marts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateMartSqlRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/payment/stripe/create-customer-portal":{"post":{"tags":["stripe"],"summary":"Create Customer Portal","description":"Create a customer portal session","operationId":"create_customer_portal_payment_stripe_create_customer_portal_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/payment/stripe/subscription":{"get":{"tags":["stripe"],"summary":"Get Subscription","description":"Get the current user's subscription","operationId":"get_subscription_payment_stripe_subscription_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/payment/stripe/create-payment-session":{"post":{"tags":["stripe"],"summary":"Create Payment Session","description":"Create a payment session for subscription","operationId":"create_payment_session_payment_stripe_create_payment_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerSubscriptionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/payment/stripe/cancel-subscription":{"post":{"tags":["stripe"],"summary":"Cancel Subscription","description":"Cancel the current subscription","operationId":"cancel_subscription_payment_stripe_cancel_subscription_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/payment/stripe/delete-subscription":{"post":{"tags":["stripe"],"summary":"Delete Subscription","description":"Delete the current subscription immediately","operationId":"delete_subscription_payment_stripe_delete_subscription_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/payment/stripe/update-subscription":{"post":{"tags":["stripe"],"summary":"Update Subscription","description":"Update subscription to a different package","operationId":"update_subscription_payment_stripe_update_subscription_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSubscriptionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/payment/stripe/webhook":{"post":{"tags":["stripe"],"summary":"Stripe Webhook","description":"Handle Stripe webhook events\nThis is a public endpoint that processes webhook calls from Stripe","operationId":"stripe_webhook_public_payment_stripe_webhook_post","parameters":[{"name":"stripe-signature","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connectors/posthog/projects":{"post":{"tags":["posthog"],"summary":"List Posthog Projects","description":"List PostHog projects accessible by the given personal API key.\nCalled during connector setup so users can pick a project.","operationId":"list_posthog_projects_connectors_posthog_projects_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostHogProjectsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Posthog Projects Connectors Posthog Projects Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/api/connectors/hubspot/authorize":{"get":{"tags":["hubspot-oauth"],"summary":"Initiate Oauth","description":"Initiates HubSpot OAuth flow\nFrontend redirects user to this endpoint","operationId":"initiate_oauth_public_api_connectors_hubspot_authorize_get","parameters":[{"name":"connector_name","in":"query","required":true,"schema":{"type":"string","description":"Name for the connector","title":"Connector Name"},"description":"Name for the connector"},{"name":"user_id","in":"query","required":true,"schema":{"type":"string","description":"User ID to associate with this connector","title":"User Id"},"description":"User ID to associate with this connector"},{"name":"destination_database_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Destination database ID for connector data","title":"Destination Database Id"},"description":"Destination database ID for connector data"},{"name":"destination_dataset_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Destination dataset/schema name","title":"Destination Dataset Id"},"description":"Destination dataset/schema name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/api/connectors/hubspot/callback":{"get":{"tags":["hubspot-oauth"],"summary":"Oauth Callback","description":"HubSpot redirects here after user authorizes.\nExchange code for access token.\n\nNOTE: This is a public route — no session cookie is present because the\nbrowser was redirected here from HubSpot. The user_id comes from the\nsigned JWT state token, not from request context.","operationId":"oauth_callback_public_api_connectors_hubspot_callback_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":true,"schema":{"type":"string","description":"JWT state token","title":"State"},"description":"JWT state token"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/api/connectors/hubspot/refresh":{"post":{"tags":["hubspot-oauth"],"summary":"Refresh Access Token","description":"Refresh an expired access token\nCall this when the access token expires","operationId":"refresh_access_token_public_api_connectors_hubspot_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/api/connectors/meta_ads/authorize":{"get":{"tags":["meta-ads-oauth"],"summary":"Initiate Oauth","description":"Initiate Meta Ads OAuth flow — returns the authorization URL.","operationId":"initiate_oauth_public_api_connectors_meta_ads_authorize_get","parameters":[{"name":"connector_name","in":"query","required":true,"schema":{"type":"string","description":"Name for the connector","title":"Connector Name"},"description":"Name for the connector"},{"name":"user_id","in":"query","required":true,"schema":{"type":"string","description":"User ID","title":"User Id"},"description":"User ID"},{"name":"destination_database_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Database Id"}},{"name":"destination_dataset_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Dataset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/api/connectors/meta_ads/callback":{"get":{"tags":["meta-ads-oauth"],"summary":"Oauth Callback","description":"Meta redirects here after the user authorizes.\n\nExchanges the code for a long-lived token, fetches ad accounts,\ncreates a setup JWT, and redirects to the frontend callback page\nwhere the user will pick an ad account.","operationId":"oauth_callback_public_api_connectors_meta_ads_callback_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":true,"schema":{"type":"string","description":"JWT state token","title":"State"},"description":"JWT state token"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/api/connectors/meta_ads/finalize":{"post":{"tags":["meta-ads-oauth"],"summary":"Finalize Oauth","description":"Create the Meta Ads connector after the user selects an ad account.\n\nDecodes the setup JWT to recover the access token, then creates the\nconnector with the token + ad_account_id in credential_params.","operationId":"finalize_oauth_public_api_connectors_meta_ads_finalize_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routes__connectors__meta_ads__FinalizeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/api/connectors/google_ads/authorize":{"get":{"tags":["google-ads-oauth"],"summary":"Initiate Oauth","description":"Initiate Google Ads OAuth flow — returns the authorization URL.","operationId":"initiate_oauth_public_api_connectors_google_ads_authorize_get","parameters":[{"name":"connector_name","in":"query","required":true,"schema":{"type":"string","description":"Name for the connector","title":"Connector Name"},"description":"Name for the connector"},{"name":"user_id","in":"query","required":true,"schema":{"type":"string","description":"User ID","title":"User Id"},"description":"User ID"},{"name":"destination_database_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Database Id"}},{"name":"destination_dataset_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Dataset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/api/connectors/google_ads/callback":{"get":{"tags":["google-ads-oauth"],"summary":"Oauth Callback","description":"Google redirects here after the user authorizes.\n\nExchanges the code for tokens, fetches accessible customer accounts,\ncreates a setup JWT, and redirects to the frontend callback page\nwhere the user will pick a customer account.","operationId":"oauth_callback_public_api_connectors_google_ads_callback_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":true,"schema":{"type":"string","description":"JWT state token","title":"State"},"description":"JWT state token"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/api/connectors/google_ads/finalize":{"post":{"tags":["google-ads-oauth"],"summary":"Finalize Oauth","description":"Create the Google Ads connector after the user selects a customer account.\n\nDecodes the setup JWT to recover tokens, then creates the connector\nwith the refresh token, developer token, and customer_id in credential_params.","operationId":"finalize_oauth_public_api_connectors_google_ads_finalize_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routes__connectors__google_ads__FinalizeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/api/connectors/google_analytics/authorize":{"get":{"tags":["google-analytics-oauth"],"summary":"Initiate Oauth","description":"Initiate Google Analytics OAuth flow — returns the authorization URL.","operationId":"initiate_oauth_public_api_connectors_google_analytics_authorize_get","parameters":[{"name":"connector_name","in":"query","required":true,"schema":{"type":"string","description":"Name for the connector","title":"Connector Name"},"description":"Name for the connector"},{"name":"user_id","in":"query","required":true,"schema":{"type":"string","description":"User ID","title":"User Id"},"description":"User ID"},{"name":"destination_database_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Database Id"}},{"name":"destination_dataset_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Dataset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/api/connectors/google_analytics/callback":{"get":{"tags":["google-analytics-oauth"],"summary":"Oauth Callback","description":"Google redirects here after the user authorizes.\n\nExchanges the code for tokens, fetches accessible GA4 properties,\ncreates a setup JWT, and redirects to the frontend callback page\nwhere the user will pick a property.","operationId":"oauth_callback_public_api_connectors_google_analytics_callback_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":true,"schema":{"type":"string","description":"JWT state token","title":"State"},"description":"JWT state token"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/api/connectors/google_analytics/finalize":{"post":{"tags":["google-analytics-oauth"],"summary":"Finalize Oauth","description":"Create the Google Analytics connector after the user selects a property.\n\nDecodes the setup JWT to recover tokens, then creates the connector\nwith the refresh token and property_id in credential_params.","operationId":"finalize_oauth_public_api_connectors_google_analytics_finalize_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routes__connectors__google_analytics__FinalizeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/api/connectors/google_search_console/authorize":{"get":{"tags":["google-search-console-oauth"],"summary":"Initiate Oauth","description":"Initiate Google Search Console OAuth flow — returns the authorization URL.","operationId":"initiate_oauth_public_api_connectors_google_search_console_authorize_get","parameters":[{"name":"connector_name","in":"query","required":true,"schema":{"type":"string","description":"Name for the connector","title":"Connector Name"},"description":"Name for the connector"},{"name":"user_id","in":"query","required":true,"schema":{"type":"string","description":"User ID","title":"User Id"},"description":"User ID"},{"name":"destination_database_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Database Id"}},{"name":"destination_dataset_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Dataset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/api/connectors/google_search_console/callback":{"get":{"tags":["google-search-console-oauth"],"summary":"Oauth Callback","description":"Google redirects here after the user authorizes.\n\nExchanges the code for tokens, fetches verified sites,\ncreates a setup JWT, and redirects to the frontend callback page\nwhere the user will pick a site.","operationId":"oauth_callback_public_api_connectors_google_search_console_callback_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":true,"schema":{"type":"string","description":"JWT state token","title":"State"},"description":"JWT state token"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/api/connectors/google_search_console/finalize":{"post":{"tags":["google-search-console-oauth"],"summary":"Finalize Oauth","description":"Create the Google Search Console connector after the user selects a site.\n\nDecodes the setup JWT to recover tokens, then creates the connector\nwith the refresh token and site_url in credential_params.","operationId":"finalize_oauth_public_api_connectors_google_search_console_finalize_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routes__connectors__google_search_console__FinalizeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/api/connectors/stripe/authorize":{"get":{"tags":["stripe-oauth"],"summary":"Initiate Oauth","description":"Initiates Stripe Connect OAuth flow.\n\nThe user will be redirected to Stripe to authorize your platform\nto access their Stripe account data.\n\nFlow:\n1. User clicks authorize link from your frontend\n2. User is redirected to Stripe to log in and authorize\n3. Stripe redirects back to your callback URL with an authorization code\n4. You exchange the code for the connected account ID","operationId":"initiate_oauth_public_api_connectors_stripe_authorize_get","parameters":[{"name":"connector_name","in":"query","required":true,"schema":{"type":"string","description":"Name for the connector","title":"Connector Name"},"description":"Name for the connector"},{"name":"user_id","in":"query","required":true,"schema":{"type":"string","description":"User ID to associate with this connector","title":"User Id"},"description":"User ID to associate with this connector"},{"name":"destination_database_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Destination database ID for connector data","title":"Destination Database Id"},"description":"Destination database ID for connector data"},{"name":"destination_dataset_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Destination dataset/schema name","title":"Destination Dataset Id"},"description":"Destination dataset/schema name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/api/connectors/stripe/callback":{"get":{"tags":["stripe-oauth"],"summary":"Oauth Callback","description":"Stripe redirects here after user authorizes.\nExchange the authorization code for the connected account ID.\n\nFor Standard accounts, Stripe returns:\n- stripe_user_id: The connected account ID (acct_xxx)\n- scope: The granted scope\n- livemode: Whether this is a live or test connection\n\nNote: Standard accounts don't return access_token/refresh_token.\nYou use your platform's secret key + Stripe-Account header to access their data.","operationId":"oauth_callback_public_api_connectors_stripe_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","description":"Authorization code from Stripe","title":"Code"},"description":"Authorization code from Stripe"},{"name":"state","in":"query","required":true,"schema":{"type":"string","description":"JWT state token","title":"State"},"description":"JWT state token"},{"name":"error","in":"query","required":false,"schema":{"type":"string","description":"Error code if authorization failed","title":"Error"},"description":"Error code if authorization failed"},{"name":"error_description","in":"query","required":false,"schema":{"type":"string","description":"Error description","title":"Error Description"},"description":"Error description"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/api/connectors/stripe/deauthorize":{"post":{"tags":["stripe-oauth"],"summary":"Deauthorize","description":"Revoke access to a connected account.\n\nCall this when a user wants to disconnect their Stripe account from your platform.","operationId":"deauthorize_public_api_connectors_stripe_deauthorize_post","parameters":[{"name":"stripe_user_id","in":"query","required":true,"schema":{"type":"string","title":"Stripe User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jobs/pubsub/status":{"post":{"tags":["jobs"],"summary":"Receive Status Update","description":"Receive job status updates from Dispatcher via Pub/Sub push.\n\nThis endpoint is configured as a push subscription endpoint\nfor the job.status topic.\n\nValidates JWT token from message attributes to ensure the callback\nis authentic and authorized.\n\nNote: Specific domain exceptions (UnauthorizedError, ForbiddenError, ValidationError)\nare allowed to bubble up to return appropriate status codes. The decorator handles\nunexpected exceptions.","operationId":"receive_status_update_jobs_pubsub_status_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PubSubEnvelope"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jobs/scheduler-tick":{"post":{"tags":["jobs"],"summary":"Scheduler Tick","description":"Global scheduler tick. Called by Cloud Scheduler (production) or\nthe local scheduler emulator (development).\n\nAuthentication:\n- Uses a shared SCHEDULER_SECRET sent as a Bearer token.\n- In production: Cloud Scheduler includes the secret from Secret Manager.\n- In development: The local emulator reads it from the .env file.\n\nThis endpoint checks all connectors with active schedules, compares\nagainst last completed job timestamps, and triggers ingestion for\nthose that are due.","operationId":"scheduler_tick_jobs_scheduler_tick_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/me":{"get":{"tags":["me"],"summary":"Get Me","description":"Single initialization endpoint returning onboarding, feature flags, and plan data.","operationId":"get_me_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}}}}}},"components":{"schemas":{"AddInsightRequest":{"properties":{"insight_id":{"type":"string","title":"Insight Id","description":"Insight ID to add to the dashboard"}},"type":"object","required":["insight_id"],"title":"AddInsightRequest","description":"Request model for adding an insight to a dashboard."},"AgentAssignmentsResponse":{"properties":{"skill_ids":{"items":{"type":"string"},"type":"array","title":"Skill Ids"},"tool_ids":{"items":{"type":"string"},"type":"array","title":"Tool Ids"}},"type":"object","required":["skill_ids","tool_ids"],"title":"AgentAssignmentsResponse"},"AgentListResponse":{"properties":{"agents":{"items":{"$ref":"#/components/schemas/AgentResponse"},"type":"array","title":"Agents"}},"type":"object","required":["agents"],"title":"AgentListResponse"},"AgentResponse":{"properties":{"agent_id":{"type":"string","title":"Agent Id"},"content":{"type":"string","title":"Content"},"is_default":{"type":"boolean","title":"Is Default","description":"True when the agent serves the built-in default persona (no customized content is stored)"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["agent_id","content","is_default"],"title":"AgentResponse"},"AggregationSpec":{"properties":{"column":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Column","description":"Column to aggregate (Mode 2 only, requires function)"},"expression":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expression","description":"Full aggregation expression using [column] syntax. Example: 'SUM([revenue])' or 'COUNT(DISTINCT [customer_id])'"},"function":{"anyOf":[{"type":"string","enum":["sum","avg","count","count_distinct","max","min"]},{"type":"null"}],"title":"Function","description":"Aggregation function (Mode 2 only, requires column)"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Optional custom label for the aggregation result column"}},"type":"object","title":"AggregationSpec","description":"Aggregation specification - two mutually exclusive modes.\n\nMode 1: Expression (contains the full aggregation)\n    {\"expression\": \"SUM([revenue])\"}\n    {\"expression\": \"COUNT(DISTINCT [customer_id])\"}\n    {\"expression\": \"SUM([price] * [quantity])\"}\n    {\"expression\": \"AVG(IF([status] = 'active', [amount], NULL)) - AVG(IF([status] = 'inactive', [amount], NULL))\"}\n\nMode 2: Column + Function (simple aggregations)\n    {\"column\": \"revenue\", \"function\": \"sum\"}\n    {\"column\": \"customer_id\", \"function\": \"count_distinct\"}\n    {\"column\": \"*\", \"function\": \"count\"}\n\nIMPORTANT: Never combine expression with function. Pick ONE mode."},"AnswerAudit":{"properties":{"ungrounded":{"items":{"type":"string"},"type":"array","title":"Ungrounded"},"enforced":{"type":"boolean","title":"Enforced","default":false},"corrected":{"type":"boolean","title":"Corrected","default":false},"failed":{"type":"boolean","title":"Failed","default":false},"extra_credit":{"type":"boolean","title":"Extra Credit","default":false}},"type":"object","title":"AnswerAudit","description":"What the pre-send figure check found on this step.\n\nPresent on every step that produced an answer, whether or not\n``verify_answers`` was on: the check is what says a figure is not in the\ndata, and a caller running with it off still wants to know that."},"ApiKeyCreateRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Optional human-readable name"}},"type":"object","title":"ApiKeyCreateRequest","description":"Request to create a new API key."},"ApiKeyCreateResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"key":{"type":"string","title":"Key"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","key","created_at"],"title":"ApiKeyCreateResponse","description":"Response for a newly created API key. The full key is returned only on creation."},"ApiKeyListResponse":{"properties":{"api_keys":{"items":{"$ref":"#/components/schemas/ApiKeyResponse"},"type":"array","title":"Api Keys"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["api_keys","total"],"title":"ApiKeyListResponse","description":"Response for listing API keys."},"ApiKeyResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"key_hint":{"type":"string","title":"Key Hint"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"revoked":{"type":"boolean","title":"Revoked"}},"type":"object","required":["id","name","key_hint","created_at","last_used_at","revoked"],"title":"ApiKeyResponse","description":"Response model for an API key (masked)."},"ApiUsageResponse":{"properties":{"monthly_limit":{"type":"integer","title":"Monthly Limit"},"overage_limit":{"type":"integer","title":"Overage Limit"},"monthly_used":{"type":"integer","title":"Monthly Used"},"daily_usage":{"items":{"$ref":"#/components/schemas/DailyUsageEntry"},"type":"array","title":"Daily Usage"},"endpoints":{"items":{"$ref":"#/components/schemas/EndpointUsageEntry"},"type":"array","title":"Endpoints","default":[]},"recent_logs":{"items":{"$ref":"#/components/schemas/UsageLogEntry"},"type":"array","title":"Recent Logs"},"total_logs":{"type":"integer","title":"Total Logs"}},"type":"object","required":["monthly_limit","overage_limit","monthly_used","daily_usage","recent_logs","total_logs"],"title":"ApiUsageResponse","description":"Full API usage response with stats, chart data, and recent logs."},"ApiUsageSettingsRequest":{"properties":{"overage_limit":{"type":"integer","maximum":1000000.0,"minimum":0.0,"title":"Overage Limit"}},"type":"object","required":["overage_limit"],"title":"ApiUsageSettingsRequest","description":"Customer-editable SDK billing settings.\n\n``overage_limit`` is an authorization ceiling, not a purchase: only units\nactually consumed past the base allowance are billed (manually, at month\nend). Design: docs/plans/SDK_OVERAGE_ALLOWANCE.md."},"ApiUsageSettingsResponse":{"properties":{"overage_limit":{"type":"integer","title":"Overage Limit"}},"type":"object","required":["overage_limit"],"title":"ApiUsageSettingsResponse"},"AvailablePlanResponse":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"features":{"additionalProperties":true,"type":"object","title":"Features"}},"type":"object","required":["slug","name","features"],"title":"AvailablePlanResponse"},"BatchDeleteDashboardsRequest":{"properties":{"dashboard_ids":{"items":{"type":"string"},"type":"array","title":"Dashboard Ids"}},"type":"object","required":["dashboard_ids"],"title":"BatchDeleteDashboardsRequest","description":"Request model for batch deleting dashboards."},"BatchDeleteDashboardsResponse":{"properties":{"deleted_count":{"type":"integer","title":"Deleted Count"},"failed_ids":{"items":{"type":"string"},"type":"array","title":"Failed Ids"}},"type":"object","required":["deleted_count","failed_ids"],"title":"BatchDeleteDashboardsResponse","description":"Response model for batch deleting dashboards."},"BatchDeleteInsightsRequest":{"properties":{"insight_ids":{"items":{"type":"string"},"type":"array","title":"Insight Ids"}},"type":"object","required":["insight_ids"],"title":"BatchDeleteInsightsRequest","description":"Request model for batch deleting insights."},"BatchDeleteInsightsResponse":{"properties":{"deleted_count":{"type":"integer","title":"Deleted Count"},"failed_ids":{"items":{"type":"string"},"type":"array","title":"Failed Ids"}},"type":"object","required":["deleted_count","failed_ids"],"title":"BatchDeleteInsightsResponse","description":"Response model for batch deleting insights."},"BatchDeleteSourcesRequest":{"properties":{"source_ids":{"items":{"type":"string"},"type":"array","title":"Source Ids"}},"type":"object","required":["source_ids"],"title":"BatchDeleteSourcesRequest","description":"Request model for batch deleting sources."},"BatchDeleteSourcesResponse":{"properties":{"deleted_count":{"type":"integer","title":"Deleted Count"},"failed_ids":{"items":{"type":"string"},"type":"array","title":"Failed Ids"}},"type":"object","required":["deleted_count","failed_ids"],"title":"BatchDeleteSourcesResponse","description":"Response model for batch deleting sources."},"Body_replace_document_v3_sdk_documents__document_id__post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tags"}},"type":"object","required":["file"],"title":"Body_replace_document_v3_sdk_documents__document_id__post"},"Body_upload_document_v3_sdk_documents_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tags"}},"type":"object","required":["file"],"title":"Body_upload_document_v3_sdk_documents_post"},"Body_upload_file_files_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"request":{"type":"string","title":"Request","description":"JSON-encoded UploadFileRequest"}},"type":"object","required":["file","request"],"title":"Body_upload_file_files_post"},"Body_upload_playground_dataset_v2_sdk_playground_datasets__table_name__post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_playground_dataset_v2_sdk_playground_datasets__table_name__post"},"BySpec":{"properties":{"column":{"type":"string","title":"Column","description":"Column to group by"},"date_binning":{"anyOf":[{"$ref":"#/components/schemas/DateBinning"},{"type":"null"}],"description":"Date binning configuration (for date/timestamp columns)"},"number_binning":{"anyOf":[{"$ref":"#/components/schemas/NumberBinning"},{"type":"null"}],"description":"Number binning configuration (for numeric columns)"}},"type":"object","required":["column"],"title":"BySpec","description":"Breakdown (grouping) specification."},"ChangePlanRequest":{"properties":{"plan_slug":{"type":"string","title":"Plan Slug"}},"type":"object","required":["plan_slug"],"title":"ChangePlanRequest"},"ChartType":{"type":"string","enum":["bar","line","pie","donut","combo","horizontal_bar","kpi","table"],"title":"ChartType","description":"Enum for chart types."},"ChatAttachment":{"properties":{"id":{"type":"string","title":"Id"},"content_type":{"type":"string","title":"Content Type"},"data":{"type":"string","title":"Data","description":"Base64-encoded image bytes, no data: URI prefix"}},"type":"object","required":["id","content_type","data"],"title":"ChatAttachment","description":"An image attached to a chat message."},"ChatListResponse":{"properties":{"chats":{"items":{"$ref":"#/components/schemas/ChatResponse"},"type":"array","title":"Chats"}},"type":"object","required":["chats"],"title":"ChatListResponse","description":"Response containing a list of chats."},"ChatMessage":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"role":{"type":"string","enum":["user","assistant","tool"],"title":"Role"},"content":{"type":"string","title":"Content"},"attachments":{"anyOf":[{"items":{"$ref":"#/components/schemas/ChatAttachment"},"type":"array","maxItems":5},{"type":"null"}],"title":"Attachments"},"tool_call_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Call Id"},"tool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Name"},"tool_result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tool Result"},"tool_calls":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Tool Calls"}},"type":"object","required":["role","content"],"title":"ChatMessage","description":"A message in the conversation history."},"ChatRequest":{"properties":{"message":{"type":"string","maxLength":2000,"title":"Message","description":"User's message"},"chat_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Id","description":"Chat ID to load history from. If provided, history is loaded server-side."},"source_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Source Ids","description":"Optional list of source IDs to focus the conversation on"},"attachments":{"anyOf":[{"items":{"$ref":"#/components/schemas/ChatAttachment"},"type":"array","maxItems":5},{"type":"null"}],"title":"Attachments","description":"Optional images attached to this message"}},"type":"object","required":["message"],"title":"ChatRequest","description":"Request for the agentic chat endpoint."},"ChatResponse":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"messages":{"items":{"$ref":"#/components/schemas/ChatMessage"},"type":"array","title":"Messages"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","title","messages","created_at","updated_at"],"title":"ChatResponse","description":"Response containing chat data."},"CloudUsageResponse":{"properties":{"tables":{"$ref":"#/components/schemas/UsageMetric"},"storage_mb":{"$ref":"#/components/schemas/UsageMetric"}},"type":"object","required":["tables","storage_mb"],"title":"CloudUsageResponse"},"ColumnInfoResponse":{"properties":{"name":{"type":"string","title":"Name"},"type":{"type":"string","title":"Type"},"mode":{"type":"string","title":"Mode","default":"NULLABLE"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["name","type"],"title":"ColumnInfoResponse","description":"Response model for column info."},"ColumnMetadata":{"properties":{"name":{"type":"string","title":"Name","description":"Column name"},"type":{"type":"string","title":"Type","description":"SQL type (VARCHAR, BIGINT, DOUBLE, TIMESTAMP, DATE, BOOLEAN, etc.)"}},"type":"object","required":["name","type"],"title":"ColumnMetadata","description":"Metadata for a single column in query results.\n\nUsed to communicate column types from query results back to the frontend,\nenabling proper filter operators and binning options for chained operations."},"ColumnMetadataRequest":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Existing entry id — when set, updates that row in place"},"semantic_table_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Semantic Table Id","description":"Owning semantic-table entry id (required to create)"},"column_name":{"type":"string","title":"Column Name"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"data_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Type"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"synonyms":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Synonyms"},"is_categorical":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Categorical"},"sample_values":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Sample Values"},"aggregation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aggregation"},"is_primary_key":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Primary Key"},"is_foreign_key":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Foreign Key"},"is_internal":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Internal"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"}},"type":"object","required":["column_name"],"title":"ColumnMetadataRequest"},"ConnectorCreateResponse":{"properties":{"connector_id":{"type":"string","title":"Connector Id"},"table_ids":{"items":{"type":"string"},"type":"array","title":"Table Ids"},"job_ids":{"items":{"type":"string"},"type":"array","title":"Job Ids"}},"type":"object","required":["connector_id","table_ids","job_ids"],"title":"ConnectorCreateResponse","description":"Response model for connector operations."},"ConnectorListResponse":{"properties":{"connectors":{"items":{"$ref":"#/components/schemas/ConnectorResponse"},"type":"array","title":"Connectors"},"total":{"type":"integer","title":"Total"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["connectors","total","limit","offset"],"title":"ConnectorListResponse","description":"Response model for listing connectors."},"ConnectorResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"type":{"$ref":"#/components/schemas/ConnectorType"},"enabled_modes":{"items":{"type":"string"},"type":"array","title":"Enabled Modes"},"status":{"type":"string","title":"Status","default":"active"},"mcp_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Mcp Config"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"destination_database_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Database Id"},"destination_dataset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Dataset Id"},"schedule_type":{"type":"string","title":"Schedule Type","default":"manual"},"schedule_cron":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule Cron"}},"type":"object","required":["id","name","type"],"title":"ConnectorResponse","description":"Response model for connector operations."},"ConnectorTableListResponse":{"properties":{"tables":{"items":{"$ref":"#/components/schemas/ConnectorTableResponse"},"type":"array","title":"Tables"},"total":{"type":"integer","title":"Total"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["tables","total","limit","offset"],"title":"ConnectorTableListResponse","description":"Response model for listing connector tables."},"ConnectorTableResponse":{"properties":{"id":{"type":"string","title":"Id"},"connector_id":{"type":"string","title":"Connector Id"},"table_name":{"type":"string","title":"Table Name"},"file_path":{"type":"string","title":"File Path"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"last_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Synced At"},"row_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Row Count","default":10000},"latest_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Job Id"},"latest_job_status":{"anyOf":[{"$ref":"#/components/schemas/IngestJobStatus"},{"type":"null"}]},"latest_job_started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Latest Job Started At"},"latest_job_ended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Latest Job Ended At"},"latest_job_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Job Error"}},"type":"object","required":["id","connector_id","table_name","file_path","display_name","last_synced_at","latest_job_id","latest_job_status","latest_job_started_at","latest_job_ended_at","latest_job_error"],"title":"ConnectorTableResponse","description":"Response model for connector table."},"ConnectorType":{"type":"string","enum":["google_analytics","google_ads","google_search_console","meta_ads","notion","linear","posthog","stripe","hubspot","slack","github"],"title":"ConnectorType","description":"Enum for connector types."},"ConstraintCondition":{"properties":{"column":{"type":"string","title":"Column","description":"Column name to filter on"},"operator":{"type":"string","title":"Operator","description":"Filter operator (equals, not_equals, gt, gte, lt, lte, in, not_in, is_null, is_not_null)","default":"equals"},"value":{"title":"Value","description":"Filter value"}},"type":"object","required":["column"],"title":"ConstraintCondition","description":"A single filter constraint applied to a table."},"CreateChatRequest":{"properties":{"title":{"type":"string","maxLength":200,"title":"Title","default":"New chat"},"messages":{"items":{"$ref":"#/components/schemas/ChatMessage"},"type":"array","title":"Messages"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","title":"CreateChatRequest","description":"Request for creating a new chat."},"CreateConnectorRequest":{"properties":{"name":{"type":"string","title":"Name"},"connector_type":{"$ref":"#/components/schemas/ConnectorType"},"credential_params":{"additionalProperties":true,"type":"object","title":"Credential Params"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"auto_ingest":{"type":"boolean","title":"Auto Ingest","default":true},"enabled_modes":{"items":{"type":"string"},"type":"array","title":"Enabled Modes"},"mcp_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Mcp Config"},"destination_database_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Database Id"},"destination_dataset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Dataset Id"},"schedule_type":{"type":"string","title":"Schedule Type","default":"manual"}},"type":"object","required":["name","connector_type","credential_params"],"title":"CreateConnectorRequest","description":"Request body for creating a connector."},"CreateDashboardRequest":{"properties":{"name":{"type":"string","title":"Name","description":"Dashboard name"},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Layout configuration"},"insight_ids":{"items":{"type":"string"},"type":"array","title":"Insight Ids","description":"List of insight IDs to link"}},"type":"object","required":["name"],"title":"CreateDashboardRequest","description":"Request model for creating a dashboard."},"CreateDataModelRequest":{"properties":{"name":{"type":"string","title":"Name"},"source_id":{"type":"string","title":"Source Id"},"query":{"additionalProperties":true,"type":"object","title":"Query"},"is_visible":{"type":"boolean","title":"Is Visible","default":false}},"type":"object","required":["name","source_id","query"],"title":"CreateDataModelRequest","description":"Request model for creating a data model."},"CreateDatabaseRequest":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"type":{"$ref":"#/components/schemas/DatabaseType"},"credentials":{"additionalProperties":true,"type":"object","title":"Credentials","description":"Credentials for the database (e.g. service_account_json for BigQuery)"},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Database-specific config (e.g. project_id, location for BigQuery)"}},"type":"object","required":["name","type","credentials"],"title":"CreateDatabaseRequest","description":"Request model for creating a database connection."},"CreateEvalRunRequest":{"properties":{"suite_id":{"type":"string","title":"Suite Id","description":"Benchmark to run"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version","description":"Semantic-layer version; default Current"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"Selection tags (disambiguate entries)"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"Response language code, e.g. 'it'"},"disambiguation":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Disambiguation","description":"Expose structured ask questions (mirrors the SDK flag)"},"rows":{"type":"integer","maximum":500.0,"minimum":1.0,"title":"Rows","description":"Shadow rows per table","default":30},"salt":{"type":"string","maxLength":100,"title":"Salt","description":"Reroll the synthetic world","default":""},"behavior":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Behavior","description":"Agent behavior major to measure; default the newest served"},"retention_mode":{"type":"string","pattern":"^(bounded_full|metadata_only)$","title":"Retention Mode","description":"What the persisted report keeps: bounded evidence or metadata only","default":"bounded_full"},"case_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Case Ids","description":"Subset of case ids; default all"}},"type":"object","required":["suite_id"],"title":"CreateEvalRunRequest","description":"Enqueue a persisted benchmark run.\n\nOmitted options fall back to the benchmark's saved defaults, so a caller\nthat passes only ``suite_id`` runs the suite the way it was configured."},"CreateFeatureFlagRequest":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"flag_type":{"type":"string","title":"Flag Type","default":"boolean"},"enabled":{"type":"boolean","title":"Enabled","default":false},"rollout_percentage":{"type":"integer","title":"Rollout Percentage","default":0}},"type":"object","required":["name"],"title":"CreateFeatureFlagRequest"},"CreateInsightRequest":{"properties":{"data_model_id":{"type":"string","title":"Data Model Id"},"type":{"$ref":"#/components/schemas/ChartType"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"}},"type":"object","required":["data_model_id","type"],"title":"CreateInsightRequest","description":"Request model for creating an insight."},"CreateRelationshipRequest":{"properties":{"primary_source_id":{"type":"string","title":"Primary Source Id","description":"ID of the primary/left source"},"foreign_source_id":{"type":"string","title":"Foreign Source Id","description":"ID of the foreign/right source"},"primary_column":{"type":"string","title":"Primary Column","description":"Column name in primary source for joining"},"foreign_column":{"type":"string","title":"Foreign Column","description":"Column name in foreign source for joining"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Optional description of the relationship"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Additional metadata"}},"type":"object","required":["primary_source_id","foreign_source_id","primary_column","foreign_column"],"title":"CreateRelationshipRequest","description":"Request model for creating a relationship."},"CreateSourceRequest":{"properties":{"display_name":{"type":"string","title":"Display Name"}},"type":"object","required":["display_name"],"title":"CreateSourceRequest","description":"Request model for creating a source."},"CreateSourceResponse":{"properties":{"id":{"type":"string","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"table_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Table Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","display_name","table_name","created_at"],"title":"CreateSourceResponse","description":"Response model for creating a source."},"CreateSqlExampleRequest":{"properties":{"question":{"type":"string","maxLength":500,"title":"Question","description":"Natural language question"},"sql":{"type":"string","maxLength":5000,"title":"Sql","description":"Gold SQL answer"},"note":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Note","description":"Optional explanation"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"Optional selection tags (same semantics as the semantic layer)"}},"type":"object","required":["question","sql"],"title":"CreateSqlExampleRequest"},"CreateVersionRequest":{"properties":{"name":{"type":"string","maxLength":200,"title":"Name","description":"Version label"},"message":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Message","description":"Optional note"}},"type":"object","required":["name"],"title":"CreateVersionRequest"},"CurrentConfig":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Current display title"},"chart_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chart Type","description":"Current chart type (for insights)"},"query_config":{"$ref":"#/components/schemas/CurrentConfigQueryConfig","description":"Current query configuration with source and steps"}},"type":"object","required":["query_config"],"title":"CurrentConfig","description":"Current insight/data model configuration for context.\n\nWhen provided, the AI will treat the prompt as a modification request\nand preserve existing configuration where appropriate."},"CurrentConfigQueryConfig":{"properties":{"source":{"type":"string","title":"Source","description":"Table/source name"},"steps":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Steps","description":"Query steps (filter, summarize, etc.)"}},"type":"object","required":["source"],"title":"CurrentConfigQueryConfig","description":"Query configuration within current config."},"CurrentPlanResponse":{"properties":{"plan":{"$ref":"#/components/schemas/PlanResponse"},"status":{"type":"string","title":"Status"},"features":{"additionalProperties":true,"type":"object","title":"Features"},"usage":{"additionalProperties":true,"type":"object","title":"Usage"},"period_start":{"type":"string","format":"date-time","title":"Period Start"},"period_end":{"type":"string","format":"date-time","title":"Period End"},"cancel_at_period_end":{"type":"boolean","title":"Cancel At Period End","default":false}},"type":"object","required":["plan","status","features","usage","period_start","period_end"],"title":"CurrentPlanResponse"},"CustomerSubscriptionRequest":{"properties":{"package_name":{"type":"string","title":"Package Name","description":"Package name (e.g., 'basic', 'pro', 'enterprise')"},"success_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Success Url","description":"URL to redirect after successful payment"},"cancel_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancel Url","description":"URL to redirect after canceling payment"},"trial_period_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Trial Period Days","description":"Number of trial days"}},"type":"object","required":["package_name"],"title":"CustomerSubscriptionRequest","description":"Request model for creating a customer and subscription"},"DailyUsageEntry":{"properties":{"date":{"type":"string","title":"Date"},"count":{"type":"integer","title":"Count"},"errors":{"type":"integer","title":"Errors","default":0},"categories":{"additionalProperties":{"type":"integer"},"type":"object","title":"Categories"}},"type":"object","required":["date","count"],"title":"DailyUsageEntry","description":"A single day's usage count, split into total and failed requests.\n\n``categories`` maps usage category to that day's *successful* calls, so a\nstacked chart can show the mix of work while still drawing failures as\ntheir own segment: ``sum(categories.values()) + errors == count``. A\ncategory is usually the endpoint, except where a service key identifies a\nplatform surface (playground, benchmarks) sharing a customer endpoint."},"DashboardListItem":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"config":{"additionalProperties":true,"type":"object","title":"Config"},"insights":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Insights"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","config","insights","created_at","updated_at"],"title":"DashboardListItem","description":"Response model for dashboard list item."},"DashboardListResponse":{"properties":{"dashboards":{"items":{"$ref":"#/components/schemas/DashboardListItem"},"type":"array","title":"Dashboards"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["dashboards","total"],"title":"DashboardListResponse","description":"Response model for dashboard list."},"DashboardResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"config":{"additionalProperties":true,"type":"object","title":"Config"},"insights":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Insights"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","config","insights","created_at","updated_at"],"title":"DashboardResponse","description":"Response model for dashboard metadata."},"DataMartResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"sql":{"type":"string","title":"Sql"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"columns":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Columns"},"source_tables":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Source Tables"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","sql","created_at","updated_at"],"title":"DataMartResponse"},"DataModel":{"properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Legacy table or data model name. Optional when source_id is provided. If omitted, the backend resolves the table name from source_id."},"source_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Id","description":"Source UUID for unambiguous lookup. When provided, takes priority over source for ownership validation."},"steps":{"items":{"anyOf":[{"$ref":"#/components/schemas/JoinStep"},{"$ref":"#/components/schemas/FilterStep"},{"$ref":"#/components/schemas/SummarizeStep"},{"$ref":"#/components/schemas/OrderByStep"},{"$ref":"#/components/schemas/LimitStep"},{"$ref":"#/components/schemas/SelectStep"}]},"type":"array","title":"Steps","description":"Query transformation steps in order"}},"type":"object","required":["steps"],"title":"DataModel"},"DataModelResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"data_model":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data Model"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"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"}},"type":"object","required":["id","name","metadata"],"title":"DataModelResponse","description":"Response model for a single data model."},"DatabaseListResponse":{"properties":{"databases":{"items":{"$ref":"#/components/schemas/DatabaseResponse"},"type":"array","title":"Databases"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["databases","total"],"title":"DatabaseListResponse","description":"Response model for listing databases."},"DatabaseResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"type":{"$ref":"#/components/schemas/DatabaseType"},"config":{"additionalProperties":true,"type":"object","title":"Config"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"source_count":{"type":"integer","title":"Source Count","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","type","config","metadata","created_at","updated_at"],"title":"DatabaseResponse","description":"Response model for a database connection."},"DatabaseType":{"type":"string","enum":["bigquery","postgres","mysql"],"title":"DatabaseType","description":"Enum for external database connection types."},"DatasetListResponse":{"properties":{"datasets":{"items":{"type":"string"},"type":"array","title":"Datasets"}},"type":"object","required":["datasets"],"title":"DatasetListResponse","description":"Response model for listing datasets/schemas."},"DateBinning":{"properties":{"interval":{"type":"string","enum":["minute","hour","day","week","month","quarter","year","minute_of_hour","hour_of_day","day_of_week","day_of_month","day_of_year","week_of_year","month_of_year","quarter_of_year"],"title":"Interval","description":"Date binning interval"}},"type":"object","required":["interval"],"title":"DateBinning","description":"Date binning specification."},"DisambiguationOption":{"properties":{"label":{"type":"string","minLength":1,"title":"Label"},"value":{"type":"string","minLength":1,"title":"Value"}},"type":"object","required":["label","value"],"title":"DisambiguationOption"},"DisambiguationQuestion":{"properties":{"id":{"type":"string","minLength":1,"title":"Id"},"text":{"type":"string","minLength":1,"title":"Text"},"type":{"type":"string","enum":["select","text","confirm"],"title":"Type"},"options":{"anyOf":[{"items":{"$ref":"#/components/schemas/DisambiguationOption"},"type":"array"},{"type":"null"}],"title":"Options"},"default":{"anyOf":[{"type":"string"},{"type":"boolean"},{"type":"null"}],"title":"Default"}},"type":"object","required":["id","text","type"],"title":"DisambiguationQuestion"},"DistinctValuesRequest":{"properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Legacy source table name. Optional when source_id is provided. If omitted, the backend resolves the table name from source_id."},"source_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Id","description":"Source UUID for unambiguous lookup. When provided, takes priority over source."},"column":{"type":"string","title":"Column","description":"Column name to get distinct values from"},"limit":{"type":"integer","maximum":10000.0,"minimum":1.0,"title":"Limit","description":"Maximum values to return","default":1000},"search":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search","description":"Optional search term to filter values"}},"type":"object","required":["column"],"title":"DistinctValuesRequest","description":"Request for fetching distinct values from a column."},"DistinctValuesResponse":{"properties":{"values":{"items":{},"type":"array","title":"Values","description":"List of distinct values"},"total_count":{"type":"integer","title":"Total Count","description":"Total number of distinct values"},"truncated":{"type":"boolean","title":"Truncated","description":"Whether the list was truncated","default":false}},"type":"object","required":["total_count"],"title":"DistinctValuesResponse","description":"Response with distinct column values."},"DocSource":{"properties":{"document_id":{"type":"string","title":"Document Id"},"document_title":{"type":"string","title":"Document Title"}},"type":"object","required":["document_id","document_title"],"title":"DocSource","description":"Document-level source of a docs answer. Assembled server-side from the\nretrieval results (never from model output), and returned as data for the\ndeveloper to render or drop — the answer text itself carries no citations."},"DocumentChunkPreview":{"properties":{"chunk_index":{"type":"integer","title":"Chunk Index"},"kind":{"type":"string","title":"Kind"},"heading_path":{"items":{"type":"string"},"type":"array","title":"Heading Path"},"content":{"type":"string","title":"Content"},"page_start":{"type":"integer","title":"Page Start"},"page_end":{"type":"integer","title":"Page End"},"token_count":{"type":"integer","title":"Token Count"}},"type":"object","required":["chunk_index","kind","heading_path","content","page_start","page_end","token_count"],"title":"DocumentChunkPreview"},"DocumentListResponse":{"properties":{"documents":{"items":{"$ref":"#/components/schemas/DocumentResponse"},"type":"array","title":"Documents"}},"type":"object","required":["documents"],"title":"DocumentListResponse"},"DocumentPreviewResponse":{"properties":{"markdown":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Markdown"},"markdown_truncated":{"type":"boolean","title":"Markdown Truncated","default":false},"chunks":{"items":{"$ref":"#/components/schemas/DocumentChunkPreview"},"type":"array","title":"Chunks"}},"type":"object","required":["chunks"],"title":"DocumentPreviewResponse"},"DocumentResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"filename":{"type":"string","title":"Filename"},"mime_type":{"type":"string","title":"Mime Type"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"current_revision_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Current Revision Id"},"latest_revision_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Latest Revision Id"},"latest_revision":{"anyOf":[{"$ref":"#/components/schemas/DocumentRevisionResponse"},{"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","title","filename","mime_type","created_at","updated_at"],"title":"DocumentResponse"},"DocumentRevisionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"status":{"type":"string","enum":["queued","claimed","parsing","chunking","embedding","ready","failed","superseded"],"title":"Status"},"attempt_count":{"type":"integer","title":"Attempt Count"},"byte_count":{"type":"integer","title":"Byte Count"},"parser_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parser Name"},"parser_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parser Version"},"chunker_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chunker Version"},"embedding_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embedding Model"},"warnings":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Warnings"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["id","status","attempt_count","byte_count","created_at"],"title":"DocumentRevisionResponse"},"DocumentUpdateRequest":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"}},"type":"object","title":"DocumentUpdateRequest","description":"Partial metadata edit: omitted fields keep their stored value."},"DocumentUploadResponse":{"properties":{"document":{"$ref":"#/components/schemas/DocumentResponse"},"reused_revision":{"type":"boolean","title":"Reused Revision","default":false}},"type":"object","required":["document"],"title":"DocumentUploadResponse"},"EndpointUsageEntry":{"properties":{"endpoint":{"type":"string","title":"Endpoint"},"count":{"type":"integer","title":"Count"},"errors":{"type":"integer","title":"Errors","default":0}},"type":"object","required":["endpoint","count"],"title":"EndpointUsageEntry","description":"Totals for one endpoint over the requested window."},"FilterCondition":{"properties":{"column":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Column","description":"Column name to filter on (required for standard mode)"},"operator":{"anyOf":[{"type":"string","enum":["equals","not_equals","gt","lt","gte","lte","contains","not_contains","starts_with","ends_with","in","not_in","is_null","is_not_null"]},{"type":"null"}],"title":"Operator","description":"Comparison operator (required for standard mode)"},"value":{"title":"Value","description":"Literal value to compare against (for standard mode)"},"expression":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expression","description":"Complete filter expression using [column] syntax. Example: '[city] = [invoice_city]' or '[amount] > [qty] * [price]'"}},"type":"object","title":"FilterCondition","description":"Single filter condition.\n\nSupports two modes:\n1. Standard mode: column + operator + value (for literal comparisons)\n2. Expression mode: expression only (for complex/dynamic conditions)\n\nUse standard mode for typical filters with literal values.\nUse expression mode for column-to-column comparisons or computed conditions.\n\nExamples:\n    Standard mode:\n    {\"column\": \"status\", \"operator\": \"equals\", \"value\": \"active\"}\n    -> WHERE status = 'active'\n\n    {\"column\": \"count\", \"operator\": \"gt\", \"value\": 100}\n    -> WHERE count > 100\n\n    Expression mode:\n    {\"expression\": \"[city] = [invoice_city]\"}\n    -> WHERE city = invoice_city\n\n    {\"expression\": \"[amount] > [quantity] * [unit_price]\"}\n    -> WHERE amount > quantity * unit_price\n\n    {\"expression\": \"[revenue] - [cost] > 1000\"}\n    -> WHERE revenue - cost > 1000"},"FilterStep":{"properties":{"type":{"type":"string","const":"filter","title":"Type","default":"filter"},"conditions":{"items":{"$ref":"#/components/schemas/FilterCondition"},"type":"array","title":"Conditions","description":"Filter conditions (combined with AND)"}},"type":"object","required":["conditions"],"title":"FilterStep","description":"Filter step - pre-filter data before other operations."},"GenerateConfigRequest":{"properties":{"mode":{"type":"string","title":"Mode","description":"Generation mode: 'insight' for charts, 'data_model' for transformations"},"source_id":{"type":"string","title":"Source Id","description":"Source ID for schema lookup"},"prompt":{"type":"string","maxLength":500,"title":"Prompt","description":"User's natural language request"},"current_config":{"anyOf":[{"$ref":"#/components/schemas/CurrentConfig"},{"type":"null"}],"description":"Existing configuration for context (enables modification mode)"},"attachments":{"anyOf":[{"items":{"$ref":"#/components/schemas/ChatAttachment"},"type":"array","maxItems":5},{"type":"null"}],"title":"Attachments","description":"Optional images attached to this prompt"}},"type":"object","required":["mode","source_id","prompt"],"title":"GenerateConfigRequest","description":"Request for AI-powered configuration generation."},"GenerateConfigResponse":{"properties":{"name":{"type":"string","title":"Name","description":"Internal snake_case identifier","default":""},"title":{"type":"string","title":"Title","description":"Display title (sentence case)","default":""},"chart_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chart Type","description":"Chart type (only for insight mode): kpi, bar, line, pie, etc."},"query_config":{"additionalProperties":true,"type":"object","title":"Query Config","description":"Query configuration with source and steps"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon","description":"FontAwesome icon class (for KPIs)"},"rejected":{"type":"boolean","title":"Rejected","description":"True if the request was rejected by guardrail (not data-related)","default":false},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"AI message when rejected (explains why and suggests alternatives)"}},"type":"object","title":"GenerateConfigResponse","description":"Response with generated configuration.\n\nWorks for both insight and data model modes.\n- Insight mode: includes chart_type\n- Data model mode: chart_type is null\n\nWhen guardrail rejects the request:\n- rejected: True\n- message: Helpful message explaining why and suggesting alternatives\n- Other fields may be empty/null"},"GenerateDashboardRequest":{"properties":{"source_id":{"type":"string","title":"Source Id","description":"Source ID to generate dashboard from"},"prompt":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Prompt","description":"Optional user prompt to customize the dashboard"}},"type":"object","required":["source_id"],"title":"GenerateDashboardRequest","description":"Request for AI-powered dashboard generation.\n\nGenerates a complete dashboard with KPIs, charts, name, and filters\nall in one request with concurrent generation for speed."},"GenerateDashboardResponse":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Dashboard ID (only if saved)"},"name":{"type":"string","title":"Name","description":"Generated dashboard name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Generated dashboard description"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon","description":"Dashboard icon"},"insights":{"items":{"$ref":"#/components/schemas/GeneratedInsight"},"type":"array","title":"Insights","description":"Generated KPIs and charts"},"filters":{"items":{"$ref":"#/components/schemas/GeneratedFilter"},"type":"array","title":"Filters","description":"Generated dashboard filters"},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Dashboard config including layout and filters"}},"type":"object","required":["name"],"title":"GenerateDashboardResponse","description":"Response from dashboard generation endpoint.\n\nContains all generated dashboard components. If save=True, includes\nthe dashboard ID and insight IDs. If save=False, returns the generated\ncontent without persisting."},"GenerateExampleSqlRequest":{"properties":{"question":{"type":"string","maxLength":1000,"title":"Question"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"dialect":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dialect"}},"type":"object","required":["question"],"title":"GenerateExampleSqlRequest"},"GenerateMartSqlRequest":{"properties":{"name":{"type":"string","maxLength":200,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"dialect":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dialect"}},"type":"object","required":["name"],"title":"GenerateMartSqlRequest"},"GenerateRequest":{"properties":{"source_id":{"type":"string","title":"Source Id","description":"Source ID for schema lookup"},"prompt":{"type":"string","maxLength":500,"title":"Prompt","description":"User's natural language request"},"mode":{"type":"string","title":"Mode","description":"Generation mode: 'auto' (let AI decide), 'insight', 'dashboard', or 'data_model'","default":"auto"},"attachments":{"anyOf":[{"items":{"$ref":"#/components/schemas/ChatAttachment"},"type":"array","maxItems":5},{"type":"null"}],"title":"Attachments","description":"Optional images attached to this prompt"}},"type":"object","required":["source_id","prompt"],"title":"GenerateRequest","description":"Request for unified AI generation that auto-classifies intent.\n\nWhen mode is 'auto', the system will classify the request as:\n- 'insight': For single chart/visualization requests\n- 'dashboard': For multi-chart/dashboard requests\n- 'data_model': For data transformation/filtering requests\n\nWhen mode is specified explicitly, it overrides auto-classification."},"GenerateWithActionResponse":{"properties":{"action":{"type":"string","enum":["redirect","message"],"title":"Action","description":"Action type: 'redirect' to navigate, 'message' to show text"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL to redirect to (e.g., '/insights/{id}', '/dashboards/{id}')"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Message to display for rejected/other requests"},"resource_type":{"anyOf":[{"type":"string","enum":["insight","dashboard","data_model"]},{"type":"null"}],"title":"Resource Type","description":"Type of resource created"}},"type":"object","required":["action"],"title":"GenerateWithActionResponse","description":"Response from unified generation endpoint.\n\nFor successful generation:\n- action: 'redirect'\n- url: Path to the created resource (e.g., '/insights/abc123')\n- resource_type: Type of resource created\n\nFor rejected/other requests:\n- action: 'message'\n- message: Helpful message for the user"},"GeneratedFilter":{"properties":{"id":{"type":"string","title":"Id","description":"Filter ID"},"label":{"type":"string","title":"Label","description":"Display label"},"type":{"type":"string","title":"Type","description":"Filter type: select, multi_select, date_range, number_range"},"column":{"type":"string","title":"Column","description":"Column name to filter on"},"value_source":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Value Source","description":"Value source for dynamic filter values"},"insight_mappings":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Insight Mappings","description":"Mapping of filter to insights"}},"type":"object","required":["id","label","type","column"],"title":"GeneratedFilter","description":"A generated filter for the dashboard."},"GeneratedInsight":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Insight ID (only if saved)"},"type":{"type":"string","title":"Type","description":"Insight type: kpi, bar, line, pie, etc."},"title":{"type":"string","title":"Title","description":"Display title"},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Insight config"},"query_config":{"additionalProperties":true,"type":"object","title":"Query Config","description":"Query configuration"}},"type":"object","required":["type","title","query_config"],"title":"GeneratedInsight","description":"A generated insight (KPI or chart) in the dashboard."},"GrantAdminRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"GrantAdminRequest","description":"Request model for granting admin access."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImportTablesRequest":{"properties":{"tables":{"items":{"$ref":"#/components/schemas/TableSelection"},"type":"array","minItems":1,"title":"Tables"}},"type":"object","required":["tables"],"title":"ImportTablesRequest","description":"Request model for importing tables."},"ImportTablesResponse":{"properties":{"sources":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Sources"},"errors":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Errors"},"relationships":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Relationships"}},"type":"object","required":["sources","errors"],"title":"ImportTablesResponse","description":"Response model for importing tables."},"IngestJobResponse":{"properties":{"id":{"type":"string","title":"Id"},"source_id":{"type":"string","title":"Source Id"},"status":{"$ref":"#/components/schemas/IngestJobStatus"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"ended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ended At"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["id","source_id","status","started_at","ended_at","error"],"title":"IngestJobResponse","description":"Response model for ingest job status."},"IngestJobStatus":{"type":"string","enum":["pending","in_progress","completed","failed"],"title":"IngestJobStatus","description":"Enum for ingest job statuses."},"InsightListResponse":{"properties":{"insights":{"items":{"$ref":"#/components/schemas/InsightResponse"},"type":"array","title":"Insights"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["insights","total"],"title":"InsightListResponse","description":"Response model for insight list."},"InsightResponse":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","title":"Type"},"config":{"additionalProperties":true,"type":"object","title":"Config"},"data_model":{"additionalProperties":true,"type":"object","title":"Data Model"},"data_model_id":{"type":"string","title":"Data Model Id"},"source_ids":{"items":{"type":"string"},"type":"array","title":"Source Ids","default":[]},"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"}},"type":"object","required":["id","type","config","data_model","data_model_id"],"title":"InsightResponse","description":"Response model for a single insight."},"JoinCondition":{"properties":{"left":{"type":"string","title":"Left","description":"Left column reference, e.g. [a.order_id]"},"op":{"type":"string","enum":["=","!=","<>","<","<=",">",">="],"title":"Op","description":"Comparison operator"},"right":{"type":"string","title":"Right","description":"Right column reference, e.g. [b.order_id]"}},"type":"object","required":["left","op","right"],"title":"JoinCondition","description":"Single explicit join predicate.\n\nv1 accepts only bracketed column references on both sides, joined by one\nof the whitelisted comparison operators."},"JoinFrom":{"properties":{"alias":{"type":"string","title":"Alias","description":"Existing alias to join from"}},"type":"object","required":["alias"],"title":"JoinFrom","description":"Left side of an explicit join.\n\nThe alias references the current base source alias or a previously\nintroduced explicit join alias. For the first join, setting this alias\nalso aliases the base source."},"JoinStep":{"properties":{"type":{"type":"string","const":"join","title":"Type","default":"join"},"from":{"anyOf":[{"$ref":"#/components/schemas/JoinFrom"},{"type":"null"}],"description":"Existing alias to join from; first join can alias the base source"},"with":{"$ref":"#/components/schemas/JoinWith","description":"Source and alias to join in"},"kind":{"type":"string","enum":["inner","left"],"title":"Kind","description":"Join kind for v1","default":"inner"},"on":{"items":{"$ref":"#/components/schemas/JoinCondition"},"type":"array","minItems":1,"title":"On","description":"Join predicates combined with AND"}},"type":"object","required":["with","on"],"title":"JoinStep","description":"Explicit join step.\n\nv1 supports leading inner/left joins only. Cross/right/semi/anti joins and\nmid-pipeline joins are intentionally deferred."},"JoinWith":{"properties":{"source":{"type":"string","title":"Source","description":"Source table to join in"},"alias":{"type":"string","title":"Alias","description":"Alias for the joined source"}},"type":"object","required":["source","alias"],"title":"JoinWith","description":"Right side of an explicit join."},"LimitStep":{"properties":{"type":{"type":"string","const":"limit","title":"Type","default":"limit"},"value":{"type":"integer","maximum":10000.0,"minimum":1.0,"title":"Value","description":"Maximum number of rows"},"offset":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Offset","description":"Number of rows to skip"}},"type":"object","required":["value"],"title":"LimitStep","description":"Limit step - limit number of results."},"MePlanInfo":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"features":{"additionalProperties":true,"type":"object","title":"Features"}},"type":"object","required":["slug","name"],"title":"MePlanInfo"},"MePlanResponse":{"properties":{"plan":{"$ref":"#/components/schemas/MePlanInfo"},"status":{"type":"string","title":"Status"},"features":{"additionalProperties":true,"type":"object","title":"Features"},"usage":{"additionalProperties":true,"type":"object","title":"Usage"},"period_start":{"type":"string","format":"date-time","title":"Period Start"},"period_end":{"type":"string","format":"date-time","title":"Period End"},"cancel_at_period_end":{"type":"boolean","title":"Cancel At Period End","default":false}},"type":"object","required":["plan","status","features","usage","period_start","period_end"],"title":"MePlanResponse"},"MeResponse":{"properties":{"user_type":{"type":"string","title":"User Type","default":"standard"},"onboarding":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Onboarding"},"feature_flags":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Feature Flags"},"plan":{"anyOf":[{"$ref":"#/components/schemas/MePlanResponse"},{"type":"null"}]}},"type":"object","title":"MeResponse"},"MetricDefinitionRequest":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Existing entry id — when set, updates that row in place"},"semantic_table_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Semantic Table Id","description":"Owning semantic-table entry id (required to create)"},"name":{"type":"string","title":"Name"},"expression":{"type":"string","title":"Expression"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"filters":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Filters"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"}},"type":"object","required":["name","expression"],"title":"MetricDefinitionRequest"},"NumberBinning":{"properties":{"strategy":{"type":"string","enum":["auto","fixed_count","fixed_width","custom"],"title":"Strategy","description":"Binning strategy"},"bin_count":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":2.0},{"type":"null"}],"title":"Bin Count","description":"Number of bins (for fixed_count strategy)"},"bin_width":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Bin Width","description":"Width of each bin (for fixed_width strategy)"},"custom_edges":{"anyOf":[{"items":{"type":"number"},"type":"array","minItems":2},{"type":"null"}],"title":"Custom Edges","description":"Custom bin edges (for custom strategy)"}},"type":"object","required":["strategy"],"title":"NumberBinning","description":"Number binning specification."},"OnboardingUpdateRequest":{"properties":{"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","title":"OnboardingUpdateRequest","description":"Request model for updating onboarding data."},"OrderByColumn":{"properties":{"column":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Column","description":"Column name or aggregation label to sort by (use this OR expression)"},"expression":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expression","description":"Expression to sort by using [column] syntax. Example: '[revenue] - [cost]'"},"direction":{"type":"string","enum":["asc","desc"],"title":"Direction","description":"Sort direction","default":"asc"}},"type":"object","title":"OrderByColumn","description":"Order by specification.\n\nSupports either a simple column reference or an expression using [column] syntax:\n- Simple: {\"column\": \"revenue\", \"direction\": \"desc\"}\n- Expression: {\"expression\": \"[revenue] - [cost]\", \"direction\": \"desc\"}\n\nExamples:\n    {\"column\": \"amount\", \"direction\": \"desc\"}\n    -> ORDER BY amount DESC\n\n    {\"expression\": \"[revenue] - [cost]\", \"direction\": \"desc\"}\n    -> ORDER BY (revenue - cost) DESC"},"OrderByStep":{"properties":{"type":{"type":"string","const":"order_by","title":"Type","default":"order_by"},"columns":{"items":{"$ref":"#/components/schemas/OrderByColumn"},"type":"array","minItems":1,"title":"Columns","description":"Columns to sort by"}},"type":"object","required":["columns"],"title":"OrderByStep","description":"Order by step - sort results."},"PatchDataModelRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"query":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Query"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"is_visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Visible"}},"type":"object","title":"PatchDataModelRequest","description":"Request model for updating data model."},"PatchInsightRequest":{"properties":{"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"}},"type":"object","title":"PatchInsightRequest","description":"Request model for updating insight."},"PendingToolCallResponse":{"properties":{"tool_call_id":{"type":"string","title":"Tool Call Id"},"tool_name":{"type":"string","title":"Tool Name"},"arguments":{"additionalProperties":true,"type":"object","title":"Arguments"}},"type":"object","required":["tool_call_id","tool_name","arguments"],"title":"PendingToolCallResponse"},"PersonaResponse":{"properties":{"content":{"type":"string","title":"Content"},"is_default":{"type":"boolean","title":"Is Default","description":"True when no custom persona is set (the default is returned)"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["content","is_default"],"title":"PersonaResponse"},"PlanHistoryAction":{"type":"string","enum":["activated","upgraded","downgraded","renewed","cancelled","expired","past_due","cancel_scheduled","downgrade_scheduled","reactivated","override_changed"],"title":"PlanHistoryAction","description":"All possible actions recorded in plan_history."},"PlanHistoryResponse":{"properties":{"id":{"type":"string","title":"Id"},"plan_id":{"type":"string","title":"Plan Id"},"plan_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Slug"},"plan_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Name"},"action":{"$ref":"#/components/schemas/PlanHistoryAction"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","plan_id","plan_slug","plan_name","action","created_at"],"title":"PlanHistoryResponse"},"PlanResponse":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"features":{"additionalProperties":true,"type":"object","title":"Features"}},"type":"object","required":["slug","name"],"title":"PlanResponse"},"PlaygroundChatRequest":{"properties":{"message":{"type":"string","maxLength":2000,"title":"Message","description":"User message"},"state":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"State","description":"Prior conversation state (the SDK dump() blob), if any"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version","description":"Semantic-layer version; default Current"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"Selection tags"},"agent":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Agent","description":"Named agent persona id (mirrors Agent(agent=...)); default agent when omitted"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"Response language code, e.g. 'it'"},"enable_disambiguation":{"type":"boolean","title":"Enable Disambiguation","description":"Expose structured ask questions (mirrors the SDK flag)","default":false},"rows":{"type":"integer","maximum":500.0,"minimum":1.0,"title":"Rows","description":"Shadow rows per table","default":30},"salt":{"type":"string","maxLength":100,"title":"Salt","description":"Reroll the synthetic world","default":""}},"type":"object","required":["message"],"title":"PlaygroundChatRequest","description":"One playground chat turn: the run is driven by the real annie_sdk\nclient self-calling /v3/sdk/step (billed on the user's playground key).\n\nConversation state is the opaque ``Agent.dump()`` blob, echoed back in\nthe ``done`` event."},"PlaygroundDatasetResponse":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"table_name":{"type":"string","title":"Table Name"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename"},"row_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Row Count"},"byte_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Byte Count"},"columns":{"items":{"type":"string"},"type":"array","title":"Columns"},"content_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Hash"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"status":{"type":"string","title":"Status"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"}},"type":"object","required":["table_name","status"],"title":"PlaygroundDatasetResponse","description":"Metadata and compatibility status for one physical playground table."},"PortalRequest":{"properties":{"return_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Return Url","description":"URL to redirect after leaving the portal"},"check_availability":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Check Availability","description":"Whether to check availability of the subscription"}},"type":"object","title":"PortalRequest","description":"Request model for creating a customer portal session"},"PostHogProjectsRequest":{"properties":{"token":{"type":"string","title":"Token"},"base_url":{"type":"string","title":"Base Url","default":"https://us.posthog.com"}},"type":"object","required":["token"],"title":"PostHogProjectsRequest","description":"Request to list PostHog projects using a personal API key."},"PreviewDataMartRequest":{"properties":{"sql":{"type":"string","maxLength":10000,"title":"Sql"}},"type":"object","required":["sql"],"title":"PreviewDataMartRequest","description":"Dry-run payload for the live mart preview (SQL-only checks)."},"PreviewGoldSqlRequest":{"properties":{"sql":{"type":"string","maxLength":10000,"minLength":1,"title":"Sql"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version","description":"Semantic-layer version; default Current"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"Selection tags"},"rows":{"type":"integer","maximum":500.0,"minimum":1.0,"title":"Rows","description":"Shadow rows per table","default":30},"salt":{"type":"string","maxLength":100,"title":"Salt","description":"Reroll the synthetic world","default":""},"as_of_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"As Of Date","description":"The suite's frozen today; shadow dates end here, so a date-filtered gold SQL sees the same world a run would"}},"type":"object","required":["sql"],"title":"PreviewGoldSqlRequest","description":"Validate + execute an expected SQL against the exact hybrid context."},"PubSubEnvelope":{"properties":{"message":{"$ref":"#/components/schemas/PubSubMessage"},"subscription":{"type":"string","title":"Subscription"},"delivery_attempt":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Delivery Attempt"}},"type":"object","required":["message","subscription"],"title":"PubSubEnvelope","description":"Pub/Sub push request envelope."},"PubSubMessage":{"properties":{"data":{"type":"string","title":"Data"},"messageId":{"type":"string","title":"Messageid"},"publishTime":{"type":"string","title":"Publishtime"},"attributes":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Attributes"}},"type":"object","required":["data","messageId","publishTime"],"title":"PubSubMessage","description":"Pub/Sub message structure."},"QueryRequest":{"properties":{"data_model":{"$ref":"#/components/schemas/DataModel","description":"Data model to query from"}},"type":"object","required":["data_model"],"title":"QueryRequest","description":"Step-based query request."},"QueryResponse":{"properties":{"data":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Data"},"columns":{"items":{"type":"string"},"type":"array","title":"Columns"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"query":{"type":"string","title":"Query"},"row_count":{"type":"integer","title":"Row Count"},"execution_time_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Execution Time Ms"},"truncated":{"type":"boolean","title":"Truncated","description":"Whether results were truncated due to row limit","default":false},"result_metadata":{"anyOf":[{"items":{"$ref":"#/components/schemas/ColumnMetadata"},"type":"array"},{"type":"null"}],"title":"Result Metadata"},"explanation":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Explanation"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"}},"type":"object","required":["query","row_count"],"title":"QueryResponse","description":"Unified query response."},"RefreshTokenRequest":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"RefreshTokenRequest"},"RelatedColumn":{"properties":{"col_name":{"type":"string","title":"Col Name"},"col_type":{"type":"string","title":"Col Type"}},"type":"object","required":["col_name","col_type"],"title":"RelatedColumn","description":"Column information from a related source."},"RelatedColumnGroup":{"properties":{"source_name":{"type":"string","title":"Source Name","description":"Name of the related source (table_name)"},"source_id":{"type":"string","title":"Source Id","description":"ID of the related source"},"join_column":{"type":"string","title":"Join Column","description":"Column in the primary source used for joining"},"foreign_column":{"type":"string","title":"Foreign Column","description":"Column in the foreign source used for joining"},"relationship_id":{"type":"string","title":"Relationship Id","description":"ID of the relationship"},"columns":{"items":{"$ref":"#/components/schemas/RelatedColumn"},"type":"array","title":"Columns","description":"Available columns from the related source"}},"type":"object","required":["source_name","source_id","join_column","foreign_column","relationship_id"],"title":"RelatedColumnGroup","description":"Group of columns from a related source."},"RelatedColumnInfo":{"properties":{"col_name":{"type":"string","title":"Col Name"},"col_type":{"type":"string","title":"Col Type"}},"type":"object","required":["col_name","col_type"],"title":"RelatedColumnInfo","description":"Column information from a related source."},"RelatedSourceColumns":{"properties":{"source_name":{"type":"string","title":"Source Name","description":"Name of the related source (table_name)"},"source_id":{"type":"string","title":"Source Id","description":"ID of the related source"},"join_column":{"type":"string","title":"Join Column","description":"Column in the primary source used for joining"},"foreign_column":{"type":"string","title":"Foreign Column","description":"Column in the foreign source used for joining"},"relationship_id":{"type":"string","title":"Relationship Id","description":"ID of the relationship"},"columns":{"items":{"$ref":"#/components/schemas/RelatedColumnInfo"},"type":"array","title":"Columns","description":"Available columns from the related source"}},"type":"object","required":["source_name","source_id","join_column","foreign_column","relationship_id"],"title":"RelatedSourceColumns","description":"Group of columns from a related source."},"RelationshipListResponse":{"properties":{"relationships":{"items":{"$ref":"#/components/schemas/RelationshipResponse"},"type":"array","title":"Relationships"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["relationships","total"],"title":"RelationshipListResponse","description":"Response model for listing relationships."},"RelationshipResponse":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"primary_source_id":{"type":"string","title":"Primary Source Id"},"foreign_source_id":{"type":"string","title":"Foreign Source Id"},"primary_column":{"type":"string","title":"Primary Column"},"foreign_column":{"type":"string","title":"Foreign Column"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"primary_source_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Source Name"},"foreign_source_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Foreign Source Name"}},"type":"object","required":["id","user_id","primary_source_id","foreign_source_id","primary_column","foreign_column","created_at","updated_at"],"title":"RelationshipResponse","description":"Response model for a relationship."},"RenameAgentRequest":{"properties":{"agent_id":{"type":"string","title":"Agent Id","description":"The agent's new id"}},"type":"object","required":["agent_id"],"title":"RenameAgentRequest","description":"The id an existing agent moves to. Validated like a selection id."},"RunEvalCasesRequest":{"properties":{"suite_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suite Id","description":"Benchmark id; default all cases"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version","description":"Semantic-layer version; default Current"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"Selection tags (disambiguate entries)"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"Response language code, e.g. 'it'"},"disambiguation":{"type":"boolean","title":"Disambiguation","description":"Expose structured ask questions (mirrors the SDK flag)","default":false},"rows":{"type":"integer","maximum":500.0,"minimum":1.0,"title":"Rows","description":"Shadow rows per table","default":30},"salt":{"type":"string","maxLength":100,"title":"Salt","description":"Reroll the synthetic world","default":""},"case_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Case Ids","description":"Subset of case ids; default all"}},"type":"object","title":"RunEvalCasesRequest","description":"Synchronous eval run (legacy/internal-testing endpoint). The product\nflow uses persisted runs (``CreateEvalRunRequest``)."},"SDKExplainRequest":{"properties":{"query":{"type":"string","title":"Query","description":"Original natural language query"},"results":{"items":{"additionalProperties":true,"type":"object"},"type":"array","maxItems":50,"title":"Results","description":"Query results (first 50 rows max)"},"total_rows":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Total Rows","description":"Total number of rows in the full result set, before the SDK truncated to 50 for transport. When provided and larger than len(results), the LLM is told it is reading a sample of N total rows so its narrative explicitly avoids asserting totals or distributions over rows it never saw. Defaults to len(results) when omitted (assumes the caller is sending the full set)."},"sql":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sql","description":"SQL that was executed"},"dsl":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Dsl","description":"DSL that was used"},"schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Schema","description":"Schema context"},"general_context":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"General Context","description":"Additional context or instructions for the AI"},"language":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Language","description":"Response language code (e.g., 'en', 'it', 'es')"}},"type":"object","required":["query","results"],"title":"SDKExplainRequest","description":"Request for the SDK explain endpoint.\n\nAfter executing a query locally, the SDK can send results back\nto get AI-generated insights about the data."},"SDKExplainResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the request was successful","default":true},"explanation":{"type":"string","title":"Explanation","description":"Natural language insights about the data"}},"type":"object","required":["explanation"],"title":"SDKExplainResponse","description":"Response from the SDK explain endpoint."},"SDKQueryRequest":{"properties":{"query":{"type":"string","maxLength":500,"title":"Query","description":"Natural language query"},"schema":{"additionalProperties":true,"type":"object","title":"Schema","description":"Schema context from the connector. Format: {\"tables\": [{\"name\": \"...\", \"description\": \"...\", \"columns\": [{\"name\": \"...\", \"type\": \"...\", \"description\": \"...\"}], \"constraints\": {...}}]}"},"dialect":{"type":"string","title":"Dialect","description":"Target SQL dialect (postgres, bigquery, mysql)","default":"postgres"},"general_context":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"General Context","description":"Additional context or instructions for the AI"},"language":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Language","description":"Response language code (e.g., 'en', 'it', 'es')"},"filter_columns":{"type":"boolean","title":"Filter Columns","description":"Pre-filter schema columns to only those relevant to the query. Reduces noise for tables with many columns. Set to false to disable.","default":true}},"type":"object","required":["query","schema"],"title":"SDKQueryRequest","description":"Request for the SDK query endpoint.\n\nThe SDK sends a natural language query along with schema context\n(table names, column names/types/descriptions) so the API can\ngenerate DSL and SQL without requiring a source_id in Annie's DB."},"SDKQueryResponse":{"properties":{"type":{"type":"string","title":"Type","description":"Response type: 'query' for data queries, 'text' for non-data responses"},"success":{"type":"boolean","title":"Success","description":"Whether the request was successful","default":true},"dsl":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Dsl","description":"Generated DSL (DataModel with source and steps)"},"sql":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sql","description":"SQL compiled for the requested dialect"},"visualization":{"type":"string","title":"Visualization","description":"Recommended visualization type (bar, pie, line, table, etc.)","default":"table"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Text message for non-data responses"},"column_display_names":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Column Display Names","description":"Map of column names to human-readable display names"}},"type":"object","required":["type"],"title":"SDKQueryResponse","description":"Response from the SDK query endpoint.\n\nFor data queries: returns DSL + SQL in the requested dialect.\nFor non-data queries: returns a text message."},"SDKv2ExplainRequest":{"properties":{"query":{"type":"string","title":"Query","description":"Original natural language query"},"results":{"items":{"additionalProperties":true,"type":"object"},"type":"array","maxItems":50,"title":"Results","description":"Query results (first 50 rows max)"},"total_rows":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Total Rows"},"sql":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sql"},"general_context":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"General Context"},"language":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Language"},"column_display_names":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Column Display Names","description":"Mapping of raw column names to display names"}},"type":"object","required":["query","results"],"title":"SDKv2ExplainRequest"},"SDKv2ExplainResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"explanation":{"type":"string","title":"Explanation","default":""}},"type":"object","title":"SDKv2ExplainResponse"},"SDKv2QueryRequest":{"properties":{"question":{"type":"string","maxLength":1000,"title":"Question","description":"Natural language query"},"dialect":{"type":"string","title":"Dialect","description":"Target SQL dialect","default":"postgres"},"conversation_history":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Conversation History","description":"Previous conversation turns for multi-turn support"},"tool_results":{"anyOf":[{"items":{"$ref":"#/components/schemas/ToolResultInput"},"type":"array"},{"type":"null"}],"title":"Tool Results","description":"Results from client-side tool execution (SDK mode)"},"general_context":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"General Context","description":"Additional context or instructions for the AI"},"language":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Language","description":"Response language code (e.g., 'en', 'it', 'es')"},"constraints":{"anyOf":[{"additionalProperties":{"items":{"$ref":"#/components/schemas/ConstraintCondition"},"type":"array"},"type":"object"},{"type":"null"}],"title":"Constraints","description":"Per-table filter constraints injected into the SQL programmatically. Dict mapping table names to lists of constraint conditions. Example: {\"sales\": [{\"column\": \"tenant_id\", \"operator\": \"equals\", \"value\": 42}]}"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"Optional semantic-layer selection filter. When provided, only tables/columns/metrics carrying ALL of these tags are used (AND match); untagged entries are excluded. Omit to use the full layer."},"version":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Version","description":"Optional named semantic-layer version to serve (a frozen snapshot). Omit to serve the editable Current layer. Unknown name → error."}},"type":"object","required":["question"],"title":"SDKv2QueryRequest"},"SDKv2QueryResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Machine-readable reason code when success is false"},"sql":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sql"},"visualization":{"type":"string","title":"Visualization","default":"table"},"column_display_names":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Column Display Names"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"conversation_turn":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Conversation Turn","description":"Messages from this turn to append to conversation history"},"pending_tool_calls":{"anyOf":[{"items":{"$ref":"#/components/schemas/PendingToolCallResponse"},"type":"array"},{"type":"null"}],"title":"Pending Tool Calls","description":"Tool calls that need client-side execution (SDK mode)"}},"type":"object","title":"SDKv2QueryResponse"},"SaveAgentAssignmentsRequest":{"properties":{"skill_ids":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Skill Ids"},"tool_ids":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Tool Ids"}},"type":"object","title":"SaveAgentAssignmentsRequest"},"SaveDataMartRequest":{"properties":{"name":{"type":"string","maxLength":100,"title":"Name","description":"Table-like identifier"},"sql":{"type":"string","maxLength":10000,"title":"Sql","description":"SELECT over semantic-layer tables"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"Selection tags (AND-matched)"}},"type":"object","required":["name","sql"],"title":"SaveDataMartRequest","description":"Create/update payload for a data mart (a curated derived table)."},"SaveEvalCaseRequest":{"properties":{"suite_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suite Id","description":"Benchmark id (required on create, immutable on update)"},"question":{"type":"string","maxLength":1000,"title":"Question","description":"Question to ask the agent"},"evaluation_criteria":{"type":"string","maxLength":4000,"minLength":1,"title":"Evaluation Criteria","description":"What a good answer must do (judged by the LLM judge)"},"labels":{"items":{"type":"string"},"type":"array","title":"Labels","description":"Free-form case labels"},"gold_sql":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Gold Sql","description":"Reference SQL for result comparison"},"ordered":{"type":"boolean","title":"Ordered","description":"Compare results order-sensitively (query pins ORDER BY)","default":false},"assertions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Assertions","description":"Typed assertion specs, e.g. [{'type': 'max_turns', 'max': 4}]"}},"type":"object","required":["question","evaluation_criteria"],"title":"SaveEvalCaseRequest","description":"Create/update payload for a benchmark case.\n\nThe minimum case is ``question + evaluation_criteria``; gold SQL and typed\nassertions are optional advanced expectations."},"SaveEvalSuiteRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Benchmark name"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"default_selection_tags":{"items":{"type":"string"},"type":"array","title":"Default Selection Tags","description":"Run-form default selection tags"},"default_language":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Default Language","description":"Run-form default response language code"},"default_disambiguation":{"type":"boolean","title":"Default Disambiguation","description":"Run-form default for structured clarifications","default":false},"default_version":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Default Version","description":"Semantic-layer version runs target by default (None = Current)"}},"type":"object","required":["name"],"title":"SaveEvalSuiteRequest","description":"Create/update payload for a benchmark (eval suite)."},"SaveSkillRequest":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"},"description":{"type":"string","maxLength":300,"minLength":1,"title":"Description"},"instructions":{"type":"string","maxLength":8000,"minLength":1,"title":"Instructions"},"agent_ids":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":6},{"type":"null"}],"title":"Agent Ids"},"always_load":{"type":"boolean","title":"Always Load","default":false}},"type":"object","required":["name","description","instructions"],"title":"SaveSkillRequest"},"SaveToolRequest":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"},"description":{"type":"string","maxLength":500,"minLength":1,"title":"Description"},"agent_ids":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":6},{"type":"null"}],"title":"Agent Ids"},"parameters":{"additionalProperties":true,"type":"object","title":"Parameters"}},"type":"object","required":["name","description"],"title":"SaveToolRequest"},"SdkConversationDailyActivity":{"properties":{"date":{"type":"string","title":"Date"},"conversations":{"type":"integer","title":"Conversations"},"turns":{"type":"integer","title":"Turns"},"errors":{"type":"integer","title":"Errors"}},"type":"object","required":["date","conversations","turns","errors"],"title":"SdkConversationDailyActivity"},"SdkConversationDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"first_user_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First User Message"},"last_user_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last User Message"},"turn_count":{"type":"integer","title":"Turn Count"},"error_count":{"type":"integer","title":"Error Count"},"end_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End User Id"},"agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Id"},"status":{"type":"string","enum":["running","idle","awaiting_answer","budget_exhausted"],"title":"Status"},"api_key_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Api Key Id"},"context":{"additionalProperties":true,"type":"object","title":"Context"},"content_storage_mode":{"type":"string","enum":["metadata_only","full"],"title":"Content Storage Mode"},"content_deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Content Deleted At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"failure_categories":{"items":{"type":"string"},"type":"array","title":"Failure Categories","default":[]},"conversation_id":{"type":"string","format":"uuid","title":"Conversation Id"},"transcript":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Transcript"},"tool_errors":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Tool Errors"},"events":{"items":{"$ref":"#/components/schemas/SdkConversationEvent"},"type":"array","title":"Events","default":[]}},"type":"object","required":["id","first_user_message","last_user_message","turn_count","error_count","end_user_id","agent_id","status","api_key_id","context","content_storage_mode","content_deleted_at","created_at","updated_at","conversation_id","transcript","tool_errors"],"title":"SdkConversationDetail"},"SdkConversationEndUser":{"properties":{"end_user_id":{"type":"string","title":"End User Id"},"conversations":{"type":"integer","title":"Conversations"},"last_activity":{"type":"string","format":"date-time","title":"Last Activity"}},"type":"object","required":["end_user_id","conversations","last_activity"],"title":"SdkConversationEndUser"},"SdkConversationEndUsersResponse":{"properties":{"users":{"items":{"$ref":"#/components/schemas/SdkConversationEndUser"},"type":"array","title":"Users"}},"type":"object","required":["users"],"title":"SdkConversationEndUsersResponse"},"SdkConversationEvent":{"properties":{"turn_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Turn Index"},"at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"At"},"turn_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Turn Type"},"tool":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool"},"internal":{"type":"boolean","title":"Internal","default":false},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Id"},"llm_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Llm Ms"},"prev_tool_ok":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Prev Tool Ok"},"prev_tool":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prev Tool"},"error_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Category"},"skills":{"items":{"type":"string"},"type":"array","title":"Skills"},"harness":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Harness"},"truncated":{"type":"boolean","title":"Truncated","default":false}},"type":"object","title":"SdkConversationEvent","description":"One allowlist-built entry of the per-step operational timeline.\n\nDeliberately lenient (defaults everywhere, unknown keys ignored): the\nstored JSON is best-effort telemetry and a malformed entry must degrade,\nnever break the detail view. The authoritative field set lives in the\nroute's `_build_step_event` and docs/backend/SDK_CONVERSATION_LOGS.md."},"SdkConversationFailureCategory":{"properties":{"tool":{"type":"string","title":"Tool"},"category":{"type":"string","title":"Category"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["tool","category","count"],"title":"SdkConversationFailureCategory","description":"One `(tool, category)` failure bucket, aggregated from the event\ntimeline, available in both storage modes unlike `top_errors`."},"SdkConversationListResponse":{"properties":{"conversations":{"items":{"$ref":"#/components/schemas/SdkConversationSummary"},"type":"array","title":"Conversations"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["conversations","total","limit","offset"],"title":"SdkConversationListResponse"},"SdkConversationSettingsResponse":{"properties":{"store_conversation_content":{"type":"boolean","title":"Store Conversation Content"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"redacted_conversations":{"type":"integer","title":"Redacted Conversations","default":0}},"type":"object","required":["store_conversation_content"],"title":"SdkConversationSettingsResponse"},"SdkConversationStatsResponse":{"properties":{"period_days":{"type":"integer","title":"Period Days"},"total_conversations":{"type":"integer","title":"Total Conversations"},"total_turns":{"type":"integer","title":"Total Turns"},"total_tool_errors":{"type":"integer","title":"Total Tool Errors"},"conversations_with_errors":{"type":"integer","title":"Conversations With Errors"},"statuses":{"additionalProperties":{"type":"integer"},"type":"object","title":"Statuses"},"daily":{"items":{"$ref":"#/components/schemas/SdkConversationDailyActivity"},"type":"array","title":"Daily"},"tags":{"items":{"$ref":"#/components/schemas/SdkConversationTagCount"},"type":"array","title":"Tags"},"top_errors":{"items":{"$ref":"#/components/schemas/SdkConversationTopError"},"type":"array","title":"Top Errors"},"failure_categories":{"items":{"$ref":"#/components/schemas/SdkConversationFailureCategory"},"type":"array","title":"Failure Categories","default":[]},"tool_mix":{"items":{"$ref":"#/components/schemas/SdkConversationToolMixEntry"},"type":"array","title":"Tool Mix","default":[]},"model_time_ms":{"type":"integer","title":"Model Time Ms","default":0},"wall_time_ms":{"type":"integer","title":"Wall Time Ms","default":0},"duration_p50_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration P50 Ms"},"duration_p95_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration P95 Ms"}},"type":"object","required":["period_days","total_conversations","total_turns","total_tool_errors","conversations_with_errors","statuses","daily","tags","top_errors"],"title":"SdkConversationStatsResponse"},"SdkConversationSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"first_user_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First User Message"},"last_user_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last User Message"},"turn_count":{"type":"integer","title":"Turn Count"},"error_count":{"type":"integer","title":"Error Count"},"end_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End User Id"},"agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Id"},"status":{"type":"string","enum":["running","idle","awaiting_answer","budget_exhausted"],"title":"Status"},"api_key_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Api Key Id"},"context":{"additionalProperties":true,"type":"object","title":"Context"},"content_storage_mode":{"type":"string","enum":["metadata_only","full"],"title":"Content Storage Mode"},"content_deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Content Deleted At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"failure_categories":{"items":{"type":"string"},"type":"array","title":"Failure Categories","default":[]}},"type":"object","required":["id","first_user_message","last_user_message","turn_count","error_count","end_user_id","agent_id","status","api_key_id","context","content_storage_mode","content_deleted_at","created_at","updated_at"],"title":"SdkConversationSummary"},"SdkConversationTagCount":{"properties":{"tag":{"type":"string","title":"Tag"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["tag","count"],"title":"SdkConversationTagCount"},"SdkConversationToolMixEntry":{"properties":{"turn_type":{"type":"string","title":"Turn Type"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["turn_type","count"],"title":"SdkConversationToolMixEntry"},"SdkConversationTopError":{"properties":{"tool":{"type":"string","title":"Tool"},"error":{"type":"string","title":"Error"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["tool","error","count"],"title":"SdkConversationTopError"},"SdkUsageResponse":{"properties":{"base_limit":{"type":"integer","title":"Base Limit"},"overage_limit":{"type":"integer","title":"Overage Limit"},"effective_limit":{"type":"integer","title":"Effective Limit"},"monthly_used":{"type":"integer","title":"Monthly Used"},"plan_turns_remaining":{"type":"integer","title":"Plan Turns Remaining"},"monthly_turns_remaining":{"type":"integer","title":"Monthly Turns Remaining"},"overage_turns_used":{"type":"integer","title":"Overage Turns Used"}},"type":"object","required":["base_limit","overage_limit","effective_limit","monthly_used","plan_turns_remaining","monthly_turns_remaining","overage_turns_used"],"title":"SdkUsageResponse","description":"Unbilled budget readout for ``GET /v3/sdk/usage``.\n\nLets an SDK consumer poll their balance without spending a turn. Same\ntwo-level split as ``StepUsage``: the plan allowance and the hard stop\n(allowance plus customer-authorized overage)."},"SelectStep":{"properties":{"type":{"type":"string","const":"select","title":"Type","default":"select"},"columns":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Columns","description":"Column names to select"}},"type":"object","required":["columns"],"title":"SelectStep","description":"Select step - choose specific columns."},"SemanticTableRequest":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Existing entry id — when set, updates that row in place"},"table_name":{"type":"string","title":"Table Name"},"schema_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schema Name","description":"Physical database schema the table lives in (e.g. 'report'). Empty clears it; the bare table_name stays the identity everywhere."},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"}},"type":"object","required":["table_name"],"title":"SemanticTableRequest"},"SetAgentsRequest":{"properties":{"agent_ids":{"items":{"type":"string"},"type":"array","maxItems":6,"title":"Agent Ids"}},"type":"object","title":"SetAgentsRequest","description":"The skill/tool side of the same relation, saved on its own.\n\nThe detail's agent rail writes on change, so it sends the membership\nalone rather than the whole row the form still holds."},"SetUserOverrideRequest":{"properties":{"value":{"type":"boolean","title":"Value"},"override_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Override Reason"}},"type":"object","required":["value"],"title":"SetUserOverrideRequest"},"SetUserTypeRequest":{"properties":{"user_type":{"type":"string","title":"User Type"},"sdk_monthly_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sdk Monthly Limit"},"sdk_overage_limit":{"anyOf":[{"type":"integer","maximum":1000000.0,"minimum":0.0},{"type":"null"}],"title":"Sdk Overage Limit"}},"type":"object","required":["user_type"],"title":"SetUserTypeRequest"},"ShadowQueryRequest":{"properties":{"sql":{"type":"string","maxLength":10000,"title":"Sql"},"mart_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mart Id"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"dialect":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dialect"}},"type":"object","required":["sql"],"title":"ShadowQueryRequest","description":"Payload for a row preview run over the shadow DB."},"SkillListResponse":{"properties":{"skills":{"items":{"$ref":"#/components/schemas/SkillResponse"},"type":"array","title":"Skills"}},"type":"object","required":["skills"],"title":"SkillListResponse"},"SkillResponse":{"properties":{"skill_id":{"type":"string","title":"Skill Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"instructions":{"type":"string","title":"Instructions"},"agent_ids":{"items":{"type":"string"},"type":"array","title":"Agent Ids"},"always_load":{"type":"boolean","title":"Always Load"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["skill_id","name","description","instructions","agent_ids","always_load","created_at","updated_at"],"title":"SkillResponse"},"SourceListResponse":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/SourceResponse"},"type":"array","title":"Sources"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["sources","total"],"title":"SourceListResponse","description":"Response model for listing sources."},"SourceResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"table_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Table Name","description":"Table name for the source"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name","description":"Display name for the source"},"connector_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Connector Id"},"database_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Database Id"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"is_deleted":{"type":"boolean","title":"Is Deleted","default":false},"is_hidden":{"type":"boolean","title":"Is Hidden","default":false},"size_kb":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Size Kb"},"type":{"type":"string","title":"Type"}},"type":"object","required":["user_id","type"],"title":"SourceResponse","description":"Response model for a source.\nExtends Source model with computed fields the frontend needs."},"SourceWithRelatedColumnsResponse":{"properties":{"source_id":{"type":"string","title":"Source Id"},"source_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Name"},"related_columns":{"items":{"$ref":"#/components/schemas/RelatedColumnGroup"},"type":"array","title":"Related Columns","description":"Related columns from connected sources"}},"type":"object","required":["source_id","source_name"],"title":"SourceWithRelatedColumnsResponse","description":"Response model for a source with its related columns."},"SourceWithRelationsResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"table_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Table Name","description":"Table name for the source"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name","description":"Display name for the source"},"connector_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Connector Id"},"database_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Database Id"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"is_deleted":{"type":"boolean","title":"Is Deleted","default":false},"is_hidden":{"type":"boolean","title":"Is Hidden","default":false},"size_kb":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Size Kb"},"type":{"type":"string","title":"Type"},"related_columns":{"items":{"$ref":"#/components/schemas/RelatedSourceColumns"},"type":"array","title":"Related Columns","description":"Related columns from connected sources via relationships"}},"type":"object","required":["user_id","type"],"title":"SourceWithRelationsResponse","description":"Response model for a source with its related columns.\nUsed when include_related_columns=true."},"SqlExampleResponse":{"properties":{"id":{"type":"string","title":"Id"},"question":{"type":"string","title":"Question"},"sql":{"type":"string","title":"Sql"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","question","sql","created_at","updated_at"],"title":"SqlExampleResponse"},"StepDebug":{"properties":{"examples_recalled":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Examples Recalled"},"prompt_focus":{"additionalProperties":true,"type":"object","title":"Prompt Focus"},"context":{"additionalProperties":true,"type":"object","title":"Context"},"docs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Docs"},"skills":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Skills"},"tools":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tools"},"compaction":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Compaction"},"calc":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Calc"},"aggregates":{"additionalProperties":true,"type":"object","title":"Aggregates"},"llm_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Llm Ms"}},"type":"object","title":"StepDebug","description":"Harness introspection for one step, present only when the request set\n``debug=true``. Rides the response envelope — deliberately NOT the ``Turn``\nmodel, which stays the lean protocol surface.\n\nShapes mirror the playground inspector (services/evals/runner.py):\n- ``examples_recalled``: the few-shot SQL examples selected for this turn\n  (``{question, note?}``, ranked order).\n- ``prompt_focus``: column-narrowing record — ``{narrowing, columns_total,\n  columns_kept, kept_columns: {table: [column, ...]}}``; ``{narrowing:\n  false}`` when the layer carries no embeddings or focusing failed.\n- ``context``: what fed the prompt — ``{table_names, metric_names, marts,\n  tags, agent_id}``.\n- ``docs``: docs turns only — the sub agent's full search trace\n  (queries, ranked hits with scores/content, used flags, answer).\n- ``compaction``: present only on steps that compacted the transcript —\n  ``{messages_before, messages_after, tokens_before, tokens_after,\n  summarized}``. Counts only; the summary text lives in the transcript."},"StepRequest":{"properties":{"conversation":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Conversation","description":"Full transcript so far (the dump() blob's messages)"},"conversation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conversation Id","description":"Optional best-effort conversation telemetry identifier"},"user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User","description":"Optional opaque end-user identifier (the SDK caller's own user), used to segment and filter conversation logs"},"agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent","description":"Optional named agent persona id (e.g. 'data_expert')"},"dialect":{"type":"string","title":"Dialect","default":"postgres"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"behavior":{"title":"Behavior","description":"Agent behavior major this client was built against. Omit to keep the behavior that shipped before agent behavior versioning."},"constraints":{"anyOf":[{"additionalProperties":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"type":"object"},{"type":"null"}],"title":"Constraints"},"tools":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tools"},"enable_disambiguation":{"type":"boolean","title":"Enable Disambiguation","description":"Allow structured questions on ask turns","default":false},"debug":{"type":"boolean","title":"Debug","description":"Return harness introspection for this step in StepResponse.debug","default":false},"verify_answers":{"type":"boolean","title":"Verify Answers","description":"Hold back an answer stating a figure the queried results do not hold, and ask the model to restate it (bills one extra credit when it happens)","default":false},"as_of_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"As Of Date","description":"Freeze the agent's notion of today (YYYY-MM-DD); default: today"}},"type":"object","title":"StepRequest","description":"One agent turn. The SDK loops until terminal text, ask, or budget stop."},"StepResponse":{"properties":{"turn":{"$ref":"#/components/schemas/Turn"},"conversation":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Conversation"},"usage":{"$ref":"#/components/schemas/StepUsage"},"status":{"type":"string","enum":["running","awaiting_answer","idle","budget_exhausted"],"title":"Status"},"debug":{"anyOf":[{"$ref":"#/components/schemas/StepDebug"},{"type":"null"}]},"skills_loaded":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Skills Loaded"},"skills_active":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Skills Active"},"audit":{"anyOf":[{"$ref":"#/components/schemas/AnswerAudit"},{"type":"null"}]},"compaction":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Compaction"}},"type":"object","required":["turn","conversation","usage","status"],"title":"StepResponse"},"StepUsage":{"properties":{"turns_this_run":{"type":"integer","title":"Turns This Run"},"plan_turns_remaining":{"type":"integer","title":"Plan Turns Remaining"},"monthly_turns_remaining":{"type":"integer","title":"Monthly Turns Remaining"},"overage_turns_used":{"type":"integer","title":"Overage Turns Used","default":0}},"type":"object","required":["turns_this_run","plan_turns_remaining","monthly_turns_remaining"],"title":"StepUsage","description":"Two-level monthly budget readout.\n\n``plan_turns_remaining`` counts down the plan's included allowance;\n``monthly_turns_remaining`` counts down to the hard stop (allowance plus\nany customer-authorized overage). Once the plan allowance is exhausted the\nrun keeps going and ``overage_turns_used`` tracks the extra units billed\nat month end. Design: docs/plans/SDK_OVERAGE_ALLOWANCE.md."},"SuggestChecksRequest":{"properties":{"question":{"type":"string","maxLength":1000,"title":"Question","default":""},"evaluation_criteria":{"type":"string","maxLength":4000,"minLength":1,"title":"Evaluation Criteria"}},"type":"object","required":["evaluation_criteria"],"title":"SuggestChecksRequest","description":"Ask the extractor for typed checks implied by free-text criteria."},"SummarizeStep":{"properties":{"type":{"type":"string","const":"summarize","title":"Type","default":"summarize"},"aggregations":{"items":{"$ref":"#/components/schemas/AggregationSpec"},"type":"array","minItems":1,"title":"Aggregations","description":"Aggregations to compute"},"by":{"anyOf":[{"items":{"$ref":"#/components/schemas/BySpec"},"type":"array"},{"type":"null"}],"title":"By","description":"Dimensions to group by (empty for overall aggregation)"}},"type":"object","required":["aggregations"],"title":"SummarizeStep","description":"Summarize step - aggregate data with optional grouping."},"TableConfigExport":{"properties":{"version":{"type":"string","title":"Version","default":"1"},"table":{"$ref":"#/components/schemas/SemanticTableRequest"},"columns":{"items":{"$ref":"#/components/schemas/ColumnMetadataRequest"},"type":"array","title":"Columns"},"metrics":{"items":{"$ref":"#/components/schemas/MetricDefinitionRequest"},"type":"array","title":"Metrics"}},"type":"object","required":["table"],"title":"TableConfigExport","description":"Portable table configuration for import/export."},"TableConfigImportRequest":{"properties":{"version":{"type":"string","title":"Version","default":"1"},"table":{"$ref":"#/components/schemas/SemanticTableRequest"},"columns":{"items":{"$ref":"#/components/schemas/ColumnMetadataRequest"},"type":"array","title":"Columns"},"metrics":{"items":{"$ref":"#/components/schemas/MetricDefinitionRequest"},"type":"array","title":"Metrics"}},"type":"object","required":["table"],"title":"TableConfigImportRequest","description":"Import payload — same shape as the export."},"TableInfoResponse":{"properties":{"name":{"type":"string","title":"Name"},"dataset":{"type":"string","title":"Dataset"},"num_rows":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Num Rows"},"num_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Num Bytes"}},"type":"object","required":["name","dataset"],"title":"TableInfoResponse","description":"Response model for table info."},"TableListResponse":{"properties":{"tables":{"items":{"$ref":"#/components/schemas/TableInfoResponse"},"type":"array","title":"Tables"}},"type":"object","required":["tables"],"title":"TableListResponse","description":"Response model for listing tables."},"TableRelationshipRequest":{"properties":{"table_name_a":{"type":"string","title":"Table Name A"},"column_name_a":{"type":"string","title":"Column Name A"},"table_name_b":{"type":"string","title":"Table Name B"},"column_name_b":{"type":"string","title":"Column Name B"},"join_type":{"type":"string","title":"Join Type","default":"inner"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["table_name_a","column_name_a","table_name_b","column_name_b"],"title":"TableRelationshipRequest"},"TableSchemaResponse":{"properties":{"columns":{"items":{"$ref":"#/components/schemas/ColumnInfoResponse"},"type":"array","title":"Columns"}},"type":"object","required":["columns"],"title":"TableSchemaResponse","description":"Response model for table schema."},"TableSelection":{"properties":{"dataset":{"type":"string","title":"Dataset"},"table_name":{"type":"string","title":"Table Name"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"}},"type":"object","required":["dataset","table_name"],"title":"TableSelection","description":"A table selected for import."},"TestConnectionResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success"],"title":"TestConnectionResponse","description":"Response model for connection test."},"TestEvalCaseRequest":{"properties":{"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version","description":"Semantic-layer version; default Current"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"Selection tags (disambiguate entries)"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"Response language code, e.g. 'it'"},"disambiguation":{"type":"boolean","title":"Disambiguation","description":"Expose structured ask questions (mirrors the SDK flag)","default":false},"rows":{"type":"integer","maximum":500.0,"minimum":1.0,"title":"Rows","description":"Shadow rows per table","default":30},"salt":{"type":"string","maxLength":100,"title":"Salt","description":"Reroll the synthetic world","default":""}},"type":"object","title":"TestEvalCaseRequest","description":"Run one case synchronously without creating benchmark history."},"ToolListResponse":{"properties":{"tools":{"items":{"$ref":"#/components/schemas/ToolResponse"},"type":"array","title":"Tools"}},"type":"object","required":["tools"],"title":"ToolListResponse"},"ToolResponse":{"properties":{"tool_id":{"type":"string","title":"Tool Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"agent_ids":{"items":{"type":"string"},"type":"array","title":"Agent Ids"},"parameters":{"additionalProperties":true,"type":"object","title":"Parameters"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["tool_id","name","description","agent_ids","parameters","created_at","updated_at"],"title":"ToolResponse"},"ToolResultInput":{"properties":{"tool_call_id":{"type":"string","title":"Tool Call Id"},"result":{"title":"Result"}},"type":"object","required":["tool_call_id","result"],"title":"ToolResultInput"},"Turn":{"properties":{"type":{"type":"string","enum":["query","chart","docs","text","ask","finish","tool"],"title":"Type"},"tool_call_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Call Id"},"tool":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool"},"sql":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sql"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"markdown":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Markdown"},"question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question"},"questions":{"anyOf":[{"items":{"$ref":"#/components/schemas/DisambiguationQuestion"},"type":"array","maxItems":5,"minItems":1},{"type":"null"}],"title":"Questions"},"chart_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chart Ref"},"chart_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Chart Config"},"internal":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Internal"},"arguments":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Arguments"},"docs_question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Docs Question"},"sources":{"anyOf":[{"items":{"$ref":"#/components/schemas/DocSource"},"type":"array"},{"type":"null"}],"title":"Sources"}},"type":"object","required":["type"],"title":"Turn"},"UpdateChatRequest":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Title"},"messages":{"anyOf":[{"items":{"$ref":"#/components/schemas/ChatMessage"},"type":"array"},{"type":"null"}],"title":"Messages"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","title":"UpdateChatRequest","description":"Request for updating an existing chat."},"UpdateConnectorRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"enabled_modes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Enabled Modes"},"mcp_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Mcp Config"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"schedule_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule Type"},"schedule_cron":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule Cron"}},"type":"object","title":"UpdateConnectorRequest","description":"Request body for updating a connector."},"UpdateDashboardRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Dashboard name"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config","description":"Layout configuration"}},"type":"object","title":"UpdateDashboardRequest","description":"Request model for updating a dashboard."},"UpdateDatabaseRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"}},"type":"object","title":"UpdateDatabaseRequest","description":"Request model for updating a database connection."},"UpdateFeatureFlagRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"flag_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flag Type"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"rollout_percentage":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rollout Percentage"}},"type":"object","title":"UpdateFeatureFlagRequest"},"UpdateOverridesRequest":{"properties":{"overrides":{"additionalProperties":true,"type":"object","title":"Overrides"}},"type":"object","required":["overrides"],"title":"UpdateOverridesRequest"},"UpdatePersonaRequest":{"properties":{"content":{"type":"string","maxLength":5000,"title":"Content","description":"Agent persona text"}},"type":"object","required":["content"],"title":"UpdatePersonaRequest"},"UpdateRelationshipRequest":{"properties":{"primary_column":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Column","description":"New primary column"},"foreign_column":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Foreign Column","description":"New foreign column"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"New description"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"New metadata"}},"type":"object","title":"UpdateRelationshipRequest","description":"Request model for updating a relationship."},"UpdateSdkConversationSettingsRequest":{"properties":{"store_conversation_content":{"type":"boolean","title":"Store Conversation Content"}},"type":"object","required":["store_conversation_content"],"title":"UpdateSdkConversationSettingsRequest"},"UpdateSourceRequest":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","title":"UpdateSourceRequest","description":"Request model for updating a source."},"UpdateSqlExampleRequest":{"properties":{"question":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Question"},"sql":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Sql"},"note":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Note"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"Replace the tag list when set"}},"type":"object","title":"UpdateSqlExampleRequest"},"UpdateSubscriptionRequest":{"properties":{"package_name":{"type":"string","title":"Package Name","description":"Package name (e.g., 'basic', 'pro', 'enterprise')"},"success_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Success Url","description":"URL to redirect after successful payment"}},"type":"object","required":["package_name"],"title":"UpdateSubscriptionRequest","description":"Request model for creating a customer portal session"},"UpdateVersionRequest":{"properties":{"message":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Message","description":"Optional note"}},"type":"object","title":"UpdateVersionRequest","description":"The one editable field of a frozen version: its note.\n\nThe name is not editable: the SDK resolves a version by name, so renaming\none would silently repoint every integration pinned to it.\n\nOmitting `message` leaves the note alone; sending it as `null` clears it.\nThe two are told apart by `model_fields_set`, so an empty body cannot wipe\na note nobody meant to touch."},"UploadFileResponse":{"properties":{"status":{"type":"string","title":"Status"},"source_id":{"type":"string","title":"Source Id"},"filename":{"type":"string","title":"Filename"},"data_model_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Model Id"},"message":{"type":"string","title":"Message"}},"type":"object","required":["status","source_id","filename","message"],"title":"UploadFileResponse","description":"Response model for file upload."},"UsageLogEntry":{"properties":{"id":{"type":"string","title":"Id"},"endpoint":{"type":"string","title":"Endpoint"},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query"},"success":{"type":"boolean","title":"Success"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"conversation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversation Id"}},"type":"object","required":["id","endpoint","query","success","created_at"],"title":"UsageLogEntry","description":"A single usage log entry.\n\nOne row is one billed credit, so no cost figure rides along: token counts\nand dollar spend stay internal (admin panel only) and are never exposed on\na customer-facing route."},"UsageMetric":{"properties":{"current":{"type":"number","title":"Current"},"limit":{"type":"number","title":"Limit"}},"type":"object","required":["current","limit"],"title":"UsageMetric"},"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"},"api__routes__connectors__google_ads__FinalizeRequest":{"properties":{"setup_token":{"type":"string","title":"Setup Token"},"customer_id":{"type":"string","title":"Customer Id"}},"type":"object","required":["setup_token","customer_id"],"title":"FinalizeRequest"},"api__routes__connectors__google_analytics__FinalizeRequest":{"properties":{"setup_token":{"type":"string","title":"Setup Token"},"property_id":{"type":"string","title":"Property Id"}},"type":"object","required":["setup_token","property_id"],"title":"FinalizeRequest"},"api__routes__connectors__google_search_console__FinalizeRequest":{"properties":{"setup_token":{"type":"string","title":"Setup Token"},"site_url":{"type":"string","title":"Site Url"}},"type":"object","required":["setup_token","site_url"],"title":"FinalizeRequest"},"api__routes__connectors__meta_ads__FinalizeRequest":{"properties":{"setup_token":{"type":"string","title":"Setup Token"},"ad_account_id":{"type":"string","title":"Ad Account Id"}},"type":"object","required":["setup_token","ad_account_id"],"title":"FinalizeRequest"}}}}