From 9c1d86d4b67fe005a5e738b107a76eaf78acb481 Mon Sep 17 00:00:00 2001 From: ifedan-ed Date: Fri, 3 Apr 2026 19:55:11 +0000 Subject: [PATCH] feat: Add model search, testing, and TTS/STT/embedding management to admin - Fix model search for all providers: Bedrock now falls back to built-in list (with live ListFoundationModels attempt), Azure returns built-in list - Add Test button on every model row (built-in, discovered, custom) that sends a live prompt and shows response + latency in a toast - Add TTS management section: search voices from provider API (Google TTS voices.list, LiteLLM /v1/models, ElevenLabs /v1/voices), Set as Default writes tts.voice/tts.model to DB, runtime respects DB override - Add STT management section: search models from provider (Gemini, Whisper, LiteLLM, OpenAI, local), Set as Default writes stt.model to DB, runtime respects DB override in transcribe.js - Add Embedding models section: search from provider (LiteLLM, Vertex, OpenAI), Set as Default writes embeddings.model+dimensions to DB, embeddings.js respects DB override - Add record-and-transcribe STT test (browser MediaRecorder) - Add TTS synthesize-and-play test (returns base64 audio) - Add embedding generate test (shows dims + vector sample) - Expand PUT /config/:key(*) whitelist to include tts., stt., embeddings. - Add @aws-sdk/client-bedrock as optional dependency for live Bedrock discovery --- package.json | 1 + public/components/admin.html | 104 +++++++ public/js/admin.js | 566 ++++++++++++++++++++++++++++++++++- src/routes/adminConfig.js | 529 +++++++++++++++++++++++++++++++- src/routes/transcribe.js | 7 +- src/routes/tts.js | 10 +- src/utils/ai.js | 51 ++++ src/utils/embeddings.js | 10 +- 8 files changed, 1266 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index cb7f02e..ac59abf 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "speakeasy": "^2.0.0" }, "optionalDependencies": { + "@aws-sdk/client-bedrock": "^3.700.0", "@aws-sdk/client-bedrock-runtime": "^3.700.0", "@aws-sdk/client-transcribe-streaming": "^3.1017.0", "@aws-sdk/client-s3": "^3.700.0", diff --git a/public/components/admin.html b/public/components/admin.html index 9edf3e8..01d2aff 100644 --- a/public/components/admin.html +++ b/public/components/admin.html @@ -263,6 +263,110 @@ + +
+
+

Text-to-Speech (TTS)

+ Loading... +
+
+
Loading...
+ + +
+ +
+ + +
+
+

Click Search to query available voices from your configured TTS provider.

+
+ + +
+ +
+ + +
+ +
+ + +
+

+
+
+
+ + +
+
+

Speech-to-Text (STT)

+ Loading... +
+
+
Loading...
+ + +
+ +
+ + +
+
+

Click Search to query available STT models from your configured provider.

+
+ + +
+ +
+ + +
+ +
+
+
+ + +
+
+

Embedding Models

+ Loading... +
+
+
Loading...
+ + +
+ +
+ + +
+
+

Click Search to query available embedding models from your configured provider.

+
+ + +
+ +
+ + +
+
+
+
+
+

Reset Settings

diff --git a/public/js/admin.js b/public/js/admin.js index a73332c..96a8ecd 100644 --- a/public/js/admin.js +++ b/public/js/admin.js @@ -590,6 +590,10 @@ if (e.target.closest('#btn-add-custom-model')) addCustomModel(); if (e.target.closest('#btn-save-default-model')) saveDefaultModel(); if (e.target.closest('#btn-clear-all-models')) clearAllModels(); + if (e.target.closest('.admin-model-test-btn')) { + var btn = e.target.closest('.admin-model-test-btn'); + testModel(btn.dataset.mid, btn); + } }); // Allow Enter key to trigger search @@ -649,12 +653,15 @@ } else { container.innerHTML = data.models.map(function(m) { var checked = m.enabled !== false ? 'checked' : ''; - return '