AI: asystenci bez martwego API + utrzymywanie Ollamy w cieple #28

Merged
gitea merged 1 commits from assistants-and-ollama-warmup into main 2026-08-27 15:08:20 +00:00
Owner

Stackowane na #27 — zmerguj #27 najpierw (to szybki fix odblokowujący komendy AI).

1. Asystenci — zamiennik wygaszonego Assistants API

Stara implementacja dawała trzy rzeczy. Dwie odtworzone, trzecia świadomie nie:

Co Status
Persona per user i tak siedziała w system_gpt_settings.json — była tylko wysyłana do OpenAI. Teraz to prompt systemowy.
Trwały wątek per user historię trzymał OpenAI. Teraz assistant_memory.json, kluczowana po discord id, przycinana do ostatnich tur, zapis atomowy (rozerwany plik = czyjaś cała rozmowa).
file_search nie odtwarzam — potwierdziłeś, że nieużywane.

Rozmowa idzie przez handle_response z request_type="NONE" i jawną listą wiadomości, więc nie miesza się z pamięcią baru.

Świadomie zwykłe przycinanie, a nie kompaktowanie AI jak przy pamięci baru — to prywatne DM-y i nie mają prawa wylądować w publicznej "legendzie".

Największy zysk: create_chat_assistant miał zaszyte model="gpt-4o", czyli asystenci byli przywiązani do OpenAI. Teraz chodzą na tym, co wybierze $gadaj_teraztakże Claude i Ollama.

create_chat_assistant/chat_with_assistant usunięte, a z nimi ostatnie wywołanie beta.threads w ścieżce startu — ten cog nie da się już zabić tym API. (add_files_to_vector_store/delete_files_from_vector_store nadal odwołują się do beta.assistants, ale to martwy kod — zero wywołań — więc niczego nie wysadzą; zostawione, żeby nie rozszerzać tej zmiany.)

2. Utrzymywanie modelu w cieple

Wolne jest ładowanie (karta dzielona z innymi), więc preloadujemy udokumentowanym mechanizmem Ollamy: /api/generate z modelem, keep_alive i bez promptu — ładuje model i nic nie generuje.

  • przy przełączeniu na ollamę $gadaj_teraz odpala preload w tle (nie await — ładowanie trwa minutami, a komenda musi odpowiedzieć od razu), więc czekanie spada na Ciebie przy przełączaniu, a nie na pierwszego użytkownika;
  • pętla odnawia keep_alive co CONJURER_OLLAMA_WARM_MINUTES.

Oba twardo zabezpieczone na aktywnego providera == ollama. Rozgrzewanie płatnego API to przepalanie tokenów i złotówek, więc ten warunek jest przybity testami: jeden sprawdza, że preload nigdy nie leci dla gpt/claude, drugi że w body nie ma promptu (prompt sprawiłby, że każde rozgrzanie coś generuje).

Nowe zmienne: CONJURER_OLLAMA_KEEP_ALIVE (30m), CONJURER_OLLAMA_WARM_MINUTES (10), CONJURER_OLLAMA_PRELOAD_TIMEOUT (600), CONJURER_ASSISTANT_MEMORY_TURNS (40).

Suite: 82 unit + 71 integration zielone.

🤖 Generated with Claude Code

