mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-05-22 09:32:33 +00:00
fix(provider): deduplicate streaming tool_call_ids for parallel calls
This commit is contained in:
parent
886e7e43d5
commit
77ec55bf8e
@ -1097,6 +1097,15 @@ class OpenAICompatProvider(LLMProvider):
|
|||||||
if delta:
|
if delta:
|
||||||
_accum_legacy_function_call(getattr(delta, "function_call", None))
|
_accum_legacy_function_call(getattr(delta, "function_call", None))
|
||||||
|
|
||||||
|
# Some providers (e.g. Zhipu/GLM) reuse the same tool_call id for
|
||||||
|
# parallel tool calls in streaming mode. Deduplicate before building
|
||||||
|
# the response so downstream tool messages don't collide.
|
||||||
|
_seen_tc_ids: set[str] = set()
|
||||||
|
for b in tc_bufs.values():
|
||||||
|
if not b["id"] or b["id"] in _seen_tc_ids:
|
||||||
|
b["id"] = _short_tool_id()
|
||||||
|
_seen_tc_ids.add(b["id"])
|
||||||
|
|
||||||
return LLMResponse(
|
return LLMResponse(
|
||||||
content="".join(content_parts) or None,
|
content="".join(content_parts) or None,
|
||||||
tool_calls=[
|
tool_calls=[
|
||||||
|
|||||||
@ -367,12 +367,14 @@ class StreamingFileEditTracker:
|
|||||||
|
|
||||||
def apply_final_call_ids(self, final_tool_calls: list[Any]) -> None:
|
def apply_final_call_ids(self, final_tool_calls: list[Any]) -> None:
|
||||||
"""Keep final start/end events keyed to any earlier streamed placeholder."""
|
"""Keep final start/end events keyed to any earlier streamed placeholder."""
|
||||||
|
used_canonicals: set[str] = set()
|
||||||
for tool_call in final_tool_calls:
|
for tool_call in final_tool_calls:
|
||||||
canonical = self.canonical_call_id_for(tool_call)
|
canonical = self.canonical_call_id_for(tool_call)
|
||||||
if canonical:
|
if canonical and canonical not in used_canonicals:
|
||||||
try:
|
try:
|
||||||
tool_call.id = canonical
|
tool_call.id = canonical
|
||||||
except Exception:
|
used_canonicals.add(canonical)
|
||||||
|
except (AttributeError, TypeError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def canonical_call_id_for(self, tool_call: Any) -> str | None:
|
def canonical_call_id_for(self, tool_call: Any) -> str | None:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user