43a6600378
- RoleDefinition.extractMode: "single" | "react" - reactExtract: multi-turn LLM with cas_get tool for DAG traversal - Max 10 tool-call rounds, schema validation on final output - create-workflow routes to reactExtract when extractMode is "react" - All existing roles set to "single" (no behavior change) - 162 tests passing Fixes #44
54 lines
1.1 KiB
TypeScript
54 lines
1.1 KiB
TypeScript
import { createExtract, createWorkflow, END, type RoleDefinition } from "@uncaged/workflow";
|
|
import * as z from "zod/v4";
|
|
|
|
type Roles = {
|
|
greeter: { greeting: string };
|
|
};
|
|
|
|
const greeterMetaSchema = z.object({
|
|
greeting: z.string(),
|
|
});
|
|
|
|
export const descriptor = {
|
|
description: "A simple hello world workflow",
|
|
roles: {
|
|
greeter: {
|
|
description: "Generates a greeting",
|
|
schema: {
|
|
type: "object",
|
|
properties: { greeting: { type: "string" } },
|
|
required: ["greeting"],
|
|
},
|
|
},
|
|
},
|
|
};
|
|
|
|
const greeter: RoleDefinition<Roles["greeter"]> = {
|
|
description: "Generates a greeting",
|
|
systemPrompt: "You greet the user briefly.",
|
|
extractPrompt: "Extract the greeting string produced for the user.",
|
|
schema: greeterMetaSchema,
|
|
extractRefs: null,
|
|
extractMode: "single",
|
|
};
|
|
|
|
const extract = createExtract({
|
|
baseUrl: "http://127.0.0.1:9",
|
|
apiKey: "",
|
|
model: "",
|
|
});
|
|
|
|
export const run = createWorkflow<Roles>(
|
|
{
|
|
roles: { greeter },
|
|
moderator(ctx) {
|
|
return ctx.steps.length === 0 ? "greeter" : END;
|
|
},
|
|
},
|
|
{
|
|
agent: async (ctx) => `Hello, ${ctx.start.content}`,
|
|
},
|
|
extract,
|
|
null,
|
|
);
|