feat: AI 控制台回答支持 Markdown 渲染 + 推理链可折叠 + token 用量显示
- markdown.js(新增,无 CDN 依赖):轻量 Markdown 渲染(标题/列表含嵌套/表格/ 代码块/引用/链接…),先 esc() 转义再套标记,模型输出的 HTML 只当文本显示 - agent.js:回答改走 Markdown;推理链改为 <details> 可折叠(流式时展开、正文开始 自动收起、手动点过后不再自动改);单条消息 token 脚注 + 顶栏「本会话累计」 - monitor.html:消息结构加 .reasoning/.agent-usage、顶栏 token 徽标、md 相关样式, 引入 markdown.js(base.js 之后、agent.js 之前) - mcp_agent/agent.py:请求带 stream_options.include_usage,按「每次模型调用」累计 usage(末尾 chunk),on_usage 回调吐累计值;网关不认该参数(400/422/点名)时 自动降级重试一次 - web/agent_api.py:SSE 新增 usage 事件、done 带 usage;推理链与用量随会话落库 (_REASONING_KEEP=6000 截断),回灌模型时只取 role/content - 文档:API.md(usage 事件/done/会话消息字段)、ARCHITECTURE §5.4.1、DEVELOPMENT 前端 JS 清单 自测:假模型端点单测 3/3(正常/降级/多轮累加);Edge headless 全链路 27 项全通过 (真实 Flask+SSE+SQLite,含 XSS 转义、刷新后回看);Markdown 渲染器 18 用例全通过
This commit is contained in:
+14
-2
@@ -1186,15 +1186,19 @@ AI 可用设备列表(在线状态 + 是否有任务运行,前端据此把 b
|
||||
```json
|
||||
{"ok": true, "state": "running"|"idle"|"done", "run_id": "...", "prompt": "...",
|
||||
"serial": "...", "started": "10:00:01", "answer": "...", "error": "",
|
||||
"usage": {"prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0, "calls": 0},
|
||||
"history": [{"role": "user", "content": "..."}]}
|
||||
```
|
||||
|
||||
`usage` 为本轮累计 token 用量(`calls` = 模型调用次数;运行中实时增长,失败也保留已花费的)。
|
||||
|
||||
### GET /api/agent/stream?run_id=
|
||||
|
||||
订阅事件流(SSE,EventSource)。事件:
|
||||
- `event: delta` `{text, kind: content|reasoning}` — 流式文本增量
|
||||
- `event: step` `{tool, args, image?}` — 工具调用完成(MCP 步骤,image 为缩略截图)。另有三类伪卡片:`tool="🧠 经验记忆"` 表示命中任务级经验(args 形如「命中 N 条同类历史经验,已注入参考:<配方摘要>」)或本轮已写入经验库;`tool="🧠 动作经验"` 表示命中**可复用动作**(「命中 N 个可复用动作,已注入参考:<动作名>」,执行前注入)或本轮已沉淀动作(「已沉淀 N 个可复用动作」,含元素定位、禁坐标)
|
||||
- `event: done` `{answer}` — 完成
|
||||
- `event: usage` `{prompt_tokens, completion_tokens, total_tokens, calls}` — **本轮累计** token 用量,每完成一次模型调用推一次(前端实时刷新计数与费用感)
|
||||
- `event: done` `{answer, usage}` — 完成(`usage` 同上一节,最终累计)
|
||||
- `event: error` `{message}` — 失败(若因 MCP Server 未启动/不可达,message 为明确文案「MCP server(8033) 不可达 …」,不再是 SDK 原始的 `Server returned an error response`)
|
||||
- 空闲时每 15s 发一行 `: keepalive` 注释防超时;`done`/`error` 后关流
|
||||
|
||||
@@ -1234,10 +1238,18 @@ AI 可用设备列表(在线状态 + 是否有任务运行,前端据此把 b
|
||||
|
||||
**响应**:
|
||||
```json
|
||||
{"ok": true, "id": "...", "title": "...", "messages": [{"role": "user", "content": "..."}],
|
||||
{"ok": true, "id": "...", "title": "...",
|
||||
"messages": [{"role": "user", "content": "..."},
|
||||
{"role": "assistant", "content": "...",
|
||||
"usage": {"prompt_tokens": 0, "completion_tokens": 0,
|
||||
"total_tokens": 0, "calls": 0},
|
||||
"reasoning": "模型推理链(≤6000 字符,可空)"}],
|
||||
"created_at": "...", "updated_at": "..."}
|
||||
```
|
||||
|
||||
> assistant 消息可带 `usage`(本轮 token 用量)与 `reasoning`(推理链,上限 `_REASONING_KEEP`=6000 字符)。
|
||||
> 两者**仅供前端展示/回看**,回灌模型上下文时只取 `role`/`content`(见 `_agent_thread`)。
|
||||
|
||||
### DELETE /api/agent/conversations/<conv_id>
|
||||
|
||||
删除会话(消息一并删除,不可恢复)。
|
||||
|
||||
Reference in New Issue
Block a user