You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat: 17 provider, wire API Android, Keychain, Pengaturan persisten
Menyamakan lapisan API dan Pengaturan dengan klien Android, dan menutup
dialog Pengaturan yang hilang saat diklik dari luar.
API
- Port penuh AiProviders: 17 preset (OpenAI, Anthropic, Gemini, Groq,
DeepSeek, OpenRouter, Together, Fireworks, xAI, Mistral, Cerebras,
NVIDIA NIM, SambaNova, Hyperbolic, Novita, Ollama, custom) dengan base
URL, wire API, billing URL, dan test model yang sama persis.
- Tiga format wire di src/main/llm/chat.ts: OPENAI_CHAT, ANTHROPIC_MESSAGES,
GEMINI_CONTENT — header auth, bentuk request, tool call, dan parsing usage
mengikuti LlmClient.kt. Gemini tidak pernah mengirim field `stream`;
streaming-nya lewat :streamGenerateContent?alt=sse.
- Self-healing retry: batas max_tokens diturunkan dari pesan provider,
streaming ditolak -> retry non-streaming, parameter usang -> max_completion_tokens,
tools ditolak -> retry tanpa tools.
- Taksonomi error lengkap (auth, billing, rate limit, model, timeout, TLS)
dengan saran model pengganti dan tautan billing.
- Katalog model dibaca live dari /models; badge ekonomi ($/$$/$$$) dihitung
dari harga provider, dengan fallback estimasi ukuran dari nama model.
- Deteksi provider otomatis dari awalan API key.
- Base URL kini milik provider, bukan config global. State v1 dimigrasikan:
baseUrl yang berbeda dari preset menjadi provider custom, beserta format
wire yang bisa dipilih untuk gateway tersebut.
- API key di-seal lewat safeStorage (padanan AES-256-GCM + AndroidKeyStore).
Pengaturan
- Dialog tidak lagi menutup saat diklik dari luar, dan Escape hanya bekerja
saat tidak ada request berjalan. Status proses tampil di header.
- Bagian Provider / API Key / Model / Prompt / Tampilan / Informasi,
KEY SAVED badge, tombol lihat-sembunyikan key, ambil katalog model,
hapus key, dan diagnosis error dengan aksi billing.
Ikon
- Launcher di-render ulang dari vektor adaptive icon Android
(scripts/make-icons.py); logo in-app memakai geometri ic_selfdev_logo.xml.
Verifikasi: 325 test, smoke, smoke:e2e (OpenAI), smoke:e2e:anthropic.