BoundaryML/baml · error

failed to get output tokens

Error message

failed to get output tokens: %w

What it means

Analogous to InputTokens, OutputTokens() calls the 'output_tokens' method on the internal raw usage object; failure is wrapped with 'failed to get output tokens: %w'. Means the underlying usage data could not be retrieved.

Solutions

  1. Read usage only after the call or stream completes successfully
  2. Check errors from the LLM call first before usage access
  3. Upgrade/align BAML Go client and runtime versions
  4. Unwrap the error to diagnose the underlying method failure

Example fix

// before
go func() { u, _ := stream.Usage(); out, _ := u.OutputTokens() }()
// after
if err := stream.Done(); err != nil { return err }
out, err := stream.Usage().OutputTokens()
if err != nil { return err }
Defensive patterns

Strategy: try-catch

Validate before calling

if err := stream.Done(); err != nil {
    return fmt.Errorf("stream incomplete: %w", err)
}

Try / catch

out, err := usage.OutputTokens()
if err != nil {
    return 0, fmt.Errorf("output token read failed: %w", err)
}

Prevention

When it happens

Trigger: Calling Usage().OutputTokens() on a call/stream that hasn't completed or failed, so the raw object lacks output_tokens.

Common situations: Reading token counts from streaming calls before Done(); usage stats absent from a provider response; runtime/client version mismatch.

Understand the failure class

Background: "invalid response format", "malformed payload", "missing data field": when an API returns 200 but the response shape is wrong — this error's family across 23 libraries.

Related errors


AI-assisted analysis of BoundaryML/baml@bd85ce9dee (2026-09-12). Data as JSON: /api/errors/cfb69a9427b75edd. Report an issue: GitHub.

Appendix: source

Thrown at engine/language_client_go/pkg/rawobjects_usage.go:44

func (u *usage) InputTokens() (int64, error) {
	result, err := raw_objects.CallMethod(u, "input_tokens", nil)
	if err != nil {
		return 0, fmt.Errorf("failed to get input tokens: %w", err)
	}

	tokens, ok := result.(int64)
	if !ok {
		return 0, fmt.Errorf("unexpected type for input tokens: %T", result)
	}

	return tokens, nil
}

func (u *usage) OutputTokens() (int64, error) {
	result, err := raw_objects.CallMethod(u, "output_tokens", nil)
	if err != nil {
		return 0, fmt.Errorf("failed to get output tokens: %w", err)
	}

	tokens, ok := result.(int64)
	if !ok {
		return 0, fmt.Errorf("unexpected type for output tokens: %T", result)
	}

	return tokens, nil
}

func (u *usage) CachedInputTokens() (int64, error) {
	result, err := raw_objects.CallMethod(u, "cached_input_tokens", nil)
	if err != nil {
		return 0, fmt.Errorf("failed to get cached input tokens: %w", err)
	}

	tokens, ok := result.(int64)
	if !ok {

View on GitHub (pinned to bd85ce9dee)