{"record":{"id":"f36c837a12ffc776","repo":"wavetermdev/waveterm","slug":"chat-not-found-s-f36c83","errorCode":null,"errorMessage":"chat not found: %s","messagePattern":"chat not found: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/aiusechat/openaichat/openaichat-backend.go","lineNumber":38,"sourceCode":"\t\"github.com/wavetermdev/waveterm/pkg/aiusechat/chatstore\"\n\t\"github.com/wavetermdev/waveterm/pkg/aiusechat/uctypes\"\n\t\"github.com/wavetermdev/waveterm/pkg/web/sse\"\n)\n\n// RunChatStep executes a chat step using the chat completions API\nfunc RunChatStep(\n\tctx context.Context,\n\tsseHandler *sse.SSEHandlerCh,\n\tchatOpts uctypes.WaveChatOpts,\n\tcont *uctypes.WaveContinueResponse,\n) (*uctypes.WaveStopReason, []*StoredChatMessage, *uctypes.RateLimitInfo, error) {\n\tif sseHandler == nil {\n\t\treturn nil, nil, nil, errors.New(\"sse handler is nil\")\n\t}\n\n\tchat := chatstore.DefaultChatStore.Get(chatOpts.ChatId)\n\tif chat == nil {\n\t\treturn nil, nil, nil, fmt.Errorf(\"chat not found: %s\", chatOpts.ChatId)\n\t}\n\n\tif chatOpts.Config.TimeoutMs > 0 {\n\t\tvar cancel context.CancelFunc\n\t\tctx, cancel = context.WithTimeout(ctx, time.Duration(chatOpts.Config.TimeoutMs)*time.Millisecond)\n\t\tdefer cancel()\n\t}\n\n\t// Convert stored messages to chat completions format\n\tvar messages []ChatRequestMessage\n\n\t// Convert native messages\n\tfor _, genMsg := range chat.NativeMessages {\n\t\tchatMsg, ok := genMsg.(*StoredChatMessage)\n\t\tif !ok {\n\t\t\treturn nil, nil, nil, fmt.Errorf(\"expected StoredChatMessage, got %T\", genMsg)\n\t\t}\n\t\tmessages = append(messages, *chatMsg.Message.clean())","sourceCodeStart":20,"sourceCodeEnd":56,"githubUrl":"https://github.com/wavetermdev/waveterm/blob/a4447c1563b2df285ab89e76c82f91e1a1a49c1e/pkg/aiusechat/openaichat/openaichat-backend.go#L20-L56","documentation":"Lookup error: the referenced chat/session ID does not exist in the OpenAI chat registry (never created, closed, or evicted).","triggerScenarios":"Calling RunChatStep with a ChatId that was never registered in the store, or after the chat was deleted/expired from chatstore.DefaultChatStore.","commonSituations":"Using a stale ChatId after a server restart (in-memory store); typo'd or client-fabricated IDs; race where another request deleted the chat between calls.","solutions":["Verify the ChatId exists (chatstore.DefaultChatStore.Get(chatOpts.ChatId) != nil) before calling RunChatStep","Create/register the chat first via the chatstore API before running a step","Refresh the ChatId from the client after store restarts","Check for code paths that delete chats unintentionally"],"exampleFix":"// before\n_, _, _, err := RunChatStep(ctx, sseHandler, ChatOpts{ChatId: someID})\n// after\nif chatstore.DefaultChatStore.Get(someID) == nil {\n    return fmt.Errorf(\"chat %s does not exist\", someID)\n}\n_, _, _, err := RunChatStep(ctx, sseHandler, ChatOpts{ChatId: someID})","handlingStrategy":"validation","validationCode":"if chatstore.DefaultChatStore.Get(chatOpts.ChatId) == nil {\n    return fmt.Errorf(\"chat %s not in store\", chatOpts.ChatId)\n}","typeGuard":null,"tryCatchPattern":"out, err := RunChatStep(ctx, sseHandler, opts)\nif err != nil && strings.Contains(err.Error(), \"chat not found\") {\n    // re-create the chat or notify the client the session expired\n}","preventionTips":["Create/register chats before running steps","Don't cache ChatIds across store restarts","Handle chat-deletion events on the client"],"tags":["not-found","chatstore","state"],"backgroundTag":"resource-not-found","analyzedSha":"a4447c1563b2df285ab89e76c82f91e1a1a49c1e","analyzedAt":"2026-09-01T15:26:23.972Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}