package main import ( "context" "git.yeij.top/AskaEth/Cyrene_v2/internal/runtime/model" ) // streamSubject 是循环的 OnStream 闭包发布每个结构化流事件所用的 bus subject。 // gateway hub 订阅 ws.>,并为该 subject 保留一条专用分支,把 model.StreamEvent // 映射为带 seq 序号的下游强类型 WS 事件(message.*/thinking.*/tool_call.*)。 // // 它必须与 internal/services/gateway/ws_hub.go 中的 wsStreamSubject 保持一致; // 两个包若共用同一个 const,会把 gateway 拉进主二进制的导入图,因此该字面量 // 在此重复一份并加以说明。 const streamSubject = "ws.stream" // streamChunk 是循环的 OnStream 回调。它把一个结构化流事件发布到 gateway 的流式 // subject,由 hub 以对应的强类型 WS 事件广播给每个客户端。未接 bus 时它为空操作, // 且绝不阻塞循环:bus.Publish 是异步的,单个订阅缓冲写满时丢弃事件而不是让模型 // 流停摆。 func (a *app) streamChunk(ev model.StreamEvent) { if a.bus == nil { return } if err := a.bus.Publish(context.Background(), streamSubject, ev); err != nil { a.log.Warn("stream event publish", "err", err) } }