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
JavaScript
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);
}
};