Group tool calls in the result
| @@ -158,7 +158,7 @@ class ToolDefinition { | ||
| 158 | 158 | description: this.#description, |
| 159 | 159 | parameters: this.#parameters, |
| 160 | 160 | }, |
| 161 | 161 | toString: function () { |
| 162 | 162 | return `<div><b>${this.function.name}</b></div><div><small>${this.function.description}</small></div><pre class="justifyLeft wordBreakAll"><code class="flex padding5">${JSON.stringify(this.function.parameters, null, 2)}</code></pre><hr>`; |
| 163 | 163 | }, |
| 164 | 164 | }; |
| @@ -581,6 +581,19 @@ export class ToolManager { | ||
| 581 | 581 | } |
| 582 | 582 | |
| 583 | 583 | /** |
| 584 | + * Groups tool names by count. | |
| 585 | + * @param {string[]} toolNames Tool names | |
| 586 | + * @returns {string} Grouped tool names | |
| 587 | + */ | |
| 588 | + static #groupToolNames(toolNames) { | |
| 589 | + const toolCounts = toolNames.reduce((acc, name) => { | |
| 590 | + acc[name] = (acc[name] || 0) + 1; | |
| 591 | + return acc; | |
| 592 | + }, {}); | |
| 593 | + return Object.entries(toolCounts).map(([name, count]) => count > 1 ? `${name} (${count})` : name).join(', '); | |
| 594 | + } | |
| 595 | + | |
| 596 | + /** | |
| 584 | 597 | * Formats a message with tool invocations. |
| 585 | 598 | * @param {ToolInvocation[]} invocations Tool invocations. |
| 586 | 599 | * @returns {string} Formatted message with tool invocations. |
| @@ -597,8 +610,8 @@ export class ToolManager { | ||
| 597 | 610 | i.result = tryParse(i.result); |
| 598 | 611 | }); |
| 599 | 612 | codeElement.textContent = JSON.stringify(data, null, 2); |
| 600 | 613 | const toolNames = data.map(i => i.displayName || i.name).join(', '); |
| 601 | 614 | summaryElement.textContent = `Tool calls: ${this.#groupToolNames(toolNames)}`; |
| 602 | 615 | preElement.append(codeElement); |
| 603 | 616 | detailsElement.append(summaryElement, preElement); |
| 604 | 617 | return detailsElement.outerHTML; |