oudecheng
1e9075e1ed
fix(subagent): 失败/超时子智能体返回结构化结果,支持前端点击查看详情
...
spawn()/resume() 在会话创建后的失败(含超时、执行错误、AgentCreationFailed)
现返回 Ok(TaskToolResult { status: "failed"/"timeout", task_id }) 而非 Err(e),
使 tool_result 内容始终为结构化 JSON。前端已有的 taskStatusConfig、StatusIcon、
"查看完整会话"按钮自动生效,同时修复服务重启后点击入口丢失的问题。
- runtime.rs: 提取 handle_task_failure 辅助方法统一处理失败;将 model_resolver/
create_subagent 的 ? 纳入 result 块,确保所有会话后失败都返回结构化结果;
修复 resume() 未区分 timeout 的 bug
- tool.rs: 根据 task_result.status 判断 success,失败时 output 仍为 JSON
- agent_loop.rs: 失败时 result.output 非空则透传(仅影响 task 工具),其他工具回退
到 "Error: {error}" 纯文本
2026-08-05 09:05:35 +08:00
oudecheng
5eec77ae10
perf: 减少热路径无谓拷贝与重复正则编译,并跳过已完成迁移
...
- agent_loop::filter_images_by_age_and_count 改返回 Cow<[ChatMessage]>,
无图片或无需过滤时零拷贝返回原切片引用,避免每次 LLM 调用都完整克隆消息列表
- anthropic::convert_image_url_to_anthropic 用 OnceLock 缓存 data URL 正则,
避免每次图片转换都重新编译正则
- memory_scope_key 迁移用 PRAGMA user_version 记录已迁移版本,
避免每次启动都执行全表 DELETE + UPDATE
2026-08-05 08:10:36 +08:00
oudecheng
2e4b1931a6
feat(tokens): 添加 topic 维度 token 消耗与上下文窗口占用统计
...
后端:
- openai provider 流式响应启用 stream_options.include_usage,从 SSE 末帧捕获 usage
- ChatMessage 新增 MessageUsage(prompt/completion/total/context_window_tokens)
- agent_loop 三处 LLM 调用点持久化 usage,含 context_window_tokens
- storage 新增 context_window_tokens 列及 migration,batch_session_token_stats 聚合查询
- last_prompt_tokens 查询过滤 prompt_tokens IS NOT NULL,跳过 error/cancel 消息
- build_topic_summaries 简化签名,context_window_tokens 从消息记录读取
- protocol 扩展 TopicTokenStats,按 session_id 聚合天然隔离子代理
前端:
- protocol.ts 新增 TopicTokenStats 类型
- useTopics 映射 token_stats 到 Topic
- TopicList 展示总 token 消耗与上下文占用百分比(绿/黄/红三色)
测试:outbound_dispatcher 4 个测试修复(drop(bus) 不关闭 bus,改用 abort)
2026-08-04 17:01:54 +08:00
oudecheng
457f6b2408
feat(retry): 为 LLM 主调用添加可配置重试机制,默认 3 次
...
- config: ProviderConfig 增加 max_retries 字段(serde default=3,向后兼容)
- config: LLMProviderConfig 透传 max_retries,不进 ProviderRuntimeConfig(保持 provider 构造包纯净)
- agent: AgentRuntimeConfig 增加 max_retries,归属 agent 行为层
- agent_loop: 流式 + summary 两个调用点实现重试循环
- 指数退避 1s/2s/4s,仅对 429/502/503/504/timeout/connection reset 重试
- 流式仅在未 emit delta 时重试(AtomicBool 跟踪),避免重复输出
- 退避 sleep 期间响应 cancel_signal,取消优先
- 前端: ProviderConfig 类型和表单增加 max_retries 字段
- 测试: 7 个单元测试(3 判定 + 4 行为),540 个 lib 测试全绿
2026-08-04 12:53:33 +08:00
oudecheng
cda14360af
chore: 建立工程化基线(rustfmt + clippy + CI + eslint + prettier)
...
配置:
- rustfmt.toml: 固化 max_width=100 / 4 空格缩进,cargo fmt 全量格式化
- Cargo.toml: 配置 [lints.rust] 与 [lints.clippy] 渐进式规则
- .github/workflows/ci.yml: Rust(fmt+clippy+test) + 前端(eslint+tsc+test) 双平台 CI
- Makefile: 新增 check/fmt/fix 目标,clippy 对齐 --all-targets --all-features
- web: eslint flat config + prettier 配置 + package.json 脚本与依赖
- src/main.rs: loop→while 修复 clippy::never_loop
对抗性审查发现并修复:
- eslint 缺 caughtErrorsIgnorePattern 导致 catch(_) 误报为 error
- 前端 lint 未接入 CI,现已补上 Lint 步骤
- Makefile 与 CI 的 clippy flags 不一致,已对齐
2026-08-03 23:24:02 +08:00
oudecheng
3b0de7d071
refactor: 清理未使用的 dead code 函数与方法
2026-08-03 14:21:01 +08:00
oudecheng
92db80dc3f
perf(agent-loop): 缓存工具定义与轻量 token 估算,DB 写入 offload 至 blocking 池
...
- 工具定义在 process() 循环外构建一次(快照语义:单次 process 内 Arc<ToolRegistry> 不变)
- 工具 token 估算循环外预算一次,避免每轮 serde_json::to_string 全量序列化
- 新增 estimate_text_tokens_from_chat_messages 直接基于 ChatMessage 累加字段长度,
消除中间 text_only_messages: Vec<Message> 构造(N 条消息 × 5 字段双克隆 → 0)
- PersistingEmittedMessageHandler 用 spawn_blocking 包装 SQLite 同步写,
解除 tokio worker 线程阻塞,不改变失败语义(仅记日志不阻断主流程)
2026-07-31 08:22:58 +08:00
oudecheng
303f6d83e3
feat: 添加工具调用序列的前向检查,确保工具消息紧随助手消息后
2026-07-15 16:36:13 +08:00
oudecheng
46a1ca6853
refactor: 修复 3 项 P1 技术债(硬编码 URL / any 类型 / dead_code)
...
P1-1: 硬编码 wechat URL 抽常量统一两处
- config/mod.rs: 定义 pub const WECHAT_DEFAULT_BASE_URL
- cli/init.rs: import 并引用常量,消除字面量重复
- 消除两处不一致风险(default_wechat_base_url 与 init 向导)
P1-2: ConfigPage any 类型定义具体类型(8 处)
- types.ts: 新增 FeishuChannelConfig/WechatChannelConfig/ChannelConfig/
SchedulerJobConfig 类型;jobs?: any[] → SchedulerJobConfig[];
channels: Record<string, any> → Record<string, ChannelConfig>
- api/config.ts: 新增 RestartResponse 类型,data: any → RestartResponse
- ConfigPage.tsx: catch (e: any) ×2 → catch (e: unknown) + 类型守卫;
as any → as SchedulerConfig['misfire_policy'];
Record<string, any> → Partial<ChannelConfig>;(ch: any) → (ch: ChannelConfig)
P1-3: dead_code 18 处逐一审查清理
- 删除 10 处未使用函数/struct(YAGNI 原则):
context_compressor.rs (into_messages, is_tool_round)
agent_loop.rs (EmptySkillProvider struct + impl)
memory_maintenance.rs (run_for_scope)
session.rs (try_start/finish_background_compaction)
session_history.rs (try_start/finish_background_compaction)
tool_registry_factory.rs (shell_session_manager)
task/runtime.rs (effective_allowed_tools)
- 保留 8 处 serde 反序列化字段(删除会破坏 JSON 反序列化):
feishu.rs/openai.rs/anthropic.rs/skills/mod.rs/task/runtime.rs
2026-07-08 14:51:42 +08:00
oudecheng
393052ae48
refactor: 重构 AgentLoop 中的消息处理逻辑,简化工具结果处理和 LLM 请求构建
2026-07-08 09:33:11 +08:00
oudecheng
d7ff969560
feat: 增强消息处理,清理不完整的 tool_call 序列以防止数据污染
2026-07-06 09:04:32 +08:00
oudecheng
4071dcc6ee
feat: 更新取消结果构建逻辑,确保已生成消息包含在取消响应中
2026-07-02 18:27:22 +08:00
oudecheng
32d49601a2
feat: 更新取消信号处理,支持 interior mutability;优化 LLM 调用与工具执行的取消逻辑
2026-07-02 17:17:03 +08:00
oudecheng
606fcbcd29
feat(agent): 注入并传递 tool_call_id 实现任务与工具调用精准关联
...
- 在 agent_loop 执行上下文中注入 tool_call_id,确保执行时传递该字段
- 在 agent_factory、ws、todo_read、todo_write 等多处构造对象时添加 tool_call_id 字段初始化
- 扩展协议定义及序列化,支持 tool_call_id 字段传递
- 在工具调用任务运行时传递 tool_call_id,便于事件追踪和层级关联
- 在前端 useChat hook 增加 tool_call_id 关联逻辑,实现 task_started 事件精准匹配和跳转
- 增加 pendingTaskNavs 缓存处理,解决 task_started 事件先于 tool_call 到达的顺序问题
- 调整消息渲染逻辑,根据 tool_call_id 进行优先匹配,提升用户交互体验
2026-06-22 10:22:36 +08:00
oudecheng
97c0e46348
feat(tests): 增加工具调用序列清理的单元测试,确保孤立工具结果的正确处理
2026-06-16 16:52:00 +08:00
oudecheng
416ac047e3
feat(agent): 在每个 LLM 请求前进行不完整工具调用序列的清理
2026-06-16 16:51:40 +08:00
fc7df67474
feat(streaming): 支持流式文本增量与结束信号功能
...
- 新增 StreamDelta 和 StreamEnd 类型,支持流式数据增量传输
- 扩展 LLMProvider trait,添加带回调的 chat_with_streaming 接口
- 修改 OpenAI Provider 实现,支持流式聊天回调传输增量数据
- Agent 流处理改为异步消费增量消息并传递给前端
- 保证流式增量和最终消息使用相同消息 ID 以便前端替换
- 修改消息总线和协议层,支持携带和识别流式消息的消息 ID
- 客户端 CLI 通过增量输出实现交互式流式响应显示
- Web 前端接收流式增量消息,追加到对应消息,实现实时显示
- 各通道(飞书、微信)支持转发流式增量和结束消息
- 任务工具运行时添加消息 ID 支持,保持消息一致性
- 统一消息构造函数新增流式增量和结束信号的构建方法
2026-06-14 10:24:52 +08:00
e37dea886b
refactor(tools): 优化交互式进程输出捕获逻辑
...
- 删除了 PendingUserAction 相关的冗余辅助消息发送代码
- 引入自适应 drain_until_stable 函数循环读取输出直到稳定
- 用 drain_until_stable 替代固定延时等待以捕获最终提示内容
- 确保进程等待 stdin 时完整且及时地捕获所有输出数据
- 移除过时的常量和注释,简化代码逻辑
- 保持对最大循环次数和间隔时间的限制防止死循环
2026-06-13 17:40:44 +08:00
640829ce52
fix(agent): 优化等待工具输出内容的提取逻辑
...
- 跳过标记行、session_id元数据和空行
- 跳过提示行,提取提示行之后的实际内容
- 限制提取内容最多20行,防止消息过长
- 当提取内容为空时,使用默认提示消息
- 改善助手消息的显示内容格式
2026-06-13 17:40:30 +08:00
988e77123c
feat: 精简日志记录,移除冗余信息,优化调试输出
2026-06-06 10:41:52 +08:00
fb90641774
feat: 增强日志记录,添加消息处理和工具执行的详细信息
2026-06-06 09:26:50 +08:00
oudecheng
d1d4998a26
feat: 增加工具结果字符限制,提升处理能力至 100,000 字符
2026-06-04 17:33:01 +08:00
oudecheng
2f529e96d0
feat: 添加滚动控制功能,支持回到顶部和回到底部的按钮
2026-06-04 16:00:43 +08:00
oudecheng
1b571e943f
feat: 添加停止当前执行的 Agent 功能,支持通过 /stop 命令取消执行
2026-06-03 16:49:29 +08:00
oudecheng
a11fdac86a
feat: 优化消息历史清理逻辑,支持移除任意位置的未完成工具调用序列
2026-06-03 15:14:18 +08:00
oudecheng
cb58d9f3f0
feat: 清理消息历史中不完整的 tool call 序列
...
新增 sanitize_incomplete_tool_call_sequences() 方法,移除末尾
缺少对应 tool result 的 assistant tool_calls 消息。解决进程中断
导致部分 tool call 序列残留、进而引发 API 报错的问题。
同时清理因父消息被移除而残留的孤儿 tool result 消息。
2026-06-02 20:40:05 +08:00
oudecheng
4d6d989247
feat: 添加工具执行时长字段,增强消息处理功能
2026-06-02 16:52:47 +08:00
oudecheng
f8fc0f7d0f
feat: 添加工具结果处理功能,支持执行时长记录和显示
2026-06-02 16:15:05 +08:00
oudecheng
06756a4816
fix: 修复消息持久化缺失 topic 关联和 assistant 文本丢失
...
- PersistingEmittedMessageHandler 新增 topic_id 参数,使用 append_message_with_topic 替代 append_message
- agent_loop 的所有退出路径中为最终 assistant 文本添加 emit_live_tool_call_message
- 更新 finalize_result filter,live_emitter 存在时抑制所有消息的 post-loop 广播
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 18:09:00 +08:00
oudecheng
d0051baa07
refactor: 消息持久化从批量改为实时逐条,通过装饰器模式实现
...
- 新增 PersistingEmittedMessageHandler 装饰器,在 emitter 广播前逐条落库
- processor 和 task/runtime 使用装饰器包裹 emitter,替代 post-loop 批量写入
- 移除 session_history 中的批量 DB 写入,仅保留内存历史更新
- execution 中跳过已由 live emitter 实时广播的工具消息,避免重复
- 前端支持运行中 task 工具卡片"查看实时进度"跳转子智能体视图
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 16:47:57 +08:00
oudecheng
5e5de7ce9f
refactor: 移除 show_tool_results 开关,始终实时推送工具调用消息
...
简化工具消息推送逻辑,去掉条件判断,让所有工具消息(含结果)
直接通过 emit_live_tool_call_message 实时发送给用户。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 18:52:40 +08:00
oudecheng
624d8e8943
feat: 添加 React Web UI 前端界面
...
- 使用 React 18 + TypeScript + Vite + Tailwind CSS 构建前端
- 实现 WebSocket 实时通信(useWebSocket hook)
- 添加聊天界面组件(MessageList, MessageBubble, MessageInput)
- 集成 Topic 管理(新建、列出、切换)
- 支持 Markdown 渲染(react-markdown + remark-gfm)
- 添加工具调用展示面板
- 实现深色科技主题(Tech Dark)
- 后端集成静态文件服务(tower-http)
- 添加 Makefile 和 build.sh 构建脚本
- 更新 .gitignore 忽略前端构建产物
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 17:43:15 +08:00
b571d7b7b3
feat: 添加图片上下文限制配置,支持最大图片数量和消息轮次限制
2026-05-24 18:06:22 +08:00
oudecheng
159c1bbb7a
feat: 移除日志中的响应内容和模型信息,优化工具调用的日志记录
2026-05-21 17:20:26 +08:00
oudecheng
efc8af12eb
feat: 添加参数提取工具函数,支持处理字符串化 JSON 数组,优化技能管理和会话发送功能
2026-05-21 17:00:22 +08:00
oudecheng
7540828397
Revert "feat: 添加流式聊天支持,更新相关依赖和接口以实现流式响应"
...
This reverts commit cb48ef09b22ef72798a15ff3485c8e21f77e59f4.
2026-05-20 09:20:26 +08:00
oudecheng
cb48ef09b2
feat: 添加流式聊天支持,更新相关依赖和接口以实现流式响应
2026-05-20 09:10:47 +08:00
6b5d45e3a5
feat: 添加探索类型最大执行时间配置,优化子代理任务执行逻辑
2026-05-16 17:05:03 +08:00
oudecheng
1c1efcabf4
feat: 移除冗余的 provider_config 字段,优化 AgentFactory 和 Session 的构造逻辑
2026-05-13 15:41:52 +08:00
oudecheng
a06fceaf0c
feat: 添加系统提示词提供者,支持动态注入和组合多个提示词源
2026-05-13 14:55:50 +08:00
9d9fa1dc4b
feat: 添加 memory_maintenance_timeout_secs 配置,优化内存维护超时设置
2026-05-12 22:11:34 +08:00
oudecheng
4473c9fc47
feat: 增强参数截断逻辑,确保在截断时遵循UTF-8字符边界,并添加相关单元测试
2026-05-12 17:44:39 +08:00
181740559b
feat: 移除不再使用的记忆工具提示,更新默认代理配置中的记忆处理规则
2026-05-10 14:17:45 +08:00
495c8cdc7e
feat: 添加技能匹配摘要功能,优化技能提示信息,明确技能与工具的区别
...
Co-authored-by: Copilot <copilot@github.com>
2026-05-02 09:38:31 +08:00
531e72d24f
feat: 添加图像处理预算和估算逻辑,优化消息内容构建,支持图像媒体引用
...
Co-authored-by: Copilot <copilot@github.com>
2026-05-01 21:22:07 +08:00
716d92a618
feat: 引入 AgentRuntimeConfig,重构相关模块以支持运行时配置
...
Co-authored-by: Copilot <copilot@github.com>
2026-04-30 22:34:22 +08:00
90e44950cb
feat: 重构技能事件处理逻辑,移除 SkillEventSink,添加 SkillActivateTool 模块以优化技能激活流程
...
Co-authored-by: Copilot <copilot@github.com>
2026-04-28 15:31:56 +08:00
396504dffb
Refactor agent and storage components to introduce SkillProvider and repository patterns
...
- Introduced `SkillProvider` trait to abstract skill-related functionalities.
- Replaced `SkillRuntime` with `EmptySkillProvider` in `AgentLoop` for default behavior.
- Updated `AgentFactory` to accept `SkillProvider` instead of `SkillRuntime`.
- Created `SessionHistory` struct to manage chat histories and interactions.
- Added `MemoryRepository`, `SchedulerJobRepository`, and `SkillEventRepository` traits for better storage abstraction.
- Refactored tools to use new repository traits for memory and scheduler management.
- Cleaned up session management logic by consolidating chat history handling into `SessionHistory`.
Co-authored-by: Copilot <copilot@github.com>
2026-04-28 15:12:45 +08:00
c547b88a12
feat: 添加持久化技能事件处理逻辑,重构技能事件记录机制
...
Co-authored-by: Copilot <copilot@github.com>
2026-04-28 14:49:31 +08:00
af7860f2fd
feat: 重构消息模块,添加 ContentBlock 和 ToolCall 结构,优化消息处理逻辑
...
Co-authored-by: Copilot <copilot@github.com>
2026-04-28 14:04:59 +08:00