Timothy Jaeryang Baek 1 month ago
parent
commit
af2c5f3a18

+ 6 - 5
backend/open_webui/utils/middleware.py

@@ -1206,16 +1206,17 @@ async def process_chat_response(
                                         break
 
                                 if tool_result:
-                                    tool_calls_display_content = f'{tool_calls_display_content}\n<details type="tool_calls" done="true" name="{tool_name}" arguments="{html.escape(json.dumps(tool_arguments))}" result="{html.escape(json.dumps(tool_result))}">\n<summary>Tool Executed</summary>\n</details>'
+                                    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))}">\n<summary>Tool Executed</summary>\n</details>'
                                 else:
-                                    tool_calls_display_content = f'{tool_calls_display_content}\n<details type="tool_calls" done="false" 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>'
 
                             if not raw:
-                                content = f"{content}\n{tool_calls_display_content}\n"
+                                content = f"{content}\n{tool_calls_display_content}\n\n"
                         else:
                             tool_calls_display_content = ""
 
                             for tool_call in tool_calls:
+                                tool_call_id = tool_call.get("id", "")
                                 tool_name = tool_call.get("function", {}).get(
                                     "name", ""
                                 )
@@ -1223,10 +1224,10 @@ async def process_chat_response(
                                     "arguments", ""
                                 )
 
-                                tool_calls_display_content = f'{tool_calls_display_content}\n<details type="tool_calls" done="false" 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>'
 
                             if not raw:
-                                content = f"{content}\n{tool_calls_display_content}\n"
+                                content = f"{content}\n{tool_calls_display_content}\n\n"
 
                     elif block["type"] == "reasoning":
                         reasoning_display_content = "\n".join(

+ 4 - 0
src/lib/components/common/Collapsible.svelte

@@ -102,12 +102,14 @@
 					{:else if attributes?.type === 'tool_calls'}
 						{#if attributes?.done === 'true'}
 							<Markdown
+								id={`tool-calls-${attributes?.id}`}
 								content={$i18n.t('View Result from `{{NAME}}`', {
 									NAME: attributes.name
 								})}
 							/>
 						{:else}
 							<Markdown
+								id={`tool-calls-${attributes?.id}`}
 								content={$i18n.t('Executing `{{NAME}}`...', {
 									NAME: attributes.name
 								})}
@@ -163,6 +165,7 @@
 				{#if attributes?.type === 'tool_calls'}
 					{#if attributes?.done === 'true'}
 						<Markdown
+							id={`tool-calls-${attributes?.id}-result`}
 							content={`> \`\`\`json
 > ${JSON.parse(decode(attributes?.arguments))}
 > ${JSON.parse(decode(attributes?.result))}
@@ -170,6 +173,7 @@
 						/>
 					{:else}
 						<Markdown
+							id={`tool-calls-${attributes?.id}-result`}
 							content={`> \`\`\`json
 > ${JSON.parse(decode(attributes?.arguments))}
 > \`\`\``}