From 52f2a7158d55285dc1b7a417730b5aa2415b4daa Mon Sep 17 00:00:00 2001 From: repi Date: Mon, 1 Jan 2001 00:00:00 +0000 Subject: [PATCH] feat: add Anthropic LLM provider --- packages/llm/src/providers/anthropic.ts | 34 +++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 packages/llm/src/providers/anthropic.ts diff --git a/packages/llm/src/providers/anthropic.ts b/packages/llm/src/providers/anthropic.ts new file mode 100644 index 0000000..da270fa --- /dev/null +++ b/packages/llm/src/providers/anthropic.ts @@ -0,0 +1,34 @@ +import Anthropic from "@anthropic-ai/sdk"; +import type { LLMMessage, LLMOptions } from "@codeboard/shared"; +import type { LLMProvider } from "./base.js"; + +export class AnthropicProvider implements LLMProvider { + name = "anthropic"; + private client: Anthropic; + private defaultModel: string; + + constructor(apiKey: string, model?: string) { + this.client = new Anthropic({ apiKey }); + this.defaultModel = model ?? "claude-sonnet-4-20250514"; + } + + async chat(messages: LLMMessage[], options?: LLMOptions): Promise { + const systemMessage = messages.find((m) => m.role === "system"); + const nonSystemMessages = messages + .filter((m) => m.role !== "system") + .map((m) => ({ + role: m.role as "user" | "assistant", + content: m.content, + })); + + const response = await this.client.messages.create({ + model: options?.model ?? this.defaultModel, + max_tokens: options?.maxTokens ?? 4096, + system: systemMessage?.content, + messages: nonSystemMessages, + }); + + const textBlock = response.content.find((b) => b.type === "text"); + return textBlock?.type === "text" ? textBlock.text : ""; + } +}