222 lines
6.8 KiB
Markdown
222 lines
6.8 KiB
Markdown
# 01. 基座 Runtime 架构
|
||
|
||

|
||
|
||
## 1. 项目定位
|
||
|
||
ZK Data Agent 的定位不是通用聊天机器人,也不是单人本地 IDE Agent,而是面向团队业务流程的 Web Agent 工作台。
|
||
|
||
它基于已有的本地工程 Agent 能力继续往上搭:
|
||
|
||
- `LocalCodingAgent` 提供多轮 Agent Loop。
|
||
- OpenAI-compatible client 提供模型调用适配。
|
||
- Tool registry 和 handler 提供可控执行能力。
|
||
- Session workspace 提供每个会话独立的输入、中间文件和产物目录。
|
||
- Skill system 把流程协议、业务知识、脚本和样例打包成可复用能力。
|
||
- Memory worker 把用户偏好和 Skill 使用经验异步整理为可编辑记忆。
|
||
|
||
这个项目要解决的核心痛点是:团队里的数据开发、线上挖掘、标签判断等流程,往往散在口头经验、临时 prompt、个人脚本、聊天记录和本地文件里。每个人都能临时做一次,但很难让别人稳定复用、持续维护、形成可审计的产物链。
|
||
|
||
当前已经验证过的主要业务场景包括:
|
||
|
||
- `product-data`:从产品定义、标签边界、样例 query 或 badcase 出发,生成 canonical records,并导出流转 CSV、训练 JSONL、评测 CSV。
|
||
- `online-mining-v2`:基于 ELK 日志挖掘线上样本,保留 request_id、timestamp、session、模型 prompt、模型输出、domain 等信息,并接入后续数据规范。
|
||
- `label-master`:把复杂度、多指令、自动任务、标签定义、function 输出和边界经验整理为可检索知识体系。
|
||
- 外部系统 Skill:ELK、SQL、模型迭代、飞书在线文档转换等能力以 Skill 方式接入,不侵入基座。
|
||
|
||
因此,基座 Runtime 的目标不是把某一条业务链路写死,而是提供一套稳定的承载层,让不同业务能力都能以 Skill 的方式运行、交付、沉淀和更新。
|
||
|
||
## 2. 基座解决的问题
|
||
|
||
基座不绑定某一个业务流程。它提供的是通用 Agent runtime:
|
||
|
||
- 多用户 Web 入口。
|
||
- 多会话状态管理。
|
||
- 模型选择和 OpenAI-compatible 调用。
|
||
- Tool registry 和 tool handler 执行。
|
||
- Skill 发现、启用和提示词注入。
|
||
- 当前会话工作区。
|
||
- 运行态、事件流、活动区和刷新恢复。
|
||
- 用户记忆和 Skill 记忆后台。
|
||
|
||
业务能力例如 `product-data`、`online-mining-v2`、`label-master` 都跑在这个基座上。
|
||
|
||
## 3. 文字架构图
|
||
|
||
```text
|
||
浏览器 / Web UI
|
||
|
|
||
| 用户消息、模型选择、Skill 启用、文件面板、停止运行
|
||
v
|
||
frontend/app
|
||
|
|
||
| /api/chat、/api/claw/*、/admin
|
||
v
|
||
backend/api/server.py
|
||
|
|
||
| 账号配置、会话目录、run manager、run_state_store、memory_manager
|
||
v
|
||
LocalCodingAgent
|
||
|
|
||
| build_session、prompt sections、tool_specs、Agent loop
|
||
v
|
||
OpenAICompatClient
|
||
|
|
||
| messages + tools -> model backend
|
||
v
|
||
模型
|
||
|
|
||
| assistant text 或 tool_calls
|
||
v
|
||
Tool Runtime
|
||
|
|
||
| read/write/python_exec/data_agent/MCP/search/bash
|
||
v
|
||
session workspace
|
||
|
|
||
| input / scratchpad / output / session.json
|
||
v
|
||
前端活动区和文件面板
|
||
|
||
运行结束后:
|
||
|
||
AgentRunResult
|
||
-> session_store 持久化
|
||
-> memory_manager.enqueue_interaction
|
||
-> memory worker 异步整理
|
||
-> 下一轮 render_injection 注入
|
||
```
|
||
|
||
## 4. 关键代码入口
|
||
|
||
### 4.1 Web 后端入口
|
||
|
||
主要文件:
|
||
|
||
```text
|
||
backend/api/server.py
|
||
```
|
||
|
||
关键职责:
|
||
|
||
- 维护账号和会话配置。
|
||
- 创建或复用 `LocalCodingAgent`。
|
||
- 给 Agent 注入 `runtime_context`、记忆、Jupyter 上下文。
|
||
- 记录 run event,并通过 NDJSON streaming 返回前端。
|
||
- 运行结束后写入 elapsed、标题、memory event。
|
||
|
||
关键函数和位置:
|
||
|
||
```text
|
||
backend/api/server.py:691 enabled_skill_names(...)
|
||
backend/api/server.py:822 _build_agent(...)
|
||
backend/api/server.py:853 agent_for(...)
|
||
backend/api/server.py:866 run_lock_for(...)
|
||
backend/api/server.py:1720 /api/chat 运行链路开始
|
||
backend/api/server.py:1739 memory_manager.render_injection(...)
|
||
backend/api/server.py:1751 emit_agent_event(...)
|
||
backend/api/server.py:1897 序列化运行结果和 elapsed
|
||
backend/api/server.py:1920 memory_manager.enqueue_interaction(...)
|
||
backend/api/server.py:2034 StreamingResponse NDJSON
|
||
```
|
||
|
||
### 4.2 Agent Runtime
|
||
|
||
主要文件:
|
||
|
||
```text
|
||
src/agent_runtime.py
|
||
```
|
||
|
||
关键职责:
|
||
|
||
- 初始化 tool registry、plugin runtime、MCP runtime、search runtime 等。
|
||
- 新会话用 `run(...)`,旧会话用 `resume(...)`。
|
||
- 在 `_run_prompt(...)` 中执行完整 Agent loop。
|
||
- 维护 usage、cost、tool_calls、events、file_history。
|
||
- 在结束时持久化 session。
|
||
|
||
关键函数和位置:
|
||
|
||
```text
|
||
src/agent_runtime.py:158 class LocalCodingAgent
|
||
src/agent_runtime.py:195 __post_init__
|
||
src/agent_runtime.py:413 run(...)
|
||
src/agent_runtime.py:441 resume(...)
|
||
src/agent_runtime.py:520 _run_prompt 主链路
|
||
src/agent_runtime.py:552 tool_specs = [tool.to_openai_tool() ...]
|
||
src/agent_runtime.py:619 for turn_index in range(...)
|
||
src/agent_runtime.py:1008 遍历模型返回的 tool_calls
|
||
src/agent_runtime.py:1490 _query_model(...)
|
||
```
|
||
|
||
### 4.3 系统提示词
|
||
|
||
主要文件:
|
||
|
||
```text
|
||
src/agent_prompting.py
|
||
```
|
||
|
||
关键职责:
|
||
|
||
- 定义中控 Agent 身份。
|
||
- 注入工具使用策略。
|
||
- 注入工作空间边界。
|
||
- 注入 Skill 列表。
|
||
- 注入 ask_user 等 runtime 指导。
|
||
|
||
关键函数和位置:
|
||
|
||
```text
|
||
src/agent_prompting.py:135 get_intro_section
|
||
src/agent_prompting.py:155 get_doing_tasks_section
|
||
src/agent_prompting.py:182 get_actions_section
|
||
src/agent_prompting.py:196 get_workspace_boundary_section
|
||
src/agent_prompting.py:210 get_using_your_tools_section
|
||
src/agent_prompting.py:274 get_skill_guidance_section
|
||
src/agent_prompting.py:414 get_ask_user_guidance_section
|
||
```
|
||
|
||
## 5. 基座的分层职责
|
||
|
||
```text
|
||
Web UI
|
||
负责交互、展示、文件面板、活动区、Skill 勾选、管理后台。
|
||
|
||
Backend API
|
||
负责账号、会话、模型配置、运行态、服务端事件流。
|
||
|
||
Agent Runtime
|
||
负责 Agent loop、模型调用、工具调用、预算和持久化。
|
||
|
||
Prompting
|
||
负责把规则、工具、公约、Skill 列表转成模型可见上下文。
|
||
|
||
Tool Runtime
|
||
负责稳定执行动作,并把结果结构化回传给模型。
|
||
|
||
Skill System
|
||
负责让业务流程、知识、脚本可被 Agent 发现和使用。
|
||
|
||
Workspace
|
||
负责隔离每个用户和每个会话的输入、临时文件和交付产物。
|
||
|
||
Memory Worker
|
||
负责从交互历史中异步整理长期偏好和 Skill 使用经验。
|
||
```
|
||
|
||
## 6. 设计边界
|
||
|
||
基座只应该承载跨业务复用的稳定能力,例如:
|
||
|
||
- 工具执行。
|
||
- 会话状态。
|
||
- 运行态事件。
|
||
- 工作区路径。
|
||
- Skill 发现和启用。
|
||
- 模型适配。
|
||
- 记忆后台。
|
||
|
||
业务流程不应该写死在基座里。数据生成、线上挖掘、标签判断等变化快的流程应该沉到 Skill;确定性脚本应该放在对应 Skill 的 `scripts/` 下。
|