Skip to content

Commit 5e69687

Browse files
feat: update StreamToolCallChecker (#1291)
1 parent bb34ed3 commit 5e69687

File tree

1 file changed

+20
-11
lines changed

1 file changed

+20
-11
lines changed

content/zh/docs/eino/core_modules/flow_integration_components/react_agent_manual.md

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -251,26 +251,35 @@ a, err = NewAgent(ctx, &AgentConfig{
251251

252252
不同的模型在流式模式下输出工具调用的方式可能不同: 某些模型(如 OpenAI) 会直接输出工具调用;某些模型 (如 Claude) 会先输出文本,然后再输出工具调用。因此需要使用不同的方法来判断,这个字段用来指定判断模型流式输出中是否包含工具调用的函数。
253253

254-
可选填写,未填写时使用首包是否包含工具调用判断
254+
可选填写,未填写时使用“非空包”是否包含工具调用判断
255255

256256
```go
257-
func firstChunkStreamToolCallChecker(___ context.Context, _sr_ *schema.StreamReader[*schema.Message]) (bool, error) {
257+
func firstChunkStreamToolCallChecker(_ context.Context, sr *schema.StreamReader[*schema.Message]) (bool, error) {
258258
defer sr.Close()
259259

260-
msg, err := sr.Recv()
261-
if err != nil {
262-
return false, err
263-
}
260+
for {
261+
msg, err := sr.Recv()
262+
if err == io.EOF {
263+
return false, nil
264+
}
265+
if err != nil {
266+
return false, err
267+
}
264268

265-
if len(msg.ToolCalls) == 0 {
266-
return false, nil
267-
}
269+
if len(msg.ToolCalls) > 0 {
270+
return true, nil
271+
}
268272

269-
return true, nil
273+
if len(msg.Content) == 0 { // skip empty chunks at the front
274+
continue
275+
}
276+
277+
return false, nil
278+
}
270279
}
271280
```
272281

273-
部分模型流式输出工具调用时会先输出一段文本(比如 Claude),这会导致默认 StreamToolCallChecker 错误判断没有工具调用而直接返回,使用这类模型时必须自行实现正确的 StreamToolCallChecker。
282+
部分模型流式输出工具调用时会先输出一段文本(比如Claude,以及部分豆包模型),这会导致默认 StreamToolCallChecker 错误判断没有工具调用而直接返回,使用这类模型时可自行实现正确的StreamToolCallChecker,极端情况下可能需要判断所有包是否包含 ToolCall,从而导致“流式判断”的效果丢失。解决这一问题的建议是:
274283

275284
> 💡
276285
> 对于流式输出工具调用时会先输出一段文本的模型,可以尝试添加 prompt 来约束模型在工具调用时不额外输出文本,从而解决这一问题,例如:“如果需要调用 tool,直接输出 tool,不要输出文本”。

0 commit comments

Comments
 (0)