【封闭结束1】端到端交付:Agent 一次请求如何走完全链路

发布时间:2026/10/24 7:38:43

【封闭结束1】端到端交付:Agent 一次请求如何走完全链路 前言封闭告一段落开始系统复盘一个生产 Agent 到底怎么跑起来。踩坑、经验和落地最主要的是用户认可。尽量用几篇文章讲清这篇文章是系列第1篇用一次只读查询把从界面到 Trace 的整条链路先跑通。用户说“查一下生产环境order-service最近的错误日志。”最终只看到一段回答背后至少经过身份、会话、意图、模型、工具、流式事件、持久化和观测。任何一跳出错都可能表现成“Agent 答错了”。这篇先把整条链路跑通后面几篇再分头细说。案例 OpsPilot企业运维助手虚构只读工具search_resource、query_logs知识工具search_knowledge_base写工具restart_instance必须 HITLHuman-in-the-Loop人在回路确认技术栈Node.js TypeScript Vue 3一张总图POST SSEVue 对话 UI会话服务鉴权与 RequestContextAgent Runtime意图与上下文组装模型网关LLM ProviderTool Runtime业务 API / MCPRAG 检索向量库 / 全文索引Run 事件与消息持久化Trace / Metrics / Eval图上每一块管一件事别混模型负责读懂意思并给出结构化提案。Runtime 负责推进步骤、卡预算、处理中断。Tool Runtime 负责 schema参数长什么样、鉴权、幂等同一操作做一次和做多次和真正执行。会话服务负责身份、Run 生命周期和跟前端的协议。Trace/Eval 负责事后说清「到底哪一跳错了」。请求怎么进 Runtime会话 API 入口前端不应直连模型。它调用自己的会话 APIPOST /api/conversations/conv_123/runs Authorization: Beareruser-tokenContent-Type: application/json Idempotency-Key: 2d7e45b8{message:查一下生产环境 order-service 最近的错误日志}RequestContext 从哪来服务入口中间件从可信登录态拼出上下文。尤其是tenantId和userId别从模型参数或用户原文里读exporttypeRequestContext{// 入口鉴权后的请求上下文requestId:string// 本请求 ID日志与排障用traceId:string// 全链路追踪 ID跨会话/工具/模型共用tenantId:string// 租户检索过滤与数据隔离以此为准userId:string// 当前用户工具鉴权读这里不读模型参数roles:string[]// 角色用于 ACL / RAG 可见范围scopes:string[]// 允许调用的工具或资源范围deadlineAt:number// 整次 Run 截止时间戳超时取消}会话服务创建runId写入用户消息然后把 Run 交给 Runtime。HTTP 连接只是订阅进度不是任务状态本身。只读时序从提案到回灌场景用户问「查一下生产环境order-service最近的错误日志」。这是只读链路不需要 HITL通常会先定位资源再查日志最后给出带证据的回答。按谁干什么读图参与方职责VueUI发起 POST订阅 SSE渲染步骤与增量文本SessionAPI验身份、建 Run、转发事件不直连模型AgentRuntime推进 ReAct调模型、派工具、收结果、决定是否结束ModelGateway统一调用 LLM返回tool_calls或最终文本ToolRuntime校验参数、按RequestContext鉴权、执行业务 APIObservability记录 span、版本、Token供事后归因ObservabilityToolRuntimeModelGatewayAgentRuntimeSessionAPIVueUIUserObservabilityToolRuntimeModelGatewayAgentRuntimeSessionAPIVueUIUser查询 order-service 错误日志POST runstart(run, context)SSE run_startedmessages tool schemassearch_resource(args)tool_startedSSE tool_startedinvoke(search_resource, args, context)exact resourceToolMessage(result)query_logs(args)invoke(query_logs, args, context)structured log summaryToolMessage(result)final answerspans metrics versionsfinal messageSSE text_delta done切记每个tool_call_id必须有对应结果。工具失败也要返回结构化错误否则下一轮模型既无法自我修正也可能违反模型 API 的消息约束。关键几跳入口前端POST run会话服务带着可信RequestContext启动 Runtime同时先推run_started让 UI 立刻有反馈。第一轮模型Runtime 把消息和工具 schema 交给模型。模型提出search_resource——此时还没查库只是「提案」。工具执行Runtime 发tool_started给前端再交给 Tool Runtime 真正调用。身份用上下文里的tenantId/userId不信模型参数里的身份字段。结果回灌工具结果变成ToolMessage再进模型。每个tool_call_id都必须有一条结果失败也要结构化回灌否则下一轮对不齐消息协议。第二轮工具模型根据资源信息再提query_logs同样走 Tool Runtime拿到结构化日志摘要。收尾模型给出最终自然语言答案Runtime 落 Trace会话服务推text_deltadone。HTTP 断开不代表 Run 不存在状态以会话服务为准。一句话模型只提案、Tool Runtime 才执行前端只订事件、别自己猜「是不是在调工具」写操作别走这条「连续自动跑」的路要进下一节的 HITL。事件、写操作 HITL 与落库前端、落库和观测最好围着同一组业务事件转。事件类型可以先定成下面这一组exporttypeRunEvent// Run 业务事件联合|{type:run_started// 事件Run 已开始runId:string// 本次 Run IDsequence:number// 事件序号去重/续传用}|{type:text_delta// 事件增量文本runId:string// 所属 Runsequence:number// 事件序号delta:string// 增量文本不是全量覆盖}|{type:tool_started// 事件工具开始执行runId:string// 所属 Runsequence:number// 事件序号callId:string// 与 tool_finished 配对tool:string// 工具名给步骤条展示}|{type:tool_finished// 事件工具结束runId:string// 所属 Runsequence:number// 事件序号callId:string// 对应 tool_startedstatus:success|error// 执行结果状态summary:string// 给前端的短摘要不是原始大结果}|{type:interrupt// 事件HITL 等待确认runId:string// 所属 Runsequence:number// 事件序号interruptId:string// 恢复时带回防止过期确认payload:unknown// 确认卡内容风险说明、参数摘要等}|{type:done// 事件Run 正常结束runId:string// 所属 Runsequence:number// 事件序号messageId:string// 落库后的助手消息 ID}|{type:error// 事件Run 失败runId:string// 所属 Runsequence:number// 事件序号code:string// 可分类错误码勿回灌堆栈}sequence用来去重和以后补发第一版就算还没做事件重放字段也先留着。别让前端靠解析自然语言去猜「现在是不是在调工具」。写操作为什么必须换一条路如果用户说“重启这个异常实例”。模型只能提出动作不能自己给自己开权限restart_instance proposedapproved reauthorizedrejected or expiredRunningWaitingHumanCancelledCompletedFailed恢复时至少重做四件事校验interruptId仍 pending按当前 RequestContext 重新鉴权重新读取资源防止确认期间状态变化用幂等键避免双击和网络重试造成重复执行。具体实现见后面几篇多轮、SSE、HITL 和工具 Runtime 会分开写。Run 最少要存什么SSE 可能断Run 还在跑。所以库里至少要有一张「状态小票」RunRecord随时能查这笔请求卡在哪、用了哪版 Prompt/模型。它不是聊天全文也不是工具吐出来的大结果。typeRunRecord{// Run 落库最小字段id:string// Run 主键conversationId:string// 所属会话tenantId:string// 租户隔离字段查询必带status:// Run 生命周期状态|queued// 已入队等待 Worker|running// 模型/工具执行中|waiting_human// HITL 等待确认|succeeded// 正常结束|failed// 失败结束|cancelled// 用户或系统取消lastSequence:number// 已发出的最大事件序号断线续传/去重promptVersion:string// 本轮 Prompt 版本排障/回滚用toolsetVersion:string// 工具集版本model:string// 实际调用的模型名createdAt:string// 创建时间updatedAt:string// 最后状态变更时间}日志摘要可能很长另存成 artifact对象存储或附件表Run 里只留引用。Prompt、工具集、模型、知识库版本要能挂到 Trace 上否则线上回退时说不清「当时到底用了哪一版」。验收、排障与交付顺序层可验证的完成标准Vue UI流式增量可渲染工具步骤可折叠停止与 HITL 可操作会话服务用户消息和 Run 落库断开可查结果取消语义明确Runtime最大步数重复调用检测可中断状态可恢复Tool Runtimeschema、scope、超时、错误分类、幂等与审计RAG租户过滤引用可回原文文档更新可失效模型网关超时与 429 分类模型版本、Token 和成本可观测安全外部内容不改变权限高风险操作有独立控制点质量一条traceId可还原轨迹修改前后可跑同一 Eval发布健康检查、灰度、回滚和告警入口可用一个故障怎么定位用户反馈“我明明查生产为什么返回测试环境”按 Trace 找第一个错误点// Trace 片段意图对了但工具参数环境错了——第一错误点在填参不在库查询{traceId:tr_01,// 整次请求追踪 idintent:{// 意图分析结果type:query_logs,// 意图正确environment:production// 用户要生产},toolCalls:[// 实际发出的工具调用{name:query_logs,// 工具选对了args:{// 工具参数service:order-service,// 服务正确environment:test// 实际调成了测试 → 修 Prompt/结构化约束}}]}意图对了、工具参数错了就修选工具/填参的 Prompt 或结构化约束别先去改数据库查询。交付顺序与业务验收交付顺序没有行业标准。下面只是风险从低到高的建议不是固定周数会话落库 文本 SSE。一个只读工具 ToolMessage 错误回灌。RAG 权限过滤 引用。写工具 HITL 幂等审计。Eval 发布检查 Trace 大盘。模型降级、预算、灰度和回滚。业务侧也不能省。一次完整上线至少能说清需求澄清 → 成功指标 → 只读原型 → 写操作与 HITL → 上线 → 采用率 / 用户反馈 → 回滚与复盘成功指标先写业务结果例如「值班能在工作台查完日志并点开引用」再写模型指标。没有采用率和回滚记录只能证明系统能跑不能证明有人在用。小结这篇先钉住三件事模型提案Tool Runtime 执行。前端订事件不猜状态。写操作必须 HITL 重鉴权。文中的 OpsPilot、ID 和 Trace 都是可复现的示例。下一篇继续《Agent 意图识别从语义理解到稳定路由》。希望这篇文章对你有所帮助、有所借鉴。
延伸阅读

更多相关文章

2026/10/24 7:33:42

科莱特 SAP FICO 学员真实经历:一个普通财务人的成长复盘

前面四篇,我写了为什么转 SAP、怎么学、怎么面、怎么进项目活下来。这一篇,是这个系列的收尾。不聊操作、不聊面试技巧。我想聊聊这整件事给我的认知冲击,走到今天,脑子里真正变了什么。如果你也在犹豫要不要转、转了之后值不值、…

2026/10/24 7:33:42

Swift 常量详解:let 与 const 的正确使用方式

1. 引言在 Swift 编程语言中,常量是构建安全、可预测代码的基础。与变量不同,常量一旦赋值便不可更改,这不仅能防止意外修改,还能让代码的意图更加清晰。本文将深入讲解 Swift 常量的定义、使用场景以及最佳实践,并通过…

2026/10/24 7:33:42

坚果云收件箱的10个神用法:从收集周报到客户合同文件自动归档

文章目录一、文件收集的「三大灾难」二、收件箱的核心机制2.1 收件箱 vs 传统收集方式2.2 收件箱的创建步骤三、10个神用法逐一拆解用法一:团队周报收集用法二:学生作业提交用法三:客户合同签约用法四:供应商报价收集用法五&#…

2026/10/24 8:23:45

大模型排行榜-Arena-Agent-榜单解读

Agent 排行榜到底怎么看:2.1 亿次真实会话拆出的 5 个维度,前六名其实分不出胜负数据截至 2026 年 10 月 11 日。Agent 行为数据取自 Arena AI 公开排行榜(arena.ai/leaderboard/agent),能力分取自 Artificial Analysi…

2026/10/24 8:23:45

从 RSSI 到楼层:蓝牙信标室内定位的部署、算法与工程实践

从 RSSI 到楼层:蓝牙信标室内定位的部署、算法与工程实践 一、开篇:户外的米级,室内的盲区 卫星定位给户外人员管理立下了米级基准,但人一进楼宇、车间、地库,墙体、钢结构和顶棚层层衰减卫星信号,位置就“…

2026/10/24 8:23:45

2026算力网络选型指南:6大评估维度+12家主流服务商横向拆解

2026年做算力网络选型,难点不在服务商数量,而在把“算力能否连、业务能否稳、成本能否控”拆成可验证的条件。工信部在2025中国算力大会披露(2025年8月),截至2025年6月底,全国智能算力规模达到788 EFLOPS&a…

2026/10/24 8:18:45

MATLAB相关性分析建模:从皮尔逊到偏相关与滚动诊断

简介:本资源是一套面向数学建模初学者与MATLAB入门者的相关性分析实战教学包,聚焦变量间关联性度量这一建模关键环节,适用于课程设计、竞赛备赛及科研数据预处理场景。压缩包共11个文件(194KB),含3个Excel体…

2026/10/23 22:56:35

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/24 0:02:40

MATLAB缩进快捷键与批量格式化实战指南

1. 被自动缩进折磨的那些年如果你写过MATLAB代码,大概率经历过这种场景:从某个文档、网页或者聊天记录里复制了一段代码,粘贴进编辑器之后,每一行前面都带着莫名其妙的空格,有的行首是四个空格,有的是一个T…

2026/10/24 0:02:40

用Poco实现Qt风格信号与槽的跨平台C++方案

简介:本资源是一份面向C中级开发者的技术实践工程,聚焦于在非Qt框架环境下模拟实现Qt核心通信机制——信号与槽,借助Poco网络库的事件系统完成解耦式对象通信。适用于需在跨平台C项目中引入松耦合回调机制、但受限于无法集成Qt依赖的开发场景…

2026/10/24 0:02:40

ESXi裸机虚拟化安装指南:从硬件兼容到虚拟机部署

1. 为什么还要折腾ESXi:从一台闲置机器说起手里攒了几台淘汰下来的迷你主机,配置不算差,i5加16G内存,扔了可惜,装个桌面系统又觉得浪费。这种场景下,ESXi就成了一个绕不开的选择。它是一套裸机虚拟化平台&a…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