TaskFlow Posteingangssortierung
Dies ist ein konkretes Beispiel, wie man TaskFlow nutzen kann, ohne die Kernlaufzeit in eine DSL zu verwandeln.
Ziel
Posteingangselemente mit einem einzigen Besitzer-Flow sortieren:
- geschäftlich -> in Slack posten und auf Antwort warten
- persönlich -> Besitzer jetzt benachrichtigen
- alles andere -> für die Zusammenfassung am Ende des Tages aufheben
Muster
- Einen Flow für den Posteingangs-Batch erstellen.
- Einen abgetrennten Task ausführen, um neue Elemente zu klassifizieren.
- Den Routing-Zustand in
stateJsonspeichern. - Nur dann in den
waiting-Zustand wechseln, wenn eine externe Antwort erforderlich ist. - Den Flow fortsetzen, wenn die Klassifizierung oder die menschliche Eingabe abgeschlossen ist.
- Beenden, wenn der Batch vollständig sortiert wurde.
Empfohlene stateJson-Struktur
{
"businessThreads": [],
"personalItems": [],
"eodSummary": []
}
Empfohlenes waitJson, wenn auf Slack blockiert wird:
{
"kind": "reply",
"channel": "slack",
"threadKey": "slack:thread-1"
}
Minimale Laufzeitaufrufe
const taskFlow = api.runtime.tasks.flow.fromToolContext(ctx);
const created = taskFlow.createManaged({
controllerId: "my-plugin/inbox-triage",
goal: "Posteingang sortieren",
currentStep: "classify",
stateJson: {
businessThreads: [],
personalItems: [],
eodSummary: [],
},
});
const child = taskFlow.runTask({
flowId: created.flowId,
runtime: "acp",
childSessionKey: "agent:main:subagent:classifier",
task: "Posteingangsnachrichten klassifizieren",
status: "running",
startedAt: Date.now(),
lastEventAt: Date.now(),
});
if (!child.created) {
throw new Error(child.reason);
}
const waiting = taskFlow.setWaiting({
flowId: created.flowId,
expectedRevision: created.revision,
currentStep: "await_business_reply",
stateJson: {
businessThreads: ["slack:thread-1"],
personalItems: [],
eodSummary: [],
},
waitJson: {
kind: "reply",
channel: "slack",
threadKey: "slack:thread-1",
},
});
if (!waiting.applied) {
throw new Error(waiting.code);
}
const resumed = taskFlow.resume({
flowId: waiting.flow.flowId,
expectedRevision: waiting.flow.revision,
status: "running",
currentStep: "route_items",
stateJson: waiting.flow.stateJson,
});
if (!resumed.applied) {
throw new Error(resumed.code);
}
taskFlow.finish({
flowId: resumed.flow.flowId,
expectedRevision: resumed.flow.revision,
stateJson: resumed.flow.stateJson,
});
Verwandtes Beispiel
skills/taskflow/examples/inbox-triage.lobster