Files
Memoh/spec/swagger.yaml
T
Acbox Liu 43c4153938 feat: introduce DCP pipeline layer for unified context assembly (#329)
* refactor: introduce DCP pipeline layer for unified context assembly

Introduce a Deterministic Context Pipeline (DCP) inspired by Cahciua,
providing event-driven context assembly for LLM conversations.

- Add `internal/pipeline/` package with Canonical Event types, Projection
  (reduce), Rendering (XML RC), Pipeline manager, and EventStore persistence
- Change user message format from YAML front-matter to XML `<message>` tags
  with self-contained attributes (sender, channel, conversation, type)
- Merge CLI/Web dual API into single `/local/` endpoint, remove CLI handler
- Add `bot_session_events` table for event persistence and cold-start replay
- Add `discuss` session type (reserved for future Cahciua-style mode)
- Wire pipeline into HandleInbound: adapt → persist → push on every message
- Lazy cold-start replay: load events from DB on first session access

* feat: implement discuss mode with reactive driver and probe gate

Add discuss session mode where the bot autonomously decides when to speak
in group chats via tool-gated output (send tool only, no direct text reply).

- Add discuss driver (per-session goroutine, RC watch, step loop via
  agent.Generate, TR persistence, late-binding prompt with mention hints)
- Add system_discuss.md prompt template ("text = inner monologue, send = speak")
- Add context composition (MergeContext, ComposeContext, TrimContext) for
  RC + assistant/tool message interleaving by timestamp
- Add probe gate: when discuss_probe_model_id is set, cheap model pre-filters
  group messages; no tool calls = silence, tool calls = activate primary
- Add /new [chat|discuss] command: explicit mode selection, defaults to
  discuss in groups, chat in DMs, chat-only for WebUI
- Add ResolveRunConfig on flow.Resolver for discuss driver to reuse
  model/tools/system-prompt resolution without reimplementing
- Fix send tool for discuss mode: same-conversation sends now go through
  SendDirect (channel adapter) instead of the local emitter shortcut
- Add target attribute to XML message format (reply_target for routing)
- Add discuss_probe_model_id to bots table settings
- Remove pipeline compaction (SetCompactCursor) — reuse existing compaction.Service
- Persist full SDK messages (including tool calls) in discuss mode

* refactor: unify DCP event layer, fix persistence and local channel

- Fix bot_session_events dedup index to include event_kind so that
  message + edit events for the same external_message_id coexist.
- Change CreateSessionEvent from :one to :exec so ON CONFLICT DO NOTHING
  does not produce spurious errors on duplicate delivery.
- Move ACL evaluation before event ingest; denied messages no longer
  enter bot_session_events or the in-memory pipeline.
- Let chat mode consume RenderedContext from the DCP pipeline when
  available, sharing the same event-driven context assembly as discuss.
- Collapse local WebSocket handler to route through HandleInbound
  instead of directly calling StreamChatWS, eliminating the dual
  business entry point.
- Extract buildBaseRunConfig shared builder so resolve() and
  ResolveRunConfig() no longer duplicate model/credentials/skills setup.
- Add StoreRound to RunConfigResolver interface so discuss driver
  persists assistant output with full metadata, usage, and memory
  extraction (same quality as chat mode).
- Fix discuss driver context: use context.Background() instead of the
  short-lived HTTP request context that was getting cancelled.
- Fix model ID passed to StoreRound: return database UUID from
  ResolveRunConfig instead of SDK model name.
- Remove dead CLIAdapter/CLIType and update legacy web/cli references
  in tests and comments.

* fix: stop idle discuss goroutines after 10min timeout

Discuss session goroutines were never cleaned up when a session became
inactive (e.g. after /new). Add a 10-minute idle timer that auto-exits
the goroutine and removes it from the sessions map when no new RC
arrives.

* refactor: pipeline details — event types, structured reply, display content

- Remove [User sent N attachments] placeholder text from buildInboundQuery;
  attachment info is now expressed via pipeline <attachment> tags.
- Unify in-reply-to as structured ReplyRef (Sender/Preview fields) across
  Telegram, Discord, Feishu, and Matrix adapters instead of prepending
  [Reply to ...] text into the message body. Remove now-unused
  buildTelegramQuotedText, buildDiscordQuotedText, buildMatrixQuotedText.
- Make AdaptInbound return CanonicalEvent interface and dispatch to
  adaptMessage/adaptEdit/adaptService based on metadata["event_type"].
- Add event_id column to bot_history_messages (migration 0059) so user
  messages can reference their canonical pipeline event.
- PersistEvent now returns the event UUID; HandleInbound passes it through
  to both persistPassiveMessage and ChatRequest.EventID for storeRound.
- Add FillDisplayContent to message service: extracts plain text from
  event_data for clean frontend display.
- Frontend extractMessageText prefers display_content when available,
  falling back to legacy strip logic for old messages.
- Fix: always generate headerifiedQuery for storage even when usePipeline
  is true, so user messages are persisted via storeRound in chat mode.

* fix: use json.Marshal for pipeline context content serialization

The manual string escaping in buildMessagesFromPipeline only handled
double quotes but not newlines, backslashes, and other JSON special
characters, producing invalid json.RawMessage values. The LLM then
received empty/malformed context and complained about having no history.

* fix: restore WebSocket handler to use StreamChatWS directly

The previous refactoring replaced the WS handler with HandleInbound +
RouteHub subscription, which broke streaming because RouteHub events
use a different format (channel.StreamEvent) than what the frontend
expects (flow.WSStreamEvent with text_delta, tool_call_start, etc.).

Restore the original direct StreamChatWS call path so WebUI streaming
works again. The WS handler now matches the pre-refactoring behavior
while all other changes (pipeline, ACL, event types, etc.) are kept.

* feat: store display_text directly in bot_history_messages

Instead of computing display content at API response time by querying
bot_session_events via event_id, store the raw user text in a dedicated
display_text column at write time. This works for all paths including
the WebSocket handler which does not go through the pipeline/event layer.

- Migration 0060: add display_text TEXT column
- PersistInput gains DisplayText; filled from trimmedText (passive) and
  req.Query (storeRound)
- toMessageFields reads display_text into DisplayContent
- Remove FillDisplayContent runtime query and ListSessionEventsByEventID
- Frontend already prefers display_content when available (no change)

* fix: display_text should contain raw user text, not XML-wrapped query

req.Query gets overwritten to headerifiedQuery (with XML <message> tags)
before storeRound runs. Add RawQuery field to ChatRequest to preserve
the original user text, and use it for display_text in storeMessages.

* fix(web): show discuss sessions

* refactor: introduce DCP pipeline layer for unified context assembly

Introduce a Deterministic Context Pipeline (DCP) inspired by Cahciua,
providing event-driven context assembly for LLM conversations.

- Add `internal/pipeline/` package with Canonical Event types, Projection
  (reduce), Rendering (XML RC), Pipeline manager, and EventStore persistence
- Change user message format from YAML front-matter to XML `<message>` tags
  with self-contained attributes (sender, channel, conversation, type)
- Merge CLI/Web dual API into single `/local/` endpoint, remove CLI handler
- Add `bot_session_events` table for event persistence and cold-start replay
- Add `discuss` session type (reserved for future Cahciua-style mode)
- Wire pipeline into HandleInbound: adapt → persist → push on every message
- Lazy cold-start replay: load events from DB on first session access

* feat: implement discuss mode with reactive driver and probe gate

Add discuss session mode where the bot autonomously decides when to speak
in group chats via tool-gated output (send tool only, no direct text reply).

- Add discuss driver (per-session goroutine, RC watch, step loop via
  agent.Generate, TR persistence, late-binding prompt with mention hints)
- Add system_discuss.md prompt template ("text = inner monologue, send = speak")
- Add context composition (MergeContext, ComposeContext, TrimContext) for
  RC + assistant/tool message interleaving by timestamp
- Add probe gate: when discuss_probe_model_id is set, cheap model pre-filters
  group messages; no tool calls = silence, tool calls = activate primary
- Add /new [chat|discuss] command: explicit mode selection, defaults to
  discuss in groups, chat in DMs, chat-only for WebUI
- Add ResolveRunConfig on flow.Resolver for discuss driver to reuse
  model/tools/system-prompt resolution without reimplementing
- Fix send tool for discuss mode: same-conversation sends now go through
  SendDirect (channel adapter) instead of the local emitter shortcut
- Add target attribute to XML message format (reply_target for routing)
- Add discuss_probe_model_id to bots table settings
- Remove pipeline compaction (SetCompactCursor) — reuse existing compaction.Service
- Persist full SDK messages (including tool calls) in discuss mode

* refactor: unify DCP event layer, fix persistence and local channel

- Fix bot_session_events dedup index to include event_kind so that
  message + edit events for the same external_message_id coexist.
- Change CreateSessionEvent from :one to :exec so ON CONFLICT DO NOTHING
  does not produce spurious errors on duplicate delivery.
- Move ACL evaluation before event ingest; denied messages no longer
  enter bot_session_events or the in-memory pipeline.
- Let chat mode consume RenderedContext from the DCP pipeline when
  available, sharing the same event-driven context assembly as discuss.
- Collapse local WebSocket handler to route through HandleInbound
  instead of directly calling StreamChatWS, eliminating the dual
  business entry point.
- Extract buildBaseRunConfig shared builder so resolve() and
  ResolveRunConfig() no longer duplicate model/credentials/skills setup.
- Add StoreRound to RunConfigResolver interface so discuss driver
  persists assistant output with full metadata, usage, and memory
  extraction (same quality as chat mode).
- Fix discuss driver context: use context.Background() instead of the
  short-lived HTTP request context that was getting cancelled.
- Fix model ID passed to StoreRound: return database UUID from
  ResolveRunConfig instead of SDK model name.
- Remove dead CLIAdapter/CLIType and update legacy web/cli references
  in tests and comments.

* fix: stop idle discuss goroutines after 10min timeout

Discuss session goroutines were never cleaned up when a session became
inactive (e.g. after /new). Add a 10-minute idle timer that auto-exits
the goroutine and removes it from the sessions map when no new RC
arrives.

* refactor: pipeline details — event types, structured reply, display content

- Remove [User sent N attachments] placeholder text from buildInboundQuery;
  attachment info is now expressed via pipeline <attachment> tags.
- Unify in-reply-to as structured ReplyRef (Sender/Preview fields) across
  Telegram, Discord, Feishu, and Matrix adapters instead of prepending
  [Reply to ...] text into the message body. Remove now-unused
  buildTelegramQuotedText, buildDiscordQuotedText, buildMatrixQuotedText.
- Make AdaptInbound return CanonicalEvent interface and dispatch to
  adaptMessage/adaptEdit/adaptService based on metadata["event_type"].
- Add event_id column to bot_history_messages (migration 0059) so user
  messages can reference their canonical pipeline event.
- PersistEvent now returns the event UUID; HandleInbound passes it through
  to both persistPassiveMessage and ChatRequest.EventID for storeRound.
- Add FillDisplayContent to message service: extracts plain text from
  event_data for clean frontend display.
- Frontend extractMessageText prefers display_content when available,
  falling back to legacy strip logic for old messages.
- Fix: always generate headerifiedQuery for storage even when usePipeline
  is true, so user messages are persisted via storeRound in chat mode.

* fix: use json.Marshal for pipeline context content serialization

The manual string escaping in buildMessagesFromPipeline only handled
double quotes but not newlines, backslashes, and other JSON special
characters, producing invalid json.RawMessage values. The LLM then
received empty/malformed context and complained about having no history.

* fix: restore WebSocket handler to use StreamChatWS directly

The previous refactoring replaced the WS handler with HandleInbound +
RouteHub subscription, which broke streaming because RouteHub events
use a different format (channel.StreamEvent) than what the frontend
expects (flow.WSStreamEvent with text_delta, tool_call_start, etc.).

Restore the original direct StreamChatWS call path so WebUI streaming
works again. The WS handler now matches the pre-refactoring behavior
while all other changes (pipeline, ACL, event types, etc.) are kept.

* feat: store display_text directly in bot_history_messages

Instead of computing display content at API response time by querying
bot_session_events via event_id, store the raw user text in a dedicated
display_text column at write time. This works for all paths including
the WebSocket handler which does not go through the pipeline/event layer.

- Migration 0060: add display_text TEXT column
- PersistInput gains DisplayText; filled from trimmedText (passive) and
  req.Query (storeRound)
- toMessageFields reads display_text into DisplayContent
- Remove FillDisplayContent runtime query and ListSessionEventsByEventID
- Frontend already prefers display_content when available (no change)

* fix: display_text should contain raw user text, not XML-wrapped query

req.Query gets overwritten to headerifiedQuery (with XML <message> tags)
before storeRound runs. Add RawQuery field to ChatRequest to preserve
the original user text, and use it for display_text in storeMessages.

* fix(web): show discuss sessions

* chore(feishu): change discuss output to stream card

* fix(channel): unify discuss/chat send path and card markdown delivery

* feat(discuss): switch to stream execution with RouteHub broadcasting

* refactor(pipeline): remove context trimming from ComposeContext

The pipeline path should not trim context by token budget — the
upstream IC/RC already bounds the event window. Remove TrimContext,
FindWorkingWindowCursor, EstimateTokens, FormatLastProcessedMs (all
unused or only used for trimming), the maxTokens parameter from
ComposeContext, and MaxContextTokens from DiscussSessionConfig.

---------

Co-authored-by: 晨苒 <16112591+chen-ran@users.noreply.github.com>
2026-04-06 21:56:25 +08:00

8728 lines
216 KiB
YAML

definitions:
accounts.Account:
properties:
avatar_url:
type: string
created_at:
type: string
display_name:
type: string
email:
type: string
id:
type: string
is_active:
type: boolean
last_login_at:
type: string
role:
type: string
timezone:
type: string
updated_at:
type: string
username:
type: string
type: object
accounts.CreateAccountRequest:
properties:
avatar_url:
type: string
display_name:
type: string
email:
type: string
is_active:
type: boolean
password:
type: string
role:
type: string
username:
type: string
type: object
accounts.ListAccountsResponse:
properties:
items:
items:
$ref: '#/definitions/accounts.Account'
type: array
type: object
accounts.ResetPasswordRequest:
properties:
new_password:
type: string
type: object
accounts.UpdateAccountRequest:
properties:
avatar_url:
type: string
display_name:
type: string
is_active:
type: boolean
role:
type: string
type: object
accounts.UpdatePasswordRequest:
properties:
current_password:
type: string
new_password:
type: string
type: object
accounts.UpdateProfileRequest:
properties:
avatar_url:
type: string
display_name:
type: string
timezone:
type: string
type: object
acl.ChannelIdentityCandidate:
properties:
avatar_url:
type: string
channel:
type: string
channel_subject_id:
type: string
display_name:
type: string
id:
type: string
linked_avatar_url:
type: string
linked_display_name:
type: string
linked_user_id:
type: string
linked_username:
type: string
type: object
acl.ChannelIdentityCandidateListResponse:
properties:
items:
items:
$ref: '#/definitions/acl.ChannelIdentityCandidate'
type: array
type: object
acl.CreateRuleRequest:
properties:
channel_identity_id:
type: string
description:
type: string
effect:
type: string
enabled:
type: boolean
priority:
type: integer
source_scope:
$ref: '#/definitions/acl.SourceScope'
subject_channel_type:
type: string
subject_kind:
type: string
type: object
acl.DefaultEffectResponse:
properties:
default_effect:
type: string
type: object
acl.ListRulesResponse:
properties:
items:
items:
$ref: '#/definitions/acl.Rule'
type: array
type: object
acl.ObservedConversationCandidate:
properties:
channel:
type: string
conversation_id:
type: string
conversation_name:
type: string
conversation_type:
type: string
last_observed_at:
type: string
route_id:
type: string
thread_id:
type: string
type: object
acl.ObservedConversationCandidateListResponse:
properties:
items:
items:
$ref: '#/definitions/acl.ObservedConversationCandidate'
type: array
type: object
acl.ReorderItem:
properties:
id:
type: string
priority:
type: integer
type: object
acl.ReorderRequest:
properties:
items:
items:
$ref: '#/definitions/acl.ReorderItem'
type: array
type: object
acl.Rule:
properties:
action:
type: string
bot_id:
type: string
channel_identity_avatar_url:
type: string
channel_identity_display_name:
type: string
channel_identity_id:
type: string
channel_subject_id:
type: string
channel_type:
type: string
created_at:
type: string
description:
type: string
effect:
type: string
enabled:
type: boolean
id:
type: string
linked_user_avatar_url:
type: string
linked_user_display_name:
type: string
linked_user_id:
type: string
linked_user_username:
type: string
priority:
type: integer
source_scope:
$ref: '#/definitions/acl.SourceScope'
subject_channel_type:
type: string
subject_kind:
type: string
updated_at:
type: string
type: object
acl.SourceScope:
properties:
conversation_id:
type: string
conversation_type:
type: string
thread_id:
type: string
type: object
acl.UpdateRuleRequest:
properties:
channel_identity_id:
type: string
description:
type: string
effect:
type: string
enabled:
type: boolean
priority:
type: integer
source_scope:
$ref: '#/definitions/acl.SourceScope'
subject_channel_type:
type: string
subject_kind:
type: string
type: object
adapters.CDFPoint:
properties:
cumulative:
description: cumulative weight fraction [0.0, 1.0]
type: number
k:
description: rank position (1-based, sorted by value desc)
type: integer
type: object
adapters.CompactResult:
properties:
after_count:
type: integer
before_count:
type: integer
ratio:
type: number
results:
items:
$ref: '#/definitions/adapters.MemoryItem'
type: array
type: object
adapters.DeleteResponse:
properties:
message:
type: string
type: object
adapters.HealthStatus:
properties:
error:
type: string
ok:
type: boolean
type: object
adapters.MemoryItem:
properties:
agent_id:
type: string
bot_id:
type: string
cdf_curve:
items:
$ref: '#/definitions/adapters.CDFPoint'
type: array
created_at:
type: string
hash:
type: string
id:
type: string
memory:
type: string
metadata:
additionalProperties: {}
type: object
run_id:
type: string
score:
type: number
top_k_buckets:
items:
$ref: '#/definitions/adapters.TopKBucket'
type: array
updated_at:
type: string
type: object
adapters.MemoryStatusResponse:
properties:
can_manual_sync:
type: boolean
encoder:
$ref: '#/definitions/adapters.HealthStatus'
indexed_count:
type: integer
markdown_file_count:
type: integer
memory_mode:
type: string
overview_path:
type: string
provider_type:
type: string
qdrant:
$ref: '#/definitions/adapters.HealthStatus'
qdrant_collection:
type: string
source_count:
type: integer
source_dir:
type: string
type: object
adapters.Message:
properties:
content:
type: string
role:
type: string
type: object
adapters.ProviderCollectionStatus:
properties:
exists:
type: boolean
name:
type: string
points:
type: integer
qdrant:
$ref: '#/definitions/adapters.HealthStatus'
type: object
adapters.ProviderConfigSchema:
properties:
fields:
additionalProperties:
$ref: '#/definitions/adapters.ProviderFieldSchema'
type: object
type: object
adapters.ProviderCreateRequest:
properties:
config:
additionalProperties: {}
type: object
name:
type: string
provider:
$ref: '#/definitions/adapters.ProviderType'
type: object
adapters.ProviderFieldSchema:
properties:
description:
type: string
example: {}
required:
type: boolean
secret:
type: boolean
title:
type: string
type:
type: string
type: object
adapters.ProviderGetResponse:
properties:
config:
additionalProperties: {}
type: object
created_at:
type: string
id:
type: string
is_default:
type: boolean
name:
type: string
provider:
type: string
updated_at:
type: string
type: object
adapters.ProviderMeta:
properties:
config_schema:
$ref: '#/definitions/adapters.ProviderConfigSchema'
display_name:
type: string
provider:
type: string
type: object
adapters.ProviderStatusResponse:
properties:
collections:
items:
$ref: '#/definitions/adapters.ProviderCollectionStatus'
type: array
embedding_model_id:
type: string
memory_mode:
type: string
provider_type:
type: string
type: object
adapters.ProviderType:
enum:
- builtin
- mem0
- openviking
type: string
x-enum-varnames:
- ProviderBuiltin
- ProviderMem0
- ProviderOpenViking
adapters.ProviderUpdateRequest:
properties:
config:
additionalProperties: {}
type: object
name:
type: string
type: object
adapters.RebuildResult:
properties:
fs_count:
type: integer
missing_count:
type: integer
restored_count:
type: integer
storage_count:
type: integer
type: object
adapters.SearchResponse:
properties:
relations:
items: {}
type: array
results:
items:
$ref: '#/definitions/adapters.MemoryItem'
type: array
type: object
adapters.TopKBucket:
properties:
index:
description: sparse dimension index (term hash)
type: integer
value:
description: weight (term frequency)
type: number
type: object
adapters.UsageResponse:
properties:
avg_text_bytes:
type: integer
count:
type: integer
estimated_storage_bytes:
type: integer
total_text_bytes:
type: integer
type: object
bots.Bot:
properties:
avatar_url:
type: string
check_issue_count:
type: integer
check_state:
type: string
created_at:
type: string
display_name:
type: string
id:
type: string
is_active:
type: boolean
metadata:
additionalProperties: {}
type: object
owner_user_id:
type: string
status:
type: string
timezone:
type: string
updated_at:
type: string
type: object
bots.BotCheck:
properties:
detail:
type: string
id:
type: string
metadata:
additionalProperties: {}
type: object
status:
type: string
subtitle:
type: string
summary:
type: string
title_key:
type: string
type:
type: string
type: object
bots.CreateBotRequest:
properties:
avatar_url:
type: string
display_name:
type: string
is_active:
type: boolean
metadata:
additionalProperties: {}
type: object
timezone:
type: string
type: object
bots.ListBotsResponse:
properties:
items:
items:
$ref: '#/definitions/bots.Bot'
type: array
type: object
bots.ListChecksResponse:
properties:
items:
items:
$ref: '#/definitions/bots.BotCheck'
type: array
type: object
bots.TransferBotRequest:
properties:
owner_user_id:
type: string
type: object
bots.UpdateBotRequest:
properties:
avatar_url:
type: string
display_name:
type: string
is_active:
type: boolean
metadata:
additionalProperties: {}
type: object
timezone:
type: string
type: object
browsercontexts.BrowserContext:
properties:
config:
items:
type: integer
type: array
created_at:
type: string
id:
type: string
name:
type: string
updated_at:
type: string
type: object
browsercontexts.CreateRequest:
properties:
config:
items:
type: integer
type: array
name:
type: string
type: object
browsercontexts.UpdateRequest:
properties:
config:
items:
type: integer
type: array
name:
type: string
type: object
channel.Action:
properties:
label:
type: string
type:
type: string
url:
type: string
value:
type: string
type: object
channel.Attachment:
properties:
base64:
description: data URL for agent delivery
type: string
caption:
type: string
content_hash:
type: string
duration_ms:
type: integer
height:
type: integer
metadata:
additionalProperties: {}
type: object
mime:
type: string
name:
type: string
platform_key:
type: string
size:
type: integer
source_platform:
type: string
thumbnail_url:
type: string
type:
$ref: '#/definitions/channel.AttachmentType'
url:
type: string
width:
type: integer
type: object
channel.AttachmentType:
enum:
- image
- audio
- video
- voice
- file
- gif
type: string
x-enum-varnames:
- AttachmentImage
- AttachmentAudio
- AttachmentVideo
- AttachmentVoice
- AttachmentFile
- AttachmentGIF
channel.ChannelCapabilities:
properties:
attachments:
type: boolean
block_streaming:
type: boolean
buttons:
type: boolean
chat_types:
items:
type: string
type: array
edit:
type: boolean
markdown:
type: boolean
media:
type: boolean
native_commands:
type: boolean
polls:
type: boolean
reactions:
type: boolean
reply:
type: boolean
rich_text:
type: boolean
streaming:
type: boolean
text:
type: boolean
threads:
type: boolean
unsend:
type: boolean
type: object
channel.ChannelConfig:
properties:
bot_id:
type: string
channel_type:
type: string
created_at:
type: string
credentials:
additionalProperties: {}
type: object
disabled:
type: boolean
external_identity:
type: string
id:
type: string
routing:
additionalProperties: {}
type: object
self_identity:
additionalProperties: {}
type: object
updated_at:
type: string
verified_at:
type: string
type: object
channel.ChannelIdentityBinding:
properties:
channel_identity_id:
type: string
channel_type:
type: string
config:
additionalProperties: {}
type: object
created_at:
type: string
id:
type: string
updated_at:
type: string
type: object
channel.ConfigSchema:
properties:
fields:
additionalProperties:
$ref: '#/definitions/channel.FieldSchema'
type: object
version:
type: integer
type: object
channel.FieldSchema:
properties:
description:
type: string
enum:
items:
type: string
type: array
example: {}
required:
type: boolean
title:
type: string
type:
$ref: '#/definitions/channel.FieldType'
type: object
channel.FieldType:
enum:
- string
- secret
- bool
- number
- enum
type: string
x-enum-varnames:
- FieldString
- FieldSecret
- FieldBool
- FieldNumber
- FieldEnum
channel.Message:
properties:
actions:
items:
$ref: '#/definitions/channel.Action'
type: array
attachments:
items:
$ref: '#/definitions/channel.Attachment'
type: array
format:
$ref: '#/definitions/channel.MessageFormat'
id:
type: string
metadata:
additionalProperties: {}
type: object
parts:
items:
$ref: '#/definitions/channel.MessagePart'
type: array
reply:
$ref: '#/definitions/channel.ReplyRef'
text:
type: string
thread:
$ref: '#/definitions/channel.ThreadRef'
type: object
channel.MessageFormat:
enum:
- plain
- markdown
- rich
type: string
x-enum-varnames:
- MessageFormatPlain
- MessageFormatMarkdown
- MessageFormatRich
channel.MessagePart:
properties:
channel_identity_id:
type: string
emoji:
type: string
language:
type: string
metadata:
additionalProperties: {}
type: object
styles:
items:
$ref: '#/definitions/channel.MessageTextStyle'
type: array
text:
type: string
type:
$ref: '#/definitions/channel.MessagePartType'
url:
type: string
type: object
channel.MessagePartType:
enum:
- text
- link
- code_block
- mention
- emoji
type: string
x-enum-varnames:
- MessagePartText
- MessagePartLink
- MessagePartCodeBlock
- MessagePartMention
- MessagePartEmoji
channel.MessageTextStyle:
enum:
- bold
- italic
- strikethrough
- code
type: string
x-enum-varnames:
- MessageStyleBold
- MessageStyleItalic
- MessageStyleStrikethrough
- MessageStyleCode
channel.ReplyRef:
properties:
message_id:
type: string
target:
type: string
type: object
channel.SendRequest:
properties:
channel_identity_id:
type: string
message:
$ref: '#/definitions/channel.Message'
target:
type: string
type: object
channel.TargetHint:
properties:
example:
type: string
label:
type: string
type: object
channel.TargetSpec:
properties:
format:
type: string
hints:
items:
$ref: '#/definitions/channel.TargetHint'
type: array
type: object
channel.ThreadRef:
properties:
id:
type: string
type: object
channel.UpdateChannelStatusRequest:
properties:
disabled:
type: boolean
type: object
channel.UpsertChannelIdentityConfigRequest:
properties:
config:
additionalProperties: {}
type: object
type: object
channel.UpsertConfigRequest:
properties:
credentials:
additionalProperties: {}
type: object
disabled:
type: boolean
external_identity:
type: string
routing:
additionalProperties: {}
type: object
self_identity:
additionalProperties: {}
type: object
verified_at:
type: string
type: object
compaction.ListLogsResponse:
properties:
items:
items:
$ref: '#/definitions/compaction.Log'
type: array
total_count:
type: integer
type: object
compaction.Log:
properties:
bot_id:
type: string
completed_at:
type: string
error_message:
type: string
id:
type: string
message_count:
type: integer
model_id:
type: string
session_id:
type: string
started_at:
type: string
status:
type: string
summary:
type: string
usage: {}
type: object
email.BindingResponse:
properties:
bot_id:
type: string
can_delete:
type: boolean
can_read:
type: boolean
can_write:
type: boolean
config:
additionalProperties: {}
type: object
created_at:
type: string
email_address:
type: string
email_provider_id:
type: string
id:
type: string
updated_at:
type: string
type: object
email.ConfigSchema:
properties:
fields:
items:
$ref: '#/definitions/email.FieldSchema'
type: array
type: object
email.CreateBindingRequest:
properties:
can_delete:
type: boolean
can_read:
type: boolean
can_write:
type: boolean
config:
additionalProperties: {}
type: object
email_address:
type: string
email_provider_id:
type: string
type: object
email.CreateProviderRequest:
properties:
config:
additionalProperties: {}
type: object
name:
type: string
provider:
type: string
type: object
email.FieldSchema:
properties:
description:
type: string
enum:
items:
type: string
type: array
example: {}
key:
type: string
order:
type: integer
required:
type: boolean
title:
type: string
type:
type: string
type: object
email.OutboxItemResponse:
properties:
attachments:
items: {}
type: array
body_html:
type: string
body_text:
type: string
bot_id:
type: string
created_at:
type: string
error:
type: string
from:
type: string
id:
type: string
message_id:
type: string
provider_id:
type: string
sent_at:
type: string
status:
type: string
subject:
type: string
to:
items:
type: string
type: array
type: object
email.ProviderMeta:
properties:
config_schema:
$ref: '#/definitions/email.ConfigSchema'
display_name:
type: string
provider:
type: string
type: object
email.ProviderResponse:
properties:
config:
additionalProperties: {}
type: object
created_at:
type: string
id:
type: string
name:
type: string
provider:
type: string
updated_at:
type: string
type: object
email.UpdateBindingRequest:
properties:
can_delete:
type: boolean
can_read:
type: boolean
can_write:
type: boolean
config:
additionalProperties: {}
type: object
email_address:
type: string
type: object
email.UpdateProviderRequest:
properties:
config:
additionalProperties: {}
type: object
name:
type: string
provider:
type: string
type: object
github_com_memohai_memoh_internal_mcp.Connection:
properties:
auth_type:
type: string
bot_id:
type: string
config:
additionalProperties: {}
type: object
created_at:
type: string
id:
type: string
is_active:
type: boolean
last_probed_at:
type: string
name:
type: string
status:
type: string
status_message:
type: string
tools_cache:
items:
$ref: '#/definitions/mcp.ToolDescriptor'
type: array
type:
type: string
updated_at:
type: string
type: object
handlers.BatchDeleteRequest:
properties:
ids:
items:
type: string
type: array
type: object
handlers.BrowserCoresResponse:
properties:
cores:
items:
type: string
type: array
type: object
handlers.CacheStats:
properties:
cache_hit_rate:
type: number
cache_read_tokens:
type: integer
cache_write_tokens:
type: integer
total_input_tokens:
type: integer
type: object
handlers.ChannelMeta:
properties:
capabilities:
$ref: '#/definitions/channel.ChannelCapabilities'
config_schema:
$ref: '#/definitions/channel.ConfigSchema'
configless:
type: boolean
display_name:
type: string
target_spec:
$ref: '#/definitions/channel.TargetSpec'
type:
type: string
user_config_schema:
$ref: '#/definitions/channel.ConfigSchema'
type: object
handlers.ContextUsage:
properties:
context_window:
type: integer
used_tokens:
type: integer
type: object
handlers.CreateContainerRequest:
properties:
image:
type: string
restore_data:
type: boolean
snapshotter:
type: string
type: object
handlers.CreateContainerResponse:
properties:
container_id:
type: string
data_restored:
type: boolean
has_preserved_data:
type: boolean
image:
type: string
snapshotter:
type: string
started:
type: boolean
type: object
handlers.CreateSnapshotRequest:
properties:
snapshot_name:
type: string
type: object
handlers.CreateSnapshotResponse:
properties:
container_id:
type: string
display_name:
type: string
runtime_snapshot_name:
type: string
snapshot_name:
type: string
snapshotter:
type: string
source:
type: string
version:
type: integer
type: object
handlers.DailyTokenUsage:
properties:
cache_read_tokens:
type: integer
cache_write_tokens:
type: integer
day:
type: string
input_tokens:
type: integer
output_tokens:
type: integer
reasoning_tokens:
type: integer
type: object
handlers.ErrorResponse:
properties:
message:
type: string
type: object
handlers.FSDeleteRequest:
properties:
path:
type: string
recursive:
type: boolean
type: object
handlers.FSFileInfo:
properties:
isDir:
type: boolean
modTime:
type: string
mode:
type: string
name:
type: string
path:
type: string
size:
type: integer
type: object
handlers.FSListResponse:
properties:
entries:
items:
$ref: '#/definitions/handlers.FSFileInfo'
type: array
path:
type: string
type: object
handlers.FSMkdirRequest:
properties:
path:
type: string
type: object
handlers.FSReadResponse:
properties:
content:
type: string
path:
type: string
size:
type: integer
type: object
handlers.FSRenameRequest:
properties:
newPath:
type: string
oldPath:
type: string
type: object
handlers.FSUploadResponse:
properties:
path:
type: string
size:
type: integer
type: object
handlers.FSWriteRequest:
properties:
content:
type: string
path:
type: string
type: object
handlers.GetContainerResponse:
properties:
container_id:
type: string
container_path:
type: string
created_at:
type: string
has_preserved_data:
type: boolean
image:
type: string
legacy:
type: boolean
namespace:
type: string
status:
type: string
task_running:
type: boolean
updated_at:
type: string
type: object
handlers.InstallMcpRequest:
properties:
env:
additionalProperties:
type: string
type: object
mcp_id:
type: string
type: object
handlers.InstallSkillRequest:
properties:
skill_id:
type: string
type: object
handlers.ListSnapshotsResponse:
properties:
snapshots:
items:
$ref: '#/definitions/handlers.SnapshotInfo'
type: array
snapshotter:
type: string
type: object
handlers.LocalChannelMessageRequest:
properties:
message:
$ref: '#/definitions/channel.Message'
model_id:
type: string
reasoning_effort:
type: string
type: object
handlers.LoginRequest:
properties:
password:
type: string
username:
type: string
type: object
handlers.LoginResponse:
properties:
access_token:
type: string
display_name:
type: string
expires_at:
type: string
role:
type: string
timezone:
type: string
token_type:
type: string
user_id:
type: string
username:
type: string
type: object
handlers.MCPStdioRequest:
properties:
args:
items:
type: string
type: array
command:
type: string
cwd:
type: string
env:
additionalProperties:
type: string
type: object
name:
type: string
type: object
handlers.MCPStdioResponse:
properties:
connection_id:
type: string
tools:
items:
type: string
type: array
url:
type: string
type: object
handlers.ModelTokenUsage:
properties:
input_tokens:
type: integer
model_id:
type: string
model_name:
type: string
model_slug:
type: string
output_tokens:
type: integer
provider_name:
type: string
type: object
handlers.PingResponse:
properties:
commit_hash:
type: string
container_backend:
type: string
snapshot_supported:
type: boolean
status:
type: string
version:
type: string
type: object
handlers.ProbeResponse:
properties:
auth_required:
type: boolean
error:
type: string
status:
type: string
tools:
items:
$ref: '#/definitions/mcp.ToolDescriptor'
type: array
type: object
handlers.RefreshResponse:
properties:
access_token:
type: string
expires_at:
type: string
token_type:
type: string
type: object
handlers.RollbackRequest:
properties:
version:
type: integer
type: object
handlers.SessionInfoResponse:
properties:
cache_stats:
$ref: '#/definitions/handlers.CacheStats'
context_usage:
$ref: '#/definitions/handlers.ContextUsage'
message_count:
type: integer
skills:
items:
type: string
type: array
type: object
handlers.SkillItem:
properties:
content:
type: string
description:
type: string
metadata:
additionalProperties: {}
type: object
name:
type: string
raw:
type: string
type: object
handlers.SkillsDeleteRequest:
properties:
names:
items:
type: string
type: array
type: object
handlers.SkillsResponse:
properties:
skills:
items:
$ref: '#/definitions/handlers.SkillItem'
type: array
type: object
handlers.SkillsUpsertRequest:
properties:
skills:
items:
type: string
type: array
type: object
handlers.SnapshotInfo:
properties:
created_at:
type: string
display_name:
type: string
kind:
type: string
labels:
additionalProperties:
type: string
type: object
managed:
type: boolean
name:
type: string
parent:
type: string
runtime_snapshot_name:
type: string
snapshotter:
type: string
source:
type: string
updated_at:
type: string
version:
type: integer
type: object
handlers.SupermarketAuthor:
properties:
email:
type: string
name:
type: string
type: object
handlers.SupermarketConfigVar:
properties:
defaultValue:
type: string
description:
type: string
key:
type: string
type: object
handlers.SupermarketMcpEntry:
properties:
args:
items:
type: string
type: array
author:
$ref: '#/definitions/handlers.SupermarketAuthor'
command:
type: string
description:
type: string
env:
items:
$ref: '#/definitions/handlers.SupermarketConfigVar'
type: array
headers:
items:
$ref: '#/definitions/handlers.SupermarketConfigVar'
type: array
homepage:
type: string
icon:
type: string
id:
type: string
name:
type: string
tags:
items:
type: string
type: array
transport:
type: string
url:
type: string
type: object
handlers.SupermarketMcpListResponse:
properties:
data:
items:
$ref: '#/definitions/handlers.SupermarketMcpEntry'
type: array
limit:
type: integer
page:
type: integer
total:
type: integer
type: object
handlers.SupermarketSkillEntry:
properties:
content:
type: string
description:
type: string
files:
items:
type: string
type: array
id:
type: string
metadata:
$ref: '#/definitions/handlers.SupermarketSkillMetadata'
name:
type: string
type: object
handlers.SupermarketSkillListResponse:
properties:
data:
items:
$ref: '#/definitions/handlers.SupermarketSkillEntry'
type: array
limit:
type: integer
page:
type: integer
total:
type: integer
type: object
handlers.SupermarketSkillMetadata:
properties:
author:
$ref: '#/definitions/handlers.SupermarketAuthor'
homepage:
type: string
tags:
items:
type: string
type: array
type: object
handlers.SupermarketTagsResponse:
properties:
tags:
items:
type: string
type: array
type: object
handlers.TokenUsageResponse:
properties:
by_model:
items:
$ref: '#/definitions/handlers.ModelTokenUsage'
type: array
chat:
items:
$ref: '#/definitions/handlers.DailyTokenUsage'
type: array
heartbeat:
items:
$ref: '#/definitions/handlers.DailyTokenUsage'
type: array
schedule:
items:
$ref: '#/definitions/handlers.DailyTokenUsage'
type: array
type: object
handlers.createSessionRequest:
properties:
channel_type:
type: string
metadata:
additionalProperties: {}
type: object
title:
type: string
type: object
handlers.emailOAuthStatusResponse:
properties:
configured:
type: boolean
email_address:
type: string
expired:
type: boolean
expires_at:
type: string
has_token:
type: boolean
provider:
type: string
type: object
handlers.fsOpResponse:
properties:
ok:
type: boolean
type: object
handlers.listMyIdentitiesResponse:
properties:
items:
items:
$ref: '#/definitions/identities.ChannelIdentity'
type: array
user_id:
type: string
type: object
handlers.memoryAddPayload:
properties:
embedding_enabled:
type: boolean
filters:
additionalProperties: {}
type: object
infer:
type: boolean
message:
type: string
messages:
items:
$ref: '#/definitions/adapters.Message'
type: array
metadata:
additionalProperties: {}
type: object
namespace:
type: string
run_id:
type: string
type: object
handlers.memoryCompactPayload:
properties:
decay_days:
type: integer
ratio:
type: number
type: object
handlers.memoryDeletePayload:
properties:
memory_ids:
items:
type: string
type: array
type: object
handlers.memorySearchPayload:
properties:
embedding_enabled:
type: boolean
filters:
additionalProperties: {}
type: object
limit:
type: integer
no_stats:
type: boolean
query:
type: string
run_id:
type: string
sources:
items:
type: string
type: array
type: object
handlers.oauthAuthorizeRequest:
properties:
callback_url:
type: string
client_id:
type: string
client_secret:
type: string
type: object
handlers.oauthDiscoverRequest:
properties:
url:
type: string
type: object
handlers.oauthExchangeRequest:
properties:
code:
type: string
state:
type: string
type: object
handlers.skillsOpResponse:
properties:
ok:
type: boolean
type: object
handlers.synthesizeRequest:
properties:
text:
type: string
type: object
handlers.synthesizeResponse:
properties:
content_type:
type: string
size:
type: integer
temp_id:
type: string
type: object
handlers.terminalInfoResponse:
properties:
available:
type: boolean
shell:
type: string
type: object
handlers.updateSessionRequest:
properties:
metadata:
additionalProperties: {}
type: object
title:
type: string
type: object
heartbeat.ListLogsResponse:
properties:
items:
items:
$ref: '#/definitions/heartbeat.Log'
type: array
total_count:
type: integer
type: object
heartbeat.Log:
properties:
bot_id:
type: string
completed_at:
type: string
error_message:
type: string
id:
type: string
result_text:
type: string
session_id:
type: string
started_at:
type: string
status:
type: string
usage: {}
type: object
identities.ChannelIdentity:
properties:
avatar_url:
type: string
channel:
type: string
channel_subject_id:
type: string
created_at:
type: string
display_name:
type: string
id:
type: string
metadata:
additionalProperties: {}
type: object
updated_at:
type: string
user_id:
type: string
type: object
mcp.AuthorizeResult:
properties:
authorization_url:
type: string
type: object
mcp.DiscoveryResult:
properties:
authorization_endpoint:
type: string
authorization_server_url:
type: string
registration_endpoint:
type: string
resource_metadata_url:
type: string
resource_uri:
type: string
scopes_supported:
items:
type: string
type: array
token_endpoint:
type: string
type: object
mcp.ExportResponse:
properties:
mcpServers:
additionalProperties:
$ref: '#/definitions/mcp.MCPServerEntry'
type: object
type: object
mcp.ImportRequest:
properties:
mcpServers:
additionalProperties:
$ref: '#/definitions/mcp.MCPServerEntry'
type: object
type: object
mcp.ListResponse:
properties:
items:
items:
$ref: '#/definitions/github_com_memohai_memoh_internal_mcp.Connection'
type: array
type: object
mcp.MCPServerEntry:
properties:
args:
items:
type: string
type: array
command:
type: string
cwd:
type: string
env:
additionalProperties:
type: string
type: object
headers:
additionalProperties:
type: string
type: object
transport:
type: string
url:
type: string
type: object
mcp.OAuthStatus:
properties:
auth_server:
type: string
callback_url:
type: string
configured:
type: boolean
expired:
type: boolean
expires_at:
type: string
has_token:
type: boolean
scopes:
type: string
type: object
mcp.ToolDescriptor:
properties:
description:
type: string
inputSchema:
additionalProperties: {}
type: object
name:
type: string
type: object
mcp.UpsertRequest:
properties:
args:
items:
type: string
type: array
auth_type:
type: string
command:
type: string
cwd:
type: string
env:
additionalProperties:
type: string
type: object
headers:
additionalProperties:
type: string
type: object
is_active:
type: boolean
name:
type: string
transport:
type: string
url:
type: string
type: object
message.Message:
properties:
assets:
items:
$ref: '#/definitions/message.MessageAsset'
type: array
bot_id:
type: string
compact_id:
type: string
content:
items:
type: integer
type: array
created_at:
type: string
external_message_id:
type: string
id:
type: string
metadata:
additionalProperties: {}
type: object
platform:
type: string
role:
type: string
sender_avatar_url:
type: string
sender_channel_identity_id:
type: string
sender_display_name:
type: string
sender_user_id:
type: string
session_id:
type: string
source_reply_to_message_id:
type: string
usage:
items:
type: integer
type: array
type: object
message.MessageAsset:
properties:
content_hash:
type: string
metadata:
additionalProperties: {}
type: object
mime:
type: string
name:
type: string
ordinal:
type: integer
role:
type: string
size_bytes:
type: integer
storage_key:
type: string
type: object
models.AddRequest:
properties:
config:
$ref: '#/definitions/models.ModelConfig'
llm_provider_id:
type: string
model_id:
type: string
name:
type: string
type:
$ref: '#/definitions/models.ModelType'
type: object
models.AddResponse:
properties:
id:
type: string
model_id:
type: string
type: object
models.CountResponse:
properties:
count:
type: integer
type: object
models.GetResponse:
properties:
config:
$ref: '#/definitions/models.ModelConfig'
id:
type: string
llm_provider_id:
type: string
model_id:
type: string
name:
type: string
type:
$ref: '#/definitions/models.ModelType'
type: object
models.ModelConfig:
properties:
compatibilities:
items:
type: string
type: array
context_window:
type: integer
dimensions:
type: integer
reasoning_efforts:
items:
type: string
type: array
type: object
models.ModelType:
enum:
- chat
- embedding
type: string
x-enum-varnames:
- ModelTypeChat
- ModelTypeEmbedding
models.TestResponse:
properties:
latency_ms:
type: integer
message:
type: string
reachable:
type: boolean
status:
$ref: '#/definitions/models.TestStatus'
type: object
models.TestStatus:
enum:
- ok
- auth_error
- model_not_supported
- error
type: string
x-enum-varnames:
- TestStatusOK
- TestStatusAuthError
- TestStatusModelNotSupported
- TestStatusError
models.UpdateRequest:
properties:
config:
$ref: '#/definitions/models.ModelConfig'
llm_provider_id:
type: string
model_id:
type: string
name:
type: string
type:
$ref: '#/definitions/models.ModelType'
type: object
providers.CountResponse:
properties:
count:
type: integer
type: object
providers.CreateRequest:
properties:
api_key:
type: string
base_url:
type: string
client_type:
type: string
icon:
type: string
metadata:
additionalProperties: {}
type: object
name:
type: string
required:
- base_url
- client_type
- name
type: object
providers.GetResponse:
properties:
api_key:
type: string
base_url:
type: string
client_type:
type: string
created_at:
type: string
enable:
type: boolean
icon:
type: string
id:
type: string
metadata:
additionalProperties: {}
type: object
name:
type: string
updated_at:
type: string
type: object
providers.ImportModelsResponse:
properties:
created:
type: integer
models:
items:
type: string
type: array
skipped:
type: integer
type: object
providers.OAuthStatus:
properties:
callback_url:
type: string
configured:
type: boolean
expired:
type: boolean
expires_at:
type: string
has_token:
type: boolean
type: object
providers.TestResponse:
properties:
latency_ms:
type: integer
message:
type: string
reachable:
type: boolean
type: object
providers.UpdateRequest:
properties:
api_key:
type: string
base_url:
type: string
client_type:
type: string
enable:
type: boolean
icon:
type: string
metadata:
additionalProperties: {}
type: object
name:
type: string
type: object
schedule.CreateRequest:
properties:
command:
type: string
description:
type: string
enabled:
type: boolean
max_calls:
$ref: '#/definitions/schedule.NullableInt'
name:
type: string
pattern:
type: string
type: object
schedule.ListLogsResponse:
properties:
items:
items:
$ref: '#/definitions/schedule.Log'
type: array
total_count:
type: integer
type: object
schedule.ListResponse:
properties:
items:
items:
$ref: '#/definitions/schedule.Schedule'
type: array
type: object
schedule.Log:
properties:
bot_id:
type: string
completed_at:
type: string
error_message:
type: string
id:
type: string
result_text:
type: string
schedule_id:
type: string
session_id:
type: string
started_at:
type: string
status:
type: string
usage: {}
type: object
schedule.NullableInt:
properties:
set:
type: boolean
value:
type: integer
type: object
schedule.Schedule:
properties:
bot_id:
type: string
command:
type: string
created_at:
type: string
current_calls:
type: integer
description:
type: string
enabled:
type: boolean
id:
type: string
max_calls:
type: integer
name:
type: string
pattern:
type: string
updated_at:
type: string
type: object
schedule.UpdateRequest:
properties:
command:
type: string
description:
type: string
enabled:
type: boolean
max_calls:
$ref: '#/definitions/schedule.NullableInt'
name:
type: string
pattern:
type: string
type: object
searchproviders.CreateRequest:
properties:
config:
additionalProperties: {}
type: object
name:
type: string
provider:
$ref: '#/definitions/searchproviders.ProviderName'
type: object
searchproviders.GetResponse:
properties:
config:
additionalProperties: {}
type: object
created_at:
type: string
enable:
type: boolean
id:
type: string
name:
type: string
provider:
type: string
updated_at:
type: string
type: object
searchproviders.ProviderConfigSchema:
properties:
fields:
additionalProperties:
$ref: '#/definitions/searchproviders.ProviderFieldSchema'
type: object
type: object
searchproviders.ProviderFieldSchema:
properties:
description:
type: string
enum:
items:
type: string
type: array
example: {}
required:
type: boolean
title:
type: string
type:
type: string
type: object
searchproviders.ProviderMeta:
properties:
config_schema:
$ref: '#/definitions/searchproviders.ProviderConfigSchema'
display_name:
type: string
provider:
type: string
type: object
searchproviders.ProviderName:
enum:
- brave
- bing
- google
- tavily
- sogou
- serper
- searxng
- jina
- exa
- bocha
- duckduckgo
- yandex
type: string
x-enum-varnames:
- ProviderBrave
- ProviderBing
- ProviderGoogle
- ProviderTavily
- ProviderSogou
- ProviderSerper
- ProviderSearXNG
- ProviderJina
- ProviderExa
- ProviderBocha
- ProviderDuckDuckGo
- ProviderYandex
searchproviders.UpdateRequest:
properties:
config:
additionalProperties: {}
type: object
enable:
type: boolean
name:
type: string
provider:
$ref: '#/definitions/searchproviders.ProviderName'
type: object
session.Session:
properties:
bot_id:
type: string
channel_type:
type: string
created_at:
type: string
id:
type: string
metadata:
additionalProperties: {}
type: object
parent_session_id:
type: string
route_conversation_type:
type: string
route_id:
type: string
route_metadata:
additionalProperties: {}
type: object
title:
type: string
type:
type: string
updated_at:
type: string
type: object
settings.Settings:
properties:
acl_default_effect:
type: string
browser_context_id:
type: string
chat_model_id:
type: string
compaction_enabled:
type: boolean
compaction_model_id:
type: string
compaction_ratio:
type: integer
compaction_threshold:
type: integer
heartbeat_enabled:
type: boolean
heartbeat_interval:
type: integer
heartbeat_model_id:
type: string
image_model_id:
type: string
language:
type: string
memory_provider_id:
type: string
reasoning_effort:
type: string
reasoning_enabled:
type: boolean
search_provider_id:
type: string
title_model_id:
type: string
tts_model_id:
type: string
type: object
settings.UpsertRequest:
properties:
acl_default_effect:
type: string
browser_context_id:
type: string
chat_model_id:
type: string
compaction_enabled:
type: boolean
compaction_model_id:
type: string
compaction_ratio:
type: integer
compaction_threshold:
type: integer
heartbeat_enabled:
type: boolean
heartbeat_interval:
type: integer
heartbeat_model_id:
type: string
image_model_id:
type: string
language:
type: string
memory_provider_id:
type: string
reasoning_effort:
type: string
reasoning_enabled:
type: boolean
search_provider_id:
type: string
title_model_id:
type: string
tts_model_id:
type: string
type: object
tts.CreateModelRequest:
properties:
config:
additionalProperties: {}
type: object
model_id:
type: string
name:
type: string
tts_provider_id:
type: string
type: object
tts.CreateProviderRequest:
properties:
name:
type: string
provider:
type: string
type: object
tts.ModelCapabilities:
properties:
formats:
items:
type: string
type: array
pitch:
$ref: '#/definitions/tts.ParamConstraint'
speed:
$ref: '#/definitions/tts.ParamConstraint'
voices:
items:
$ref: '#/definitions/tts.VoiceInfo'
type: array
type: object
tts.ModelInfo:
properties:
capabilities:
$ref: '#/definitions/tts.ModelCapabilities'
description:
type: string
id:
type: string
name:
type: string
type: object
tts.ModelResponse:
properties:
config:
additionalProperties: {}
type: object
created_at:
type: string
id:
type: string
model_id:
type: string
name:
type: string
provider_type:
type: string
tts_provider_id:
type: string
updated_at:
type: string
type: object
tts.ParamConstraint:
properties:
default:
type: number
max:
type: number
min:
type: number
options:
items:
type: number
type: array
type: object
tts.ProviderMetaResponse:
properties:
default_model:
type: string
description:
type: string
display_name:
type: string
models:
items:
$ref: '#/definitions/tts.ModelInfo'
type: array
provider:
type: string
type: object
tts.ProviderResponse:
properties:
created_at:
type: string
enable:
type: boolean
id:
type: string
name:
type: string
provider:
type: string
updated_at:
type: string
type: object
tts.TestSynthesizeRequest:
properties:
config:
additionalProperties: {}
type: object
text:
type: string
type: object
tts.UpdateModelRequest:
properties:
config:
additionalProperties: {}
type: object
name:
type: string
type: object
tts.UpdateProviderRequest:
properties:
enable:
type: boolean
name:
type: string
type: object
tts.VoiceInfo:
properties:
id:
type: string
lang:
type: string
name:
type: string
type: object
info:
contact: {}
title: Memoh API
version: 1.0.0
paths:
/auth/login:
post:
description: Validate user credentials and issue a JWT
parameters:
- description: Login request
in: body
name: payload
required: true
schema:
$ref: '#/definitions/handlers.LoginRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.LoginResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Login
tags:
- auth
/auth/refresh:
post:
description: Issue a new JWT using the existing claims with updated expiration
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.RefreshResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
security:
- BearerAuth: []
summary: Refresh Token
tags:
- auth
/bots:
get:
description: List bots accessible to current user (admin can specify owner_id)
parameters:
- description: Owner user ID (admin only)
in: query
name: owner_id
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/bots.ListBotsResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List bots
tags:
- bots
post:
description: Create a bot user owned by current user (or admin-specified owner)
parameters:
- description: Bot payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/bots.CreateBotRequest'
responses:
"201":
description: Created
schema:
$ref: '#/definitions/bots.Bot'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Create bot user
tags:
- bots
/bots/{bot_id}/acl/channel-identities:
get:
description: Search locally observed channel identities for building ACL rules
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Search query
in: query
name: q
type: string
- description: Max results
in: query
name: limit
type: integer
responses:
"200":
description: OK
schema:
$ref: '#/definitions/acl.ChannelIdentityCandidateListResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Search ACL channel identity candidates
tags:
- bots
/bots/{bot_id}/acl/channel-identities/{channel_identity_id}/conversations:
get:
description: List previously observed conversation candidates for a channel
identity, for scoped rule building
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Channel Identity ID
in: path
name: channel_identity_id
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/acl.ObservedConversationCandidateListResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List observed conversations for a channel identity
tags:
- bots
/bots/{bot_id}/acl/channel-types/{channel_type}/conversations:
get:
description: List previously observed group/thread conversation candidates for
a channel type under this bot
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Channel type (e.g. telegram, discord)
in: path
name: channel_type
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/acl.ObservedConversationCandidateListResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List observed conversations for a platform type
tags:
- bots
/bots/{bot_id}/acl/default-effect:
get:
description: Get the fallback effect when no rule matches
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/acl.DefaultEffectResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get bot ACL default effect
tags:
- bots
put:
description: Set the fallback effect when no rule matches (allow or deny)
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Default effect payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/acl.DefaultEffectResponse'
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Set bot ACL default effect
tags:
- bots
/bots/{bot_id}/acl/rules:
get:
description: List all ACL rules for a bot ordered by priority
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/acl.ListRulesResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List bot ACL rules
tags:
- bots
post:
description: Create a new priority-ordered ACL rule for chat.trigger
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Rule payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/acl.CreateRuleRequest'
responses:
"201":
description: Created
schema:
$ref: '#/definitions/acl.Rule'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Create ACL rule
tags:
- bots
/bots/{bot_id}/acl/rules/{rule_id}:
delete:
description: Delete an ACL rule by ID
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Rule ID
in: path
name: rule_id
required: true
type: string
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete ACL rule
tags:
- bots
put:
description: Update an existing ACL rule
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Rule ID
in: path
name: rule_id
required: true
type: string
- description: Rule payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/acl.UpdateRuleRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/acl.Rule'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update ACL rule
tags:
- bots
/bots/{bot_id}/acl/rules/reorder:
put:
description: Batch-update priorities for multiple ACL rules
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Reorder payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/acl.ReorderRequest'
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Reorder ACL rules
tags:
- bots
/bots/{bot_id}/compaction/logs:
delete:
description: Delete all compaction logs for a bot
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete compaction logs
tags:
- compaction
get:
description: List compaction logs for a bot
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- default: 50
description: Limit
in: query
name: limit
type: integer
- default: 0
description: Offset
in: query
name: offset
type: integer
responses:
"200":
description: OK
schema:
$ref: '#/definitions/compaction.ListLogsResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List compaction logs
tags:
- compaction
/bots/{bot_id}/container:
delete:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Export /data before deletion
in: query
name: preserve_data
type: boolean
responses:
"204":
description: No Content
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete MCP container for bot
tags:
- containerd
get:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.GetContainerResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get container info for bot
tags:
- containerd
post:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Create container payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/handlers.CreateContainerRequest'
responses:
"200":
description: SSE stream of container creation events
schema:
$ref: '#/definitions/handlers.CreateContainerResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Create and start MCP container for bot
tags:
- containerd
/bots/{bot_id}/container/data/export:
post:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
produces:
- application/gzip
responses:
"200":
description: OK
schema:
type: file
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Export container /data as a tar.gz archive
tags:
- containerd
/bots/{bot_id}/container/data/import:
post:
consumes:
- multipart/form-data
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: tar.gz archive
in: formData
name: file
required: true
type: file
responses:
"200":
description: OK
schema:
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Import a tar.gz archive into container /data
tags:
- containerd
/bots/{bot_id}/container/data/restore:
post:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
responses:
"200":
description: OK
schema:
type: object
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Restore previously preserved data into container
tags:
- containerd
/bots/{bot_id}/container/fs:
get:
description: Returns metadata about a file or directory at the given container
path
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Container path
in: query
name: path
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.FSFileInfo'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get file or directory info
tags:
- containerd
/bots/{bot_id}/container/fs/delete:
post:
description: Deletes a file or directory at the given container path
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Delete request
in: body
name: payload
required: true
schema:
$ref: '#/definitions/handlers.FSDeleteRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.fsOpResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete a file or directory
tags:
- containerd
/bots/{bot_id}/container/fs/download:
get:
description: Downloads a file from the container with appropriate Content-Type
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Container file path
in: query
name: path
required: true
type: string
produces:
- application/octet-stream
responses:
"200":
description: OK
schema:
type: file
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Download a file as binary stream
tags:
- containerd
/bots/{bot_id}/container/fs/list:
get:
description: Lists files and directories at the given container path
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Container directory path
in: query
name: path
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.FSListResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List directory contents
tags:
- containerd
/bots/{bot_id}/container/fs/mkdir:
post:
description: Creates a directory (and parents) at the given container path
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Mkdir request
in: body
name: payload
required: true
schema:
$ref: '#/definitions/handlers.FSMkdirRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.fsOpResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Create a directory
tags:
- containerd
/bots/{bot_id}/container/fs/read:
get:
description: Reads the content of a file and returns it as a JSON string
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Container file path
in: query
name: path
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.FSReadResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Read file content as text
tags:
- containerd
/bots/{bot_id}/container/fs/rename:
post:
description: Renames or moves a file/directory from oldPath to newPath
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Rename request
in: body
name: payload
required: true
schema:
$ref: '#/definitions/handlers.FSRenameRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.fsOpResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Rename or move a file/directory
tags:
- containerd
/bots/{bot_id}/container/fs/upload:
post:
consumes:
- multipart/form-data
description: Uploads a binary file to the given container path
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Destination container path
in: formData
name: path
required: true
type: string
- description: File to upload
in: formData
name: file
required: true
type: file
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.FSUploadResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Upload a file via multipart form
tags:
- containerd
/bots/{bot_id}/container/fs/write:
post:
description: Creates or overwrites a file with the provided text content
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Write request
in: body
name: payload
required: true
schema:
$ref: '#/definitions/handlers.FSWriteRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.fsOpResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Write text content to a file
tags:
- containerd
/bots/{bot_id}/container/skills:
delete:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Delete skills payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/handlers.SkillsDeleteRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.skillsOpResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete skills from data directory
tags:
- containerd
get:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.SkillsResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List skills from data directory
tags:
- containerd
post:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Skills payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/handlers.SkillsUpsertRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.skillsOpResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Upload skills into data directory
tags:
- containerd
/bots/{bot_id}/container/snapshots:
get:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Snapshotter name
in: query
name: snapshotter
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.ListSnapshotsResponse'
"501":
description: Snapshots currently not supported on this backend
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List snapshots
tags:
- containerd
post:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Create snapshot payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/handlers.CreateSnapshotRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.CreateSnapshotResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"501":
description: Snapshots currently not supported on this backend
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Create container snapshot for bot
tags:
- containerd
/bots/{bot_id}/container/snapshots/rollback:
post:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Rollback payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/handlers.RollbackRequest'
responses:
"200":
description: OK
schema:
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Rollback container to a previous snapshot version
tags:
- containerd
/bots/{bot_id}/container/start:
post:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
responses:
"200":
description: OK
schema:
type: object
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Start container task for bot
tags:
- containerd
/bots/{bot_id}/container/stop:
post:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
responses:
"200":
description: OK
schema:
type: object
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Stop container task for bot
tags:
- containerd
/bots/{bot_id}/container/terminal:
get:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.terminalInfoResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Check terminal availability for bot container
tags:
- containerd
/bots/{bot_id}/container/terminal/ws:
get:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- default: 80
description: Initial terminal columns
in: query
name: cols
type: integer
- default: 24
description: Initial terminal rows
in: query
name: rows
type: integer
- description: Auth token
in: query
name: token
type: string
responses:
"101":
description: WebSocket upgrade
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Interactive WebSocket terminal for bot container
tags:
- containerd
/bots/{bot_id}/email-bindings:
get:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/email.BindingResponse'
type: array
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List email bindings for a bot
tags:
- email-bindings
post:
consumes:
- application/json
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Binding configuration
in: body
name: request
required: true
schema:
$ref: '#/definitions/email.CreateBindingRequest'
produces:
- application/json
responses:
"201":
description: Created
schema:
$ref: '#/definitions/email.BindingResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Bind an email provider to a bot
tags:
- email-bindings
/bots/{bot_id}/email-bindings/{id}:
delete:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Binding ID
in: path
name: id
required: true
type: string
responses:
"204":
description: No Content
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Remove an email binding
tags:
- email-bindings
put:
consumes:
- application/json
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Binding ID
in: path
name: id
required: true
type: string
- description: Updated binding
in: body
name: request
required: true
schema:
$ref: '#/definitions/email.UpdateBindingRequest'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/email.BindingResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update an email binding
tags:
- email-bindings
/bots/{bot_id}/email-outbox:
get:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- default: 20
description: Limit
in: query
name: limit
type: integer
- default: 0
description: Offset
in: query
name: offset
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
additionalProperties: true
type: object
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List outbox emails for a bot (audit)
tags:
- email-outbox
/bots/{bot_id}/email-outbox/{id}:
get:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Email ID
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/email.OutboxItemResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get outbox email detail
tags:
- email-outbox
/bots/{bot_id}/heartbeat/logs:
delete:
description: Delete all heartbeat execution logs for a bot
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete heartbeat logs
tags:
- heartbeat
get:
description: List heartbeat execution logs for a bot
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- default: 50
description: Limit
in: query
name: limit
type: integer
- default: 0
description: Offset
in: query
name: offset
type: integer
responses:
"200":
description: OK
schema:
$ref: '#/definitions/heartbeat.ListLogsResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List heartbeat logs
tags:
- heartbeat
/bots/{bot_id}/local/messages:
post:
consumes:
- application/json
description: Post a user message (with optional attachments) through the local
channel pipeline.
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Message payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/handlers.LocalChannelMessageRequest'
produces:
- application/json
responses:
"200":
description: OK
schema:
additionalProperties:
type: string
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Send a message to a local channel
tags:
- local-channel
/bots/{bot_id}/local/stream:
get:
description: Open a persistent SSE connection to receive real-time stream events
for the given bot.
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
produces:
- text/event-stream
responses:
"200":
description: SSE stream
schema:
type: string
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Subscribe to local channel events via SSE
tags:
- local-channel
/bots/{bot_id}/local/ws:
get:
description: Upgrade to WebSocket for bidirectional chat streaming with abort
support.
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
responses:
"101":
description: Switching Protocols
schema:
type: string
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: WebSocket chat endpoint
tags:
- local-channel
/bots/{bot_id}/mcp:
get:
description: List MCP connections for a bot
responses:
"200":
description: OK
schema:
$ref: '#/definitions/mcp.ListResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List MCP connections
tags:
- mcp
post:
description: Create a MCP connection for a bot
parameters:
- description: MCP payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/mcp.UpsertRequest'
responses:
"201":
description: Created
schema:
$ref: '#/definitions/github_com_memohai_memoh_internal_mcp.Connection'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Create MCP connection
tags:
- mcp
/bots/{bot_id}/mcp-ops/batch-delete:
post:
description: Delete multiple MCP connections by IDs.
parameters:
- description: IDs to delete
in: body
name: payload
required: true
schema:
$ref: '#/definitions/handlers.BatchDeleteRequest'
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Batch delete MCP connections
tags:
- mcp
/bots/{bot_id}/mcp-stdio:
post:
description: Start a stdio MCP process in the bot container and expose it as
MCP HTTP endpoint.
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Stdio MCP payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/handlers.MCPStdioRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.MCPStdioResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Create MCP stdio proxy
tags:
- containerd
/bots/{bot_id}/mcp-stdio/{connection_id}:
post:
description: Proxies MCP JSON-RPC requests to a stdio MCP process in the container.
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Connection ID
in: path
name: connection_id
required: true
type: string
- description: JSON-RPC request
in: body
name: payload
required: true
schema:
type: object
responses:
"200":
description: 'JSON-RPC response: {jsonrpc,id,result|error}'
schema:
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: MCP stdio proxy (JSON-RPC)
tags:
- containerd
/bots/{bot_id}/mcp/{id}:
delete:
description: Delete a MCP connection by ID
parameters:
- description: MCP ID
in: path
name: id
required: true
type: string
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete MCP connection
tags:
- mcp
get:
description: Get a MCP connection by ID
parameters:
- description: MCP ID
in: path
name: id
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/github_com_memohai_memoh_internal_mcp.Connection'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get MCP connection
tags:
- mcp
put:
description: Update a MCP connection by ID
parameters:
- description: MCP ID
in: path
name: id
required: true
type: string
- description: MCP payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/mcp.UpsertRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/github_com_memohai_memoh_internal_mcp.Connection'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update MCP connection
tags:
- mcp
/bots/{bot_id}/mcp/{id}/oauth/authorize:
post:
description: Generate PKCE and return authorization URL for the user to authorize
parameters:
- description: MCP connection ID
in: path
name: id
required: true
type: string
- description: Optional client_id
in: body
name: payload
schema:
$ref: '#/definitions/handlers.oauthAuthorizeRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/mcp.AuthorizeResult'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Start OAuth authorization flow
tags:
- mcp
/bots/{bot_id}/mcp/{id}/oauth/discover:
post:
description: Probe MCP server URL for OAuth requirements and discover authorization
server metadata
parameters:
- description: MCP connection ID
in: path
name: id
required: true
type: string
- description: Optional URL override
in: body
name: payload
schema:
$ref: '#/definitions/handlers.oauthDiscoverRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/mcp.DiscoveryResult'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Discover OAuth configuration for MCP server
tags:
- mcp
/bots/{bot_id}/mcp/{id}/oauth/exchange:
post:
description: Frontend callback page calls this to exchange the authorization
code for access/refresh tokens
parameters:
- description: Authorization code and state
in: body
name: payload
required: true
schema:
$ref: '#/definitions/handlers.oauthExchangeRequest'
responses:
"200":
description: OK
schema:
additionalProperties:
type: boolean
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Exchange OAuth authorization code for tokens
tags:
- mcp
/bots/{bot_id}/mcp/{id}/oauth/status:
get:
description: Returns the current OAuth status including whether tokens are available
parameters:
- description: MCP connection ID
in: path
name: id
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/mcp.OAuthStatus'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get OAuth status for MCP connection
tags:
- mcp
/bots/{bot_id}/mcp/{id}/oauth/token:
delete:
description: Clears stored OAuth tokens
parameters:
- description: MCP connection ID
in: path
name: id
required: true
type: string
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Revoke OAuth tokens for MCP connection
tags:
- mcp
/bots/{bot_id}/mcp/{id}/probe:
post:
description: Probe a MCP connection to discover tools and verify connectivity
parameters:
- description: MCP connection ID
in: path
name: id
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.ProbeResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Probe MCP connection
tags:
- mcp
/bots/{bot_id}/mcp/export:
get:
description: Export all MCP connections for a bot in standard mcpServers format.
responses:
"200":
description: OK
schema:
$ref: '#/definitions/mcp.ExportResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Export MCP connections
tags:
- mcp
/bots/{bot_id}/mcp/import:
put:
description: Batch import MCP connections from standard mcpServers format. Existing
connections (matched by name) get config updated with is_active preserved.
New connections are created as active.
parameters:
- description: mcpServers dict
in: body
name: payload
required: true
schema:
$ref: '#/definitions/mcp.ImportRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/mcp.ListResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Import MCP connections
tags:
- mcp
/bots/{bot_id}/memory:
delete:
consumes:
- application/json
description: Delete specific memories by IDs, or delete all memories if no IDs
are provided
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: 'Optional: specify memory_ids to delete; if omitted, deletes
all'
in: body
name: payload
schema:
$ref: '#/definitions/handlers.memoryDeletePayload'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/adapters.DeleteResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"503":
description: Service Unavailable
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete memories
tags:
- memory
get:
description: List all memories in the bot-shared namespace
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Skip optional stats in memory search response
in: query
name: no_stats
type: boolean
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/adapters.SearchResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"503":
description: Service Unavailable
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get all memories
tags:
- memory
post:
consumes:
- application/json
description: Add memory into the bot-shared namespace
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Memory add payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/handlers.memoryAddPayload'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/adapters.SearchResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"503":
description: Service Unavailable
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Add memory
tags:
- memory
/bots/{bot_id}/memory/{id}:
delete:
description: Delete a single memory by its ID
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Memory ID
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/adapters.DeleteResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"503":
description: Service Unavailable
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete a single memory
tags:
- memory
/bots/{bot_id}/memory/compact:
post:
consumes:
- application/json
description: |-
Consolidate memories by merging similar/redundant entries using LLM.
**ratio** (required, range (0,1]):
- 0.8 = light compression, mostly dedup, keep ~80% of entries
- 0.5 = moderate compression, merge similar facts, keep ~50%
- 0.3 = aggressive compression, heavily consolidate, keep ~30%
**decay_days** (optional): enable time decay — memories older than N days are treated as low priority and more likely to be merged/dropped.
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: ratio (0,1] required; decay_days optional
in: body
name: payload
required: true
schema:
$ref: '#/definitions/handlers.memoryCompactPayload'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/adapters.CompactResult'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"503":
description: Service Unavailable
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Compact memories
tags:
- memory
/bots/{bot_id}/memory/rebuild:
post:
description: Read memory files from the container filesystem (source of truth)
and restore missing entries to memory storage
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/adapters.RebuildResult'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"409":
description: Conflict
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"503":
description: Service Unavailable
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Rebuild memories from filesystem
tags:
- memory
/bots/{bot_id}/memory/search:
post:
consumes:
- application/json
description: Search memory in the bot-shared namespace
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Memory search payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/handlers.memorySearchPayload'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/adapters.SearchResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"503":
description: Service Unavailable
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Search memory
tags:
- memory
/bots/{bot_id}/memory/status:
get:
description: Get the resolved memory runtime status for a bot, including index
health and source counts
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/adapters.MemoryStatusResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"409":
description: Conflict
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"503":
description: Service Unavailable
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get memory runtime status
tags:
- memory
/bots/{bot_id}/memory/usage:
get:
description: Query the estimated storage usage of current memories
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/adapters.UsageResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"503":
description: Service Unavailable
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get memory usage
tags:
- memory
/bots/{bot_id}/messages:
delete:
description: Clear all persisted bot-level history messages
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
produces:
- application/json
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete all bot history messages
tags:
- messages
get:
description: List messages for a bot history with optional pagination
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Limit
in: query
name: limit
type: integer
- description: Before
in: query
name: before
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
additionalProperties:
items:
$ref: '#/definitions/message.Message'
type: array
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List bot history messages
tags:
- messages
/bots/{bot_id}/schedule:
get:
description: List schedules for current user
responses:
"200":
description: OK
schema:
$ref: '#/definitions/schedule.ListResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List schedules
tags:
- schedule
post:
description: Create a schedule for current user
parameters:
- description: Schedule payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/schedule.CreateRequest'
responses:
"201":
description: Created
schema:
$ref: '#/definitions/schedule.Schedule'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Create schedule
tags:
- schedule
/bots/{bot_id}/schedule/{id}:
delete:
description: Delete a schedule by ID
parameters:
- description: Schedule ID
in: path
name: id
required: true
type: string
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete schedule
tags:
- schedule
get:
description: Get a schedule by ID
parameters:
- description: Schedule ID
in: path
name: id
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/schedule.Schedule'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get schedule
tags:
- schedule
put:
description: Update a schedule by ID
parameters:
- description: Schedule ID
in: path
name: id
required: true
type: string
- description: Schedule payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/schedule.UpdateRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/schedule.Schedule'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update schedule
tags:
- schedule
/bots/{bot_id}/schedule/{id}/logs:
get:
description: List execution logs for a specific schedule
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Schedule ID
in: path
name: id
required: true
type: string
- default: 50
description: Limit
in: query
name: limit
type: integer
- default: 0
description: Offset
in: query
name: offset
type: integer
responses:
"200":
description: OK
schema:
$ref: '#/definitions/schedule.ListLogsResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List schedule logs by schedule
tags:
- schedule
/bots/{bot_id}/schedule/logs:
delete:
description: Delete all schedule execution logs for a bot
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete schedule logs
tags:
- schedule
get:
description: List schedule execution logs for a bot
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- default: 50
description: Limit
in: query
name: limit
type: integer
- default: 0
description: Offset
in: query
name: offset
type: integer
responses:
"200":
description: OK
schema:
$ref: '#/definitions/schedule.ListLogsResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List schedule logs
tags:
- schedule
/bots/{bot_id}/sessions:
get:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
responses:
"200":
description: OK
schema:
additionalProperties:
items:
$ref: '#/definitions/session.Session'
type: array
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List bot sessions
tags:
- sessions
post:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Session data
in: body
name: body
required: true
schema:
$ref: '#/definitions/handlers.createSessionRequest'
responses:
"201":
description: Created
schema:
$ref: '#/definitions/session.Session'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Create a new chat session
tags:
- sessions
/bots/{bot_id}/sessions/{session_id}:
delete:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Session ID
in: path
name: session_id
required: true
type: string
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Soft-delete a session
tags:
- sessions
get:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Session ID
in: path
name: session_id
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/session.Session'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get a session by ID
tags:
- sessions
patch:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Session ID
in: path
name: session_id
required: true
type: string
- description: Fields to update
in: body
name: body
required: true
schema:
$ref: '#/definitions/handlers.updateSessionRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/session.Session'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update a session
tags:
- sessions
/bots/{bot_id}/sessions/{session_id}/status:
get:
description: Get aggregated info for a chat session including message count,
context usage, cache stats, and used skills
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Session ID
in: path
name: session_id
required: true
type: string
- description: Optional model UUID override for context window
in: query
name: model_id
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.SessionInfoResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get session info
tags:
- sessions
/bots/{bot_id}/settings:
delete:
description: Remove agent settings for current user
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete user settings
tags:
- settings
get:
description: Get agent settings for current user
responses:
"200":
description: OK
schema:
$ref: '#/definitions/settings.Settings'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get user settings
tags:
- settings
post:
description: Update or create agent settings for current user
parameters:
- description: Settings payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/settings.UpsertRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/settings.Settings'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update user settings
tags:
- settings
put:
description: Update or create agent settings for current user
parameters:
- description: Settings payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/settings.UpsertRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/settings.Settings'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update user settings
tags:
- settings
/bots/{bot_id}/supermarket/install-mcp:
post:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Install MCP request
in: body
name: payload
required: true
schema:
$ref: '#/definitions/handlers.InstallMcpRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/github_com_memohai_memoh_internal_mcp.Connection'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"502":
description: Bad Gateway
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Install MCP from supermarket to bot
tags:
- supermarket
/bots/{bot_id}/supermarket/install-skill:
post:
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Install skill request
in: body
name: payload
required: true
schema:
$ref: '#/definitions/handlers.InstallSkillRequest'
responses:
"200":
description: OK
schema:
additionalProperties:
type: boolean
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"502":
description: Bad Gateway
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Install skill from supermarket to bot container
tags:
- supermarket
/bots/{bot_id}/token-usage:
get:
description: Get daily aggregated token usage for a bot, split by chat, heartbeat,
and schedule session types, with optional model filter and per-model breakdown
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Start date (YYYY-MM-DD)
in: query
name: from
required: true
type: string
- description: End date exclusive (YYYY-MM-DD)
in: query
name: to
required: true
type: string
- description: Optional model UUID to filter by
in: query
name: model_id
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.TokenUsageResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get token usage statistics
tags:
- token-usage
/bots/{bot_id}/tools:
post:
description: MCP endpoint for tool discovery and invocation.
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: JSON-RPC request
in: body
name: payload
required: true
schema:
type: object
responses:
"200":
description: 'JSON-RPC response: {jsonrpc,id,result|error}'
schema:
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Unified MCP tools gateway
tags:
- containerd
/bots/{bot_id}/tts/synthesize:
post:
consumes:
- application/json
description: Stream-synthesize text using the bot's configured TTS model, write
to temp file
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
- description: Text to synthesize
in: body
name: request
required: true
schema:
$ref: '#/definitions/handlers.synthesizeRequest'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.synthesizeResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Synthesize speech for a bot
tags:
- bots
/bots/{id}:
delete:
description: Delete a bot user (owner/admin only)
parameters:
- description: Bot ID
in: path
name: id
required: true
type: string
responses:
"202":
description: Accepted
schema:
additionalProperties:
type: string
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete bot
tags:
- bots
get:
description: Get a bot by ID (owner/admin only)
parameters:
- description: Bot ID
in: path
name: id
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/bots.Bot'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get bot details
tags:
- bots
put:
description: Update bot profile (owner/admin only)
parameters:
- description: Bot ID
in: path
name: id
required: true
type: string
- description: Bot update payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/bots.UpdateBotRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/bots.Bot'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update bot details
tags:
- bots
/bots/{id}/channel/{platform}:
delete:
description: Remove bot channel configuration
parameters:
- description: Bot ID
in: path
name: id
required: true
type: string
- description: Channel platform
in: path
name: platform
required: true
type: string
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete bot channel config
tags:
- bots
get:
description: Get bot channel configuration
parameters:
- description: Bot ID
in: path
name: id
required: true
type: string
- description: Channel platform
in: path
name: platform
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/channel.ChannelConfig'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get bot channel config
tags:
- bots
put:
description: Update bot channel configuration
parameters:
- description: Bot ID
in: path
name: id
required: true
type: string
- description: Channel platform
in: path
name: platform
required: true
type: string
- description: Channel config payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/channel.UpsertConfigRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/channel.ChannelConfig'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update bot channel config
tags:
- bots
/bots/{id}/channel/{platform}/send:
post:
description: Send a message using bot channel configuration
parameters:
- description: Bot ID
in: path
name: id
required: true
type: string
- description: Channel platform
in: path
name: platform
required: true
type: string
- description: Send payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/channel.SendRequest'
responses:
"200":
description: OK
schema:
additionalProperties:
type: string
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Send message via bot channel
tags:
- bots
/bots/{id}/channel/{platform}/send_chat:
post:
description: Send a message using a session-scoped token (reply only)
parameters:
- description: Bot ID
in: path
name: id
required: true
type: string
- description: Channel platform
in: path
name: platform
required: true
type: string
- description: Send payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/channel.SendRequest'
responses:
"200":
description: OK
schema:
additionalProperties:
type: string
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Send message via bot channel session token
tags:
- bots
/bots/{id}/channel/{platform}/status:
patch:
description: Update bot channel enabled/disabled status
parameters:
- description: Bot ID
in: path
name: id
required: true
type: string
- description: Channel platform
in: path
name: platform
required: true
type: string
- description: Channel status payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/channel.UpdateChannelStatusRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/channel.ChannelConfig'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update bot channel status
tags:
- bots
/bots/{id}/checks:
get:
description: Evaluate bot attached resource checks in runtime
parameters:
- description: Bot ID
in: path
name: id
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/bots.ListChecksResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List bot runtime checks
tags:
- bots
/bots/{id}/owner:
put:
description: Transfer bot ownership to another human user
parameters:
- description: Bot ID
in: path
name: id
required: true
type: string
- description: Transfer payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/bots.TransferBotRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/bots.Bot'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Transfer bot owner (admin only)
tags:
- bots
/browser-contexts:
get:
description: List all browser context configurations
produces:
- application/json
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/browsercontexts.BrowserContext'
type: array
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List browser contexts
tags:
- browser-contexts
post:
consumes:
- application/json
description: Create a browser context configuration
parameters:
- description: Browser context configuration
in: body
name: request
required: true
schema:
$ref: '#/definitions/browsercontexts.CreateRequest'
produces:
- application/json
responses:
"201":
description: Created
schema:
$ref: '#/definitions/browsercontexts.BrowserContext'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Create a browser context
tags:
- browser-contexts
/browser-contexts/{id}:
delete:
description: Delete browser context by ID
parameters:
- description: Browser Context ID
in: path
name: id
required: true
type: string
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete a browser context
tags:
- browser-contexts
get:
description: Get browser context by ID
parameters:
- description: Browser Context ID
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/browsercontexts.BrowserContext'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get a browser context
tags:
- browser-contexts
put:
consumes:
- application/json
description: Update browser context by ID
parameters:
- description: Browser Context ID
in: path
name: id
required: true
type: string
- description: Updated configuration
in: body
name: request
required: true
schema:
$ref: '#/definitions/browsercontexts.UpdateRequest'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/browsercontexts.BrowserContext'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update a browser context
tags:
- browser-contexts
/browser-contexts/cores:
get:
description: Get the list of browser cores available in the Browser Gateway
container
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.BrowserCoresResponse'
"502":
description: Bad Gateway
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get available browser cores
tags:
- browser-contexts
/channels:
get:
description: List channel meta information including capabilities and schemas
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/handlers.ChannelMeta'
type: array
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List channel capabilities and schemas
tags:
- channel
/channels/{platform}:
get:
description: Get channel meta information including capabilities and schemas
parameters:
- description: Channel platform
in: path
name: platform
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.ChannelMeta'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get channel capabilities and schemas
tags:
- channel
/email-providers:
get:
parameters:
- description: Provider type filter
in: query
name: provider
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/email.ProviderResponse'
type: array
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List email providers
tags:
- email-providers
post:
consumes:
- application/json
parameters:
- description: Email provider configuration
in: body
name: request
required: true
schema:
$ref: '#/definitions/email.CreateProviderRequest'
produces:
- application/json
responses:
"201":
description: Created
schema:
$ref: '#/definitions/email.ProviderResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Create an email provider
tags:
- email-providers
/email-providers/{id}:
delete:
parameters:
- description: Provider ID
in: path
name: id
required: true
type: string
responses:
"204":
description: No Content
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete an email provider
tags:
- email-providers
get:
parameters:
- description: Provider ID
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/email.ProviderResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get an email provider
tags:
- email-providers
put:
consumes:
- application/json
parameters:
- description: Provider ID
in: path
name: id
required: true
type: string
- description: Updated configuration
in: body
name: request
required: true
schema:
$ref: '#/definitions/email.UpdateProviderRequest'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/email.ProviderResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update an email provider
tags:
- email-providers
/email-providers/{id}/oauth/authorize:
get:
description: Returns the authorization URL to redirect the user to
parameters:
- description: Email provider ID
in: path
name: id
required: true
type: string
responses:
"200":
description: OK
schema:
additionalProperties:
type: string
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Start OAuth2 authorization for an email provider
tags:
- email-oauth
/email-providers/{id}/oauth/status:
get:
parameters:
- description: Email provider ID
in: path
name: id
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.emailOAuthStatusResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get OAuth2 status for an email provider
tags:
- email-oauth
/email-providers/{id}/oauth/token:
delete:
parameters:
- description: Email provider ID
in: path
name: id
required: true
type: string
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Revoke stored OAuth2 tokens for an email provider
tags:
- email-oauth
/email-providers/meta:
get:
description: List available email provider types and config schemas
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/email.ProviderMeta'
type: array
summary: List email provider metadata
tags:
- email-providers
/email/mailgun/webhook/{config_id}:
post:
description: Receives inbound emails from Mailgun
parameters:
- description: Email provider config ID
in: path
name: config_id
required: true
type: string
responses:
"200":
description: OK
schema:
additionalProperties:
type: string
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Mailgun inbound email webhook
tags:
- email-webhook
/email/oauth/callback:
get:
description: Handles the OAuth2 callback, exchanges the code for tokens
parameters:
- description: Authorization code
in: query
name: code
required: true
type: string
- description: State parameter
in: query
name: state
required: true
type: string
responses:
"200":
description: OK
schema:
additionalProperties:
type: string
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: OAuth2 callback for email providers
tags:
- email-oauth
/memory-providers:
get:
description: List configured memory providers
produces:
- application/json
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/adapters.ProviderGetResponse'
type: array
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List memory providers
tags:
- memory-providers
post:
consumes:
- application/json
description: Create a memory provider configuration
parameters:
- description: Memory provider configuration
in: body
name: request
required: true
schema:
$ref: '#/definitions/adapters.ProviderCreateRequest'
produces:
- application/json
responses:
"201":
description: Created
schema:
$ref: '#/definitions/adapters.ProviderGetResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Create a memory provider
tags:
- memory-providers
/memory-providers/{id}:
delete:
description: Delete memory provider by ID
parameters:
- description: Provider ID
in: path
name: id
required: true
type: string
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete a memory provider
tags:
- memory-providers
get:
description: Get memory provider by ID
parameters:
- description: Provider ID
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/adapters.ProviderGetResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get a memory provider
tags:
- memory-providers
put:
consumes:
- application/json
description: Update memory provider by ID
parameters:
- description: Provider ID
in: path
name: id
required: true
type: string
- description: Updated configuration
in: body
name: request
required: true
schema:
$ref: '#/definitions/adapters.ProviderUpdateRequest'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/adapters.ProviderGetResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update a memory provider
tags:
- memory-providers
/memory-providers/{id}/status:
get:
description: Get runtime status data for a memory provider
parameters:
- description: Provider ID
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/adapters.ProviderStatusResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get memory provider status
tags:
- memory-providers
/memory-providers/meta:
get:
description: List available memory provider types and config schemas
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/adapters.ProviderMeta'
type: array
summary: List memory provider metadata
tags:
- memory-providers
/models:
get:
description: Get a list of all configured models, optionally filtered by type
or provider client type
parameters:
- description: Model type (chat, embedding)
in: query
name: type
type: string
- description: Provider client type (openai-responses, openai-completions, anthropic-messages,
google-generative-ai)
in: query
name: client_type
type: string
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/models.GetResponse'
type: array
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List all models
tags:
- models
post:
description: Create a new model configuration
parameters:
- description: Model configuration
in: body
name: payload
required: true
schema:
$ref: '#/definitions/models.AddRequest'
responses:
"201":
description: Created
schema:
$ref: '#/definitions/models.AddResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Create a new model
tags:
- models
/models/{id}:
delete:
description: Delete a model configuration by its internal UUID
parameters:
- description: Model internal ID (UUID)
in: path
name: id
required: true
type: string
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete model by internal ID
tags:
- models
get:
description: Get a model configuration by its internal UUID
parameters:
- description: Model internal ID (UUID)
in: path
name: id
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/models.GetResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get model by internal ID
tags:
- models
put:
description: Update a model configuration by its internal UUID
parameters:
- description: Model internal ID (UUID)
in: path
name: id
required: true
type: string
- description: Updated model configuration
in: body
name: payload
required: true
schema:
$ref: '#/definitions/models.UpdateRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/models.GetResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update model by internal ID
tags:
- models
/models/{id}/test:
post:
consumes:
- application/json
description: Probe a model's provider endpoint using the model's real model_id
and client_type to verify configuration
parameters:
- description: Model internal ID (UUID)
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/models.TestResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Test model connectivity
tags:
- models
/models/count:
get:
description: Get the total count of models, optionally filtered by type
parameters:
- description: Model type (chat, embedding)
in: query
name: type
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/models.CountResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get model count
tags:
- models
/models/model/{modelId}:
delete:
description: Delete a model configuration by its model_id field (e.g., gpt-4)
parameters:
- description: Model ID (e.g., gpt-4)
in: path
name: modelId
required: true
type: string
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete model by model ID
tags:
- models
get:
description: Get a model configuration by its model_id field (e.g., gpt-4)
parameters:
- description: Model ID (e.g., gpt-4)
in: path
name: modelId
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/models.GetResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get model by model ID
tags:
- models
put:
description: Update a model configuration by its model_id field (e.g., gpt-4)
parameters:
- description: Model ID (e.g., gpt-4)
in: path
name: modelId
required: true
type: string
- description: Updated model configuration
in: body
name: payload
required: true
schema:
$ref: '#/definitions/models.UpdateRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/models.GetResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update model by model ID
tags:
- models
/ping:
get:
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.PingResponse'
summary: Health check with server capabilities
tags:
- system
/providers:
get:
consumes:
- application/json
description: Get a list of all configured LLM providers
produces:
- application/json
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/providers.GetResponse'
type: array
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List all LLM providers
tags:
- providers
post:
consumes:
- application/json
description: Create a new LLM provider configuration
parameters:
- description: Provider configuration
in: body
name: request
required: true
schema:
$ref: '#/definitions/providers.CreateRequest'
produces:
- application/json
responses:
"201":
description: Created
schema:
$ref: '#/definitions/providers.GetResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Create a new LLM provider
tags:
- providers
/providers/{id}:
delete:
consumes:
- application/json
description: Delete a provider configuration
parameters:
- description: Provider ID (UUID)
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete provider
tags:
- providers
get:
consumes:
- application/json
description: Get a provider configuration by its ID
parameters:
- description: Provider ID (UUID)
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/providers.GetResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get provider by ID
tags:
- providers
put:
consumes:
- application/json
description: Update an existing provider configuration
parameters:
- description: Provider ID (UUID)
in: path
name: id
required: true
type: string
- description: Updated provider configuration
in: body
name: request
required: true
schema:
$ref: '#/definitions/providers.UpdateRequest'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/providers.GetResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update provider
tags:
- providers
/providers/{id}/import-models:
post:
consumes:
- application/json
description: Fetch models from provider's /v1/models endpoint and import them
parameters:
- description: Provider ID (UUID)
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/providers.ImportModelsResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Import models from provider
tags:
- providers
/providers/{id}/models:
get:
description: Get models for a provider by id, optionally filtered by type
parameters:
- description: Provider ID (UUID)
in: path
name: id
required: true
type: string
- description: Model type (chat, embedding)
in: query
name: type
type: string
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/models.GetResponse'
type: array
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List provider models
tags:
- providers
/providers/{id}/oauth/authorize:
get:
parameters:
- description: Provider ID (UUID)
in: path
name: id
required: true
type: string
responses:
"200":
description: OK
schema:
additionalProperties:
type: string
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Start OAuth2 authorization for an LLM provider
tags:
- providers-oauth
/providers/{id}/oauth/status:
get:
parameters:
- description: Provider ID (UUID)
in: path
name: id
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/providers.OAuthStatus'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get OAuth2 status for an LLM provider
tags:
- providers-oauth
/providers/{id}/oauth/token:
delete:
parameters:
- description: Provider ID (UUID)
in: path
name: id
required: true
type: string
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Revoke stored OAuth2 tokens for an LLM provider
tags:
- providers-oauth
/providers/{id}/test:
post:
consumes:
- application/json
description: Probe a provider's base URL to check reachability, supported client
types, and embedding support
parameters:
- description: Provider ID (UUID)
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/providers.TestResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Test provider connectivity
tags:
- providers
/providers/count:
get:
consumes:
- application/json
description: Get the total count of providers
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/providers.CountResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Count providers
tags:
- providers
/providers/name/{name}:
get:
consumes:
- application/json
description: Get a provider configuration by its name
parameters:
- description: Provider name
in: path
name: name
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/providers.GetResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get provider by name
tags:
- providers
/providers/oauth/callback:
get:
parameters:
- description: Authorization code
in: query
name: code
required: true
type: string
- description: State parameter
in: query
name: state
required: true
type: string
responses:
"200":
description: HTML success page
schema:
type: string
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: OAuth2 callback for LLM providers
tags:
- providers-oauth
/search-providers:
get:
consumes:
- application/json
description: List configured search providers
parameters:
- description: Provider filter (brave)
in: query
name: provider
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/searchproviders.GetResponse'
type: array
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List search providers
tags:
- search-providers
post:
consumes:
- application/json
description: Create a search provider configuration
parameters:
- description: Search provider configuration
in: body
name: request
required: true
schema:
$ref: '#/definitions/searchproviders.CreateRequest'
produces:
- application/json
responses:
"201":
description: Created
schema:
$ref: '#/definitions/searchproviders.GetResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Create a search provider
tags:
- search-providers
/search-providers/{id}:
delete:
consumes:
- application/json
description: Delete search provider by ID
parameters:
- description: Provider ID
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete a search provider
tags:
- search-providers
get:
consumes:
- application/json
description: Get search provider by ID
parameters:
- description: Provider ID
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/searchproviders.GetResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get a search provider
tags:
- search-providers
put:
consumes:
- application/json
description: Update search provider by ID
parameters:
- description: Provider ID
in: path
name: id
required: true
type: string
- description: Updated configuration
in: body
name: request
required: true
schema:
$ref: '#/definitions/searchproviders.UpdateRequest'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/searchproviders.GetResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update a search provider
tags:
- search-providers
/search-providers/meta:
get:
description: List available search provider types and config schemas
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/searchproviders.ProviderMeta'
type: array
summary: List search provider metadata
tags:
- search-providers
/supermarket/mcps:
get:
parameters:
- description: Search query
in: query
name: q
type: string
- description: Filter by tag
in: query
name: tag
type: string
- description: Filter by transport type
in: query
name: transport
type: string
- description: Page number
in: query
name: page
type: integer
- description: Items per page
in: query
name: limit
type: integer
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.SupermarketMcpListResponse'
"502":
description: Bad Gateway
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List MCPs from supermarket
tags:
- supermarket
/supermarket/mcps/{id}:
get:
parameters:
- description: MCP ID
in: path
name: id
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.SupermarketMcpEntry'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"502":
description: Bad Gateway
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get MCP detail from supermarket
tags:
- supermarket
/supermarket/skills:
get:
parameters:
- description: Search query
in: query
name: q
type: string
- description: Filter by tag
in: query
name: tag
type: string
- description: Page number
in: query
name: page
type: integer
- description: Items per page
in: query
name: limit
type: integer
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.SupermarketSkillListResponse'
"502":
description: Bad Gateway
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List skills from supermarket
tags:
- supermarket
/supermarket/skills/{id}:
get:
parameters:
- description: Skill ID
in: path
name: id
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.SupermarketSkillEntry'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"502":
description: Bad Gateway
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get skill detail from supermarket
tags:
- supermarket
/supermarket/tags:
get:
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.SupermarketTagsResponse'
"502":
description: Bad Gateway
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List all tags from supermarket
tags:
- supermarket
/tts-models:
get:
produces:
- application/json
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/tts.ModelResponse'
type: array
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List all TTS models
tags:
- tts-models
post:
consumes:
- application/json
description: Manually create a TTS model under a specific provider
parameters:
- description: TTS model configuration
in: body
name: request
required: true
schema:
$ref: '#/definitions/tts.CreateModelRequest'
produces:
- application/json
responses:
"201":
description: Created
schema:
$ref: '#/definitions/tts.ModelResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Create a TTS model
tags:
- tts-models
/tts-models/{id}:
delete:
parameters:
- description: Model ID
in: path
name: id
required: true
type: string
responses:
"204":
description: No Content
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete a TTS model
tags:
- tts-models
get:
parameters:
- description: Model ID
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/tts.ModelResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get a TTS model
tags:
- tts-models
put:
consumes:
- application/json
parameters:
- description: Model ID
in: path
name: id
required: true
type: string
- description: Updated configuration
in: body
name: request
required: true
schema:
$ref: '#/definitions/tts.UpdateModelRequest'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/tts.ModelResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update a TTS model
tags:
- tts-models
/tts-models/{id}/capabilities:
get:
parameters:
- description: Model ID
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/tts.ModelCapabilities'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get TTS model capabilities
tags:
- tts-models
/tts-models/{id}/test:
post:
consumes:
- application/json
description: Synthesize text using a specific model's config and return audio
parameters:
- description: Model ID
in: path
name: id
required: true
type: string
- description: Text to synthesize
in: body
name: request
required: true
schema:
$ref: '#/definitions/tts.TestSynthesizeRequest'
produces:
- application/octet-stream
responses:
"200":
description: Audio data
schema:
type: file
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Test TTS model synthesis
tags:
- tts-models
/tts-providers:
get:
parameters:
- description: Provider type filter
in: query
name: provider
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/tts.ProviderResponse'
type: array
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List TTS providers
tags:
- tts-providers
post:
consumes:
- application/json
description: Create a TTS provider and auto-import its available models
parameters:
- description: TTS provider configuration
in: body
name: request
required: true
schema:
$ref: '#/definitions/tts.CreateProviderRequest'
produces:
- application/json
responses:
"201":
description: Created
schema:
$ref: '#/definitions/tts.ProviderResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Create a TTS provider
tags:
- tts-providers
/tts-providers/{id}:
delete:
parameters:
- description: Provider ID
in: path
name: id
required: true
type: string
responses:
"204":
description: No Content
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Delete a TTS provider
tags:
- tts-providers
get:
parameters:
- description: Provider ID
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/tts.ProviderResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get a TTS provider
tags:
- tts-providers
put:
consumes:
- application/json
parameters:
- description: Provider ID
in: path
name: id
required: true
type: string
- description: Updated configuration
in: body
name: request
required: true
schema:
$ref: '#/definitions/tts.UpdateProviderRequest'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/tts.ProviderResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update a TTS provider
tags:
- tts-providers
/tts-providers/{id}/import-models:
post:
description: Discover and import available models from the TTS adapter
parameters:
- description: Provider ID
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/tts.ModelResponse'
type: array
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Import models for a TTS provider
tags:
- tts-providers
/tts-providers/{id}/models:
get:
parameters:
- description: Provider ID
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/tts.ModelResponse'
type: array
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List models for a TTS provider
tags:
- tts-providers
/tts-providers/meta:
get:
description: List available TTS provider types with their models and capabilities
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/tts.ProviderMetaResponse'
type: array
summary: List TTS provider metadata
tags:
- tts-providers
/users:
get:
description: List users
responses:
"200":
description: OK
schema:
$ref: '#/definitions/accounts.ListAccountsResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List users (admin only)
tags:
- users
post:
description: Create a new human user account
parameters:
- description: User payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/accounts.CreateAccountRequest'
responses:
"201":
description: Created
schema:
$ref: '#/definitions/accounts.Account'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Create human user (admin only)
tags:
- users
/users/{id}:
get:
description: Get user details (self or admin only)
parameters:
- description: User ID
in: path
name: id
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/accounts.Account'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get user by ID
tags:
- users
put:
description: Update user profile and status
parameters:
- description: User ID
in: path
name: id
required: true
type: string
- description: User update payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/accounts.UpdateAccountRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/accounts.Account'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update user (admin only)
tags:
- users
/users/{id}/password:
put:
description: Reset a user password
parameters:
- description: User ID
in: path
name: id
required: true
type: string
- description: Password payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/accounts.ResetPasswordRequest'
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Reset user password (admin only)
tags:
- users
/users/me:
get:
description: Get current user profile
responses:
"200":
description: OK
schema:
$ref: '#/definitions/accounts.Account'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get current user
tags:
- users
put:
description: Update current user display name or avatar
parameters:
- description: Profile payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/accounts.UpdateProfileRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/accounts.Account'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update current user profile
tags:
- users
/users/me/channels/{platform}:
get:
description: Get channel binding configuration for current user
parameters:
- description: Channel platform
in: path
name: platform
required: true
type: string
responses:
"200":
description: OK
schema:
$ref: '#/definitions/channel.ChannelIdentityBinding'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get channel user config
tags:
- channel
put:
description: Update channel binding configuration for current user
parameters:
- description: Channel platform
in: path
name: platform
required: true
type: string
- description: Channel user config payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/channel.UpsertChannelIdentityConfigRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/channel.ChannelIdentityBinding'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update channel user config
tags:
- channel
/users/me/identities:
get:
description: List all channel identities linked to current user
responses:
"200":
description: OK
schema:
$ref: '#/definitions/handlers.listMyIdentitiesResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: List current user's channel identities
tags:
- users
/users/me/password:
put:
description: Update current user password with current password check
parameters:
- description: Password payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/accounts.UpdatePasswordRequest'
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Update current user password
tags:
- users
swagger: "2.0"