UNPKG

termcode

Version:

Superior terminal AI coding agent with enterprise-grade security, intelligent error recovery, performance monitoring, and plugin system - Advanced Claude Code alternative

63 lines (62 loc) 2.48 kB
import Anthropic from "@anthropic-ai/sdk"; import { getProviderKey } from "../onboarding.js"; export const anthropicProvider = { id: "anthropic", name: "Anthropic", maxContext: 200000, supportsTools: true, async chat(messages, { model, temperature = 0.2, maxTokens }) { const key = await getProviderKey("anthropic"); if (!key) { throw new Error("Anthropic key not set. Run /keys or restart to configure."); } const client = new Anthropic({ apiKey: key }); // Separate system message from conversation const systemMessage = messages.find(m => m.role === "system")?.content; const conversationMessages = messages .filter(m => m.role !== "system") .map(m => ({ role: m.role, content: m.content })); const response = await client.messages.create({ model, messages: conversationMessages, system: systemMessage, max_tokens: maxTokens || 4000, temperature }); return response.content[0]?.type === "text" ? response.content[0].text : ""; }, async embed(texts, { model }) { // Anthropic doesn't provide embeddings - fallback to OpenAI throw new Error("Anthropic doesn't provide embeddings. Use OpenAI or another provider for embeddings."); }, async listModels() { return [ { id: "claude-3-5-sonnet-20241022", type: "chat", context: 200000, costPer1kTokens: 0.003 }, { id: "claude-3-5-haiku-20241022", type: "chat", context: 200000, costPer1kTokens: 0.00025 }, { id: "claude-3-opus-20240229", type: "chat", context: 200000, costPer1kTokens: 0.015 } ]; }, async healthCheck() { try { const key = await getProviderKey("anthropic"); if (!key) { return { status: "error", error: "No API key configured" }; } return { status: "healthy", models: ["claude-3-5-sonnet-20241022", "claude-3-5-haiku-20241022"] }; } catch (error) { return { status: "error", error: error.message }; } }, estimateCost(tokens, model) { const costs = { "claude-3-5-sonnet-20241022": 0.003, "claude-3-5-haiku-20241022": 0.00025, "claude-3-opus-20240229": 0.015 }; return (tokens / 1000) * (costs[model] || 0.003); } };