e071084ebe
govulncheck / govulncheck (push) Has been cancelled
Lint / golangci-lint (push) Has been cancelled
Run Tests / Unit Tests (push) Has been cancelled
Run Tests / Etcd Integration Tests (push) Has been cancelled
Harness (E2E) / Harnesses (mock LLM) (push) Has been cancelled
Harness (E2E) / Provider harnesses (live LLM conformance) (push) Has been cancelled
46 lines
1.9 KiB
Markdown
46 lines
1.9 KiB
Markdown
# Durable agent run resume
|
|
|
|
This example shows the agent-side counterpart to `examples/flow-durable`: an
|
|
agent run is checkpointed with the same `Checkpoint` interface used by flows,
|
|
then resumed after an interruption without repeating a completed side effect.
|
|
The sample uses an in-memory store to keep repeated local runs deterministic;
|
|
use your service store for process-restart recovery.
|
|
|
|
Run it with:
|
|
|
|
```sh
|
|
go run ./examples/agent-durable
|
|
```
|
|
|
|
The demo model calls `inventory.reserve`, then fails to mimic a process dying
|
|
after the tool call was checkpointed. `micro.AgentPending` finds the unfinished
|
|
run and `micro.AgentResume` continues it from the saved checkpoint. The final
|
|
`tool executions: 1` line is the important bit: the reservation tool was not
|
|
called a second time during resume.
|
|
|
|
## When to use this instead of a durable flow
|
|
|
|
Use a durable flow when the path is known ahead of time: ordered service calls,
|
|
retries, timers, compensation, and a precise resume stage such as `reserve` or
|
|
`charge`. Use a checkpointed agent run when the path is open-ended and the model
|
|
may choose tools dynamically, but completed tool side effects still must not be
|
|
replayed after a crash or provider failure.
|
|
|
|
They compose: keep deterministic business process in `flow-durable`, then hand
|
|
off the judgment-heavy step to a checkpointed agent when the workflow needs
|
|
model-directed tool use. Both use the same `Checkpoint` backend, so inspection
|
|
and recovery can share one run-history store.
|
|
|
|
In a service, use the same pattern at startup:
|
|
|
|
```go
|
|
pending, _ := micro.AgentPending(ctx, agent)
|
|
for _, run := range pending {
|
|
_, _ = micro.AgentResume(ctx, agent, run.ID)
|
|
}
|
|
```
|
|
|
|
`context.Context` cancellation and deadlines are still honored by checkpoint
|
|
loads/saves, model calls, and tool calls. Runs with terminal statuses such as
|
|
`done`, `canceled`, and `expired` are not returned by `AgentPending`.
|