@@ -6,35 +6,37 @@ import { ArrowRight, Terminal, Check, ChevronDown } from "lucide-react";
66import { CopyButton } from "./ui/CopyButton" ;
77import { LightningBackground } from "./ui/LightningBackground" ;
88
9- const codeRaw = `import { generateText, tool } from "ai";
9+ const codeRaw = `import { generateText, stepCountIs, tool } from "ai";
1010import { anthropic } from "@ai-sdk/anthropic";
1111import { NodeRuntime, createNodeDriver, createNodeRuntimeDriverFactory } from "secure-exec";
1212import { z } from "zod";
1313
1414const runtime = new NodeRuntime({
15- systemDriver: createNodeDriver({ permissions: { fs: true, network: true } }),
15+ systemDriver: createNodeDriver({
16+ permissions: {
17+ fs: () => ({ allow: true }),
18+ network: () => ({ allow: true }),
19+ },
20+ }),
1621 runtimeDriverFactory: createNodeRuntimeDriverFactory(),
1722 memoryLimit: 64,
1823 cpuTimeLimitMs: 5000,
1924});
2025
21- const result = await generateText({
22- model: anthropic("claude-sonnet-4-20250514"),
26+ const { text } = await generateText({
27+ model: anthropic("claude-sonnet-4-6"),
28+ prompt: "Calculate the first 20 fibonacci numbers",
29+ stopWhen: stepCountIs(5),
2330 tools: {
2431 execute: tool({
25- description: "Run JavaScript in a secure sandbox",
26- parameters: z.object({ code: z.string() }),
27- execute: async ({ code }) => {
28- const logs: string[] = [];
29- const res = await runtime.exec(code, {
30- onStdio: (e) => logs.push(e.message),
31- });
32- return { exitCode: res.code, output: logs.join("\\n") };
33- },
32+ description: "Run JavaScript in a secure sandbox. Assign the result to module.exports to return data.",
33+ inputSchema: z.object({ code: z.string() }),
34+ execute: async ({ code }) => runtime.run(code),
3435 }),
3536 },
36- prompt: "Calculate the first 20 fibonacci numbers",
37- });` ;
37+ });
38+
39+ console.log(text);` ;
3840
3941function CodeBlock ( ) {
4042 return (
@@ -49,6 +51,8 @@ function CodeBlock() {
4951 < span className = "text-zinc-300" > { " { " } </ span >
5052 < span className = "text-white" > generateText</ span >
5153 < span className = "text-zinc-300" > , </ span >
54+ < span className = "text-white" > stepCountIs</ span >
55+ < span className = "text-zinc-300" > , </ span >
5256 < span className = "text-white" > tool</ span >
5357 < span className = "text-zinc-300" > { " } " } </ span >
5458 < span className = "text-purple-400" > from</ span >
@@ -99,11 +103,21 @@ function CodeBlock() {
99103 { "\n" }
100104 < span className = "text-zinc-300" > { " systemDriver: " } </ span >
101105 < span className = "text-blue-400" > createNodeDriver</ span >
102- < span className = "text-zinc-300" > { "({ permissions: { fs: " } </ span >
106+ < span className = "text-zinc-300" > { "({" } </ span >
107+ { "\n" }
108+ < span className = "text-zinc-300" > { " permissions: {" } </ span >
109+ { "\n" }
110+ < span className = "text-zinc-300" > { " fs: () => ({ allow: " } </ span >
103111 < span className = "text-orange-400" > true</ span >
104- < span className = "text-zinc-300" > { ", network: " } </ span >
112+ < span className = "text-zinc-300" > { " })," } </ span >
113+ { "\n" }
114+ < span className = "text-zinc-300" > { " network: () => ({ allow: " } </ span >
105115 < span className = "text-orange-400" > true</ span >
106- < span className = "text-zinc-300" > { " } })," } </ span >
116+ < span className = "text-zinc-300" > { " })," } </ span >
117+ { "\n" }
118+ < span className = "text-zinc-300" > { " }," } </ span >
119+ { "\n" }
120+ < span className = "text-zinc-300" > { " })," } </ span >
107121 { "\n" }
108122 < span className = "text-zinc-300" > { " runtimeDriverFactory: " } </ span >
109123 < span className = "text-blue-400" > createNodeRuntimeDriverFactory</ span >
@@ -123,7 +137,7 @@ function CodeBlock() {
123137 < span className = "text-zinc-500" > // Expose as an AI SDK tool</ span >
124138 { "\n" }
125139 < span className = "text-purple-400" > const</ span >
126- < span className = "text-zinc-300" > result = </ span >
140+ < span className = "text-zinc-300" > { " { text } = " } </ span >
127141 < span className = "text-purple-400" > await</ span >
128142 < span className = "text-zinc-300" > </ span >
129143 < span className = "text-blue-400" > generateText</ span >
@@ -132,7 +146,17 @@ function CodeBlock() {
132146 < span className = "text-zinc-300" > { " model: " } </ span >
133147 < span className = "text-blue-400" > anthropic</ span >
134148 < span className = "text-zinc-300" > { "(" } </ span >
135- < span className = "text-green-400" > "claude-sonnet-4-20250514"</ span >
149+ < span className = "text-green-400" > "claude-sonnet-4-6"</ span >
150+ < span className = "text-zinc-300" > { ")," } </ span >
151+ { "\n" }
152+ < span className = "text-zinc-300" > { " prompt: " } </ span >
153+ < span className = "text-green-400" > "Calculate the first 20 fibonacci numbers"</ span >
154+ < span className = "text-zinc-300" > ,</ span >
155+ { "\n" }
156+ < span className = "text-zinc-300" > { " stopWhen: " } </ span >
157+ < span className = "text-blue-400" > stepCountIs</ span >
158+ < span className = "text-zinc-300" > { "(" } </ span >
159+ < span className = "text-orange-400" > 5</ span >
136160 < span className = "text-zinc-300" > { ")," } </ span >
137161 { "\n" }
138162 < span className = "text-zinc-300" > { " tools: {" } </ span >
@@ -142,58 +166,31 @@ function CodeBlock() {
142166 < span className = "text-zinc-300" > { "({" } </ span >
143167 { "\n" }
144168 < span className = "text-zinc-300" > { " description: " } </ span >
145- < span className = "text-green-400" > "Run JavaScript in a secure sandbox"</ span >
169+ < span className = "text-green-400" > "Run JavaScript in a secure sandbox. Assign the result to module.exports to return data. "</ span >
146170 < span className = "text-zinc-300" > ,</ span >
147171 { "\n" }
148- < span className = "text-zinc-300" > { " parameters : z." } </ span >
172+ < span className = "text-zinc-300" > { " inputSchema : z." } </ span >
149173 < span className = "text-blue-400" > object</ span >
150174 < span className = "text-zinc-300" > { "({ code: z." } </ span >
151175 < span className = "text-blue-400" > string</ span >
152176 < span className = "text-zinc-300" > { "() })," } </ span >
153177 { "\n" }
154178 < span className = "text-zinc-300" > { " execute: " } </ span >
155179 < span className = "text-purple-400" > async</ span >
156- < span className = "text-zinc-300" > { " ({ code }) => {" } </ span >
157- { "\n" }
158- < span className = "text-zinc-300" > { " " } </ span >
159- < span className = "text-purple-400" > const</ span >
160- < span className = "text-zinc-300" > { " logs: " } </ span >
161- < span className = "text-blue-400" > string</ span >
162- < span className = "text-zinc-300" > { "[] = [];" } </ span >
163- { "\n" }
164- < span className = "text-zinc-300" > { " " } </ span >
165- < span className = "text-purple-400" > const</ span >
166- < span className = "text-zinc-300" > { " res = " } </ span >
167- < span className = "text-purple-400" > await</ span >
168- < span className = "text-zinc-300" > { " runtime." } </ span >
169- < span className = "text-blue-400" > exec</ span >
170- < span className = "text-zinc-300" > { "(code, {" } </ span >
171- { "\n" }
172- < span className = "text-zinc-300" > { " onStdio: (e) => logs." } </ span >
173- < span className = "text-blue-400" > push</ span >
174- < span className = "text-zinc-300" > { "(e.message)," } </ span >
175- { "\n" }
176- < span className = "text-zinc-300" > { " });" } </ span >
177- { "\n" }
178- < span className = "text-zinc-300" > { " " } </ span >
179- < span className = "text-purple-400" > return</ span >
180- < span className = "text-zinc-300" > { " { exitCode: res.code, output: logs." } </ span >
181- < span className = "text-blue-400" > join</ span >
182- < span className = "text-zinc-300" > { "(" } </ span >
183- < span className = "text-green-400" > "\\n"</ span >
184- < span className = "text-zinc-300" > { ") };" } </ span >
185- { "\n" }
186- < span className = "text-zinc-300" > { " }," } </ span >
180+ < span className = "text-zinc-300" > { " ({ code }) => runtime." } </ span >
181+ < span className = "text-blue-400" > run</ span >
182+ < span className = "text-zinc-300" > { "(code)," } </ span >
187183 { "\n" }
188184 < span className = "text-zinc-300" > { " })," } </ span >
189185 { "\n" }
190186 < span className = "text-zinc-300" > { " }," } </ span >
191187 { "\n" }
192- < span className = "text-zinc-300" > { " prompt: " } </ span >
193- < span className = "text-green-400" > "Calculate the first 20 fibonacci numbers"</ span >
194- < span className = "text-zinc-300" > ,</ span >
195- { "\n" }
196188 < span className = "text-zinc-300" > { "});" } </ span >
189+ { "\n\n" }
190+ < span className = "text-white" > console</ span >
191+ < span className = "text-zinc-300" > .</ span >
192+ < span className = "text-blue-400" > log</ span >
193+ < span className = "text-zinc-300" > (text);</ span >
197194 </ code >
198195 </ pre >
199196 </ div >
0 commit comments