package promptkit import "fmt" // GenerationError reports a non-2xx response from Promptkit's built-in // OpenAI-compatible client during [Engine.Run] or [Engine.RunPrepared]. // // Engine-produced values are immutable, caller-owned values. Use errors.Is to // match [ErrLLMGenerate] and errors.As with a *GenerationError target to obtain // this type. The four provider accessors expose untrusted provider-controlled // values that can contain sensitive request or schema fragments. Applications // must apply their own disclosure policy before logging, displaying, or // returning them to another caller. // // Accessors, Error, GoString, and Unwrap are safe on a nil receiver and a zero // value. Default and Go-syntax formatting deliberately redact provider details. // GenerationError has no stable JSON representation. type GenerationError struct { statusCode int providerCode string providerType string providerMessage string } func newGenerationError(statusCode int, providerCode, providerType, providerMessage string) *GenerationError { return &GenerationError{ statusCode: statusCode, providerCode: providerCode, providerType: providerType, providerMessage: providerMessage, } } // StatusCode returns the received provider HTTP status code, or zero for a nil // receiver or zero value. func (e *GenerationError) StatusCode() int { if e == nil { return 0 } return e.statusCode } // ProviderCode returns the normalized provider error code, if present. Its // value is untrusted and may contain sensitive data. func (e *GenerationError) ProviderCode() string { if e == nil { return "" } return e.providerCode } // ProviderType returns the normalized provider error type, if present. Its // value is untrusted and may contain sensitive data. func (e *GenerationError) ProviderType() string { if e == nil { return "" } return e.providerType } // ProviderMessage returns the bounded normalized provider diagnostic, if // present. Its value is untrusted and may contain sensitive data. func (e *GenerationError) ProviderMessage() string { if e == nil { return "" } return e.providerMessage } // Error returns a redacted diagnostic that is not a parsing contract. func (e *GenerationError) Error() string { if e == nil || e.statusCode == 0 { return ErrLLMGenerate.Error() } return fmt.Sprintf("%s: provider returned HTTP status %d", ErrLLMGenerate, e.statusCode) } // GoString returns the same redacted diagnostic as Error. func (e *GenerationError) GoString() string { return e.Error() } // Unwrap returns ErrLLMGenerate. It is safe to call on a nil receiver or zero // value. func (e *GenerationError) Unwrap() error { return ErrLLMGenerate }