Commit 97e7711

benny-dou <60535774+benny-dou@users.noreply.github.com>
2026-04-16 10:22:40
chore(ai): update openai response parsing logic
1 parent 7df641b
Changed files (1)
src
src/ai/texts/openai_response.py
@@ -4,7 +4,7 @@ import contextlib
 import hashlib
 from typing import Literal
 
-from glom import Coalesce, glom
+from glom import Coalesce, flatten, glom
 from loguru import logger
 from openai import AsyncOpenAI, DefaultAsyncHttpxClient
 from pyrogram.client import Client
@@ -240,17 +240,15 @@ async def single_api_response(
                         sent_messages.append(status_msg)
                         status_mid = status_msg.id
 
-            if response_type == "response.reasoning_summary_text.done":
-                thoughts = resp.get("text", thoughts)
-            elif response_type == "response.output_text.done":
-                answers = resp.get("text", answers)
-            elif response_type == "response.content_part.done":
-                tool_calls = glom(resp, "part.annotations", default=[]) or []
-            elif response_type in {"response.created", "response.in_progress", "response.completed"}:
-                response_id = glom(resp, "response.id", default="")
-
             if response_type == "response.completed":
                 full_response = resp
+                response_id = glom(resp, "response.id", default="")
+                tool_calls = flatten(glom(resp, "response.output.**.annotations", default=[]))
+                thoughts = flatten(glom(resp, "response.output.*.summary.*.text", default=[])) or thoughts
+                thoughts = "".join(thoughts)
+                answers = flatten(glom(resp, "response.output.*.content.*.text", default=[])) or answers
+                answers = "".join(answers)
+
         # all chunks are processed
         if not answers.strip() and not thoughts.strip():  # empty response
             return await single_api_response(