From bd383aab5c6f76c66e299cf9cdf20cac55491f1c Mon Sep 17 00:00:00 2001 From: Dimitri Kennedy Date: Wed, 25 Sep 2024 22:33:06 -0400 Subject: [PATCH] use partial json and new json delta block --- bun.lockb | Bin 663616 -> 649224 bytes .../src/providers/anthropic/index.ts | 119 +++++++++--------- .../llm-client/tests/anthropic.test.ts | 48 ++----- 3 files changed, 73 insertions(+), 94 deletions(-) diff --git a/bun.lockb b/bun.lockb index e60034b599e2e4092ee5d3bf86a3c266f0dfa619..36dc6ebce7593fae5c6384fced3e23ca6bc227dc 100755 GIT binary patch delta 58923 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 delta 68283 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 { let finalChatCompletion: ExtendedCompletionChunkAnthropic | null = null - for await (const data of response) { - switch (data.type) { + for await (const event of response) { + switch (event.type) { case "message_start": - this.log("debug", "Message start:", data) - finalChatCompletion = (await this.transformResponse(data.message, { - stream: true - })) as ExtendedCompletionChunkAnthropic + this.log("debug", "Message start:", event) + finalChatCompletion = { + id: event.message.id, + object: "chat.completion.chunk", + created: Date.now(), + model: event.message.model, + choices: [ + { + index: 0, + delta: { role: "assistant" }, + finish_reason: null + } + ], + usage: { + prompt_tokens: event.message.usage.input_tokens, + completion_tokens: 0, + total_tokens: event.message.usage.input_tokens + }, + originResponse: event.message + } yield finalChatCompletion - continue + break + + case "content_block_start": + this.log("debug", "Content block start:", event) + break case "content_block_delta": - if (data.delta && data.delta.type === "text_delta" && data.delta?.text) { - if (finalChatCompletion && finalChatCompletion.choices) { - if (data.delta.text) { - finalChatCompletion.choices[0].delta = { - content: data.delta.text, - role: "assistant" - } + if (finalChatCompletion && finalChatCompletion.choices) { + if (event.delta.type === "text_delta") { + finalChatCompletion.choices[0].delta = { + content: event.delta.text, + role: "assistant" } - } - - yield finalChatCompletion as ExtendedCompletionChunkAnthropic - } - - if (data.delta && data.delta.type === "input_json_delta") { - if (finalChatCompletion && finalChatCompletion.choices) { - if (data.delta.partial_json) { - finalChatCompletion.choices[0].delta = { - content: - (finalChatCompletion.choices?.[0]?.delta?.content ?? "") + - data.delta.partial_json, - role: "assistant" - } + } else if (event.delta.type === "input_json_delta") { + finalChatCompletion.choices[0].delta = { + content: event.delta.partial_json, + role: "assistant" } } - } - - continue - case "content_block_stop": - this.log("debug", "Content block stop:", data) - - if (finalChatCompletion && finalChatCompletion.choices) { - finalChatCompletion.choices[0].finish_reason = "stop" + yield finalChatCompletion } + break - yield finalChatCompletion as ExtendedCompletionChunkAnthropic - continue + case "content_block_stop": + this.log("debug", "Content block stop:", event) + break case "message_delta": - if (finalChatCompletion && finalChatCompletion?.usage) { - finalChatCompletion.usage.completion_tokens = data?.usage?.output_tokens + if (finalChatCompletion && finalChatCompletion.usage) { + finalChatCompletion.usage.completion_tokens = event.usage?.output_tokens || 0 finalChatCompletion.usage.total_tokens = - finalChatCompletion.usage.prompt_tokens + data?.usage?.output_tokens + finalChatCompletion.usage.prompt_tokens + finalChatCompletion.usage.completion_tokens } - - continue + break case "message_stop": - this.log("debug", "Message stop:", data) + this.log("debug", "Message stop:", event) + if (finalChatCompletion && finalChatCompletion.choices) { + finalChatCompletion.choices[0].finish_reason = "stop" + finalChatCompletion.choices[0].delta = { + content: null, + role: "assistant" + } + yield finalChatCompletion + } + break + + default: + this.log("warn", "Unknown event type:", event) } } } - /** * Creates a chat completion using the Anthropic API. * @param params - The chat completion parameters. diff --git a/public-packages/llm-client/tests/anthropic.test.ts b/public-packages/llm-client/tests/anthropic.test.ts index 70cdfba..ef515a7 100644 --- a/public-packages/llm-client/tests/anthropic.test.ts +++ b/public-packages/llm-client/tests/anthropic.test.ts @@ -3,13 +3,12 @@ import { omit } from "@/lib" import Anthropic from "@anthropic-ai/sdk" import { describe, expect, test } from "bun:test" -for await (const model of ["claude-3-opus-20240229", "claude-3-sonnet-20240229"] as const) { +for await (const model of ["claude-3-5-sonnet-20240620", "claude-3-opus-20240229"] as const) { await createTestCase(model) } const anthropicClient = createLLMClient({ - provider: "anthropic", - logLevel: "error" + provider: "anthropic" }) async function createTestCase(model: Anthropic.CompletionCreateParams["model"]) { @@ -105,12 +104,13 @@ async function createTestCase(model: Anthropic.CompletionCreateParams["model"]) final += message.choices?.[0].delta?.content ?? "" } - console.log(final) + expect(final).toBe(`{\"name\": \"Dimitri Kennedy\"}`) }) - test("Function Calling complex schema", async () => { + test("Function Calling STREAM - complex schema", async () => { const completion = await anthropicClient.chat.completions.create({ model, + stream: true, max_tokens: 1000, messages: [ { @@ -209,36 +209,14 @@ async function createTestCase(model: Anthropic.CompletionCreateParams["model"]) ] }) - //@ts-expect-error fails because its optionally undefiened, which is fine - if we fail we fail - expect(omit(["id"], completion?.choices?.[0]?.message.tool_calls?.[0])).toEqual({ - type: "function", - function: { - name: "process_user_data", - arguments: JSON.stringify({ - userDetails: { - firstName: "John", - lastName: "Doe", - contactDetails: { - email: "john.doe@example.com", - phoneNumber: "555-1234" - } - }, - jobHistory: [ - { - companyName: "Acme Corp", - role: "Software Engineer", - years: 5 - }, - { - companyName: "Globex Inc.", - role: "Lead Developer", - years: 3 - } - ], - skills: ["Programming", "Leadership", "Communication"] - }) - } - }) + let final = "" + for await (const message of completion) { + final += message.choices?.[0].delta?.content ?? "" + } + + expect(final).toBe( + `{\"userDetails\": {\"firstName\": \"John\", \"lastName\": \"Doe\", \"contactDetails\": {\"email\": \"john.doe@example.com\", \"phoneNumber\": \"555-1234\"}}, \"jobHistory\": [{\"companyName\": \"Acme Corp\", \"role\": \"Software Engineer\", \"years\": 5}, {\"companyName\": \"Globex Inc.\", \"role\": \"Lead Developer\", \"years\": 3}], \"skills\": [\"Programming\", \"Leadership\", \"Communication\"]}` + ) }) test("Standard stream", async () => {