JuliusBrussee/caveman · error
unsupported corpus provider %q
Error message
unsupported corpus provider %q
What it means
corpusProviderBody switches on provider.Provider and only knows 'openai', 'anthropic', 'bedrock', and 'gemini'. Any other value — including case variants and typos — hits the default branch and is rejected with the offending value quoted.
Source
Thrown at cacheengine/cachebench/corpus.go:722
if err := encoder.Encode(message); err != nil {
return "", err
}
}
return hex.EncodeToString(digest.Sum(nil)), nil
}
func corpusProviderBody(provider ProviderConfig, messages []CorpusMessage) ([]byte, error) {
switch provider.Provider {
case "openai":
return json.Marshal(map[string]any{"model": provider.Model, "max_completion_tokens": 256, "messages": messages})
case "anthropic":
return anthropicCorpusBody(provider.Model, messages)
case "bedrock":
return bedrockCorpusBody(messages)
case "gemini":
return geminiCorpusBody(messages)
default:
return nil, fmt.Errorf("unsupported corpus provider %q", provider.Provider)
}
}
func contentText(content json.RawMessage) (string, error) {
if len(content) == 0 || bytes.Equal(bytes.TrimSpace(content), []byte("null")) {
return "", nil
}
var text string
if err := json.Unmarshal(content, &text); err == nil {
return text, nil
}
return "", errors.New("corpus provider conversion supports string or null content")
}
func anthropicCorpusBody(model string, messages []CorpusMessage) ([]byte, error) {
var system []string
converted := make([]any, 0, len(messages))
for _, message := range messages {View on GitHub (pinned to 27d5a3981a)
Solutions
- Set Provider to exactly one of: openai, anthropic, bedrock, gemini.
- Trim and lowercase the provider value when loading config.
- Fail fast at config-load time with an allow-list check so the typo surfaces before a long replay starts.
Example fix
// before
provider := ProviderConfig{Provider: "OpenAI", Model: "gpt-4o"}
// after
provider := ProviderConfig{Provider: "openai", Model: "gpt-4o"} Defensive patterns
Strategy: type-guard
Type guard
func supportedProvider(p string) bool {
switch p {
case "openai", "anthropic", "bedrock", "gemini":
return true
}
return false
} Try / catch
body, err := corpusProviderBody(provider, msgs)
if err != nil && strings.Contains(err.Error(), "unsupported corpus provider") {
log.Fatalf("fix provider config: %v", err)
} Prevention
- Centralize provider names as constants and reuse them in config.
- Lowercase/trim provider strings when parsing config files.
- Fail config validation at startup, not mid-replay.
When it happens
Trigger: Building a trace or provider body with ProviderConfig.Provider set to anything except the four exact lowercase strings, e.g. 'OpenAI', 'azure', or an empty string.
Common situations: Config file copied from another tool using different provider names ('azure-openai', 'vertex'); trailing whitespace or capitalization in YAML/JSON config; defaulting logic that leaves Provider empty when unset.
Related errors
- cachebench: session %q request %d: %w
- cachebench: observation request %q provider/epoch mismatch
- cachebench: no providers
- cachebench: provider population exceeds 1024
- cachebench: invalid observation read limits
AI-assisted analysis of JuliusBrussee/caveman@27d5a3981a (2026-08-15).
Data as JSON: /api/errors/5daa9e482577d5c8.
Report an issue: GitHub.