defineEntrypoint
workflow.defineEntrypoint<Input, Output>() 定义 Workflow 项目中的一个可独立运行入口。每个入口拥有自己的 workflow、参数、输入构造、工具、token usage、调试 registry 和上下文扩展;平台选择入口后只执行该入口,不会先执行默认入口。
入口是同一项目下的扁平运行目录,不表示父子调用关系。需要把多个业务流程组合在一次 run 中时,应在 workflow 内显式调用 workflow.runProject()。
签名
workflow.defineEntrypoint<Input, Output>(
definition: EntrypointDefinition<Input, Output>,
): EntrypointDefinition<Input, Output>
入口可选的分区元数据是静态对象:
interface EntrypointGroupDefinition {
id: string;
title: string;
order?: number;
}
字段
| 字段 | 类型 | 说明 |
|---|---|---|
id | string | 项目内唯一入口 ID。必须匹配 /^[a-z][a-z0-9_-]{0,63}$/。 |
title | string | 非空展示标题。CLI Web、日志和回放使用该标题。 |
description | string | 可选的入口说明。 |
group | EntrypointGroupDefinition | 可选的入口分区。相同分区 id 的入口必须使用完全一致的 title 和 order。 |
workflow | Definition<Input, Output> | 该入口实际执行的 workflow。必填。 |
params | ParamDeclaration[] | 该入口的有序参数与动作入口声明,详见 defineExecutor 参数。 |
createInput | (context) => Input | 把该入口的 args 和 paramValues 转成 workflow input。必填。 |
resolveParams | (context) => ParamResolveResult | 该入口的参数联动回调。 |
requiredProviders | ExecutorProviderName[] | 该入口需要的 provider;当前内置名称只有 "llm"。 |
tools | ToolPermissionDefinition[] | 该入口允许调用的工具和默认审批策略。 |
tokenUsage | TokenUsageDefinition | 该入口的 token 用量统计配置。 |
registry | NodeRegistryEntry[] | 该入口可单独调试的节点。 |
createContext | (context) => Partial<RunContext> | 为该入口增补 providers、metadata 和 hooks。KV、PersistentValue、conversation 和 files 仍由 runtime 注入。 |
createInput、resolveParams、registry entry 的 createInput 和 createContext 都会收到 ExecutorContext。Workflow 入口运行时,entrypointId 和 entrypointTitle 为当前所选入口;runtime 也会把这两个字段写入 RunContext.metadata、runtime event 和最终 report。
Executor 目录
Workflow executor 必须声明一个静态默认入口和非空入口数组:
export const executor = workflow.defineExecutor({
projectType: "workflow",
defaultEntrypoint: "main",
entrypoints: [
workflow.defineEntrypoint<MainInput, MainOutput>({
id: "main",
title: "完整流程",
group: { id: "operations", title: "业务操作", order: 10 },
workflow: mainProject,
params: [],
createInput() {
return { errCode: 0, errMessage: "" };
},
}),
workflow.defineEntrypoint<ValidateInput, ValidateOutput>({
id: "validate",
title: "数据校验",
description: "仅执行校验阶段。",
group: { id: "operations", title: "业务操作", order: 10 },
workflow: validateProject,
params: [],
createInput() {
return { errCode: 0, errMessage: "" };
},
}),
],
});
省略入口选择时运行 defaultEntrypoint。显式选择 validate 时只运行 validateProject;mainProject 不会先执行。
静态结构规则
steamharness structure 不执行配置代码,因此入口目录必须可以静态读取:
entrypoints必须是非空数组字面量。- 每一项必须直接调用
workflow.defineEntrypoint({ ... })。 id、title、可选description和defaultEntrypoint必须是静态字符串。group必须是静态内联对象;id、title必须是非空静态字符串,order(如果存在)必须是非负整数。- 同一个
group.id的所有入口必须完全一致地声明title和order,包括order未设置与已设置的差异。 workflow必须引用项目源码中由workflow.defineProject(...)定义的标识符;可以通过项目内相对路径使用命名、别名或 default import。Structure 会按实际 import/export 绑定解析定义,未引用的同名定义、外部包值或动态构造值都会产生 violation。- ID 必须合法且不能重复;
defaultEntrypoint必须命中其中一项。 - Workflow executor 不再接受顶层
workflow、params、createInput、resolveParams、requiredProviders、tools、tokenUsage、registry或createContext。这些字段必须移动到具体入口。
结构报告在项目级返回 defaultEntrypoint 和 entrypoints[]。每个入口包含 id、title、可选 description、group、projectName、execution、展平的 params、保存动作顺序的 paramLayout、paramResolver、tools、tokenUsage 和 registry;Workflow 不再返回顶层 params 或 execution 兼容字段,也不会把各入口的 registry 聚合到 definitions.registry。静态分析无法读取或发现分区元数据冲突时,会在 diagnostics.violations 中报告明确原因。
状态与隔离
入口只隔离运行配置和界面草稿,不改变项目数据作用域:
| 数据 | 行为 |
|---|---|
| run / report / history | 每次运行记录实际入口 ID 和标题快照。 |
| 参数、附件、工具策略草稿 | 宿主按项目、解析目标和入口隔离。 |
| 入口分区展开状态 | 共享运行界面和 CLI Web 仅在声明了至少一个分区时启用分区界面;按 projectId + resolved target 使用版本化 localStorage 键持久化分区展开状态,未分组入口归入本地化“未分组”分区。 |
| registry / debug node | 只读取所选入口的 registry。 |
context.storage.local/server | 同一项目的入口继续共享每个位置的 workflow namespace。需要业务隔离时由 workflow 自行设计 key。 |
| Conversation | 不使用 defineEntrypoint,也不接受入口选择。 |
错误
| 情况 | 错误类型 | 说明 |
|---|---|---|
| ID 非法、标题为空或入口重复 | input_validation | runtime 拒绝定义,structure 同时报告 violation。 |
| 分区不是静态内联对象、字段无效或同一 ID 的元数据冲突 | input_validation | runtime 拒绝定义;静态分析和 structure report 在对应位置报告 violation。 |
| 默认入口不存在 | input_validation | executor 无法加载。 |
| 运行未知入口 | input_validation | 错误 metadata 包含默认入口和允许入口列表。 |
| Conversation 接收入口参数 | input_validation | Conversation 保持单入口,不会忽略或回退该参数。 |