mirror of
https://github.com/memohai/Memoh.git
synced 2026-04-25 07:00:48 +09:00
473d559042
Introduce a new `show_tool_calls_in_im` bot setting plus a full overhaul of how tool calls are surfaced in IM channels: - Add per-bot setting + migration (0072) and expose through settings API / handlers / frontend SDK. - Introduce a `toolCallDroppingStream` wrapper that filters tool_call_* events when the setting is off, keeping the rest of the stream intact. - Add a shared `ToolCallPresentation` model (Header / Body blocks / Footer) with plain and Markdown renderers, and a per-tool formatter registry that produces rich output (e.g. `web_search` link lists, `list` directory previews, `exec` stdout/stderr tails) instead of raw JSON dumps. - High-capability adapters (Telegram, Feishu, Matrix, Slack, Discord) now flush pre-text and then send ONE tool-call message per call, editing it in-place from `running` to `completed` / `failed`; mapping from callID to platform message ID is tracked per stream, with a fallback to a new message if the edit fails. Low-capability adapters (WeCom, QQ, DingTalk) keep posting a single final message, but now benefit from the same rich per-tool formatting. - Suppress the early duplicate `EventToolCallStart` (from `sdk.ToolInputStartPart`) so that the SDK's final `StreamToolCallPart` remains the single source of truth for tool call start, preventing duplicated "running" bubbles in IM. - Stop auto-populating `InputSummary` / `ResultSummary` after a per-tool formatter runs, which previously leaked the raw JSON result as a fallback footer underneath the formatted body. Add regression tests for the formatters, the Markdown renderer, the edit-in-place flow on Telegram/Matrix, and the JSON-leak guard on `list`.
60 lines
3.1 KiB
Go
60 lines
3.1 KiB
Go
package settings
|
|
|
|
const (
|
|
DefaultLanguage = "auto"
|
|
DefaultReasoningEffort = "medium"
|
|
DefaultHeartbeatInterval = 30
|
|
)
|
|
|
|
type Settings struct {
|
|
ChatModelID string `json:"chat_model_id"`
|
|
ImageModelID string `json:"image_model_id"`
|
|
SearchProviderID string `json:"search_provider_id"`
|
|
MemoryProviderID string `json:"memory_provider_id"`
|
|
TtsModelID string `json:"tts_model_id"`
|
|
TranscriptionModelID string `json:"transcription_model_id"`
|
|
BrowserContextID string `json:"browser_context_id"`
|
|
Language string `json:"language"`
|
|
AclDefaultEffect string `json:"acl_default_effect"`
|
|
Timezone string `json:"timezone"`
|
|
ReasoningEnabled bool `json:"reasoning_enabled"`
|
|
ReasoningEffort string `json:"reasoning_effort"`
|
|
HeartbeatEnabled bool `json:"heartbeat_enabled"`
|
|
HeartbeatInterval int `json:"heartbeat_interval"`
|
|
HeartbeatModelID string `json:"heartbeat_model_id"`
|
|
TitleModelID string `json:"title_model_id"`
|
|
CompactionEnabled bool `json:"compaction_enabled"`
|
|
CompactionThreshold int `json:"compaction_threshold"`
|
|
CompactionRatio int `json:"compaction_ratio"`
|
|
CompactionModelID string `json:"compaction_model_id,omitempty"`
|
|
DiscussProbeModelID string `json:"discuss_probe_model_id,omitempty"`
|
|
PersistFullToolResults bool `json:"persist_full_tool_results"`
|
|
ShowToolCallsInIM bool `json:"show_tool_calls_in_im"`
|
|
}
|
|
|
|
type UpsertRequest struct {
|
|
ChatModelID string `json:"chat_model_id,omitempty"`
|
|
ImageModelID string `json:"image_model_id,omitempty"`
|
|
SearchProviderID string `json:"search_provider_id,omitempty"`
|
|
MemoryProviderID string `json:"memory_provider_id,omitempty"`
|
|
TtsModelID string `json:"tts_model_id,omitempty"`
|
|
TranscriptionModelID string `json:"transcription_model_id,omitempty"`
|
|
BrowserContextID string `json:"browser_context_id,omitempty"`
|
|
Language string `json:"language,omitempty"`
|
|
AclDefaultEffect string `json:"acl_default_effect,omitempty"`
|
|
Timezone *string `json:"timezone,omitempty"`
|
|
ReasoningEnabled *bool `json:"reasoning_enabled,omitempty"`
|
|
ReasoningEffort *string `json:"reasoning_effort,omitempty"`
|
|
HeartbeatEnabled *bool `json:"heartbeat_enabled,omitempty"`
|
|
HeartbeatInterval *int `json:"heartbeat_interval,omitempty"`
|
|
HeartbeatModelID string `json:"heartbeat_model_id,omitempty"`
|
|
TitleModelID string `json:"title_model_id,omitempty"`
|
|
CompactionEnabled *bool `json:"compaction_enabled,omitempty"`
|
|
CompactionThreshold *int `json:"compaction_threshold,omitempty"`
|
|
CompactionRatio *int `json:"compaction_ratio,omitempty"`
|
|
CompactionModelID *string `json:"compaction_model_id,omitempty"`
|
|
DiscussProbeModelID string `json:"discuss_probe_model_id,omitempty"`
|
|
PersistFullToolResults *bool `json:"persist_full_tool_results,omitempty"`
|
|
ShowToolCallsInIM *bool `json:"show_tool_calls_in_im,omitempty"`
|
|
}
|