import { createOpenAICompatible } from '@ai-sdk/openai-compatible'; import { createAnthropic } from '@ai-sdk/anthropic'; import { generateText } from 'ai'; import 'dotenv/config'; interface ProviderConfig { npm: string; name: string; models: Record; options: { baseURL?: string; apiKey: string; }; } interface OpenCodeConfig { provider: Record; } // 解析环境变量占位符 {env:VAR_NAME} function resolveEnvVars(value: string): string { return value.replace(/{env:([^}]+)}/g, (_, varName) => { const envValue = process.env[varName]; if (!envValue) { throw new Error(`Environment variable ${varName} is not set`); } return envValue; }); } async function testProvider(providerName: string, config: ProviderConfig) { console.log(`\nTesting provider: ${config.name}`); const apiKey = resolveEnvVars(config.options.apiKey); const baseURL = config.options.baseURL ? resolveEnvVars(config.options.baseURL) : undefined; let provider; console.log('baseURL:', baseURL); console.log('apiKey:', apiKey ? '[REDACTED]' : '[MISSING]'); if (config.npm === '@ai-sdk/openai-compatible') { provider = createOpenAICompatible({ baseURL: baseURL!, name: providerName, apiKey, }); } else if (config.npm === '@ai-sdk/anthropic') { provider = createAnthropic({ baseURL: baseURL, apiKey, }); } else { throw new Error(`Unsupported npm package: ${config.npm}`); } const modelKeys = Object.keys(config.models); if (modelKeys.length === 0) { throw new Error('No models configured for this provider'); } const modelName = modelKeys[0]; try { const result = await generateText({ model: provider(modelName), prompt: 'Say hello in one sentence.', }); console.log(`Model: ${modelName}`); console.log(`Response: ${result.text}`); return true; } catch (error) { console.error(`Error: ${error}`); return false; } } async function main() { const config: OpenCodeConfig = await Bun.file('opencode.json').json(); console.log('Loaded opencode.json configuration'); console.log(`Found ${Object.keys(config.provider).length} provider(s)`); const results = await Promise.all( Object.entries(config.provider).map(([name, config]) => testProvider(name, config).catch((error) => { console.error(`Provider ${name} failed: ${error}`); return false; }) ) ); console.log('\n=== Summary ==='); Object.keys(config.provider).forEach((name, i) => { console.log(`${name}: ${results[i] ? '✓ Success' : '✗ Failed'}`); }); } main().catch(console.error);