Loading...
Loading...
Compare original and translation side by side
workflowworkflowworkflowworkflowworkflownode_modules/workflow/docs/glob "node_modules/workflow/docs/**/*.mdx"grep "your query" node_modules/workflow/docs/node_modules/workflow/docs/getting-started/foundations/api-reference/workflow/api-reference/workflow-api/ai/errors/@workflow/ainode_modules/@workflow/ai/docs/@workflow/corenode_modules/@workflow/core/docs/@workflow/nextnode_modules/@workflow/next/docs/workflowworkflowworkflownode_modules/workflow/docs/glob "node_modules/workflow/docs/**/*.mdx"grep "your query" node_modules/workflow/docs/node_modules/workflow/docs/getting-started/foundations/api-reference/workflow/api-reference/workflow-api/ai/errors/@workflow/ainode_modules/@workflow/ai/docs/@workflow/corenode_modules/@workflow/core/docs/@workflow/nextnode_modules/@workflow/next/docs/"use workflow"; // First line - makes async function durable
"use step"; // First line - makes function a cached, retryable unit// Workflow primitives
import { sleep, fetch, createHook, createWebhook, getWritable } from "workflow";
import { FatalError, RetryableError } from "workflow";
import { getWorkflowMetadata, getStepMetadata } from "workflow";
// API operations
import { start, getRun, resumeHook, resumeWebhook } from "workflow/api";
// Framework integrations
import { withWorkflow } from "workflow/next";
import { workflow } from "workflow/vite";
import { workflow } from "workflow/astro";
// Or use modules: ["workflow/nitro"] for Nitro/Nuxt"use workflow"; // 第一行 - 使异步函数具备持久化能力
"use step"; // 第一行 - 使函数成为可缓存、可重试的单元// Workflow原语
import { sleep, fetch, createHook, createWebhook, getWritable } from "workflow";
import { FatalError, RetryableError } from "workflow";
import { getWorkflowMetadata, getStepMetadata } from "workflow";
// API操作
import { start, getRun, resumeHook, resumeWebhook } from "workflow/api";
// 框架集成
import { withWorkflow } from "workflow/next";
import { workflow } from "workflow/vite";
import { workflow } from "workflow/astro";
// 或使用模块:["workflow/nitro"] 用于Nitro/Nuxt"use workflow""use step"// Steps have full Node.js and npm access
async function fetchUserData(userId: string) {
"use step";
const response = await fetch(`https://api.example.com/users/${userId}`);
return response.json();
}
async function processWithAI(data: any) {
"use step";
// AI SDK works in steps without workarounds
return await generateText({
model: openai("gpt-4"),
prompt: `Process: ${JSON.stringify(data)}`,
});
}
// Workflow orchestrates steps - no sandbox issues
export async function dataProcessingWorkflow(userId: string) {
"use workflow";
const data = await fetchUserData(userId);
const processed = await processWithAI(data);
return { success: true, processed };
}"use workflow""use step"// Step拥有完整的Node.js和npm访问权限
async function fetchUserData(userId: string) {
"use step";
const response = await fetch(`https://api.example.com/users/${userId}`);
return response.json();
}
async function processWithAI(data: any) {
"use step";
// AI SDK在step中无需变通即可工作
return await generateText({
model: openai("gpt-4"),
prompt: `Process: ${JSON.stringify(data)}`,
});
}
// Workflow编排step - 无沙箱问题
export async function dataProcessingWorkflow(userId: string) {
"use workflow";
const data = await fetchUserData(userId);
const processed = await processWithAI(data);
return { success: true, processed };
}| Limitation | Workaround |
|---|---|
No | |
No | Use |
| No Node.js modules (fs, crypto, etc.) | Move to a step function |
import { fetch } from "workflow";
export async function myWorkflow() {
"use workflow";
globalThis.fetch = fetch; // Required for AI SDK and HTTP libraries
// Now generateText() and other libraries work
}DurableAgent@workflow/ai| 限制 | 解决方法 |
|---|---|
无 | 从 |
无 | 使用 |
| 无Node.js模块(fs、crypto等) | 移至step函数中 |
import { fetch } from "workflow";
export async function myWorkflow() {
"use workflow";
globalThis.fetch = fetch; // AI SDK和HTTP库需要此设置
// 现在generateText()和其他库可以正常工作
}@workflow/aiDurableAgentFatalErrorRetryableErrorimport { FatalError, RetryableError } from "workflow";
if (res.status >= 400 && res.status < 500) {
throw new FatalError(`Client error: ${res.status}`);
}
if (res.status === 429) {
throw new RetryableError("Rate limited", { retryAfter: "5m" });
}FatalErrorRetryableErrorimport { FatalError, RetryableError } from "workflow";
if (res.status >= 400 && res.status < 500) {
throw new FatalError(`客户端错误:${res.status}`);
}
if (res.status === 429) {
throw new RetryableError("请求受限", { retryAfter: "5m" });
}getWritable()async function streamData() {
"use step"; // Required - streaming only works in steps
const writer = getWritable();
await writer.write(data);
writer.releaseLock(); // Always release the lock
}
// Close when done
await getWritable().close();getWritable()async function streamData() {
"use step"; // 必须设置 - 流式处理仅在step中生效
const writer = getWritable();
await writer.write(data);
writer.releaseLock(); // 务必释放锁
}
// 完成后关闭
await getWritable().close();undefinedundefined
**Tip:** Only import workflow APIs you actually use. Unused imports can cause 500 errors.
**提示:** 仅导入实际使用的workflow API。未使用的导入可能导致500错误。",