Primary-text index for personas, faster retrieval, OpenAI model options

- Contemporary and Kafka personas search only "Die Verwandlung" (own index and tool description); per-persona subtitle
- New contemporary portrait and avatar alt text
- ChatGPT: gpt-6.1-sol, reasoning_effort low via Responses API; default in the model menu
- GPT-Realtime-2.1 Mini as third option (realtime_chat.py, WebSocket, text only)
- Load .env for OPENAI_API_KEY
- Reranker in fp16 on GPU with 25 candidates; reranker, embeddings and BM25 shared and built at server start
- BM25 stem cache (first search ~31s -> ~1.7s)
- Timing output per LLM call and search

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-26 07:04:59 +01:00
co-authored by Claude Opus 5.5
parent f68d7a6e25
commit e4b7f0ce34
6 changed files with 243 additions and 46 deletions
+7 -5
View File
@@ -474,7 +474,8 @@
Modell
<select id="provider">
<option value="ollama">Ollama</option>
<option value="openai">ChatGPT</option>
<option value="openai" selected>ChatGPT</option>
<option value="realtime">Realtime Mini</option>
</select>
</label>
</div>
@@ -559,12 +560,13 @@
try {
const res = await fetch('/api/providers');
const data = await res.json();
if (!data.openai) {
const opt = providerEl.querySelector('option[value="openai"]');
for (const id of ['openai', 'realtime']) {
if (data[id]) continue;
const opt = providerEl.querySelector('option[value="' + id + '"]');
opt.disabled = true;
opt.textContent = 'ChatGPT (aus)';
opt.textContent += ' (aus)';
opt.title = 'OpenAI ist nicht eingerichtet (OPENAI_API_KEY fehlt)';
if (providerEl.value === 'openai') providerEl.value = 'ollama';
if (providerEl.value === id) providerEl.value = 'ollama';
}
} catch (_) {}
})();