This commit is contained in:
Timothy Jaeryang Baek 2025-08-06 15:02:39 +04:00
parent 4cc2c1915e
commit f2cae3d0a7

View file

@ -1403,13 +1403,18 @@ async def process_chat_response(
for block in content_blocks: for block in content_blocks:
if block["type"] == "text": if block["type"] == "text":
content = f"{content}{block['content'].strip()}\n" block_content = block["content"].strip()
if block_content:
content = f"{content}{block_content}\n"
elif block["type"] == "tool_calls": elif block["type"] == "tool_calls":
attributes = block.get("attributes", {}) attributes = block.get("attributes", {})
tool_calls = block.get("content", []) tool_calls = block.get("content", [])
results = block.get("results", []) results = block.get("results", [])
if content and not content.endswith("\n"):
content += "\n"
if results: if results:
tool_calls_display_content = "" tool_calls_display_content = ""
@ -1432,12 +1437,12 @@ async def process_chat_response(
break break
if tool_result: if tool_result:
tool_calls_display_content = f'{tool_calls_display_content}\n<details type="tool_calls" done="true" id="{tool_call_id}" name="{tool_name}" arguments="{html.escape(json.dumps(tool_arguments))}" result="{html.escape(json.dumps(tool_result, ensure_ascii=False))}" files="{html.escape(json.dumps(tool_result_files)) if tool_result_files else ""}">\n<summary>Tool Executed</summary>\n</details>\n' tool_calls_display_content = f'{tool_calls_display_content}<details type="tool_calls" done="true" id="{tool_call_id}" name="{tool_name}" arguments="{html.escape(json.dumps(tool_arguments))}" result="{html.escape(json.dumps(tool_result, ensure_ascii=False))}" files="{html.escape(json.dumps(tool_result_files)) if tool_result_files else ""}">\n<summary>Tool Executed</summary>\n</details>\n'
else: else:
tool_calls_display_content = f'{tool_calls_display_content}\n<details type="tool_calls" done="false" id="{tool_call_id}" name="{tool_name}" arguments="{html.escape(json.dumps(tool_arguments))}">\n<summary>Executing...</summary>\n</details>' tool_calls_display_content = f'{tool_calls_display_content}<details type="tool_calls" done="false" id="{tool_call_id}" name="{tool_name}" arguments="{html.escape(json.dumps(tool_arguments))}">\n<summary>Executing...</summary>\n</details>\n'
if not raw: if not raw:
content = f"{content}\n{tool_calls_display_content}\n\n" content = f"{content}{tool_calls_display_content}"
else: else:
tool_calls_display_content = "" tool_calls_display_content = ""
@ -1450,10 +1455,10 @@ async def process_chat_response(
"arguments", "" "arguments", ""
) )
tool_calls_display_content = f'{tool_calls_display_content}\n<details type="tool_calls" done="false" id="{tool_call_id}" name="{tool_name}" arguments="{html.escape(json.dumps(tool_arguments))}">\n<summary>Executing...</summary>\n</details>' tool_calls_display_content = f'{tool_calls_display_content}\n<details type="tool_calls" done="false" id="{tool_call_id}" name="{tool_name}" arguments="{html.escape(json.dumps(tool_arguments))}">\n<summary>Executing...</summary>\n</details>\n'
if not raw: if not raw:
content = f"{content}\n{tool_calls_display_content}\n\n" content = f"{content}{tool_calls_display_content}"
elif block["type"] == "reasoning": elif block["type"] == "reasoning":
reasoning_display_content = "\n".join( reasoning_display_content = "\n".join(
@ -1466,16 +1471,23 @@ async def process_chat_response(
start_tag = block.get("start_tag", "") start_tag = block.get("start_tag", "")
end_tag = block.get("end_tag", "") end_tag = block.get("end_tag", "")
if content and not content.endswith("\n"):
content += "\n"
if reasoning_duration is not None: if reasoning_duration is not None:
if raw: if raw:
content = f'{content}\n{start_tag}{block["content"]}{end_tag}\n' content = (
f'{content}{start_tag}{block["content"]}{end_tag}\n'
)
else: else:
content = f'{content}\n<details type="reasoning" done="true" duration="{reasoning_duration}">\n<summary>Thought for {reasoning_duration} seconds</summary>\n{reasoning_display_content}\n</details>\n' content = f'{content}<details type="reasoning" done="true" duration="{reasoning_duration}">\n<summary>Thought for {reasoning_duration} seconds</summary>\n{reasoning_display_content}\n</details>\n'
else: else:
if raw: if raw:
content = f'{content}\n{start_tag}{block["content"]}{end_tag}\n' content = (
f'{content}{start_tag}{block["content"]}{end_tag}\n'
)
else: else:
content = f'{content}\n<details type="reasoning" done="false">\n<summary>Thinking…</summary>\n{reasoning_display_content}\n</details>\n' content = f'{content}<details type="reasoning" done="false">\n<summary>Thinking…</summary>\n{reasoning_display_content}\n</details>\n'
elif block["type"] == "code_interpreter": elif block["type"] == "code_interpreter":
attributes = block.get("attributes", {}) attributes = block.get("attributes", {})
@ -1495,21 +1507,25 @@ async def process_chat_response(
# Keep content as is - either closing backticks or no backticks # Keep content as is - either closing backticks or no backticks
content = content_stripped + original_whitespace content = content_stripped + original_whitespace
if content and not content.endswith("\n"):
content += "\n"
if output: if output:
output = html.escape(json.dumps(output)) output = html.escape(json.dumps(output))
if raw: if raw:
content = f'{content}\n<code_interpreter type="code" lang="{lang}">\n{block["content"]}\n</code_interpreter>\n```output\n{output}\n```\n' content = f'{content}<code_interpreter type="code" lang="{lang}">\n{block["content"]}\n</code_interpreter>\n```output\n{output}\n```\n'
else: else:
content = f'{content}\n<details type="code_interpreter" done="true" output="{output}">\n<summary>Analyzed</summary>\n```{lang}\n{block["content"]}\n```\n</details>\n' content = f'{content}<details type="code_interpreter" done="true" output="{output}">\n<summary>Analyzed</summary>\n```{lang}\n{block["content"]}\n```\n</details>\n'
else: else:
if raw: if raw:
content = f'{content}\n<code_interpreter type="code" lang="{lang}">\n{block["content"]}\n</code_interpreter>\n' content = f'{content}<code_interpreter type="code" lang="{lang}">\n{block["content"]}\n</code_interpreter>\n'
else: else:
content = f'{content}\n<details type="code_interpreter" done="false">\n<summary>Analyzing...</summary>\n```{lang}\n{block["content"]}\n```\n</details>\n' content = f'{content}<details type="code_interpreter" done="false">\n<summary>Analyzing...</summary>\n```{lang}\n{block["content"]}\n```\n</details>\n'
else: else:
block_content = str(block["content"]).strip() block_content = str(block["content"]).strip()
if block_content:
content = f"{content}{block['type']}: {block_content}\n" content = f"{content}{block['type']}: {block_content}\n"
return content.strip() return content.strip()