ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Friend 项目 LLM 网关流式传输 Wire-Fidelity Oracle:回放 Harness 守护 OpenAI 兼容 SSE 协议

Friend 项目 LLM 网关流式传输 Wire-Fidelity Oracle:回放 Harness 守护 OpenAI 兼容 SSE 协议 Friend 项目 LLM 网关流式传输 Wire-Fidelity Oracle回放 Harness 守护 OpenAI 兼容 SSE 协议【免费下载链接】FriendAI that sees your screen, listens to your conversations and tells you what to do项目地址: https://gitcode.com/GitHub_Trending/fr/Friend本文介绍 Friend 开源仓库项目口号为AI that sees your screen, listens to your conversations and tells you what to do中 LLM 网关Omi LLM Gateway的确定性结构协议测试——Replay Harness LLM Streaming Wire-Fidelity Oracle。它通过本地回环loopback假上游以刻意分片的 HTTP chunk 注入合成 SSE 帧驱动真实的网关路由、解析器、执行器与 OpenAI 兼容流式 Provider从而以结构证据守护流式终端的线级契约。读完本文你将理解该 Oracle 的契约边界、运行方式、源码实现以及它在不触碰任何真实 Provider 的前提下如何验证流式响应的帧序、终止标记与安全拒绝策略。一、为什么需要线级保真OracleLLM 网关对外暴露 OpenAI 兼容的/v1/chat/completions流式端点当请求携带stream: true时网关需要把上游 Provider 的 SSEServer-Sent Events字节流原样转发给客户端并在过程中完成用量记账、终止状态观测与可选JIT 预算收据注入。这条链路上最容易悄悄退化的不是能否返回结果而是线级协议形态上游将 SSE 帧拆散在多个 HTTP chunk 中时增量读取是否仍然完整客户端收到的帧顺序是否仍是若干非终止数据帧 → 一个终止 usage/finish 帧 → 恰好一个[DONE]请求是否真的请求了流式与终止用量stream_options.include_usage恶意或误用请求注入upstream_url试图让网关转发到任意目标时是否在进入 Provider 路径之前就被拒绝传统的只要 200 且内容可解析的测试无法覆盖上述形态。Wire-Fidelity Oracle 的设计目标就是把上述结构性质固化为一项**确定性、可重复、咨询性advisory**的守护测试。二、Oracle 的定位与运行方式该 Oracle 位于 backend/testing/replay_harness_llm_streaming_wire_fidelity/README.md生命周期标记为permanent永久属于确定性的结构协议测试。运行入口定义在仓库根目录的 package.jsontest:replay-llm-streaming-wire-fidelity: backend/testing/replay_harness_llm_streaming_wire_fidelity/run.sh执行命令npm run test:replay-llm-streaming-wire-fidelity底层的 run.sh 会先检查backend/.venv/bin/python是否存在不存在则提示先执行make setup随后以PYTHONPATHbackend的方式运行 Oracle 模块PYTHONPATHbackend backend/.venv/bin/python -m testing.replay_harness_llm_streaming_wire_fidelity.oracleOracle 成功时向 stdout 打印一份结构化证据 JSON 并以退出码 0 结束断言失败时打印Replay LLM streaming wire-fidelity oracle failed: 异常类型并以退出码 1 结束见 oracle.py。三、工作机制回环假上游驱动真实网关全链路这是本 Oracle 最核心的设计测试只替换上游是谁绝不替换被测的网关代码。它启动一个仅监听回环地址的 OpenAI 兼容假上游ThreadingHTTPServer绑定127.0.0.1向其中注入合成的 SSE 帧而请求路径上跑的完全是生产实现FastAPI 网关应用backend/llm_gateway/main.py路由解析器resolver与执行器executorOpenAICompatibleChatCompletionProvider.stream_chat_completionbackend/llm_gateway/gateway/providers.pyStarlette 的StreamingResponse测试通过 FastAPI 的app.dependency_overrides注入两个测试专属依赖oracle.pyapp.dependency_overrides[dependencies.get_gateway_config] _streaming_enabled_gateway_config app.dependency_overrides[dependencies.get_provider_registry] lambda: registry其中_streaming_enabled_gateway_config从生产配置加载器load_gateway_config(prod_modeTrue)读取真实配置然后仅为被测 laneomi:auto:chat-structured打开streaming能力oracle.pyProvider 注册表则以假上游地址构造一个OpenAICompatibleChatCompletionProvider。生产路由、Provider 构造、重试、Schema 与部署配置全部保持不变。3.1 合成 SSE 与刻意分片假上游会通过httpx流式 POST 收到网关转发的请求并校验请求形态然后返回三段合成 SSEoracle.pydata: {choices:[{index:0,delta:{role:assistant},finish_reason:null}]} data: {choices:[{index:0,delta:{},finish_reason:stop}],usage:{prompt_tokens:0,completion_tokens:0,total_tokens:0}} data: [DONE]第一帧是非终止的角色增量帧第二帧携带finish_reason: stop与合成 usage 字段为了让网关的终止用量处理路径得以执行第三帧是[DONE]哨兵。两帧内部与帧边界处都没有任何真实用户内容。关键在传输层这三段合成 SSE 被拆成 5 个片段切点落在 SSE 字段内部和帧边界之间oracle.py并且以Transfer-Encoding: chunked逐个写出发送for fragment in _SSE_FRAGMENTS: self.wfile.write(f{len(fragment):X}\r\n.encode(ascii)) self.wfile.write(fragment) self.wfile.write(b\r\n) self.wfile.flush() self.wfile.write(b0\r\n\r\n)也就是说一个完整 SSE 帧可能被 HTTP chunk 边界从data:字段中间切开。这就要求网关侧的增量读取器Provider 的response.aiter_bytes()SSEEventDecoder具备跨 chunk 组帧的能力这正是该测试要证明的核心线级性质。四、契约ContractOracle 只证明四件事README 明确限定Oracle 只证明以下四项声明Provider 请求选择流式与终止用量上游收到的请求中stream必须为true且stream_options.include_usage必须为trueoracle.py。网关以text/event-stream响应客户端响应头的content-type必须以text/event-stream开头oracle.py。分片上游 SSE 产生非终止数据帧 → 终止 usage/finish 帧 → 恰好一个[DONE]的客户端帧序这是核心语义顺序断言见下节。入站upstream_url在 Provider 路径之前被拒绝且拒绝发生在有界本地期限内同时任何非回环 socket 出网都被禁止。4.1 客户端帧序的语义断言Oracle 使用网关自带的SSEEventDecoderbackend/llm_gateway/gateway/sse.py对客户端收到的完整响应体做增量解码只保留帧标签与 Schema 键集合然后分类oracle.pydata为[DONE]→ 标记为done携带usage对象且choices[0].finish_reason非空 → 标记为terminal_usage_finish无 usage 且finish_reason为空 → 标记为nonterminal_data其余形态如无choices的帧、无 finish reason 却带 usage 的帧、有 finish reason 却无 usage 的终止数据帧一律判定为失败。随后_assert_semantic_stream_order断言整个响应中done恰好出现一次帧数不少于 3末尾两帧依次必须是terminal_usage_finish与done其余帧必须全部是nonterminal_dataoracle.py。由此分片上游 → 网关转发 后客户端侧的帧序被严格钉死。4.2 有界期限与非回环出网拒绝整个往返round trip被限定在ROUND_TRIP_DEADLINE_SECONDS 5.0秒内完成超时即失败oracle.py。同时Oracle 用unittest.mock.patch替换socket.socket.connect任何目标主机不在{127.0.0.1, ::1}内的连接尝试都会立刻抛出OracleFailure(non-loopback socket egress was attempted)oracle.py。这保证该测试是**封闭hermetic**的即使被测代码行为异常也不会真的打到外网。4.3 重定向拒绝验证在流式往返成功后Oracle 再发一个携带upstream_url字段的请求oracle.py断言响应状态类必须是4xx网关不能接受入站上游目标错误对象的code必须是invalid_request假上游收到的请求计数仍为 1——即该请求根本没有到达 Provider 流式路径就被网关拦截。最后Oracle 校验假上游记录的事件顺序严格等于[upstream_request, upstream_fragmented_sse, gateway_stream_response, redirect_rejected]oracle.py保证网关与 Provider 的交互时序没有漂移。五、残余边界Oracle 明确不做什么README 用一节 Residual boundary 划清了职责边界避免测试被误用。它不是Provider 一致性测试provider conformance生产端点行为测试客户端兼容性测试流量捕获/回放traffic capture/replay发布门禁release gateLC3 或时序资格认证Phase 0B。它既不改变、也不替代 Listen Pusher 或 Sync Cloud Tasks 的防护测试gauntlets并且从不发起任何真实 Provider 调用。换句话说它是一台结构体检仪只回答线级协议形态是否还正确这一个问题业务正确性、延迟目标、真实 Provider 行为由其他测试体系负责。六、数据安全只保留白名单内的结构证据由于假上游会解析请求体与 SSE 信封Oracle 对数据留存做了严格限制README 与 oracle.py 均有声明保留并打印endpoint/帧标签与顺序、Schema 键集合、状态/错误类别、一个时间桶timing bucket、请求计数绝不记录或持久化prompt/completion/token 值、SSE payload 内容、请求/响应头、凭据、任何标识符、Provider 响应体。实现上有多重保障测试请求的消息内容刻意置空{role: user, content: }oracle.py合成 SSE 不含用户内容同时_bounded_evidence_logging会把llm_gateway.gateway.metrics与httpx两个 logger 临时提升到CRITICAL把执行期日志输出收敛在结构证据白名单内oracle.py假上游的BaseHTTPRequestHandler.log_message也被覆写为空操作避免打印请求细节oracle.py。Oracle 成功时输出的证据 JSON 字段包括oracle、endpoint_path、event_order、frame_order、provider_request_schema_keys、client_frame_schema_key_sets、status_classes、error_classes、provider_request_count、bounded_round_triporacle.py。七、被测流式路径如何与之配合源码印证Oracle 断言的性质恰好对应网关流式实现中的几处关键代码两者互为印证Provider 请求注入终止用量网关在 backend/llm_gateway/routers/openai_compatible.py 的_request_stream_usage中对openai、openrouter、perplexity三类 Provider 自动补写stream_options.include_usage True——这正是契约第 1 条在上游侧看到include_usage的来源。增量读取保留分片OpenAICompatibleChatCompletionProvider.stream_chat_completion使用httpx.AsyncClient.stream(...).aiter_bytes()逐块产出字节providers.py因此上游 HTTP chunk 的刻意分片会原样进入网关的增量解码器。SSE 增量解码SSEEventDecoder.feed()维护跨 chunk 的字节缓冲统一\r\n/\r/\n换行并只在出现\n\n时切出一个完整帧缓冲区上限为 1 MiBbackend/llm_gateway/gateway/sse.py。Oracle 正是复用该解码器来分类客户端帧。流式响应与终止观测网关在 openai_compatible.py 通过_streaming_response返回StreamingResponse(media_typetext/event-stream)并在_stream_with_terminal_metrics中观测[DONE]触发终止记账observe_terminal把eof_before_terminal_marker、invalid_sse_frame、transport_midstream等异常分类为终止错误——这些语义正是契约第 3 条恰好一个[DONE]背后的运行时逻辑。值得注意的实现细节网关用原子分组正则(?\r\n|\r|\n){2}作为 JIT 收据注入的帧边界openai_compatible.py避免回溯把多行 SSE 事件拆散。错误响应的 OpenAI 分类重定向/非法请求被GatewayInvalidRequestError抛出后_error_response会组装{message, type, param, code}结构其中code取GatewayErrorCode.INVALID_REQUEST的字符串值openai_compatible.py对应 Oracle 断言的invalid_request错误类别状态码映射到4004xx 类。八、如何阅读运行结果运行npm run test:replay-llm-streaming-wire-fidelity后成功stdout 输出一行排序后的证据 JSON如{oracle: replay-llm-streaming-wire-fidelity, event_order: [upstream_request, upstream_fragmented_sse, gateway_stream_response, redirect_rejected], frame_order: [nonterminal_data, terminal_usage_finish, done], status_classes: [2xx, 4xx], ...}退出码 0。失败stdout 打印Replay LLM streaming wire-fidelity oracle failed: 异常类型名退出码 1失败类型对应源码中的各类OracleFailure如gateway did not emit exactly one done marker、gateway accepted an inbound upstream target、non-loopback socket egress was attempted等可直接定位协议形态漂移的位置。由于测试是确定性的合成帧固定、回环环境固定同一份代码每次运行结果应当完全一致因此它适合作为 CI 的常规守护项也适合在改动 resolver、executor、SSE 解码、流式 Provider 或路由鉴权代码后本地先行验证。九、总结Friend 仓库的 Replay Harness LLM Streaming Wire-Fidelity Oracle 是一个设计克制、边界清晰的协议守护测试用回环假上游 合成分片 SSE 驱动真实网关全链路只断言流式请求形态、text/event-stream响应、客户端帧序、upstream_url拒绝、非回环出网禁止这组线级性质同时通过白名单证据输出与空内容请求把数据安全做到极致。它以永久生命周期常驻在 backend/testing/replay_harness_llm_streaming_wire_fidelity/ 下与 backend/llm_gateway 的流式实现构成一对可互相印证的契约 实现是研究 OpenAI 兼容流式网关如何被系统化验证的很好范本。【免费下载链接】FriendAI that sees your screen, listens to your conversations and tells you what to do项目地址: https://gitcode.com/GitHub_Trending/fr/Friend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表