This commit is contained in:
k
2026-09-21 21:10:09 +02:00
parent c0e7899ab3
commit 4cefd3e17f
18 changed files with 577 additions and 217 deletions
+18 -18
View File
@@ -99,7 +99,7 @@ only ever sees reviewed text blocks, never raw files.
## Drivers`src/drivers/`: `LLMDriver` interface (`listModels`, `chat`, `chatStream`),
`DriverRegistry` with global priority
`ollama → mistral → glm → puppeteer-openai (POC) → deepseek → anthropic → openai`.
`ollama → mistral → glm → arcaic-openai → arcaic-gemini → arcaic-qwen → deepseek → anthropic → openai`.
Models are addressed as `"driver:model"` (split on the first `:`).
- `OllamaDriver`: model discovery via `GET {OLLAMA_HOST}/api/tags`, chat via
@@ -113,20 +113,20 @@ Models are addressed as `"driver:model"` (split on the first `:`).
(SSE) implementation; concrete drivers only set base URL, key, and fallback
model list. A driver is enabled only when its `*_ENABLED` flag is set **and**
its key is non-empty; failing drivers are skipped (not fatal) in listings.
- `PuppeteerOpenAIDriver` (+ `browser.ts` `ChatGPTBrowserEngine`): ChatGPT via
the web UI — puppeteer-core driving Firefox (WebDriver BiDi) with a
**throwaway profile** (mkdtemp under /tmp, deleted on close). Anonymous
session works without login; if the composer is missing the engine waits up
to `PUPPETEER_LOGIN_TIMEOUT_S` for a manual login in the window. Flow:
accept the cookie banner, focus the composer (`#mobile-composer-prompt`,
multi-line via Shift+Enter), submit with `[data-composer-submit]`, stream
by polling `[data-assistant-stream-block]` text, and treat a newly
**visible** `[data-copy-message]` button as end-of-response (toolbars exist
hidden in the DOM during streaming — visibility is the real signal).
Navigation uses domcontentloaded + retries (chatgpt.com stalls sometimes).
POC — ToS-risky, off unless `PUPPETEER_ENABLED=true`. Headless validated
(`PUPPETEER_HEADLESS=true`, see `scripts/poc-chatgpt.ts --headless`); on
NixOS use `services.kisassistant.enableBrowserDriver` for a headless
Firefox in the service, or wrap it all in a declarative `containers.*`
(see `docs/NIXOS-HOSTING.md`). Smoke test:
`bun scripts/poc-chatgpt.ts` (headed, `--probe` for a state report).
- `ArcaicSubDriver` ×3 (`arcaic-openai`, `arcaic-gemini`, `arcaic-qwen`,
one model each: `chat`) + `browser.ts` engine: web-UI sessions driven by a
headless browser (WebDriver BiDi) with a **throwaway profile** (mkdtemp
under /tmp, deleted on close). Each sub-driver owns its engine (own
browser + profile) and declares a site config — composer selectors, submit
mode (send-button click vs Enter key), completion signal (newly **visible**
copy control, or `aria-busy="false"` on the response container for Gemini),
answer-text selectors. Anonymous sessions work without login; if the
composer is missing the engine waits up to `ARCAIC_LOGIN_TIMEOUT_S` for a
manual login in the window. Multi-line prompts are typed with Shift+Enter.
Off unless `ARCAIC_ENABLED=true`. Headless by default
(`ARCAIC_HEADLESS=false` for a visible debug window: `bun
scripts/poc-chatgpt.ts --headed`); on NixOS use
`services.kisassistant.enableBrowserDriver` for a headless Firefox in the
service, or wrap it all in a declarative `containers.*` (see
`docs/NIXOS-HOSTING.md`). Smoke test: `bun scripts/poc-chatgpt.ts
--site openai|qwen|gemini` (`--probe` for a state report).