👻 Kiro Gateway
Прокси-шлюз для Kiro API (Amazon Q Developer / AWS CodeWhisperer)
🇬🇧 English • 🇨🇳 中文 • 🇪🇸 Español • 🇮🇩 Indonesia • 🇧🇷 Português • 🇯🇵 日本語 • 🇰🇷 한국어
Сделано с ❤️ от @Jwadow
Используйте модели Claude из Kiro с Claude Code, OpenCode, Cursor, Cline, Roo Code, Kilo Code, Obsidian, OpenAI SDK, LangChain, Continue и другими инструментами, совместимыми с OpenAI или Anthropic
Модели • Возможности • Быстрый старт • Конфигурация • 💖 Поддержать
🤖 Доступные модели
⚠️ Важно: Доступность моделей зависит от вашего тарифа Kiro (бесплатный/платный). Шлюз предоставляет доступ к тем моделям, которые доступны в вашей IDE или CLI в зависимости от вашей подписки. Список ниже показывает модели, обычно доступные на бесплатном тарифе.
🔒 Claude Opus 4.5 был удалён из бесплатного тарифа 17 января 2026 года. Он может быть доступен на платных тарифах — проверьте список моделей в вашей IDE/CLI.
🚀 Claude Sonnet 4.5 — Сбалансированная производительность. Отлично подходит для программирования, написания текстов и задач общего назначения.
⚡ Claude Haiku 4.5 — Молниеносная скорость. Идеальна для быстрых ответов, простых задач и чата.
📦 Claude Sonnet 4 — Предыдущее поколение. По-прежнему мощная и надёжная для большинства задач.
📦 Claude 3.7 Sonnet — Устаревшая модель. Доступна для обратной совместимости.
💡 Умное разрешение моделей: Используйте любой формат названия модели —
claude-sonnet-4-5,claude-sonnet-4.5или даже версионные названия вродеclaude-sonnet-4-5-20250929. Шлюз автоматически нормализует их.
✨ Возможности
| Возможность | Описание |
|---|---|
| 🔌 API, совместимый с OpenAI | Работает с любым инструментом, совместимым с OpenAI |
| 🔌 API, совместимый с Anthropic | Нативный эндпоинт /v1/messages |
| 🌐 Поддержка VPN/Proxy | HTTP/SOCKS5 прокси для ограниченных сетей |
| 🧠 Расширенное мышление | Режим рассуждений — эксклюзив нашего проекта |
| 👁️ Поддержка изображений | Отправляйте изображения модели |
| 🛠️ Вызов инструментов | Поддержка вызова функций |
| 💬 Полная история сообщений | Передаёт полный контекст разговора |
| 📡 Стриминг | Полная поддержка SSE-стриминга |
| 🔄 Логика повторных попыток | Автоматические повторы при ошибках (403, 429, 5xx) |
| 📋 Расширенный список моделей | Включая версионные модели |
| 🔐 Умное управление токенами | Автоматическое обновление до истечения срока |
🚀 Быстрый старт
Предварительные требования
- Python 3.10+
- Одно из следующего:
Установка
# Клонируйте репозиторий (требуется Git)
git clone https://github.com/Jwadow/kiro-gateway.git
cd kiro-gateway
# Или скачайте ZIP: Code → Download ZIP → распакуйте → откройте папку kiro-gateway
# Установите зависимости
pip install -r requirements.txt
# Настройте (см. раздел Конфигурация)
cp .env.example .env
# Скопируйте и отредактируйте .env с вашими учётными данными
# Запустите сервер
python main.py
# Или с другим портом (если 8000 занят)
python main.py --port 9000
Сервер будет доступен по адресу http://localhost:8000
⚙️ Конфигурация
Вариант 1: JSON-файл с учётными данными (Kiro IDE / Enterprise)
Укажите путь к файлу с учётными данными:
Работает с:
- Kiro IDE (стандартный) - для личных аккаунтов
- Enterprise - для корпоративных аккаунтов с SSO
KIRO_CREDS_FILE="~/.aws/sso/cache/kiro-auth-token.json"
# Пароль для защиты ВАШЕГО прокси-сервера (придумайте любую надёжную строку)
# Вы будете использовать его как api_key при подключении к вашему шлюзу
PROXY_API_KEY="my-super-secret-password-123"
📄 Формат 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
}
Примечание: Если у вас есть два JSON файла в
~/.aws/sso/cache/(например,kiro-auth-token.jsonи файл с хешированным названием), используйтеkiro-auth-token.jsonвKIRO_CREDS_FILE. Шлюз автоматически загрузит другой файл.
Вариант 2: Переменные окружения (файл .env)
Создайте файл .env в корне проекта:
# Обязательно
REFRESH_TOKEN="ваш_kiro_refresh_token"
# Пароль для защиты ВАШЕГО прокси-сервера (придумайте любую надёжную строку)
PROXY_API_KEY="my-super-secret-password-123"
# Опционально
PROFILE_ARN="arn:aws:codewhisperer:us-east-1:..."
KIRO_REGION="us-east-1"
Вариант 3: Учётные данные AWS SSO (kiro-cli / Enterprise)
Если вы используете kiro-cli или Kiro IDE с AWS SSO (AWS IAM Identity Center), шлюз автоматически обнаружит и использует соответствующую аутентификацию.
Работает как с бесплатными аккаунтами Builder ID, так и с корпоративными аккаунтами.
KIRO_CREDS_FILE="~/.aws/sso/cache/your-sso-cache-file.json"
# Пароль для защиты ВАШЕГО прокси-сервера
PROXY_API_KEY="my-super-secret-password-123"
# Примечание: PROFILE_ARN НЕ нужен для AWS SSO (Builder ID и корпоративные аккаунты)
# Шлюз будет работать без него
📄 Формат JSON-файла AWS SSO
Файлы учётных данных AWS SSO (из ~/.aws/sso/cache/) содержат:
{
"accessToken": "eyJ...",
"refreshToken": "eyJ...",
"expiresAt": "2025-01-12T23:00:00.000Z",
"region": "us-east-1",
"clientId": "...",
"clientSecret": "..."
}
Примечание: Пользователям AWS SSO (Builder ID и корпоративные аккаунты) НЕ нужен profileArn. Шлюз будет работать без него (если указан, он будет проигнорирован).
🔍 Как это работает
Шлюз автоматически определяет тип аутентификации на основе файла учётных данных:
Kiro Desktop Auth (по умолчанию): Используется, когда
clientIdиclientSecretНЕ присутствуют- Эндпоинт:
https://prod.{region}.auth.desktop.kiro.dev/refreshToken
- Эндпоинт:
AWS SSO (OIDC): Используется, когда
clientIdиclientSecretприсутствуют- Эндпоинт:
https://oidc.{region}.amazonaws.com/token
- Эндпоинт:
Дополнительная настройка не требуется — просто укажите путь к вашему файлу учётных данных!
Вариант 4: SQLite-база данных kiro-cli
Если вы используете kiro-cli и предпочитаете использовать его SQLite-базу данных напрямую:
KIRO_CLI_DB_FILE="~/.local/share/kiro-cli/data.sqlite3"
# Пароль для защиты ВАШЕГО прокси-сервер
PROXY_API_KEY="my-super-secret-password-123"
# Примечание: PROFILE_ARN НЕ нужен для AWS SSO (Builder ID и корпоративные аккаунты)
# Шлюз будет работать без него
📄 Расположение баз данных
| CLI-инструмент | Путь к базе данных |
|---|---|
| kiro-cli | ~/.local/share/kiro-cli/data.sqlite3 |
| amazon-q-developer-cli | ~/.local/share/amazon-q/data.sqlite3 |
Шлюз читает учётные данные из таблицы auth_kv, которая хранит:
kirocli:odic:tokenилиcodewhisperer:odic:token— токен доступа, токен обновления, срок действияkirocli:odic:device-registrationилиcodewhisperer:odic:device-registration— ID клиента и секрет
Оба формата ключей поддерживаются для совместимости с разными версиями kiro-cli.
Получение учётных данных
Для пользователей Kiro IDE:
- Войдите в Kiro IDE и используйте Вариант 1 выше (JSON-файл с учётными данными)
- Файл учётных данных создаётся автоматически после входа
Для пользователей Kiro CLI:
- Войдите с помощью
kiro-cli loginи используйте Вариант 3 или Вариант 4 выше - Ручное извлечение токена не требуется!
🔧 Продвинутое: Ручное извлечение токена
Если вам нужно вручную извлечь refresh token (например, для отладки), вы можете перехватить трафик Kiro IDE:
- Ищите запросы к:
prod.us-east-1.auth.desktop.kiro.dev/refreshToken
🌐 Поддержка VPN/Proxy
Для пользователей в Китае, корпоративных сетях или регионах с проблемами подключения к сервисам AWS.
Шлюз поддерживает маршрутизацию всех запросов Kiro API через VPN или прокси-сервер. Это необходимо, если у вас возникают проблемы с подключением к конечным точкам AWS или вам нужно использовать корпоративный прокси.
Конфигурация
Добавьте в ваш файл .env:
# HTTP прокси
VPN_PROXY_URL=http://127.0.0.1:7890
# SOCKS5 прокси
VPN_PROXY_URL=socks5://127.0.0.1:1080
# С аутентификацией (корпоративные прокси)
VPN_PROXY_URL=http://username:password@proxy.company.com:8080
# Без протокола (по умолчанию http://)
VPN_PROXY_URL=192.168.1.100:8080
Поддерживаемые протоколы
- ✅ HTTP — Стандартный протокол прокси
- ✅ HTTPS — Безопасные соединения прокси
- ✅ SOCKS5 — Продвинутый протокол прокси (распространён в ПО VPN)
- ✅ Аутентификация — Имя пользователя/пароль встроены в URL
Когда это нужно
| Ситуация | Решение |
|---|---|
| Таймауты подключения к AWS | Используйте VPN/прокси для маршрутизации трафика |
| Ограничения корпоративной сети | Настройте прокси вашей компании |
| Проблемы с региональным подключением | Используйте VPN-сервис с поддержкой прокси |
| Требования конфиденциальности | Маршрутизируйте через собственный прокси-сервер |
Популярное ПО VPN с поддержкой прокси
Большинство VPN-клиентов предоставляют локальный прокси-сервер:
- Sing-box — Современный VPN-клиент с поддержкой HTTP/SOCKS5 прокси
- Clash — Обычно работает на
http://127.0.0.1:7890 - V2Ray — Настраиваемый SOCKS5/HTTP прокси
- Shadowsocks — Поддержка SOCKS5 прокси
- Корпоративный VPN — Уточните параметры прокси у вашего IT-отдела
Оставьте VPN_PROXY_URL пустым (по умолчанию), если вам не нужна поддержка прокси.
📡 Справочник API
Эндпоинты
| Эндпоинт | Метод | Описание |
|---|---|---|
/ |
GET | Проверка работоспособности |
/health |
GET | Детальная проверка работоспособности |
/v1/models |
GET | Список доступных моделей |
/v1/chat/completions |
POST | OpenAI Chat Completions API |
/v1/messages |
POST | Anthropic Messages API |
💡 Примеры использования
OpenAI API
🔹 Простой cURL-запрос
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": "Привет!"}],
"stream": true
}'
Примечание: Замените
my-super-secret-password-123наPROXY_API_KEY, который вы указали в файле.env.
🔹 Запрос со стримингом
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": "Ты полезный ассистент."},
{"role": "user", "content": "Сколько будет 2+2?"}
],
"stream": true
}'
🛠️ С вызовом инструментов
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": "Какая погода в Лондоне?"}],
"tools": [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Получить погоду для местоположения",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string", "description": "Название города"}
},
"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 из .env
)
response = client.chat.completions.create(
model="claude-sonnet-4-5",
messages=[
{"role": "system", "content": "Ты полезный ассистент."},
{"role": "user", "content": "Привет!"}
],
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 из .env
model="claude-sonnet-4-5"
)
response = llm.invoke("Привет, как дела?")
print(response.content)
Anthropic API
🔹 Простой cURL-запрос
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": "Привет!"}]
}'
Примечание: Anthropic API использует заголовок
x-api-keyвместоAuthorization: Bearer. Оба варианта поддерживаются.
🔹 С системным промптом
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": "Ты полезный ассистент.",
"messages": [{"role": "user", "content": "Привет!"}]
}'
Примечание: В Anthropic API
system— это отдельное поле, а не сообщение.
📡 Стриминг
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": "Привет!"}]
}'
🐍 Python Anthropic SDK
import anthropic
client = anthropic.Anthropic(
api_key="my-super-secret-password-123", # Ваш PROXY_API_KEY из .env
base_url="http://localhost:8000"
)
# Без стриминга
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Привет!"}]
)
print(response.content[0].text)
# Со стримингом
with client.messages.stream(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Привет!"}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
🔧 Отладка
Логирование отладки отключено по умолчанию. Чтобы включить, добавьте в ваш .env:
# Режим логирования отладки:
# - off: отключено (по умолчанию)
# - errors: сохранять логи только для неудачных запросов (4xx, 5xx) - рекомендуется для устранения неполадок
# - all: сохранять логи для каждого запроса (перезаписывается при каждом запросе)
DEBUG_MODE=errors
Режимы отладки
| Режим | Описание | Случай использования |
|---|---|---|
off |
Отключено (по умолчанию) | Продакшен |
errors |
Сохранять логи только для неудачных запросов (4xx, 5xx) | Рекомендуется для устранения неполадок |
all |
Сохранять логи для каждого запроса | Разработка/отладка |
Файлы отладки
При включении запросы логируются в папку debug_logs/:
| Файл | Описание |
|---|---|
request_body.json |
Входящий запрос от клиента (формат OpenAI) |
kiro_request_body.json |
Запрос, отправленный в Kiro API |
response_stream_raw.txt |
Сырой поток от Kiro |
response_stream_modified.txt |
Преобразованный поток (формат OpenAI) |
app_logs.txt |
Логи приложения для запроса |
error_info.json |
Детали ошибки (только при ошибках) |
📜 Лицензия
Этот проект лицензирован под GNU Affero General Public License v3.0 (AGPL-3.0).
Это означает:
- ✅ Вы можете использовать, модифицировать и распространять это программное обеспечение
- ✅ Вы можете использовать его в коммерческих целях
- ⚠️ Вы должны раскрыть исходный код при распространении программного обеспечения
- ⚠️ Сетевое использование является распространением — если вы запускаете модифицированную версию на сервере и позволяете другим взаимодействовать с ней, вы должны сделать исходный код доступным для них
- ⚠️ Модификации должны быть выпущены под той же лицензией
Полный текст лицензии см. в файле LICENSE.
Почему AGPL-3.0?
AGPL-3.0 гарантирует, что улучшения этого программного обеспечения принесут пользу всему сообществу. Если вы модифицируете этот шлюз и развёртываете его как сервис, вы должны поделиться своими улучшениями с вашими пользователями.
Лицензионное соглашение участника (CLA)
Отправляя вклад в этот проект, вы соглашаетесь с условиями нашего Лицензионного соглашения участника (CLA). Это гарантирует, что:
- Вы имеете право отправить вклад
- Вы предоставляете мейнтейнеру права на использование и перелицензирование вашего вклада
- Проект остаётся юридически защищённым
💖 Поддержать проект
Если этот проект сэкономил вам время или деньги, рассмотрите возможность его поддержки!
Каждый вклад помогает поддерживать жизнь и развитие этого проекта
🤑 Пожертвовать
☕ Разовое пожертвование • 💎 Ежемесячная поддержка
🪙 Или отправьте криптовалюту
| Валюта | Сеть | Адрес |
|---|---|---|
| USDT | TRC20 | TSVtgRc9pkC1UgcbVeijBHjFmpkYHDRu26 |
| BTC | Bitcoin | 12GZqxqpcBsqJ4Vf1YreLqwoMGvzBPgJq6 |
| ETH | Ethereum | 0xc86eab3bba3bbaf4eb5b5fff8586f1460f1fd395 |
| SOL | Solana | 9amykF7KibZmdaw66a1oqYJyi75fRqgdsqnG66AK3jvh |
| TON | TON | UQBVh8T1H3GI7gd7b-_PPNnxHYYxptrcCVf3qQk5v41h3QTM |
⚠️ Отказ от ответственности
Этот проект не связан с Amazon Web Services (AWS), Anthropic или Kiro IDE, не одобрен и не спонсируется ими. Используйте на свой страх и риск и в соответствии с условиями использования базовых API.