Files

33 lines
3.2 KiB
Markdown

# usehaze.ai (Haze AI) — protocol, autoreg, status
## Architecture (reversed from Tauri desktop app)
- Desktop app = Tauri + WebView2 wrapper over plain HTTP APIs; page URL `tauri.localhost`.
- Chat gateway: `https://v1.usehaze.ai/ai/v1` — OpenAI-compatible (`/models`, `/chat/completions`), auth = Bearer WorkOS access token (~24h expiry).
- Auth API: `https://usehaze.ai/api`
- `POST /auth/bootstrap {email, password, create:true}` → register → `{status:"verification_required", pendingToken}` (or `{status:"authenticated", accessToken}` if already verified).
- `create:false` = login → 401 if unknown email.
- OTP: 6 digits from `welcome@workos.dev`, read via IMAP (t-online.de pool works: secureimap.t-online.de:993).
- `POST /auth/verify-code {code, pending_authentication_token}` → `accessToken`.
- Cloudflare blocks bare python-urllib (403); curl with browser UA passes.
- Free accounts get the free-tier catalog; paid models answer `upgrade_required`.
## Reg limits
- Per-network daily cap: 429 "Too many accounts were created from this network today" → rotate IP via own-VPS SOCKS tunnel (see `references/ssh-socks-ip-rotation.md`).
- Dash-alias t-online emails are dead for delivery; use canonical addresses only.
## Local assets
- Farm dir: `C:/Users/User/tmp/haze_farm/` — `mass_reg_px.py` (proxy rotation), `reg_one_socks.py` (single reg through SOCKS tunnel + chat test), pool `tokens.json`, mail pool `Desktop/avtoreg/working_mails.txt` (~17K).
- Public repo: `gbonnet65923/haze-toolkit` (gateway proxy + mass-reg + RE helpers). Dashboard rebuild: `tmp/haze_public/dashboard.py` (stdlib-only, paste-token UI, channel footer).
## Service status (verified Oct 2026)
- `/v1/models` = 200 with catalog (gpt-6-luna/sol/6.1-sol, hy3, step-5-preview), tokens valid.
- BUT chat = 502 on every gpt-6/hy3 model and `upstream_rate_limited` on step-5 — on ALL tokens INCLUDING freshly registered ones. Registration works, the model upstream is dead. Frontend bundle lists stale models (gpt-5.6-*, claude-*) that return `unknown_model`.
- UI shows newer models ("Kimi K3", "GLM 5.3", "DeepSeek V4 Pro/Flash") that `/v1/models` does NOT list. Real wire ids — capture from the app's WebSocket (CDP `Network.webSocketFrameSent/Received`, doc-op frames carry `modelId`): `kimi-k3`, `glm-5-3`, `deepseek-v4-pro`, `deepseek-v4-flash`. Display name ≠ id ("GLM 5.3" → `glm-5-3`); don't guess from UI labels.
- Those ids are accepted by the router (NOT unknown_model) but every `/v1/chat/completions` variant returns `{"error":"Internal error"}` — chat for the new models runs over the app's WS agent protocol, the OpenAI-compat REST path never serves them. A public proxy build is impossible for them.
- Final liveness test: send a message in the app's own UI — session stays `running:true` with no assistant reply → upstream dead for everyone, not a token/account problem. Fresh reg via SOCKS tunnel bypasses the 429 cap but cannot revive a dead backend.
- Lesson applied: do NOT publish a channel post for a service whose chat probe fails on every model — verify per Phase 2.7 of `ai-proxy-authenticity`. Full CDP/WS capture recipe: skill `ide-reverse-engineering` → `references/tauri-webview2-cdp-runtime-extraction.md` §2b.