{"record":{"id":"33f2cde8e8b95d45","repo":"micro/go-micro","slug":"agent-resumestreamask-requires-a-checkpoint","errorCode":null,"errorMessage":"agent: ResumeStreamAsk requires a checkpoint","messagePattern":"agent: ResumeStreamAsk requires a checkpoint","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"agent/stream.go","lineNumber":142,"sourceCode":"\n\tif a.tools == nil {\n\t\ta.tools = ai.NewTools(a.opts.Registry, ai.ToolClient(a.opts.Client))\n\t}\n\tbase := a.toolHandler()\n\thandler := func(ctx context.Context, call ai.ToolCall) ai.ToolResult {\n\t\t_ = sendStreamEvent(ctx, events, &StreamEvent{Type: StreamEventToolStart, ToolCall: call})\n\t\tresult := base(ctx, call)\n\t\t_ = sendStreamEvent(ctx, events, &StreamEvent{Type: StreamEventToolEnd, ToolCall: call, Result: result})\n\t\treturn result\n\t}\n\ta.setupWithToolHandler(handler)\n\tdefer a.setupWithToolHandler(nil)\n\treturn a.askLocked(ctx, uuid.New().String(), message, a.parentRunID, nil, true)\n}\n\nfunc (a *agentImpl) resumeWithStreamEvents(ctx context.Context, runID string, events chan<- *StreamEvent) (*Response, error) {\n\tif a.opts.Checkpoint == nil {\n\t\treturn nil, errors.New(\"agent: ResumeStreamAsk requires a checkpoint\")\n\t}\n\trun, ok, err := a.opts.Checkpoint.Load(ctx, runID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif !ok {\n\t\treturn nil, errors.New(\"agent: checkpointed run not found\")\n\t}\n\tif run.Status == \"done\" {\n\t\tvar resp Response\n\t\tif err := json.Unmarshal(run.State.Data, &resp); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn &resp, nil\n\t}\n\tif terminalAgentRunStatus(run.Status) {\n\t\treturn nil, errors.New(\"agent: checkpointed run is terminal with status \" + run.Status)\n\t}","sourceCodeStart":124,"sourceCodeEnd":160,"githubUrl":"https://github.com/micro/go-micro/blob/24529f140421a11a33b6999ab7944f2021cfd69c/agent/stream.go#L124-L160","documentation":"resumeWithStreamEvents requires agent Options.Checkpoint to be configured, since resuming a run needs a store to load its checkpoint from. When no checkpoint store is set, resume is impossible and this error is returned.","triggerScenarios":"Calling ResumeStreamAsk (or ResumeStream) on an agent constructed without a Checkpoint option.","commonSituations":"Building the agent with agent.New(...) and forgetting the WithCheckpoint option; resuming across a config change that dropped the checkpoint store; default constructors that omit persistence.","solutions":["Configure a checkpoint store when constructing the agent: agent.WithCheckpoint(store)","Verify the checkpoint store is wired in the environment (e.g. DB/file backend initialized)","Guard resume calls: only resume runs for agents known to have checkpointing enabled"],"exampleFix":"// before\nag := agent.New(client, registry)\nstream, err := agent.ResumeStreamAsk(ctx, ag, runID)\n// after\nag := agent.New(client, registry, agent.WithCheckpoint(store))\nstream, err := agent.ResumeStreamAsk(ctx, ag, runID)","handlingStrategy":"validation","validationCode":"if agentCheckpointStore == nil {\n    return errors.New(\"agent not constructed with WithCheckpoint; resume unavailable\")\n}","typeGuard":null,"tryCatchPattern":"stream, err := agent.ResumeStreamAsk(ctx, ag, runID)\nif err != nil && strings.Contains(err.Error(), \"requires a checkpoint\") {\n    return fmt.Errorf(\"enable checkpointing to resume runs\")\n}","preventionTips":["Always construct resumable agents with agent.WithCheckpoint(store)","Centralize agent construction so checkpoint config is never omitted","Add a startup assertion that the checkpoint store is non-nil when resume features are enabled"],"tags":["go","agent","checkpoint","configuration"],"backgroundTag":"missing-configuration","analyzedSha":"24529f140421a11a33b6999ab7944f2021cfd69c","analyzedAt":"2026-09-01T02:52:24.923Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}