Files
gh-jezweb-claude-skills-ski…/templates/multi-step-execution.ts
2025-11-30 08:23:50 +08:00

113 lines
3.5 KiB
TypeScript

// 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);