π» Kiro Gateway
Gateway proxy untuk Kiro API (Amazon Q Developer / AWS CodeWhisperer)
π¬π§ English β’ π·πΊ Π ΡΡΡΠΊΠΈΠΉ β’ π¨π³ δΈζ β’ πͺπΈ EspaΓ±ol β’ π§π· PortuguΓͺs β’ π―π΅ ζ₯ζ¬θͺ β’ π°π· νκ΅μ΄
Dibuat dengan β€οΈ oleh @Jwadow
Gunakan model Claude dari Kiro dengan Claude Code, OpenCode, Cursor, Cline, Roo Code, Kilo Code, Obsidian, OpenAI SDK, LangChain, Continue dan alat lain yang kompatibel dengan OpenAI atau Anthropic
Model β’ Fitur β’ Mulai Cepat β’ Konfigurasi β’ π Dukung
π€ Model yang Tersedia
β οΈ Penting: Ketersediaan model bergantung pada paket Kiro Anda (gratis/berbayar). Gateway menyediakan akses ke model yang tersedia di IDE atau CLI Anda berdasarkan langganan Anda. Daftar di bawah menunjukkan model yang umumnya tersedia di paket gratis.
π Claude Opus 4.5 telah dihapus dari paket gratis pada 17 Januari 2026. Mungkin tersedia di paket berbayar β periksa daftar model di IDE/CLI Anda.
π Claude Sonnet 4.5 β Performa seimbang. Bagus untuk coding, menulis, dan tugas umum.
β‘ Claude Haiku 4.5 β Secepat kilat. Sempurna untuk respons cepat, tugas sederhana, dan chat.
π¦ Claude Sonnet 4 β Generasi sebelumnya. Masih kuat dan andal untuk sebagian besar kasus penggunaan.
π¦ Claude 3.7 Sonnet β Model lama. Tersedia untuk kompatibilitas mundur.
π‘ Resolusi Model Cerdas: Gunakan format nama model apa pun β
claude-sonnet-4-5,claude-sonnet-4.5, atau bahkan nama berversi seperticlaude-sonnet-4-5-20250929. Gateway akan menormalisasi secara otomatis.
β¨ Fitur
| Fitur | Deskripsi |
|---|---|
| π API kompatibel OpenAI | Bekerja dengan alat apa pun yang kompatibel dengan OpenAI |
| π API kompatibel Anthropic | Endpoint native /v1/messages |
| π Dukungan VPN/Proxy | Proxy HTTP/SOCKS5 untuk jaringan terbatas |
| π§ Pemikiran Diperluas | Penalaran adalah eksklusif proyek kami |
| ποΈ Dukungan Visi | Kirim gambar ke model |
| π οΈ Pemanggilan Alat | Mendukung pemanggilan fungsi |
| π¬ Riwayat pesan lengkap | Meneruskan konteks percakapan lengkap |
| π‘ Streaming | Dukungan streaming SSE penuh |
| π Logika Retry | Retry otomatis saat error (403, 429, 5xx) |
| π Daftar model diperluas | Termasuk model berversi |
| π Manajemen token cerdas | Refresh otomatis sebelum kedaluwarsa |
π Mulai Cepat
Prasyarat
- Python 3.10+
- Salah satu dari berikut:
Instalasi
# Clone repositori (memerlukan Git)
git clone https://github.com/Jwadow/kiro-gateway.git
cd kiro-gateway
# Atau unduh ZIP: Code β Download ZIP β ekstrak β buka folder kiro-gateway
# Instal dependensi
pip install -r requirements.txt
# Konfigurasi (lihat bagian Konfigurasi)
cp .env.example .env
# Salin dan edit .env dengan kredensial Anda
# Jalankan server
python main.py
# Atau dengan port kustom (jika 8000 sedang digunakan)
python main.py --port 9000
Server akan tersedia di http://localhost:8000
βοΈ Konfigurasi
Opsi 1: File JSON Kredensial (Kiro IDE / Enterprise)
Tentukan path ke file kredensial:
Bekerja dengan:
- Kiro IDE (standar) - untuk akun pribadi
- Enterprise - untuk akun perusahaan dengan SSO
KIRO_CREDS_FILE="~/.aws/sso/cache/kiro-auth-token.json"
# Password untuk melindungi server proxy ANDA (buat string aman apa pun)
# Anda akan menggunakan ini sebagai api_key saat menghubungkan ke gateway Anda
PROXY_API_KEY="my-super-secret-password-123"
π Format file JSON
{
"accessToken": "eyJ...",
"refreshToken": "eyJ...",
"expiresAt": "2025-01-12T23:00:00.000Z",
"profileArn": "arn:aws:codewhisperer:us-east-1:...",
"region": "us-east-1",
"clientIdHash": "abc123..." // Optional: for corporate SSO setups
}
Catatan: Jika Anda memiliki dua file JSON di
~/.aws/sso/cache/(misalnya,kiro-auth-token.jsondan file dengan nama hash), gunakankiro-auth-token.jsondiKIRO_CREDS_FILE. Gateway akan secara otomatis memuat file lainnya.
Opsi 2: Variabel Lingkungan (file .env)
Buat file .env di root proyek:
# Wajib
REFRESH_TOKEN="kiro_refresh_token_anda"
# Password untuk melindungi server proxy ANDA (buat string aman apa pun)
PROXY_API_KEY="my-super-secret-password-123"
# Opsional
PROFILE_ARN="arn:aws:codewhisperer:us-east-1:..."
KIRO_REGION="us-east-1"
Opsi 3: Kredensial AWS SSO (kiro-cli / Enterprise)
Jika Anda menggunakan kiro-cli atau Kiro IDE dengan AWS SSO (AWS IAM Identity Center), gateway akan secara otomatis mendeteksi dan menggunakan autentikasi yang sesuai.
Bekerja dengan akun Builder ID gratis dan akun perusahaan.
KIRO_CREDS_FILE="~/.aws/sso/cache/your-sso-cache-file.json"
# Password untuk melindungi server proxy ANDA
PROXY_API_KEY="my-super-secret-password-123"
# Catatan: PROFILE_ARN TIDAK diperlukan untuk AWS SSO (Builder ID dan akun perusahaan)
# Gateway akan bekerja tanpanya
π Format file JSON AWS SSO
File kredensial AWS SSO (dari ~/.aws/sso/cache/) berisi:
{
"accessToken": "eyJ...",
"refreshToken": "eyJ...",
"expiresAt": "2025-01-12T23:00:00.000Z",
"region": "us-east-1",
"clientId": "...",
"clientSecret": "..."
}
Catatan: Pengguna AWS SSO (Builder ID dan akun perusahaan) TIDAK memerlukan profileArn. Gateway akan bekerja tanpanya (jika ditentukan, akan diabaikan).
π Cara kerjanya
Gateway secara otomatis mendeteksi tipe autentikasi berdasarkan file kredensial:
Kiro Desktop Auth (default): Digunakan ketika
clientIddanclientSecretTIDAK ada- Endpoint:
https://prod.{region}.auth.desktop.kiro.dev/refreshToken
- Endpoint:
AWS SSO (OIDC): Digunakan ketika
clientIddanclientSecretada- Endpoint:
https://oidc.{region}.amazonaws.com/token
- Endpoint:
Tidak perlu konfigurasi tambahan β cukup arahkan ke file kredensial Anda!
Opsi 4: Database SQLite kiro-cli
Jika Anda menggunakan kiro-cli dan lebih suka menggunakan database SQLite-nya secara langsung:
KIRO_CLI_DB_FILE="~/.local/share/kiro-cli/data.sqlite3"
# Password untuk melindungi server proxy ANDA
PROXY_API_KEY="my-super-secret-password-123"
# Catatan: PROFILE_ARN TIDAK diperlukan untuk AWS SSO (Builder ID dan akun perusahaan)
# Gateway akan bekerja tanpanya
π Lokasi database
| Alat CLI | Path Database |
|---|---|
| kiro-cli | ~/.local/share/kiro-cli/data.sqlite3 |
| amazon-q-developer-cli | ~/.local/share/amazon-q/data.sqlite3 |
Gateway membaca kredensial dari tabel auth_kv yang menyimpan:
kirocli:odic:tokenataucodewhisperer:odic:tokenβ access token, refresh token, kedaluwarsakirocli:odic:device-registrationataucodewhisperer:odic:device-registrationβ client ID dan secret
Kedua format kunci didukung untuk kompatibilitas dengan versi kiro-cli yang berbeda.
Mendapatkan Kredensial
Untuk pengguna Kiro IDE:
- Login ke Kiro IDE dan gunakan Opsi 1 di atas (file JSON kredensial)
- File kredensial dibuat secara otomatis setelah login
Untuk pengguna Kiro CLI:
- Login dengan
kiro-cli logindan gunakan Opsi 3 atau Opsi 4 di atas - Tidak perlu ekstraksi token manual!
π§ Lanjutan: Ekstraksi token manual
Jika Anda perlu mengekstrak refresh token secara manual (misalnya, untuk debugging), Anda dapat mencegat traffic Kiro IDE:
- Cari request ke:
prod.us-east-1.auth.desktop.kiro.dev/refreshToken
π Dukungan VPN/Proxy
Untuk pengguna di China, jaringan korporat, atau wilayah dengan masalah konektivitas ke layanan AWS.
Gateway mendukung perutean semua permintaan Kiro API melalui server VPN atau proxy. Ini penting jika Anda mengalami masalah koneksi ke endpoint AWS atau perlu menggunakan proxy korporat.
Konfigurasi
Tambahkan ke file .env Anda:
# Proxy HTTP
VPN_PROXY_URL=http://127.0.0.1:7890
# Proxy SOCKS5
VPN_PROXY_URL=socks5://127.0.0.1:1080
# Dengan autentikasi (proxy korporat)
VPN_PROXY_URL=http://username:password@proxy.company.com:8080
# Tanpa protokol (default ke http://)
VPN_PROXY_URL=192.168.1.100:8080
Protokol yang Didukung
- β HTTP β Protokol proxy standar
- β HTTPS β Koneksi proxy aman
- β SOCKS5 β Protokol proxy lanjutan (umum di software VPN)
- β Autentikasi β Username/password tertanam di URL
Kapan Anda Membutuhkannya
| Situasi | Solusi |
|---|---|
| Timeout koneksi ke AWS | Gunakan VPN/proxy untuk merutekan lalu lintas |
| Pembatasan jaringan korporat | Konfigurasi proxy perusahaan Anda |
| Masalah konektivitas regional | Gunakan layanan VPN dengan dukungan proxy |
| Persyaratan privasi | Rutekan melalui server proxy Anda sendiri |
Software VPN Populer dengan Dukungan Proxy
Sebagian besar klien VPN menyediakan server proxy lokal:
- Sing-box β Klien VPN modern dengan dukungan proxy HTTP/SOCKS5
- Clash β Biasanya berjalan di
http://127.0.0.1:7890 - V2Ray β Proxy SOCKS5/HTTP yang dapat dikonfigurasi
- Shadowsocks β Dukungan proxy SOCKS5
- VPN Korporat β Tanyakan departemen IT Anda untuk pengaturan proxy
Biarkan VPN_PROXY_URL kosong (default) jika Anda tidak memerlukan dukungan proxy.
π‘ Referensi API
Endpoint
| Endpoint | Metode | Deskripsi |
|---|---|---|
/ |
GET | Health check |
/health |
GET | Health check detail |
/v1/models |
GET | Daftar model yang tersedia |
/v1/chat/completions |
POST | OpenAI Chat Completions API |
/v1/messages |
POST | Anthropic Messages API |
π‘ Contoh Penggunaan
OpenAI API
πΉ Request cURL Sederhana
curl http://localhost:8000/v1/chat/completions \
-H "Authorization: Bearer my-super-secret-password-123" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-5",
"messages": [{"role": "user", "content": "Halo!"}],
"stream": true
}'
Catatan: Ganti
my-super-secret-password-123denganPROXY_API_KEYyang Anda atur di file.env.
πΉ Request dengan Streaming
curl http://localhost:8000/v1/chat/completions \
-H "Authorization: Bearer my-super-secret-password-123" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-5",
"messages": [
{"role": "system", "content": "Kamu adalah asisten yang membantu."},
{"role": "user", "content": "Berapa 2+2?"}
],
"stream": true
}'
π οΈ Dengan Pemanggilan Alat
curl http://localhost:8000/v1/chat/completions \
-H "Authorization: Bearer my-super-secret-password-123" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-5",
"messages": [{"role": "user", "content": "Bagaimana cuaca di London?"}],
"tools": [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Dapatkan cuaca untuk suatu lokasi",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string", "description": "Nama kota"}
},
"required": ["location"]
}
}
}]
}'
π Python OpenAI SDK
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="my-super-secret-password-123" # PROXY_API_KEY Anda dari .env
)
response = client.chat.completions.create(
model="claude-sonnet-4-5",
messages=[
{"role": "system", "content": "Kamu adalah asisten yang membantu."},
{"role": "user", "content": "Halo!"}
],
stream=True
)
for chunk in response:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
π¦ LangChain
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
base_url="http://localhost:8000/v1",
api_key="my-super-secret-password-123", # PROXY_API_KEY Anda dari .env
model="claude-sonnet-4-5"
)
response = llm.invoke("Halo, apa kabar?")
print(response.content)
Anthropic API
πΉ Request cURL Sederhana
curl http://localhost:8000/v1/messages \
-H "x-api-key: my-super-secret-password-123" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Halo!"}]
}'
Catatan: Anthropic API menggunakan header
x-api-keybukanAuthorization: Bearer. Keduanya didukung.
πΉ Dengan System Prompt
curl http://localhost:8000/v1/messages \
-H "x-api-key: my-super-secret-password-123" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"system": "Kamu adalah asisten yang membantu.",
"messages": [{"role": "user", "content": "Halo!"}]
}'
Catatan: Di Anthropic API,
systemadalah field terpisah, bukan pesan.
π‘ Streaming
curl http://localhost:8000/v1/messages \
-H "x-api-key: my-super-secret-password-123" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"stream": true,
"messages": [{"role": "user", "content": "Halo!"}]
}'
π Python Anthropic SDK
import anthropic
client = anthropic.Anthropic(
api_key="my-super-secret-password-123", # PROXY_API_KEY Anda dari .env
base_url="http://localhost:8000"
)
# Tanpa streaming
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Halo!"}]
)
print(response.content[0].text)
# Dengan streaming
with client.messages.stream(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Halo!"}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
π§ Debugging
Logging debug dinonaktifkan secara default. Untuk mengaktifkan, tambahkan ke .env Anda:
# Mode logging debug:
# - off: dinonaktifkan (default)
# - errors: simpan log hanya untuk request yang gagal (4xx, 5xx) - direkomendasikan untuk troubleshooting
# - all: simpan log untuk setiap request (ditimpa setiap request)
DEBUG_MODE=errors
Mode Debug
| Mode | Deskripsi | Kasus Penggunaan |
|---|---|---|
off |
Dinonaktifkan (default) | Produksi |
errors |
Simpan log hanya untuk request yang gagal (4xx, 5xx) | Direkomendasikan untuk troubleshooting |
all |
Simpan log untuk setiap request | Pengembangan/debugging |
File Debug
Ketika diaktifkan, request dicatat ke folder debug_logs/:
| File | Deskripsi |
|---|---|
request_body.json |
Request masuk dari klien (format OpenAI) |
kiro_request_body.json |
Request yang dikirim ke Kiro API |
response_stream_raw.txt |
Stream mentah dari Kiro |
response_stream_modified.txt |
Stream yang ditransformasi (format OpenAI) |
app_logs.txt |
Log aplikasi untuk request |
error_info.json |
Detail error (hanya saat error) |
π Lisensi
Proyek ini dilisensikan di bawah GNU Affero General Public License v3.0 (AGPL-3.0).
Ini berarti:
- β Anda dapat menggunakan, memodifikasi, dan mendistribusikan software ini
- β Anda dapat menggunakannya untuk tujuan komersial
- β οΈ Anda harus mengungkapkan kode sumber ketika Anda mendistribusikan software
- β οΈ Penggunaan jaringan adalah distribusi β jika Anda menjalankan versi yang dimodifikasi di server dan membiarkan orang lain berinteraksi dengannya, Anda harus membuat kode sumber tersedia untuk mereka
- β οΈ Modifikasi harus dirilis di bawah lisensi yang sama
Lihat file LICENSE untuk teks lisensi lengkap.
Mengapa AGPL-3.0?
AGPL-3.0 memastikan bahwa perbaikan pada software ini menguntungkan seluruh komunitas. Jika Anda memodifikasi gateway ini dan menerapkannya sebagai layanan, Anda harus membagikan perbaikan Anda dengan pengguna Anda.
Perjanjian Lisensi Kontributor (CLA)
Dengan mengirimkan kontribusi ke proyek ini, Anda menyetujui ketentuan Perjanjian Lisensi Kontributor (CLA) kami. Ini memastikan bahwa:
- Anda memiliki hak untuk mengirimkan kontribusi
- Anda memberikan hak kepada pengelola untuk menggunakan dan melisensi ulang kontribusi Anda
- Proyek tetap dilindungi secara hukum
π Dukung Proyek
Jika proyek ini menghemat waktu atau uang Anda, pertimbangkan untuk mendukungnya!
Setiap kontribusi membantu menjaga proyek ini tetap hidup dan berkembang
π€ Donasi
β Donasi Sekali β’ π Dukungan Bulanan
πͺ Atau kirim crypto
| Mata Uang | Jaringan | Alamat |
|---|---|---|
| USDT | TRC20 | TSVtgRc9pkC1UgcbVeijBHjFmpkYHDRu26 |
| BTC | Bitcoin | 12GZqxqpcBsqJ4Vf1YreLqwoMGvzBPgJq6 |
| ETH | Ethereum | 0xc86eab3bba3bbaf4eb5b5fff8586f1460f1fd395 |
| SOL | Solana | 9amykF7KibZmdaw66a1oqYJyi75fRqgdsqnG66AK3jvh |
| TON | TON | UQBVh8T1H3GI7gd7b-_PPNnxHYYxptrcCVf3qQk5v41h3QTM |
β οΈ Penafian
Proyek ini tidak berafiliasi dengan, didukung oleh, atau disponsori oleh Amazon Web Services (AWS), Anthropic, atau Kiro IDE. Gunakan dengan risiko Anda sendiri dan sesuai dengan ketentuan layanan API yang mendasarinya.