diff --git a/javascript/package.json b/javascript/package.json index 341d052..ee4bd2d 100644 --- a/javascript/package.json +++ b/javascript/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "@firefliesai/llm-sdk", - "version": "0.1.5", + "version": "0.1.6", "description": "A unified LLM SDK", "scripts": { "generate": "npx @hey-api/openapi-ts", diff --git a/javascript/src/utils/stream.utils.ts b/javascript/src/utils/stream.utils.ts index e2b78a5..e5ed0f1 100644 --- a/javascript/src/utils/stream.utils.ts +++ b/javascript/src/utils/stream.utils.ts @@ -164,10 +164,7 @@ export function guessDeltaIndex( } else { // we won't be able to reliably match tool calls // because there can be multiple tool calls with the same tool name - return ( - contentDelta.part.type === "tool-call" && - part.toolName === contentDelta.part.toolName - ); + return false; } }); } diff --git a/javascript/test/test-language-model.ts b/javascript/test/test-language-model.ts index 8f20c22..33d7a66 100644 --- a/javascript/test/test-language-model.ts +++ b/javascript/test/test-language-model.ts @@ -384,7 +384,7 @@ export function testLanguageModel(languageModel: LanguageModel) { content: [ { type: "text", - text: "Register a user. You must always fill in random details for all fields. Do not ask for real information.", + text: 'Hi, create a user with the id "a1b2c3", name "John Doe", email "john.doe@example.com", birthDate "1990-05-15", age 34, isActive true, role "user", accountBalance 500.75, phoneNumber "+1234567890123", tags ["developer", "gamer"], and lastLogin "2024-11-09T10:30:00Z".', }, ], }, @@ -518,6 +518,50 @@ export function testParallelToolCalls(languageModel: LanguageModel) { true, ); }); + + test("stream parallel tool calls of same name", async (t) => { + const response = languageModel.stream({ + messages: [ + { + role: "user", + content: [ + { + type: "text", + text: "Get me the weather in Boston and the weather in New York.", + }, + ], + }, + ], + tools, + }); + + let current = await response.next(); + while (!current.done) { + log(current.value); + current = await response.next(); + } + + log(current.value); + + const toolCallParts = current.value.content.filter( + (part) => part.type === "tool-call", + ); + + t.assert.equal(toolCallParts.length, 2); + const weatherCall1 = toolCallParts.find( + (part) => + part.toolName === "get_weather" && + (part.args?.["location"] as string).includes("Boston"), + ); + const weatherCall2 = toolCallParts.find( + (part) => + part.toolName === "get_weather" && + (part.args?.["location"] as string).includes("New York"), + ); + + t.assert.equal(!!weatherCall1, true); + t.assert.equal(!!weatherCall2, true); + }); } export function log(value: ModelResponse | PartialModelResponse) { diff --git a/package-lock.json b/package-lock.json index 3535c18..3297355 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ }, "javascript": { "name": "@firefliesai/llm-sdk", - "version": "0.1.5", + "version": "0.1.6", "license": "MIT" }, "node_modules/@anthropic-ai/sdk": {