ling-baseling-base

Streaming

SSE 流式输出

在线 Playground

在浏览器中直接体验本页相关 API,无需本地安装 Go 环境。

Streaming (SSE)

relay 的流式 API 基于 Go channel,不是 Read() 迭代器。ChatStream 返回 *ChatStreamResult,通过 result.Ch 接收 ChatStreamChunk

基本流式

result, err := client.ChatStream(ctx, &relay.ChatRequest{
    Model: "gpt-4o",
    Messages: []relay.Message{
        {Role: "user", Content: "Write a haiku about coding."},
    },
})
if err != nil {
    log.Fatal(err)
}

for chunk := range result.Ch {
    if chunk.Err != nil {
        log.Fatal(chunk.Err)
    }
    fmt.Print(chunk.Delta)
}
fmt.Println("\nusage:", result.Usage)

Chunk 字段说明

字段说明
Delta文本增量
Reasoning推理模型思考内容增量
ToolCalls工具调用增量(OpenAI streaming 格式)
FinishReasonstop / tool_calls / length
Done是否为最后一个 chunk
Usage部分 provider 在最终 chunk 上报用量
Err流内错误

Context 取消

ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()

result, err := client.ChatStream(ctx, req)
if err != nil {
    log.Fatal(err)
}

for chunk := range result.Ch {
    if chunk.Err != nil {
        if errors.Is(chunk.Err, context.Canceled) {
            log.Println("stream cancelled")
            break
        }
        log.Fatal(chunk.Err)
    }
    fmt.Print(chunk.Delta)
}

ctx 超时或取消时,channel 会关闭,上游 HTTP/WebSocket 连接随之断开。

工具调用流式

流式响应中通过 chunk.ToolCalls 聚合工具调用参数,当 chunk.FinishReason == "tool_calls" 时执行工具并发起下一轮请求。

WebSocket 流式(Xunfei)

Xunfei 使用 WebSocket,relay 已封装为同样的 channel 接口:

import "github.com/LingByte/ling-base/relay/channel/xunfei"

provider := xunfei.NewProvider(appid, apiKey, apiSecret)
client := relay.New(relay.WithProvider(provider))

result, err := client.ChatStream(ctx, &relay.ChatRequest{
    Model:    "generalv3.5",
    Messages: []relay.Message{{Role: "user", Content: "你好"}},
})
for chunk := range result.Ch {
    fmt.Print(chunk.Delta)
}

On this page