feat: AI 工具架构重构与微信增强 (0.2.17 → 0.2.22)

0.2.17 收束模型初始工具列表:
- 仅暴露 query_capabilities/query_capability_detail/call_capability 三个入口
- API 能力统一通过 iAs HTTP API 封装,删除重复 YAML 工具

0.2.18 系统提示词拆分:
- 固定系统提示词硬编码,动态附加部分 AI 可维护
- 新增 update_additional_system_prompt 能力和持久化

0.2.19 上下文增强与打断语义:
- /new 拥有最高打断语义,取消运行中任务并清除当前 turn
- raw_message JSONB 原文入库,群聊按 group_id 隔离作用域
- 工具调用说明替代动态附加系统提示词

0.2.20 微信输入中状态:
- 改用官方 getconfig + sendtyping 流程,显式管理 typing 状态

0.2.21 API 文档功能分组:
- /v1/api-docs 返回 groups,帮助 AI 按功能面发现接口

0.2.22 AI API 能力去重:
- 移除与 HTTP endpoint 重复的专用能力,统一用 query_api_docs + call_http_api
- 删除不再编译的 web/memory 工具文件
This commit is contained in:
2026-07-08 14:58:13 +08:00
parent 279d89b87a
commit 7d5140c8d2
49 changed files with 2330 additions and 1185 deletions
@@ -0,0 +1,36 @@
INSERT INTO ias_upgrade_logs (
version,
released_at,
title,
description,
changes,
modules
) VALUES (
'0.2.17',
'2026-07-08T00:00:00+08:00',
'收束 AI 工具入口并归类能力',
'模型初始工具列表收束为查询能力、能力详情和调用能力三个入口,底层能力按 API 与 HTTP 两类管理,避免模型直接调用具体工具。',
'[
"收束模型初始工具列表,仅暴露 query_capabilities、query_capability_detail 和 call_capability 三个入口工具;其它能力直接调用会被拒绝,必须通过 call_capability 按名称和参数调用。",
"query_capabilities 改为只返回能力名称和描述,并按 api / http 分类;query_capability_detail 返回单个能力的完整参数、来源、分类和 JSON Schemacall_capability 支持 name、parameters 和可选提示语 text。",
"API 能力统一表示通过 iAs HTTP API 封装的能力,新增 API 版 query_mail_messages;删除重复的 YAML 邮件查询能力。",
"HTTP 能力统一表示 tools/*.yaml 定义的外部 API 调用能力;删除天气测试 YAMLYAML 扫描只加载 .yaml/.yml 并保持排序。",
"控制台工具页和上下文模拟器同步展示入口工具、API 能力和 HTTP 能力分组,避免调试请求继续直接暴露底层能力。",
"无数据库结构变化;已验证 cargo test 和 bun run build。"
]'::jsonb,
'{
"ias-common": "0.1.1",
"ias-ai": "0.1.7",
"ias-wechat": "0.1.0",
"ias-context": "0.1.2",
"ias-http": "0.1.10",
"ias-mail": "0.1.15",
"ias-service": "0.1.14",
"ias-main": "0.2.17"
}'::jsonb
) ON CONFLICT (version) DO UPDATE SET
released_at = EXCLUDED.released_at,
title = EXCLUDED.title,
description = EXCLUDED.description,
changes = EXCLUDED.changes,
modules = EXCLUDED.modules;
@@ -0,0 +1,16 @@
CREATE TABLE ias_additional_system_prompts (
id BIGSERIAL PRIMARY KEY,
scope_key VARCHAR(768) NOT NULL UNIQUE,
channel VARCHAR(64) NOT NULL,
account_id VARCHAR(255) NOT NULL,
from_user_id VARCHAR(255) NOT NULL,
context_label TEXT,
content TEXT NOT NULL DEFAULT '',
last_reason TEXT,
updated_by VARCHAR(64) NOT NULL DEFAULT 'ai',
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_ias_additional_system_prompts_scope_updated
ON ias_additional_system_prompts(scope_key, updated_at DESC);
@@ -0,0 +1,36 @@
INSERT INTO ias_upgrade_logs (
version,
released_at,
title,
description,
changes,
modules
) VALUES (
'0.2.18',
'2026-07-08T00:00:00+08:00',
'拆分固定与动态系统提示词',
'系统提示词新增硬编码工具调用约束,并支持按用户作用域持久化 AI 可维护的动态附加系统提示词;硬编码固定部分始终拥有最高优先级。',
'[
"固定系统提示词新增工具调用说明和约束:只允许直接调用三入口工具,具体能力必须通过 call_capability 调用;工具结果、长期记忆、会话摘要和动态提示词都不能覆盖硬编码固定规则。",
"系统提示词拆分为硬编码固定部分和 AI 可维护的动态附加部分;固定部分在代码中生成且优先级最高,动态部分只允许补充偏好和工作方式。",
"新增 API 能力 update_additional_system_promptAI 可在当前用户作用域内更新或清空动态附加系统提示词,并记录修改原因。",
"新增内部接口 PATCH /v1/context/system-prompt 和数据表 ias_additional_system_prompts,按 scope 持久化动态附加系统提示词。",
"上下文组装和上下文模拟器会读取动态附加系统提示词,并在固定系统提示词之后、长期记忆和摘要之前插入。",
"数据库新增 ias_additional_system_prompts 表;已验证 cargo test 和 bun run build。"
]'::jsonb,
'{
"ias-common": "0.1.1",
"ias-ai": "0.1.8",
"ias-wechat": "0.1.0",
"ias-context": "0.1.3",
"ias-http": "0.1.11",
"ias-mail": "0.1.15",
"ias-service": "0.1.15",
"ias-main": "0.2.18"
}'::jsonb
) ON CONFLICT (version) DO UPDATE SET
released_at = EXCLUDED.released_at,
title = EXCLUDED.title,
description = EXCLUDED.description,
changes = EXCLUDED.changes,
modules = EXCLUDED.modules;
@@ -0,0 +1,76 @@
ALTER TABLE ias_context_messages
ADD COLUMN IF NOT EXISTS raw_message JSONB;
ALTER TABLE ias_context_messages
ADD COLUMN IF NOT EXISTS external_message_id VARCHAR(255);
CREATE UNIQUE INDEX IF NOT EXISTS idx_ias_context_messages_external_unique
ON ias_context_messages(session_id, role, external_message_id)
WHERE external_message_id IS NOT NULL;
WITH ranked AS (
SELECT
id,
ROW_NUMBER() OVER (
PARTITION BY scope_key
ORDER BY started_at DESC, id DESC
) AS rank
FROM ias_context_sessions
WHERE ended_at IS NULL
)
UPDATE ias_context_sessions AS session
SET
ended_at = last_message_at,
end_reason = 'active_session_deduplicated',
summary = COALESCE(summary, '创建活跃会话唯一约束时自动结束的重复活跃上下文。')
FROM ranked
WHERE session.id = ranked.id
AND ranked.rank > 1;
CREATE UNIQUE INDEX IF NOT EXISTS idx_ias_context_sessions_one_active
ON ias_context_sessions(scope_key)
WHERE ended_at IS NULL;
CREATE TABLE IF NOT EXISTS ias_tool_call_instructions (
id BIGSERIAL PRIMARY KEY,
scope_key VARCHAR(768) NOT NULL UNIQUE,
channel VARCHAR(64) NOT NULL,
account_id VARCHAR(255) NOT NULL,
from_user_id VARCHAR(255) NOT NULL,
context_label TEXT,
content TEXT NOT NULL DEFAULT '',
last_reason TEXT,
updated_by VARCHAR(64) NOT NULL DEFAULT 'ai',
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_ias_tool_call_instructions_scope_updated
ON ias_tool_call_instructions(scope_key, updated_at DESC);
INSERT INTO ias_tool_call_instructions (
scope_key,
channel,
account_id,
from_user_id,
context_label,
content,
last_reason,
updated_by,
created_at,
updated_at
)
SELECT
scope_key,
channel,
account_id,
from_user_id,
context_label,
content,
last_reason,
updated_by,
created_at,
updated_at
FROM ias_additional_system_prompts
WHERE content <> ''
ON CONFLICT (scope_key) DO NOTHING;
@@ -0,0 +1,40 @@
INSERT INTO ias_upgrade_logs (
version,
released_at,
title,
description,
changes,
modules
) VALUES (
'0.2.19',
'2026-07-08T00:00:00+08:00',
'上下文 raw 记录与工具调用说明',
'上下文消息支持 raw JSON 朔源入库,/new 可打断当前工具操作;动态附加系统提示词改为随能力列表展示的工具调用说明。',
'[
"/new 现在会取消同一用户作用域正在运行的 LLM/工具任务,清除当前 turn,并丢弃迟到的 assistant、工具提醒或工具结果。",
"上下文消息新增 raw_message JSONB 原文记录;读取上下文时优先从 raw JSON 重建 content、tool_calls 和 tool_call_id,旧字段继续兼容历史数据。",
"微信入口会把 message_id、session_id、group_id 和 create_time_ms 带入 raw 记录;同一 session 内相同外部消息 ID 的重复用户消息会自动去重。",
"群聊上下文 scope 现在优先使用 group_id,避免同一发送者在私聊和不同群聊之间串上下文;私聊继续保持原有 channel:account_id:from_user_id 形式。",
"数据库会先自动结束同一 scope 中较旧的重复活跃会话,再新增同一 scope 仅允许一个活跃上下文会话的唯一约束,避免异常重试或多实例情况下产生隐性多活会话。",
"模型响应兼容 content=null 的纯工具调用场景,请求消息不再序列化空 tool_call_id/tool_calls 字段。",
"动态附加系统提示词改为工具调用说明,不再进入系统提示词,只随 query_capabilities 展示。",
"新增内部接口 POST/PATCH /v1/context/tool-instructions 和 API 能力 record_tool_call_instruction,用于记录用户提供的工具调用规则、稳定调用顺序和 AI 总结出的调用经验。",
"上下文模拟器展示独立工具调用说明,并在 messages 预览中保留 tool_calls、tool_call_id 和 raw_message,便于观察上下文组成。",
"数据库新增 ias_context_messages.raw_message、ias_context_messages.external_message_id、ias_context_sessions 活跃会话唯一约束和 ias_tool_call_instructions 表,并迁移旧 ias_additional_system_prompts 中已有内容。"
]'::jsonb,
'{
"ias-common": "0.1.2",
"ias-ai": "0.1.9",
"ias-wechat": "0.1.0",
"ias-context": "0.1.4",
"ias-http": "0.1.12",
"ias-mail": "0.1.15",
"ias-service": "0.1.16",
"ias-main": "0.2.19"
}'::jsonb
) ON CONFLICT (version) DO UPDATE SET
released_at = EXCLUDED.released_at,
title = EXCLUDED.title,
description = EXCLUDED.description,
changes = EXCLUDED.changes,
modules = EXCLUDED.modules;
@@ -0,0 +1,34 @@
INSERT INTO ias_upgrade_logs (
version,
released_at,
title,
description,
changes,
modules
) VALUES (
'0.2.20',
'2026-07-08T00:00:00+08:00',
'微信输入中状态修复',
'微信输入中状态改用官方 sendtyping 流程,并在回复完成或上下文打断时显式取消。',
'[
"微信输入中状态改用 getconfig + sendtyping 流程:按用户获取并缓存 typing_ticket,再发送 typing/cancel 状态,不再依赖 sendmessage 的 message_state=1 中间态。",
"服务队列在最终回复发出后、空回复结束时和 /new 打断当前 turn 时会显式取消微信输入中状态,避免提示残留。",
"微信 sendmessage 请求补齐 base_info;所有微信 API 请求默认带 iLink-App-Id=bot,并可通过 WEIXIN_APP_ID 覆盖。",
"数据库无结构变化。"
]'::jsonb,
'{
"ias-common": "0.1.2",
"ias-ai": "0.1.9",
"ias-wechat": "0.1.1",
"ias-context": "0.1.4",
"ias-http": "0.1.12",
"ias-mail": "0.1.15",
"ias-service": "0.1.17",
"ias-main": "0.2.20"
}'::jsonb
) ON CONFLICT (version) DO UPDATE SET
released_at = EXCLUDED.released_at,
title = EXCLUDED.title,
description = EXCLUDED.description,
changes = EXCLUDED.changes,
modules = EXCLUDED.modules;
@@ -0,0 +1,34 @@
INSERT INTO ias_upgrade_logs (
version,
released_at,
title,
description,
changes,
modules
) VALUES (
'0.2.21',
'2026-07-08T00:00:00+08:00',
'HTTP API 功能分组说明',
'HTTP API 文档新增功能分组索引,AI 可先查看 API 面向,再按关键词或 endpoint id 查询具体接口。',
'[
"HTTP API 文档新增功能分组说明,/v1/api-docs 会返回 groups,描述 system、updates、api-docs、web、mail、console、context 等 API 面向及主要功能。",
"API 文档搜索会把功能分组的标题、说明、功能面和关键词纳入匹配;例如查询未读或邮箱目录可直接命中邮件相关接口。",
"query_api_docs 的列表输出会先展示 API 功能分组,并在每个 endpoint 简表中补充完整说明;查询单个 endpoint 时会附带所属功能分组说明。",
"数据库无结构变化。"
]'::jsonb,
'{
"ias-common": "0.1.2",
"ias-ai": "0.1.10",
"ias-wechat": "0.1.1",
"ias-context": "0.1.4",
"ias-http": "0.1.13",
"ias-mail": "0.1.15",
"ias-service": "0.1.18",
"ias-main": "0.2.21"
}'::jsonb
) ON CONFLICT (version) DO UPDATE SET
released_at = EXCLUDED.released_at,
title = EXCLUDED.title,
description = EXCLUDED.description,
changes = EXCLUDED.changes,
modules = EXCLUDED.modules;
@@ -0,0 +1,35 @@
INSERT INTO ias_upgrade_logs (
version,
released_at,
title,
description,
changes,
modules
) VALUES (
'0.2.22',
'2026-07-08T00:00:00+08:00',
'AI API 能力去重',
'移除与 HTTP endpoint 一一重复的 AI 专用 API 能力,统一通过 API 文档发现和通用 HTTP API 调用能力执行。',
'[
"AI API 能力去重:移除与 HTTP endpoint 一一重复的专用能力,如 web 页面、邮件查询、长期记忆和工具调用说明写入包装。",
"新增通用 API 能力 call_http_api,模型先通过 query_api_docs 查询 endpoint_id、参数和请求体,再按 endpoint_id 调用具体内部 HTTP API。",
"call_http_api 会根据 /v1/api-docs/{endpoint_id} 校验接口路径和方法,支持 path_params、query、body,并为 context 分组接口自动补当前用户作用域身份和内部鉴权。",
"删除不再编译的 AI 专用 API 包装文件,保留 query_tool_call_instruction 作为 query_capabilities 内部读取工具调用说明的实现。",
"数据库无结构变化。"
]'::jsonb,
'{
"ias-common": "0.1.2",
"ias-ai": "0.1.11",
"ias-wechat": "0.1.1",
"ias-context": "0.1.4",
"ias-http": "0.1.13",
"ias-mail": "0.1.15",
"ias-service": "0.1.19",
"ias-main": "0.2.22"
}'::jsonb
) ON CONFLICT (version) DO UPDATE SET
released_at = EXCLUDED.released_at,
title = EXCLUDED.title,
description = EXCLUDED.description,
changes = EXCLUDED.changes,
modules = EXCLUDED.modules;