{"openapi":"3.1.0","info":{"title":"ComplianceGxP API","description":"\n**AI-powered compliance assistant for pharmaceutical & life sciences.**\n\nComplianceGxP delivers instant, sourced answers to compliance questions —\ntrained on your SOPs, validation protocols, and regulatory guidelines.\n\n## Modes\n\n| Mode | Description |\n|------|-------------|\n| `qa` | General compliance Q&A with source citations |\n| `deviation` | Structured deviation investigation + root cause analysis |\n| `capa` | CAPA draft with corrective/preventive actions |\n| `csv` | Computer System Validation protocol drafting |\n\n## Authentication\n\nAll endpoints require an `X-API-Key` header.\nAdmin endpoints (ingestion, logs) require the admin key.\n\n## Audit Trail\n\nEvery query is logged with timestamp, user, sources, and response\nfor full compliance traceability.\n\n---\n*Built by [LLMOps.Pro](https://www.llmops.pro) — 25 years of pharma automation expertise.*\n    ","contact":{"name":"LLMOps.Pro","url":"https://www.llmops.pro/","email":"info@llmops.pro"},"license":{"name":"Proprietary"},"version":"1.5.0"},"paths":{"/api/v1/query":{"post":{"tags":["Query"],"summary":"Query","description":"Ask ComplianceGxP a compliance question.\n\nModes:\n- **qa**: General compliance Q&A with source citations\n- **deviation**: Structured deviation investigation with root cause analysis\n- **capa**: CAPA draft with corrective/preventive actions\n- **csv**: Computer System Validation protocol drafting\n- **part11**: 21 CFR Part 11 / EU Annex 11 assessment\n- **mdr**: EU Medical Device Regulation (MDR) compliance\n- **hipaa**: HIPAA Privacy & Security Rule assessment\n\nMode access depends on your subscription tier.\nAll responses include source document citations for audit traceability.","operationId":"query_api_v1_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/query/stream":{"post":{"tags":["Query"],"summary":"Query Stream","description":"Streaming version of /query — returns Server-Sent Events.\n\nEvent types emitted in order:\n- `{\"type\": \"sources\", \"sources\": [...]}` — retrieved source chunks\n- `{\"type\": \"token\",   \"text\": \"...\"}` — one generated token\n- `{\"type\": \"done\",    \"latency_ms\": N, \"timestamp\": \"...\", \"mode\": \"...\", \"query\": \"...\"}`\n- `{\"type\": \"error\",   \"message\": \"...\"}` — on generation failure\n\nConsume with `EventSource` or `fetch` + `ReadableStream` in the browser.","operationId":"query_stream_api_v1_query_stream_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/query/review":{"post":{"tags":["Query"],"summary":"Query Review","description":"Upload one or more documents for one-time compliance review via streaming SSE.\n\nEach file's text is extracted server-side and passed directly to Claude as\ncontext alongside any matching knowledge-base chunks. Files are NOT permanently\ningested. The form field is named \"file\" and may be repeated for multiple files;\na single file is still valid (treated as a one-element list, preserving the\noriginal single-file contract used by the MCP server).\n\nAccepts the same mode values as /query/stream.","operationId":"query_review_api_v1_query_review_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_query_review_api_v1_query_review_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":[{"APIKeyHeader":[]}]}},"/api/v1/ingest/file":{"post":{"tags":["Ingestion (Admin)"],"summary":"Ingest File","description":"Ingest a single document from a server-side file path.","operationId":"ingest_file_api_v1_ingest_file_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"client","in":"query","required":false,"schema":{"type":"string","default":"demo","title":"Client"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestFileRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ingest/directory":{"post":{"tags":["Ingestion (Admin)"],"summary":"Ingest Directory","description":"Ingest all supported documents from a server-side directory.","operationId":"ingest_directory_api_v1_ingest_directory_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"client","in":"query","required":false,"schema":{"type":"string","default":"demo","title":"Client"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestDirectoryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestDirectoryResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ingest/text":{"post":{"tags":["Ingestion (Admin)"],"summary":"Ingest Text","description":"Ingest raw text content directly via the API. Available to basic tier and above.","operationId":"ingest_text_api_v1_ingest_text_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"client","in":"query","required":false,"schema":{"type":"string","default":"demo","title":"Client"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestTextRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ingest/upload":{"post":{"tags":["Ingestion (Admin)"],"summary":"Ingest Upload","description":"Upload and ingest a document file (PDF, DOCX, XLSX, TXT).\n\nAvailable to basic tier and above. Client keys are scoped to their own data.\nThe file is saved to the client's raw directory and then processed.","operationId":"ingest_upload_api_v1_ingest_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_ingest_upload_api_v1_ingest_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/data":{"delete":{"tags":["Ingestion (Admin)"],"summary":"Clear Data","description":"Clear all indexed data for a client. Destructive — use with caution.","operationId":"clear_data_api_v1_data_delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"client","in":"query","required":false,"schema":{"type":"string","default":"demo","title":"Client"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/health":{"get":{"tags":["Status & Management"],"summary":"Health","description":"Basic health check — no auth required.","operationId":"health_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/me":{"get":{"tags":["Status & Management"],"summary":"Get Me","description":"Return current key's permissions — used by the UI to control tab visibility.","operationId":"get_me_api_v1_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/modes":{"get":{"tags":["Status & Management"],"summary":"Get Modes","description":"List available query modes — no auth required.","operationId":"get_modes_api_v1_modes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/clients":{"get":{"tags":["Status & Management"],"summary":"Get Clients","description":"List all configured clients (admin only).","operationId":"get_clients_api_v1_clients_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/status":{"get":{"tags":["Status & Management"],"summary":"Get Status","description":"Get system status: vector store stats, usage summary, available modes.","operationId":"get_status_api_v1_status_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"client","in":"query","required":false,"schema":{"type":"string","default":"demo","title":"Client"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/logs":{"get":{"tags":["Status & Management"],"summary":"Get Logs","description":"Retrieve audit-log entries. Admins can query any namespace; user keys see\ntheir shared namespace logs.\n\nSuccessful query/response pairs are read from `query_log.jsonl`. When\n`include_blocked=True` (default), responses refused by the GxP behavioral\ncontract are also surfaced from `agentcontract-audit.jsonl` with\n`blocked=true` and the violated clause inline — so the UI is faithful to\nthe audit-of-record (a regulator must see refused attempts, not only\ncompleted ones).","operationId":"get_logs_api_v1_logs_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"client","in":"query","required":false,"schema":{"type":"string","default":"demo","title":"Client"}},{"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":"mode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by mode: qa, deviation, capa, csv","title":"Mode"},"description":"Filter by mode: qa, deviation, capa, csv"},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter from date (ISO, e.g. 2025-01-01)","title":"Since"},"description":"Filter from date (ISO, e.g. 2025-01-01)"},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to date (ISO, e.g. 2025-12-31)","title":"Until"},"description":"Filter to date (ISO, e.g. 2025-12-31)"},{"name":"include_blocked","in":"query","required":false,"schema":{"type":"boolean","description":"Include AgentContract-blocked attempts (blocked=True rows)","default":true,"title":"Include Blocked"},"description":"Include AgentContract-blocked attempts (blocked=True rows)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LogEntry"},"title":"Response Get Logs Api V1 Logs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feedback":{"post":{"tags":["Status & Management"],"summary":"Submit Feedback","description":"Submit feedback (thumbs_up/thumbs_down) for a specific query.","operationId":"submit_feedback_api_v1_feedback_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"client","in":"query","required":false,"schema":{"type":"string","default":"demo","title":"Client"}}],"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/logs/verify":{"get":{"tags":["Status & Management"],"summary":"Verify Log Chain","description":"Verify the SHA-256 hash chain integrity of the audit log.\n\nReturns whether the chain is intact, how many entries were checked,\nand the timestamp of the first broken link (if any).\nBroken chain = evidence of tampering or file corruption.","operationId":"verify_log_chain_api_v1_logs_verify_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"client","in":"query","required":false,"schema":{"type":"string","default":"demo","title":"Client"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/keys":{"get":{"tags":["Status & Management"],"summary":"List Keys","description":"List all API keys with usage stats (admin only).","operationId":"list_keys_api_v1_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]}]},"post":{"tags":["Status & Management"],"summary":"Create Key","description":"Create a new API key for an individual user (admin only). Returns the raw key — shown once.","operationId":"create_key_api_v1_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/usage":{"get":{"tags":["Status & Management"],"summary":"Get Usage","description":"Get usage summary for billing (admin only).","operationId":"get_usage_api_v1_usage_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"client","in":"query","required":false,"schema":{"type":"string","title":"Client"}},{"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/tiers":{"get":{"tags":["Status & Management"],"summary":"Get Tiers","description":"List available subscription tiers — no auth required.","operationId":"get_tiers_api_v1_tiers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/keys/{key_id}":{"patch":{"tags":["Status & Management"],"summary":"Update Key","description":"Update tier, rate limit, modes, or expiry for a user key (admin only).","operationId":"update_key_api_v1_keys__key_id__patch","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateKeyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Status & Management"],"summary":"Delete Key","description":"Permanently delete a user key (admin only).","operationId":"delete_key_api_v1_keys__key_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","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/keys/{key_id}/rotate":{"post":{"tags":["Status & Management"],"summary":"Rotate Key","description":"Generate a new API key for a user, invalidating the old one (admin only).","operationId":"rotate_key_api_v1_keys__key_id__rotate_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","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/keys/{key_id}/activate":{"post":{"tags":["Status & Management"],"summary":"Activate Key","description":"Activate a deactivated user key (admin only).","operationId":"activate_key_api_v1_keys__key_id__activate_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","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/keys/{key_id}/deactivate":{"post":{"tags":["Status & Management"],"summary":"Deactivate Key","description":"Deactivate a user key without deleting it (admin only).","operationId":"deactivate_key_api_v1_keys__key_id__deactivate_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","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/documents":{"get":{"tags":["Documents"],"summary":"List Documents","description":"List all documents indexed for the client.","operationId":"list_documents_api_v1_documents_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"client","in":"query","required":false,"schema":{"type":"string","default":"demo","title":"Client"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DocumentInfo"},"title":"Response List Documents Api V1 Documents Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{filename}":{"delete":{"tags":["Documents"],"summary":"Delete Document","description":"Retire a document: remove its chunks from the vector index.\n\nThe original file on disk is preserved per GxP data retention requirements.\nRebuilds the FAISS index in-place using stored vectors (no re-embedding).\nRequires basic tier or above (can_ingest permission).","operationId":"delete_document_api_v1_documents__filename__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}},{"name":"client","in":"query","required":false,"schema":{"type":"string","default":"demo","title":"Client"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/contract/details":{"get":{"tags":["Contract"],"summary":"Contract Details","description":"Return active contract metadata and SHA-256 hash.","operationId":"contract_details_api_v1_contract_details_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/contract/changelog":{"get":{"tags":["Contract"],"summary":"Contract Changelog","description":"Return the append-only contract change log, newest first.","operationId":"contract_changelog_api_v1_contract_changelog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/contract/yaml":{"get":{"tags":["Contract"],"summary":"Contract Yaml","description":"Return the raw YAML of the active contract for audit inspection.","operationId":"contract_yaml_api_v1_contract_yaml_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/contract/upload":{"post":{"tags":["Contract"],"summary":"Contract Upload","description":"Replace the active contract with a new YAML file (admin only).\n\nThe uploaded file is schema-validated before being written. On success\nan entry is appended to the change log. The new contract is NOT\nautomatically loaded into memory — call /reload after uploading.","operationId":"contract_upload_api_v1_contract_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_contract_upload_api_v1_contract_upload_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":[{"APIKeyHeader":[]}]}},"/api/v1/contract/reload":{"post":{"tags":["Contract"],"summary":"Contract Reload","description":"Hot-reload the contract from disk into the running engine (admin only).\n\nThis re-reads gxp-agent.contract.yaml and replaces the in-memory\nContractRunner. All subsequent requests use the new contract immediately.","operationId":"contract_reload_api_v1_contract_reload_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/config/envelopes":{"get":{"tags":["Admin — Runtime Config"],"summary":"Get Envelopes","description":"Return the validated envelope ranges for every adjustable field. No auth required (used by UI).","operationId":"get_envelopes_api_v1_config_envelopes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/config/audit":{"get":{"tags":["Admin — Runtime Config"],"summary":"Get Global Audit","description":"Return the most-recent config-change rows across all namespaces (admin only).","operationId":"get_global_audit_api_v1_config_audit_get","security":[{"APIKeyHeader":[]}],"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/config/{namespace}":{"get":{"tags":["Admin — Runtime Config"],"summary":"Get Config","description":"Return the persisted overrides for a namespace (admin only).","operationId":"get_config_api_v1_config__namespace__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"namespace","in":"path","required":true,"schema":{"type":"string","title":"Namespace"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Admin — Runtime Config"],"summary":"Patch Config","description":"Apply an in-envelope per-namespace override (admin only).\n\nOut-of-envelope values return HTTP 422 and a blocked audit row is written.","operationId":"patch_config_api_v1_config__namespace__patch","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"namespace","in":"path","required":true,"schema":{"type":"string","title":"Namespace"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/config/{namespace}/{field}":{"delete":{"tags":["Admin — Runtime Config"],"summary":"Reset Field","description":"Reset a per-namespace override back to the global default (admin only).","operationId":"reset_field_api_v1_config__namespace___field__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"namespace","in":"path","required":true,"schema":{"type":"string","title":"Namespace"}},{"name":"field","in":"path","required":true,"schema":{"type":"string","title":"Field"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigResetRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/config/{namespace}/audit":{"get":{"tags":["Admin — Runtime Config"],"summary":"Get Namespace Audit","description":"Return the most-recent config-change rows for a namespace (admin only).","operationId":"get_namespace_audit_api_v1_config__namespace__audit_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"namespace","in":"path","required":true,"schema":{"type":"string","title":"Namespace"}},{"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/validation/status":{"get":{"tags":["Validation & Qualification"],"summary":"Get Validation Status","description":"Overall IQ/OQ/PQ validation status (enterprise or admin).","operationId":"get_validation_status_api_v1_validation_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/validation/exports":{"get":{"tags":["Validation & Qualification"],"summary":"List Exports","description":"List all client-stamped protocol export files, newest first (enterprise or admin).","operationId":"list_exports_api_v1_validation_exports_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/validation/exports/{fname}":{"get":{"tags":["Validation & Qualification"],"summary":"Download Export","description":"Download a single exported protocol Markdown file (enterprise or admin).","operationId":"download_export_api_v1_validation_exports__fname__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"fname","in":"path","required":true,"schema":{"type":"string","title":"Fname"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/validation/reports":{"get":{"tags":["Validation & Qualification"],"summary":"List Reports","description":"List all evidence reports, newest first (enterprise or admin).","operationId":"list_reports_api_v1_validation_reports_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/validation/reports/{fname}":{"get":{"tags":["Validation & Qualification"],"summary":"Download Report","description":"Download a single evidence report JSON (enterprise or admin).","operationId":"download_report_api_v1_validation_reports__fname__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"fname","in":"path","required":true,"schema":{"type":"string","title":"Fname"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/validation/protocols/{name}":{"get":{"tags":["Validation & Qualification"],"summary":"Get Protocol","description":"Serve a Markdown protocol document (enterprise or admin).","operationId":"get_protocol_api_v1_validation_protocols__name__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/validation/run/{suite}":{"post":{"tags":["Validation & Qualification"],"summary":"Run Suite","description":"Trigger an IQ or OQ validation run in a subprocess (admin only).\nReturns the evidence report JSON + returncode.\nThis runs pytest server-side — may take 30–120 seconds.","operationId":"run_suite_api_v1_validation_run__suite__post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"suite","in":"path","required":true,"schema":{"type":"string","title":"Suite"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSuiteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/validation/vp-generate":{"post":{"tags":["Validation & Qualification"],"summary":"Vp Generate","description":"Generate a filled-in VP-CGXP-001 (Validation Plan) for the given client (enterprise or admin).\nReturns the Markdown as a file download.","operationId":"vp_generate_api_v1_validation_vp_generate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProtocolGenerateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/validation/iq-generate":{"post":{"tags":["Validation & Qualification"],"summary":"Iq Generate","description":"Generate a filled-in IQ-CGXP-001 protocol draft for the given client (enterprise or admin).\nDownload this, obtain QA approval, THEN execute via POST /run/iq.","operationId":"iq_generate_api_v1_validation_iq_generate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProtocolGenerateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/validation/oq-generate":{"post":{"tags":["Validation & Qualification"],"summary":"Oq Generate","description":"Generate a filled-in OQ-CGXP-001 protocol draft for the given client (enterprise or admin).\nDownload this, obtain QA approval, THEN execute via POST /run/oq.","operationId":"oq_generate_api_v1_validation_oq_generate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProtocolGenerateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/validation/pq-generate":{"post":{"tags":["Validation & Qualification"],"summary":"Pq Generate","description":"Generate a filled-in PQ-CGXP-001 template for the given client (enterprise or admin).\nReturns the Markdown as a file download.","operationId":"pq_generate_api_v1_validation_pq_generate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PQGenerateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/validation/vr-generate":{"post":{"tags":["Validation & Qualification"],"summary":"Vr Generate","description":"Generate a Validation Summary Report (VR-CGXP-001), pre-populated with\nIQ/OQ evidence results if available (enterprise or admin).","operationId":"vr_generate_api_v1_validation_vr_generate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PQGenerateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/validation/drafts":{"get":{"tags":["Validation & Qualification"],"summary":"List Draft Statuses","description":"Return draft status for all protocols (enterprise or admin).","operationId":"list_draft_statuses_api_v1_validation_drafts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/validation/drafts/{protocol_id}":{"get":{"tags":["Validation & Qualification"],"summary":"Get Draft","description":"Return saved draft content and status for a protocol (enterprise or admin).\nReturns {content, status, updated_at} — content is null if no draft yet.","operationId":"get_draft_api_v1_validation_drafts__protocol_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"protocol_id","in":"path","required":true,"schema":{"type":"string","title":"Protocol Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Validation & Qualification"],"summary":"Save Draft Endpoint","description":"Save edited Markdown content for a protocol draft (enterprise or admin).\nStatus stays 'draft'; only moves to 'approved' via /approve.","operationId":"save_draft_endpoint_api_v1_validation_drafts__protocol_id__put","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"protocol_id","in":"path","required":true,"schema":{"type":"string","title":"Protocol Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftSaveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/validation/drafts/{protocol_id}/approve":{"post":{"tags":["Validation & Qualification"],"summary":"Approve Draft","description":"Mark a protocol draft as approved and save it to the exports archive (enterprise or admin).\nThe export is a permanent, immutable record of the approved version.","operationId":"approve_draft_api_v1_validation_drafts__protocol_id__approve_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"protocol_id","in":"path","required":true,"schema":{"type":"string","title":"Protocol 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/drafts/{protocol_id}/reopen":{"post":{"tags":["Validation & Qualification"],"summary":"Reopen Draft","description":"Reopen an approved draft for editing (sets status back to 'draft').","operationId":"reopen_draft_api_v1_validation_drafts__protocol_id__reopen_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"protocol_id","in":"path","required":true,"schema":{"type":"string","title":"Protocol Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"tags":["Root"],"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/contract":{"get":{"tags":["Root"],"summary":"Get Contract","description":"Returns the active AgentContract behavioral contract metadata.\n\nThis endpoint exposes the GxP behavioral contract that governs every\nComplianceGxP response — a governance artifact for EU AI Act and\n21 CFR Part 11 readiness.","operationId":"get_contract_contract_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_contract_upload_api_v1_contract_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_contract_upload_api_v1_contract_upload_post"},"Body_ingest_upload_api_v1_ingest_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"client":{"type":"string","title":"Client","default":"demo"}},"type":"object","required":["file"],"title":"Body_ingest_upload_api_v1_ingest_upload_post"},"Body_query_review_api_v1_query_review_post":{"properties":{"file":{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array","title":"File"},"question":{"type":"string","title":"Question","default":"Review this document for compliance issues and summarize key findings."},"mode":{"type":"string","title":"Mode","default":"qa"}},"type":"object","required":["file"],"title":"Body_query_review_api_v1_query_review_post"},"ConfigResetRequest":{"properties":{"field":{"type":"string","title":"Field","description":"Adjustable field to reset"},"reason":{"type":"string","minLength":3,"title":"Reason","description":"Free-text justification recorded in the audit row"},"actor":{"type":"string","title":"Actor","description":"Identifier of the admin making the change","default":"admin"}},"type":"object","required":["field","reason"],"title":"ConfigResetRequest","description":"Reset a per-namespace override back to the global default (admin only)."},"ConfigUpdateRequest":{"properties":{"field":{"type":"string","title":"Field","description":"Adjustable field: chat_max_tokens, top_k, min_similarity, chat_temperature"},"value":{"type":"number","title":"Value","description":"New value. Must lie within the field's validated envelope or the request is rejected (HTTP 422)."},"reason":{"type":"string","minLength":3,"title":"Reason","description":"Free-text justification recorded in the audit row (e.g. 'Long CSV protocol drafts truncating at 4K')"},"actor":{"type":"string","title":"Actor","description":"Identifier of the admin making the change (recorded in the audit row)","default":"admin"}},"type":"object","required":["field","value","reason"],"title":"ConfigUpdateRequest","description":"Apply an in-envelope per-namespace runtime config override (admin only)."},"CreateKeyRequest":{"properties":{"client_name":{"type":"string","title":"Client Name","description":"Unique user key identifier slug (e.g. jane-smith-qa)"},"namespace":{"type":"string","title":"Namespace","description":"Shared data namespace — all users with the same namespace share the same documents and logs (e.g. acme-pharma). Defaults to client_name if omitted.","default":""},"tier":{"type":"string","title":"Tier","description":"Subscription tier: demo, basic, professional, enterprise","default":"basic"},"display_name":{"type":"string","title":"Display Name","description":"Human-readable name shown in the UI header","default":""},"user_name":{"type":"string","title":"User Name","description":"Full name of the individual user (for 21 CFR Part 11 audit trail)","default":""},"contact_email":{"type":"string","title":"Contact Email","description":"Contact email for the individual user","default":""},"rate_limit_daily":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rate Limit Daily","description":"Override daily query limit"},"expires_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires Days","description":"Override expiry in days"}},"type":"object","required":["client_name"],"title":"CreateKeyRequest","description":"Create a new client API key."},"DocumentInfo":{"properties":{"filename":{"type":"string","title":"Filename"},"doc_type":{"type":"string","title":"Doc Type"},"chunks":{"type":"integer","title":"Chunks"}},"type":"object","required":["filename","doc_type","chunks"],"title":"DocumentInfo"},"DraftSaveRequest":{"properties":{"content":{"type":"string","title":"Content","description":"Full Markdown content of the protocol draft"}},"type":"object","required":["content"],"title":"DraftSaveRequest","description":"Save edited Markdown content for a protocol draft."},"FeedbackRequest":{"properties":{"timestamp":{"type":"string","title":"Timestamp","description":"Timestamp of the query to rate"},"feedback":{"type":"string","title":"Feedback","description":"thumbs_up or thumbs_down"}},"type":"object","required":["timestamp","feedback"],"title":"FeedbackRequest","description":"Submit feedback for a query."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IngestDirectoryRequest":{"properties":{"directory":{"type":"string","title":"Directory","description":"Path to the directory containing documents"}},"type":"object","required":["directory"],"title":"IngestDirectoryRequest","description":"Ingest all documents from a directory."},"IngestDirectoryResult":{"properties":{"status":{"type":"string","title":"Status"},"documents_processed":{"type":"integer","title":"Documents Processed"},"total_chunks":{"type":"integer","title":"Total Chunks"},"details":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Details"}},"type":"object","required":["status","documents_processed","total_chunks","details"],"title":"IngestDirectoryResult"},"IngestFileRequest":{"properties":{"filepath":{"type":"string","title":"Filepath","description":"Path to the document file"}},"type":"object","required":["filepath"],"title":"IngestFileRequest","description":"Ingest a document from a file path on the server.","examples":[{"filepath":"/data/pharma_docs/SOP-001-Cleaning.pdf"}]},"IngestResult":{"properties":{"status":{"type":"string","title":"Status"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename"},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"},"chunks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Chunks"},"embedded":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Embedded"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["status"],"title":"IngestResult"},"IngestTextRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text","description":"Document text content"},"filename":{"type":"string","title":"Filename","description":"Logical filename for citation"},"doc_type":{"type":"string","title":"Doc Type","description":"Document type classification","default":"General"}},"type":"object","required":["text","filename"],"title":"IngestTextRequest","description":"Ingest raw text directly.","examples":[{"doc_type":"SOP","filename":"SOP-CLEAN-001.txt","text":"Section 1.1: All cleaning procedures must be validated..."}]},"LogEntry":{"properties":{"timestamp":{"type":"string","title":"Timestamp"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"key_owner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Owner"},"key_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Id"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query"},"answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Answer"},"sources":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Sources"},"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback"},"latency_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Latency Ms"},"answer_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Answer Hash"},"prev_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prev Hash"},"blocked":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Blocked"},"contract_violation":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Contract Violation"}},"type":"object","required":["timestamp"],"title":"LogEntry"},"ModeInfo":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"}},"type":"object","required":["id","name","description"],"title":"ModeInfo"},"PQGenerateRequest":{"properties":{"client_name":{"type":"string","title":"Client Name"},"tester":{"type":"string","title":"Tester"},"approver":{"type":"string","title":"Approver"},"environment":{"type":"string","title":"Environment"}},"type":"object","required":["client_name","tester","approver","environment"],"title":"PQGenerateRequest"},"ProtocolGenerateRequest":{"properties":{"client_name":{"type":"string","title":"Client Name","description":"Client site name"},"tester":{"type":"string","title":"Tester","description":"Validation lead / person preparing the protocol"},"reviewer":{"type":"string","title":"Reviewer","description":"QA reviewer name","default":""},"approver":{"type":"string","title":"Approver","description":"QA Manager who will approve"},"environment":{"type":"string","title":"Environment","description":"Environment label","default":"validation"}},"type":"object","required":["client_name","tester","approver"],"title":"ProtocolGenerateRequest","description":"Generate a client-stamped protocol draft (IQ, OQ, or VP)."},"QueryRequest":{"properties":{"question":{"type":"string","maxLength":2000,"minLength":1,"title":"Question","description":"The compliance question to ask"},"mode":{"type":"string","title":"Mode","description":"Operating mode: qa, deviation, capa, csv, part11, mdr, hipaa","default":"qa"},"top_k":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":1.0},{"type":"null"}],"title":"Top K","description":"Number of source chunks to retrieve"},"min_similarity":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Min Similarity","description":"Minimum similarity threshold"},"filter_doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter Doc Type","description":"Filter by document type (SOP, Deviation, CAPA, etc.)"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id","description":"User identifier for audit trail","default":"anonymous"},"client":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client","description":"Client name (admin override only)"}},"type":"object","required":["question"],"title":"QueryRequest","description":"Submit a compliance question.","examples":[{"mode":"qa","question":"What are the cleaning validation requirements for API manufacturing equipment?"},{"mode":"deviation","question":"Viable count excursion in Grade C cleanroom during batch 2024-0142"}]},"QueryResponse":{"properties":{"answer":{"type":"string","title":"Answer"},"sources":{"items":{"$ref":"#/components/schemas/SourceInfo"},"type":"array","title":"Sources"},"mode":{"type":"string","title":"Mode"},"query":{"type":"string","title":"Query"},"latency_ms":{"type":"integer","title":"Latency Ms"},"timestamp":{"type":"string","title":"Timestamp","default":""}},"type":"object","required":["answer","sources","mode","query","latency_ms"],"title":"QueryResponse","description":"Response from ComplianceGxP query."},"RunSuiteRequest":{"properties":{"tester":{"type":"string","title":"Tester"},"environment":{"type":"string","title":"Environment","default":"validation"},"no_api_key":{"type":"boolean","title":"No Api Key","default":false}},"type":"object","required":["tester"],"title":"RunSuiteRequest"},"SourceInfo":{"properties":{"filename":{"type":"string","title":"Filename"},"doc_type":{"type":"string","title":"Doc Type"},"page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page"},"chunk_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Chunk Index"},"similarity_score":{"type":"number","title":"Similarity Score"},"excerpt":{"type":"string","title":"Excerpt"}},"type":"object","required":["filename","doc_type","similarity_score","excerpt"],"title":"SourceInfo"},"StatusResponse":{"properties":{"client":{"type":"string","title":"Client"},"display_name":{"type":"string","title":"Display Name"},"vector_store":{"$ref":"#/components/schemas/VectorStoreStats"},"usage_30d":{"$ref":"#/components/schemas/UsageStats"},"available_modes":{"items":{"$ref":"#/components/schemas/ModeInfo"},"type":"array","title":"Available Modes"}},"type":"object","required":["client","display_name","vector_store","usage_30d","available_modes"],"title":"StatusResponse"},"UpdateKeyRequest":{"properties":{"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier","description":"New subscription tier"},"rate_limit_daily":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rate Limit Daily","description":"New daily query limit"},"allowed_modes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Modes","description":"Allowed query modes"},"expires_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires Days","description":"Extend expiry by N days from now"},"namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace","description":"Reassign to a different shared data namespace"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name","description":"Update display name shown in UI header"},"user_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Name","description":"Update registered full name for audit trail"}},"type":"object","title":"UpdateKeyRequest","description":"Update an existing user key's settings."},"UsageStats":{"properties":{"period_days":{"type":"integer","title":"Period Days"},"total_queries":{"type":"integer","title":"Total Queries"},"unique_users":{"type":"integer","title":"Unique Users"},"modes_used":{"additionalProperties":{"type":"integer"},"type":"object","title":"Modes Used"},"avg_sources_per_query":{"type":"number","title":"Avg Sources Per Query"},"avg_latency_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Avg Latency Ms"},"feedback_positive":{"type":"integer","title":"Feedback Positive"},"feedback_negative":{"type":"integer","title":"Feedback Negative"},"satisfaction_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Satisfaction Rate"}},"type":"object","required":["period_days","total_queries","unique_users","modes_used","avg_sources_per_query","feedback_positive","feedback_negative"],"title":"UsageStats"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VectorStoreStats":{"properties":{"total_chunks":{"type":"integer","title":"Total Chunks"},"dimension":{"type":"integer","title":"Dimension"},"index_type":{"type":"string","title":"Index Type"},"index_path":{"type":"string","title":"Index Path"}},"type":"object","required":["total_chunks","dimension","index_type","index_path"],"title":"VectorStoreStats"}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key"}}}}