{"openapi":"3.1.0","info":{"title":"AgentHub｜Agent 派遣與編排控制平面","description":"按身份、行業、資格派發專屬垂直 Agent，並管理生命週期、合規與稽核。","version":"0.2.0"},"paths":{"/v1/auth/register":{"post":{"summary":"Register","description":"C 端自助註冊。\n\n安全考量：\n  * 統一的「電郵已註冊」訊息會洩漏哪些電郵已存在。\n    但完全不明說會讓正常使用者無法理解失敗原因。\n    折衷：明說已註冊（使用者體驗優先），因為這個洩漏\n    需要攻擊者逐一嘗試，且註冊端點本身有速率限制的空間。\n  * 一律不允許自行指定 role 或 is_active。","operationId":"register_v1_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/login":{"post":{"summary":"Login","operationId":"login_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/me":{"get":{"summary":"Whoami","operationId":"whoami_v1_auth_me_get","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"}}}}}}},"/v1/auth/demo":{"post":{"summary":"Demo Login","description":"一鍵取得示範身分（內測期間使用，免帳密）。\n\n== 為什麼不是「真正的匿名」 ========================================\n\n這個平台的每一筆動作都要能歸屬到一個主體：稽核鏈的 actor、Agent 的\n租戶邊界、權限判斷的對象。真正的匿名會讓這些同時失效——稽核鏈上\n出現查不出是誰的記錄，而「一使用者一隔離 Agent」的前提也沒了。\n\n所以示範模式不是「沒有身分」，而是「一個共用、可停用、可歸屬的\n示範身分」。它走與其他使用者完全相同的授權路徑，只是不需要密碼。\n\n== 什麼時候該關掉 ================================================\n\n設定環境變數 `AGENTHUB_DEMO_MODE=off` 即停用（目前預設開啟，因為\n仍在內測）。**正式推出前必須關閉**，否則等於對外開放你的模型額度。\n\n另外 `u_demo` 是普通使用者，可以像任何帳號一樣被凍結（把\n`is_active` 設為 false），凍結後這個端點立即回 403。","operationId":"demo_login_v1_auth_demo_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/me/agents":{"get":{"summary":"My Agents","description":"列出此使用者有權使用的行業模板，以及已派發的實例。","operationId":"my_agents_v1_me_agents_get","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"}}}}}}},"/v1/me/capabilities":{"get":{"summary":"My Capabilities","description":"回報這台裝置目前真正可用的功能。\n\n為什麼要有這支端點：前端不該自己猜「有沒有語音輸入」。\n猜錯的結果是給出一個按了會失敗的按鈕——那比沒有按鈕更糟，\n因為使用者會以為是自己操作錯。\n所以能力由後端依實際設定回報，前端照著開關。","operationId":"my_capabilities_v1_me_capabilities_get","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"}}}}}}},"/v1/me/alerts":{"get":{"summary":"My Alerts","operationId":"my_alerts_v1_me_alerts_get","parameters":[{"name":"unread_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Unread Only"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"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"}}}}}}},"/v1/me/alerts/{alert_id}/read":{"post":{"summary":"Mark Alert Read","operationId":"mark_alert_read_v1_me_alerts__alert_id__read_post","parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"string","title":"Alert 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"}}}}}}},"/v1/property/import":{"post":{"summary":"Property Import","description":"匯入單位／工單／收費紀錄（限本租戶）。\n\n這是物業管理工具唯一的真實資料入口。沒有這個端點，`unit_lookup`\n只能回一句「請由物業管理人員匯入」——那是一句沒有出口的話，\n而使用者會合理地以為系統有別的方式可以匯。\n\n租戶一律取自登入身分，**不接受由請求指定**：否則任何人只要在\nJSON 裡填上別人的 tenant_id，就能寫入別人的屋苑資料。\n\n以（租戶＋識別鍵）更新或新增，可重複執行，不會產生重複列。","operationId":"property_import_v1_property_import_post","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/PropertyImportIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/login":{"post":{"summary":"Admin Login","operationId":"admin_login_v1_admin_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminLoginIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/password":{"post":{"summary":"Admin Change Password","description":"修改自己的登入憑證（密碼，可選同時改電郵與顯示名稱）。\n\n── 為什麼這個端點必須存在 ──────────────────────────────────────\n\n沒有它，系統只會「建立」管理員密碼，永遠不會「更換」。實務後果：\n\n  • 初始密碼一旦產生，就只能永遠用那一組——它會出現在部署紀錄、\n    shell 歷史、對話記錄裡，卻無法汰換。\n  • 懷疑洩漏時唯一的補救是再加一個管理員，舊的留著繼續有效。\n  • 初始帳號的電郵若是臨時填的，就沒有正規途徑改成正式身分。\n\n要求輸入現行密碼，是為了讓「已登入但被暫時借用」的工作階段\n無法直接把帳號鎖走——變更密碼會影響到本人，必須先證明是本人。","operationId":"admin_change_password_v1_admin_password_post","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/AdminPasswordIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/setup":{"post":{"summary":"Bootstrap Admin","description":"建立第一位 superadmin。\n\n**只在系統完全沒有管理員時可用。** 一旦有管理員，這個端點就永久關閉。\n沒有這個限制，任何人都能在有管理員的系統上再開一個 superadmin。\n\n這是一個「開機」端點，不是「註冊」端點——兩者的安全前提完全不同。","operationId":"bootstrap_admin_v1_admin_setup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BootstrapAdminIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/recover":{"post":{"summary":"Recover Admin","description":"以復原權杖建立或重設 superadmin。\n\n== 為什麼需要它 ==================================================\n\n`/v1/admin/setup` 只在「系統完全沒有管理員」時可用；\n`/v1/admin/password` 又必須先以管理員身分登入。\n兩個端點接不起來，於是管理員一旦忘記密碼，整個平台就沒有任何人\n能維運——連重接稽核鏈這種純修復動作都做不了。這不是理論問題，\n是實際發生過的停工。\n\n== 為什麼它是安全的 ==============================================\n\n權杖來自環境變數 `AGENTHUB_ADMIN_RECOVERY_TOKEN`，由平台擁有者\n自己設定。**未設定時這個端點完全無法使用**（回 403），所以它\n平常是收起來的，不是常開的後門。\n\n它刻意不沿用 JWT 簽章密鑰：那支密鑰一旦輪替，全平台所有人員都會\n被登出；把兩件事綁在一起，等於每次動用復原都要付這個代價。\n\n持有權杖者可以接管平台——這是任何復原機制的本質，不是缺陷。\n因此：權杖必須是長隨機字串，用完請立刻更換或移除該密鑰。\n\n比對一律用 `compare_digest`，避免回應時間洩漏權杖內容；\n失敗時固定延遲，讓離線暴力猜測變得不划算。","operationId":"recover_admin_v1_admin_recover_post","parameters":[{"name":"x-recovery-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Recovery-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecoverAdminIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/admins":{"post":{"summary":"Create Admin","operationId":"create_admin_v1_admin_admins_post","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/NewAdminIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"List Admins","operationId":"list_admins_v1_admin_admins_get","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"}}}}}}},"/v1/admin/users":{"get":{"summary":"List Users","operationId":"list_users_v1_admin_users_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"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"}}}}}}},"/v1/admin/users/{user_id}/status":{"post":{"summary":"Set User Status","operationId":"set_user_status_v1_admin_users__user_id__status_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","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/UserStatusIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/permissions":{"post":{"summary":"Grant Permission","description":"開放某使用者使用某行業模板。","operationId":"grant_permission_v1_admin_permissions_post","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/PermissionIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Revoke Permission","operationId":"revoke_permission_v1_admin_permissions_delete","parameters":[{"name":"user_id","in":"query","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"template_id","in":"query","required":true,"schema":{"type":"string","title":"Template 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"}}}}}}},"/v1/admin/platforms":{"post":{"summary":"Create Platform","description":"建立接入平台並**只回傳一次** API Key。\n\n為何只回一次：明文若可再查，有資料庫讀取權的人就能冒充該平台。\n遺失只能重置——這是刻意的摩擦，換取「洩漏面只有當下那一次回應」。","operationId":"create_platform_v1_admin_platforms_post","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/PlatformIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"List Platforms","operationId":"list_platforms_v1_admin_platforms_get","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"}}}}}}},"/v1/admin/platforms/{platform_id}/rotate":{"post":{"summary":"Rotate Platform Key","operationId":"rotate_platform_key_v1_admin_platforms__platform_id__rotate_post","parameters":[{"name":"platform_id","in":"path","required":true,"schema":{"type":"string","title":"Platform 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"}}}}}}},"/v1/admin/platforms/catalog":{"get":{"summary":"Platform Catalog","description":"接入平台目錄（既有的 AI 模型產品線）。\n\n回傳「已備妥」與「尚缺模板」兩組。缺口要看得見，\n否則沒人知道哪個平台其實還串不起來。","operationId":"platform_catalog_v1_admin_platforms_catalog_get","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"}}}}}}},"/v1/admin/audit":{"get":{"summary":"Admin Audit","operationId":"admin_audit_v1_admin_audit_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"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"}}}}}}},"/v1/admin/dashboard":{"get":{"summary":"Dashboard","operationId":"dashboard_v1_admin_dashboard_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","default":"tenant_demo","title":"Tenant 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"}}}}}}},"/v1/platform/whoami":{"get":{"summary":"Platform Whoami","description":"給整合方驗證自己的 Key 是否有效。","operationId":"platform_whoami_v1_platform_whoami_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"x-external-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-External-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/platform/agents/{agent_id}/chat":{"post":{"summary":"Platform Chat","description":"平台代其使用者發送訊息。\n\n租戶一律取自平台綁定，**不接受呼叫者指定**。\n否則平台 A 只要改一個參數就能讀平台 B 的對話。","operationId":"platform_chat_v1_platform_agents__agent_id__chat_post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"x-external-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-External-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/kb":{"get":{"summary":"Kb List","description":"列出所有知識庫。含每個庫的文件數與切片數。","operationId":"kb_list_v1_admin_kb_get","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":{"summary":"Kb Create","operationId":"kb_create_v1_admin_kb_post","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/KbCreateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/kb/{kb_id}":{"get":{"summary":"Kb Detail","operationId":"kb_detail_v1_admin_kb__kb_id__get","parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"string","title":"Kb 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"}}}}}}},"/v1/admin/kb/{kb_id}/ingest":{"post":{"summary":"Kb Ingest","description":"導入純文字。適合已抽取好的條文或人工整理的實務資料。","operationId":"kb_ingest_v1_admin_kb__kb_id__ingest_post","parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"string","title":"Kb 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/KbIngestIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/kb/{kb_id}/upload":{"post":{"summary":"Kb Upload","description":"上傳文件（PDF／TXT／MD）。\n\nPDF 沒有文字層的頁面會被回報為 needs_ocr，而不是靜默跳過——\n「索引成功但其實沒有任何內容」是知識庫最危險的失敗模式。","operationId":"kb_upload_v1_admin_kb__kb_id__upload_post","parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"string","title":"Kb Id"}},{"name":"doc_type","in":"query","required":false,"schema":{"type":"string","default":"","title":"Doc Type"}},{"name":"source","in":"query","required":false,"schema":{"type":"string","default":"","title":"Source"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_kb_upload_v1_admin_kb__kb_id__upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/kb/{kb_id}/search":{"post":{"summary":"Kb Search","description":"檢索知識庫。回傳命中切片與其相鄰切片（上下文）。","operationId":"kb_search_v1_admin_kb__kb_id__search_post","parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"string","title":"Kb 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/KbSearchIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/kb/{kb_id}/uat":{"post":{"summary":"Kb Uat","description":"知識測試面板。驗證檢索是否撿到正確條文、是否撈到不該撈的東西。","operationId":"kb_uat_v1_admin_kb__kb_id__uat_post","parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"string","title":"Kb 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/KbUatIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/kb/{kb_id}/documents":{"get":{"summary":"Kb Documents","operationId":"kb_documents_v1_admin_kb__kb_id__documents_get","parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"string","title":"Kb 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"}}}}}}},"/v1/admin/kb/{kb_id}/logs":{"get":{"summary":"Kb Logs","operationId":"kb_logs_v1_admin_kb__kb_id__logs_get","parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"string","title":"Kb Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"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"}}}}}}},"/v1/admin/kb/{kb_id}/documents/{doc_id}":{"delete":{"summary":"Kb Delete Document","operationId":"kb_delete_document_v1_admin_kb__kb_id__documents__doc_id__delete","parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"string","title":"Kb Id"}},{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc 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"}}}}}}},"/healthz":{"get":{"summary":"Healthz","operationId":"healthz_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/health":{"get":{"summary":"V1 Health","operationId":"v1_health_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/admin/bootstrap":{"post":{"summary":"Bootstrap","description":"載入示範租戶、示範帳號、所有垂直模板與合規規則。","operationId":"bootstrap_v1_admin_bootstrap_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/templates":{"get":{"summary":"List Templates","operationId":"list_templates_v1_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Register Template","operationId":"register_template_v1_templates_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/registry":{"get":{"summary":"Registry","description":"能力發現：讓上層大模型知道有哪些 Agent、各自能做什麼（MCP 風格）。\n\n可按 category 篩選：professional_licensed / enterprise_ops / personal_productivity","operationId":"registry_v1_registry_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/categories":{"get":{"summary":"Categories","description":"三類 Agent 分類定義（執業專業人士 / 企業營運 / 個人生產力）。","operationId":"categories_v1_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/catalog":{"get":{"summary":"Catalog","description":"全部垂直 Agent 目錄（Roadmap）：分類、優先級、狀態、實作進度。","operationId":"catalog_v1_catalog_get","parameters":[{"name":"priority","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Priority"}},{"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"}}}}}}},"/v1/templates/validate":{"post":{"summary":"Validate Templates","description":"模板 CI：靜態檢查所有已載入的垂直模板包。問題清單為空 = 全部通過。","operationId":"validate_templates_v1_templates_validate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/agents/launch":{"post":{"summary":"Launch","operationId":"launch_v1_agents_launch_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"x-external-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-External-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LaunchIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/agents":{"get":{"summary":"List Agents","description":"列出某租戶已派發的 Agent（控制台與上層平台管理介面用）。","operationId":"list_agents_v1_agents_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"x-external-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-External-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/agents/{agent_id}":{"get":{"summary":"Get Agent","operationId":"get_agent_v1_agents__agent_id__get","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"x-external-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-External-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/agents/{agent_id}/status":{"post":{"summary":"Set Status","operationId":"set_status_v1_agents__agent_id__status_post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"x-external-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-External-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/agents/{agent_id}/chat":{"post":{"summary":"Chat","operationId":"chat_v1_agents__agent_id__chat_post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"x-external-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-External-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/agents/{agent_id}/memory":{"get":{"summary":"Get Memory","operationId":"get_memory_v1_agents__agent_id__memory_get","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"include_archived","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Archived"}},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"x-external-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-External-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Add Memory","operationId":"add_memory_v1_agents__agent_id__memory_post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"x-external-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-External-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemoryIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/agents/{agent_id}/memory/reset":{"post":{"summary":"Reset Memory","operationId":"reset_memory_v1_agents__agent_id__memory_reset_post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"x-external-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-External-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/audit/verify":{"get":{"summary":"Audit Verify","operationId":"audit_verify_v1_audit_verify_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/admin/audit/rebuild":{"post":{"summary":"Audit Rebuild","description":"以各列實際存下來的欄位重算雜湊，重接稽核鏈（僅平台管理員）。\n\n存在的理由：2026-10 之前 append() 沒把 seq 寫進該列，線上 365 筆\n記錄的雜湊是以「猜的序號」算出來的，鏈對不上。修好 append() 只令\n新記錄正確，舊記錄不會自己回復有效。\n\n這是**改寫稽核記錄**的動作，所以三重限制：\n  1. 只有 admin 主體可呼叫（與 /v1/audit 跨租戶讀取同一道門）；\n  2. 必須明示 confirm=true，避免誤觸；\n  3. 動作本身寫一筆 audit_chain_rebuilt 留在鏈上——否則\n     「誰改了稽核鏈」沒有痕跡，那才是真正的問題。\n\n只改 hash 與 prev_hash；seq、actor、action、payload、created_at\n一律不動。回傳 before／after 兩次驗證結果供核對。","operationId":"audit_rebuild_v1_admin_audit_rebuild_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"x-external-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-External-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditRebuildIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/audit":{"get":{"summary":"Audit List","operationId":"audit_list_v1_audit_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"x-external-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-External-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/usage/{tenant_id}":{"get":{"summary":"Usage","operationId":"usage_v1_usage__tenant_id__get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"x-external-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-External-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/models":{"get":{"summary":"Models","description":"模型池與可用性（含每個任務類型的降級鏈）。\n\nsource 指出這條鏈從哪裡來：`builtin` 為程式內建預設，\n其他值則是 AGENTHUB_MODEL_POOL 指向的設定檔路徑。","operationId":"models_v1_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/compliance/rules":{"get":{"summary":"Compliance Rules","operationId":"compliance_rules_v1_compliance_rules_get","parameters":[{"name":"industry","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/compliance/judge":{"post":{"summary":"Semantic Judge","description":"L4 語義合規評審（dry-run）。\n\n供模板 CI、提示詞調校與除錯使用；不寫入對話記憶，不影響用量配額。\n回傳該行業的完整準則清單、L4 設定，以及評審判定結果。","operationId":"semantic_judge_v1_compliance_judge_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JudgeIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/templates/review/pending":{"get":{"summary":"List Pending Reviews","description":"列出待專業審核定案的模板——審閱者的工作清單。","operationId":"list_pending_reviews_v1_templates_review_pending_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/templates/{template_id}/review":{"get":{"summary":"Get Template Review","description":"查詢模板的定案狀態。","operationId":"get_template_review_v1_templates__template_id__review_get","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Set Template Review","description":"登錄專業人士的審閱結果。簽署人必須提供註冊編號，否則無法追溯。","operationId":"set_template_review_v1_templates__template_id__review_post","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateReviewIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tenants/{tenant_id}/owner":{"get":{"summary":"Get Owner","description":"查詢租戶的擁有者登記。","operationId":"get_owner_v1_tenants__tenant_id__owner_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"x-external-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-External-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Set Owner","description":"登記租戶擁有者。這是「最終責任」在系統中的落點。\n\n寫入端更關鍵：若能改別人的擁有者，就等於能把責任推給別人。","operationId":"set_owner_v1_tenants__tenant_id__owner_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"x-external-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-External-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnerIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/users/{user_id}/responsibility":{"get":{"summary":"Responsibility","description":"查詢某使用者在某行業的完整責任鏈（用家 + 擁有者）。","operationId":"responsibility_v1_users__user_id__responsibility_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"industry","in":"query","required":true,"schema":{"type":"string","title":"Industry"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AdminLoginIn":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"AdminLoginIn"},"AdminPasswordIn":{"properties":{"current_password":{"type":"string","title":"Current Password"},"new_password":{"type":"string","title":"New Password"},"new_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Email"},"new_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Display Name"}},"type":"object","required":["current_password","new_password"],"title":"AdminPasswordIn"},"AuditRebuildIn":{"properties":{"confirm":{"type":"boolean","title":"Confirm","description":"必須為 true 才會執行","default":false}},"type":"object","title":"AuditRebuildIn"},"Body_kb_upload_v1_admin_kb__kb_id__upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_kb_upload_v1_admin_kb__kb_id__upload_post"},"BootstrapAdminIn":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"display_name":{"type":"string","title":"Display Name","default":"初始管理員"}},"type":"object","required":["email","password"],"title":"BootstrapAdminIn"},"ChatIn":{"properties":{"message":{"type":"string","title":"Message"},"task_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Type"}},"type":"object","required":["message"],"title":"ChatIn"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"JudgeIn":{"properties":{"industry":{"type":"string","title":"Industry"},"instruction":{"type":"string","title":"Instruction","default":""},"output":{"type":"string","title":"Output"}},"type":"object","required":["industry","output"],"title":"JudgeIn"},"KbCreateIn":{"properties":{"kb_id":{"type":"string","maxLength":64,"minLength":3,"title":"Kb Id"},"industry":{"type":"string","maxLength":40,"minLength":2,"title":"Industry"},"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"description":{"type":"string","title":"Description","default":""},"agent_id":{"type":"string","title":"Agent Id","default":""},"sensitivity":{"type":"string","title":"Sensitivity","default":"internal"}},"type":"object","required":["kb_id","industry","name"],"title":"KbCreateIn"},"KbIngestIn":{"properties":{"filename":{"type":"string","maxLength":400,"minLength":1,"title":"Filename"},"text":{"type":"string","minLength":1,"title":"Text"},"doc_type":{"type":"string","title":"Doc Type","default":""},"category":{"type":"string","title":"Category","default":""},"source":{"type":"string","title":"Source","default":""},"publish_date":{"type":"string","title":"Publish Date","default":""},"is_valid":{"type":"boolean","title":"Is Valid","default":true}},"type":"object","required":["filename","text"],"title":"KbIngestIn"},"KbSearchIn":{"properties":{"query":{"type":"string","minLength":1,"title":"Query"},"top_k":{"type":"integer","maximum":30,"minimum":1,"title":"Top K","default":6},"expand_neighbours":{"type":"boolean","title":"Expand Neighbours","default":true}},"type":"object","required":["query"],"title":"KbSearchIn"},"KbUatIn":{"properties":{"question":{"type":"string","minLength":1,"title":"Question"},"expect_sections":{"items":{"type":"string"},"type":"array","title":"Expect Sections","default":[]},"expect_keywords":{"items":{"type":"string"},"type":"array","title":"Expect Keywords","default":[]},"forbid_keywords":{"items":{"type":"string"},"type":"array","title":"Forbid Keywords","default":[]},"top_k":{"type":"integer","maximum":30,"minimum":1,"title":"Top K","default":6}},"type":"object","required":["question"],"title":"KbUatIn"},"LaunchIn":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"user_id":{"type":"string","title":"User Id"},"display_name":{"type":"string","title":"Display Name"},"industry":{"type":"string","title":"Industry"},"licence_no":{"type":"string","title":"Licence No","default":""}},"type":"object","required":["tenant_id","user_id","display_name","industry"],"title":"LaunchIn"},"LoginIn":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginIn"},"MemoryIn":{"properties":{"kind":{"type":"string","title":"Kind","default":"profile"},"content":{"type":"string","title":"Content"},"meta":{"type":"object","title":"Meta"}},"type":"object","required":["content"],"title":"MemoryIn"},"NewAdminIn":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"display_name":{"type":"string","title":"Display Name","default":""},"role":{"type":"string","title":"Role","default":"operator"}},"type":"object","required":["email","password"],"title":"NewAdminIn"},"OwnerIn":{"properties":{"owner_name":{"type":"string","title":"Owner Name"},"owner_ref":{"type":"string","title":"Owner Ref","default":""}},"type":"object","required":["owner_name"],"title":"OwnerIn"},"PermissionIn":{"properties":{"user_id":{"type":"string","title":"User Id"},"template_id":{"type":"string","title":"Template Id"}},"type":"object","required":["user_id","template_id"],"title":"PermissionIn"},"PlatformIn":{"properties":{"platform_id":{"type":"string","title":"Platform Id"},"name":{"type":"string","title":"Name"},"tenant_id":{"type":"string","title":"Tenant Id","default":"tenant_demo"},"allowed_ips":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Allowed Ips"},"allowed_templates":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Allowed Templates"}},"type":"object","required":["platform_id","name"],"title":"PlatformIn"},"PropertyImportIn":{"properties":{"units":{"items":{"type":"object"},"type":"array","title":"Units","default":[]},"work_orders":{"items":{"type":"object"},"type":"array","title":"Work Orders","default":[]},"fees":{"items":{"type":"object"},"type":"array","title":"Fees","default":[]},"source":{"type":"string","title":"Source","default":""}},"type":"object","title":"PropertyImportIn","description":"物業資料匯入。三個清單都可留空，只匯其中一類。"},"RecoverAdminIn":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"}},"type":"object","required":["email","password"],"title":"RecoverAdminIn"},"RegisterIn":{"properties":{"email":{"type":"string","title":"Email"},"username":{"type":"string","title":"Username","default":""},"password":{"type":"string","title":"Password"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"industry_tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry Tag"},"tenant_id":{"type":"string","title":"Tenant Id","default":"tenant_demo"}},"type":"object","required":["email","password"],"title":"RegisterIn"},"StatusIn":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"StatusIn"},"TemplateIn":{"properties":{"template_id":{"type":"string","title":"Template Id"},"template_name":{"type":"string","title":"Template Name"},"industry":{"type":"string","title":"Industry"},"category":{"type":"string","title":"Category","default":"professional_licensed"},"requires_licence":{"type":"boolean","title":"Requires Licence","default":true},"licence_authority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Licence Authority"},"version":{"type":"string","title":"Version","default":"1.0.0"},"system_prompt":{"type":"string","title":"System Prompt"},"tools":{"items":{"type":"object"},"type":"array","title":"Tools"},"compliance_policy":{"type":"object","title":"Compliance Policy"},"model_policy":{"type":"object","title":"Model Policy"}},"type":"object","required":["template_id","template_name","industry","system_prompt"],"title":"TemplateIn"},"TemplateReviewIn":{"properties":{"reviewer_name":{"type":"string","title":"Reviewer Name"},"reviewer_licence":{"type":"string","title":"Reviewer Licence"},"verdict":{"type":"string","title":"Verdict","default":"certified"},"note":{"type":"string","title":"Note","default":""}},"type":"object","required":["reviewer_name","reviewer_licence"],"title":"TemplateReviewIn"},"UserStatusIn":{"properties":{"is_active":{"type":"boolean","title":"Is Active"}},"type":"object","required":["is_active"],"title":"UserStatusIn"},"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"}}}}