165 lines
6.9 KiB
Markdown
165 lines
6.9 KiB
Markdown
# Promptkit Feature Request: Application Fallback Profiles
|
|
|
|
Status: Proposed upstream capability.
|
|
|
|
## Purpose
|
|
|
|
Promptkit should allow a consuming application to supply an embedded fallback
|
|
profile source that sits below operator-configured profiles and above
|
|
Promptkit's own built-in profile catalog.
|
|
|
|
This capability would let an application publish stable, domain-specific
|
|
profile IDs with useful defaults while preserving Promptkit's existing
|
|
operator-override behavior. The capability must remain application-neutral;
|
|
Promptkit should provide the source layer but should not own downstream profile
|
|
names, model assignments, or configuration policy.
|
|
|
|
## Downstream Use Case
|
|
|
|
Weatherreporter wants to embed profiles such as `weather-light`,
|
|
`weather-balanced`, and `weather-deep`. Report prompts would select those
|
|
logical profiles instead of naming provider- or model-specific Promptkit
|
|
profiles directly.
|
|
|
|
An installation could then place a profile with the same ID in its configured
|
|
profile directory. For example, a local `weather-light` definition could point
|
|
to an OpenAI-compatible endpoint on the deployment network. When no operator
|
|
definition exists, Weatherreporter's embedded definition would keep the
|
|
application usable without additional profile files.
|
|
|
|
This pattern is useful beyond Weatherreporter. Any Promptkit consumer may want
|
|
application-owned execution tiers or workload-specific defaults without
|
|
adding domain-specific profiles to Promptkit's general built-in catalog.
|
|
|
|
## Current Constraint
|
|
|
|
Promptkit currently resolves matching profile IDs in this order:
|
|
|
|
1. in-memory profiles supplied through `WithProfiles`;
|
|
2. one configured profile file, `fs.FS`, or directory source; and
|
|
3. Promptkit's embedded built-in profiles.
|
|
|
|
These layers do not express the desired application-default relationship:
|
|
|
|
- `WithProfiles` has higher precedence than the configured source, so it would
|
|
prevent an operator file from overriding an application profile with the
|
|
same ID.
|
|
- `WithProfileFS` can hold embedded application assets, but it occupies the
|
|
configured-source layer and therefore replaces rather than sits beneath a
|
|
configured profile directory or file.
|
|
- adding downstream profile IDs to Promptkit's built-in catalog would make the
|
|
library own application-specific policy.
|
|
|
|
A downstream application could build its own filesystem overlay, but that
|
|
would duplicate Promptkit's profile discovery, error, and precedence behavior
|
|
at the consumer boundary.
|
|
|
|
## Requested Capability
|
|
|
|
Add one optional application fallback profile source to engine construction.
|
|
When present, matching profile IDs should resolve in this order:
|
|
|
|
1. in-memory profiles supplied through `WithProfiles`;
|
|
2. the ordinary configured profile source selected through a profile option or
|
|
`Config.ProfileDir`;
|
|
3. the application fallback profile source; and
|
|
4. Promptkit's embedded built-in profiles.
|
|
|
|
When no application fallback is configured, existing source precedence and
|
|
behavior must remain unchanged.
|
|
|
|
The minimum useful public surface is an `fs.FS`-backed option because consumers
|
|
can embed YAML profile assets. A possible API shape is:
|
|
|
|
```go
|
|
promptkit.WithFallbackProfileFS(profileFS, ".")
|
|
```
|
|
|
|
The name is illustrative rather than prescriptive. A companion option for
|
|
validated `Profile` values could be added if Promptkit maintainers find it
|
|
generally useful, but it is not required for the Weatherreporter use case.
|
|
|
|
## Required Semantics
|
|
|
|
- A higher-precedence source falls through only when the requested profile ID
|
|
is absent.
|
|
- A malformed, unreadable, duplicate, ambiguous, or otherwise invalid matching
|
|
profile is an error and must not silently fall through.
|
|
- The fallback source uses the existing strict profile YAML format and profile
|
|
validation rules.
|
|
- Profile values are selected as a whole. This feature does not merge,
|
|
inherit, or partially overlay profile definitions.
|
|
- `InspectProfile`, `Prepare`, prepared execution, and ordinary execution use
|
|
the same profile-source precedence.
|
|
- An explicit request profile continues to take precedence over a prompt's
|
|
`default_profile`; this request concerns definition lookup after the profile
|
|
ID has been selected.
|
|
- Repeated fallback-source options should follow Promptkit's documented
|
|
same-category option convention, normally with the last value replacing the
|
|
earlier value.
|
|
- A canceled lookup, invalid fallback asset, or unknown resolved backend should
|
|
continue to cross the public facade through Promptkit's existing public error
|
|
identities.
|
|
- Exact profile inspection must remain side-effect free and must not contact a
|
|
model provider.
|
|
|
|
## Application And Library Boundaries
|
|
|
|
Promptkit should own:
|
|
|
|
- the additional repository layer;
|
|
- deterministic lookup and fallthrough behavior;
|
|
- validation of the supplied source through the existing profile contract;
|
|
- consistent use of the layer across inspection and execution; and
|
|
- public documentation and tests for the added precedence rule.
|
|
|
|
The consuming application should continue to own:
|
|
|
|
- whether it supplies fallback profiles;
|
|
- the profile IDs and their domain meaning;
|
|
- embedded profile contents and model choices;
|
|
- application configuration and override policy;
|
|
- report- or workload-to-profile assignment; and
|
|
- credential checks and operator-facing errors beyond Promptkit's public
|
|
contract.
|
|
|
|
## Non-Goals
|
|
|
|
This request does not ask Promptkit to add:
|
|
|
|
- Weatherreporter-specific profile IDs to its built-in catalog;
|
|
- profile inheritance, aliases, or field-level merging;
|
|
- automatic endpoint discovery or availability probing;
|
|
- provider failover or fallback from a failed selected profile;
|
|
- per-request model benchmarking or tier selection;
|
|
- application configuration discovery; or
|
|
- eager validation of every profile in every source.
|
|
|
|
## Compatibility
|
|
|
|
The feature can be additive. Engines that do not configure an application
|
|
fallback source should retain their current public behavior and precedence.
|
|
Existing uses of `WithProfiles`, `WithProfileFile`, `WithProfileFS`, and
|
|
`Config.ProfileDir` should not change meaning.
|
|
|
|
The application fallback is deliberately lower precedence than every existing
|
|
consumer-configured source. This preserves the established expectation that a
|
|
custom profile definition can override a packaged default with the same ID.
|
|
|
|
## Acceptance Criteria
|
|
|
|
The capability is sufficient for downstream adoption when Promptkit can
|
|
demonstrate that:
|
|
|
|
- a fallback-only profile can be inspected and used for preparation and
|
|
execution;
|
|
- a configured directory, file, or `fs.FS` profile with the same ID overrides
|
|
the fallback profile;
|
|
- an absent configured profile falls through to the application fallback;
|
|
- an invalid configured match fails instead of falling through;
|
|
- an absent application fallback profile continues to resolve from Promptkit's
|
|
built-in catalog;
|
|
- `WithProfiles` retains highest precedence;
|
|
- behavior is identical across inspection, preparation, and execution; and
|
|
- omitting the new option preserves existing tests and public contracts.
|