plandex-ai/plandex · error

no describePlan function call found in response

Error message

no describePlan function call found in response

What it means

In the non-XML path, genPlanDescription forces a describePlan function/tool call; if the model returns empty content (no tool call payload), the server reports that no describePlan function call was found and returns a 500 ApiError. This indicates the provider never produced the forced tool invocation.

Source

Thrown at app/server/model/plan/commit_msg.go:145

	var commitMsg string

	if baseModelConfig.PreferredOutputFormat == shared.ModelOutputFormatXml {
		commitMsg = utils.GetXMLContent(content, "commitMsg")
		if commitMsg == "" {
			go notify.NotifyErr(notify.SeverityError, fmt.Errorf("no commitMsg tag found in XML response"))

			return nil, &shared.ApiError{
				Type:   shared.ApiErrorTypeOther,
				Status: http.StatusInternalServerError,
				Msg:    "No commitMsg tag found in XML response",
			}
		}
	} else {

		if content == "" {
			fmt.Println("no describePlan function call found in response")

			go notify.NotifyErr(notify.SeverityError, fmt.Errorf("no describePlan function call found in response"))

			return nil, &shared.ApiError{
				Type:   shared.ApiErrorTypeOther,
				Status: http.StatusInternalServerError,
				Msg:    "No describePlan function call found in response. The model failed to generate a valid response.",
			}
		}

		var desc shared.ConvoMessageDescription
		err = json.Unmarshal([]byte(content), &desc)
		if err != nil {
			fmt.Printf("Error unmarshalling plan description response: %v\n", err)

			go notify.NotifyErr(notify.SeverityError, fmt.Errorf("error unmarshalling plan description response: %v", err))

			return nil, &shared.ApiError{
				Type:   shared.ApiErrorTypeOther,
				Status: http.StatusInternalServerError,

View on GitHub (pinned to e2d772072e)

Solutions

  1. Verify the CommitMsg model supports function calling and tool_choice forced invocation
  2. Bypass proxies/gateways that may strip the tools/tool_choice fields and retry
  3. Check provider status/incidents for empty-completion behavior
  4. Switch the CommitMsg model to one with known tool-calling support

Example fix

// before: model without tool support
"CommitMsg": {"ModelName": "some-legacy-completion-model"}
// after: tool-calling capable model
"CommitMsg": {"ModelName": "gpt-4o-mini"}
Defensive patterns

Strategy: fallback

Validate before calling

// confirm the model supports tool calls before wiring it into the CommitMsg pack
supportsTools, err := providerSupportsFunctionCalling(modelName)
if err != nil || !supportsTools { log.Fatal("CommitMsg model must support function calling") }

Try / catch

desc, apiErr := genPlanDescription(...)
if apiErr != nil && strings.Contains(apiErr.Msg, "describePlan function call") {
    // use a locally generated summary instead of the LLM one
    return localCommitMsg(currentPlanState), nil
}

Prevention

When it happens

Trigger: The model provider doesn't support forced tool_choice for the configured model; the response stream ended with empty content due to a provider error, content filter, or max_tokens=0-like truncation; the model pack's CommitMsg entry is misconfigured with a chat model lacking tool support.

Common situations: Using a model (e.g., older open-source endpoints, some proxies/gateways) that silently drops the tools parameter; proxy stripping function-calling fields; provider returning empty completions during incidents.

Related errors


AI-assisted analysis of plandex-ai/plandex@e2d772072e (2026-09-05). Data as JSON: /api/errors/319d1efcf74224a5. Report an issue: GitHub.