{"openapi":"3.1.0","info":{"title":"BetterOCR - 智能文档处理平台","description":"Agentic Document Processing Platform","version":"1.0.0"},"paths":{"/api/v1/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"post_api_v1_auth_login","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/me":{"get":{"tags":["auth"],"summary":"Get Me","description":"Current user profile incl. MFA state (等保双因素状态, 前端设置卡用).","operationId":"get_api_v1_auth_me","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/users":{"get":{"tags":["auth"],"summary":"List Users","description":"List all users (admin only).","operationId":"get_api_v1_auth_users","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["auth"],"summary":"Create User","description":"直接创建用户 (admin only) — username/password 当面交付。","operationId":"post_api_v1_auth_users","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/users/{user_id}/role":{"patch":{"tags":["auth"],"summary":"Update User Role","description":"Change a user's role (admin only).","operationId":"patch_api_v1_auth_users_user_id_role","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/users/{user_id}/deactivate":{"post":{"tags":["auth"],"summary":"Deactivate User","description":"Deactivate a user (admin only).","operationId":"post_api_v1_auth_users_user_id_deactivate","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/users/{user_id}":{"patch":{"tags":["auth"],"summary":"Update User Profile","description":"维护用户资料: 显示名 / 邮箱 (admin only, 字段缺省不动)。","operationId":"patch_api_v1_auth_users_user_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/users/{user_id}/reset-password":{"post":{"tags":["auth"],"summary":"Admin Reset Password","description":"管理员重置密码: 设置新密码并踢掉该用户全部在线会话。","operationId":"post_api_v1_auth_users_user_id_reset_password","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminResetPassword"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/users/{user_id}/reactivate":{"post":{"tags":["auth"],"summary":"Reactivate User","description":"重新启用已停用的用户 (不恢复旧会话 — 需重新登录)。","operationId":"post_api_v1_auth_users_user_id_reactivate","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/signup":{"post":{"tags":["auth"],"summary":"Self Signup","description":"Self-service tenant signup (P2-1): create a tenant + tenant_admin + free\ntrial. The PLG front door — replaces the old register() (removed 2026-09-29)\nwhich left floating users.","operationId":"post_api_v1_auth_signup","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/request-verify":{"post":{"tags":["auth"],"summary":"Request Verify","description":"Send a verification link to the caller's email (best-effort).","operationId":"post_api_v1_auth_request_verify","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/verify-email":{"post":{"tags":["auth"],"summary":"Verify Email","operationId":"post_api_v1_auth_verify_email","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/forgot-password":{"post":{"tags":["auth"],"summary":"Forgot Password","description":"Request a password reset link. Always returns ok (anti-enumeration).","operationId":"post_api_v1_auth_forgot_password","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/reset-password":{"post":{"tags":["auth"],"summary":"Reset Password","operationId":"post_api_v1_auth_reset_password","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/change-password":{"post":{"tags":["auth"],"summary":"Change Password","description":"Change the caller's own password (等保口令管理): verifies the current\npassword first, then stores the new hash and audits the change.\n\nSecurity: a wrong current password counts toward the same login-failure\nlockout as /login (P10), and a successful change bumps ``token_version`` so\nevery previously issued session token dies immediately.","operationId":"post_api_v1_auth_change_password","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/mfa/setup":{"post":{"tags":["auth"],"summary":"Mfa Setup","description":"Provision a TOTP secret + otpauth URL (P2-2). The secret is NOT enabled\nuntil the caller proves enrollment via /auth/mfa/enable with a valid code.","operationId":"post_api_v1_auth_mfa_setup","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/mfa/enable":{"post":{"tags":["auth"],"summary":"Mfa Enable","description":"Enable MFA: verify the provisioned secret produces the given code, then\nstore it (encrypted) and flip mfa_enabled.","operationId":"post_api_v1_auth_mfa_enable","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MfaEnableRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/mfa/disable":{"post":{"tags":["auth"],"summary":"Mfa Disable","operationId":"post_api_v1_auth_mfa_disable","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/tenant/members":{"get":{"tags":["auth"],"summary":"Tenant Members","operationId":"get_api_v1_auth_tenant_members","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["auth"],"summary":"Create Tenant Member","description":"租户管理员**直接创建**企业内部成员账号 (用户名+密码+角色), 无需邮件邀请。\n\n权限: 平台 admin 可为任意租户建; tenant_admin 只能为本租户建, 且角色\n仅限 REVIEWER/BUILDER/OPERATOR/VIEWER (追加管理员走邀请或平台侧操作)。","operationId":"post_api_v1_auth_tenant_members","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/tenant/members/{user_id}/role":{"patch":{"tags":["auth"],"summary":"Update Member Role","operationId":"patch_api_v1_auth_tenant_members_user_id_role","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberRoleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/tenant/members/{user_id}":{"delete":{"tags":["auth"],"summary":"Remove Member","operationId":"delete_api_v1_auth_tenant_members_user_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/tenant/invite":{"post":{"tags":["auth"],"summary":"Tenant Invite","operationId":"post_api_v1_auth_tenant_invite","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/accept-invite":{"post":{"tags":["auth"],"summary":"Accept Invite","operationId":"post_api_v1_auth_accept_invite","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptInviteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apps":{"get":{"tags":["flow-apps"],"summary":"List Apps","operationId":"get_api_v1_apps","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["flow-apps"],"summary":"Create App","operationId":"post_api_v1_apps","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/apps/{app_row_id}/executions":{"get":{"tags":["flow-apps"],"summary":"List Executions","operationId":"get_api_v1_apps_app_row_id_executions","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_row_id","in":"path","required":true,"schema":{"type":"integer","title":"App Row Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apps/{app_row_id}/publish":{"post":{"tags":["flow-apps"],"summary":"Publish App","operationId":"post_api_v1_apps_app_row_id_publish","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_row_id","in":"path","required":true,"schema":{"type":"integer","title":"App Row Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apps/{app_row_id}/rotate-secret":{"post":{"tags":["flow-apps"],"summary":"Rotate Secret","operationId":"post_api_v1_apps_app_row_id_rotate_secret","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_row_id","in":"path","required":true,"schema":{"type":"integer","title":"App Row Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apps/{app_row_id}/status":{"post":{"tags":["flow-apps"],"summary":"Set Status","operationId":"post_api_v1_apps_app_row_id_status","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_row_id","in":"path","required":true,"schema":{"type":"integer","title":"App Row Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/open/v1/apps/{app_id}/executions":{"post":{"tags":["open-platform"],"summary":"Create Execution","description":"发起应用执行 (默认异步): 传 file / document_id / text 三选一。\n返回 202 + execution_id; 完成后回调 callback_url (HMAC 签名)。","operationId":"post_api_v1_open_v1_apps_app_id_executions","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"x-app-id","in":"header","required":true,"schema":{"type":"string","title":"X-App-Id"}},{"name":"x-app-secret","in":"header","required":true,"schema":{"type":"string","title":"X-App-Secret"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_execution_api_v1_open_v1_apps__app_id__executions_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/open/v1/executions/{execution_id}":{"get":{"tags":["open-platform"],"summary":"Get Execution","operationId":"get_api_v1_open_v1_executions_execution_id","parameters":[{"name":"execution_id","in":"path","required":true,"schema":{"type":"string","title":"Execution Id"}},{"name":"x-app-id","in":"header","required":true,"schema":{"type":"string","title":"X-App-Id"}},{"name":"x-app-secret","in":"header","required":true,"schema":{"type":"string","title":"X-App-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/models":{"get":{"tags":["domain-models"],"summary":"List Models","description":"List domain models (extraction schemas), optionally filtered by industry.\nEach entry is annotated with its ``industry`` tag.","operationId":"get_api_v1_models","parameters":[{"name":"industry","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by industry: freight / pcb / insurance / general","title":"Industry"},"description":"Filter by industry: freight / pcb / insurance / general"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/models/industries":{"get":{"tags":["domain-models"],"summary":"List Industries","description":"Industry coverage summary — the catalog grouped by vertical.\nLists the doc types covered per industry plus counts.","operationId":"get_api_v1_models_industries","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/models/{doc_type}":{"get":{"tags":["domain-models"],"summary":"Get Model","operationId":"get_api_v1_models_doc_type","parameters":[{"name":"doc_type","in":"path","required":true,"schema":{"type":"string","title":"Doc Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/demo/seed":{"post":{"tags":["documents"],"summary":"Demo Seed","description":"P2-5: one-click first-run demo — create sample documents from the\nbuilt-in sanitized eval datasets so a new tenant sees the pipeline in\naction. Demo rows are honestly labelled (metadata.demo=true).","operationId":"post_api_v1_documents_demo_seed","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/documents/demo/compare-engines":{"post":{"tags":["documents"],"summary":"Compare Engines","description":"E2 · free-vs-paid effect comparison: the SAME document through the\noffline heuristic extractor vs the tenant's LLM. When no LLM is configured,\nthe LLM leg honestly returns ``not_configured`` — the pricing/onboarding\npage shows the gap instead of faking a model result.","operationId":"post_api_v1_documents_demo_compare_engines","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompareEnginesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/documents/precheck":{"post":{"tags":["documents"],"summary":"Precheck Upload","description":"C3 · upload pre-flight check: size/type/PDF parseability/encryption/\nscanned-detection with readable errors + remediation hints, BEFORE the file\nenters the processing queue (and long before it can fail mid-processing).","operationId":"post_api_v1_documents_precheck","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_precheck_upload_api_v1_documents_precheck_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/documents/upload":{"post":{"tags":["documents"],"summary":"Upload Document","operationId":"post_api_v1_documents_upload","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Workflow Id"}},{"name":"flow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Flow Id"}},{"name":"auto_flow","in":"query","required":false,"schema":{"type":"boolean","description":"未显式选择流程时是否按类型自动匹配; 上传页用户指定模式传 false","default":true,"title":"Auto Flow"},"description":"未显式选择流程时是否按类型自动匹配; 上传页用户指定模式传 false"},{"name":"document_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用户指定的单证类型 (上传页必选); 提供时跳过自动分类, 按该类型的字段配置抽取","title":"Document Type"},"description":"用户指定的单证类型 (上传页必选); 提供时跳过自动分类, 按该类型的字段配置抽取"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_document_api_v1_documents_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/batch-upload":{"post":{"tags":["documents"],"summary":"Batch Upload","operationId":"post_api_v1_documents_batch_upload","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Workflow Id"}},{"name":"flow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Flow Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_batch_upload_api_v1_documents_batch_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DocumentUploadResponse"},"title":"Response Batch Upload Api V1 Documents Batch Upload Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/bulk-ingest":{"post":{"tags":["documents"],"summary":"Bulk Ingest","description":"#66: job-level bulk upload with per-item status + progress. Saves every\nfile as a Document, queues each for extraction, and returns a job handle to\npoll via ``GET /documents/bulk-ingest/{job_id}``. One bad file is recorded\nas a failed item; the rest of the batch still proceeds. Larger cap than\nbatch-upload (up to 200).","operationId":"post_api_v1_documents_bulk_ingest","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Workflow Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_bulk_ingest_api_v1_documents_bulk_ingest_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["documents"],"summary":"List Bulk Ingest Jobs","operationId":"get_api_v1_documents_bulk_ingest","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/bulk-ingest/{job_id}":{"get":{"tags":["documents"],"summary":"Get Bulk Ingest Job","description":"Live progress for a bulk-ingest job: per-item status + completed/total\nroll-up. Item status mirrors each linked Document's processing status.","operationId":"get_api_v1_documents_bulk_ingest_job_id","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/bulk-ingest/{job_id}/retry":{"post":{"tags":["documents"],"summary":"Retry Bulk Ingest Failed","description":"Re-queue only the ``failed`` items of a bulk-ingest job that still have a\nlinked document (定向重试). Upload-failed items are skipped; done items are\nuntouched. (P5-5)","operationId":"post_api_v1_documents_bulk_ingest_job_id_retry","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents":{"get":{"tags":["documents"],"summary":"List Documents","operationId":"get_api_v1_documents","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Workflow Id"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"field","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Field"}},{"name":"value","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/stats":{"get":{"tags":["documents"],"summary":"Get Document Stats","operationId":"get_api_v1_documents_stats","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/documents/processing":{"get":{"tags":["documents"],"summary":"Get Processing Status","operationId":"get_api_v1_documents_processing","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/documents/engines":{"get":{"tags":["documents"],"summary":"List Engines","description":"Available OCR/extraction engines + the global default. 对标可配置选择\n百度开源 OCR (paddleocr) 或 大模型 (vlm). Phase 16: 每个引擎带真实\n``available`` 探测结果 (CLI 存在/依赖可导入/配置齐备), 前端据此把未安装\n引擎标灰, 避免\"选了 mineru 却全链 empty\"的不透明失败 (doc45 教训)。","operationId":"get_api_v1_documents_engines","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/documents/{doc_id}/engine-recommendation":{"get":{"tags":["documents"],"summary":"Engine Recommendation","description":"P7: difficulty-aware engine recommendation for a document. Scores cheap\nsignals (page count, scan vs native text, tables, doc-type family) and\nrecommends the cheapest engine that still handles it (paddleocr →\npaddleocr-vl → vlm). Surfaces relative cost/latency per engine so operators\ncan compare. A per-doc ``metadata_[\"ocr_engine\"]`` override always wins\nover this hint; auto-routing only engages when ``OCR_ENGINE_AUTO`` is on.","operationId":"get_api_v1_documents_doc_id_engine_recommendation","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/status":{"get":{"tags":["documents"],"summary":"Get Doc Processing Status","operationId":"get_api_v1_documents_doc_id_status","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/timeline":{"get":{"tags":["documents"],"summary":"Get Document Timeline","description":"全链路时间线 (P2-16)：ProcessingTask + LLMUsage + AuditLog 按时序拼装，\n排障不用翻三张表。created 锚点必在，混排输出整体按时间非降序。","operationId":"get_api_v1_documents_doc_id_timeline","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}":{"get":{"tags":["documents"],"summary":"Get Document","operationId":"get_api_v1_documents_doc_id","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["documents"],"summary":"Delete Document","operationId":"delete_api_v1_documents_doc_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/process-log":{"get":{"tags":["documents"],"summary":"Document Process Log","description":"处理过程日志 (易用性 2026-09): 把一次识别的全过程聚合为前端时间线。\n\n覆盖: 上传 → OCR (引擎/文本/置信度/跳页) → 分类 → LLM 提取 (配置/模型/\n输入输出摘要/字段) → 校验 → 复核 → 错误。全部来自既有落库数据\n(documents.metadata_ / processing_tasks / extractions / validations /\nreviews), 无需新写入。","operationId":"get_api_v1_documents_doc_id_process_log","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/download":{"get":{"tags":["documents"],"summary":"Download Document","operationId":"get_api_v1_documents_doc_id_download","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/preview":{"get":{"tags":["documents"],"summary":"Preview Document Page","operationId":"get_api_v1_documents_doc_id_preview","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"dpi","in":"query","required":false,"schema":{"type":"integer","maximum":300,"minimum":72,"default":150,"title":"Dpi"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/locate":{"get":{"tags":["documents"],"summary":"Locate Field In Preview","description":"点击左侧字段行 → 右侧预览红框定位。\n\n两级定位 (诚实降级):\n  1. OCR 锚定 — 抽取行的 source_bbox (视觉/OCR 管线写出), 返回原始坐标系\n     + 存储 dpi, 前端按比例缩放;\n  2. PDF 文本层兜底 — Word (.doc/.docx, 转出的 PDF) / 文本型 PDF 没有 OCR\n     坐标, 直接在 PDF 文字层搜索字段值, 返回「页面百分比」坐标 (缩放无关)。\n图片类纯扫描件无文字层且无锚定时诚实返回 found=False。","operationId":"get_api_v1_documents_doc_id_locate","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"field","in":"query","required":true,"schema":{"type":"string","title":"Field"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/extractions":{"get":{"tags":["documents"],"summary":"Get Extractions","operationId":"get_api_v1_documents_doc_id_extractions","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"with_provenance","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"With Provenance"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/extractions/import":{"post":{"tags":["documents"],"summary":"Import Extractions","operationId":"post_api_v1_documents_doc_id_extractions_import","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionsImportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/extractions/export":{"get":{"tags":["documents"],"summary":"Export Extractions","operationId":"get_api_v1_documents_doc_id_extractions_export","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","default":"json","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/tables":{"get":{"tags":["documents"],"summary":"Document Tables","description":"Structured table extraction (表格还原): {headers, rows, cells}.","operationId":"get_api_v1_documents_doc_id_tables","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/regions":{"get":{"tags":["documents"],"summary":"Document Regions","description":"Page-region bboxes for visualization overlay (版面/表格/印章/公式/字段).\n\nReturns bboxes in the requested ``dpi`` coordinate system (OCR stores at\nOCR_DPI by default; the preview renders at this dpi). The frontend scales\nby displayDpi/dpi to align with the rendered <img>. 单页画布语义: 只返回\n请求页的区域 — ``scope`` 参数保留兼容但不再影响过滤 (曾用于区分\npage/all, all 模式把别页的框画到当前页画布上, 是定位串页 bug 的一部分)。","operationId":"get_api_v1_documents_doc_id_regions","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Page"}},{"name":"scope","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Scope"}},{"name":"dpi","in":"query","required":false,"schema":{"type":"integer","maximum":400,"minimum":72,"default":200,"title":"Dpi"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/quality":{"get":{"tags":["documents"],"summary":"Document Quality","description":"Document image quality assessment (图像质量检测).\n\nScores blur / skew / brightness / resolution → 0–100 + issue list + suggestions.\nComputed live from the first page (cached copy in metadata['quality'] if present).","operationId":"get_api_v1_documents_doc_id_quality","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/authenticity":{"get":{"tags":["documents"],"summary":"Document Authenticity","description":"Image authenticity detection (图片真实性检测, P-1100).\n\n元数据取证判定 PS 编辑 / AI 生成痕迹 → verdict + 提示 + 证据清单。\nComputed live from the first page (cached copy in metadata['authenticity'] if present).","operationId":"get_api_v1_documents_doc_id_authenticity","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/barcodes":{"get":{"tags":["documents"],"summary":"Document Barcodes","description":"Barcode / QR recognition (通用条码识别).\n\nReturns decoded QR/1D-barcode payloads + bbox from the first page\n(cached copy in metadata['barcodes'] if present).","operationId":"get_api_v1_documents_doc_id_barcodes","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/reconstruct":{"post":{"tags":["documents"],"summary":"Document Reconstruct","description":"Reconstruct the document into a structured tree (文档数字化/重构).\n\nReturns {json, html, markdown} views built from the stored layout regions.","operationId":"post_api_v1_documents_doc_id_reconstruct","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/summary":{"get":{"tags":["documents"],"summary":"Document Summary","description":"TextRank extractive summary + keywords of a document (文档摘要).","operationId":"get_api_v1_documents_doc_id_summary","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"ratio","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.1,"default":0.3,"title":"Ratio"}},{"name":"max_sentences","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":5,"title":"Max Sentences"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/markdown":{"get":{"tags":["documents"],"summary":"Export Markdown","operationId":"get_api_v1_documents_doc_id_markdown","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/export":{"get":{"tags":["documents"],"summary":"Document Export","description":"Convert & download the reconstructed document or tables\n(PDF转Word/转Markdown/转HTML/表格转Excel). Distinct from /download (raw original).\n\nformat=docx|markdown|html → reconstructed doc tree; format=xlsx → all tables.","operationId":"get_api_v1_documents_doc_id_export","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(docx|markdown|html|xlsx)$","default":"docx","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/assign-workflow":{"post":{"tags":["documents"],"summary":"Assign Workflow","operationId":"post_api_v1_documents_doc_id_assign_workflow","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"workflow_id","in":"query","required":true,"schema":{"type":"integer","title":"Workflow Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/reprocess":{"post":{"tags":["documents"],"summary":"Reprocess Document","description":"Reprocess a document. Optional ``engine`` (paddleocr|vlm) overrides the\nOCR/extraction engine for this doc only (persisted on metadata_).","operationId":"post_api_v1_documents_doc_id_reprocess","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"engine","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Engine"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/set-type":{"post":{"tags":["documents"],"summary":"Set Document Type","description":"P34 · 用户更正文档类型: 自动分类判错时, 用户显式指定类型并立即按该\n类型重新抽取。更正写入 metadata_.user_document_type, 重处理时优先于自动\n分类 (绑定 workflow 时仍以 workflow 为准)。传 \"auto\" 清除更正。\n\n类型必须真实存在 (内置领域模型 或 租户/全局字段配置注册的自定义类型),\n拼错的类型 400 而非静默无效。","operationId":"post_api_v1_documents_doc_id_set_type","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetDocumentTypeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/reset-stuck":{"post":{"tags":["documents"],"summary":"Reset Stuck Document","description":"P36 · 一键解锁卡死的文档: PROCESSING → PENDING 并重新入队。\n\n用于服务重启/子进程崩溃遗留的僵尸 PROCESSING (生产 doc117 案例)。\n幂等: 非 PROCESSING 文档返回 409。","operationId":"post_api_v1_documents_doc_id_reset_stuck","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/batch-reprocess":{"post":{"tags":["documents"],"summary":"Batch Reprocess","operationId":"post_api_v1_documents_batch_reprocess","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/documents/batch-delete":{"post":{"tags":["documents"],"summary":"Batch Delete","description":"与单删共用 cleanup_document_children: 批删此前不清理子表, 第一份有\n审计日志的文档就撞 audit_logs 外键 500 (2026-10-08 批删 FAILED 文档实测)。\n单文档异常不拖垮整批 — 逐个 try/except, 失败 id 随响应返回。","operationId":"post_api_v1_documents_batch_delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/documents/compare":{"post":{"tags":["documents"],"summary":"Compare Documents Endpoint","description":"Compare two documents — field-level diff + text similarity (文档比对).","operationId":"post_api_v1_documents_compare","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__v1__documents__CompareRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/find-duplicates":{"post":{"tags":["documents"],"summary":"Find Duplicates Endpoint","description":"Find near-duplicate documents of ``doc_id`` (simhash over text_content).\n\nReturns same-tenant documents whose 64-bit fingerprint differs in\n``<= threshold`` bits, ranked by similarity. (近似重复检测)","operationId":"post_api_v1_documents_doc_id_find_duplicates","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"threshold","in":"query","required":false,"schema":{"type":"integer","maximum":64,"minimum":0,"default":3,"title":"Threshold"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/split-text":{"post":{"tags":["documents"],"summary":"Split Text Endpoint","description":"Split a multi-document blob (raw text) into sub-documents. When\n``create_documents``, each part is also ingested as its own Document.","operationId":"post_api_v1_documents_split_text","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SplitTextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/split":{"post":{"tags":["documents"],"summary":"Split Document Endpoint","description":"Split an already-ingested multi-document document into sub-documents.","operationId":"post_api_v1_documents_doc_id_split","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"strategy","in":"query","required":false,"schema":{"type":"string","default":"auto","title":"Strategy"}},{"name":"delimiter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delimiter"}},{"name":"create_documents","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Create Documents"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{doc_id}/cost":{"get":{"tags":["documents"],"summary":"Document Cost View","description":"LLM cost / token / latency breakdown for a single document.","operationId":"get_api_v1_documents_doc_id_cost","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/authenticity/check":{"post":{"tags":["authenticity"],"summary":"Check Image","description":"检测单张图片的 AI 生成 / PS 编辑痕迹 (产品内, JWT)。\n\n返回 verdict (clean | edited | ai_generated | suspect) + 证据清单 + EXIF\n明细。无状态, 不落库。","operationId":"post_api_v1_authenticity_check","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_check_image_api_v1_authenticity_check_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/authenticity/open/check":{"post":{"tags":["authenticity"],"summary":"Open Check Image","description":"开放 API: 检测单张图片 (X-API-Key, 外部系统对接)。\n\n用法: ``curl -X POST -H \"X-API-Key: adp_...\" -F file=@image.jpg\n/api/v1/authenticity/open/check``。响应结构同 /check。","operationId":"post_api_v1_authenticity_open_check","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_open_check_image_api_v1_authenticity_open_check_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seals/detect":{"post":{"tags":["seals"],"summary":"Detect Image","description":"检测单张图片中的印章与手写签名 (产品内, JWT)。\n\n返回印章清单 (bbox/颜色/圆度/置信度/印文) 与签名提议清单。","operationId":"post_api_v1_seals_detect","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_detect_image_api_v1_seals_detect_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/seals/open/detect":{"post":{"tags":["seals"],"summary":"Open Detect Image","description":"开放 API: 检测印章与签名 (X-API-Key, 外部系统对接)。响应结构同 /detect。","operationId":"post_api_v1_seals_open_detect","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_open_detect_image_api_v1_seals_open_detect_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classify/document":{"post":{"tags":["classify"],"summary":"Classify Document","description":"分类单张图片/PDF (产品内, JWT)。scenario 可选场景预设 (如 auto_insurance_claim)。","operationId":"post_api_v1_classify_document","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_classify_document_api_v1_classify_document_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/classify/and-extract":{"post":{"tags":["classify"],"summary":"Classify And Extract","description":"一步式: 分类 → 按类型 schema 直接抽取字段 (产品内, JWT)。\n\n外部系统少一次往返; 图片单证经 VLM 抽取 (视觉模型), 文本走文本模型。","operationId":"post_api_v1_classify_and_extract","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_classify_and_extract_api_v1_classify_and_extract_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/classify/checklist":{"post":{"tags":["classify"],"summary":"Claim Material Checklist","description":"理赔材料包核对 (车险理赔场景): 批量分类多份材料 → 材料清单矩阵 +\n缺失项提示。供理赔收集 App 一次拍照核验。","operationId":"post_api_v1_classify_checklist","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_claim_material_checklist_api_v1_classify_checklist_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/classify/open":{"post":{"tags":["classify"],"summary":"Open Classify Document","description":"开放 API: 分类图片/PDF (X-API-Key, 外部系统对接)。响应结构同 /document。","operationId":"post_api_v1_classify_open","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_open_classify_document_api_v1_classify_open_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bom/extract":{"post":{"tags":["bom"],"summary":"Extract Bom","description":"提取 BOM Excel → 标准字段行项 list (产品内, JWT)。","operationId":"post_api_v1_bom_extract","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_extract_bom_api_v1_bom_extract_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/bom/open/extract":{"post":{"tags":["bom"],"summary":"Open Extract Bom","description":"开放 API: BOM Excel → 标准字段行项 list (X-API-Key, ERP 对接)。","operationId":"post_api_v1_bom_open_extract","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_open_extract_bom_api_v1_bom_open_extract_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows":{"post":{"tags":["workflows"],"summary":"Create Workflow","operationId":"post_api_v1_workflows","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["workflows"],"summary":"List Workflows","operationId":"get_api_v1_workflows","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowDetail"},"title":"Response List Workflows Api V1 Workflows Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/{wf_id}":{"get":{"tags":["workflows"],"summary":"Get Workflow","operationId":"get_api_v1_workflows_wf_id","parameters":[{"name":"wf_id","in":"path","required":true,"schema":{"type":"integer","title":"Wf Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["workflows"],"summary":"Update Workflow","operationId":"put_api_v1_workflows_wf_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"wf_id","in":"path","required":true,"schema":{"type":"integer","title":"Wf Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["workflows"],"summary":"Delete Workflow","operationId":"delete_api_v1_workflows_wf_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"wf_id","in":"path","required":true,"schema":{"type":"integer","title":"Wf Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/{wf_id}/activate":{"post":{"tags":["workflows"],"summary":"Activate Workflow","operationId":"post_api_v1_workflows_wf_id_activate","security":[{"HTTPBearer":[]}],"parameters":[{"name":"wf_id","in":"path","required":true,"schema":{"type":"integer","title":"Wf Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/{wf_id}/pause":{"post":{"tags":["workflows"],"summary":"Pause Workflow","operationId":"post_api_v1_workflows_wf_id_pause","security":[{"HTTPBearer":[]}],"parameters":[{"name":"wf_id","in":"path","required":true,"schema":{"type":"integer","title":"Wf Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/{wf_id}/documents":{"get":{"tags":["workflows"],"summary":"Get Workflow Documents","operationId":"get_api_v1_workflows_wf_id_documents","parameters":[{"name":"wf_id","in":"path","required":true,"schema":{"type":"integer","title":"Wf Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DocumentDetail"},"title":"Response Get Workflow Documents Api V1 Workflows  Wf Id  Documents Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/extraction-configs/document-types":{"get":{"tags":["extraction-configs"],"summary":"List Document Types","description":"Available document types: built-in DOMAIN_MODELS + custom types defined\nvia ExtractionConfig (P1-9 低代码自定义单据类型). Custom entries carry\n``source=custom`` and their configured field count.","operationId":"get_api_v1_extraction_configs_document_types","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/extraction-configs/domain-schema/{doc_type}":{"get":{"tags":["extraction-configs"],"summary":"Get Domain Schema Fields","description":"Built-in field list for a document type, with prompts left blank.\n\nUsed by the config page's \"从默认模板填充\" button to pre-fill the form\nWITHOUT persisting (unlike /seed, which creates a row).","operationId":"get_api_v1_extraction_configs_domain_schema_doc_type","parameters":[{"name":"doc_type","in":"path","required":true,"schema":{"type":"string","title":"Doc Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/extraction-configs/seed":{"post":{"tags":["extraction-configs"],"summary":"Seed From Domain","description":"Create a new config pre-filled with the built-in fields for a document\ntype (prompts left blank for the user to fill in). Body: {document_type, name?}.","operationId":"post_api_v1_extraction_configs_seed","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionConfigDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/extraction-configs":{"get":{"tags":["extraction-configs"],"summary":"List Configs","operationId":"get_api_v1_extraction_configs","parameters":[{"name":"document_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExtractionConfigDetail"},"title":"Response List Configs Api V1 Extraction Configs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["extraction-configs"],"summary":"Create Config","operationId":"post_api_v1_extraction_configs","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionConfigCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionConfigDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/extraction-configs/auto-generate":{"post":{"tags":["extraction-configs"],"summary":"Auto Generate Config","description":"上传样张(或指定已上传文档) → LLM 通读 → 生成单证类型名 + 字段配置建议。\n\n只生成建议、不落库；用户在字段配置表单确认/修改后走 POST /extraction-configs\n保存。二选一: 传 file(图片/扫描 PDF/TXT) 或 document_id(复用该文档已抽取的\n文本, 零 OCR 成本)。","operationId":"post_api_v1_extraction_configs_auto_generate","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_auto_generate_config_api_v1_extraction_configs_auto_generate_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/extraction-configs/nl-rules":{"post":{"tags":["extraction-configs"],"summary":"Nl Rules Parse","description":"P38 复用 · 自然语言 → 字段比较 DSL 候选 (文档类型级, 只解析不落库)。\n\n字段清单取该类型默认字段配置 (回落内置领域模型); LLM 解析 + 受控校验后\n返回 DSL 字符串候选, 前端确认后随 PUT 保存, 与手工规则同通道执行。","operationId":"post_api_v1_extraction_configs_nl_rules","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/extraction-configs/{cfg_id}":{"get":{"tags":["extraction-configs"],"summary":"Get Config","operationId":"get_api_v1_extraction_configs_cfg_id","parameters":[{"name":"cfg_id","in":"path","required":true,"schema":{"type":"integer","title":"Cfg Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionConfigDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["extraction-configs"],"summary":"Update Config","operationId":"put_api_v1_extraction_configs_cfg_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cfg_id","in":"path","required":true,"schema":{"type":"integer","title":"Cfg Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionConfigCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionConfigDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["extraction-configs"],"summary":"Delete Config","operationId":"delete_api_v1_extraction_configs_cfg_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cfg_id","in":"path","required":true,"schema":{"type":"integer","title":"Cfg Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/extraction-configs/{cfg_id}/set-default":{"post":{"tags":["extraction-configs"],"summary":"Set Default","description":"Mark this config as THE default for its (tenant, document_type).","operationId":"post_api_v1_extraction_configs_cfg_id_set_default","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cfg_id","in":"path","required":true,"schema":{"type":"integer","title":"Cfg Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionConfigDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/extraction-configs/{cfg_id}/regression-check":{"post":{"tags":["extraction-configs"],"summary":"Regression Check","description":"P1-5 配置回归检查 (v1 · 覆盖率版, 零 token): 对该单证类型最近 N 份\n已抽取文档, 比对「配置字段 vs 实际提取结果」—— 每份文档缺失了哪些配置\n字段、每个字段的填充率。改配置前先看现状, 避免改完才知道伤了这个类型\n的抽取。真正的重抽 diff 需要 LLM 成本, 后续以评测集方式提供。","operationId":"post_api_v1_extraction_configs_cfg_id_regression_check","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cfg_id","in":"path","required":true,"schema":{"type":"integer","title":"Cfg Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/extraction-configs/import-wide":{"post":{"tags":["extraction-configs"],"summary":"Import Wide Definition","description":"P0-3 Excel 导入宽表定义: 《表结构+字段说明》工作簿 → 单证类型配置。\n\n解析规则 (列序/别名/派生公式/导出格式) 与种子脚本共用同一实现\n(services.wide_table_def.load_fields_from_workbook); 同 document_type+name\n幂等覆盖。product_col: 字段说明 sheet 的 1-based 产品列 (3=买方信托计划)。","operationId":"post_api_v1_extraction_configs_import_wide","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_import_wide_definition_api_v1_extraction_configs_import_wide_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/entity-registry":{"get":{"tags":["entity-registry"],"summary":"List Entities","operationId":"get_api_v1_entity_registry","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["entity-registry"],"summary":"Upsert Entity","description":"手工登记/补齐机构 (按归一化名称 upsert: 只补空白, 不覆盖已有值)。","operationId":"post_api_v1_entity_registry","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityUpsert"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/track":{"post":{"tags":["analytics"],"summary":"Track","description":"匿名访问打点 (公开)。限流+校验+IP哈希; 任何失败不影响访客页面。","operationId":"post_api_v1_analytics_track","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/visits":{"get":{"tags":["analytics"],"summary":"Visits Summary","description":"PV/UV 日趋势 (UV = 去重 session)。","operationId":"get_api_v1_analytics_visits","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","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"}}}}}}},"/api/v1/analytics/sources":{"get":{"tags":["analytics"],"summary":"Visits Sources","description":"渠道分布: UTM source 优先, 无 UTM 按来源域 (referrer host), 都没有 = direct。","operationId":"get_api_v1_analytics_sources","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","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"}}}}}}},"/api/v1/analytics/funnel":{"get":{"tags":["analytics"],"summary":"Conversion Funnel","description":"转化漏斗: 访问 → 注册 → 首次上传 → 首次提取成功 → 付费。\n\nvisits = 去重 session; 其余按 growth_events 在窗口内的去重租户数。","operationId":"get_api_v1_analytics_funnel","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","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"}}}}}}},"/api/v1/analytics/funnel-weekly":{"get":{"tags":["analytics"],"summary":"Funnel Weekly Preview","description":"漏斗周报即时预览 (admin) — 与调度推周报同一聚合, 不重复推送。","operationId":"get_api_v1_analytics_funnel_weekly","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/analytics/export":{"get":{"tags":["analytics"],"summary":"Export Csv","description":"报表 CSV 导出 (日趋势 + 渠道), 供投放复盘/汇报。","operationId":"get_api_v1_analytics_export","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","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"}}}}}}},"/api/v1/analytics/prune":{"delete":{"tags":["analytics"],"summary":"Prune Old Visits","description":"访问明细保留清理 (隐私最小化): 删除 N 天前的 visit_events。","operationId":"delete_api_v1_analytics_prune","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":180,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/try":{"post":{"tags":["public-try"],"summary":"Try Extract","description":"公开试用抽取 (无鉴权)。任何失败对访客都是可读中文, 不暴露内部细节。","operationId":"post_api_v1_public_try","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_try_extract_api_v1_public_try_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reviews/session":{"get":{"tags":["review-sessions"],"summary":"Next Batch","operationId":"get_api_v1_reviews_session","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"threshold","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Threshold"}},{"name":"doc_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reviews/session/resolve":{"post":{"tags":["review-sessions"],"summary":"Resolve","operationId":"post_api_v1_reviews_session_resolve","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/reviews/pending":{"get":{"tags":["reviews"],"summary":"Get Pending Reviews","operationId":"get_api_v1_reviews_pending","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/reviews/low-confidence":{"get":{"tags":["reviews"],"summary":"Get Low Confidence Fields","description":"Smart review queue: every extracted field below the\nconfidence threshold, grouped by document, so reviewers focus on what the\nmodel is least sure about rather than re-checking every field.","operationId":"get_api_v1_reviews_low_confidence","parameters":[{"name":"threshold","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"default":0.8,"title":"Threshold"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reviews/{doc_id}":{"post":{"tags":["reviews"],"summary":"Create Review","operationId":"post_api_v1_reviews_doc_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["reviews"],"summary":"Get Document Reviews","operationId":"get_api_v1_reviews_doc_id","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReviewDetail"},"title":"Response Get Document Reviews Api V1 Reviews  Doc Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reviews/load":{"get":{"tags":["reviews"],"summary":"Review Load","description":"Per-reviewer open-assignment vs capacity report.\n\nMust stay declared BEFORE ``GET /{doc_id}`` — otherwise FastAPI matches\n``/load`` as ``doc_id=\"load\"`` and 422s (route shadowing).","operationId":"get_api_v1_reviews_load","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/reviews/dispatch/{doc_id}":{"post":{"tags":["reviews"],"summary":"Dispatch Review","description":"Skill-aware least-loaded dispatch: lock the doc for the best reviewer.","operationId":"post_api_v1_reviews_dispatch_doc_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reviews/lock/{doc_id}":{"post":{"tags":["reviews"],"summary":"Acquire Review Lock","description":"Take (or extend) the caller's lock on a doc; refuses if another holds it.","operationId":"post_api_v1_reviews_lock_doc_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"ttl_minutes","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Ttl Minutes"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["reviews"],"summary":"Release Review Lock","operationId":"delete_api_v1_reviews_lock_doc_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/stats":{"get":{"tags":["dashboard"],"summary":"Get Dashboard Stats","operationId":"get_api_v1_dashboard_stats","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardStats"}}}}}}},"/api/v1/dashboard/activation":{"get":{"tags":["dashboard"],"summary":"Get Activation State","description":"激活向导四步的真实完成状态 —— 从租户数据推导, 替代手动打卡。\n\n此前向导进度存 localStorage 且由用户手动勾选, 大多数用户不会回来打勾,\n向导会永远挂着变成噪音。四步的客观判据:\n  schema = 本租户自建了默认提取配置 (平台全局种子配置不算 —— 那是\n           \"开箱能用\", 不是\"完成配置\");\n  flow   = 有启用中 (ACTIVE) 的编排流程;\n  upload = 租户内有任何文档;\n  review = 有抽取完成/已通过的文档 (复核动线的客观结果)。","operationId":"get_api_v1_dashboard_activation","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/dashboard/recent":{"get":{"tags":["dashboard"],"summary":"Get Recent Activity","operationId":"get_api_v1_dashboard_recent","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/dashboard/trend":{"get":{"tags":["dashboard"],"summary":"Get Processing Trend","operationId":"get_api_v1_dashboard_trend","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":7,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/status-distribution":{"get":{"tags":["dashboard"],"summary":"Get Status Distribution","operationId":"get_api_v1_dashboard_status_distribution","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/dashboard/quality":{"get":{"tags":["dashboard"],"summary":"Get Extraction Quality","description":"P4: extraction-quality overview — confidence distribution, auto-approve\nrate, top corrected fields, per-document-type breakdown. Tenant-scoped so\neach tenant sees only its own extraction quality.","operationId":"get_api_v1_dashboard_quality","parameters":[{"name":"threshold","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"default":0.85,"title":"Threshold"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/process":{"get":{"tags":["dashboard"],"summary":"Get Process Overview","description":"D1: process analytics — cycle time, throughput, automation rate, cost per\ndoc, ROI. Tenant-scoped.","operationId":"get_api_v1_dashboard_process","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":7,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/drift":{"get":{"tags":["dashboard"],"summary":"Get Drift Overview","description":"D2: model drift overview — per-doc-type confidence drop + correction\nspike. Emits a model.drift event when drift is detected.","operationId":"get_api_v1_dashboard_drift","parameters":[{"name":"window_days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":7,"title":"Window Days"}},{"name":"baseline_days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Baseline Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/engine-stats":{"get":{"tags":["dashboard"],"summary":"Get Engine Stats","description":"P3-5: per-OCR-engine usage & quality (count / avg confidence / review\nrate) — data-driven routing decisions.","operationId":"get_api_v1_dashboard_engine_stats","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/dashboard/action-items":{"get":{"tags":["dashboard"],"summary":"Get Action Items","description":"P2-8: turn quality/drift/engine signals into a ranked to-do list.\n\nComposes drift (retrain), per-type correction rate (threshold), OCR engine\nfallback health + routing (engine switch), rescan flags, and most-corrected\nfields (prompt review) into one deduplicated, severity-ranked action list.\nEach item carries the evidence behind the recommendation.","operationId":"get_api_v1_dashboard_action_items","parameters":[{"name":"window_days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":7,"title":"Window Days"}},{"name":"baseline_days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Baseline Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/actions/execute":{"post":{"tags":["dashboard"],"summary":"Execute Action","description":"B1 · one-click execution of a recommended action. Each category has a\nreal, auditable effect (retrain job / threshold config / engine policy /\nrescan re-queue / prompt-review task); unsupported → honest\n``not_configured``. The execution itself is logged to the audit trail.","operationId":"post_api_v1_dashboard_actions_execute","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/dashboard/routing-effectiveness":{"get":{"tags":["dashboard"],"summary":"Get Routing Effectiveness","description":"P2-9: routing-effectiveness — OCR engine success-vs-fail (aggregated from\nthe fallback attempt log) + fallback rate, and per-LLM-route/variant request,\nerror, latency, cost with A/B winners. Shows whether routing decisions are\nactually working.","operationId":"get_api_v1_dashboard_routing_effectiveness","parameters":[{"name":"window_days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Window Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/sla-breaches":{"get":{"tags":["dashboard"],"summary":"Get Sla Breaches","description":"SLA breach rate + breached-task report for the ops dashboard.","operationId":"get_api_v1_dashboard_sla_breaches","parameters":[{"name":"window_days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Window Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/cost-leaders":{"get":{"tags":["dashboard"],"summary":"Get Cost Leaders","description":"Costliest documents in the tenant (成本透视).","operationId":"get_api_v1_dashboard_cost_leaders","parameters":[{"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"}}}}}}},"/api/v1/dashboard/cost-matrix":{"get":{"tags":["dashboard"],"summary":"Get Cost Matrix","description":"P1-5: 客户×类型成本矩阵 — LLMUsage 按 (租户 × 单据类型) 聚合成本 /\n文档数 / 复核率 / 平均置信度,叠套餐价语境与免费标注数。admin 跨租户,\n普通租户只见自己(tenant_scope 强制);``days`` 缺省为全量。","operationId":"get_api_v1_dashboard_cost_matrix","parameters":[{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":365,"minimum":1},{"type":"null"}],"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/route-recommendations":{"get":{"tags":["dashboard"],"summary":"Get Route Recommendations","description":"T7: route_budget 数据驱动调优推荐 — 把 Phase 13 的手工调参升级为\n按历史成本矩阵(复核率/置信度/样本量)给出的确定性建议。\n\n聚合口径:cost_matrix 是 (租户 × doc_type) 二维,这里把同一 doc_type\n跨租户合并成一行 —— docs/total_cost 直接求和;review_rate 用\nΣreviewed_docs / Σdocs(精确池化,等价于按 docs 加权);avg_confidence\n按 docs 加权平均(cells 未暴露逐文档置信度计数,无置信度值的 cell 不进\n分子分母 —— 近似口径,已在注释声明)。未关联单据的调用桶无 doc_type\n可配预算,不进推荐。current_budget 读类型级 extraction config\n(current_route_budgets;读不到记 None = 引擎默认 balanced)。\n鉴权对齐 cost-matrix:无显式依赖,tenant_scope 按请求方租户收敛。","operationId":"get_api_v1_dashboard_route_recommendations","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"}}}}}}},"/api/v1/dashboard/quality-overview":{"get":{"tags":["dashboard"],"summary":"Quality Overview","description":"P1-6 质量洞察: 审核劳动的回流聚合 — 哪些类型被频繁人工更正 (自动分类\n不可信)、哪些字段被频繁 override (提取提示词该优化)。给配置迭代指方向,\n而不是让纠错默默沉没。窗口默认 30 天, 扫描量上限 2000 份文档。","operationId":"get_api_v1_dashboard_quality_overview","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","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"}}}}}}},"/api/v1/audit/logs":{"get":{"tags":["audit"],"summary":"Get Audit Logs","operationId":"get_api_v1_audit_logs","security":[{"HTTPBearer":[]}],"parameters":[{"name":"document_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}},{"name":"actor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/audit/document/{doc_id}":{"get":{"tags":["audit"],"summary":"Get Document Audit","operationId":"get_api_v1_audit_document_doc_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/audit/verify":{"get":{"tags":["audit"],"summary":"Verify Audit Chain","description":"Verify the tamper-evident audit chain for the caller's tenant (admins:\nall tenants). Returns any breaks — a clean chain is the compliance evidence\nthat no audit row was inserted, deleted, or edited.","operationId":"get_api_v1_audit_verify","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/audit/export":{"get":{"tags":["audit"],"summary":"Export Audit","description":"Export the caller's audit trail as JSON or CSV (compliance / e-discovery).","operationId":"get_api_v1_audit_export","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fmt","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","default":"json","title":"Fmt"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/audit/prune":{"post":{"tags":["audit"],"summary":"Prune Audit","description":"Drop audit rows older than ``retention_days`` (admin only). The chain is\nre-anchored so the surviving rows stay verifiable.","operationId":"post_api_v1_audit_prune","security":[{"HTTPBearer":[]}],"parameters":[{"name":"retention_days","in":"query","required":true,"schema":{"type":"integer","minimum":1,"title":"Retention Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/validation/documents/{doc_id}":{"get":{"tags":["validation"],"summary":"Get Document Validations","description":"All stored post-check results for a document.","operationId":"get_api_v1_validation_documents_doc_id","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/validation/documents/{doc_id}/run":{"post":{"tags":["validation"],"summary":"Run Checks","description":"Re-run all post-extraction checks (校验/验真/分类/印章) on demand.","operationId":"post_api_v1_validation_documents_doc_id_run","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/validation/invoices/{doc_id}/verify":{"post":{"tags":["validation"],"summary":"Verify Invoice Endpoint","description":"Invoice document verification report (format / 金额勾稽 / 税率 / 税号).","operationId":"post_api_v1_validation_invoices_doc_id_verify","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/validation/verify-auth":{"post":{"tags":["validation"],"summary":"Verify Auth Endpoint","description":"统一票据验真 (发票/医疗票)。默认离线防伪+勾稽核验;\n``VERIFY_PROVIDER`` 配置国税/医保适配器后走联网查验(需授权)。","operationId":"post_api_v1_validation_verify_auth","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyAuthRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/validation/medical/{doc_id}/verify":{"post":{"tags":["validation"],"summary":"Verify Medical Endpoint","description":"医疗收费票据验真 (防伪要素 + 医保分账勾稽 + 可选医保联网核验)。","operationId":"post_api_v1_validation_medical_doc_id_verify","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/validation/completeness/{doc_id}":{"post":{"tags":["validation"],"summary":"Completeness Endpoint","description":"文档完整性判定 (保险业务规则): 保单是否盖章生效 / 理赔单是否签字。\n印章置信度校准到 high/medium/low 三档; 训练模型可通过 SealModelAdapter 注入,\n未注入走 OpenCV 启发式。","operationId":"post_api_v1_validation_completeness_doc_id","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/validation/invoices/duplicates":{"get":{"tags":["validation"],"summary":"List Duplicates","description":"发票查重: scan documents for duplicate invoices.","operationId":"get_api_v1_validation_invoices_duplicates","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/validation/summary":{"get":{"tags":["validation"],"summary":"Validation Summary","description":"Roll-up of validation outcomes across all documents (dashboard feed).","operationId":"get_api_v1_validation_summary","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/export/extractions":{"post":{"tags":["export"],"summary":"Batch Export","description":"Aggregate extractions for many documents into one file (xlsx/csv/json).","operationId":"post_api_v1_export_extractions","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchExportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/export/erp-vouchers":{"post":{"tags":["export"],"summary":"Export Erp Vouchers","description":"P1-8 · ERP 凭证引入 Excel (金蝶 K3 / 用友 U8): 把抽取的发票字段生成\n目标 ERP 凭证引入工具可读的批量凭证模板 (借贷三行式)。结构化交付最后一\n公里 — 无 API 集成也能把识别结果导入财务系统。","operationId":"post_api_v1_export_erp_vouchers","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErpVoucherExportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent/extract/{doc_id}":{"post":{"tags":["agent"],"summary":"Agent Extract","description":"Run the multi-step document agent and return its reasoning trace.","operationId":"post_api_v1_agent_extract_doc_id","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent/extract-tools/{doc_id}":{"post":{"tags":["agent"],"summary":"Agent Extract Tools","description":"Run the agent as an explicit multi-turn tool-calling loop and return the\ntool-call trajectory (each step: tool, args, observation). Pass\n``use_llm=true`` to drive tool selection with the configured LLM\n(deterministic policy otherwise).","operationId":"post_api_v1_agent_extract_tools_doc_id","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"use_llm","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Use Llm"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent/runs/{doc_id}":{"get":{"tags":["agent"],"summary":"Agent Runs","description":"Latest agent reasoning trace for a document (if any).","operationId":"get_api_v1_agent_runs_doc_id","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent/documents/{doc_id}/qa":{"post":{"tags":["agent"],"summary":"Document Qa","description":"Ask a question about a document; get a grounded, cited answer.","operationId":"post_api_v1_agent_documents_doc_id_qa","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QARequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent/qa":{"post":{"tags":["agent"],"summary":"Global Qa","description":"Cross-document question answering (knowledge-base / RAG): retrieve\nrelevant chunks across all documents and answer with citations.","operationId":"post_api_v1_agent_qa","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalQARequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent/extract-schema":{"post":{"tags":["agent"],"summary":"Extract Schema","description":"Zero-shot extraction against an arbitrary user-supplied schema.\nPass document_id OR raw text + a field list.","operationId":"post_api_v1_agent_extract_schema","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZeroShotRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent/batch-extract":{"post":{"tags":["agent"],"summary":"Batch Extract Endpoint","description":"Run the agent across many documents.","operationId":"post_api_v1_agent_batch_extract","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent/documents/{doc_id}/suggest-workflow":{"post":{"tags":["agent"],"summary":"Suggest Workflow Endpoint","description":"Classify a document and suggest (optionally auto-assign) the matching\ndomain workflow.","operationId":"post_api_v1_agent_documents_doc_id_suggest_workflow","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuggestRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent/batch-ingest":{"post":{"tags":["agent"],"summary":"Batch Ingest Endpoint","description":"End-to-end batch orchestration: split a multi-document\nblob, then per part classify → route to best template → extract → validate.","operationId":"post_api_v1_agent_batch_ingest","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchIngestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent/translate":{"post":{"tags":["agent"],"summary":"Translate Endpoint","description":"Translate extraction results to zh/en.\n\nAccepts either a ``document_id`` (translate that doc's stored extractions)\nor an inline ``fields`` list. Uses the LLM when an API key is configured,\notherwise degrades to a deterministic placeholder (tagged) translation so\nthe endpoint is always 200 and offline-testable.","operationId":"post_api_v1_agent_translate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/templates":{"post":{"tags":["templates"],"summary":"Create Template","description":"Learn a template from a labeled sample (document_id or raw text) and\npersist it. Template ``name`` must be unique.","operationId":"post_api_v1_templates","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTemplateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["templates"],"summary":"List Templates","description":"List all learned templates, optionally filtered by document type.","operationId":"get_api_v1_templates","parameters":[{"name":"document_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/templates/multi":{"post":{"tags":["templates"],"summary":"Create Template Multi","description":"Learn a template from several sample documents at once (多样本自学习).\nProvide sample_texts and/or document_ids — all share one field schema.","operationId":"post_api_v1_templates_multi","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMultiTemplateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/templates/feedback-queue":{"get":{"tags":["templates"],"summary":"Feedback Queue","description":"Active-learning review queue: low-confidence template-extracted fields,\neach annotated with the learned template it should teach.","operationId":"get_api_v1_templates_feedback_queue","parameters":[{"name":"threshold","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"default":0.7,"title":"Threshold"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/templates/marketplace":{"get":{"tags":["templates"],"summary":"Marketplace","description":"Browse the public template marketplace. Returns all\ntemplates published with ``is_public=true``; optional category / type /\nfree-text filters. Read access is open to any authenticated caller — public\ntemplates are meant to be discoverable across tenants.","operationId":"get_api_v1_templates_marketplace","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"document_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Type"}},{"name":"query","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/templates/import":{"post":{"tags":["templates"],"summary":"Import Template","description":"Import a portable ``adp.template`` package (from ``/export``) into the\ncaller's tenant as a private template. Avoids name collisions by suffixing\nthe imported name.","operationId":"post_api_v1_templates_import","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/templates/{template_id}":{"get":{"tags":["templates"],"summary":"Get Template","operationId":"get_api_v1_templates_template_id","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["templates"],"summary":"Delete Template","operationId":"delete_api_v1_templates_template_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/templates/{template_id}/apply":{"post":{"tags":["templates"],"summary":"Apply Template","description":"Apply a learned template to raw text or a document. When ``persist`` and\na document_id is given, store the matched fields as extractions.","operationId":"post_api_v1_templates_template_id_apply","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/templates/{template_id}/bootstrap":{"post":{"tags":["templates"],"summary":"Bootstrap Template","description":"One-click: learn a *working* private template from a builtin/shared\ntemplate's field schema + one sample document (P3). The builtin templates\nare scaffolding (no anchors); this produces a tenant-private template with\nreal anchors that ``apply`` can match, ready for active-learning refinement.","operationId":"post_api_v1_templates_template_id_bootstrap","security":[{"HTTPBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BootstrapRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/templates/{template_id}/export":{"post":{"tags":["templates"],"summary":"Export Template","description":"Serialize a template into a portable ``adp.template`` JSON package (no\ntenant/internal ids leak). The package round-trips through ``POST /import``.","operationId":"post_api_v1_templates_template_id_export","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/templates/{template_id}/publish":{"post":{"tags":["templates"],"summary":"Publish Template","description":"List (or unlist) a template in the public marketplace. Publishing only\nexposes the template's fields + metadata cross-tenant — it does not move\nownership or grant writes to the original.","operationId":"post_api_v1_templates_template_id_publish","security":[{"HTTPBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/templates/{template_id}/correction":{"post":{"tags":["templates"],"summary":"Add Correction","description":"Fold a reviewer correction into a template (active learning). Bumps the\ntemplate version and widens recall for the next document.","operationId":"post_api_v1_templates_template_id_correction","security":[{"HTTPBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/templates/suggest/{doc_id}":{"get":{"tags":["templates"],"summary":"Suggest Template","description":"Route a document to its best-fitting learned template (智能归档).","operationId":"get_api_v1_templates_suggest_doc_id","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"threshold","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"default":0.5,"title":"Threshold"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/templates/feedback/{doc_id}":{"post":{"tags":["templates"],"summary":"Apply Feedback","description":"Push a reviewer's corrections for a document back into its best-fitting\ntemplate (active-learning bridge). Bumps the template version.","operationId":"post_api_v1_templates_feedback_doc_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/usage/summary":{"get":{"tags":["usage"],"summary":"Usage Summary","description":"Aggregated LLM usage: total tokens/cost/calls, by model, by purpose, by day.\nScoped to the caller's tenant (admin sees all).","operationId":"get_api_v1_usage_summary","security":[{"HTTPBearer":[]}],"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"}}}}}}},"/api/v1/usage/recent":{"get":{"tags":["usage"],"summary":"Usage Recent","description":"Most recent LLM calls (newest first), scoped to the caller's tenant.","operationId":"get_api_v1_usage_recent","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/usage/events":{"get":{"tags":["usage"],"summary":"Usage Events","description":"PRD §4.3/§9 计量事件流水 (UsageEvent, 只读分页, 新→旧)。\n\npage/token 等口径的消费事实; 响应带 total 供分页。租户隔离双保险:\ntenant_scope 显式过滤 + core/tenant_filter 行级过滤 (模型带 tenant_id,\n自动被覆盖)。event_type/days 可选过滤。","operationId":"get_api_v1_usage_events","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Event Type"}},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":365,"minimum":1},{"type":"null"}],"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/usage/alerts":{"get":{"tags":["usage"],"summary":"Usage Alerts","description":"余额告警 (预付费计费口径): 余额耗尽 (danger) / 低于阈值 (warning)。\nAlso fires notification-center hooks (date-deduped) so operators get an\nemail/IM/webhook heads-up, not just a banner.","operationId":"get_api_v1_usage_alerts","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/redact":{"post":{"tags":["redact"],"summary":"Redact Text","description":"Redact PII in arbitrary text.","operationId":"post_api_v1_redact","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedactRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/redact/documents/{doc_id}":{"get":{"tags":["redact"],"summary":"Redact Document","description":"Return the document's text_content + extractions with PII redacted.","operationId":"get_api_v1_redact_documents_doc_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"entity_types","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Types"}},{"name":"mode","in":"query","required":false,"schema":{"type":"string","default":"mask","title":"Mode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/redact/entities":{"get":{"tags":["redact"],"summary":"List Entities","description":"List the supported PII entity types.","operationId":"get_api_v1_redact_entities","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/redact/scan":{"post":{"tags":["redact"],"summary":"Scan Text","description":"Detect PII entities without modifying the text (returns findings only).","operationId":"post_api_v1_redact_scan","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/redact/documents/{doc_id}/pii-scan":{"post":{"tags":["redact"],"summary":"Pii Scan Document","description":"Phase 4 · P4-4 — discover散落 PII (incl. names/addresses) in a document's\nfull text. Unlike auto-redaction (which enforces masking), discovery REPORTS\nwhat's present — for audit on tenants whose redaction policy is off, or to\ndecide whether to turn it on.","operationId":"post_api_v1_redact_documents_doc_id_pii_scan","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/flows/presets/install":{"post":{"tags":["flows"],"summary":"Install Flow Presets","description":"官方内容包按需安装 (Phase 16 T12): 老租户/集成商不限注册时点,\n幂等安装 5 条预置流程(inactive)。","operationId":"post_api_v1_flows_presets_install","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/flows/presets":{"get":{"tags":["flows"],"summary":"List Preset Flows","description":"官方预置行业工作流目录 (T8) — metadata only, no tenant data.\n\nRegistered BEFORE the ``/{flow_id}`` parameter route so the concrete path\nis never shadowed by it.","operationId":"get_api_v1_flows_presets","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/flows/marketplace":{"get":{"tags":["flows"],"summary":"List Marketplace","description":"P3-3 workflow marketplace: flows explicitly published by other tenants.","operationId":"get_api_v1_flows_marketplace","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/flows/import":{"post":{"tags":["flows"],"summary":"Import Flow","description":"Import a marketplace flow as a local draft copy.","operationId":"post_api_v1_flows_import","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowImportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/flows":{"get":{"tags":["flows"],"summary":"List Flows","operationId":"get_api_v1_flows","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["flows"],"summary":"Create Flow","operationId":"post_api_v1_flows","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/flows/{flow_id}":{"get":{"tags":["flows"],"summary":"Get Flow","operationId":"get_api_v1_flows_flow_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"flow_id","in":"path","required":true,"schema":{"type":"integer","title":"Flow Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["flows"],"summary":"Update Flow","operationId":"put_api_v1_flows_flow_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"flow_id","in":"path","required":true,"schema":{"type":"integer","title":"Flow Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["flows"],"summary":"Delete Flow","operationId":"delete_api_v1_flows_flow_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"flow_id","in":"path","required":true,"schema":{"type":"integer","title":"Flow Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/flows/{flow_id}/activate":{"post":{"tags":["flows"],"summary":"Activate Flow","operationId":"post_api_v1_flows_flow_id_activate","security":[{"HTTPBearer":[]}],"parameters":[{"name":"flow_id","in":"path","required":true,"schema":{"type":"integer","title":"Flow Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/flows/{flow_id}/publish":{"post":{"tags":["flows"],"summary":"Publish Flow","description":"Publish this flow to the marketplace (explicit share opt-in).","operationId":"post_api_v1_flows_flow_id_publish","security":[{"HTTPBearer":[]}],"parameters":[{"name":"flow_id","in":"path","required":true,"schema":{"type":"integer","title":"Flow Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/flows/{flow_id}/unpublish":{"post":{"tags":["flows"],"summary":"Unpublish Flow","description":"Remove this flow from the marketplace.","operationId":"post_api_v1_flows_flow_id_unpublish","security":[{"HTTPBearer":[]}],"parameters":[{"name":"flow_id","in":"path","required":true,"schema":{"type":"integer","title":"Flow Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/flows/{flow_id}/execute/{doc_id}":{"post":{"tags":["flows"],"summary":"Execute Flow","description":"Execute a flow over a document; returns the per-node trace.","operationId":"post_api_v1_flows_flow_id_execute_doc_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"flow_id","in":"path","required":true,"schema":{"type":"integer","title":"Flow Id"}},{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge":{"get":{"tags":["knowledge"],"summary":"List Kbs","operationId":"get_api_v1_knowledge","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["knowledge"],"summary":"Create Kb","operationId":"post_api_v1_knowledge","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KBCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/knowledge/doc-types":{"get":{"tags":["knowledge"],"summary":"List Doc Types","description":"单证类型分类目录 (类型 → 知识库/标签/计数), 供知识库页分组与检索筛选。","operationId":"get_api_v1_knowledge_doc_types","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/knowledge/search":{"post":{"tags":["knowledge"],"summary":"Search All Kbs","description":"跨知识库检索 (可选按单证类型过滤), 结果带分类出处。","operationId":"post_api_v1_knowledge_search","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/knowledge/qa":{"post":{"tags":["knowledge"],"summary":"Qa All Kbs","description":"跨知识库 RAG 问答 (可选按单证类型过滤): LLM 合成, 无 LLM 诚实回退抽取式;\ncitations 带 kb_name/doc_type 出处。","operationId":"post_api_v1_knowledge_qa","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/knowledge/{kb_id}":{"get":{"tags":["knowledge"],"summary":"Get Kb","operationId":"get_api_v1_knowledge_kb_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"integer","title":"Kb Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["knowledge"],"summary":"Delete Kb","operationId":"delete_api_v1_knowledge_kb_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"integer","title":"Kb Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["knowledge"],"summary":"Update Kb","description":"部分更新知识库 (名称/描述/切块参数/向量开关)。","operationId":"patch_api_v1_knowledge_kb_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"integer","title":"Kb Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KBUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge/{kb_id}/reindex":{"post":{"tags":["knowledge"],"summary":"Reindex Kb","description":"重建索引: 库内全部文档按当前切块参数/向量配置重新切块入库。","operationId":"post_api_v1_knowledge_kb_id_reindex","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"integer","title":"Kb Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge/{kb_id}/documents":{"get":{"tags":["knowledge"],"summary":"List Kb Documents","operationId":"get_api_v1_knowledge_kb_id_documents","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"integer","title":"Kb Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["knowledge"],"summary":"Add Kb Document","operationId":"post_api_v1_knowledge_kb_id_documents","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"integer","title":"Kb Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddDocRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge/{kb_id}/chunks":{"get":{"tags":["knowledge"],"summary":"List Kb Chunks","description":"分页浏览知识库块 (内容预览/所属文档/是否带向量)。","operationId":"get_api_v1_knowledge_kb_id_chunks","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"integer","title":"Kb Id"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","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"}}}}}}},"/api/v1/knowledge/{kb_id}/documents/{doc_id}":{"delete":{"tags":["knowledge"],"summary":"Remove Kb Document","operationId":"delete_api_v1_knowledge_kb_id_documents_doc_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"integer","title":"Kb Id"}},{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge/{kb_id}/search":{"post":{"tags":["knowledge"],"summary":"Search Kb","operationId":"post_api_v1_knowledge_kb_id_search","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"integer","title":"Kb Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge/{kb_id}/qa":{"post":{"tags":["knowledge"],"summary":"Kb Qa","operationId":"post_api_v1_knowledge_kb_id_qa","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"integer","title":"Kb Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/publish/health":{"get":{"tags":["publish"],"summary":"Publish Health","description":"Verify an API key is valid. Returns the key identity.","operationId":"get_api_v1_publish_health","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/publish/capabilities":{"get":{"tags":["publish"],"summary":"Publish Capabilities","description":"Surface discovery for external integrators (P0-C) — what this API key\ncan actually reach. The admin ``/integrations/capabilities`` view is\nJWT-gated, so a key-only caller could never discover the sink/format/event\nsurface; this is the honest, key-scoped equivalent. Any active key.","operationId":"get_api_v1_publish_capabilities","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/publish/extract":{"post":{"tags":["publish"],"summary":"Publish Extract","description":"Upload a file, process it, and return extracted fields.\n\nSync flow (blocks until processing completes) — suited to small docs.\nScopes required: ``extract``.","operationId":"post_api_v1_publish_extract","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_publish_extract_api_v1_publish_extract_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/publish/documents":{"get":{"tags":["publish"],"summary":"Publish List Documents","description":"List the caller's documents (newest first). Scope: ``read``.","operationId":"get_api_v1_publish_documents","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"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"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/publish/documents/{doc_id}":{"get":{"tags":["publish"],"summary":"Publish Get Document","description":"Get a single document + its extraction result. Scope: ``read``.","operationId":"get_api_v1_publish_documents_doc_id","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/publish/documents/{doc_id}/export":{"get":{"tags":["publish"],"summary":"Publish Export Document","description":"Export a document's structured result as JSON (fields + metadata).\nScope: ``read``. (P3-9: machine-readable result for downstream systems.)","operationId":"get_api_v1_publish_documents_doc_id_export","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/publish/documents/{doc_id}/export-format":{"get":{"tags":["publish"],"summary":"Publish Export Format","description":"Export a document's structured result in a downstream-ready interchange\nformat (P0-C). Scope: ``read``.\n\n``format`` ∈ ``edi | xbrl | excel`` (``csv``/``xlsx`` alias excel);\n``dialect`` selects the EDI flavor (``x12`` default | ``edifact``).\n``mapping_id`` projects the extraction through a SchemaMapping first —\ncontract violations block the export (422), same semantics as the sink\nendpoint, so dirty data never reaches the ERP/finance system.","operationId":"get_api_v1_publish_documents_doc_id_export_format","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"format","in":"query","required":true,"schema":{"type":"string","title":"Format"}},{"name":"dialect","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dialect"}},{"name":"mapping_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mapping Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/publish/documents/{doc_id}/sink":{"post":{"tags":["publish"],"summary":"Publish Sink Document","description":"Push a document's extracted result to a downstream sink\n(``db`` | ``kafka`` | ``mq``). Scope: ``extract`` (external write).\n\nWhen ``mapping_id`` is supplied the extraction is projected through the\nSchemaMapping with the delivery contract enforced — a contract violation\nblocks the sink (422) so dirty data is never written downstream.\n\nReturns the sink's summary, or ``status: \"not_configured\"`` when the sink's\ndependency/connection isn't wired (honest — no silent drop). (P3-9.)","operationId":"post_api_v1_publish_documents_doc_id_sink","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"sink","in":"query","required":true,"schema":{"type":"string","title":"Sink"}},{"name":"mapping_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mapping Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Config"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/publish/qa/{doc_id}":{"post":{"tags":["publish"],"summary":"Publish Qa","description":"Ask a question about a document. Scopes required: ``qa``.\n\nRow-scoped to the API key's tenant — a key cannot QA another tenant's doc.","operationId":"post_api_v1_publish_qa_doc_id","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"question","in":"query","required":true,"schema":{"type":"string","title":"Question"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/publish/templates":{"get":{"tags":["publish"],"summary":"Publish List Templates","description":"List templates visible to the caller's tenant (own + shared + public).\nScope: ``read``. (P3-7: programmatic template discovery.)","operationId":"get_api_v1_publish_templates","parameters":[{"name":"document_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Type"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apikeys":{"get":{"tags":["apikeys"],"summary":"List Keys","operationId":"get_api_v1_apikeys","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["apikeys"],"summary":"Create Key","operationId":"post_api_v1_apikeys","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/apikeys/{key_id}/quota":{"get":{"tags":["apikeys"],"summary":"Key Quota","description":"Live request-quota budget for one key (developer portal).","operationId":"get_api_v1_apikeys_key_id_quota","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apikeys/{key_id}/stats":{"get":{"tags":["apikeys"],"summary":"Key Usage Stats","description":"按 Key 统计 API 调用次数 (developer portal)。\n\n数据源: usage_events 的 api_call 口径 (ref_id = key id, 2026-10 起全方法\n计量; 此前写入的行 ref_id 为空, 不计入本统计 — 统计从上线时刻起算)。\n返回: 窗口总量 / 按日序列 (空日补零, 供前端直绘) / Top 路由 / 最近调用。","operationId":"get_api_v1_apikeys_key_id_stats","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":14,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apikeys/{key_id}/rotate":{"post":{"tags":["apikeys"],"summary":"Rotate Key","operationId":"post_api_v1_apikeys_key_id_rotate","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apikeys/{key_id}/revoke":{"post":{"tags":["apikeys"],"summary":"Revoke Key","operationId":"post_api_v1_apikeys_key_id_revoke","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks":{"get":{"tags":["webhooks"],"summary":"List Webhooks","operationId":"get_api_v1_webhooks","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["webhooks"],"summary":"Create Webhook","operationId":"post_api_v1_webhooks","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/webhooks/{webhook_id}":{"delete":{"tags":["webhooks"],"summary":"Delete Webhook","operationId":"delete_api_v1_webhooks_webhook_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"integer","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/{webhook_id}/test":{"post":{"tags":["webhooks"],"summary":"Test Webhook","description":"Send a test ping event to the webhook (creates a delivery row).","operationId":"post_api_v1_webhooks_webhook_id_test","security":[{"HTTPBearer":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"integer","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/{webhook_id}/deliveries":{"get":{"tags":["webhooks"],"summary":"List Deliveries","description":"Delivery log for an endpoint (P3-3 observability).","operationId":"get_api_v1_webhooks_webhook_id_deliveries","security":[{"HTTPBearer":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"integer","title":"Webhook Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/deliveries/{delivery_id}/redeliver":{"post":{"tags":["webhooks"],"summary":"Redeliver Delivery","description":"Manually replay a delivery (P3-3).","operationId":"post_api_v1_webhooks_deliveries_delivery_id_redeliver","security":[{"HTTPBearer":[]}],"parameters":[{"name":"delivery_id","in":"path","required":true,"schema":{"type":"integer","title":"Delivery Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tenants":{"get":{"tags":["tenants"],"summary":"List Tenants","operationId":"get_api_v1_tenants","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["tenants"],"summary":"Create Tenant","description":"创建租户并**自动开通租户管理员账号**。\n\n复用自助注册的全套引导 (免费额度/预置流程/交付映射/术语), 管理员用户名\n或密码缺省时自动生成。`credentials.password` 仅本次响应返回一次 ——\n丢失只能走 reset-admin-password 重新生成。","operationId":"post_api_v1_tenants","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/tenants/{tenant_id}/reset-admin-password":{"post":{"tags":["tenants"],"summary":"Reset Admin Password","description":"重置租户管理员密码: 生成新强口令并踢下线所有旧会话。新密码仅本次返回。","operationId":"post_api_v1_tenants_tenant_id_reset_admin_password","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"integer","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tenants/{tenant_id}":{"delete":{"tags":["tenants"],"summary":"Delete Tenant","operationId":"delete_api_v1_tenants_tenant_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"integer","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tenants/{tenant_id}/terms":{"get":{"tags":["tenants"],"summary":"List Terms","description":"租户领域术语列表 (识别率: 实体词典注入 LLM prompt)。","operationId":"get_api_v1_tenants_tenant_id_terms","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"integer","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["tenants"],"summary":"Add Term","operationId":"post_api_v1_tenants_tenant_id_terms","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"integer","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Req"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tenants/{tenant_id}/terms/{term_id}":{"delete":{"tags":["tenants"],"summary":"Delete Term","operationId":"delete_api_v1_tenants_tenant_id_terms_term_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"integer","title":"Tenant Id"}},{"name":"term_id","in":"path","required":true,"schema":{"type":"integer","title":"Term Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/eval/datasets":{"get":{"tags":["eval"],"summary":"List Eval Datasets","description":"List available evaluation datasets under EVAL_DATASET_DIR.","operationId":"get_api_v1_eval_datasets","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/eval/run":{"post":{"tags":["eval"],"summary":"Run Eval","description":"Run evaluation on a named dataset (subdir of EVAL_DATASET_DIR).","operationId":"post_api_v1_eval_run","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dataset","in":"query","required":true,"schema":{"type":"string","title":"Dataset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/eval/compare":{"post":{"tags":["eval"],"summary":"Compare Eval","description":"A/B compare two predicted field dicts against the same ground truth.","operationId":"post_api_v1_eval_compare","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__v1__eval__CompareRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/eval/report":{"post":{"tags":["eval"],"summary":"Eval Report","description":"P2-7: run a dataset and return a downloadable Markdown accuracy report.","operationId":"post_api_v1_eval_report","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/eval/report-docx":{"post":{"tags":["eval"],"summary":"Eval Report Docx","description":"P43 · POC 报告 docx 导出: 评测白皮书 (字段级 P/R/F1 + 边界声明) 转\nWord, 供销售直接放进客户选型材料。","operationId":"post_api_v1_eval_report_docx","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/eval/real-trend":{"get":{"tags":["eval"],"summary":"Eval Real Trend","description":"Phase 16 T3: real 集趋势(本周 vs 上周 F1/样本量/失败类型迁移)。\n\n数据源是纠错回流沉淀的 ``real_<doc_type>/``; 无集或近 14 天无新增样本\n→ status=insufficient, 绝不用合成集数字冒充 real 趋势。","operationId":"get_api_v1_eval_real_trend","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_type","in":"query","required":true,"schema":{"type":"string","title":"Doc Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/eval/real-timeline":{"get":{"tags":["eval"],"summary":"Eval Real Timeline","description":"跨周 F1 时间线 (「越用越准」进步曲线): real 集按 ISO 周分桶评测。\n\n空桶如实返回 null 不插值; 窗口外老样本计入 older_samples。供评测中心\n渲染精度进步曲线 —— 纠错反哺 → 模板/配置迭代 → F1 上行的可感知证据。","operationId":"get_api_v1_eval_real_timeline","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_type","in":"query","required":true,"schema":{"type":"string","title":"Doc Type"}},{"name":"weeks","in":"query","required":false,"schema":{"type":"integer","maximum":26,"minimum":2,"default":8,"title":"Weeks"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/eval/failure-modes":{"get":{"tags":["eval"],"summary":"Eval Failure Modes","description":"T4: 数据集级失败模式分类报告 —— 「下一轮优化往哪打」。\n\n四类计数: classification_miss(路由错 schema, 样本级) / field_miss(gold 有\n抽取无, 字段级) / field_wrong(两侧都有但值不等, 字段级) / schema_absent\n(gold 类型无注册 schema, 样本级)。目录定位与 /eval/report 同一惯例\n(_resolve_dataset_dir), 抽取函数与 /eval/run 同一事实源。","operationId":"get_api_v1_eval_failure_modes","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dataset","in":"query","required":true,"schema":{"type":"string","title":"Dataset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"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"}}}}}}},"/api/v1/eval/calibration":{"get":{"tags":["eval"],"summary":"Eval Calibration","description":"P3-9: build a confidence-calibration curve from a dataset and recommend\nan evidence-based human-review threshold (instead of the arbitrary 0.85).","operationId":"get_api_v1_eval_calibration","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dataset","in":"query","required":true,"schema":{"type":"string","title":"Dataset"}},{"name":"target","in":"query","required":false,"schema":{"type":"number","default":0.95,"title":"Target"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/eval/datasets/adversarial":{"post":{"tags":["eval"],"summary":"Create Adversarial Dataset","description":"P0-2: 从已标注数据集生成对抗评测集(OCR 噪声劣化、真值保留、血缘 meta)。\n与 CLI ``run_eval.py --make-adversarial`` 共用同一服务函数,可复现一致。","operationId":"post_api_v1_eval_datasets_adversarial","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdversarialDatasetRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/eval/datasets/from-corrections":{"post":{"tags":["eval"],"summary":"Dataset From Corrections","description":"P3-2: materialize HITL corrections into an eval dataset, then run it\nonce so the tenant sees the accuracy of the corrected docs immediately.","operationId":"post_api_v1_eval_datasets_from_corrections","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectedDatasetRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/eval/datasets/{name}/samples":{"get":{"tags":["eval"],"summary":"Dataset Samples","description":"读取数据集内的样本内容 (样文 + 真值 JSON), 供前端展示。\n\nlimit 限制返回份数 (每份内容截断 8KB), 避免大集拖垮响应。","operationId":"get_api_v1_eval_datasets_name_samples","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":5,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/eval/datasets/generate-all":{"post":{"tags":["eval"],"summary":"Generate Samples For All Types","description":"P0 全量覆盖: 为系统中配置的每一个单证类型至少生成一份测试样本\n(样文 + 期望字段)。LLM 造真实感值, 未配置/失败按字段类型确定性合成;\n已有样本目录默认跳过 (force=True 时写 *_gen_sample.* 追加, 不覆盖人工策展样本)。","operationId":"post_api_v1_eval_datasets_generate_all","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateAllRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/insurance/policies/from-doc/{doc_id}":{"post":{"tags":["insurance"],"summary":"Policy From Doc","description":"从一份 insurance_policy 文档创建保单。","operationId":"post_api_v1_insurance_policies_from_doc_doc_id","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/insurance/claims/build":{"post":{"tags":["insurance"],"summary":"Build Claim Endpoint","description":"聚合理赔申请书 + 证据单据 → Claim。","operationId":"post_api_v1_insurance_claims_build","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildClaimRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/insurance/claims/{claim_id}/assess":{"post":{"tags":["insurance"],"summary":"Assess Claim Endpoint","description":"理赔核赔: 验真证据 + 算核赔金额 + 状态流转。","operationId":"post_api_v1_insurance_claims_claim_id_assess","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"integer","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/insurance/claims/{claim_id}":{"get":{"tags":["insurance"],"summary":"Get Claim","operationId":"get_api_v1_insurance_claims_claim_id","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"integer","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/insurance/claims/{claim_id}/submit":{"post":{"tags":["insurance"],"summary":"Submit Claim Endpoint","description":"核赔通过后提交保险核心系统 (参考适配器, 未配置诚实返回)。","operationId":"post_api_v1_insurance_claims_claim_id_submit","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"integer","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/settings/deployment":{"get":{"tags":["settings"],"summary":"Get Deployment","description":"Deployment shape: private (单租户私有化) vs saas (多租户云).\n\nDrives UI trimming (private mode hides the SaaS billing pages and surfaces\nthe License card) and gives the frontend the license posture in one call.","operationId":"get_api_v1_settings_deployment","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/settings/llm":{"get":{"tags":["settings"],"summary":"Get Llm Settings","description":"Return the current model stack: LLM provider + per-purpose routing +\nvision (OCR engine / PaddleOCR-VL) config. Read-only; runtime routing can\nbe patched via PATCH /settings/llm/routing, persistent via env vars.","operationId":"get_api_v1_settings_llm","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/settings/llm/routing":{"patch":{"tags":["settings"],"summary":"Update Model Routing","description":"Update model routing at runtime (non-persistent; restart resets).\n\nFor persistent config, set the corresponding env vars — or better, use\n``PUT /settings/llm/config`` (外部大模型配置页), which persists to the DB.","operationId":"patch_api_v1_settings_llm_routing","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelRoutingUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/settings/llm/config":{"get":{"tags":["settings"],"summary":"Get Llm Config","description":"Platform external-LLM config view. The API key is never returned — only\nwhether it is set plus a masked tail.","operationId":"get_api_v1_settings_llm_config","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["settings"],"summary":"Put Llm Config","description":"Persist the platform external-LLM config and apply it to the running\nprocess (demo-mode flag + client singletons refresh immediately).","operationId":"put_api_v1_settings_llm_config","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LLMConfigUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]},"delete":{"tags":["settings"],"summary":"Delete Llm Config","description":"Clear the persisted override — the effective config falls back to .env.","operationId":"delete_api_v1_settings_llm_config","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/settings/llm/test":{"post":{"tags":["settings"],"summary":"Test Llm Config","description":"Probe an external LLM with a tiny chat call — the config page's\n「测试连接」. Omitted fields fall back to the current effective config, so\nan unsaved candidate (key/base/model) can be validated before saving.","operationId":"post_api_v1_settings_llm_test","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LLMConfigTestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/security/sso/providers":{"get":{"tags":["security"],"summary":"Get Sso Providers","description":"List available SSO providers and their configuration status.","operationId":"get_api_v1_security_sso_providers","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/security/sso/login":{"get":{"tags":["security"],"summary":"Sso Login","description":"Redirect to the SSO provider's login page.\n\nIM providers (wecom/dingtalk/feishu): 301 → ``/auth/sso/{provider}/login``\n(the state-protected main surface). OIDC keeps serving here.","operationId":"get_api_v1_security_sso_login","parameters":[{"name":"provider","in":"query","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/security/sso/callback":{"get":{"tags":["security"],"summary":"Sso Callback","description":"SSO callback — exchange code for user info and issue a JWT.\n\nAll providers (oidc/wecom/dingtalk/feishu) run the real code-exchange flow.\nUnconfigured provider / unreachable IdP / missing user identity → 400 —\nnever a fake success.\n\nIM providers: 301 → ``/auth/sso/{provider}/callback`` (state-protected;\ncallers must restart the login flow to obtain a state).","operationId":"get_api_v1_security_sso_callback","parameters":[{"name":"provider","in":"query","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/security/retention/cleanup":{"post":{"tags":["security"],"summary":"Run Retention Cleanup","description":"Manually trigger expired-document cleanup.","operationId":"post_api_v1_security_retention_cleanup","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetentionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/security/retention/status":{"get":{"tags":["security"],"summary":"Get Retention Status","description":"Return the current retention configuration.","operationId":"get_api_v1_security_retention_status","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/security/pii/policy":{"get":{"tags":["security"],"summary":"Get Pii Policy Endpoint","description":"Return the caller's tenant PII policy.","operationId":"get_api_v1_security_pii_policy","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["security"],"summary":"Put Pii Policy Endpoint","description":"Update the caller's tenant PII policy (auto-redaction at extraction time).","operationId":"put_api_v1_security_pii_policy","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PiiPolicyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/security/encryption/status":{"get":{"tags":["security"],"summary":"Encryption Status","description":"Honest capability surface for at-rest encryption + the tenant's own key.","operationId":"get_api_v1_security_encryption_status","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/security/encryption/provision":{"post":{"tags":["security"],"summary":"Provision Tenant Key","description":"Provision a fresh per-tenant document-encryption key (first-time setup on\nan empty tenant). For a tenant that already has files, use /encryption/rotate\ninstead — provisioning a new key without rotating orphans existing files.","operationId":"post_api_v1_security_encryption_provision","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/security/encryption/rotate":{"post":{"tags":["security"],"summary":"Rotate Tenant Key Endpoint","description":"Rotate the tenant's document-encryption key: re-encrypt every stored file\nunder a fresh key. Atomic per file — errors are counted, not fatal.","operationId":"post_api_v1_security_encryption_rotate","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/intake/oss":{"post":{"tags":["intake"],"summary":"Intake Oss","description":"Receive OSS/S3/MinIO object-created event notifications.\n\nWhen ``INTAKE_OSS_SECRET`` is configured, the request body must carry a\nvalid HMAC-SHA256 signature in the ``X-ADP-Signature`` header (computed by\nthe sender over the raw body with the shared secret). Requests whose\nsignature is missing or invalid are rejected with 401. When the secret is\nunset the endpoint stays open — suitable for trusted internal networks only.","operationId":"post_api_v1_intake_oss","parameters":[{"name":"X-ADP-Signature","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Adp-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intake/imap/start":{"post":{"tags":["intake"],"summary":"Start Imap","description":"Start the IMAP email poller.","operationId":"post_api_v1_intake_imap_start","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/intake/imap/stop":{"post":{"tags":["intake"],"summary":"Stop Imap","description":"Stop the IMAP email poller.","operationId":"post_api_v1_intake_imap_stop","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/intake/status":{"get":{"tags":["intake"],"summary":"Intake Status","description":"Return intake trigger status.","operationId":"get_api_v1_intake_status","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/intake/circuit":{"get":{"tags":["intake"],"summary":"Inbound Circuit","description":"Per-provider circuit-breaker state (closed / open / half_open).","operationId":"get_api_v1_intake_circuit","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/intake/circuit/{provider}/reset":{"post":{"tags":["intake"],"summary":"Inbound Circuit Reset","description":"Manually close a tripped breaker (e.g. after fixing the upstream).","operationId":"post_api_v1_intake_circuit_provider_reset","security":[{"HTTPBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intake/dedup":{"get":{"tags":["intake"],"summary":"Inbound Dedup Recent","description":"Recent processed-inbound ledger entries (tenant-scoped).","operationId":"get_api_v1_intake_dedup","security":[{"HTTPBearer":[]}],"parameters":[{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intake/dlq":{"get":{"tags":["intake"],"summary":"Inbound Dlq List","description":"List dead-lettered inbound items awaiting replay.","operationId":"get_api_v1_intake_dlq","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intake/dlq/{dlq_id}/replay":{"post":{"tags":["intake"],"summary":"Inbound Dlq Replay","description":"Re-ingest a dead-lettered inbound item; on success it leaves the DLQ.","operationId":"post_api_v1_intake_dlq_dlq_id_replay","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dlq_id","in":"path","required":true,"schema":{"type":"integer","title":"Dlq Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intake/drop-folder/{provider}/poll":{"post":{"tags":["intake"],"summary":"Drop Folder Poll","description":"Trigger one poll of a drop folder (FTP/SFTP/cloud drive) and ingest new\nfiles. Returns the observation (status ok|not_configured|degraded).","operationId":"post_api_v1_intake_drop_folder_provider_poll","security":[{"HTTPBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intake/drop-folder/status":{"get":{"tags":["intake"],"summary":"Drop Folder Status","description":"Which drop-folder providers this build supports + their live/poll state.","operationId":"get_api_v1_intake_drop_folder_status","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/connectors/{provider}/callback":{"post":{"tags":["connectors"],"summary":"Provider Callback","description":"Receive a 企微/飞书/钉钉 push: verify signature → stage file (or echo URL verify).","operationId":"post_api_v1_connectors_provider_callback","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/connectors":{"get":{"tags":["connectors"],"summary":"List Connectors","operationId":"get_api_v1_connectors","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["connectors"],"summary":"Create Connector","operationId":"post_api_v1_connectors","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/connectors/{connector_id}":{"delete":{"tags":["connectors"],"summary":"Delete Connector","operationId":"delete_api_v1_connectors_connector_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"connector_id","in":"path","required":true,"schema":{"type":"integer","title":"Connector Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/connectors/{connector_id}/test":{"post":{"tags":["connectors"],"summary":"Test Connector","description":"Ping a connector config — confirms it exists + is active (no network call).","operationId":"post_api_v1_connectors_connector_id_test","security":[{"HTTPBearer":[]}],"parameters":[{"name":"connector_id","in":"path","required":true,"schema":{"type":"integer","title":"Connector Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/connectors/{connector_id}/fetch":{"post":{"tags":["connectors"],"summary":"Manual Fetch","description":"Manually drain/fetch a connector's pending items into Documents.\n\nNon-agent operations path (the agent fetch_* tools do the same drain when\n``use_llm=true``). Uses the connector's provider to dispatch; tenant scoping\nfollows the request caller via ``current_tenant_id()``.","operationId":"post_api_v1_connectors_connector_id_fetch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"connector_id","in":"path","required":true,"schema":{"type":"integer","title":"Connector Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/connectors/dispatch":{"post":{"tags":["connectors"],"summary":"Dispatch Outbound","description":"P6: push a document-event notification to configured outbound channels\n(email + IM bots). Reuses the inbound Connector rows — each connector's\n``config`` carries the outbound target (``outbound_to`` for email,\n``bot_webhook_url`` for IM). Tenant-scoped; honestly returns\n``not_configured`` per channel when no target is set.","operationId":"post_api_v1_connectors_dispatch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DispatchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/connectors/adapters":{"get":{"tags":["connectors"],"summary":"List Adapters","description":"List the pre-built ERP/CRM field-mapping adapters.","operationId":"get_api_v1_connectors_adapters","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/connectors/{connector_id}/push-doc":{"post":{"tags":["connectors"],"summary":"Push Doc","description":"Transform a document's extraction fields via the chosen adapter and push\nto the ERP/CRM endpoint. Honest not_configured without ERP_ADAPTER_ENDPOINT.\n\nWhen ``mapping_id`` is supplied, the extraction is first projected through\nthe SchemaMapping with the delivery contract enforced: a missing required\nfield or a type error blocks the push (422) so dirty data never reaches the\ntarget system.","operationId":"post_api_v1_connectors_connector_id_push_doc","security":[{"HTTPBearer":[]}],"parameters":[{"name":"connector_id","in":"path","required":true,"schema":{"type":"integer","title":"Connector Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushDocRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/pricing":{"get":{"tags":["billing"],"summary":"Pricing","description":"按 token 计费价目表 (统一积分口径: N tokens = 1 积分 = ¥0.01) + 充值\n档位 (含满赠)。模型对用户屏蔽, 不暴露模型名/单价 (P32)。","operationId":"get_api_v1_billing_pricing","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/billing/usage":{"get":{"tags":["billing"],"summary":"Get Usage","description":"近 N 天 (默认 30) token 消耗报表: 按日聚合 tokens、调用次数与积分,\n附预付余额与累计充值/消耗。","operationId":"get_api_v1_billing_usage","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","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"}}}}}}},"/api/v1/billing/usage/by-document":{"get":{"tags":["billing"],"summary":"Usage By Document","description":"P1-8 用量透明化: 按文档拆的消耗账单 — 每份文档的调用数、tokens、积分与\n最近调用时间, 按积分降序。「哪份材料最烧钱」「对账为什么扣这些」一目了然。\n积分口径对外 (P32 · 模型/内部成本屏蔽): tokens → 积分与扣费同源同取整。\n窗口默认 30 天, limit 默认 50 (上限 200)。","operationId":"get_api_v1_billing_usage_by_document","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/invoices":{"get":{"tags":["billing"],"summary":"List Invoices","description":"分页账单列表 (limit 默认 50, 上限 500; limit=0 全部)。响应带 total 供\n前端分页/加载更多。","operationId":"get_api_v1_billing_invoices","security":[{"HTTPBearer":[]}],"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/invoices/{invoice_id}/invoice-request":{"post":{"tags":["billing"],"summary":"Request Invoice","description":"为已支付账单提交增值税发票申请（抬头/税号/接收邮箱）。运营线下开具后\n在平台后台登记票号。幂等：已申请的账单重复提交返回原状态。","operationId":"post_api_v1_billing_invoices_invoice_id_invoice_request","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceRequestModel"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/invoices/{invoice_id}/attachments":{"post":{"tags":["billing"],"summary":"Upload Invoice Attachment","description":"上传发票/水单审计附件 (pdf/png/jpg/webp ≤5MB)。AES-GCM 加密落盘,\nDB 只记元信息。运营核对对公到账/线下开票时的留档凭证。","operationId":"post_api_v1_billing_invoices_invoice_id_attachments","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/invoices/{invoice_id}/attachments/{file}":{"get":{"tags":["billing"],"summary":"Download Invoice Attachment","description":"下载附件明文 (行级租户隔离; StreamingResponse 带原始文件名)。","operationId":"get_api_v1_billing_invoices_invoice_id_attachments_file","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}},{"name":"file","in":"path","required":true,"schema":{"type":"string","title":"File"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/recharges":{"get":{"tags":["billing"],"summary":"List Recharges","description":"本租户的额度充值记录（线上收银台 + 线下对公确认到账）。","operationId":"get_api_v1_billing_recharges","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/billing/invoices/{invoice_id}/receipt":{"get":{"tags":["billing"],"summary":"Invoice Receipt","description":"Printable HTML receipt for one of the tenant's invoices (open in a new\ntab / print to PDF from the browser). Row-scoped: another tenant's invoice\nid is indistinguishable from a nonexistent one (404).","operationId":"get_api_v1_billing_invoices_invoice_id_receipt","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/invoices/{invoice_id}/payment-proof":{"post":{"tags":["billing"],"summary":"Submit Payment Proof","description":"P1 产品建议 · 对公转账凭证: 租户侧提交付款回单, 平台运营核对后确认到账。","operationId":"post_api_v1_billing_invoices_invoice_id_payment_proof","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentProofRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/webhook/{provider}":{"post":{"tags":["billing"],"summary":"Payment Webhook","description":"Inbound payment-provider webhook (Alipay / WeChat Pay / Stripe).\n\nThe raw body is forwarded to the registered provider adapter, which verifies\nthe provider-specific signature and confirms the matching credit-topup\nrecharge order (grants prepaid balance). With no adapter registered → 501\n``not_configured``; verification failure → 401.","operationId":"post_api_v1_billing_webhook_provider","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/credits/balance":{"get":{"tags":["credits"],"summary":"Get Balance","description":"当前租户额度余额 + 余额跑道 (P43): 近 7 日消耗外推可用天数、\n参考页价与\"还可处理约 N 页\"、月结授信额度。计费关闭时 enabled=false。","operationId":"get_api_v1_credits_balance","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/credits/channels":{"get":{"tags":["credits"],"summary":"List Payment Channels","description":"已注册的在线支付渠道 (启动时按商户凭证装配)。前端据此启用/禁用\n渠道按钮 —— 未注册渠道 checkout 会 400, 与其让用户点了报错, 不如\n提前禁用并提示。线下对公转账恒可用 (运营后台建单确认到账)。","operationId":"get_api_v1_credits_channels","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/credits/orders/{order_no}":{"get":{"tags":["credits"],"summary":"Get Order","description":"充值单状态 (自助充值扫码后的前端轮询): confirmed = 已到账。\n\n``?provider=wechat|alipay`` — 回传下单渠道, pending 时服务端主动向渠道\n查单兜底 (回调延迟/丢失时前端轮询也能及时确认到账)。","operationId":"get_api_v1_credits_orders_order_no","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_no","in":"path","required":true,"schema":{"type":"string","title":"Order No"}},{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/credits/referral-code":{"get":{"tags":["credits"],"summary":"Get Referral Code","description":"本租户推荐码: 新租户注册时填写, 双方各得推荐奖励 (可关闭)。","operationId":"get_api_v1_credits_referral_code","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/credits/statement":{"get":{"tags":["credits"],"summary":"Get Statement","description":"月结对账单 (P45): 开账/充值/消耗/期末余额 + 处理单据量。缺省 = 上月。","operationId":"get_api_v1_credits_statement","security":[{"HTTPBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/credits/value-report":{"get":{"tags":["credits"],"summary":"Get Value Report","description":"月度价值报告 (P43): 本月处理量/自动化率/消耗/估算节省。缺省 = 上月。","operationId":"get_api_v1_credits_value_report","security":[{"HTTPBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/credits/transactions":{"get":{"tags":["credits"],"summary":"List Transactions","description":"额度账本流水 (新→旧), 响应带 total + balance 供前端页头展示。","operationId":"get_api_v1_credits_transactions","security":[{"HTTPBearer":[]}],"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/credits/checkout":{"post":{"tags":["credits"],"summary":"Checkout","description":"创建额度充值单 + 获取支付收银台。\n\n返回 ``checkout_url``: alipay 为收银台跳转 URL (新标签打开); wechat 为\nNative ``code_url`` 二维码串 (前端渲染扫码)。支付成功后渠道 webhook\n回调 → 充值单确认 → 额度到账。","operationId":"post_api_v1_credits_checkout","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/branding":{"get":{"tags":["branding"],"summary":"Get Branding","description":"Public branding: by custom domain when provided, else platform defaults.","operationId":"get_api_v1_branding","parameters":[{"name":"domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tenant-settings":{"get":{"tags":["branding"],"summary":"Get Tenant Settings","operationId":"get_api_v1_tenant_settings","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["branding"],"summary":"Put Tenant Settings","operationId":"put_api_v1_tenant_settings","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantSettingsUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/model-routes":{"get":{"tags":["model-routes"],"summary":"List Routes","operationId":"get_api_v1_model_routes","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["model-routes"],"summary":"Create Route","operationId":"post_api_v1_model_routes","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RouteCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/model-routes/{route_id}":{"patch":{"tags":["model-routes"],"summary":"Patch Route","operationId":"patch_api_v1_model_routes_route_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"route_id","in":"path","required":true,"schema":{"type":"integer","title":"Route Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoutePatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["model-routes"],"summary":"Delete Route","operationId":"delete_api_v1_model_routes_route_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"route_id","in":"path","required":true,"schema":{"type":"integer","title":"Route Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/model-routes/{route_id}/resolve":{"post":{"tags":["model-routes"],"summary":"Resolve Route","description":"Dry-run: show which variant a call would pick + the failover chain.\nNo LLM call is made.","operationId":"post_api_v1_model_routes_route_id_resolve","security":[{"HTTPBearer":[]}],"parameters":[{"name":"route_id","in":"path","required":true,"schema":{"type":"integer","title":"Route Id"}},{"name":"key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/prompts/versions":{"get":{"tags":["prompts"],"summary":"List Prompt Versions","operationId":"get_api_v1_prompts_versions","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["prompts"],"summary":"Register Prompt Version","description":"注册新版提示词（version 在「doc_type × 租户」内自增，draft 不生效）。","operationId":"post_api_v1_prompts_versions","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptVersionCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/prompts/versions/{version_id}/activate":{"post":{"tags":["prompts"],"summary":"Activate Prompt Version","description":"激活一个版本；同租户同 doc_type 的其它版本自动退位（互斥 active）。","operationId":"post_api_v1_prompts_versions_version_id_activate","security":[{"HTTPBearer":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"integer","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/schedules":{"get":{"tags":["schedules"],"summary":"List Schedules","operationId":"get_api_v1_schedules","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["schedules"],"summary":"Create Schedule","operationId":"post_api_v1_schedules","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/schedules/{schedule_id}":{"patch":{"tags":["schedules"],"summary":"Update Schedule","description":"Update a schedule (rename / re-point source / change cadence / toggle\nenablement). ``None`` fields are left untouched so a PATCH is partial.","operationId":"patch_api_v1_schedules_schedule_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"schedule_id","in":"path","required":true,"schema":{"type":"integer","title":"Schedule Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["schedules"],"summary":"Delete Schedule","operationId":"delete_api_v1_schedules_schedule_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"schedule_id","in":"path","required":true,"schema":{"type":"integer","title":"Schedule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/schedules/{schedule_id}/run":{"post":{"tags":["schedules"],"summary":"Run Schedule","description":"Execute a schedule immediately, ignoring its due state.","operationId":"post_api_v1_schedules_schedule_id_run","security":[{"HTTPBearer":[]}],"parameters":[{"name":"schedule_id","in":"path","required":true,"schema":{"type":"integer","title":"Schedule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/schedules/status":{"get":{"tags":["schedules"],"summary":"Scheduler Status","description":"Ops view: which backend is active + counts of active/erroring jobs.","operationId":"get_api_v1_schedules_status","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mcp/":{"get":{"tags":["mcp"],"summary":"Mcp Info","description":"Capability banner for a quick \"is this an MCP endpoint?\" probe.","operationId":"get_api_v1_mcp","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["mcp"],"summary":"Mcp Jsonrpc","description":"JSON-RPC 2.0 over HTTP. Accepts a single request object (or a batch) and\nreturns the JSON-RPC response. Notifications (no ``id``) return an empty 202.\n\nWhen the client sends ``Accept: text/event-stream`` the response is framed\nas one SSE ``data`` event — the Streamable HTTP streaming shape — so a host\nthat only speaks the streaming variant still works.","operationId":"post_api_v1_mcp","parameters":[{"name":"Accept","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mcp":{"get":{"tags":["mcp"],"summary":"Mcp Info","description":"Capability banner for a quick \"is this an MCP endpoint?\" probe.","operationId":"get_api_v1_mcp","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["mcp"],"summary":"Mcp Jsonrpc","description":"JSON-RPC 2.0 over HTTP. Accepts a single request object (or a batch) and\nreturns the JSON-RPC response. Notifications (no ``id``) return an empty 202.\n\nWhen the client sends ``Accept: text/event-stream`` the response is framed\nas one SSE ``data`` event — the Streamable HTTP streaming shape — so a host\nthat only speaks the streaming variant still works.","operationId":"post_api_v1_mcp","parameters":[{"name":"Accept","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mcp/sse":{"get":{"tags":["mcp"],"summary":"Mcp Sse","description":"Long-lived SSE channel. Emits an ``endpoint`` event (the JSON-RPC POST\nURL) per the MCP SSE transport, then keep-alive comments so proxies do not\nclose the idle connection. Actual JSON-RPC calls are POSTed to that endpoint\nby the host; responses can be read from the POST or pushed here.","operationId":"get_api_v1_mcp_sse","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/integrations/capabilities":{"get":{"tags":["integrations"],"summary":"Capabilities","description":"One-shot view of every integration surface and whether it's wired:\ncloud sources, export sinks, scheduler backend, task queue broker, secret\nstore, and data region. Honestly reflects which optional libs are installed\n— no capability is advertised that isn't real.","operationId":"get_api_v1_integrations_capabilities","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/integrations/cloud-sources/fetch":{"post":{"tags":["integrations"],"summary":"Fetch Cloud Source","description":"Trigger a pull from a cloud storage source and ingest the objects.\nReturns the connector observation (``fetched`` / ``errors`` / ``count``) or\n``live_pull: \"not_configured\"`` when the source isn't wired.","operationId":"post_api_v1_integrations_cloud_sources_fetch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloudFetchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/metrics/capabilities":{"get":{"tags":["metrics"],"summary":"Metrics Capabilities","description":"What observability is wired (honest). Useful for the ops dashboard and\nfor buyers evaluating maturity — never advertises a backend that isn't real.","operationId":"get_metrics_capabilities","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/dsar/capabilities":{"get":{"tags":["dsar"],"summary":"Dsar Capabilities","operationId":"get_api_v1_dsar_capabilities","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/dsar/tenant/export":{"get":{"tags":["dsar"],"summary":"Export Tenant","description":"GDPR Art.15/20: export the caller's entire tenant data bundle.","operationId":"get_api_v1_dsar_tenant_export","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/dsar/tenant":{"delete":{"tags":["dsar"],"summary":"Purge Tenant","description":"GDPR Art.17 (org-level right to erasure): cascade-delete the caller's\ntenant, all its data, and on-disk files. Irreversible — the caller must\necho their tenant slug in ``confirm`` to proceed.","operationId":"delete_api_v1_dsar_tenant","security":[{"HTTPBearer":[]}],"parameters":[{"name":"confirm","in":"query","required":true,"schema":{"type":"string","description":"must equal the tenant slug (anti-fat-finger)","title":"Confirm"},"description":"must equal the tenant slug (anti-fat-finger)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dsar/user/{user_id}/export":{"get":{"tags":["dsar"],"summary":"Export User","description":"A user's own personal-data bundle. A non-admin may only export their own\nid (anti-enumeration); admins can export anyone.","operationId":"get_api_v1_dsar_user_user_id_export","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dsar/user/{user_id}":{"delete":{"tags":["dsar"],"summary":"Delete User","description":"Right to be forgotten. By default the identity is anonymized in place\n(preserves audit/review referential integrity); ``hard=true`` physically\nremoves the row. A non-admin may only forget themselves.","operationId":"delete_api_v1_dsar_user_user_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"hard","in":"query","required":false,"schema":{"type":"boolean","description":"physical delete (default: anonymize in place)","default":false,"title":"Hard"},"description":"physical delete (default: anonymize in place)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dsar/retention":{"post":{"tags":["dsar"],"summary":"Run Retention","description":"Admin: run document retention enforcement now (delete docs older than\n``retention_days``, scoped to ``tenant_id`` when given).","operationId":"post_api_v1_dsar_retention","security":[{"HTTPBearer":[]}],"parameters":[{"name":"retention_days","in":"query","required":true,"schema":{"type":"integer","minimum":1,"title":"Retention Days"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/case-bundles":{"post":{"tags":["case-bundles"],"summary":"Create Bundle","description":"Create an empty case bundle (optionally seeded with roles + rules).","operationId":"post_api_v1_case_bundles","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBundleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["case-bundles"],"summary":"List Bundles","operationId":"get_api_v1_case_bundles","parameters":[{"name":"bundle_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bundle Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/case-bundles/{bundle_id}":{"get":{"tags":["case-bundles"],"summary":"Get Bundle","operationId":"get_api_v1_case_bundles_bundle_id","parameters":[{"name":"bundle_id","in":"path","required":true,"schema":{"type":"integer","title":"Bundle Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["case-bundles"],"summary":"Delete Bundle","operationId":"delete_api_v1_case_bundles_bundle_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bundle_id","in":"path","required":true,"schema":{"type":"integer","title":"Bundle Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/case-bundles/{bundle_id}/rules":{"put":{"tags":["case-bundles"],"summary":"Update Rules","operationId":"put_api_v1_case_bundles_bundle_id_rules","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bundle_id","in":"path","required":true,"schema":{"type":"integer","title":"Bundle Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRulesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/case-bundles/{bundle_id}/documents":{"post":{"tags":["case-bundles"],"summary":"Add Document","operationId":"post_api_v1_case_bundles_bundle_id_documents","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bundle_id","in":"path","required":true,"schema":{"type":"integer","title":"Bundle Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddDocumentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/case-bundles/{bundle_id}/documents/{document_id}":{"delete":{"tags":["case-bundles"],"summary":"Remove Document","operationId":"delete_api_v1_case_bundles_bundle_id_documents_document_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bundle_id","in":"path","required":true,"schema":{"type":"integer","title":"Bundle Id"}},{"name":"document_id","in":"path","required":true,"schema":{"type":"integer","title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/case-bundles/{bundle_id}/validate":{"post":{"tags":["case-bundles"],"summary":"Validate Bundle","description":"Run the bundle's cross-document validation rules; persists a\n``Validation`` row (check_type=\"bundle\") on each member doc + returns the\nfull report.","operationId":"post_api_v1_case_bundles_bundle_id_validate","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bundle_id","in":"path","required":true,"schema":{"type":"integer","title":"Bundle Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/case-bundles/{bundle_id}/reconcile":{"post":{"tags":["case-bundles"],"summary":"Reconcile Bundle","description":"G2: LLM-driven cross-document reconciliation layered on the rule DSL.\nReturns rule findings + (when an LLM is available) an explanatory analysis;\nhonestly reports llm: not_configured otherwise.","operationId":"post_api_v1_case_bundles_bundle_id_reconcile","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bundle_id","in":"path","required":true,"schema":{"type":"integer","title":"Bundle Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/sso":{"get":{"tags":["sso"],"summary":"Sso Status","operationId":"get_api_v1_auth_sso","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/auth/sso/{provider}/login":{"get":{"tags":["sso"],"summary":"Sso Login","description":"Redirect to the IdP authorize URL. Honest 503 when not configured.\n\n``redirect`` 是登录成功后的前端站内路径 (如 /projects), 经 state 原样带回;\ncallback 据此选择「302 回前端 (一次性 ticket)」或「JSON (API 调用方)」。","operationId":"get_api_v1_auth_sso_provider_login","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"redirect","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/sso/{provider}/callback":{"get":{"tags":["sso"],"summary":"Sso Callback","description":"IdP redirects here with ?code=&state= (or ?error=). Exchange → login.\n\nauthorize 时登记了前端 redirect 的浏览器流: 兑换身份 → 签发**一次性\nticket** → 302 回前端登录页 (?sso_ticket=..&next=..), 前端用 ticket 换\nJWT —— token 不进浏览器 URL/历史。未登记 redirect 的 (API 调用方) 保持\n原有 JSON 契约不变 (error/缺 code 的 400 先于 state 校验, 文案/状态码\n与既有集成方锁定的一致)。","operationId":"get_api_v1_auth_sso_provider_callback","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/sso/redeem":{"post":{"tags":["sso"],"summary":"Sso Redeem","description":"一次性 ticket → 平台 JWT (登录响应体与 /auth/login 同形)。\n\n微信扫码等浏览器回跳流用: token 不经过回调 URL, 回跳只带 60 秒一次性\nticket, 前端落地后用它换真正的会话凭证。无效/过期/已用 → 400。","operationId":"post_api_v1_auth_sso_redeem","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tasks":{"post":{"tags":["tasks"],"summary":"Create Task","operationId":"post_api_v1_tasks","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTaskRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["tasks"],"summary":"List Tasks","operationId":"get_api_v1_tasks","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"assignee_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Assignee Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tasks/{task_id}":{"get":{"tags":["tasks"],"summary":"Get Task","operationId":"get_api_v1_tasks_task_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"integer","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tasks/{task_id}/claim":{"post":{"tags":["tasks"],"summary":"Claim Task","operationId":"post_api_v1_tasks_task_id_claim","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"integer","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tasks/{task_id}/complete":{"post":{"tags":["tasks"],"summary":"Complete Task","operationId":"post_api_v1_tasks_task_id_complete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"integer","title":"Task Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteTaskRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tasks/{task_id}/reassign":{"post":{"tags":["tasks"],"summary":"Reassign Task","operationId":"post_api_v1_tasks_task_id_reassign","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"integer","title":"Task Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReassignRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tasks/{task_id}/sla":{"get":{"tags":["tasks"],"summary":"Task Sla","operationId":"get_api_v1_tasks_task_id_sla","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"integer","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tasks/sla/watch":{"post":{"tags":["tasks"],"summary":"Run Sla Watch","description":"Escalate overdue open tasks (call periodically via scheduler).","operationId":"post_api_v1_tasks_sla_watch","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/tasks/{task_id}/retry-delivery":{"post":{"tags":["tasks"],"summary":"Retry Delivery","description":"P2-3: re-run the document's active flow (classify → extract → deliver)\nafter a human fixed the fields. When the deliver node passes the contract\ngate, the interception task is auto-completed — the operational loop for\n\"被契约拦下 → 人工补数据 → 重试交付\".","operationId":"post_api_v1_tasks_task_id_retry_delivery","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"integer","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/training/jobs":{"post":{"tags":["training"],"summary":"Create Job","operationId":"post_api_v1_training_jobs","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateJobRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["training"],"summary":"List Jobs","operationId":"get_api_v1_training_jobs","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/training/jobs/{job_id}":{"get":{"tags":["training"],"summary":"Get Job","operationId":"get_api_v1_training_jobs_job_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/training/auto-trigger":{"post":{"tags":["training"],"summary":"Auto Trigger","description":"P3-10: drift/spike + enough labeled samples → auto-create few-shot\ntraining jobs. Call periodically (scheduler tick or manual).","operationId":"post_api_v1_training_auto_trigger","security":[{"HTTPBearer":[]}],"parameters":[{"name":"min_samples","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Min Samples"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/training/pending":{"get":{"tags":["training"],"summary":"Pending Retrains","description":"B3 · retrain confirm flow: per doc_type correction-sample counts, so the\nUI can show \"已积累 N 条纠错样本(≥10 可重训)\" before creating a job.","operationId":"get_api_v1_training_pending","security":[{"HTTPBearer":[]}],"parameters":[{"name":"min_samples","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Min Samples"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/training/model-versions":{"get":{"tags":["training"],"summary":"List Versions","operationId":"get_api_v1_training_model_versions","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["training"],"summary":"Register Version","operationId":"post_api_v1_training_model_versions","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/training/model-versions/{vid}/status":{"post":{"tags":["training"],"summary":"Set Version Status","operationId":"post_api_v1_training_model_versions_vid_status","security":[{"HTTPBearer":[]}],"parameters":[{"name":"vid","in":"path","required":true,"schema":{"type":"integer","title":"Vid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionStatusRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/training/datasets/from-corrections":{"post":{"tags":["training"],"summary":"Build Dataset","operationId":"post_api_v1_training_datasets_from_corrections","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FromCorrectionsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/training/retrain":{"post":{"tags":["training"],"summary":"Retrain","operationId":"post_api_v1_training_retrain","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetrainRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/master-data/sources":{"get":{"tags":["master-data"],"summary":"List Sources","operationId":"get_api_v1_master_data_sources","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["master-data"],"summary":"Create Source","operationId":"post_api_v1_master_data_sources","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSourceRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/master-data/sources/{source_id}/lookup":{"get":{"tags":["master-data"],"summary":"Lookup","operationId":"get_api_v1_master_data_sources_source_id_lookup","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"integer","title":"Source Id"}},{"name":"key","in":"query","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/master-data/sources/{source_id}/enrich":{"post":{"tags":["master-data"],"summary":"Enrich","operationId":"post_api_v1_master_data_sources_source_id_enrich","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"integer","title":"Source Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrichRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compliance/purge":{"post":{"tags":["compliance"],"summary":"Purge Expired","operationId":"post_api_v1_compliance_purge","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/compliance/dlp":{"post":{"tags":["compliance"],"summary":"Dlp Scan","operationId":"post_api_v1_compliance_dlp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DlpRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/compliance/residency-check":{"post":{"tags":["compliance"],"summary":"Residency Check","operationId":"post_api_v1_compliance_residency_check","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResidencyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/compliance/audit-export":{"get":{"tags":["compliance"],"summary":"Audit Export","operationId":"get_api_v1_compliance_audit_export","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fmt","in":"query","required":false,"schema":{"type":"string","default":"json","title":"Fmt"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compliance/evidence":{"get":{"tags":["compliance"],"summary":"Collect Evidence","description":"Phase 4 · P4-5 — SOC2/ISO evidence package: audit-chain integrity, retention,\nresidency pin, encryption, entity counts. ENFORCES data residency: if the\ntenant pinned a region and the caller asserts a different ``region``, refuse\nwith 403 before revealing any posture detail.","operationId":"get_api_v1_compliance_evidence","security":[{"HTTPBearer":[]}],"parameters":[{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compliance/status":{"get":{"tags":["compliance"],"summary":"Compliance Status","description":"D1 · compliance posture card for the settings page: region pin,\nencryption-at-rest, retention, audit-chain health, PII policy, SSO/SCIM.","operationId":"get_api_v1_compliance_status","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/governance/field-policies":{"get":{"tags":["governance"],"summary":"List Policies","operationId":"get_api_v1_governance_field_policies","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["governance"],"summary":"Set Policy","operationId":"post_api_v1_governance_field_policies","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FieldPolicyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/governance/field-policies/apply":{"post":{"tags":["governance"],"summary":"Apply Policy","operationId":"post_api_v1_governance_field_policies_apply","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyPolicyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/governance/model-cards":{"get":{"tags":["governance"],"summary":"Model Cards","operationId":"get_api_v1_governance_model_cards","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/governance/model-cards/{doc_type}":{"get":{"tags":["governance"],"summary":"Model Card","operationId":"get_api_v1_governance_model_cards_doc_type","parameters":[{"name":"doc_type","in":"path","required":true,"schema":{"type":"string","title":"Doc Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/governance/tracing":{"get":{"tags":["governance"],"summary":"Tracing Status","operationId":"get_api_v1_governance_tracing","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/governance/developers/catalog":{"get":{"tags":["governance"],"summary":"Developer Catalog","description":"Group the platform API surface by tag for the developer portal.","operationId":"get_api_v1_governance_developers_catalog","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/conversations":{"post":{"tags":["conversations"],"summary":"Create Conversation","operationId":"post_api_v1_conversations","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConversationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["conversations"],"summary":"List Conversations","operationId":"get_api_v1_conversations","security":[{"HTTPBearer":[]}],"parameters":[{"name":"document_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/conversations/{conv_id}/messages":{"post":{"tags":["conversations"],"summary":"Send Message","operationId":"post_api_v1_conversations_conv_id_messages","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendMessageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/events/dead-letter":{"get":{"tags":["events"],"summary":"List Dead Letter","operationId":"get_api_v1_events_dead_letter","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/events/dead-letter/{dl_id}/replay":{"post":{"tags":["events"],"summary":"Replay","operationId":"post_api_v1_events_dead_letter_dl_id_replay","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dl_id","in":"path","required":true,"schema":{"type":"integer","title":"Dl Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/scim/v2/status":{"get":{"tags":["scim"],"summary":"Scim Status","description":"D2 · SCIM provisioning status for the settings-page \"目录同步\" card:\nwhether the SCIM endpoint is live, its URL, and the provisioned user count.\nDoes NOT require the SCIM bearer (that's the IdP's credential, not ours).","operationId":"get_api_v1_scim_v2_status","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/scim/v2/Users":{"get":{"tags":["scim"],"summary":"Scim List Users","operationId":"get_api_v1_scim_v2_Users","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["scim"],"summary":"Scim Create User","operationId":"post_api_v1_scim_v2_Users","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScimUserCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/scim/v2/Users/{user_id}":{"patch":{"tags":["scim"],"summary":"Scim Patch User","operationId":"patch_api_v1_scim_v2_Users_user_id","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScimPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["scim"],"summary":"Scim Delete User","operationId":"delete_api_v1_scim_v2_Users_user_id","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mappings/presets/install":{"post":{"tags":["mappings"],"summary":"Install Mapping Presets","description":"官方内容包按需安装 (Phase 16 T12): 幂等安装 3 套预置交付映射。","operationId":"post_api_v1_mappings_presets_install","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mappings/presets":{"get":{"tags":["mappings"],"summary":"List Mapping Presets","description":"官方预置交付映射目录 (Phase 16 T2) — metadata only, no tenant data.\n\nRegistered BEFORE the ``/{mapping_id}`` parameter route so the concrete\npath is never shadowed by it.","operationId":"get_api_v1_mappings_presets","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mappings":{"get":{"tags":["mappings"],"summary":"List Mappings","operationId":"get_api_v1_mappings","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_doc_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Doc Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["mappings"],"summary":"Create Mapping","operationId":"post_api_v1_mappings","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MappingCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mappings/import":{"post":{"tags":["mappings"],"summary":"Import Mapping File","operationId":"post_api_v1_mappings_import","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_import_mapping_file_api_v1_mappings_import_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mappings/{mapping_id}":{"get":{"tags":["mappings"],"summary":"Get Mapping","operationId":"get_api_v1_mappings_mapping_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"mapping_id","in":"path","required":true,"schema":{"type":"integer","title":"Mapping Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["mappings"],"summary":"Update Mapping","operationId":"put_api_v1_mappings_mapping_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"mapping_id","in":"path","required":true,"schema":{"type":"integer","title":"Mapping Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MappingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["mappings"],"summary":"Delete Mapping","operationId":"delete_api_v1_mappings_mapping_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"mapping_id","in":"path","required":true,"schema":{"type":"integer","title":"Mapping Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mappings/{mapping_id}/test":{"post":{"tags":["mappings"],"summary":"Test Mapping","operationId":"post_api_v1_mappings_mapping_id_test","security":[{"HTTPBearer":[]}],"parameters":[{"name":"mapping_id","in":"path","required":true,"schema":{"type":"integer","title":"Mapping Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/schema-discovery":{"post":{"tags":["schema-discovery"],"summary":"Discover","operationId":"post_api_v1_schema_discovery","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoverRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["schema-discovery"],"summary":"List Discoveries","operationId":"get_api_v1_schema_discovery","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/schema-discovery/{discovery_id}":{"get":{"tags":["schema-discovery"],"summary":"Get Discovery","operationId":"get_api_v1_schema_discovery_discovery_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"discovery_id","in":"path","required":true,"schema":{"type":"integer","title":"Discovery Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/schema-discovery/{discovery_id}/confirm":{"post":{"tags":["schema-discovery"],"summary":"Confirm","operationId":"post_api_v1_schema_discovery_discovery_id_confirm","security":[{"HTTPBearer":[]}],"parameters":[{"name":"discovery_id","in":"path","required":true,"schema":{"type":"integer","title":"Discovery Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/outcomes":{"post":{"tags":["outcomes"],"summary":"Record","description":"Record a downstream outcome. Open to authenticated callers + the\ndownstream webhook (which carries its own shared secret at the edge).","operationId":"post_api_v1_outcomes","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutcomeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["outcomes"],"summary":"List Outcomes","operationId":"get_api_v1_outcomes","security":[{"HTTPBearer":[]}],"parameters":[{"name":"document_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"}},{"name":"doc_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"}},{"name":"outcome","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Outcome"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/outcomes/stats":{"get":{"tags":["outcomes"],"summary":"Stats","operationId":"get_api_v1_outcomes_stats","security":[{"HTTPBearer":[]}],"parameters":[{"name":"window_days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Window Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/outcomes/feed-continuous-learning":{"post":{"tags":["outcomes"],"summary":"Feed Cl","operationId":"post_api_v1_outcomes_feed_continuous_learning","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ingest/asr/status":{"get":{"tags":["ingest"],"summary":"Asr Status","operationId":"get_api_v1_ingest_asr_status","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/ingest/audio":{"post":{"tags":["ingest"],"summary":"Ingest Audio","description":"Transcribe (if ASR configured) + ingest an audio clip as a Document.","operationId":"post_api_v1_ingest_audio","security":[{"HTTPBearer":[]}],"parameters":[{"name":"filename","in":"query","required":true,"schema":{"type":"string","title":"Filename"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_ingest_audio_api_v1_ingest_audio_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ingest/email-joint/{document_id}":{"post":{"tags":["ingest"],"summary":"Email Joint","description":"Merge email-body extracted hints into a document's structured fields.","operationId":"post_api_v1_ingest_email_joint_document_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"integer","title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{document_id}/provenance":{"get":{"tags":["structured-transforms"],"summary":"Provenance","operationId":"get_api_v1_documents_document_id_provenance","security":[{"HTTPBearer":[]}],"parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"integer","title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{document_id}/audit-export":{"get":{"tags":["structured-transforms"],"summary":"Audit Export","operationId":"get_api_v1_documents_document_id_audit_export","security":[{"HTTPBearer":[]}],"parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"integer","title":"Document Id"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"json","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{document_id}/enhance":{"post":{"tags":["structured-transforms"],"summary":"Enhance","operationId":"post_api_v1_documents_document_id_enhance","security":[{"HTTPBearer":[]}],"parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"integer","title":"Document Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhanceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{document_id}/export-format":{"get":{"tags":["structured-transforms"],"summary":"Export Format","operationId":"get_api_v1_documents_document_id_export_format","security":[{"HTTPBearer":[]}],"parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"integer","title":"Document Id"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"edi","title":"Format"}},{"name":"dialect","in":"query","required":false,"schema":{"type":"string","default":"x12","title":"Dialect"}},{"name":"mapping_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mapping Id"}},{"name":"enforce_contract","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Enforce Contract"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{document_id}/stream":{"get":{"tags":["structured-transforms"],"summary":"Stream","operationId":"get_api_v1_documents_document_id_stream","security":[{"HTTPBearer":[]}],"parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"integer","title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{document_id}/stream/eligibility":{"get":{"tags":["structured-transforms"],"summary":"Stream Eligibility","operationId":"get_api_v1_documents_document_id_stream_eligibility","security":[{"HTTPBearer":[]}],"parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"integer","title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{document_id}/handwriting/recognize":{"post":{"tags":["structured-transforms"],"summary":"Handwriting Recognize","description":"P2-6: transcribe handwritten text via the VLM engine (insurance claims).\nHonest ``not_configured`` without a wired VLM or for unsupported formats.","operationId":"post_api_v1_documents_document_id_handwriting_recognize","security":[{"HTTPBearer":[]}],"parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"integer","title":"Document Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{document_id}/entities":{"post":{"tags":["entities"],"summary":"Extract Entities","operationId":"post_api_v1_documents_document_id_entities","security":[{"HTTPBearer":[]}],"parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"integer","title":"Document Id"}},{"name":"use_llm","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Use Llm"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{document_id}/graph":{"get":{"tags":["entities"],"summary":"Graph","operationId":"get_api_v1_documents_document_id_graph","security":[{"HTTPBearer":[]}],"parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"integer","title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notifications/events":{"get":{"tags":["notifications"],"summary":"List Events","description":"Event catalog for the rule builder dropdown.","operationId":"get_api_v1_notifications_events","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/notifications/status":{"get":{"tags":["notifications"],"summary":"Status","operationId":"get_api_v1_notifications_status","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/notifications/rules":{"get":{"tags":["notifications"],"summary":"List Rules","operationId":"get_api_v1_notifications_rules","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["notifications"],"summary":"Create Rule","operationId":"post_api_v1_notifications_rules","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/notifications/rules/{rule_id}":{"put":{"tags":["notifications"],"summary":"Update Rule","operationId":"put_api_v1_notifications_rules_rule_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"integer","title":"Rule Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["notifications"],"summary":"Delete Rule","operationId":"delete_api_v1_notifications_rules_rule_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"integer","title":"Rule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notifications/rules/{rule_id}/test":{"post":{"tags":["notifications"],"summary":"Test Rule","description":"Fire a 'test' event through the rule so the operator can verify the\nchannel wiring before relying on it.","operationId":"post_api_v1_notifications_rules_rule_id_test","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"integer","title":"Rule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/license/status":{"get":{"tags":["license"],"summary":"Status","description":"Current license status: validity, days left, capacity usage, features.","operationId":"get_api_v1_license_status","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/license/generate":{"post":{"tags":["license"],"summary":"Generate","description":"Mint a signed license (vendor side). Returns the full license incl. key.","operationId":"post_api_v1_license_generate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/license/request-activation":{"post":{"tags":["license"],"summary":"Request Activation","description":"Derive the offline activation code for a license key + machine fingerprint.","operationId":"post_api_v1_license_request_activation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivationRequestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/license/activate":{"post":{"tags":["license"],"summary":"Activate","description":"Bind a license to this machine (offline activation).","operationId":"post_api_v1_license_activate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/license/revoke":{"post":{"tags":["license"],"summary":"Revoke","description":"Revoke a license (kills enforcement immediately).","operationId":"post_api_v1_license_revoke","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/license/check":{"post":{"tags":["license"],"summary":"Check","description":"Processing gate check — what the extraction pipeline enforces.","operationId":"post_api_v1_license_check","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/ops/diagnostics":{"post":{"tags":["ops"],"summary":"Diagnostics","description":"Redacted diagnostics snapshot for support/troubleshooting.","operationId":"post_api_v1_ops_diagnostics","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/ops/bundle/export":{"post":{"tags":["ops"],"summary":"Bundle Export","description":"Export the implementation bundle (templates + flows + mappings + configs).","operationId":"post_api_v1_ops_bundle_export","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/ops/bundle/import":{"post":{"tags":["ops"],"summary":"Bundle Import","description":"Import an implementation bundle (idempotent by name).","operationId":"post_api_v1_ops_bundle_import","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BundleImportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/ops/effect-report":{"post":{"tags":["ops"],"summary":"Effect Report","description":"Customer effect report (markdown) — CSM/续费/售前交付物.","operationId":"post_api_v1_ops_effect_report","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/roi/calculate":{"post":{"tags":["roi"],"summary":"Calculate Roi","description":"30 秒 ROI 测算:每月节省 X 人天 / Y 元(售前立项材料)。","operationId":"post_api_v1_roi_calculate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoiCalculateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/roi/presets":{"get":{"tags":["roi"],"summary":"Roi Presets","description":"3 套行业预设（示例值，POC 启动会校准）。","operationId":"get_api_v1_roi_presets","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/poc/report":{"post":{"tags":["poc"],"summary":"Generate Report","description":"聚合 eval 三层 + 失败模式 + 复核/成本 + ROI, 渲染 POC_KIT §4.1 结构\n的 Markdown 报告。数据缺失段落诚实标注, 绝不编造。","operationId":"post_api_v1_poc_report","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PocReportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/poc/report/pdf":{"post":{"tags":["poc"],"summary":"Generate Report Pdf","description":"Phase 18 T6: 同 /poc/report 但返回 application/pdf(售前交付体面版)。","operationId":"post_api_v1_poc_report_pdf","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PocReportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/field-alias":{"get":{"tags":["field-alias"],"summary":"List Aliases","operationId":"get_api_v1_field_alias","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["field-alias"],"summary":"Create Alias","operationId":"post_api_v1_field_alias","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AliasCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/field-alias/{alias_id}":{"delete":{"tags":["field-alias"],"summary":"Delete Alias","operationId":"delete_api_v1_field_alias_alias_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"alias_id","in":"path","required":true,"schema":{"type":"integer","title":"Alias Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/platform/tenants":{"get":{"tags":["platform"],"summary":"List Tenants","description":"All tenants with subscription + usage snapshot (operator console list).\n\n批量聚合 (≤7 个查询总量, 与租户数无关); llm_tokens 用滚动 30 天近似窗,\n详情页才是精确周期口径。","operationId":"get_api_v1_admin_platform_tenants","security":[{"HTTPBearer":[]}],"parameters":[{"name":"query","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/platform/tenants/{tenant_id}":{"get":{"tags":["platform"],"summary":"Tenant Detail","description":"One tenant: summary + members + invoice history.","operationId":"get_api_v1_admin_platform_tenants_tenant_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"integer","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/platform/tenants/{tenant_id}/credit-line":{"put":{"tags":["platform"],"summary":"Set Tenant Credit Line","description":"P43 · 月结后付费: 设置租户授信额度 (企业客户\"框架协议+月度对账\")。\n余额可透支至 -credit_line, 触达即 402; 运营月度对账后充值回正。","operationId":"put_api_v1_admin_platform_tenants_tenant_id_credit_line","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"integer","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditLineRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/platform/tenant-health":{"get":{"tags":["platform"],"summary":"Tenant Health","description":"P43 · 租户健康度/流失预警 (客户成功): 活跃度+趋势+余额 → 0-100 分,\n< 40 = at-risk 建议跟进。评分口径透明 (见 credit_service.tenant_health)。","operationId":"get_api_v1_admin_platform_tenant_health","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/platform/tenants/{tenant_id}/suspend":{"post":{"tags":["platform"],"summary":"Suspend Tenant","description":"Suspend a tenant (欠费/违规): new document processing is blocked with 403\nuntil resumed; existing data stays readable for export/settlement.","operationId":"post_api_v1_admin_platform_tenants_tenant_id_suspend","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"integer","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuspendRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/platform/tenants/{tenant_id}/resume":{"post":{"tags":["platform"],"summary":"Resume Tenant","description":"Lift a suspension — processing resumes (预付积分余额口径; 余额不足仍会\n在处理闸门处被拦, 与封禁状态无关)。","operationId":"post_api_v1_admin_platform_tenants_tenant_id_resume","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"integer","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/platform/invoices":{"get":{"tags":["platform"],"summary":"List All Invoices","description":"Invoice history across tenants (operator AR view).","operationId":"get_api_v1_admin_platform_invoices","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tenant Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/platform/invoices/{invoice_id}/mark-paid":{"post":{"tags":["platform"],"summary":"Mark Paid","description":"Record offline collection (对公转账到账确认) — invoice becomes PAID.","operationId":"post_api_v1_admin_platform_invoices_invoice_id_mark_paid","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/platform/invoices/{invoice_id}/void":{"post":{"tags":["platform"],"summary":"Void Invoice","description":"Void an OPEN invoice (billing mistake / goodwill).","operationId":"post_api_v1_admin_platform_invoices_invoice_id_void","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/platform/invoices/{invoice_id}/attachments":{"post":{"tags":["platform"],"summary":"Upload Invoice Attachment","description":"运营侧为任意租户账单上传附件 (tenant_id=None 直通)。","operationId":"post_api_v1_admin_platform_invoices_invoice_id_attachments","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/platform/invoices/{invoice_id}/attachments/{file}":{"get":{"tags":["platform"],"summary":"Download Invoice Attachment","operationId":"get_api_v1_admin_platform_invoices_invoice_id_attachments_file","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}},{"name":"file","in":"path","required":true,"schema":{"type":"string","title":"File"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/platform/recharges":{"get":{"tags":["platform"],"summary":"List Recharges","description":"充值单台账 (运营/财务对账视图)，按创建时间倒序。","operationId":"get_api_v1_admin_platform_recharges","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["platform"],"summary":"Create Recharge","description":"建线下充值单（pending）。授予内容在创建时校验，确认到账时执行。","operationId":"post_api_v1_admin_platform_recharges","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RechargeCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/platform/recharges/{order_id}/confirm":{"post":{"tags":["platform"],"summary":"Confirm Recharge","description":"确认到账：执行授予（订阅续期/试用延期/套餐激活）并通知租户。入审计链。","operationId":"post_api_v1_admin_platform_recharges_order_id_confirm","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RechargeConfirmRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/platform/recharges/{order_id}/void":{"post":{"tags":["platform"],"summary":"Void Recharge","operationId":"post_api_v1_admin_platform_recharges_order_id_void","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/platform/invoice-requests":{"get":{"tags":["platform"],"summary":"List Invoice Requests","description":"待开票清单（租户已提交开票信息的 PAID 账单，按申请时间先后）。","operationId":"get_api_v1_admin_platform_invoice_requests","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/platform/invoices/{invoice_id}/invoice-issued":{"post":{"tags":["platform"],"summary":"Mark Invoice Issued","description":"登记开票结果：ok=True 记票号 → issued；ok=False → failed（租户可重新\n申请）。入审计链。","operationId":"post_api_v1_admin_platform_invoices_invoice_id_invoice_issued","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceIssuedRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/platform/invoices/{invoice_id}/refund":{"post":{"tags":["platform"],"summary":"Refund Invoice","description":"Refund a paid invoice (full or partial). Manual invoices are recorded\noffline; provider-managed ones go through the provider adapter.","operationId":"post_api_v1_admin_platform_invoices_invoice_id_refund","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefundRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/platform/revenue":{"get":{"tags":["platform"],"summary":"Revenue","description":"运营收入总览 (预付费口径): 每月充值收入 / token 消耗 / 平台余额总盘。\n订阅制 MRR 已随套餐下线; 增长看板的租户口径见 /admin/platform/overview。","operationId":"get_api_v1_admin_platform_revenue","security":[{"HTTPBearer":[]}],"parameters":[{"name":"months","in":"query","required":false,"schema":{"type":"integer","default":6,"title":"Months"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/platform/overview":{"get":{"tags":["platform"],"summary":"Business Overview","description":"平台经营数字 (预付费口径): 充值收入 / 付费租户 / 消耗中 / 纯体验 /\n沉默租户 / 处理成功率。","operationId":"get_api_v1_admin_platform_overview","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","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"}}}}}}},"/api/v1/admin/platform/flow-apps":{"get":{"tags":["platform"],"summary":"Flow App Usage","description":"P24 · 平台流程应用调用量报表: 每应用执行总数/成功数/失败数/平均延迟,\n以及全平台日调用量 (近 N 天)。","operationId":"get_api_v1_admin_platform_flow_apps","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","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"}}}}}}},"/api/v1/admin/platform/margin":{"get":{"tags":["platform"],"summary":"Platform Margin","description":"单位经济看板 (P-1008 · 商业化): 预付费收入 vs LLM 成本 (按日/按类型)。\n\n成本仅含 LLM 调用折算 (OCR 算力未计入), 用于审视 ¥0.1/次 定价的毛利。","operationId":"get_api_v1_admin_platform_margin","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","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"}}}}}}},"/api/v1/admin/platform/funnel":{"get":{"tags":["platform"],"summary":"Growth Funnel","description":"注册→上传→抽取成功→交付→付费 五步转化漏斗(distinct tenant)。","operationId":"get_api_v1_admin_platform_funnel","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","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"}}}}}}},"/api/v1/admin/platform/leads":{"get":{"tags":["platform"],"summary":"List Leads","description":"销售线索列表(定价/计费页表单提交)。","operationId":"get_api_v1_admin_platform_leads","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/platform/leads/{lead_id}":{"patch":{"tags":["platform"],"summary":"Update Lead","description":"跟进线索: 更新状态(new/contacted/won/lost)与备注, 入审计链。","operationId":"patch_api_v1_admin_platform_leads_lead_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"integer","title":"Lead Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadStatusRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/platform/pricing":{"get":{"tags":["platform"],"summary":"Get Platform Pricing","description":"运营定价参数生效值 (页价/注册赠送/推荐奖励/低余额阈值/充值限额),\n每字段标注来源 (database/env), baseline 为 «恢复默认» 的回滚目标。","operationId":"get_api_v1_admin_platform_pricing","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["platform"],"summary":"Update Platform Pricing","description":"Merge-update 定价参数 (只更新传入字段)。越界/交叉校验失败 → 400;\n成功入审计链 (谁改了价格是财务必查记录)。改动 ≤30s 全网生效 (TTL 缓存)。","operationId":"put_api_v1_admin_platform_pricing","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]},"delete":{"tags":["platform"],"summary":"Revert Platform Pricing","description":"删除 DB 覆盖 — 全部参数回落 .env 基线 («恢复默认»), 入审计链。","operationId":"delete_api_v1_admin_platform_pricing","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/leads":{"post":{"tags":["leads"],"summary":"Submit Lead","description":"Public lead capture. Returns minimal payload (no enumeration surface).\nattribution: 投流渠道归因 (前端 getAttribution()), 摘要进 note + growth 事件。","operationId":"post_api_v1_leads","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects":{"post":{"tags":["projects"],"summary":"Create Project","operationId":"post_api_v1_projects","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["projects"],"summary":"List Projects","operationId":"get_api_v1_projects","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/export-wide-batch":{"get":{"tags":["projects"],"summary":"Export Projects Wide Batch","description":"多项目批量宽表: 一个项目一行拼成一张大宽表 (xlsx + 项目清单页)。\n\nproject_ids 逗号分隔优先; 否则按 project_type/status 过滤 (缺省全部)。\n注意路由必须注册在 /{project_id} 之前, 否则被 int 路径参数遮蔽成 422。","operationId":"get_api_v1_projects_export_wide_batch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Type"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"project_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Ids"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/fields/{field}/override":{"put":{"tags":["projects"],"summary":"Override Field","description":"P23.5 冲突人工裁决: 采纳某个取值覆盖项目级字段 (overrides 永久保留,\n重复提取重放, 不被机器重跑冲掉)。","operationId":"put_api_v1_projects_project_id_fields_field_override","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"field","in":"path","required":true,"schema":{"type":"string","title":"Field"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FieldOverrideRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["projects"],"summary":"Clear Field Override","description":"撤销人工裁决, 恢复权威序机器值。","operationId":"delete_api_v1_projects_project_id_fields_field_override","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"field","in":"path","required":true,"schema":{"type":"string","title":"Field"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/save-as-template":{"post":{"tags":["projects"],"summary":"Save As Template","description":"P23.5: 当前项目「另存为字段表模板」— 快照汇总 schema + 勾稽规则。","operationId":"post_api_v1_projects_project_id_save_as_template","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveAsTemplateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/field-templates":{"get":{"tags":["projects"],"summary":"List Templates","description":"P2-9: 字段表模板列表 (平台内置 + 本租户自建)。","operationId":"get_api_v1_projects_field_templates","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["projects"],"summary":"Create Template","operationId":"post_api_v1_projects_field_templates","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}":{"get":{"tags":["projects"],"summary":"Get Project","operationId":"get_api_v1_projects_project_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/documents":{"post":{"tags":["projects"],"summary":"Attach Document","operationId":"post_api_v1_projects_project_id_documents","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/ingest":{"post":{"tags":["projects"],"summary":"Ingest Files","description":"收卷自动化入口 (IA-automation): 项目内直接传文件, 无需手动挂载。\n\n每个文件: 走标准上传管线入库 + 提交异步提取任务 → 角色推荐自动挂载\n(目录锚定 ≥ 文件名/别名强信号 ≥0.5) → 后台等管线跑完第二波按分类信号\n补挂; 两波置信都不足的走默认兜底角色 (未填可选角色 → 追加「补充材料」),\n文档不悬空。最后自动执行 cached 模式项目级提取 (零 token 合并要素表)。\n\n性能: 落盘/加密/入库按有界线程池并行 (每线程自带 Session), 20 份的\n请求耗时 ≈ 串行的 1/4 (S3 存储后端收益更大); 单份失败不再中断整批,\n随响应 ``failed`` 列表返回。任务走优先队列 —— 用户正在页面上等结果。\n\n``paths``: 文件夹上传时前端附带的相对路径 JSON 数组 (与 files 对齐),\n首个目录段命中清单 role/label 即目录锚定直接定型 (并 pin 该角色的\n单证类型)。\n\n``upload_session``: 前端一次选 >20 份会分批调本接口, 各批带同一会话 id\n—— 文档 id 归并到 project_upload_sessions, 「识别完成」通知与 cached\n合并收敛为会话粒度 (全部批次都到终态才执行/通知一次, 不按批轰炸)。\n\n去重 (P1-7): 与项目已挂载文档做字节级 sha256 比对, 完全重复的文件\n直接跳过不入库, 随响应 ``skipped`` 列表返回。","operationId":"post_api_v1_projects_project_id_ingest","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"upload_session","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upload Session"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_ingest_files_api_v1_projects__project_id__ingest_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/documents/{document_id}/suggest-role":{"get":{"tags":["projects"],"summary":"Suggest Role","description":"P1-5 挂载角色自动推荐: 分类结果 → 词面 → 别名词典 三级信号打分。","operationId":"get_api_v1_projects_documents_document_id_suggest_role","security":[{"HTTPBearer":[]}],"parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"integer","title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/documents/{item_id}":{"delete":{"tags":["projects"],"summary":"Detach Document","operationId":"delete_api_v1_projects_project_id_documents_item_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/completeness":{"get":{"tags":["projects"],"summary":"Completeness","operationId":"get_api_v1_projects_project_id_completeness","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/progress":{"get":{"tags":["projects"],"summary":"Progress","operationId":"get_api_v1_projects_project_id_progress","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/summary":{"get":{"tags":["projects"],"summary":"Summary","operationId":"get_api_v1_projects_project_id_summary","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/checklist":{"put":{"tags":["projects"],"summary":"Update Checklist","operationId":"put_api_v1_projects_project_id_checklist","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChecklistUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/status":{"post":{"tags":["projects"],"summary":"Set Status","operationId":"post_api_v1_projects_project_id_status","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/documents/batch":{"post":{"tags":["projects"],"summary":"Attach Documents Batch","description":"收卷: 一次挂多份。逐条独立处理, 单条冲突不影响其余;\n返回 attached / conflicts 两个列表。","operationId":"post_api_v1_projects_project_id_documents_batch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachBatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/conversation":{"post":{"tags":["projects"],"summary":"Create Project Conversation","description":"项目会话: 创建一个绑定项目下全部文档的跨文档对话 —— 经办人可直接\n「这份卷子里抵押物评估值是多少」式提问（answer 走既有跨文档 RAG）。","operationId":"post_api_v1_projects_project_id_conversation","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/extract":{"post":{"tags":["projects"],"summary":"Extract Project","description":"整个项目抽到一个配置的 schema 上: 权威序合并 (priority 越小越优先),\n多来源同字段不一致 → conflicts; 每字段带来源文档溯源。","operationId":"post_api_v1_projects_project_id_extract","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ProjectExtractRequest"},{"type":"null"}],"title":"Req"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/extract-type":{"post":{"tags":["projects"],"summary":"Extract Project Doc Type","description":"从多份挂载文档中提取一个单证类型的字段: 选定单证类型 → 逐份文档\n提取该类型配置的字段 → 文档×字段矩阵 (每文档一行, 不合并)。\n结果持久化到 summary_fields.type_runs, 项目详情可回看最近一次运行。","operationId":"post_api_v1_projects_project_id_extract_type","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectExtractTypeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/fields":{"get":{"tags":["projects"],"summary":"Project Fields","operationId":"get_api_v1_projects_project_id_fields","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/conflicts":{"get":{"tags":["projects"],"summary":"Project Conflicts","description":"P0-2: 最近一次项目级提取的跨文档字段冲突 (归一化后的真矛盾)。","operationId":"get_api_v1_projects_project_id_conflicts","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/conflicts/resolve-all":{"post":{"tags":["projects"],"summary":"Resolve Conflicts All","description":"P1-6 批量冲突裁决: 全部冲突字段按策略一键采纳 (走 override 通道,\n重跑保留)。返回 resolved/skipped 计数。","operationId":"post_api_v1_projects_project_id_conflicts_resolve_all","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictResolveAllRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/cost":{"get":{"tags":["projects"],"summary":"Project Llm Cost","description":"P2-9 项目级 LLM 成本: 实际用量 (token/费用/调用按文档聚合)\n+ 重跑预算预估。","operationId":"get_api_v1_projects_project_id_cost","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/summary-config":{"put":{"tags":["projects"],"summary":"Bind Summary Config","description":"项目要素表「关联」配置库中的任意单证类型配置 —— 不再限定\ndocument_type=project_summary: 自定义类型 (如 nonstd_invest_wide\n非标投资端宽表) 同样可作为项目级提取的要素表 schema。\n字段规则本身统一在配置库维护; 绑定后清除旧的汇总缓存, 重跑提取即按\n新配置 (extract_project_schema 的合并机器与 schema 的 document_type\n无关, 只消费 config.fields)。","operationId":"put_api_v1_projects_project_id_summary_config","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/schema":{"get":{"tags":["projects"],"summary":"Get Project Schema","description":"P26: 项目要素表 schema 读取 (绑定配置字段; 未绑定则从提取结果反推)。","operationId":"get_api_v1_projects_project_id_schema","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["projects"],"summary":"Update Project Schema","description":"P26: 项目要素表 schema 配置保存 — 字段增删改/描述/权威源角色;\n共享默认配置自动 copy-on-write 为项目专属。保存后重跑提取生效。","operationId":"put_api_v1_projects_project_id_schema","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchemaUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/coverage":{"get":{"tags":["projects"],"summary":"Project Coverage","description":"P25: 字段×来源覆盖矩阵 — 每个要素字段由哪些文档供了什么值, 谁缺谁补。","operationId":"get_api_v1_projects_project_id_coverage","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/documents/{document_id}/versions":{"get":{"tags":["projects"],"summary":"Document Versions","description":"P1-6: 某文档在项目内的版本链历史 (含被 supersede 的旧挂载)。","operationId":"get_api_v1_projects_project_id_documents_document_id_versions","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"document_id","in":"path","required":true,"schema":{"type":"integer","title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/audit":{"get":{"tags":["projects"],"summary":"Project Audit","description":"P1-7: 项目操作审计轨迹 (挂载/替换/提取/清单编辑等事件)。","operationId":"get_api_v1_projects_project_id_audit","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/check-rules/parse":{"post":{"tags":["projects"],"summary":"Parse Check Rules Nl","description":"P38 · 自然语言 → 勾稽规则解析 (只解析不保存)。\n\n输入如「借据金额不能超过发行规模；起息日等于缴款通知书的缴款日期」,\n返回结构化规则数组 —— 前端并入规则网格, 用户确认后统一保存。","operationId":"post_api_v1_projects_project_id_check_rules_parse","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NLParseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/check-rules":{"get":{"tags":["projects"],"summary":"Get Check Rules","description":"P2-10: 跨文档勾稽规则 + 最近一次执行结果。","operationId":"get_api_v1_projects_project_id_check_rules","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["projects"],"summary":"Run Check Rules","description":"P2-10: 执行跨文档勾稽 (借据金额 ≤ 规模、评级主体 = 借款人 …)。","operationId":"post_api_v1_projects_project_id_check_rules","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["projects"],"summary":"Update Check Rules","operationId":"put_api_v1_projects_project_id_check_rules","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckRulesUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/export":{"get":{"tags":["projects"],"summary":"Export Project","description":"P0-3: 导出项目要素表 (xlsx: 要素表+冲突+材料清单 sheet)、非标投资端\n宽表 (wide: 一行×N列+字段明细) 或收卷报告 (docx)。前端一键下载,\n开放平台可直接拉取交付物。","operationId":"get_api_v1_projects_project_id_export","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"xlsx","title":"Format"}},{"name":"include_per_doc","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Per Doc"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/apply-template/{template_id}":{"post":{"tags":["projects"],"summary":"Apply Template","description":"P2-9: 模板一键应用 → 生成项目汇总配置 + 落勾稽规则。","operationId":"post_api_v1_projects_project_id_apply_template_template_id","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/lifecycle":{"get":{"tags":["projects"],"summary":"Lifecycle","description":"P1-8: 生命周期提示 (可归档判定/缺件提醒/到期日提醒)。","operationId":"get_api_v1_projects_project_id_lifecycle","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/experience/stats":{"get":{"tags":["experience"],"summary":"Experience Stats","description":"经验看板: 版式模板/别名词典/修正案例计数 + 最近修正 (错题本)。","operationId":"get_api_v1_experience_stats","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/experience/learning-trend":{"get":{"tags":["experience"],"summary":"Experience Learning Trend","description":"«越用越准» 趋势 (P1-5): 按周首次通过率 (approved/(approved+corrected))\n+ 经验资产累计。纠错反哺生效 → 首次通过率上扬; 前端画趋势曲线。","operationId":"get_api_v1_experience_learning_trend","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":7,"default":90,"title":"Days"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/events":{"get":{"tags":["sse"],"summary":"Events","description":"Unified event stream. ``topic`` ∈ {document_status (default), bulk_job,\nextraction_stage, review, task}.\n\nP-1008 · 租户隔离: caller 上下文 (sse_ticket/Bearer) 由 auth 中间件解析\n并写入 request.state; 非平台管理员只见本租户文档事件。","operationId":"get_api_v1_events","parameters":[{"name":"topic","in":"query","required":false,"schema":{"type":"string","default":"document_status","title":"Topic"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/events/documents":{"get":{"tags":["sse"],"summary":"Document Events","description":"Backward-compatible alias for the document-status stream.","operationId":"get_api_v1_events_documents","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/events/sse-ticket":{"post":{"tags":["sse"],"summary":"Issue Sse Ticket","description":"换一张一次性 SSE 连接票据。\n\nEventSource 无法携带 Authorization 头, ENFORCE_AUTH=true 时事件流必然\n401 —— 前端先以正常登录态调本端点, 再以 ?sse_ticket= 建流; 票据一次性\n消费、120s 过期, 断线重连前重新换取。","operationId":"post_api_v1_events_sse_ticket","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/":{"get":{"summary":"Root","operationId":"get_","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"tags":["core"]}},"/health":{"get":{"summary":"Health","description":"Enhanced health check — database, upload dir, disk space, queue depth,\nOCR engine, LLM config. Returns 200 healthy / 503 degraded.","operationId":"get_health","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"tags":["health"]}},"/health/readiness":{"get":{"summary":"Readiness","description":"Phase 4 · P4-7 — production readiness probe. Reports each external\ndependency as live / stub / degraded and whether the critical path\n(database + LLM + an OCR tier) is ready for production. Always 200 — the\nbody's ``ready_for_production`` flag carries the verdict (liveness probes\nmust never fail a rolling deploy on an optional integration being a stub).\n\n该路径在 _is_public 豁免(探针无凭据可达); 匿名调用只返回结论三元组,\n逐项依赖细节仅登录调用方可见。","operationId":"get_health_readiness","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"tags":["health"]}}},"components":{"schemas":{"AcceptInviteRequest":{"properties":{"token":{"type":"string","title":"Token"},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"}},"type":"object","required":["token","username","password"],"title":"AcceptInviteRequest"},"ActivateRequest":{"properties":{"license_key":{"type":"string","title":"License Key"},"activation_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Activation Code"},"fingerprint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fingerprint"}},"type":"object","required":["license_key"],"title":"ActivateRequest"},"ActivationRequestRequest":{"properties":{"license_key":{"type":"string","title":"License Key"},"fingerprint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fingerprint"}},"type":"object","required":["license_key"],"title":"ActivationRequestRequest"},"AddDocRequest":{"properties":{"document_id":{"type":"integer","title":"Document Id"}},"type":"object","required":["document_id"],"title":"AddDocRequest"},"AddDocumentRequest":{"properties":{"document_id":{"type":"integer","title":"Document Id"},"role":{"type":"string","title":"Role"}},"type":"object","required":["document_id","role"],"title":"AddDocumentRequest"},"AdminResetPassword":{"properties":{"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["new_password"],"title":"AdminResetPassword"},"AdversarialDatasetRequest":{"properties":{"source":{"type":"string","title":"Source"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"profile":{"type":"string","title":"Profile","default":"scan"},"seed":{"type":"integer","title":"Seed","default":42}},"type":"object","required":["source"],"title":"AdversarialDatasetRequest"},"AliasCreate":{"properties":{"doc_type":{"type":"string","title":"Doc Type"},"field_name":{"type":"string","title":"Field Name"},"alias":{"type":"string","title":"Alias"}},"type":"object","required":["doc_type","field_name","alias"],"title":"AliasCreate"},"AppCreate":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"flow_id":{"type":"integer","title":"Flow Id"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes"},"callback_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Callback Url"},"rate_limit_per_min":{"type":"integer","maximum":10000.0,"minimum":1.0,"title":"Rate Limit Per Min","default":60},"timeout_s":{"type":"integer","maximum":3600.0,"minimum":5.0,"title":"Timeout S","default":600},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tenant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tenant Id"}},"type":"object","required":["name","flow_id"],"title":"AppCreate"},"AppStatusUpdate":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"AppStatusUpdate"},"ApplyPolicyRequest":{"properties":{"fields":{"type":"object","title":"Fields"}},"type":"object","required":["fields"],"title":"ApplyPolicyRequest"},"ApplyRequest":{"properties":{"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"persist":{"type":"boolean","title":"Persist","default":false}},"type":"object","title":"ApplyRequest"},"AttachBatchRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AttachRequest"},"type":"array","minItems":1,"title":"Items"}},"type":"object","required":["items"],"title":"AttachBatchRequest"},"AttachRequest":{"properties":{"document_id":{"type":"integer","title":"Document Id"},"role":{"type":"string","maxLength":50,"minLength":1,"title":"Role"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"priority":{"anyOf":[{"type":"integer","maximum":999.0,"minimum":1.0},{"type":"null"}],"title":"Priority"},"supersedes_item_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Supersedes Item Id"},"period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"}},"type":"object","required":["document_id","role"],"title":"AttachRequest"},"BatchExportRequest":{"properties":{"document_ids":{"items":{"type":"integer"},"type":"array","title":"Document Ids"},"format":{"type":"string","title":"Format","default":"xlsx"},"include_corrections":{"type":"boolean","title":"Include Corrections","default":false}},"type":"object","required":["document_ids"],"title":"BatchExportRequest"},"BatchIngestRequest":{"properties":{"text":{"type":"string","title":"Text"},"strategy":{"type":"string","title":"Strategy","default":"auto"},"use_templates":{"type":"boolean","title":"Use Templates","default":true},"persist":{"type":"boolean","title":"Persist","default":false},"max_docs":{"type":"integer","title":"Max Docs","default":50}},"type":"object","required":["text"],"title":"BatchIngestRequest"},"BatchRequest":{"properties":{"document_ids":{"items":{"type":"integer"},"type":"array","title":"Document Ids"}},"type":"object","required":["document_ids"],"title":"BatchRequest"},"BindConfigRequest":{"properties":{"config_id":{"type":"integer","title":"Config Id"}},"type":"object","required":["config_id"],"title":"BindConfigRequest"},"Body_auto_generate_config_api_v1_extraction_configs_auto_generate_post":{"properties":{"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"},"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"}},"type":"object","title":"Body_auto_generate_config_api_v1_extraction_configs_auto_generate_post"},"Body_batch_upload_api_v1_documents_batch_upload_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"Body_batch_upload_api_v1_documents_batch_upload_post"},"Body_bulk_ingest_api_v1_documents_bulk_ingest_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"Body_bulk_ingest_api_v1_documents_bulk_ingest_post"},"Body_check_image_api_v1_authenticity_check_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_check_image_api_v1_authenticity_check_post"},"Body_claim_material_checklist_api_v1_classify_checklist_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"},"scenario":{"type":"string","title":"Scenario","default":"auto_insurance_claim"}},"type":"object","required":["files"],"title":"Body_claim_material_checklist_api_v1_classify_checklist_post"},"Body_classify_and_extract_api_v1_classify_and_extract_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"scenario":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scenario"}},"type":"object","required":["file"],"title":"Body_classify_and_extract_api_v1_classify_and_extract_post"},"Body_classify_document_api_v1_classify_document_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"scenario":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scenario"}},"type":"object","required":["file"],"title":"Body_classify_document_api_v1_classify_document_post"},"Body_create_execution_api_v1_open_v1_apps__app_id__executions_post":{"properties":{"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"},"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"}},"type":"object","title":"Body_create_execution_api_v1_open_v1_apps__app_id__executions_post"},"Body_detect_image_api_v1_seals_detect_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_detect_image_api_v1_seals_detect_post"},"Body_extract_bom_api_v1_bom_extract_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"}},"type":"object","required":["file"],"title":"Body_extract_bom_api_v1_bom_extract_post"},"Body_import_mapping_file_api_v1_mappings_import_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_import_mapping_file_api_v1_mappings_import_post"},"Body_import_wide_definition_api_v1_extraction_configs_import_wide_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"name":{"type":"string","title":"Name","default":"非标投资端宽表(导入)"},"document_type":{"type":"string","title":"Document Type","default":"nonstd_invest_wide"},"product_col":{"type":"integer","title":"Product Col","default":3}},"type":"object","required":["file"],"title":"Body_import_wide_definition_api_v1_extraction_configs_import_wide_post"},"Body_ingest_audio_api_v1_ingest_audio_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_ingest_audio_api_v1_ingest_audio_post"},"Body_ingest_files_api_v1_projects__project_id__ingest_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"},"paths":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paths"}},"type":"object","required":["files"],"title":"Body_ingest_files_api_v1_projects__project_id__ingest_post"},"Body_open_check_image_api_v1_authenticity_open_check_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_open_check_image_api_v1_authenticity_open_check_post"},"Body_open_classify_document_api_v1_classify_open_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"scenario":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scenario"}},"type":"object","required":["file"],"title":"Body_open_classify_document_api_v1_classify_open_post"},"Body_open_detect_image_api_v1_seals_open_detect_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_open_detect_image_api_v1_seals_open_detect_post"},"Body_open_extract_bom_api_v1_bom_open_extract_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"}},"type":"object","required":["file"],"title":"Body_open_extract_bom_api_v1_bom_open_extract_post"},"Body_precheck_upload_api_v1_documents_precheck_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_precheck_upload_api_v1_documents_precheck_post"},"Body_publish_extract_api_v1_publish_extract_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_publish_extract_api_v1_publish_extract_post"},"Body_try_extract_api_v1_public_try_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_try_extract_api_v1_public_try_post"},"Body_upload_document_api_v1_documents_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_document_api_v1_documents_upload_post"},"BootstrapRequest":{"properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","title":"BootstrapRequest"},"BuildClaimRequest":{"properties":{"claim_document_id":{"type":"integer","title":"Claim Document Id"},"evidence_document_ids":{"items":{"type":"integer"},"type":"array","title":"Evidence Document Ids","default":[]},"policy_document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Policy Document Id"},"id_document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id Document Id"},"tenant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tenant Id"}},"type":"object","required":["claim_document_id"],"title":"BuildClaimRequest"},"BundleImportRequest":{"properties":{"bundle":{"type":"object","title":"Bundle"},"activate_flows":{"type":"boolean","title":"Activate Flows","default":false}},"type":"object","required":["bundle"],"title":"BundleImportRequest"},"ChangePasswordRequest":{"properties":{"old_password":{"type":"string","title":"Old Password"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["old_password","new_password"],"title":"ChangePasswordRequest"},"CheckRulesUpdate":{"properties":{"rules":{"items":{"type":"object"},"type":"array","title":"Rules"}},"type":"object","required":["rules"],"title":"CheckRulesUpdate"},"ChecklistUpdate":{"properties":{"checklist":{"items":{"type":"object"},"type":"array","title":"Checklist"}},"type":"object","required":["checklist"],"title":"ChecklistUpdate"},"CheckoutRequest":{"properties":{"amount_cents":{"type":"integer","minimum":1.0,"title":"Amount Cents","description":"充值金额 (分), 1 credit = ¥0.01"},"provider":{"type":"string","title":"Provider","description":"支付渠道: wechat (优先) | alipay","default":"wechat"},"success_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Success Url"}},"type":"object","required":["amount_cents"],"title":"CheckoutRequest"},"CloudFetchRequest":{"properties":{"provider":{"type":"string","title":"Provider"},"config":{"type":"object","title":"Config","default":{}},"limit":{"type":"integer","title":"Limit","default":20}},"type":"object","required":["provider"],"title":"CloudFetchRequest"},"CompareEnginesRequest":{"properties":{"document_id":{"type":"integer","title":"Document Id"}},"type":"object","required":["document_id"],"title":"CompareEnginesRequest"},"CompleteTaskRequest":{"properties":{"decision":{"type":"string","title":"Decision"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["decision"],"title":"CompleteTaskRequest"},"ConfirmRequest":{"properties":{"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"}},"type":"object","title":"ConfirmRequest"},"ConflictResolveAllRequest":{"properties":{"strategy":{"type":"string","title":"Strategy","default":"majority"}},"type":"object","title":"ConflictResolveAllRequest"},"ConnectorCreate":{"properties":{"name":{"type":"string","title":"Name"},"provider":{"type":"string","title":"Provider"},"config":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Config"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret"},"is_active":{"type":"boolean","title":"Is Active","default":true},"tenant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tenant Id"}},"type":"object","required":["name","provider"],"title":"ConnectorCreate"},"CorrectedDatasetRequest":{"properties":{"doc_type":{"type":"string","title":"Doc Type"},"min_samples":{"type":"integer","title":"Min Samples","default":10}},"type":"object","required":["doc_type"],"title":"CorrectedDatasetRequest"},"CorrectionRequest":{"properties":{"field_name":{"type":"string","title":"Field Name"},"correct_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Correct Value"},"label_alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label Alias"},"snippet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snippet"}},"type":"object","required":["field_name"],"title":"CorrectionRequest"},"CreateBundleRequest":{"properties":{"name":{"type":"string","title":"Name"},"case_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Case Ref"},"bundle_type":{"type":"string","title":"Bundle Type","default":"general"},"roles":{"items":{"type":"string"},"type":"array","title":"Roles","default":[]},"rules":{"items":{"type":"object"},"type":"array","title":"Rules","default":[]}},"type":"object","required":["name"],"title":"CreateBundleRequest"},"CreateConversationRequest":{"properties":{"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"},"document_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Document Ids"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},"type":"object","title":"CreateConversationRequest"},"CreateJobRequest":{"properties":{"doc_type":{"type":"string","title":"Doc Type"},"samples":{"items":{"$ref":"#/components/schemas/SampleItem"},"type":"array","title":"Samples"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","default":""}},"type":"object","required":["doc_type","samples"],"title":"CreateJobRequest"},"CreateMultiTemplateRequest":{"properties":{"name":{"type":"string","title":"Name"},"sample_texts":{"items":{"type":"string"},"type":"array","title":"Sample Texts","default":[]},"document_ids":{"items":{"type":"integer"},"type":"array","title":"Document Ids","default":[]},"fields":{"items":{"$ref":"#/components/schemas/LabeledField"},"type":"array","title":"Fields"},"document_type":{"type":"string","title":"Document Type","default":"general"},"auto_approve_threshold":{"type":"number","title":"Auto Approve Threshold","default":0.85}},"type":"object","required":["name","fields"],"title":"CreateMultiTemplateRequest"},"CreateSourceRequest":{"properties":{"name":{"type":"string","title":"Name"},"kind":{"type":"string","enum":["db","rest","csv"],"title":"Kind"},"config":{"type":"object","title":"Config"}},"type":"object","required":["name","kind","config"],"title":"CreateSourceRequest"},"CreateTaskRequest":{"properties":{"title":{"type":"string","title":"Title"},"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"},"bundle_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bundle Id"},"assignee_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Assignee Id"},"priority":{"type":"integer","title":"Priority","default":5},"due_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due At"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["title"],"title":"CreateTaskRequest"},"CreateTemplateRequest":{"properties":{"name":{"type":"string","title":"Name"},"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"fields":{"items":{"$ref":"#/components/schemas/LabeledField"},"type":"array","title":"Fields"},"document_type":{"type":"string","title":"Document Type","default":"general"},"auto_approve_threshold":{"type":"number","title":"Auto Approve Threshold","default":0.85}},"type":"object","required":["name","fields"],"title":"CreateTemplateRequest"},"CreditLineRequest":{"properties":{"credit_line_cents":{"type":"integer","minimum":0.0,"title":"Credit Line Cents","description":"月结授信额度 (分), 0=纯预付费"}},"type":"object","required":["credit_line_cents"],"title":"CreditLineRequest"},"DashboardStats":{"properties":{"total_documents":{"type":"integer","title":"Total Documents"},"pending_documents":{"type":"integer","title":"Pending Documents"},"processing_documents":{"type":"integer","title":"Processing Documents"},"completed_documents":{"type":"integer","title":"Completed Documents"},"failed_documents":{"type":"integer","title":"Failed Documents"},"total_workflows":{"type":"integer","title":"Total Workflows"},"active_workflows":{"type":"integer","title":"Active Workflows","default":0},"avg_confidence":{"type":"number","title":"Avg Confidence"},"documents_today":{"type":"integer","title":"Documents Today"}},"type":"object","required":["total_documents","pending_documents","processing_documents","completed_documents","failed_documents","total_workflows","avg_confidence","documents_today"],"title":"DashboardStats"},"DiscoverRequest":{"properties":{"doc_type":{"type":"string","title":"Doc Type"},"document_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Document Ids"},"use_llm":{"type":"boolean","title":"Use Llm","default":false}},"type":"object","required":["doc_type"],"title":"DiscoverRequest"},"DispatchRequest":{"properties":{"event":{"type":"string","title":"Event"},"document_id":{"type":"integer","title":"Document Id"},"channels":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Channels"}},"type":"object","required":["event","document_id"],"title":"DispatchRequest"},"DlpRequest":{"properties":{"fields":{"type":"object","title":"Fields"},"block_pii":{"type":"boolean","title":"Block Pii","default":true}},"type":"object","required":["fields"],"title":"DlpRequest"},"DocumentDetail":{"properties":{"id":{"type":"integer","title":"Id"},"filename":{"type":"string","title":"Filename"},"original_filename":{"type":"string","title":"Original Filename"},"file_type":{"type":"string","title":"File Type"},"file_size":{"type":"integer","title":"File Size"},"mime_type":{"type":"string","title":"Mime Type"},"status":{"type":"string","title":"Status"},"page_count":{"type":"integer","title":"Page Count"},"text_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text Content"},"ocr_confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ocr Confidence"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"metadata_":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Metadata"},"workflow_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Workflow Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","filename","original_filename","file_type","file_size","mime_type","status","page_count","text_content","ocr_confidence","error_message","metadata_","workflow_id","created_at","updated_at"],"title":"DocumentDetail"},"DocumentUploadResponse":{"properties":{"id":{"type":"integer","title":"Id"},"filename":{"type":"string","title":"Filename"},"original_filename":{"type":"string","title":"Original Filename"},"file_type":{"type":"string","title":"File Type"},"file_size":{"type":"integer","title":"File Size"},"status":{"type":"string","title":"Status"},"page_count":{"type":"integer","title":"Page Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","filename","original_filename","file_type","file_size","status","page_count","created_at"],"title":"DocumentUploadResponse"},"EnhanceRequest":{"properties":{"payload_b64":{"type":"string","title":"Payload B64"},"strength":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strength"}},"type":"object","required":["payload_b64"],"title":"EnhanceRequest"},"EnrichRequest":{"properties":{"fields":{"type":"object","title":"Fields"},"key":{"type":"string","title":"Key"},"mapping":{"additionalProperties":{"type":"string"},"type":"object","title":"Mapping"}},"type":"object","required":["fields","key","mapping"],"title":"EnrichRequest"},"EntityUpsert":{"properties":{"name":{"type":"string","title":"Name"},"credit_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credit Code"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry"},"province":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Province"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"county":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"County"},"entity_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Type"},"tenant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tenant Id"}},"type":"object","required":["name"],"title":"EntityUpsert"},"ErpVoucherExportRequest":{"properties":{"document_ids":{"items":{"type":"integer"},"type":"array","title":"Document Ids"},"erp":{"type":"string","title":"Erp"},"include_corrections":{"type":"boolean","title":"Include Corrections","default":true}},"type":"object","required":["document_ids","erp"],"title":"ErpVoucherExportRequest"},"ExtractionConfigCreate":{"properties":{"name":{"type":"string","title":"Name"},"document_type":{"type":"string","title":"Document Type","default":"general"},"fields":{"items":{"$ref":"#/components/schemas/ExtractionFieldDef"},"type":"array","title":"Fields","default":[]},"is_default":{"type":"boolean","title":"Is Default","default":false},"auto_approve_threshold":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Auto Approve Threshold"},"engine_override":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Engine Override"},"route_budget":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Route Budget"}},"type":"object","required":["name"],"title":"ExtractionConfigCreate"},"ExtractionConfigDetail":{"properties":{"name":{"type":"string","title":"Name"},"document_type":{"type":"string","title":"Document Type","default":"general"},"fields":{"items":{"$ref":"#/components/schemas/ExtractionFieldDef"},"type":"array","title":"Fields","default":[]},"is_default":{"type":"boolean","title":"Is Default","default":false},"auto_approve_threshold":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Auto Approve Threshold"},"engine_override":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Engine Override"},"route_budget":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Route Budget"},"id":{"type":"integer","title":"Id"},"tenant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tenant Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["name","id","created_at","updated_at"],"title":"ExtractionConfigDetail"},"ExtractionFieldDef":{"properties":{"name":{"type":"string","title":"Name"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"type":{"type":"string","title":"Type","default":"text"},"required":{"type":"boolean","title":"Required","default":false},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"validation_rules":{"anyOf":[{"items":{"anyOf":[{"type":"object"},{"type":"string"}]},"type":"array"},{"type":"null"}],"title":"Validation Rules"}},"type":"object","required":["name"],"title":"ExtractionFieldDef","description":"A single field's extraction specification. ``prompt`` is the field-level\nextraction hint the LLM extractor weaves into its system prompt.\nP1-9: ``validation_rules`` 携带字段级校验规则 DSL(见 pipeline.validator),\n抽取后由 run_field_validation 连同内置领域模型规则一并执行。"},"ExtractionItem":{"properties":{"id":{"type":"integer","title":"Id"},"field_name":{"type":"string","title":"Field Name"},"field_value":{"type":"string","title":"Field Value"},"confidence":{"type":"number","title":"Confidence"},"source_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Page"},"extraction_method":{"type":"string","title":"Extraction Method"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"provenance":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Provenance"}},"type":"object","required":["id","field_name","field_value","confidence","source_page","extraction_method","created_at"],"title":"ExtractionItem"},"ExtractionResult":{"properties":{"document_id":{"type":"integer","title":"Document Id"},"extractions":{"items":{"$ref":"#/components/schemas/ExtractionItem"},"type":"array","title":"Extractions"}},"type":"object","required":["document_id","extractions"],"title":"ExtractionResult"},"ExtractionsImportRequest":{"properties":{"fields":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"items":{"$ref":"#/components/schemas/ImportedField"},"type":"array"}],"title":"Fields"}},"type":"object","required":["fields"],"title":"ExtractionsImportRequest"},"FeedbackRequest":{"properties":{"corrections":{"additionalProperties":{"type":"string"},"type":"object","title":"Corrections"}},"type":"object","required":["corrections"],"title":"FeedbackRequest"},"FieldMapEntry":{"properties":{"source":{"type":"string","title":"Source"},"target":{"type":"string","title":"Target"},"type":{"type":"string","title":"Type","default":"string"},"required":{"type":"boolean","title":"Required","default":false}},"type":"object","required":["source","target"],"title":"FieldMapEntry"},"FieldOverrideRequest":{"properties":{"value":{"title":"Value"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"reason_tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Tag"}},"type":"object","required":["value"],"title":"FieldOverrideRequest"},"FieldPolicyRequest":{"properties":{"role":{"type":"string","title":"Role"},"field_name":{"type":"string","title":"Field Name"},"action":{"type":"string","title":"Action"}},"type":"object","required":["role","field_name","action"],"title":"FieldPolicyRequest"},"FlowCreate":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"document_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Type"},"graph":{"anyOf":[{"$ref":"#/components/schemas/FlowGraph"},{"type":"null"}]}},"type":"object","required":["name"],"title":"FlowCreate"},"FlowEdge":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"source":{"type":"string","title":"Source"},"target":{"type":"string","title":"Target"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"condition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condition"}},"type":"object","required":["source","target"],"title":"FlowEdge"},"FlowGraph":{"properties":{"nodes":{"items":{"$ref":"#/components/schemas/FlowNode"},"type":"array","title":"Nodes","default":[]},"edges":{"items":{"$ref":"#/components/schemas/FlowEdge"},"type":"array","title":"Edges","default":[]}},"type":"object","title":"FlowGraph"},"FlowImportRequest":{"properties":{"flow_id":{"type":"integer","title":"Flow Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","required":["flow_id"],"title":"FlowImportRequest"},"FlowNode":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","title":"Type"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"params":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Params"},"position":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Position"}},"type":"object","required":["id","type"],"title":"FlowNode"},"FlowUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"document_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Type"},"graph":{"anyOf":[{"$ref":"#/components/schemas/FlowGraph"},{"type":"null"}]}},"type":"object","title":"FlowUpdate"},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest"},"FromCorrectionsRequest":{"properties":{"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"},"limit":{"type":"integer","title":"Limit","default":500}},"type":"object","title":"FromCorrectionsRequest"},"GenerateAllRequest":{"properties":{"types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Types"},"force":{"type":"boolean","title":"Force","default":false},"use_llm":{"type":"boolean","title":"Use Llm","default":true}},"type":"object","title":"GenerateAllRequest"},"GenerateRequest":{"properties":{"customer_name":{"type":"string","title":"Customer Name"},"edition":{"type":"string","title":"Edition","default":"private"},"days":{"type":"integer","title":"Days","default":365},"max_documents":{"type":"integer","title":"Max Documents","default":0},"max_seats":{"type":"integer","title":"Max Seats","default":0},"max_nodes":{"type":"integer","title":"Max Nodes","default":0},"features":{"items":{"type":"string"},"type":"array","title":"Features","default":[]},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["customer_name"],"title":"GenerateRequest"},"GlobalQARequest":{"properties":{"question":{"type":"string","title":"Question"},"top_k":{"type":"integer","title":"Top K","default":5}},"type":"object","required":["question"],"title":"GlobalQARequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImportRequest":{"properties":{"package":{"type":"object","title":"Package"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","required":["package"],"title":"ImportRequest"},"ImportedField":{"properties":{"name":{"type":"string","title":"Name"},"value":{"type":"string","title":"Value"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"}},"type":"object","required":["name","value"],"title":"ImportedField"},"InviteRequest":{"properties":{"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role","default":"viewer"}},"type":"object","required":["email"],"title":"InviteRequest"},"InvoiceIssuedRequest":{"properties":{"issued_number":{"type":"string","title":"Issued Number","default":""},"ok":{"type":"boolean","title":"Ok","default":true},"note":{"type":"string","title":"Note","default":""}},"type":"object","title":"InvoiceIssuedRequest"},"InvoiceRequestModel":{"properties":{"title":{"type":"string","title":"Title"},"tax_id":{"type":"string","title":"Tax Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"invoice_type":{"type":"string","title":"Invoice Type","default":"normal"}},"type":"object","required":["title","tax_id"],"title":"InvoiceRequestModel"},"KBCreate":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"},"chunk_size":{"type":"integer","title":"Chunk Size","default":500},"chunk_overlap":{"type":"integer","title":"Chunk Overlap","default":50},"use_embeddings":{"type":"boolean","title":"Use Embeddings","default":false},"embedding_model":{"type":"string","title":"Embedding Model","default":"bge-small-zh-v1.5"}},"type":"object","required":["name"],"title":"KBCreate"},"KBUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"chunk_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Chunk Size"},"chunk_overlap":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Chunk Overlap"},"use_embeddings":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Embeddings"},"embedding_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embedding Model"}},"type":"object","title":"KBUpdate"},"KeyCreate":{"properties":{"name":{"type":"string","title":"Name"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes"},"quota_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quota Limit"},"quota_period_days":{"type":"integer","title":"Quota Period Days","default":30}},"type":"object","required":["name"],"title":"KeyCreate"},"LLMConfigTestRequest":{"properties":{"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"},"api_base":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Base"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"model_extract":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Extract"},"model_classify":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Classify"},"model_decide":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Decide"},"vlm_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vlm Model"}},"type":"object","title":"LLMConfigTestRequest","description":"Test-connection payload: same fields as the config; omitted fields use\nthe current effective config (unsaved values may be supplied to test a\ncandidate config before saving)."},"LLMConfigUpdate":{"properties":{"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"},"api_base":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Base"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"model_extract":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Extract"},"model_classify":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Classify"},"model_decide":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Decide"},"vlm_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vlm Model"}},"type":"object","title":"LLMConfigUpdate","description":"Partial update — omitted fields stay unchanged; empty string clears to\nthe .env baseline. ``api_key`` is write-only (encrypted at rest)."},"LabeledField":{"properties":{"name":{"type":"string","title":"Name"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Required"}},"type":"object","required":["name"],"title":"LabeledField"},"LeadCreate":{"properties":{"company":{"type":"string","maxLength":200,"minLength":1,"title":"Company"},"contact_name":{"type":"string","maxLength":100,"minLength":1,"title":"Contact Name"},"email":{"type":"string","maxLength":200,"minLength":3,"title":"Email"},"phone":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Phone"},"scene":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Scene"},"attribution":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Attribution"}},"type":"object","required":["company","contact_name","email"],"title":"LeadCreate"},"LeadStatusRequest":{"properties":{"status":{"type":"string","title":"Status"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["status"],"title":"LeadStatusRequest"},"LoginRequest":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"mfa_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mfa Code"}},"type":"object","required":["username","password"],"title":"LoginRequest"},"MappingCreate":{"properties":{"name":{"type":"string","title":"Name"},"source_doc_type":{"type":"string","title":"Source Doc Type"},"field_map":{"items":{"$ref":"#/components/schemas/FieldMapEntry"},"type":"array","title":"Field Map"},"target_kind":{"type":"string","title":"Target Kind","default":"api"},"target_name":{"type":"string","title":"Target Name","default":""}},"type":"object","required":["name","source_doc_type","field_map"],"title":"MappingCreate"},"MappingUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"field_map":{"anyOf":[{"items":{"$ref":"#/components/schemas/FieldMapEntry"},"type":"array"},{"type":"null"}],"title":"Field Map"},"target_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Kind"},"target_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Name"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"MappingUpdate"},"MemberCreate":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"role":{"type":"string","title":"Role","default":"reviewer"}},"type":"object","required":["username","password"],"title":"MemberCreate"},"MemberRoleUpdate":{"properties":{"role":{"type":"string","title":"Role"}},"type":"object","required":["role"],"title":"MemberRoleUpdate"},"MfaEnableRequest":{"properties":{"secret":{"type":"string","title":"Secret"},"code":{"type":"string","title":"Code"}},"type":"object","required":["secret","code"],"title":"MfaEnableRequest"},"ModelRoutingUpdate":{"properties":{"classify":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Classify"},"extract":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extract"},"decide":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decide"}},"type":"object","title":"ModelRoutingUpdate"},"NLParseRequest":{"properties":{"text":{"type":"string","maxLength":2000,"minLength":2,"title":"Text"}},"type":"object","required":["text"],"title":"NLParseRequest"},"NoteRequest":{"properties":{"note":{"type":"string","title":"Note","default":""}},"type":"object","title":"NoteRequest"},"OutcomeRequest":{"properties":{"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"},"outcome":{"type":"string","title":"Outcome"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"source_system":{"type":"string","title":"Source System","default":"manual"},"field_issues":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Field Issues"}},"type":"object","required":["outcome"],"title":"OutcomeRequest"},"PaymentProofRequest":{"properties":{"reference":{"type":"string","title":"Reference"},"memo":{"type":"string","title":"Memo","default":""}},"type":"object","required":["reference"],"title":"PaymentProofRequest"},"PiiPolicyRequest":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"entity_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Entity Types"},"apply_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Apply To"}},"type":"object","title":"PiiPolicyRequest"},"PocReportRequest":{"properties":{"customer":{"type":"string","title":"Customer"},"doc_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Doc Types"},"period_days":{"type":"integer","title":"Period Days","default":14}},"type":"object","required":["customer"],"title":"PocReportRequest"},"PricingUpdateRequest":{"properties":{"page_price_cents":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":1.0},{"type":"null"}],"title":"Page Price Cents"},"run_price_cents":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":1.0},{"type":"null"}],"title":"Run Price Cents","description":"按次单价 (分/次), per_run 计费口径"},"starting_grant_cents":{"anyOf":[{"type":"integer","maximum":1000000.0,"minimum":0.0},{"type":"null"}],"title":"Starting Grant Cents"},"referral_bonus_cents":{"anyOf":[{"type":"integer","maximum":1000000.0,"minimum":0.0},{"type":"null"}],"title":"Referral Bonus Cents"},"low_balance_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":1.0},{"type":"null"}],"title":"Low Balance Days"},"topup_min_cents":{"anyOf":[{"type":"integer","maximum":100000000.0,"minimum":1.0},{"type":"null"}],"title":"Topup Min Cents"},"topup_max_cents":{"anyOf":[{"type":"integer","maximum":100000000.0,"minimum":100.0},{"type":"null"}],"title":"Topup Max Cents"}},"type":"object","title":"PricingUpdateRequest"},"ProjectCreate":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"project_no":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project No"},"project_type":{"type":"string","title":"Project Type","default":"general"},"client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Name"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"install_trust_kit":{"type":"boolean","title":"Install Trust Kit","default":false},"tenant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tenant Id"}},"type":"object","required":["name"],"title":"ProjectCreate"},"ProjectExtractRequest":{"properties":{"config_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Config Id"},"mode":{"type":"string","title":"Mode","default":"auto"}},"type":"object","title":"ProjectExtractRequest"},"ProjectExtractTypeRequest":{"properties":{"document_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Type"},"config_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Config Id"},"document_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Document Ids"},"mode":{"type":"string","title":"Mode","default":"auto"}},"type":"object","title":"ProjectExtractTypeRequest","description":"按单证类型批量提取: 从多份挂载文档中提取该类型的字段矩阵 (P27)。"},"PromptVersionCreate":{"properties":{"doc_type":{"type":"string","title":"Doc Type"},"prompt":{"type":"string","title":"Prompt"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["doc_type","prompt"],"title":"PromptVersionCreate"},"PublishRequest":{"properties":{"is_public":{"type":"boolean","title":"Is Public","default":true},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"}},"type":"object","title":"PublishRequest"},"PushDocRequest":{"properties":{"document_id":{"type":"integer","title":"Document Id"},"adapter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Adapter"},"mapping_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mapping Id"},"endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint"},"token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},"type":"object","required":["document_id"],"title":"PushDocRequest"},"QARequest":{"properties":{"question":{"type":"string","title":"Question"},"history":{"anyOf":[{"items":{"type":"object"},"type":"array"},{"type":"null"}],"title":"History"}},"type":"object","required":["question"],"title":"QARequest"},"ReassignRequest":{"properties":{"assignee_id":{"type":"integer","title":"Assignee Id"}},"type":"object","required":["assignee_id"],"title":"ReassignRequest"},"RechargeConfirmRequest":{"properties":{"proof_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proof Reference"}},"type":"object","title":"RechargeConfirmRequest"},"RechargeCreateRequest":{"properties":{"tenant_id":{"type":"integer","title":"Tenant Id"},"amount_cents":{"type":"integer","title":"Amount Cents"},"grant_kind":{"type":"string","title":"Grant Kind","default":"credit_topup"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["tenant_id","amount_cents"],"title":"RechargeCreateRequest"},"RedactRequest":{"properties":{"text":{"type":"string","title":"Text"},"entity_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Entity Types"},"mode":{"type":"string","title":"Mode","default":"mask"}},"type":"object","required":["text"],"title":"RedactRequest"},"RefundRequest":{"properties":{"amount_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Amount Cents"}},"type":"object","title":"RefundRequest"},"ReportRequest":{"properties":{"dataset":{"type":"string","title":"Dataset"},"manual_min_per_doc":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Manual Min Per Doc"},"hourly_rate_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hourly Rate Usd"}},"type":"object","required":["dataset"],"title":"ReportRequest"},"ResetPasswordRequest":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["token","new_password"],"title":"ResetPasswordRequest"},"ResidencyRequest":{"properties":{"tenant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tenant Id"},"doc_region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Region"}},"type":"object","title":"ResidencyRequest"},"ResolveItem":{"properties":{"document_id":{"type":"integer","title":"Document Id"},"field_name":{"type":"string","title":"Field Name"}},"type":"object","required":["document_id","field_name"],"title":"ResolveItem"},"ResolveRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ResolveItem"},"type":"array","title":"Items"},"action":{"type":"string","title":"Action"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["items","action"],"title":"ResolveRequest"},"RetentionRequest":{"properties":{"retention_days":{"type":"integer","title":"Retention Days"}},"type":"object","required":["retention_days"],"title":"RetentionRequest"},"RetrainRequest":{"properties":{"doc_type":{"type":"string","title":"Doc Type"}},"type":"object","required":["doc_type"],"title":"RetrainRequest"},"ReviewCreate":{"properties":{"status":{"type":"string","title":"Status"},"corrections":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Corrections"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"},"reviewer":{"type":"string","title":"Reviewer","default":"user"}},"type":"object","required":["status"],"title":"ReviewCreate"},"ReviewDetail":{"properties":{"id":{"type":"integer","title":"Id"},"document_id":{"type":"integer","title":"Document Id"},"reviewer":{"type":"string","title":"Reviewer"},"status":{"type":"string","title":"Status"},"corrections":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Corrections"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"learning":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Learning"}},"type":"object","required":["id","document_id","reviewer","status","corrections","comment","created_at","updated_at"],"title":"ReviewDetail"},"RevokeRequest":{"properties":{"license_id":{"type":"integer","title":"License Id"}},"type":"object","required":["license_id"],"title":"RevokeRequest"},"RoiCalculateRequest":{"properties":{"monthly_docs":{"type":"integer","minimum":1.0,"title":"Monthly Docs","description":"月单量","default":1},"pages_per_doc":{"type":"number","minimum":0.0,"title":"Pages Per Doc","description":"均页数","default":0},"minutes_per_page":{"type":"number","minimum":0.0,"title":"Minutes Per Page","description":"人工每页分钟","default":0},"operator_hourly_cost":{"type":"number","minimum":0.0,"title":"Operator Hourly Cost","description":"人工时薪（元）","default":0},"error_rate_pct":{"type":"number","minimum":0.0,"title":"Error Rate Pct","description":"人工错误率（%）","default":0},"rework_minutes_per_error":{"type":"number","minimum":0.0,"title":"Rework Minutes Per Error","description":"单错返工分钟","default":0},"platform_monthly_cost":{"type":"number","minimum":0.0,"title":"Platform Monthly Cost","description":"平台费（元/月）","default":0},"llm_cost_30d":{"type":"number","minimum":0.0,"title":"Llm Cost 30D","description":"LLM 实际成本（元/月）","default":0},"use_llm_actual":{"type":"boolean","title":"Use Llm Actual","description":"用当前租户近 30 天 LLM 实际成本覆盖 llm_cost_30d","default":false}},"type":"object","title":"RoiCalculateRequest","description":"数值 ≥0、monthly_docs ≥1,违反 422;service 层保持宽容。"},"RoleUpdate":{"properties":{"role":{"type":"string","title":"Role"}},"type":"object","required":["role"],"title":"RoleUpdate"},"RouteCreate":{"properties":{"name":{"type":"string","title":"Name"},"purpose":{"type":"string","title":"Purpose"},"strategy":{"type":"string","title":"Strategy","default":"single"},"variants":{"items":{"$ref":"#/components/schemas/VariantSpec"},"type":"array","title":"Variants"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["name","purpose","variants"],"title":"RouteCreate"},"RoutePatch":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"strategy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strategy"},"variants":{"anyOf":[{"items":{"$ref":"#/components/schemas/VariantSpec"},"type":"array"},{"type":"null"}],"title":"Variants"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"RoutePatch","description":"Partial update (P2-17): only supplied fields change. Primarily the\nenable/disable switch; name/description/strategy/variants stay editable."},"RuleRequest":{"properties":{"name":{"type":"string","title":"Name"},"event":{"type":"string","title":"Event"},"channels":{"items":{"type":"string"},"type":"array","title":"Channels"},"config":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Config"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["name","event","channels"],"title":"RuleRequest"},"RuleUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"event":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event"},"channels":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Channels"},"config":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Config"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"RuleUpdate"},"RunResponse":{"properties":{"document_id":{"type":"integer","title":"Document Id"},"checks":{"type":"object","title":"Checks"}},"type":"object","required":["document_id","checks"],"title":"RunResponse"},"SampleItem":{"properties":{"fields":{"type":"object","title":"Fields"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","default":"manual"},"source_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Text"}},"type":"object","required":["fields"],"title":"SampleItem"},"SaveAsTemplateRequest":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tenant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tenant Id"}},"type":"object","required":["name"],"title":"SaveAsTemplateRequest"},"ScanRequest":{"properties":{"text":{"type":"string","title":"Text"},"entity_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Entity Types"}},"type":"object","required":["text"],"title":"ScanRequest"},"ScheduleCreate":{"properties":{"name":{"type":"string","title":"Name"},"source":{"type":"string","title":"Source"},"interval_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval Seconds"},"cron":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cron"},"config":{"type":"object","title":"Config","default":{}},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["name","source"],"title":"ScheduleCreate"},"ScheduleUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"interval_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval Seconds"},"cron":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cron"},"config":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Config"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"ScheduleUpdate"},"SchemaField":{"properties":{"name":{"type":"string","title":"Name"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Required"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},"type":"object","required":["name"],"title":"SchemaField"},"SchemaUpdate":{"properties":{"fields":{"items":{"type":"object"},"type":"array","minItems":1,"title":"Fields"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","required":["fields"],"title":"SchemaUpdate"},"ScimPatch":{"properties":{"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayname"}},"type":"object","title":"ScimPatch"},"ScimUserCreate":{"properties":{"userName":{"type":"string","title":"Username"},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayname"},"active":{"type":"boolean","title":"Active","default":true},"emails":{"anyOf":[{"items":{"type":"object"},"type":"array"},{"type":"null"}],"title":"Emails"}},"type":"object","required":["userName"],"title":"ScimUserCreate"},"SearchRequest":{"properties":{"query":{"type":"string","title":"Query"},"top_k":{"type":"integer","title":"Top K","default":5},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"}},"type":"object","required":["query"],"title":"SearchRequest"},"SendMessageRequest":{"properties":{"role":{"type":"string","title":"Role","default":"user"},"content":{"type":"string","title":"Content"}},"type":"object","required":["content"],"title":"SendMessageRequest"},"SetDocumentTypeRequest":{"properties":{"document_type":{"type":"string","title":"Document Type"}},"type":"object","required":["document_type"],"title":"SetDocumentTypeRequest"},"SignupRequest":{"properties":{"name":{"type":"string","title":"Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref"},"attribution":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Attribution"},"try_seed_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Try Seed Id"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry"}},"type":"object","required":["name","username","password"],"title":"SignupRequest"},"SplitTextRequest":{"properties":{"text":{"type":"string","title":"Text"},"strategy":{"type":"string","title":"Strategy","default":"auto"},"delimiter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delimiter"},"create_documents":{"type":"boolean","title":"Create Documents","default":false}},"type":"object","required":["text"],"title":"SplitTextRequest"},"StatusUpdate":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"StatusUpdate"},"SuggestRequest":{"properties":{"auto_assign":{"type":"boolean","title":"Auto Assign","default":false}},"type":"object","title":"SuggestRequest"},"SuspendRequest":{"properties":{"reason":{"type":"string","title":"Reason","default":""}},"type":"object","title":"SuspendRequest"},"TemplateCreate":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"project_type":{"type":"string","title":"Project Type","default":"general"},"fields":{"items":{"type":"object"},"type":"array","minItems":1,"title":"Fields"},"check_rules":{"anyOf":[{"items":{"type":"object"},"type":"array"},{"type":"null"}],"title":"Check Rules"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tenant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tenant Id"}},"type":"object","required":["name","fields"],"title":"TemplateCreate"},"TenantCreate":{"properties":{"name":{"type":"string","title":"Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"admin_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Username"},"admin_password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Password"},"admin_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Display Name"}},"type":"object","required":["name"],"title":"TenantCreate"},"TenantSettingsUpdate":{"properties":{"llm_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Provider"},"llm_api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Api Key"},"llm_api_base":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Api Base"},"llm_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Model"},"llm_vlm_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Vlm Model"},"app_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Name"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"favicon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Favicon Url"},"primary_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Color"},"login_subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Login Subtitle"},"custom_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Domain"}},"type":"object","title":"TenantSettingsUpdate"},"TestRequest":{"properties":{"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"},"fields":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Fields"},"enforce_contract":{"type":"boolean","title":"Enforce Contract","default":true}},"type":"object","title":"TestRequest"},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"user":{"type":"object","title":"User"}},"type":"object","required":["access_token","user"],"title":"TokenResponse"},"TrackRequest":{"properties":{"path":{"type":"string","maxLength":300,"minLength":1,"title":"Path"},"session_id":{"type":"string","maxLength":64,"minLength":1,"title":"Session Id"},"referrer":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Referrer"},"utm":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Utm"},"landing_path":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Landing Path"},"event":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Event"},"label":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Label"}},"type":"object","required":["path","session_id"],"title":"TrackRequest"},"TranslateField":{"properties":{"name":{"type":"string","title":"Name"},"value":{"type":"string","title":"Value","default":""}},"type":"object","required":["name"],"title":"TranslateField"},"TranslateRequest":{"properties":{"target_lang":{"type":"string","title":"Target Lang"},"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"},"fields":{"anyOf":[{"items":{"$ref":"#/components/schemas/TranslateField"},"type":"array"},{"type":"null"}],"title":"Fields"}},"type":"object","required":["target_lang"],"title":"TranslateRequest"},"UpdateRulesRequest":{"properties":{"rules":{"items":{"type":"object"},"type":"array","title":"Rules"}},"type":"object","required":["rules"],"title":"UpdateRulesRequest"},"UserCreate":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"role":{"type":"string","title":"Role","default":"viewer"}},"type":"object","required":["username","password"],"title":"UserCreate","description":"平台管理员直接建用户 (P-用户维护 2026-10): 免走 signup 注册租户流程。"},"UserProfileUpdate":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","title":"UserProfileUpdate","description":"维护用户资料: 显示名 / 邮箱 (缺省字段不动)。"},"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"},"VariantSpec":{"properties":{"provider":{"type":"string","title":"Provider","default":"openai"},"model":{"type":"string","title":"Model"},"api_base":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Base"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"},"weight":{"type":"integer","title":"Weight","default":100},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"}},"type":"object","required":["model"],"title":"VariantSpec"},"VerifyAuthRequest":{"properties":{"kind":{"type":"string","title":"Kind"},"fields":{"type":"object","title":"Fields"}},"type":"object","required":["kind","fields"],"title":"VerifyAuthRequest"},"VerifyEmailRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"VerifyEmailRequest"},"VerifyResponse":{"properties":{"document_id":{"type":"integer","title":"Document Id"},"report":{"type":"object","title":"Report"}},"type":"object","required":["document_id","report"],"title":"VerifyResponse"},"VersionConfigRequest":{"properties":{"doc_type":{"type":"string","title":"Doc Type"},"config":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Config"},"traffic_pct":{"type":"integer","title":"Traffic Pct","default":0}},"type":"object","required":["doc_type"],"title":"VersionConfigRequest"},"VersionStatusRequest":{"properties":{"status":{"type":"string","title":"Status"},"f1":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"F1"},"traffic_pct":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Traffic Pct"}},"type":"object","required":["status"],"title":"VersionStatusRequest"},"WebhookCreate":{"properties":{"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url"},"events":{"items":{"type":"string"},"type":"array","title":"Events"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret"},"max_attempts":{"type":"integer","title":"Max Attempts","default":3},"retry_backoff_base":{"type":"number","title":"Retry Backoff Base","default":2.0},"include_payload":{"type":"boolean","title":"Include Payload","default":true}},"type":"object","required":["name","url","events"],"title":"WebhookCreate"},"WorkflowCreate":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"document_type":{"type":"string","title":"Document Type","default":"general"},"extraction_schema":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Extraction Schema"},"prompt_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt Template"},"auto_approve_threshold":{"type":"number","title":"Auto Approve Threshold","default":0.95},"calibration_curve":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Calibration Curve"}},"type":"object","required":["name"],"title":"WorkflowCreate"},"WorkflowDetail":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"type":"string","title":"Status"},"document_type":{"type":"string","title":"Document Type"},"extraction_schema":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Extraction Schema"},"prompt_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt Template"},"auto_approve_threshold":{"type":"number","title":"Auto Approve Threshold"},"calibration_curve":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Calibration Curve"},"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","description","status","document_type","extraction_schema","prompt_template","auto_approve_threshold","created_at","updated_at"],"title":"WorkflowDetail"},"ZeroShotRequest":{"properties":{"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"fields":{"items":{"$ref":"#/components/schemas/SchemaField"},"type":"array","title":"Fields"},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"}},"type":"object","required":["fields"],"title":"ZeroShotRequest"},"app__api__v1__documents__CompareRequest":{"properties":{"document_a":{"type":"integer","title":"Document A"},"document_b":{"type":"integer","title":"Document B"}},"type":"object","required":["document_a","document_b"],"title":"CompareRequest"},"app__api__v1__eval__CompareRequest":{"properties":{"a":{"type":"object","title":"A"},"b":{"type":"object","title":"B"},"ground_truth":{"type":"object","title":"Ground Truth"}},"type":"object","required":["a","b","ground_truth"],"title":"CompareRequest"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}},"tags":[{"name":"admin"},{"name":"agent"},{"name":"analytics"},{"name":"apikeys"},{"name":"apps"},{"name":"audit"},{"name":"auth"},{"name":"authenticity"},{"name":"billing"},{"name":"bom"},{"name":"branding"},{"name":"case-bundles"},{"name":"classify"},{"name":"compliance"},{"name":"connectors"},{"name":"conversations"},{"name":"core"},{"name":"credits"},{"name":"dashboard"},{"name":"documents"},{"name":"domain-models"},{"name":"dsar"},{"name":"entities"},{"name":"entity-registry"},{"name":"eval"},{"name":"events"},{"name":"experience"},{"name":"export"},{"name":"extraction-configs"},{"name":"field-alias"},{"name":"flow-apps"},{"name":"flows"},{"name":"governance"},{"name":"health"},{"name":"ingest"},{"name":"insurance"},{"name":"intake"},{"name":"integrations"},{"name":"knowledge"},{"name":"leads"},{"name":"license"},{"name":"mappings"},{"name":"master-data"},{"name":"mcp"},{"name":"metrics"},{"name":"model-routes"},{"name":"models"},{"name":"notifications"},{"name":"open"},{"name":"open-platform"},{"name":"ops"},{"name":"outcomes"},{"name":"platform"},{"name":"poc"},{"name":"projects"},{"name":"prompts"},{"name":"public"},{"name":"public-try"},{"name":"publish"},{"name":"redact"},{"name":"review-sessions"},{"name":"reviews"},{"name":"roi"},{"name":"schedules"},{"name":"schema-discovery"},{"name":"scim"},{"name":"seals"},{"name":"security"},{"name":"settings"},{"name":"sse"},{"name":"sso"},{"name":"structured-transforms"},{"name":"tasks"},{"name":"templates"},{"name":"tenant-settings"},{"name":"tenants"},{"name":"training"},{"name":"usage"},{"name":"validation"},{"name":"webhooks"},{"name":"workflows"}]}