token
Kelola token API untuk semua AI provider — tambah, hapus, lihat daftar, dan test koneksi langsung dari CLI.
Token disimpan di storage/tokens.json dan otomatis dimuat saat aplikasi berjalan.
Subcommand
token list
Tampilkan semua token yang sudah dikonfigurasi (dimask untuk keamanan).
php shuriken token list
Output contoh:
AI Token List
──────────────────────────────────────────────────
openai 2 token(s)
[0] sk-proj***
[1] sk-proj***
gemini 1 token(s)
[0] AIzaSy***
claude no tokens
token add
Tambahkan token baru untuk provider tertentu.
php shuriken token add {provider} {token}
Contoh:
php shuriken token add openai sk-proj-abc123
php shuriken token add gemini AIzaSyXXXXXXXX
php shuriken token add claude sk-ant-XXXXXXXXX
php shuriken token add deepseek sk-XXXXXXXXX
Beberapa token bisa ditambahkan untuk satu provider — Shuriken akan merotasinya secara round-robin saat scraping.
token remove
Hapus token dari provider.
php shuriken token remove {provider} {token}
Contoh:
php shuriken token remove openai sk-proj-abc123
token test
Test koneksi ke provider dengan melakukan API call nyata. Berguna untuk memastikan token valid sebelum mulai scraping.
# Test token tertentu
php shuriken token test {provider} {token}
# Test token pertama yang sudah disimpan
php shuriken token test {provider}
Contoh:
php shuriken token test openai sk-proj-abc123
php shuriken token test gemini
Output sukses:
Testing openai with token sk-proj***...
✓ Success (342ms): OK
Output gagal:
Testing openai with token sk-proj***...
✗ Failed (120ms): Incorrect API key provided
Provider yang Didukung
| Provider | Nama |
|---|---|
| OpenAI | openai |
| Google Gemini | gemini |
| Anthropic Claude | claude |
| DeepSeek | deepseek |
| Groq | groq |
| OpenRouter | openrouter |
| Kimi (Moonshot) | kimi |
| Grok (xAI) | grok |
| Mistral | mistral |
| Together AI | together |
| Perplexity | perplexity |
| Fireworks AI | fireworks |
| Cerebras | cerebras |
| SiliconFlow | siliconflow |
| Novita AI | novita |
Provider lokal (Ollama, LM Studio) dan CLI (claude-cli, gemini-cli) tidak butuh token.
File storage/tokens.json
Token disimpan dalam format JSON:
{
"openai": [
"sk-proj-abc123",
"sk-proj-xyz456"
],
"gemini": [
"AIzaSyXXXXXXXX"
]
}
File ini bisa diedit langsung, atau dikelola via perintah token add/remove.
Prioritas Token
Token dari storage/tokens.json diprioritaskan di atas nilai default di config/ai.php. Ini memungkinkan konfigurasi token tanpa mengubah file config.
Auto-fallback Provider
Kalau satu provider gagal (rate limit, quota habis, error jaringan) setelah beberapa kali retry, Shuriken otomatis mencoba provider berikutnya yang punya token — scraping tidak berhenti.
-> GetContentFromGroqAI (Token: sk-gro***)
⚠ Provider groq failed: Rate limit exceeded
→ Trying next provider...
-> GetContentFromGeminiAI (Token: AIzaSy***)
✓ Content generated
Urutan fallback mengikuti prioritas yang sama dengan auto-select. Semakin banyak provider yang dikonfigurasi, semakin tangguh scraping berjalan.
# Setup multi-provider untuk ketahanan maksimal
php shuriken token add groq sk-... # cepat & gratis
php shuriken token add gemini AIza... # fallback 1
php shuriken token add openai sk-... # fallback 2
Auto-select Provider
Setelah token ditambahkan, --ai otomatis memilih provider yang tersedia — tidak perlu selalu menulis --provider:
php shuriken token add gemini AIzaSy...
# Provider dipilih otomatis (gemini dalam contoh ini)
php shuriken image:scrape --ai --keywords="resep"
# Output: → No provider specified. Auto-selected: gemini
Urutan prioritas auto-select: openai → gemini → claude → groq → deepseek → openrouter → kimi → grok → mistral → together → perplexity → ollama → lmstudio → claude-cli → gemini-cli
Rotasi Token Otomatis
Jika satu provider punya beberapa token, Shuriken akan merotasinya secara round-robin otomatis. Berguna untuk menghindari rate limit.
php shuriken token add openai sk-token-1
php shuriken token add openai sk-token-2
php shuriken token add openai sk-token-3
# Saat scraping, ketiga token dipakai bergantian
php shuriken image:scrape --ai --provider=openai --keywords="resep"