Add AI settings API with key management
GET/PATCH /api/v1/settings/ai return and change provider, base_url, model, temperature and system_prompt, with read-only api_key_last4 and key_verified_at. PATCH requires a preset provider, temperature 0-1 in 0.1 steps and a system_prompt of at most 8000 characters. PUT /settings/ai/api-key seals the key with secretbox and records its last four characters; POST /settings/ai/verify calls Provider.Verify and records key_verified_at or returns the provider's typed error; GET /settings/ai/models lists the live models; POST /settings/ai/reset-prompt restores household.DefaultPersonaPrompt. The new internal/ai/aisettings service also builds the harness.Config for each skill run from the saved settings. presets.ForAccount builds a provider's ListModels and Verify without a model, so a key can be checked and a model picked before one is chosen. Tests scan every response body from these routes for the full key, and a harness run with the Fake provider uses the PATCHed model and temperature. Maestro task: 176b2a30-6e90-4339-b430-5b8967b2fd32 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -45,7 +45,7 @@ func newOriginRouter(t *testing.T, logs io.Writer) http.Handler {
|
||||
}
|
||||
logger := slog.New(forwarded.LogHandler(slog.NewJSONHandler(logs, nil)))
|
||||
r, err := NewRouter(logger, "dev", trusted, probeAuth{}, stubSessions{}, newTestSettings(t),
|
||||
newTestSearch(t), newTestRunner(t), newTestPhotos(t), fstest.MapFS{"index.html": {Data: []byte(fixtureIndex)}})
|
||||
newTestSearch(t), newTestAI(t), newTestRunner(t), newTestPhotos(t), fstest.MapFS{"index.html": {Data: []byte(fixtureIndex)}})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user