Skip to content

Commit 14d35c7

Browse files
authored
fix(init): pin ai package version to ^5 (#155)
1 parent fb0c070 commit 14d35c7

File tree

4 files changed

+6
-6
lines changed

4 files changed

+6
-6
lines changed

packages/blink/src/cli/init-templates/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export const templates = {
1414
"agent.ts.hbs":
1515
'{{#if (eq aiProvider "anthropic")}}\nimport { anthropic } from "@ai-sdk/anthropic";\n{{else if (eq aiProvider "openai")}}\nimport { openai } from "@ai-sdk/openai";\n{{/if}}\nimport { type Message, Scout } from "@blink-sdk/scout-agent";\nimport { streamText, tool } from "ai";\nimport * as blink from "blink";\nimport { z } from "zod";\n\nexport const agent = new blink.Agent<Message>();\n\nconst scout = new Scout({\n agent,\n // GitHub integration (optional).\n // Run `blink setup github-app` to set up your GitHub App, or remove this section if not needed.\n github: {\n appID: process.env.GITHUB_APP_ID,\n privateKey: process.env.GITHUB_PRIVATE_KEY,\n webhookSecret: process.env.GITHUB_WEBHOOK_SECRET,\n },\n // Slack integration (optional).\n // Run `blink setup slack-app` to set up your Slack App, or remove this section if not needed.\n slack: {\n botToken: process.env.SLACK_BOT_TOKEN,\n signingSecret: process.env.SLACK_SIGNING_SECRET,\n },\n // Web search integration (optional). Visit https://exa.ai to get an API key.\n webSearch: {\n exaApiKey: process.env.EXA_API_KEY,\n },\n // Compute environment for running code.\n // Using Docker by default for local development.\n // For production, you can use Coder (https://coder.com) instead:\n // compute: {\n // type: "coder",\n // options: {\n // url: process.env.CODER_URL,\n // sessionToken: process.env.CODER_SESSION_TOKEN,\n // template: process.env.CODER_TEMPLATE,\n // presetName: process.env.CODER_PRESET_NAME,\n // },\n // },\n compute: {\n type: "docker",\n },\n});\n\nagent.on("request", async (request) => {\n const url = new URL(request.url);\n if (url.pathname.startsWith("/slack")) {\n return scout.handleSlackWebhook(request);\n }\n if (url.pathname.startsWith("/github")) {\n return scout.handleGitHubWebhook(request);\n }\n return new Response("Hey there!", { status: 200 });\n});\n\nagent.on("chat", async ({ id, messages }) => {\n const params = await scout.buildStreamTextParams({\n messages,\n chatID: id,\n{{#if (eq aiProvider "anthropic")}}\n model: anthropic("claude-opus-4-5"),\n{{else if (eq aiProvider "openai")}}\n model: openai.chat("gpt-5"),\n{{else if (eq aiProvider "vercel")}}\n model: "anthropic/claude-opus-4.5",\n{{else}}\n // Unknown provider: {{aiProvider}}. Defaulting to Vercel AI Gateway syntax.\n model: "anthropic/claude-opus-4.5",\n{{/if}}\n providerOptions: { anthropic: { cacheControl: { type: "ephemeral" } } },\n tools: {\n // Add your custom tools here\n get_favorite_color: tool({\n description: "Get your favorite color",\n inputSchema: z.object({}),\n execute() {\n return "blue";\n },\n }),\n },\n });\n return streamText(params);\n});\n\nagent.serve();\n',
1616
"package.json.hbs":
17-
'{\n "name": "{{packageName}}",\n "main": "agent.ts",\n "type": "module",\n "private": true,\n "scripts": {\n "dev": "blink dev",\n "deploy": "blink deploy"\n },\n "devDependencies": {\n "zod": "latest",\n "ai": "latest",\n{{#if (eq aiProvider "anthropic")}}\n "@ai-sdk/anthropic": "latest",\n{{else if (eq aiProvider "openai")}}\n "@ai-sdk/openai": "latest",\n{{/if}}\n "blink": "latest",\n "esbuild": "latest",\n "@types/node": "latest",\n "typescript": "latest",\n "@blink-sdk/scout-agent": "latest"\n }\n}\n',
17+
'{\n "name": "{{packageName}}",\n "main": "agent.ts",\n "type": "module",\n "private": true,\n "scripts": {\n "dev": "blink dev",\n "deploy": "blink deploy"\n },\n "devDependencies": {\n "zod": "latest",\n "ai": "^5",\n{{#if (eq aiProvider "anthropic")}}\n "@ai-sdk/anthropic": "latest",\n{{else if (eq aiProvider "openai")}}\n "@ai-sdk/openai": "latest",\n{{/if}}\n "blink": "latest",\n "esbuild": "latest",\n "@types/node": "latest",\n "typescript": "latest",\n "@blink-sdk/scout-agent": "latest"\n }\n}\n',
1818
"tsconfig.json":
1919
'{\n "compilerOptions": {\n "lib": ["ESNext"],\n "target": "ESNext",\n "module": "Preserve",\n "moduleDetection": "force",\n\n "moduleResolution": "bundler",\n "allowImportingTsExtensions": true,\n "verbatimModuleSyntax": true,\n "resolveJsonModule": true,\n "noEmit": true,\n\n "strict": true,\n "skipLibCheck": true,\n "noFallthroughCasesInSwitch": true,\n "noUncheckedIndexedAccess": true,\n "noImplicitOverride": true,\n\n "noUnusedLocals": false,\n "noUnusedParameters": false,\n\n "types": ["node"]\n }\n}\n',
2020
},
@@ -30,7 +30,7 @@ export const templates = {
3030
"agent.ts.hbs":
3131
'import { convertToModelMessages, streamText, tool } from "ai";\nimport * as blink from "blink";\nimport { z } from "zod";\n{{#if (eq aiProvider "anthropic")}}\nimport { anthropic } from "@ai-sdk/anthropic";\n{{else if (eq aiProvider "openai")}}\nimport { openai } from "@ai-sdk/openai";\n{{/if}}\n\nconst agent = new blink.Agent();\n\nagent.on("chat", async ({ messages }) => {\n return streamText({\n{{#if (eq aiProvider "anthropic")}}\n model: anthropic("claude-sonnet-4-5"),\n{{else if (eq aiProvider "openai")}}\n model: openai.chat("gpt-5"),\n{{else if (eq aiProvider "vercel")}}\n model: "anthropic/claude-sonnet-4.5",\n{{else}}\n // Unknown provider: {{aiProvider}}. Defaulting to Vercel AI Gateway syntax.\n model: "anthropic/claude-sonnet-4.5",\n{{/if}}\n system: `You are a basic agent the user will customize.\n\nSuggest the user enters edit mode with Ctrl+T or /edit to customize the agent.\nDemonstrate your capabilities with the IP tool.`,\n messages: convertToModelMessages(messages),\n tools: {\n get_ip_info: tool({\n description: "Get IP address information of the computer.",\n inputSchema: z.object({}),\n execute: async () => {\n const response = await fetch("https://ipinfo.io/json");\n return response.json();\n },\n }),\n },\n });\n});\n\nagent.serve();\n',
3232
"package.json.hbs":
33-
'{\n "name": "{{packageName}}",\n "main": "agent.ts",\n "type": "module",\n "private": true,\n "scripts": {\n "dev": "blink dev",\n "deploy": "blink deploy"\n },\n "devDependencies": {\n "zod": "latest",\n "ai": "latest",\n{{#if (eq aiProvider "anthropic")}}\n "@ai-sdk/anthropic": "latest",\n{{else if (eq aiProvider "openai")}}\n "@ai-sdk/openai": "latest",\n{{/if}}\n "blink": "latest",\n "esbuild": "latest",\n "@types/node": "latest",\n "typescript": "latest"\n }\n}\n',
33+
'{\n "name": "{{packageName}}",\n "main": "agent.ts",\n "type": "module",\n "private": true,\n "scripts": {\n "dev": "blink dev",\n "deploy": "blink deploy"\n },\n "devDependencies": {\n "zod": "latest",\n "ai": "^5",\n{{#if (eq aiProvider "anthropic")}}\n "@ai-sdk/anthropic": "latest",\n{{else if (eq aiProvider "openai")}}\n "@ai-sdk/openai": "latest",\n{{/if}}\n "blink": "latest",\n "esbuild": "latest",\n "@types/node": "latest",\n "typescript": "latest"\n }\n}\n',
3434
"tsconfig.json":
3535
'{\n "compilerOptions": {\n "lib": ["ESNext"],\n "target": "ESNext",\n "module": "Preserve",\n "moduleDetection": "force",\n\n "moduleResolution": "bundler",\n "allowImportingTsExtensions": true,\n "verbatimModuleSyntax": true,\n "resolveJsonModule": true,\n "noEmit": true,\n\n "strict": true,\n "skipLibCheck": true,\n "noFallthroughCasesInSwitch": true,\n "noUncheckedIndexedAccess": true,\n "noImplicitOverride": true,\n\n "noUnusedLocals": false,\n "noUnusedParameters": false,\n\n "types": ["node"]\n }\n}\n',
3636
},
@@ -46,7 +46,7 @@ export const templates = {
4646
"agent.ts.hbs":
4747
'import { convertToModelMessages, streamText } from "ai";\nimport * as blink from "blink";\nimport * as slack from "@blink-sdk/slack";\nimport { App } from "@slack/bolt";\n{{#if (eq aiProvider "anthropic")}}\nimport { anthropic } from "@ai-sdk/anthropic";\n{{else if (eq aiProvider "openai")}}\nimport { openai } from "@ai-sdk/openai";\n{{/if}}\n\nconst receiver = new slack.Receiver();\nconst app = new App({\n token: process.env.SLACK_BOT_TOKEN,\n signingSecret: process.env.SLACK_SIGNING_SECRET,\n receiver,\n});\n\n// Handle messages in channels (only when @mentioned)\napp.event("app_mention", async ({ event }) => {\n const chat = await agent.chat.upsert([\n "slack",\n event.channel,\n event.thread_ts ?? event.ts,\n ]);\n const { message } = await slack.createMessageFromEvent({\n client: app.client,\n event,\n });\n await agent.chat.sendMessages(chat.id, [message]);\n await app.client.assistant.threads.setStatus({\n channel_id: event.channel,\n status: "is typing...",\n thread_ts: event.thread_ts ?? event.ts,\n });\n});\n\n// Handle direct messages (always respond)\napp.event("message", async ({ event }) => {\n // Ignore bot messages and message changes\n if (event.subtype || event.bot_id) {\n return;\n }\n // Only handle DMs (channel type is \'im\')\n const channelInfo = await app.client.conversations.info({\n channel: event.channel,\n });\n if (!channelInfo.channel?.is_im) {\n return;\n }\n const chat = await agent.chat.upsert(["slack", event.channel]);\n const { message } = await slack.createMessageFromEvent({\n client: app.client,\n event,\n });\n await agent.chat.sendMessages(chat.id, [message]);\n await app.client.assistant.threads.setStatus({\n channel_id: event.channel,\n status: "is typing...",\n thread_ts: event.thread_ts ?? event.ts,\n });\n});\n\nconst agent = new blink.Agent();\n\nagent.on("request", async (request) => {\n return receiver.handle(app, request);\n});\n\nagent.on("chat", async ({ messages }) => {\n const tools = slack.createTools({ client: app.client });\n const lastMessage = messages[messages.length - 1];\n const threadInfo = lastMessage?.metadata as\n | { channel?: string; thread_ts?: string }\n | undefined;\n\n // Add instruction to clear status after completion\n if (threadInfo?.channel && threadInfo?.thread_ts) {\n const clonedMessages = structuredClone(messages);\n const lastClonedMessage = clonedMessages[clonedMessages.length - 1];\n if (lastClonedMessage) {\n lastClonedMessage.parts.push({\n type: "text",\n text: `*INTERNAL INSTRUCTION*: Clear the status of this thread after you finish: channel=${threadInfo.channel} thread_ts=${threadInfo.thread_ts}`,\n });\n }\n messages = clonedMessages;\n }\n\n return streamText({\n{{#if (eq aiProvider "anthropic")}}\n model: anthropic("claude-sonnet-4-5"),\n{{else if (eq aiProvider "openai")}}\n model: openai.chat("gpt-5"),\n{{else if (eq aiProvider "vercel")}}\n model: "anthropic/claude-sonnet-4.5",\n{{else}}\n // Unknown provider: {{aiProvider}}. Defaulting to Vercel AI Gateway syntax.\n model: "anthropic/claude-sonnet-4.5",\n{{/if}}\n system: "You are a helpful Slack bot assistant.",\n messages: convertToModelMessages(messages, {\n ignoreIncompleteToolCalls: true,\n tools,\n }),\n tools,\n });\n});\n\nagent.serve();',
4848
"package.json.hbs":
49-
'{\n "name": "{{packageName}}",\n "main": "agent.ts",\n "type": "module",\n "private": true,\n "scripts": {\n "dev": "blink dev",\n "deploy": "blink deploy"\n },\n "devDependencies": {\n "zod": "latest",\n "ai": "latest",\n{{#if (eq aiProvider "anthropic")}}\n "@ai-sdk/anthropic": "latest",\n{{else if (eq aiProvider "openai")}}\n "@ai-sdk/openai": "latest",\n{{/if}}\n "blink": "latest",\n "esbuild": "latest",\n "@types/node": "latest",\n "typescript": "latest",\n "@slack/bolt": "latest",\n "@blink-sdk/slack": "latest"\n }\n}\n',
49+
'{\n "name": "{{packageName}}",\n "main": "agent.ts",\n "type": "module",\n "private": true,\n "scripts": {\n "dev": "blink dev",\n "deploy": "blink deploy"\n },\n "devDependencies": {\n "zod": "latest",\n "ai": "^5",\n{{#if (eq aiProvider "anthropic")}}\n "@ai-sdk/anthropic": "latest",\n{{else if (eq aiProvider "openai")}}\n "@ai-sdk/openai": "latest",\n{{/if}}\n "blink": "latest",\n "esbuild": "latest",\n "@types/node": "latest",\n "typescript": "latest",\n "@slack/bolt": "latest",\n "@blink-sdk/slack": "latest"\n }\n}\n',
5050
"tsconfig.json":
5151
'{\n "compilerOptions": {\n "lib": ["ESNext"],\n "target": "ESNext",\n "module": "Preserve",\n "moduleDetection": "force",\n\n "moduleResolution": "bundler",\n "allowImportingTsExtensions": true,\n "verbatimModuleSyntax": true,\n "resolveJsonModule": true,\n "noEmit": true,\n\n "strict": true,\n "skipLibCheck": true,\n "noFallthroughCasesInSwitch": true,\n "noUncheckedIndexedAccess": true,\n "noImplicitOverride": true,\n\n "noUnusedLocals": false,\n "noUnusedParameters": false,\n\n "types": ["node"]\n }\n}\n',
5252
},

packages/blink/src/cli/init-templates/scout/package.json.hbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
},
1010
"devDependencies": {
1111
"zod": "latest",
12-
"ai": "latest",
12+
"ai": "^5",
1313
{{#if (eq aiProvider "anthropic")}}
1414
"@ai-sdk/anthropic": "latest",
1515
{{else if (eq aiProvider "openai")}}

packages/blink/src/cli/init-templates/scratch/package.json.hbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
},
1010
"devDependencies": {
1111
"zod": "latest",
12-
"ai": "latest",
12+
"ai": "^5",
1313
{{#if (eq aiProvider "anthropic")}}
1414
"@ai-sdk/anthropic": "latest",
1515
{{else if (eq aiProvider "openai")}}

packages/blink/src/cli/init-templates/slack-bot/package.json.hbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
},
1010
"devDependencies": {
1111
"zod": "latest",
12-
"ai": "latest",
12+
"ai": "^5",
1313
{{#if (eq aiProvider "anthropic")}}
1414
"@ai-sdk/anthropic": "latest",
1515
{{else if (eq aiProvider "openai")}}

0 commit comments

Comments
 (0)