Skip to content

Nil pointer dereference on no credits from openrouter. #304

@EliRibble

Description

@EliRibble

I set up plandex on a NixOS server using docker compose. I added an openrouter API key, but hadn't yet purchased any credits. Got this in the docker-compose log:

plandex-server-1    | 2025/10/20 15:39:19.514807 model_error.go:39: Classifying error message: error creating chat completion stream: status code: 402, body: {"error":{"message":"Insufficient credits. This account never purchased credits.
Make sure your key is on the correct account or org, and if so, purchase more at https://openrouter.ai/settings/credits","code":402}}
plandex-server-1    | 2025/10/20 15:39:19.514846 model_error.go:85: No error classification based on message
plandex-server-1    | 2025/10/20 15:39:19.514878 client_stream.go:330: withStreamingRetries - retrying stream in 1.194s seconds
plandex-server-1    | 2025/10/20 15:39:20.709452 client_stream.go:261: withStreamingRetries - will run operation
plandex-server-1    | 2025/10/20 15:39:20.709613 client_stream.go:263: (map[string]interface {}) (len=3) {
plandex-server-1    |  (string) (len=13) "numTotalRetry": (int) 1,
plandex-server-1    |  (string) (len=19) "didProviderFallback": (bool) false,
plandex-server-1    |  (string) (len=8) "modelErr": (*shared.ModelError)(0xc0010d4fa0)({
plandex-server-1    |   Kind: (shared.ModelErrKind) (len=8) "ErrOther",
plandex-server-1    |   Retriable: (bool) true,
plandex-server-1    |   RetryAfterSeconds: (int) 0
plandex-server-1    |  })
plandex-server-1    | }
plandex-server-1    |
plandex-server-1    | 2025/10/20 15:39:20.709684 client_stream.go:99: processChatCompletionStream - modelConfig (map[string]interface {}) (len=1) {
plandex-server-1    |  (string) (len=5) "model": (shared.ModelId) (len=19) "openai/gpt-4.1-mini"
plandex-server-1    | }
plandex-server-1    |
plandex-server-1    | 2025/10/20 15:39:20.847640 client_stream.go:274: withStreamingRetries - operation returned error: error creating chat completion stream: status code: 402, body: {"error":{"message":"Insufficient credits. This account
never purchased credits. Make sure your key is on the correct account or org, and if so, purchase more at https://openrouter.ai/settings/credits","code":402}}
plandex-server-1    | 2025/10/20 15:39:20.847687 client_stream.go:291: Error in streaming operation: error creating chat completion stream: status code: 402, body: {"error":{"message":"Insufficient credits. This account never purchased cre
dits. Make sure your key is on the correct account or org, and if so, purchase more at https://openrouter.ai/settings/credits","code":402}}, isFallback: false, numTotalRetry: 1, numFallbackRetry: 0, numRetry: 1, compareRetries: 1, maxRetri
es: 3
plandex-server-1    | 2025/10/20 15:39:20.847921 tell_load.go:72: panic in getPlanSettings: runtime error: invalid memory address or nil pointer dereference
plandex-server-1    | goroutine 1627 [running]:
plandex-server-1    | runtime/debug.Stack()
plandex-server-1    |   /usr/local/go/src/runtime/debug/stack.go:26 +0x5e
plandex-server-1    | plandex-server/model/plan.(*activeTellStreamState).loadTellPlan.func1.1.1()
plandex-server-1    |   /app/server/model/plan/tell_load.go:72 +0x48
plandex-server-1    | panic({0xeb4060?, 0x391e5b0?})
plandex-server-1    |   /usr/local/go/src/runtime/panic.go:785 +0x132
plandex-server-1    | plandex-server/model.withStreamingRetries[...]({0x1215fd0?, 0xc002ad5030}, 0xc0031271b8, 0x102ecd8)
plandex-server-1    |   /app/server/model/client_stream.go:293 +0x6ab
plandex-server-1    | plandex-server/model.CreateChatCompletionWithInternalStream(_, _, _, _, _, {_, _}, {_, _}, {0x1215fd0, ...}, ...)
plandex-server-1    |   /app/server/model/client_stream.go:55 +0x3dd
plandex-server-1    | plandex-server/model.ModelRequest({_, _}, {0xc005d811d0, 0xc005d810e0, 0xc006b40f30, 0xc000542000, 0xc0015b56c0, 0xc000f5aa20, 0xc0010d45c0, {0xf7a6e2, ...}, ...})
plandex-server-1    |   /app/server/model/model_request.go:173 +0x1053
plandex-server-1    | plandex-server/model.GenPlanName(0xc006b40f30, 0xc000542000, 0xc000f5aa20, 0xc0010d45c0, 0xc005d811d0, 0xc005d810e0, {0xc005cda380, 0x311}, {0xc005ce3050, 0x24}, ...)
plandex-server-1    |   /app/server/model/name.go:69 +0x4ce
plandex-server-1    | plandex-server/model/plan.(*activeTellStreamState).loadTellPlan.func1.1()
plandex-server-1    |   /app/server/model/plan/tell_load.go:95 +0x51d
plandex-server-1    | created by plandex-server/model/plan.(*activeTellStreamState).loadTellPlan.func1 in goroutine 1626
plandex-server-1    |   /app/server/model/plan/tell_load.go:69 +0x2ee

Looks like the error cascaded through further after that:

plandex-server-1    | 2025/10/20 15:39:20.848650 state.go:47: apiErr: 500 Error: Error loading plan: panic getting plan settings: runtime error: invalid memory address or nil pointer dereference
plandex-server-1    | goroutine 1627 [running]:
plandex-server-1    | runtime/debug.Stack()
plandex-server-1    |   /usr/local/go/src/runtime/debug/stack.go:26 +0x5e
plandex-server-1    | plandex-server/model/plan.(*activeTellStreamState).loadTellPlan.func1.1.1()
plandex-server-1    |   /app/server/model/plan/tell_load.go:73 +0x10a
plandex-server-1    | panic({0xeb4060?, 0x391e5b0?})
plandex-server-1    |   /usr/local/go/src/runtime/panic.go:785 +0x132
plandex-server-1    | plandex-server/model.withStreamingRetries[...]({0x1215fd0?, 0xc002ad5030}, 0xc0031271b8, 0x102ecd8)
plandex-server-1    |   /app/server/model/client_stream.go:293 +0x6ab
plandex-server-1    | plandex-server/model.CreateChatCompletionWithInternalStream(_, _, _, _, _, {_, _}, {_, _}, {0x1215fd0, ...}, ...)
plandex-server-1    |   /app/server/model/client_stream.go:55 +0x3dd
plandex-server-1    | plandex-server/model.ModelRequest({_, _}, {0xc005d811d0, 0xc005d810e0, 0xc006b40f30, 0xc000542000, 0xc0015b56c0, 0xc000f5aa20, 0xc0010d45c0, {0xf7a6e2, ...}, ...})
plandex-server-1    |   /app/server/model/model_request.go:173 +0x1053
plandex-server-1    | plandex-server/model.GenPlanName(0xc006b40f30, 0xc000542000, 0xc000f5aa20, 0xc0010d45c0, 0xc005d811d0, 0xc005d810e0, {0xc005cda380, 0x311}, {0xc005ce3050, 0x24}, ...)
plandex-server-1    |   /app/server/model/name.go:69 +0x4ce
plandex-server-1    | plandex-server/model/plan.(*activeTellStreamState).loadTellPlan.func1.1()
plandex-server-1    |   /app/server/model/plan/tell_load.go:95 +0x51d
plandex-server-1    | created by plandex-server/model/plan.(*activeTellStreamState).loadTellPlan.func1 in goroutine 1626
plandex-server-1    |   /app/server/model/plan/tell_load.go:69 +0x2ee
plandex-server-1    |
plandex-server-1    | 2025/10/20 15:39:20.848720 state.go:63: Error streaming plan 74885e85-6057-415e-bddc-b8ec06774773: 500 Error: Error loading plan: panic getting plan settings: runtime error: invalid memory address or nil pointer deref
erence
plandex-server-1    | goroutine 1627 [running]:
plandex-server-1    | runtime/debug.Stack()
plandex-server-1    |   /usr/local/go/src/runtime/debug/stack.go:26 +0x5e
plandex-server-1    | plandex-server/model/plan.(*activeTellStreamState).loadTellPlan.func1.1.1()
plandex-server-1    |   /app/server/model/plan/tell_load.go:73 +0x10a
plandex-server-1    | panic({0xeb4060?, 0x391e5b0?})
plandex-server-1    |   /usr/local/go/src/runtime/panic.go:785 +0x132
plandex-server-1    | plandex-server/model.withStreamingRetries[...]({0x1215fd0?, 0xc002ad5030}, 0xc0031271b8, 0x102ecd8)
plandex-server-1    |   /app/server/model/client_stream.go:293 +0x6ab
plandex-server-1    | plandex-server/model.CreateChatCompletionWithInternalStream(_, _, _, _, _, {_, _}, {_, _}, {0x1215fd0, ...}, ...)
plandex-server-1    |   /app/server/model/client_stream.go:55 +0x3dd
plandex-server-1    | plandex-server/model.ModelRequest({_, _}, {0xc005d811d0, 0xc005d810e0, 0xc006b40f30, 0xc000542000, 0xc0015b56c0, 0xc000f5aa20, 0xc0010d45c0, {0xf7a6e2, ...}, ...})
plandex-server-1    |   /app/server/model/model_request.go:173 +0x1053
plandex-server-1    | plandex-server/model.GenPlanName(0xc006b40f30, 0xc000542000, 0xc000f5aa20, 0xc0010d45c0, 0xc005d811d0, 0xc005d810e0, {0xc005cda380, 0x311}, {0xc005ce3050, 0x24}, ...)
plandex-server-1    |   /app/server/model/name.go:69 +0x4ce
plandex-server-1    | plandex-server/model/plan.(*activeTellStreamState).loadTellPlan.func1.1()
plandex-server-1    |   /app/server/model/plan/tell_load.go:95 +0x51d
plandex-server-1    | created by plandex-server/model/plan.(*activeTellStreamState).loadTellPlan.func1 in goroutine 1626
plandex-server-1    |   /app/server/model/plan/tell_load.go:69 +0x2ee
plandex-server-1    |
plandex-server-1    | 2025/10/20 15:39:20.848403 tell_load.go:341: execTellPlan: error loading tell plan: panic getting plan settings: runtime error: invalid memory address or nil pointer dereference
plandex-server-1    | goroutine 1627 [running]:
plandex-server-1    | runtime/debug.Stack()
plandex-server-1    |   /usr/local/go/src/runtime/debug/stack.go:26 +0x5e
plandex-server-1    | plandex-server/model/plan.(*activeTellStreamState).loadTellPlan.func1.1.1()
plandex-server-1    |   /app/server/model/plan/tell_load.go:73 +0x10a
plandex-server-1    | panic({0xeb4060?, 0x391e5b0?})
plandex-server-1    |   /usr/local/go/src/runtime/panic.go:785 +0x132
plandex-server-1    | plandex-server/model.withStreamingRetries[...]({0x1215fd0?, 0xc002ad5030}, 0xc0031271b8, 0x102ecd8)
plandex-server-1    |   /app/server/model/client_stream.go:293 +0x6ab
plandex-server-1    | plandex-server/model.CreateChatCompletionWithInternalStream(_, _, _, _, _, {_, _}, {_, _}, {0x1215fd0, ...}, ...)
plandex-server-1    |   /app/server/model/client_stream.go:55 +0x3dd
plandex-server-1    | plandex-server/model.ModelRequest({_, _}, {0xc005d811d0, 0xc005d810e0, 0xc006b40f30, 0xc000542000, 0xc0015b56c0, 0xc000f5aa20, 0xc0010d45c0, {0xf7a6e2, ...}, ...})
plandex-server-1    |   /app/server/model/model_request.go:173 +0x1053
plandex-server-1    | plandex-server/model.GenPlanName(0xc006b40f30, 0xc000542000, 0xc000f5aa20, 0xc0010d45c0, 0xc005d811d0, 0xc005d810e0, {0xc005cda380, 0x311}, {0xc005ce3050, 0x24}, ...)
plandex-server-1    |   /app/server/model/name.go:69 +0x4ce
plandex-server-1    | plandex-server/model/plan.(*activeTellStreamState).loadTellPlan.func1.1()
plandex-server-1    |   /app/server/model/plan/tell_load.go:95 +0x51d
plandex-server-1    | created by plandex-server/model/plan.(*activeTellStreamState).loadTellPlan.func1 in goroutine 1626
plandex-server-1    |   /app/server/model/plan/tell_load.go:69 +0x2ee
plandex-server-1    |
plandex-server-1    | 2025/10/20 15:39:20.851677 locks.go:511: [Lock][Delete][1607] Lock released: c5c654b0-4ebc-4fb1-9184-c5794f0f5984 for plan 74885e85-6057-415e-bddc-b8ec06774773 | load tell plan

and

plandex-server-1    | 2025/10/20 15:39:20.860556 state.go:72: Sending error message to client
plandex-server-1    | 2025/10/20 15:39:20.860637 active_plan.go:198: ActivePlan.Stream: skipping buffer for special message
plandex-server-1    | 2025/10/20 15:39:20.860887 active_plan.go:199: (shared.StreamMessage) {
plandex-server-1    |  Type: (shared.StreamMessageType) (len=5) "error",
plandex-server-1    |  ReplyChunk: (string) "",
plandex-server-1    |  BuildInfo: (*shared.BuildInfo)(<nil>),
plandex-server-1    |  Description: (*shared.ConvoMessageDescription)(<nil>),
plandex-server-1    |  Error: (*shared.ApiError)(0xc0004159c0)(500 Error: Error loading plan: panic getting plan settings: runtime error: invalid memory address or nil pointer dereference
plandex-server-1    | goroutine 1627 [running]:
plandex-server-1    | runtime/debug.Stack()
plandex-server-1    |   /usr/local/go/src/runtime/debug/stack.go:26 +0x5e
plandex-server-1    | plandex-server/model/plan.(*activeTellStreamState).loadTellPlan.func1.1.1()
plandex-server-1    |   /app/server/model/plan/tell_load.go:73 +0x10a
plandex-server-1    | panic({0xeb4060?, 0x391e5b0?})
plandex-server-1    |   /usr/local/go/src/runtime/panic.go:785 +0x132
plandex-server-1    | plandex-server/model.withStreamingRetries[...]({0x1215fd0?, 0xc002ad5030}, 0xc0031271b8, 0x102ecd8)
plandex-server-1    |   /app/server/model/client_stream.go:293 +0x6ab
plandex-server-1    | plandex-server/model.CreateChatCompletionWithInternalStream(_, _, _, _, _, {_, _}, {_, _}, {0x1215fd0, ...}, ...)
plandex-server-1    |   /app/server/model/client_stream.go:55 +0x3dd
plandex-server-1    | plandex-server/model.ModelRequest({_, _}, {0xc005d811d0, 0xc005d810e0, 0xc006b40f30, 0xc000542000, 0xc0015b56c0, 0xc000f5aa20, 0xc0010d45c0, {0xf7a6e2, ...}, ...})
plandex-server-1    |   /app/server/model/model_request.go:173 +0x1053
plandex-server-1    | plandex-server/model.GenPlanName(0xc006b40f30, 0xc000542000, 0xc000f5aa20, 0xc0010d45c0, 0xc005d811d0, 0xc005d810e0, {0xc005cda380, 0x311}, {0xc005ce3050, 0x24}, ...)
plandex-server-1    |   /app/server/model/name.go:69 +0x4ce
plandex-server-1    | plandex-server/model/plan.(*activeTellStreamState).loadTellPlan.func1.1()
plandex-server-1    |   /app/server/model/plan/tell_load.go:95 +0x51d
plandex-server-1    | created by plandex-server/model/plan.(*activeTellStreamState).loadTellPlan.func1 in goroutine 1626
plandex-server-1    |   /app/server/model/plan/tell_load.go:69 +0x2ee
plandex-server-1    | ),
plandex-server-1    |  MissingFilePath: (string) "",
plandex-server-1    |  MissingFileAutoContext: (bool) false,
plandex-server-1    |  ModelStreamId: (string) "",
plandex-server-1    |  LoadContextFiles: ([]string) <nil>,
plandex-server-1    |  InitPrompt: (string) "",
plandex-server-1    |  InitReplies: ([]string) <nil>,
plandex-server-1    |  InitBuildOnly: (bool) false,
plandex-server-1    |  StreamMessages: ([]shared.StreamMessage) <nil>
plandex-server-1    | }
plandex-server-1    |
plandex-server-1    | 2025/10/20 15:39:20.862002 state.go:79: Stopping any active summary stream

Obviously my fault - I should buy credits - but I thought the stack traces would be useful for finding where to put nil pointer checks and graceful error handling.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions