diff --git a/src/adapters/openai_adapter.py b/src/adapters/openai_adapter.py index d2e0a50..7229fac 100644 --- a/src/adapters/openai_adapter.py +++ b/src/adapters/openai_adapter.py @@ -109,7 +109,13 @@ class OpenAIAdapter(ModelAdapter): # Finish if choice.finish_reason: - if choice.finish_reason == "tool_calls": + # IMPORTANTE: DeepSeek (endpoint OpenAI) a veces cierra el stream + # con finish_reason="stop" AUNQUE haya emitido tool_calls. Si nos + # fiamos solo de =="tool_calls" perdemos esos tool calls: el agente + # anuncia la accion en texto y "se para" sin ejecutarla. Por eso + # disparamos los tool_use SIEMPRE que haya tool calls acumulados, + # sea cual sea el finish_reason. + if tool_calls_acc: for acc in tool_calls_acc.values(): yield StreamChunk( tool_call_id=acc["id"], @@ -123,7 +129,7 @@ class OpenAIAdapter(ModelAdapter): else: yield StreamChunk( finish_reason="end_turn" - if choice.finish_reason == "stop" + if choice.finish_reason in ("stop", "tool_calls") else choice.finish_reason, usage=final_usage, )