anyclaude/src/main.ts
2025-05-27 15:57:58 -04:00

69 lines
2 KiB
TypeScript

// This is just intended to execute Claude Code while setting up a proxy for tokens.
import { createAnthropic } from "@ai-sdk/anthropic";
import { createAzure } from "@ai-sdk/azure";
import { createGoogleGenerativeAI } from "@ai-sdk/google";
import { createOpenAI } from "@ai-sdk/openai";
import { createXai } from "@ai-sdk/xai";
import { spawn } from "child_process";
import {
createAnthropicProxy,
type CreateAnthropicProxyOptions,
} from "./anthropic-proxy";
// providers are supported providers to proxy requests by name.
// Model names are split when requested by `/`. The provider
// name is the first part, and the rest is the model name.
const providers: CreateAnthropicProxyOptions["providers"] = {
openai: createOpenAI({
apiKey: process.env.OPENAI_API_KEY,
baseURL: process.env.OPENAI_API_URL,
}),
azure: createAzure({
apiKey: process.env.AZURE_API_KEY,
baseURL: process.env.AZURE_API_URL,
}),
google: createGoogleGenerativeAI({
apiKey: process.env.GOOGLE_API_KEY,
baseURL: process.env.GOOGLE_API_URL,
}),
xai: createXai({
apiKey: process.env.XAI_API_KEY,
baseURL: process.env.XAI_API_URL,
}),
};
// We exclude this by default, because the Claude Code
// API key is not supported by Anthropic endpoints.
if (process.env.ANTHROPIC_API_KEY) {
providers.anthropic = createAnthropic({
apiKey: process.env.ANTHROPIC_API_KEY,
baseURL: process.env.ANTHROPIC_API_URL,
});
}
const proxyURL = createAnthropicProxy({
providers,
});
if (process.env.PROXY_ONLY === "true") {
console.log("Proxy only mode: "+proxyURL);
} else {
const claudeArgs = process.argv.slice(2);
const proc = spawn("claude", claudeArgs, {
env: {
...process.env,
ANTHROPIC_BASE_URL: proxyURL,
},
stdio: "inherit",
});
proc.on("exit", (code) => {
if (claudeArgs[0] === "-h" || claudeArgs[0] === "--help") {
console.log("\nCustom Models:")
console.log(" --model <provider>/<model> e.g. openai/o3");
}
process.exit(code);
});
}