diff --git a/src/gateway/env.ts b/src/gateway/env.ts index 26f1887..478302e 100644 --- a/src/gateway/env.ts +++ b/src/gateway/env.ts @@ -25,6 +25,9 @@ export function buildEnvVars(env: MoltbotEnv): Record { if (!envVars.ANTHROPIC_API_KEY && env.ANTHROPIC_API_KEY) { envVars.ANTHROPIC_API_KEY = env.ANTHROPIC_API_KEY; } + if (env.ANTHROPIC_OAUTH_TOKEN) { + envVars.ANTHROPIC_OAUTH_TOKEN = env.ANTHROPIC_OAUTH_TOKEN; + } if (!envVars.OPENAI_API_KEY && env.OPENAI_API_KEY) { envVars.OPENAI_API_KEY = env.OPENAI_API_KEY; } diff --git a/src/index.ts b/src/index.ts index 3ee1f5c..eacd5e3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -73,9 +73,9 @@ function validateRequiredEnv(env: MoltbotEnv): string[] { if (!env.AI_GATEWAY_BASE_URL) { missing.push('AI_GATEWAY_BASE_URL (required when using AI_GATEWAY_API_KEY)'); } - } else if (!env.ANTHROPIC_API_KEY) { - // Direct Anthropic access requires API key - missing.push('ANTHROPIC_API_KEY or AI_GATEWAY_API_KEY'); + } else if (!env.ANTHROPIC_API_KEY && !env.ANTHROPIC_OAUTH_TOKEN) { + // Direct Anthropic access requires API key or OAuth token + missing.push('ANTHROPIC_API_KEY, ANTHROPIC_OAUTH_TOKEN, or AI_GATEWAY_API_KEY'); } return missing; @@ -116,6 +116,7 @@ app.use('*', async (c, next) => { const url = new URL(c.req.url); console.log(`[REQ] ${c.req.method} ${url.pathname}${url.search}`); console.log(`[REQ] Has ANTHROPIC_API_KEY: ${!!c.env.ANTHROPIC_API_KEY}`); + console.log(`[REQ] Has ANTHROPIC_OAUTH_TOKEN: ${!!c.env.ANTHROPIC_OAUTH_TOKEN}`); console.log(`[REQ] DEV_MODE: ${c.env.DEV_MODE}`); console.log(`[REQ] DEBUG_ROUTES: ${c.env.DEBUG_ROUTES}`); await next(); @@ -249,8 +250,8 @@ app.all('*', async (c) => { const errorMessage = error instanceof Error ? error.message : 'Unknown error'; let hint = 'Check worker logs with: wrangler tail'; - if (!c.env.ANTHROPIC_API_KEY) { - hint = 'ANTHROPIC_API_KEY is not set. Run: wrangler secret put ANTHROPIC_API_KEY'; + if (!c.env.ANTHROPIC_API_KEY && !c.env.ANTHROPIC_OAUTH_TOKEN) { + hint = 'ANTHROPIC_API_KEY or ANTHROPIC_OAUTH_TOKEN is not set. Run: wrangler secret put ANTHROPIC_API_KEY'; } else if (errorMessage.includes('heap out of memory') || errorMessage.includes('OOM')) { hint = 'Gateway ran out of memory. Try again or check for memory leaks.'; } diff --git a/src/types.ts b/src/types.ts index bb82c8c..a08bcb5 100644 --- a/src/types.ts +++ b/src/types.ts @@ -12,6 +12,7 @@ export interface MoltbotEnv { AI_GATEWAY_BASE_URL?: string; // AI Gateway URL (e.g., https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id}/anthropic) // Legacy direct provider configuration (fallback) ANTHROPIC_API_KEY?: string; + ANTHROPIC_OAUTH_TOKEN?: string; ANTHROPIC_BASE_URL?: string; OPENAI_API_KEY?: string; MOLTBOT_GATEWAY_TOKEN?: string; // Gateway token (mapped to CLAWDBOT_GATEWAY_TOKEN for container) diff --git a/start-moltbot.sh b/start-moltbot.sh index 977ebf3..c61d323 100644 --- a/start-moltbot.sh +++ b/start-moltbot.sh @@ -187,7 +187,6 @@ if (process.env.TELEGRAM_BOT_TOKEN) { config.channels.telegram = config.channels.telegram || {}; config.channels.telegram.botToken = process.env.TELEGRAM_BOT_TOKEN; config.channels.telegram.enabled = true; - config.channels.telegram.dm = config.channels.telegram.dm || {}; config.channels.telegram.dmPolicy = process.env.TELEGRAM_DM_POLICY || 'pairing'; }