diff --git a/package.json b/package.json index 9fdc2ed7..8c74e54f 100644 --- a/package.json +++ b/package.json @@ -18,8 +18,8 @@ "packages/redirects", "packages/runtime", "packages/static", - "packages/dev", "packages/ai", + "packages/dev", "packages/nuxt-module", "packages/vite-plugin", "packages/vite-plugin-tanstack-start" diff --git a/packages/dev/package.json b/packages/dev/package.json index b9c49c80..ff832d05 100644 --- a/packages/dev/package.json +++ b/packages/dev/package.json @@ -56,6 +56,7 @@ "vitest": "^3.0.0" }, "dependencies": { + "@netlify/ai": "^0.3.3", "@netlify/blobs": "10.3.3", "@netlify/config": "^23.2.0", "@netlify/dev-utils": "4.3.1", diff --git a/packages/dev/src/main.ts b/packages/dev/src/main.ts index 3325edd8..e5818ee8 100644 --- a/packages/dev/src/main.ts +++ b/packages/dev/src/main.ts @@ -3,6 +3,7 @@ import { IncomingMessage } from 'node:http' import path from 'node:path' import process from 'node:process' +import { parseAIGatewayContext, setupAIGateway } from '@netlify/ai/bootstrap' import { resolveConfig } from '@netlify/config' import { ensureNetlifyIgnore, @@ -459,6 +460,35 @@ export class NetlifyDev { this.#cleanupJobs.push(() => runtime.stop()) + // Bootstrap AI Gateway: Fetch AI Gateway tokens and inject them into env + if (this.#features.environmentVariables && config?.api && siteID && config?.siteInfo?.url) { + await setupAIGateway({ + api: config.api, + env: config.env || {}, + siteID, + siteURL: config.siteInfo.url, + }) + + // Inject AI_GATEWAY into process.env via runtime + if (config.env.AI_GATEWAY) { + runtime.env.set('AI_GATEWAY', config.env.AI_GATEWAY.value) + + // Parse and inject AI Gateway env vars + const aiGatewayContext = parseAIGatewayContext(config.env.AI_GATEWAY.value) + if (aiGatewayContext) { + runtime.env.set('NETLIFY_AI_GATEWAY_KEY', aiGatewayContext.token) + runtime.env.set('NETLIFY_AI_GATEWAY_URL', aiGatewayContext.url) + + if (aiGatewayContext.envVars) { + for (const envVar of aiGatewayContext.envVars) { + runtime.env.set(envVar.key, aiGatewayContext.token) + runtime.env.set(envVar.url, aiGatewayContext.url) + } + } + } + } + } + let serverAddress: string | undefined // If a custom server has been provided, use it. If not, we must stand up diff --git a/packages/dev/tsup.config.ts b/packages/dev/tsup.config.ts index e93f4974..c5ce64ec 100644 --- a/packages/dev/tsup.config.ts +++ b/packages/dev/tsup.config.ts @@ -13,5 +13,6 @@ export default defineConfig([ watch: argv.includes('--watch'), platform: 'node', bundle: true, + external: ['@netlify/ai'], }, ])