> **Stackowane na #27** — zmerguj #27 najpierw (to szybki fix odblokowujący komendy AI). ## 1. Asystenci — zamiennik wygaszonego Assistants API Stara implementacja dawała **trzy** rzeczy. Dwie odtworzone, trzecia świadomie nie: | Co | Status | |---|---| | **Persona per user** | ✅ i tak siedziała w `system_gpt_settings.json` — była tylko wysyłana do OpenAI. Teraz to prompt systemowy. | | **Trwały wątek per user** | ✅ historię trzymał OpenAI. Teraz `assistant_memory.json`, kluczowana po discord id, **przycinana** do ostatnich tur, zapis **atomowy** (rozerwany plik = czyjaś cała rozmowa). | | **`file_search`** | ❌ **nie odtwarzam** — potwierdziłeś, że nieużywane. | Rozmowa idzie przez `handle_response` z `request_type="NONE"` i jawną listą wiadomości, więc **nie miesza się z pamięcią baru**. Świadomie **zwykłe przycinanie**, a nie kompaktowanie AI jak przy pamięci baru — to prywatne DM-y i nie mają prawa wylądować w publicznej "legendzie". **Największy zysk:** `create_chat_assistant` miał zaszyte `model="gpt-4o"`, czyli asystenci byli przywiązani do OpenAI. Teraz chodzą na tym, co wybierze `$gadaj_teraz` — **także Claude i Ollama**. `create_chat_assistant`/`chat_with_assistant` usunięte, a z nimi **ostatnie wywołanie `beta.threads` w ścieżce startu** — ten cog nie da się już zabić tym API. (`add_files_to_vector_store`/`delete_files_from_vector_store` nadal odwołują się do `beta.assistants`, ale to **martwy kod** — zero wywołań — więc niczego nie wysadzą; zostawione, żeby nie rozszerzać tej zmiany.) ## 2. Utrzymywanie modelu w cieple Wolne jest **ładowanie** (karta dzielona z innymi), więc preloadujemy udokumentowanym mechanizmem Ollamy: `/api/generate` z modelem, `keep_alive` i **bez promptu** — ładuje model i **nic nie generuje**. - **przy przełączeniu** na ollamę `$gadaj_teraz` odpala preload **w tle** (nie `await` — ładowanie trwa minutami, a komenda musi odpowiedzieć od razu), więc czekanie spada na Ciebie przy przełączaniu, a nie na pierwszego użytkownika; - **pętla** odnawia `keep_alive` co `CONJURER_OLLAMA_WARM_MINUTES`. **Oba twardo zabezpieczone na aktywnego providera == ollama.** Rozgrzewanie płatnego API to przepalanie tokenów i złotówek, więc ten warunek jest **przybity testami**: jeden sprawdza, że preload **nigdy** nie leci dla `gpt`/`claude`, drugi że w body **nie ma promptu** (prompt sprawiłby, że każde rozgrzanie coś generuje). Nowe zmienne: `CONJURER_OLLAMA_KEEP_ALIVE` (30m), `CONJURER_OLLAMA_WARM_MINUTES` (10), `CONJURER_OLLAMA_PRELOAD_TIMEOUT` (600), `CONJURER_ASSISTANT_MEMORY_TURNS` (40). Suite: **82 unit + 71 integration** zielone. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
gitea self-assigned this 2026-08-27 14:25:30 +00:00
gitea added 1 commit 2026-08-27 14:25:30 +00:00
AI: personal assistants without the dead API, and keep Ollama warm
CI / compile (pull_request) Successful in 5s
CI / unit (pull_request) Successful in 22s
CI / integration (pull_request) Successful in 26s
build / build (push) Successful in 12s
CI / compile (push) Successful in 5s
CI / unit (push) Successful in 22s
CI / integration (push) Successful in 26s
c91ec03b83
Two things the field report asked for.

1) PERSONAL ASSISTANTS (replacing the sunset OpenAI Assistants API)

The old implementation gave three capabilities. Two are reimplemented here,
the third was confirmed unused and is deliberately not replaced:

 * per-user persona - it already lived in system_gpt_settings.json; it was
   only ever being shipped to OpenAI. It is now the system prompt.
 * per-user conversation thread - OpenAI held this server-side. It now lives
   in assistant_memory.json, keyed by discord user id, trimmed to the most
   recent turns (CONJURER_ASSISTANT_MEMORY_TURNS) and written atomically so a
   torn write cannot lose someone's history. Deliberately a plain trim, not
   the AI summarisation used for the bar's shared memory: these are private
   DMs and must not end up in a public "legend".
 * file_search - not replaced. Confirmed not in use.

The conversation goes through handle_response with request_type="NONE" and an
explicit message list, which keeps it out of the bar's shared memory. The big
win: create_chat_assistant hardcoded model="gpt-4o", so assistants were locked
to OpenAI. They now run on whatever $gadaj_teraz selects - Claude and Ollama
included.

create_chat_assistant / chat_with_assistant are gone, and with them the last
call to beta.threads in the startup path - so the cog cannot be killed by that
API again. (add_files_to_vector_store / delete_files_from_vector_store still
reference beta.assistants but are dead code - nothing calls them - so they
cannot crash anything; left alone rather than widening this change.)

2) KEEPING A SELF-HOSTED MODEL WARM

Loading is the slow part - the GPU is shared with other users - so we preload
via Ollama's documented mechanism: /api/generate with a model, a keep_alive
and NO prompt. It loads the model and generates nothing.

 * on switching to ollama, $gadaj_teraz fires a preload in the BACKGROUND
   (not awaited: loading can take minutes and the command must answer at
   once), so the wait lands on the operator rather than the first user;
 * a warm loop re-asserts keep_alive every CONJURER_OLLAMA_WARM_MINUTES.

Both are hard-guarded on the ACTIVE provider being ollama. Warming a metered
API would burn tokens and money for nothing, so that guard is pinned by a test
asserting the preload is never called for gpt/claude, and another asserting the
preload body carries no prompt (a prompt would make every warm-up generate).

Tests: 82 unit + 71 integration green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
gitea merged commit c91ec03b83 into main 2026-08-27 15:08:20 +00:00
gitea deleted branch assistants-and-ollama-warmup 2026-08-27 15:08:20 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gitea/conjurer#28