# Promptkit v0.7.0 This supplemental changelog and migration guide summarizes the consumer-facing changes from `v0.6.0` to `v0.7.0`. The annotated `v0.7.0` tag is the authoritative release record. Exact current contracts belong to the linked GoDoc and durable documentation. ## Summary `v0.7.0` expands provider integration and profile composition while making credential and generation-failure handling more flexible: - Promptkit now includes the `rakestrawhome` backend and its Gemma profile; - built-in generation failures expose bounded structured provider details; - an unavailable optional API-key environment source no longer prevents a request from reaching an upstream that permits unauthenticated access; and - profiles can inherit from and selectively refine another profile. ## Compatibility This release adds public declarations and fields but removes none. Existing keyed configuration literals and ordinary `errors.Is` handling continue to work. Adding `BaseProfileID` to `Profile` and `OpenAICompatibleProfileConfig` changes their struct shape. Consumers using positional composite literals for either type must convert them to keyed literals. Existing keyed literals require no change. The `rakestrawhome` backend ID is now built in and reserved. A consumer that previously registered that exact ID with `WithBackend` must remove its manual registration before upgrading. Other custom backend registrations are unchanged. When an optional backend, profile, or request `APIKeyEnv` is unset, empty, or whitespace-only, the built-in client now omits `Authorization` and sends the request. Previously this condition could fail before transport. Set `Profile.APIKeyRequired` when missing credentials must remain a local preflight error. Provider non-success responses continue to match `ErrLLMGenerate`. Their rendered wording is not a compatibility contract; consumers can now use `errors.As` with `*GenerationError` when structured status information is needed. ## Upgrade Update the module dependency with: ```sh go get gitea.maximumdirect.net/eric/promptkit@v0.7.0 go mod tidy ``` Remove any manual `rakestrawhome` backend registration, convert positional profile literals to keyed literals, and run the consuming project's ordinary and race-enabled tests. ## Rakestrawhome Built-In Backend And Profile Every engine now includes the reserved `rakestrawhome` backend, identified by `BackendRakestrawHome`. The built-in `rakestrawhome-gemma-4-31b` profile selects that backend. Consumers can use the maintained endpoint, credential, capacity, and model defaults without registering either definition themselves. See the [built-in backend and profile catalogs](../formats.md#built-in-backends) and the [consumer adoption example](../consumers/pkg-promptkit.md#use-the-rakestrawhome-built-in-profile) for the current contracts. ## Structured Generation Errors Non-2xx responses from the built-in OpenAI-compatible client now return an immutable `*GenerationError`. Consumers can inspect the HTTP status and any safely extracted provider code, type, or message while retaining the ordinary generation-error category: ```go var generationErr *promptkit.GenerationError if errors.As(err, &generationErr) { status := generationErr.StatusCode() _ = status } ``` Provider fields are bounded and normalized but remain untrusted and may contain sensitive request or schema details. Default and Go-syntax formatting omit those fields. Applications must apply their own disclosure policy before logging or presenting accessor values. See the [`GenerationError` GoDoc](../../generation_error.go), the [consumer error-handling guide](../consumers/pkg-promptkit.md#handle-errors), and the [OpenAI-compatible response contract](../integrations/openai-compatible-chat.md#response-handling). ## Optional Credential Sources `APIKeyEnv` names an optional environment lookup source unless the selected profile explicitly sets `APIKeyRequired`. When neither a direct request key nor a usable environment value exists, the built-in client omits the bearer header and handles the upstream response normally. This supports local and other OpenAI-compatible providers that permit unauthenticated requests without hiding an authentication error returned by a provider that requires one. The [credential format reference](../formats.md#credentials), the [`Backend` GoDoc](../../backends.go), the [`ExecutionTargetOverride` GoDoc](../../types.go), and the [authentication integration contract](../integrations/openai-compatible-chat.md#authentication) define the current precedence and availability rules. ## Profile Inheritance YAML profiles can name one parent with `base_profile`; in-memory profiles use `Profile.BaseProfileID`, and `OpenAICompatibleProfileConfig` forwards the same field. A profile can act as an application-owned alias of a built-in or refine selected inherited settings: ```go promptkit.WithProfiles(promptkit.Profile{ ID: "weather-light", BaseProfileID: "deepseek-4-flash", ReasoningEffort: "high", }) ``` Base lookup observes the existing source precedence. Chains are linear, cycle-safe, and resolved afresh for ordinary operations. Prepared execution freezes the fully resolved target. The selected leaf ID remains public while effective execution settings reflect the resolved chain. See the [profile inheritance format reference](../formats.md#profile-inheritance), the [consumer alias example](../consumers/pkg-promptkit.md#alias-a-built-in-profile), and the [`Profile` GoDoc](../../types.go) for exact merge and validation behavior. ## Public API Changes The release adds: - `BackendRakestrawHome`; - `GenerationError`, including `StatusCode`, `ProviderCode`, `ProviderType`, `ProviderMessage`, `Error`, `GoString`, and `Unwrap`; - `Profile.BaseProfileID`; and - `OpenAICompatibleProfileConfig.BaseProfileID`. No public declaration was removed. ## Consumer Action - Remove a manual backend registration whose ID is exactly `rakestrawhome`. - Convert positional `Profile` or `OpenAICompatibleProfileConfig` literals to keyed literals. - Set `Profile.APIKeyRequired` where a missing credential must fail locally instead of reaching the provider unauthenticated. - Treat `GenerationError` provider fields as untrusted and potentially sensitive when adopting the new accessors. - Run consumer ordinary and race-enabled tests after updating the module.