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

  1. Set Provider to exactly one of: openai, anthropic, bedrock, gemini.
  2. Trim and lowercase the provider value when loading config.
  3. 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

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


AI-assisted analysis of JuliusBrussee/caveman@27d5a3981a (2026-08-15). Data as JSON: /api/errors/5daa9e482577d5c8. Report an issue: GitHub.