{"openapi":"3.1.0","info":{"title":"MemHub REST APIs","summary":"Long-term memory and companion intelligence for AI applications","description":"MemHub 为 AI Agent 和应用提供长期记忆、语义搜索、关系图谱与陪伴式 AI 能力。\n\n## Authentication\n\n业务接口通过 `X-API-Key` 请求头鉴权。管理员 Key 拥有全局权限；租户 Key 绑定租户和\n`scope_prefix`，请求中的 `user_id`、`agent_id`、`group_id` 必须使用该前缀。\n\n## Identifiers and isolation\n\n至少提供 `user_id`、`agent_id` 或 `run_id` 之一。租户隔离会在读写前执行，越权访问返回 HTTP 403。\n\n完整接入指南、代码示例和可搜索接口目录请访问 [/docs](/docs)。","version":"1.1.0"},"paths":{"/configure":{"post":{"summary":"Configure MemHub","description":"Set memory configuration.","operationId":"set_config_configure_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Config"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}},"security":[{"MemHubApiKey":[]}],"tags":["Administration"]}},"/memories":{"post":{"summary":"Create memories","description":"Store new memories.","operationId":"add_memory_memories_post","security":[{"MemHubApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemoryCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}},"tags":["Memories"]},"get":{"summary":"Get memories","description":"Retrieve stored memories.","operationId":"get_all_memories_memories_get","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"run_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Id"}},{"name":"agent_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}},"tags":["Memories"]},"delete":{"summary":"Delete all memories","description":"Delete all memories for a given identifier.","operationId":"delete_all_memories_memories_delete","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"run_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Id"}},{"name":"agent_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}},"tags":["Memories"]}},"/memories/batch":{"post":{"summary":"Batch create memories","description":"Write multiple memory items in one request.\n\nDesigned for T+1 batch pipelines (platform adapters). Each item is\nprocessed independently; per-item failures are returned in the\nresponse so the caller can retry just the failed subset.\n\nScope and agent enforcement:\n  - Every item must be within the caller's tenant scope_prefix.\n  - Items with metadata.subject_type == \"agent\" are forced to\n    infer=False to avoid LLM-over-LLM hallucinations.\n  - Agent items must carry metadata.owner_user_id pointing to the\n    human owner.","operationId":"add_memories_batch_memories_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemoryBatchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}},"security":[{"MemHubApiKey":[]}],"tags":["Memories"]}},"/memories/{memory_id}":{"get":{"summary":"Get a memory","description":"Retrieve a specific memory by ID.","operationId":"get_memory_memories__memory_id__get","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"memory_id","in":"path","required":true,"schema":{"type":"string","title":"Memory Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}},"tags":["Memories"]},"put":{"summary":"Update a memory","description":"Update an existing memory with new content.\n\nArgs:\n    memory_id (str): ID of the memory to update\n    updated_memory (MemoryUpdate): New content and optional metadata to update the memory with\n\nReturns:\n    dict: Success message indicating the memory was updated","operationId":"update_memory_memories__memory_id__put","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"memory_id","in":"path","required":true,"schema":{"type":"string","title":"Memory Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemoryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}},"tags":["Memories"]},"delete":{"summary":"Delete a memory","description":"Delete a specific memory by ID.","operationId":"delete_memory_memories__memory_id__delete","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"memory_id","in":"path","required":true,"schema":{"type":"string","title":"Memory Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}},"tags":["Memories"]}},"/search":{"post":{"summary":"Search memories","description":"Search for memories based on a query.\n\nSupports optional `memory_type` filter (semantic_memory, episodic_memory,\nprocedural_memory) and `episodic_decay` for time-weighted episodic search.","operationId":"search_memories_search_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}},"security":[{"MemHubApiKey":[]}],"tags":["Search"]}},"/memories/{memory_id}/history":{"get":{"summary":"Get memory history","description":"Retrieve memory history.","operationId":"memory_history_memories__memory_id__history_get","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"memory_id","in":"path","required":true,"schema":{"type":"string","title":"Memory Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}},"tags":["Memories"]}},"/reset":{"post":{"summary":"Reset all memories","description":"Completely reset stored memories.","operationId":"reset_memory_reset_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}},"security":[{"MemHubApiKey":[]}],"tags":["Administration"]}},"/extract":{"post":{"summary":"Extract social/episodic/group info from conversation","description":"Run LLM extraction on a conversation WITHOUT storing any memories.\n\nNote: re-implemented in 2026-05-19. Earlier versions called mem0 private\nhelpers (_extract_social_relations / _extract_episodic_events /\n_extract_group_dynamics) which were removed upstream in mem0 0.1.48+.\nWe now drive the LLM directly with focused JSON prompts.","operationId":"extract_from_conversation_extract_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}},"security":[{"MemHubApiKey":[]}],"tags":["Extraction"]}},"/relations":{"post":{"summary":"Create or update a relationship","description":"UPSERT a relationship between two subjects in the graph.\n\nNodes are auto-created if they don't exist. Properties are merged.","operationId":"upsert_relation_relations_post","security":[{"MemHubApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelationCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}},"tags":["Relations"]},"get":{"summary":"Query relationships","description":"Query relationships for a subject from the graph.","operationId":"get_relations_relations_get","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"subject_id","in":"query","required":true,"schema":{"type":"string","description":"Subject ID to query relations for.","title":"Subject Id"},"description":"Subject ID to query relations for."},{"name":"relation_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by relation type.","title":"Relation Type"},"description":"Filter by relation type."},{"name":"target_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by specific target.","title":"Target Id"},"description":"Filter by specific target."},{"name":"direction","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"outgoing, incoming, or both.","default":"both","title":"Direction"},"description":"outgoing, incoming, or both."},{"name":"depth","in":"query","required":false,"schema":{"type":"integer","maximum":3,"minimum":1,"description":"Graph traversal depth (1-3).","default":1,"title":"Depth"},"description":"Graph traversal depth (1-3)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Max results.","default":100,"title":"Limit"},"description":"Max results."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}},"tags":["Relations"]},"delete":{"summary":"Delete relationships","description":"Delete relationships from the graph.\n\nTwo modes:\n- subject_id alone: delete ALL relations and node for that subject.\n- source_id + target_id + relation_type: delete one specific relation.","operationId":"delete_relations_relations_delete","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"subject_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Delete ALL relations for this subject.","title":"Subject Id"},"description":"Delete ALL relations for this subject."},{"name":"source_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Source of the specific relation to delete.","title":"Source Id"},"description":"Source of the specific relation to delete."},{"name":"target_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Target of the specific relation to delete.","title":"Target Id"},"description":"Target of the specific relation to delete."},{"name":"relation_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Type of the specific relation to delete.","title":"Relation Type"},"description":"Type of the specific relation to delete."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}},"tags":["Relations"]}},"/relations/batch":{"post":{"summary":"Batch upsert relationships","description":"Write multiple relationships in one request. Partial failures per-item.","operationId":"upsert_relations_batch_relations_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelationBatchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}},"security":[{"MemHubApiKey":[]}],"tags":["Relations"]}},"/v1/users/{user_id}/episodes":{"post":{"tags":["Companion"],"summary":"Write episode and run evolution","operationId":"write_episode_v1_users__user_id__episodes_post","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EpisodeIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}}}},"/v1/users/{user_id}/relationships":{"get":{"tags":["Companion"],"summary":"List relationships for user","operationId":"list_relationships_v1_users__user_id__relationships_get","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}}}},"/v1/users/{user_id}/relationships/{persona_id}":{"get":{"tags":["Companion"],"summary":"Get single relationship","operationId":"get_relationship_v1_users__user_id__relationships__persona_id__get","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"persona_id","in":"path","required":true,"schema":{"type":"string","title":"Persona Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}}},"patch":{"tags":["Companion"],"summary":"Override metrics (admin/debug)","operationId":"patch_relationship_v1_users__user_id__relationships__persona_id__patch","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"persona_id","in":"path","required":true,"schema":{"type":"string","title":"Persona Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelationshipPatchIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}}}},"/v1/users/{user_id}/relationships/{persona_id}/reset":{"post":{"tags":["Companion"],"summary":"Reset relationship","operationId":"reset_relationship_v1_users__user_id__relationships__persona_id__reset_post","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"persona_id","in":"path","required":true,"schema":{"type":"string","title":"Persona Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}}}},"/v1/users/{user_id}/relationships/{persona_id}/milestones":{"get":{"tags":["Companion"],"summary":"List milestones","operationId":"list_milestones_v1_users__user_id__relationships__persona_id__milestones_get","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"persona_id","in":"path","required":true,"schema":{"type":"string","title":"Persona Id"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}}}},"/v1/users/{user_id}/relationships/{persona_id}/recent-chat":{"get":{"tags":["Companion"],"summary":"Last N user/assistant turns as OpenAI messages array","description":"Return the most-recent N episodes for this relationship, rendered\nas an OpenAI chat-completions ``messages`` array so a freshly-started\nagent daemon can hydrate its in-memory ``self.history`` and not \"forget\"\nthe immediately-preceding conversation across restarts.","operationId":"recent_chat_v1_users__user_id__relationships__persona_id__recent_chat_get","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"persona_id","in":"path","required":true,"schema":{"type":"string","title":"Persona Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}}}},"/v1/users/{user_id}/relationships/{persona_id}/stickiness_recall":{"get":{"tags":["Companion"],"summary":"Asset value + narrative","operationId":"stickiness_recall_v1_users__user_id__relationships__persona_id__stickiness_recall_get","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"persona_id","in":"path","required":true,"schema":{"type":"string","title":"Persona Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}}}},"/v1/users/{user_id}/relationships/{persona_id}/signal":{"post":{"tags":["Companion"],"summary":"App-side signal (trust nudges, joke landed, etc.)","operationId":"submit_signal_v1_users__user_id__relationships__persona_id__signal_post","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"persona_id","in":"path","required":true,"schema":{"type":"string","title":"Persona Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignalIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}}}},"/v1/users/{user_id}/emotion/extract":{"post":{"tags":["Companion"],"summary":"Sync emotion scoring","operationId":"emotion_extract_v1_users__user_id__emotion_extract_post","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmotionExtractIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}}}},"/v1/users/{user_id}/emotion/extract-audio":{"post":{"tags":["Companion"],"summary":"Acoustic emotion scoring (+ optional text fusion)","operationId":"emotion_extract_audio_v1_users__user_id__emotion_extract_audio_post","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmotionAudioIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}}}},"/v1/users/{user_id}/relationships/{persona_id}/reprocess":{"post":{"tags":["Companion"],"summary":"Backfill historical episodes into mem0 fact extraction","operationId":"reprocess_relationship_v1_users__user_id__relationships__persona_id__reprocess_post","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"persona_id","in":"path","required":true,"schema":{"type":"string","title":"Persona Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReprocessIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}}}},"/v1/jobs/{job_id}":{"get":{"tags":["Jobs"],"summary":"Inspect a long-running job","operationId":"get_job_v1_jobs__job_id__get","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}}}},"/v1/jobs":{"get":{"tags":["Jobs"],"summary":"List recent jobs (tenant-scoped)","operationId":"list_jobs_v1_jobs_get","security":[{"MemHubApiKey":[]}],"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"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}}}},"/v1/webhooks":{"get":{"tags":["Webhooks"],"summary":"List your tenant's webhook subscriptions","operationId":"list_webhooks_v1_webhooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}},"security":[{"MemHubApiKey":[]}]},"post":{"tags":["Webhooks"],"summary":"Subscribe a webhook","operationId":"create_webhook_v1_webhooks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreateIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}},"security":[{"MemHubApiKey":[]}]}},"/v1/webhooks/{webhook_id}":{"delete":{"tags":["Webhooks"],"summary":"Delete a webhook subscription","operationId":"delete_webhook_v1_webhooks__webhook_id__delete","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}}}},"/v1/webhooks/{webhook_id}/test":{"post":{"tags":["Webhooks"],"summary":"Send a synthetic test event","operationId":"test_webhook_v1_webhooks__webhook_id__test_post","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}}}},"/v1/webhooks/{webhook_id}/deliveries":{"get":{"tags":["Webhooks"],"summary":"Recent delivery attempts for a webhook","operationId":"webhook_deliveries_v1_webhooks__webhook_id__deliveries_get","security":[{"MemHubApiKey":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid X-API-Key."},"403":{"description":"Tenant disabled, insufficient permission, or identifier outside the tenant scope."},"429":{"description":"Rate limit exceeded. Retry with exponential backoff."},"503":{"description":"Memory backend or upstream AI provider temporarily unavailable."}}}}},"components":{"schemas":{"EmotionAudioIn":{"properties":{"audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Url","description":"HTTPS URL pointing to audio (wav/opus/mp3/m4a/flac/ogg)."},"audio_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Base64","description":"Inline base64-encoded audio bytes."},"text_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text Hint","description":"If provided, text emotion is also computed and fused with acoustic."}},"type":"object","title":"EmotionAudioIn"},"EmotionExtractIn":{"properties":{"text":{"type":"string","title":"Text"},"channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel","default":"text"}},"type":"object","required":["text"],"title":"EmotionExtractIn"},"EpisodeIn":{"properties":{"persona_id":{"type":"string","title":"Persona Id","description":"App-scoped persona, e.g. 'qiaoqiao_wan'"},"channel":{"type":"string","enum":["text","voice","realtime_call","proactive"],"title":"Channel","default":"text"},"occurred_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Occurred At"},"user_utterance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Utterance"},"assistant_utterance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assistant Utterance"},"topics":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Topics"},"entities":{"anyOf":[{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object"},{"type":"null"}],"title":"Entities"},"importance":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Importance"},"visibility":{"anyOf":[{"type":"string","enum":["persona_only","shared_with_profile","cross_persona"]},{"type":"null"}],"title":"Visibility","default":"shared_with_profile"},"voice_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Voice Seconds","default":0},"app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Id"},"client_emotion":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Client Emotion","description":"Pre-computed emotion from app side; if absent, memhub will extract."},"audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Url","description":"Optional audio URL. If provided AND channel is voice/realtime_call, acoustic emotion is extracted and fused with text emotion."},"auto_extract_facts":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Extract Facts","description":"If true, asynchronously feed user_utterance into mem0 fact extraction (adds 1–3s of background work per episode). The episode response returns immediately with `mem0_extraction_scheduled: true`. Final fact count is written back to companion_episode.mem0_facts_count.","default":false}},"type":"object","required":["persona_id"],"title":"EpisodeIn"},"ExtractRequest":{"properties":{"messages":{"items":{"$ref":"#/components/schemas/Message"},"type":"array","title":"Messages","description":"Conversation messages to analyze."},"extract_relations":{"type":"boolean","title":"Extract Relations","description":"Extract social relationships.","default":false},"extract_events":{"type":"boolean","title":"Extract Events","description":"Extract episodic events.","default":false},"extract_group_dynamics":{"type":"boolean","title":"Extract Group Dynamics","description":"Extract group dynamics from multi-party conversation.","default":false}},"type":"object","required":["messages"],"title":"ExtractRequest","description":"Request body for on-demand LLM extraction (without storing memories)."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"MemoryBatchItem":{"properties":{"messages":{"items":{"$ref":"#/components/schemas/Message"},"type":"array","title":"Messages","description":"Messages for this memory item."},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Id"},"run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Id"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"infer":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Infer","description":"Defaults to True for humans, forced False for agents (subject_type=='agent')."},"memory_type":{"anyOf":[{"type":"string","enum":["procedural_memory","episodic_memory"]},{"type":"null"}],"title":"Memory Type"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"}},"type":"object","required":["messages"],"title":"MemoryBatchItem","description":"One memory item in a batch request.\n\nSupports the dual-subject model:\n  - Human user:  set user_id = \"<tenant>_u_<uid>\"\n  - AI agent:    set agent_id = \"<tenant>_a_<owner_uid>_<slug>\"\n\nFor agents, metadata.subject_type must be \"agent\" and metadata.owner_user_id\nmust point to the human owner. The backend will auto-force infer=False for\nagent items to avoid LLM-over-LLM hallucinations."},"MemoryBatchRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MemoryBatchItem"},"type":"array","title":"Items","description":"Items to write. Max 200 per call."}},"type":"object","required":["items"],"title":"MemoryBatchRequest","description":"Batch write request. Partial failures are returned per-item."},"MemoryCreate":{"properties":{"messages":{"items":{"$ref":"#/components/schemas/Message"},"type":"array","title":"Messages","description":"List of messages to store."},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Id"},"run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Id"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"infer":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Infer","description":"Whether to extract facts from messages. Defaults to True."},"memory_type":{"anyOf":[{"type":"string","enum":["procedural_memory","episodic_memory"]},{"type":"null"}],"title":"Memory Type","description":"Optional. Omit for regular memories. Use 'procedural_memory' only when creating procedural memory."},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt","description":"Custom prompt to use for fact extraction."},"extract_relations":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Extract Relations","description":"Enable LLM-based social relationship extraction from conversation.","default":false},"extract_events":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Extract Events","description":"Enable LLM-based episodic event extraction from conversation.","default":false}},"type":"object","required":["messages"],"title":"MemoryCreate"},"MemoryUpdate":{"properties":{"text":{"type":"string","title":"Text","description":"New content to update the memory with."},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Metadata to update."}},"type":"object","required":["text"],"title":"MemoryUpdate"},"Message":{"properties":{"role":{"type":"string","title":"Role","description":"Role of the message (user or assistant)."},"content":{"type":"string","title":"Content","description":"Message content."}},"type":"object","required":["role","content"],"title":"Message"},"RelationBatchRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/RelationCreate"},"type":"array","title":"Items","description":"Relations to upsert. Max 200 per call."}},"type":"object","required":["items"],"title":"RelationBatchRequest"},"RelationCreate":{"properties":{"source_id":{"type":"string","title":"Source Id","description":"Source subject ID."},"source_type":{"type":"string","enum":["human","agent","group"],"title":"Source Type","description":"Source subject type."},"target_id":{"type":"string","title":"Target Id","description":"Target subject ID."},"target_type":{"type":"string","enum":["human","agent","group"],"title":"Target Type","description":"Target subject type."},"relation_type":{"type":"string","title":"Relation Type","description":"Relationship type (e.g. CO_PRESENT, OWNS, GIFTED)."},"properties":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Properties","description":"Relationship attributes (count, since, etc.)."}},"type":"object","required":["source_id","source_type","target_id","target_type","relation_type"],"title":"RelationCreate"},"RelationshipPatchIn":{"properties":{"intimacy":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Intimacy"},"trust":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Trust"},"dependency":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dependency"},"rapport":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rapport"},"uniqueness_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uniqueness Score"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","title":"RelationshipPatchIn"},"ReprocessIn":{"properties":{"since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"},"until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Until"},"max_episodes":{"type":"integer","maximum":20000.0,"minimum":1.0,"title":"Max Episodes","default":5000},"channels":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Channels"},"min_importance":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Min Importance","default":0.0},"rate_per_second":{"type":"number","maximum":20.0,"exclusiveMinimum":0.0,"title":"Rate Per Second","description":"DomiMuse extraction throttle. Defaults to 2 req/sec.","default":2.0},"skip_already_processed":{"type":"boolean","title":"Skip Already Processed","default":true},"only_failed":{"type":"boolean","title":"Only Failed","description":"Only retry episodes whose previous mem0 extraction failed.","default":false},"dry_run":{"type":"boolean","title":"Dry Run","default":false}},"type":"object","title":"ReprocessIn","description":"Backfill historical episodes through mem0 fact extraction (AC1 / reprocess)."},"SearchRequest":{"properties":{"query":{"type":"string","title":"Query","description":"Search query."},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Id"},"agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Id"},"filters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Filters"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit","description":"Maximum number of results to return."},"threshold":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Threshold","description":"Minimum similarity score for results."},"memory_type":{"anyOf":[{"type":"string","enum":["semantic_memory","episodic_memory","procedural_memory"]},{"type":"null"}],"title":"Memory Type","description":"Filter results by memory type."},"episodic_decay":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Episodic Decay","description":"Time decay lambda for episodic search. Higher = faster decay. Default 0.01 (~70 day half-life)."}},"type":"object","required":["query"],"title":"SearchRequest"},"SignalIn":{"properties":{"signal_type":{"type":"string","enum":["joke_landed","memory_test_passed","memory_test_failed","user_corrected_ai","user_thanked","user_complained"],"title":"Signal Type"},"episode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Episode Id"},"confidence":{"type":"number","title":"Confidence","default":0.9},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","required":["signal_type"],"title":"SignalIn"},"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"},"WebhookCreateIn":{"properties":{"url":{"type":"string","title":"Url","description":"HTTPS endpoint to POST events to."},"events":{"items":{"type":"string"},"type":"array","title":"Events","description":"Event types to subscribe to."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret","description":"HMAC-SHA256 secret. Omit to have memhub generate one — the generated value is returned ONCE on create."}},"type":"object","required":["url","events"],"title":"WebhookCreateIn"}},"securitySchemes":{"MemHubApiKey":{"type":"apiKey","description":"MemHub admin or tenant API key. Tenant keys are restricted to their assigned scope_prefix.","in":"header","name":"X-API-Key"}}},"tags":[{"name":"Memories","description":"写入、读取、更新、历史与删除长期记忆。"},{"name":"Search","description":"使用自然语言和结构化过滤条件检索记忆。"},{"name":"Extraction","description":"从对话中提取社交事实、事件与群组信息。"},{"name":"Relations","description":"创建、查询和删除实体之间的关系。"},{"name":"Companion","description":"陪伴式 AI 的关系演化、情绪、里程碑与信号。"},{"name":"Jobs","description":"查询租户作用域内的异步任务。"},{"name":"Webhooks","description":"管理事件订阅和投递记录。"},{"name":"Administration","description":"管理员配置、重置和 Companion 运维接口。"}],"servers":[{"url":"https://memhub0.sonari.dev","description":"Production"},{"url":"http://localhost:8000","description":"Local development"}],"externalDocs":{"description":"MemHub developer guide and runnable examples","url":"https://memhub0.sonari.dev/docs"}}