Initial commit
This commit is contained in:
112
templates/multi-step-execution.ts
Normal file
112
templates/multi-step-execution.ts
Normal file
@@ -0,0 +1,112 @@
|
||||
// Multi-step execution with stopWhen conditions
|
||||
// AI SDK Core - Control multi-step workflows
|
||||
|
||||
import { generateText, tool, stopWhen, stepCountIs, hasToolCall } from 'ai';
|
||||
import { openai } from '@ai-sdk/openai';
|
||||
import { z } from 'zod';
|
||||
|
||||
async function example1_stepCount() {
|
||||
console.log('=== Example 1: Stop after N steps ===\n');
|
||||
|
||||
const result = await generateText({
|
||||
model: openai('gpt-4'),
|
||||
tools: {
|
||||
research: tool({
|
||||
description: 'Research a topic',
|
||||
inputSchema: z.object({ topic: z.string() }),
|
||||
execute: async ({ topic }) => {
|
||||
console.log(`[Tool] Researching ${topic}...`);
|
||||
return { info: `Research data about ${topic}` };
|
||||
},
|
||||
}),
|
||||
analyze: tool({
|
||||
description: 'Analyze research data',
|
||||
inputSchema: z.object({ data: z.string() }),
|
||||
execute: async ({ data }) => {
|
||||
console.log(`[Tool] Analyzing data...`);
|
||||
return { analysis: `Analysis of ${data}` };
|
||||
},
|
||||
}),
|
||||
},
|
||||
prompt: 'Research TypeScript and analyze the findings.',
|
||||
stopWhen: stepCountIs(3), // Stop after 3 steps
|
||||
});
|
||||
|
||||
console.log('\nResult:', result.text);
|
||||
console.log('Steps taken:', result.steps);
|
||||
}
|
||||
|
||||
async function example2_specificTool() {
|
||||
console.log('\n=== Example 2: Stop when specific tool called ===\n');
|
||||
|
||||
const result = await generateText({
|
||||
model: openai('gpt-4'),
|
||||
tools: {
|
||||
search: tool({
|
||||
description: 'Search for information',
|
||||
inputSchema: z.object({ query: z.string() }),
|
||||
execute: async ({ query }) => {
|
||||
console.log(`[Tool] Searching for: ${query}`);
|
||||
return { results: `Search results for ${query}` };
|
||||
},
|
||||
}),
|
||||
summarize: tool({
|
||||
description: 'Create final summary',
|
||||
inputSchema: z.object({ content: z.string() }),
|
||||
execute: async ({ content }) => {
|
||||
console.log(`[Tool] Creating summary...`);
|
||||
return { summary: `Summary of ${content}` };
|
||||
},
|
||||
}),
|
||||
},
|
||||
prompt: 'Search for information about AI and create a summary.',
|
||||
stopWhen: hasToolCall('summarize'), // Stop when summarize is called
|
||||
});
|
||||
|
||||
console.log('\nResult:', result.text);
|
||||
console.log('Final tool called:', result.toolCalls?.[result.toolCalls.length - 1]?.toolName);
|
||||
}
|
||||
|
||||
async function example3_customCondition() {
|
||||
console.log('\n=== Example 3: Custom stop condition ===\n');
|
||||
|
||||
const result = await generateText({
|
||||
model: openai('gpt-4'),
|
||||
tools: {
|
||||
calculate: tool({
|
||||
description: 'Perform calculation',
|
||||
inputSchema: z.object({ expression: z.string() }),
|
||||
execute: async ({ expression }) => {
|
||||
console.log(`[Tool] Calculating: ${expression}`);
|
||||
return { result: 42 };
|
||||
},
|
||||
}),
|
||||
finish: tool({
|
||||
description: 'Mark task as complete',
|
||||
inputSchema: z.object({ status: z.string() }),
|
||||
execute: async ({ status }) => {
|
||||
console.log(`[Tool] Finishing with status: ${status}`);
|
||||
return { done: true };
|
||||
},
|
||||
}),
|
||||
},
|
||||
prompt: 'Solve a math problem and finish.',
|
||||
stopWhen: (step) => {
|
||||
// Stop if:
|
||||
// - More than 5 steps, OR
|
||||
// - 'finish' tool was called
|
||||
return step.stepCount > 5 || step.hasToolCall('finish');
|
||||
},
|
||||
});
|
||||
|
||||
console.log('\nResult:', result.text);
|
||||
console.log('Stopped at step:', result.steps);
|
||||
}
|
||||
|
||||
async function main() {
|
||||
await example1_stepCount();
|
||||
await example2_specificTool();
|
||||
await example3_customCondition();
|
||||
}
|
||||
|
||||
main().catch(console.error);
|
||||
Reference in New Issue
Block a user