团队项目第一次作业
锚:团队展示、选题报告与需求分析
| 项目 | 内容 |
|---|---|
| 作业所属课程 | 软件工程(https://edu.cnblogs.com/campus/gdgy/Class56-Grade2024-CS) |
| 作业要求 | 团队项目第一次作业:团队展示、选题报告与需求分析 |
| 作业的目标 | 从真实使用场景里确定选题,把智能体嵌进一个打开就能用的软件,再用一套能重复的测试说明它到底做到了什么。 |
| 团队名称 | 对对队 |
| 团队成员学号-姓名 | 3124004179-王嵘烨、3124004170-李建鑫、3124004189-周微 |
一、团队展示
1.1 团队名称与项目名称
团队名称:对对队。
项目名称:锚
队名和项目名取的是"锚"的三件事,恰好也是这个产品的三件事。锚定:内核不在云上,就跑在你自己那台机器里,用的是你的文件、你的终端、你正登录着的那个浏览器。缆绳:一条隧道从机器牵出来,一头拴在它身上、一头在你手上,换设备、换网络、人在外地,拉住同一根绳就回到同一个会话。稳住:你走开的时候它不漂,定时任务、Webhook、代码评审该跑照跑,回来能看到跑到哪、成没成。
一句话说,锚是一个解压即用、跑在自己机器上的智能体工作台:本机是能力,隧道是入口,无人值守是它和别人不一样的地方。
| 端 | 地址 | 说明 |
|---|---|---|
| 本机工作台 | http://10.21.76.30:4096/ | 解压启动后的默认入口,会话、文件、终端、浏览器都在这里 |
1.2 项目规划
| 阶段 | 时间 | 目标 |
|---|---|---|
| 阶段一:起点 | 2026.09 | 实验室的机器管不过来,先做一个能在机器上干活的入口 |
| 阶段二:能离开这台机器 | 2026.09—10 | 人在实验室之外也能用 |
| 阶段三:能长期用 | 2026.10—11 | 从"能用"到"敢每天用" |
| 阶段四:让它自己干 | 2026.11—11.10 | 人不在也能推进 |
| 阶段五:文档与答辩 | 2026.11.10—11.26 | 需求、验收、演示统一成一套说法 |
| 阶段六:期末前 | 11 月末—期末 | 按验收标准逐条复测 |
第三阶段是最不"好看"的一段:两个多月没加任何新功能,全在修启动耗时、终端卡死、运行互斥。真正让一个产品从 demo 变成工具的,就是这些没人看见的地方。
1.3 队员风采与分工
| 姓名 | 学号 | 项目角色 | 性格或特点 | 技术特长或本项目实践方向 | 兴趣爱好 |
|---|---|---|---|---|---|
| 王嵘烨 | 3124004179 | 内核与运行时 | 话少,遇到问题往底层挖,不满足于"先绕过" | TypeScript / Bun 运行时、进程与并发、工具调度、多模型 Provider | 乒乓球 |
| 李建鑫 | 3124004170 | 前端与浏览器中继 | 对细节敏感,愿意为一个交互改三版 | Vue / TypeScript、SSE 流式渲染、扩展与 CDP 元素定位 | 跑步 |
| 周微 | 3124004189 | 平台适配、测试与文档 | 较真,会追着问"这条你怎么证明" | 平台开放接口、包边界设计、测试设计、需求工程 | 篮球 |
1.4 团队首次合照

1.5 团队愿景
每个人自己那台机器上,都有一个真正能动手的智能体。它认识你的文件、会用你的浏览器、你关掉页面它也不会忘事;它不把你的资料传上云,也不要求你会配环境,下载、解压、双击就开始了。技术应该把能力交回个人手里,而不是把个人交到平台上。
二、选题报告
2.1 选题背景
实验室的机器管不过来,这是这个项目真正的起点。 我们要维护实验室里的几台机器。机器本身不贵,贵的是人得在跟前。想跑一次训练或编译,先 SSH 进去敲一长串命令,参数记错一个字就从头再来;几个人共用一台机器,谁在跑什么、占了多大内存没人说得清,直到进程互相踩死才发现;一个任务要跑一小时,人就得守一小时,中途走开就不知道跑到哪、有没有报错。
| 当时的具体疑问 | 形成的产品需求 |
|---|---|
| 人在宿舍,怎么确认实验室那台机器上的任务还在跑? | 会话与任务状态可远程查看,SSE 实时推送 |
| 内网系统必须登录后才能填表,脚本怎么进去? | 接管用户正在用的浏览器,不用无头浏览器 |
| 训练要跑两小时,我不能一直守着 | 定时与 Webhook 触发,无人值守执行,可回看运行历史 |
| 三个人共用一台机器,怎么不互相踩? | 会话隔离、运行权互斥、资源生命周期管理 |
| 实验室网络没有公网 IP,怎么从外面进来? | 内置隧道加密码鉴权,开启前强制设密 |
2.2 问题定义
这句话里有三个约束,也正是所有设计取舍的来源:
- "在那台机器上"——内核必须跑本机,不能是云端容器。这一条直接否掉了"套一个云端智能体平台"的路线:扣子、Dify、GPTs 都跑在云上,碰不到实验室机器的磁盘和登录态浏览器。
- "人不在这台机器跟前"——必须有一条能从外面进来的路,且不能裸奔。隧道开启前强制设密码,就是这个约束的直接产物。
- "能看到它做了什么"——每一步工具调用都要留痕:读改了哪个文件、跑了哪条命令、浏览器点到了哪个元素,事后可回看、可复现。
2.3 产品定位与目标用户
| 用户群 | 典型场景 | 我们提供的价值 |
|---|---|---|
| 实验室 / 机房(第一优先,项目原点) | 多台机器在固定场所,人常不在现场 | 每台机器一个入口,离开机房也能跑命令、看进度、进内网系统填表 |
| 独立开发者 / 学生 | 有代码仓库,需要 AI 协助改代码 | 真正读写文件系统与终端,不是把代码复制进对话框 |
| 异地 / 移动场景 | 出差、通勤、多设备切换 | 手机浏览器打开隧道地址,接着同一个会话继续 |
| 隐私敏感用户 | 医疗、法务、企业内部资料 | 会话、文件、密钥留在本地磁盘,云端只承担推理 |
| 小团队协作 | 需要 AI 参与代码评审 | MR 触发评审并回帖,无需人盯 |
2.4 核心功能
| 编号 | 功能 | 说明 |
|---|---|---|
| F01 | 会话与流式对话 | 会话绑定工作目录;推理、工具调用、正文按 part 增量推送,过程可折叠回看 |
| F02 | 文件与终端操作 | read / write / edit / glob / grep 与 bash;终端保留 scrollback,有超时与截断 |
| F03 | 工具调用与权限审批 | 高风险动作先授权;跨项目默认拒绝;密钥不进上下文 |
| F04 | 真实浏览器接管 | 经扩展中继驱动已登录的浏览器:定位、填写、提交、截图留证 |
| F05 | 并发与资源治理 | 同一会话运行权互斥(busy 返回 409);中断可恢复;旧代次写入丢弃 |
| F06 | 无人值守自动化 | Webhook 与 cron 触发;运行历史可回看、可重放;投递用 outbox 保证幂等 |
| F07 | 平台适配 | MR 评审并回帖;飞书消息通道;平台能力独立成包,不耦合内核 |
| F08 | 鉴权与隧道 | 密码换会话令牌(TTL 720 分钟);隧道一键开启,未设密码拒绝启动 |
| F09 | 多模型与 MCP | Provider 可插拔(Anthropic / OpenAI / Gemini / 自定义);MCP 支持 stdio 与远程 HTTP,热生效 |
| F10 | 可观测性 | 请求量、工具耗时、失败率面板;每次运行有唯一编号可追 |
走一遍真实的任务
用户在会话里说一句话,系统拆成工具调用,一次一次做完,最后把过程折叠成一条可以展开的记录。下面用一次实际使用走一遍。


最下面这条是运行结束时它自己整理的结果——34 次调用、4 分 24 秒,README 的四部分写完了。

2.5 创新点
零依赖打包。 内置 Bun 运行时,下载解压就能跑,不需要装 Node、不需要包管理器、不需要 Docker,Windows、macOS(Apple Silicon)、Linux(x64/arm64) 四个平台开箱可用。这一条看着不"智能",但它决定了实验室那台没人维护的机器上能不能装得上。
2.6 技术方案与可行性
总体架构分四层,用户只碰到最上面一层:

接入层是浏览器、手机隧道、Webhook 和 MR 事件,负责"从哪进来";编排层管一次任务怎么调度;能力层是文件、终端、浏览器中继、平台包和 MCP;运行时层管进程、会话存储、租约和观测。分层的目的只有一个:换任何一层都不动其它三层。
| 环节 | 选型 | 为什么 |
|---|---|---|
| 运行时 | Bun(随包内置) | 打包成一个可执行文件,解压就能跑,用户不用装 Node |
| 前端 | Vue 3 + Vite | 单页应用,构建产物随包分发,离线也能打开 |
| 通信 | HTTP + SSE | 一条长连接推增量,工具调用、推理、正文按序到达 |
| 存储 | SQLite | 会话、消息、outbox 都在本地一个文件里,备份就是复制文件 |
| 浏览器中继 | 浏览器扩展 + WebSocket | 直接驱动用户已登录的浏览器,不需要无头环境 |
| 模型 | Provider 抽象 | 四家加自定义 baseURL,换模型只改配置 |
可行性上,最难的三块都已经跑通:四平台预编译包有 CI 冒烟;隧道与密码鉴权在手机上验证过;浏览器中继能稳定完成一次填表提交。剩下的四个开放问题都是"能用但不稳",属于迭代范围,不影响答辩现场演示。
三、需求分析
以下按需求来源、功能结构、类图、功能描述、非功能、运行环境、验收组织,参考了两项软件文档国家标准。GB/T 9385—2008《计算机软件需求规格说明规范》 · GB/T 8567—2006《计算机软件文档编制规范》。完整文档另附,共 48 条功能需求(后端 31 条、前端 17 条)、20 条非功能需求、17 条验收标准。
3.1 系统功能结构
功能分为会话、工具、浏览器、自动化、访问与模型六块,落成四层。主流程依次经过会话绑定、上下文组装、工具调用、权限校验和结果回填。

下面这张表是用户侧行为与后端处理的对照。
| 编号 | 用户侧行为 | 后端或浏览器如何处理 |
|---|---|---|
| F01 | 打开会话,说一句话,看到过程与结果 | 会话绑 cwd;按 part 增量推 SSE;工具调用、推理、正文按序出现 |
| F02 | 让它读文件、改代码、跑命令 | 工具层执行 read/write/edit/bash;终端持久化,超时与截断有上限 |
| F03 | 高风险操作被要求授权 | 调用前做权限与范围校验;跨项目默认拒绝;密钥不进上下文 |
| F04 | 让它去网页填表、提交 | 中继连扩展;滚到视口取坐标、多选择器兜底、提交前比对、事后截图 |
| F05 | 同一会话连发两条消息 | 运行权互斥,busy 返回 409;取消后释放租约;旧代次写入丢弃 |
| F06 | 设"每天九点跑一次"或接 Webhook | 触发一次完整运行;历史记输入、输出、耗时、失败原因;投递幂等 |
| F07 | 提一个 MR,等它在下面回帖 | MR 事件触发评审;拉 diff、跑检查、把结论发回;飞书走独立包 |
| F08 | 手机上打开隧道地址并输密码 | 密码换令牌(TTL 720 分钟);未设密码拒绝启动;HTTP 提示可被截获 |
| F09 | 换模型,或加一个 MCP 服务 | Provider 可插拔,改配置即可;MCP 支持 stdio 与远程 HTTP,热生效 |
| F10 | 看这一周的失败率和耗时 | 指标按窗口聚合;每次运行有唯一编号,可从面板追到会话 |
3.3 核心类图

| 类 / 模块 | 职责 | 关键成员 |
|---|---|---|
| AgentRuntime | 会话与运行权的中枢 | createSession、acquireRun、releaseRun、cancel |
| Controller | 一次运行的编排 | assembleContext、dispatch |
| Session | 会话状态与消息序列 | cwd、state、messages、appendPart、snapshot |
| Message / Part | 消息由 part 组成,按序增量推送 | role、parts |
| Tool | 工具接口 | schema、execute、checkPermission |
| ToolRegistry | 按代次解析工具,旧代次失效 | register、resolve、isAlive |
| PlatformManager | 平台包激活与回滚 | activate、snapshotTools、commit、rollback |
| Provider | 模型接入 | protocol、baseURL、chat |
| Automation | 定时与事件触发 | kind、trigger |
3.4 功能描述
F01 会话与流式对话
| 项 | 内容 |
|---|---|
| 输入 | 一条自然语言消息,可带附件;会话必须绑定一个工作目录 |
| 处理 | 创建或复用会话 → 组装上下文 → 调用模型 → 按 part 增量推送 → 工具调用折叠 |
| 输出 | SSE 流:推理片段、工具调用与结果、正文、完成状态 |
| 异常 | 模型不可用时保留已输入内容;同一会话 busy 返回 409,不落库不覆盖 |
F04 真实浏览器接管
| 项 | 内容 |
|---|---|
| 输入 | 一句目标("去办事大厅把这个表填了")加当前浏览器已登录的会话 |
| 处理 | 中继建立 → 定位目标页 → 滚动取坐标 → 填写 → 提交前比对 → 截图 → 等回执 |
| 输出 | 每一步命中的元素、输入值、截图;失败时说明卡在哪一步 |
| 约束 | 不用无头浏览器;不代输密码;提交类动作前必须确认 |
F06 无人值守自动化
| 项 | 内容 |
|---|---|
| 输入 | cron 表达式、Webhook(源加 secret)或 MR 事件 |
| 处理 | 触发 → 生成运行编号 → 执行完整任务 → 记录输入输出耗时 → 投递结果 |
| 输出 | 运行历史列表,可点开看单次详情,可重放 |
| 约束 | 重投必须幂等;失败可重试但有上限;同一任务实例不并发 |
F08 鉴权与隧道
| 项 | 内容 |
|---|---|
| 输入 | 访问密码;隧道服务选择(ngrok / NATAPP) |
| 处理 | 密码换令牌 → 令牌随请求携带并校验 TTL → 隧道把本机端口映射到公网 |
| 输出 | 公网地址;未登录访问被拒绝 |
| 约束 | 未设密码拒绝启动隧道;密钥不得出现在 prompt、日志与前端响应里 |
接口需求
| 方法 | 路径 | 用途 | 鉴权 |
|---|---|---|---|
| POST | /api/auth/login | 密码登录换取会话令牌 | 否 |
| GET | /api/projects | 项目列表 | 是 |
| POST | /api/sessions | 创建会话(绑定工作目录) | 是 |
| POST | /api/session/{id}/message | 发送消息,SSE 流式响应 | 是 |
| GET | /api/session/{id}/snapshot | 消息与待办快照 | 是 |
| PUT | /api/settings/mcp | 修改 MCP 配置(热生效) | 是 |
| GET | /api/metrics?window= | 指标查询 | 是 |
| POST | /webhooks/{sourceId}/ | 外部触发入口 | secret |
外部集成有五项:Provider API 走 HTTPS,兼容 OpenAI 与 Anthropic,支持自定义 baseURL;MCP Server 支持 stdio 和远程 HTTP 加 OAuth;浏览器中继走 WebSocket,命令与租约绑定连接代次;GitLab 走 API 与 Webhook;公网访问走隧道服务的 HTTPS/WSS。
3.5 非功能需求
| 类别 | 要求 |
|---|---|
| 性能 | 冷启动到可交互以 1 秒内为目标;首字延迟在常规网络下快于同类桌面客户端 |
| 并发 | 同一会话互斥;多会话并行不互相阻塞;高频切换终端不丢输入 |
| 可靠性 | 工具失败可重试且不重复产生副作用;中断可恢复;投递幂等 |
| 安全 | 密钥不进上下文与日志;隧道未设密码拒绝启动;跨项目默认拒绝;令牌有 TTL |
| 隐私 | 会话、文件、密钥留在本机磁盘,云端只承担推理 |
| 可移植 | Windows / macOS(Apple Silicon) / Linux(x64, arm64);不依赖系统 Node |
| 可维护 | Provider、平台适配、工具各自成包,换一层不动其它层 |
| 可观测 | 请求量、工具耗时、失败率可查;每次运行有唯一编号 |
可观测这一条落成了统计页

3.6 运行环境
| 项 | 要求 |
|---|---|
| 客户端 | 现代浏览器(Chrome / Edge / Safari 移动端);接管浏览器需安装扩展 |
| 服务端 | 本机运行,内置 Bun 运行时,无需系统级 Node |
| 操作系统 | Windows 10 及以上 / macOS(Apple Silicon)/ Linux(x64、arm64) |
| 外部依赖 | 模型 Provider(需自备 API Key)、MCP(可选)、隧道服务、GitLab(评审需要) |
| 网络 | 本机使用不需要外网;隧道与云端模型需要外网 |
3.7 验收标准与实测结果
实测截图:高风险动作会先停下来要授权,拒绝之后命令不再执行

四、小结
现在能做到的是:解压即用跑在自己机器上,本机文件和终端真能操作,需要登录态的浏览器真能接管,人离开后定时与事件触发的任务真能跑完,回来能看到每一步做了什么。
接下来先收敛四个开放问题。这四条都在"能长期用"这条线上,不解决就没法说"敢每天用"。然后是指标口径:从按会话聚合改成按调用聚合,才能回答"慢在哪一步"。
感谢阅读。

浙公网安备 33010602011771号