From a529bb662e986ebdbbc1e03827e398398429acc3 Mon Sep 17 00:00:00 2001 From: Satya Patel Date: Fri, 30 Jan 2026 00:20:54 -0800 Subject: [PATCH] fix(slack): use env.ANTHROPIC_API_KEY instead of implicit process.env The Anthropic SDK defaulted to process.env.ANTHROPIC_API_KEY which was not set in the Vercel deployment. Pass the key explicitly via the validated env.ts config. - Add ANTHROPIC_API_KEY to API env.ts as required - Pass env.ANTHROPIC_API_KEY to Anthropic client in run-agent.ts - Add to deploy-preview and deploy-production workflows - Remove unused ANTHROPIC_API_KEY from trpc env.ts --- .github/workflows/deploy-preview.yml | 2 ++ .github/workflows/deploy-production.yml | 2 ++ .../integrations/slack/events/utils/run-agent/run-agent.ts | 4 ++-- apps/api/src/env.ts | 3 ++- packages/trpc/src/env.ts | 1 - 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy-preview.yml b/.github/workflows/deploy-preview.yml index b7e2491b8b0..1f130f5ab42 100644 --- a/.github/workflows/deploy-preview.yml +++ b/.github/workflows/deploy-preview.yml @@ -192,6 +192,7 @@ jobs: SLACK_CLIENT_ID: ${{ secrets.SLACK_CLIENT_ID }} SLACK_CLIENT_SECRET: ${{ secrets.SLACK_CLIENT_SECRET }} SLACK_SIGNING_SECRET: ${{ secrets.SLACK_SIGNING_SECRET }} + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} GH_APP_ID: ${{ secrets.GH_APP_ID }} GH_APP_PRIVATE_KEY: ${{ secrets.GH_APP_PRIVATE_KEY }} GH_WEBHOOK_SECRET: ${{ secrets.GH_WEBHOOK_SECRET }} @@ -235,6 +236,7 @@ jobs: --env SLACK_CLIENT_ID=$SLACK_CLIENT_ID \ --env SLACK_CLIENT_SECRET=$SLACK_CLIENT_SECRET \ --env SLACK_SIGNING_SECRET=$SLACK_SIGNING_SECRET \ + --env ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY \ --env GH_APP_ID="$GH_APP_ID" \ --env GH_APP_PRIVATE_KEY="$GH_APP_PRIVATE_KEY" \ --env GH_WEBHOOK_SECRET="$GH_WEBHOOK_SECRET" \ diff --git a/.github/workflows/deploy-production.yml b/.github/workflows/deploy-production.yml index b3b68d22840..4cd676ae507 100644 --- a/.github/workflows/deploy-production.yml +++ b/.github/workflows/deploy-production.yml @@ -96,6 +96,7 @@ jobs: SLACK_CLIENT_ID: ${{ secrets.SLACK_CLIENT_ID }} SLACK_CLIENT_SECRET: ${{ secrets.SLACK_CLIENT_SECRET }} SLACK_SIGNING_SECRET: ${{ secrets.SLACK_SIGNING_SECRET }} + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} GH_APP_ID: ${{ secrets.GH_APP_ID }} GH_APP_PRIVATE_KEY: ${{ secrets.GH_APP_PRIVATE_KEY }} GH_WEBHOOK_SECRET: ${{ secrets.GH_WEBHOOK_SECRET }} @@ -139,6 +140,7 @@ jobs: --env SLACK_CLIENT_ID=$SLACK_CLIENT_ID \ --env SLACK_CLIENT_SECRET=$SLACK_CLIENT_SECRET \ --env SLACK_SIGNING_SECRET=$SLACK_SIGNING_SECRET \ + --env ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY \ --env GH_APP_ID="$GH_APP_ID" \ --env GH_APP_PRIVATE_KEY="$GH_APP_PRIVATE_KEY" \ --env GH_WEBHOOK_SECRET="$GH_WEBHOOK_SECRET" \ diff --git a/apps/api/src/app/api/integrations/slack/events/utils/run-agent/run-agent.ts b/apps/api/src/app/api/integrations/slack/events/utils/run-agent/run-agent.ts index 958dee399d6..b1e8a6a01e6 100644 --- a/apps/api/src/app/api/integrations/slack/events/utils/run-agent/run-agent.ts +++ b/apps/api/src/app/api/integrations/slack/events/utils/run-agent/run-agent.ts @@ -1,10 +1,10 @@ import Anthropic from "@anthropic-ai/sdk"; import type { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { WebClient } from "@slack/web-api"; - import { db } from "@superset/db/client"; import { integrationConnections } from "@superset/db/schema"; import { and, eq } from "drizzle-orm"; +import { env } from "@/env"; import type { AgentAction } from "../slack-blocks"; import { createSlackMcpClient, @@ -186,7 +186,7 @@ Available tool prefixes: export async function runSlackAgent( params: RunSlackAgentParams, ): Promise { - const anthropic = new Anthropic(); + const anthropic = new Anthropic({ apiKey: env.ANTHROPIC_API_KEY }); const actions: AgentAction[] = []; const connection = await db.query.integrationConnections.findFirst({ diff --git a/apps/api/src/env.ts b/apps/api/src/env.ts index 915c906c8d2..a5e2bbc5b0f 100644 --- a/apps/api/src/env.ts +++ b/apps/api/src/env.ts @@ -26,7 +26,8 @@ export const env = createEnv({ GH_WEBHOOK_SECRET: z.string().min(1), SLACK_CLIENT_ID: z.string().min(1), SLACK_CLIENT_SECRET: z.string().min(1), - SLACK_SIGNING_SECRET: z.string().min(1), + SLACK_SIGNING_SECRET: z.string(), + ANTHROPIC_API_KEY: z.string(), QSTASH_TOKEN: z.string().min(1), QSTASH_CURRENT_SIGNING_KEY: z.string().min(1), QSTASH_NEXT_SIGNING_KEY: z.string().min(1), diff --git a/packages/trpc/src/env.ts b/packages/trpc/src/env.ts index 5a5cb9dd2bc..b0f11862257 100644 --- a/packages/trpc/src/env.ts +++ b/packages/trpc/src/env.ts @@ -6,7 +6,6 @@ export const env = createEnv({ NODE_ENV: z .enum(["development", "production", "test"]) .default("development"), - ANTHROPIC_API_KEY: z.string().min(1).optional(), BLOB_READ_WRITE_TOKEN: z.string().min(1), POSTHOG_API_KEY: z.string(), POSTHOG_API_HOST: z.string().url().default("https://us.posthog.com"),