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
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "ias-common"
version = "0.1.1"
version = "0.1.2"
edition = "2024"
[dependencies]
+13 -10
View File
@@ -18,11 +18,13 @@ pub struct ChatCompletionRequestThinking {
pub thinking_type: String,
}
#[derive(Debug, Clone, Serialize)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatCompletionRequestMessage {
pub role: String,
pub content: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_call_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_calls: Option<Vec<ChatCompletionToolCall>>,
}
impl ChatCompletionRequestMessage {
@@ -59,7 +61,7 @@ impl ChatCompletionRequestMessage {
// {"choices":[{"finish_reason":"stop","index":0,"logprobs":null,"message":{"content":"你好!😊 有什么我可以帮你的吗?","role":"assistant"}}],"created":1782208455,"id":"02178220845277286f296e4c58ddf650991f54d763d292af8529b","model":"deepseek-v4-flash-260425","service_tier":"default","object":"chat.completion","usage":{"prompt_tokens":2005,"completion_tokens":125,"total_tokens":2130,"prompt_tokens_details":{"cached_tokens":0},"completion_tokens_details":{"reasoning_tokens":114}}}
#[allow(dead_code)]
#[derive(Debug, Deserialize)]
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct ChatCompletionResponseBody {
id: Option<String>,
object: Option<String>,
@@ -72,7 +74,7 @@ pub struct ChatCompletionResponseBody {
}
#[allow(dead_code)]
#[derive(Debug, Deserialize)]
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct ChatCompletionResponseChoice {
index: u32,
pub message: ChatCompletionResponseMessage,
@@ -80,10 +82,11 @@ pub struct ChatCompletionResponseChoice {
finish_reason: String,
}
#[allow(dead_code)]
#[derive(Debug, Deserialize)]
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct ChatCompletionResponseMessage {
pub role: String,
pub content: String,
#[serde(default)]
pub content: Option<String>,
pub reasoning_content: Option<String>,
pub tool_calls: Option<Vec<ChatCompletionToolCall>>,
}
@@ -100,7 +103,7 @@ pub struct ChatCompletionFunction {
pub name: String,
}
#[derive(Debug, Deserialize)]
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct ChatCompletionUsage {
pub prompt_tokens: u32,
pub completion_tokens: u32,
@@ -112,12 +115,12 @@ pub struct ChatCompletionUsage {
}
#[allow(dead_code)]
#[derive(Debug, Deserialize)]
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct ChatCompletionUsagePrompt {
pub cached_tokens: Option<u32>,
}
#[allow(dead_code)]
#[derive(Debug, Deserialize)]
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct ChatCompletionUsageCompletion {
pub reasoning_tokens: Option<u32>,
}
@@ -159,8 +162,8 @@ mod tests {
assert_eq!(response.service_tier, None);
assert_eq!(
response.choices[0].message.content,
"我是你的日常助手,你可以叫我**知微**!"
response.choices[0].message.content.as_deref(),
Some("我是你的日常助手,你可以叫我**知微**!")
);
assert_eq!(response.usage.unwrap().prompt_cache_miss_tokens, Some(1518));
}
+12
View File
@@ -1,4 +1,5 @@
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::model::ai::ChatCompletionToolCall;
@@ -18,6 +19,16 @@ pub struct ChannelMessage {
pub from_user_id: String,
pub content: String,
pub context: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub turn_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub external_message_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub session_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub group_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub create_time_ms: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
@@ -25,6 +36,7 @@ pub struct AssistantMessage {
pub reasoning: Option<String>,
pub content: String,
pub tool_calls: Option<Vec<ChatCompletionToolCall>>,
pub raw_message: Option<Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]