Documentation Index
Fetch the complete documentation index at: https://smithers.sh/llms.txt
Use this file to discover all available pages before exploring further.
import { HumanTask } from "smithers-orchestrator";
type HumanTaskProps = {
id: string;
output: z.ZodObject | Table | string;
outputSchema?: z.ZodObject; // inferred when output is a Zod schema
prompt: string | ReactNode;
maxAttempts?: number; // default 10
async?: boolean; // unrelated downstream may continue while pending
skipIf?: boolean;
timeoutMs?: number;
continueOnFail?: boolean;
dependsOn?: string[];
needs?: Record<string, string>;
label?: string;
meta?: Record<string, unknown>;
};
import { Workflow, Sequence, Task, HumanTask, createSmithers } from "smithers-orchestrator";
import { z } from "zod";
const { smithers, outputs } = createSmithers({
review: z.object({
approved: z.boolean(),
comments: z.string(),
severity: z.enum(["low", "medium", "high"]),
}),
summary: z.object({ status: z.string() }),
});
export default smithers((ctx) => {
const review = ctx.outputMaybe(outputs.review, { nodeId: "human-review" });
return (
<Workflow name="review-flow">
<Sequence>
<HumanTask
id="human-review"
output={outputs.review}
prompt="Review the PR. Provide approved (boolean), comments (string), severity (low|medium|high)."
maxAttempts={5}
timeoutMs={86_400_000}
/>
{review ? (
<Task id="record" output={outputs.summary}>
{{ status: review.approved ? "approved" : "changes-requested" }}
</Task>
) : null}
</Sequence>
</Workflow>
);
});
Notes
- Submit via
bunx smithers-orchestrator approve <runId> <nodeId> --note '<json>'.
- Failed JSON re-prompts up to
maxAttempts with zero backoff.
- Same durable deferred mechanism as
<Approval>; survives restarts.