micro/go-micro · error
no response from API
Error message
no response from API
What it means
After a successful JSON decode, callAPI checks that chatResp.Choices is non-empty; if the API returned a valid chat-completion envelope with zero choices, this plain error is thrown. It means the request technically succeeded but the model produced no selectable completion.
Source
Thrown at ai/atlascloud/atlascloud.go:470
}
return nil, nil, &atlascloudAPIError{Status: httpResp.Status, Code: httpResp.StatusCode, Retry: retryAfter, Phase: phase, Summary: atlascloudRequestSummary(req), Body: string(respBody)}
}
var chatResp struct {
Choices []struct {
Message struct {
Content string `json:"content"`
ToolCalls []atlasToolCall `json:"tool_calls"`
} `json:"message"`
} `json:"choices"`
}
if err := json.Unmarshal(respBody, &chatResp); err != nil {
return nil, nil, fmt.Errorf("failed to parse response: %w", err)
}
if len(chatResp.Choices) == 0 {
return nil, nil, fmt.Errorf("no response from API")
}
choice := chatResp.Choices[0]
response := &ai.Response{
Reply: choice.Message.Content,
}
for _, tc := range choice.Message.ToolCalls {
var input map[string]any
if err := json.Unmarshal([]byte(tc.Function.Arguments), &input); err != nil {
input = map[string]any{}
}
response.ToolCalls = append(response.ToolCalls, ai.ToolCall{
ID: tc.ID,
Name: tc.Function.Name,
Input: input,
})
}View on GitHub (pinned to 24529f1404)
Solutions
- Inspect the raw response body for a filter/finish_reason indication (log the full body before this check).
- Verify the requested model name and that the messages/prompt payload is non-empty and well-formed.
- Retry the request; if reproducible, rephrase the prompt to avoid content that may be filtered.
- Treat it as retryable transient behavior and add backoff retry at the Generate call site.
Defensive patterns
Strategy: fallback
Try / catch
resp, err := provider.Generate(ctx, req)
if err != nil {
if strings.Contains(err.Error(), "no response from API") {
// retry once or fall back to another provider/model
resp, err = provider.Generate(ctx, req)
}
if err != nil {
return err
}
} Prevention
- Always send a non-empty messages/prompt payload.
- Use model names verified against the current AtlasCloud model list.
- Inspect finish_reason / raw body when empty responses occur to detect moderation filtering.
- Add a retry with backoff for empty responses, which are often transient.
When it happens
Trigger: json.Unmarshal succeeds but len(chatResp.Choices) == 0 — the API replied 200 with choices: [] (or omitted), e.g. the request was entirely filtered or the model returned nothing.
Common situations: Prompt fully consumed by moderation/safety filtering, an invalid model name that the API accepts but yields no output, empty prompt/messages payload, or provider-side degraded responses during outages.
Understand the failure class
Background: "empty response", "returned no data", "empty embeddings": what HTTP 200-with-empty-body errors mean across libraries — this error's family across 36 libraries.
Related errors
- API request failed: %w
- failed to parse response: %w
- API error (%s): %s
- failed to parse submit response: %w
- API error: %s
AI-assisted analysis of micro/go-micro@24529f1404 (2026-09-01).
Data as JSON: /api/errors/0af0b5a8e975ec75.
Report an issue: GitHub.