# ๐Ÿ‘ป Kiro Gateway **Kiro API (Amazon Q Developer / AWS CodeWhisperer) ํ”„๋ก์‹œ ๊ฒŒ์ดํŠธ์›จ์ด** [๐Ÿ‡ฌ๐Ÿ‡ง English](../../README.md) โ€ข [๐Ÿ‡ท๐Ÿ‡บ ะ ัƒััะบะธะน](../ru/README.md) โ€ข [๐Ÿ‡จ๐Ÿ‡ณ ไธญๆ–‡](../zh/README.md) โ€ข [๐Ÿ‡ช๐Ÿ‡ธ Espaรฑol](../es/README.md) โ€ข [๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesia](../id/README.md) โ€ข [๐Ÿ‡ง๐Ÿ‡ท Portuguรชs](../pt/README.md) โ€ข [๐Ÿ‡ฏ๐Ÿ‡ต ๆ—ฅๆœฌ่ชž](../ja/README.md) [@Jwadow](https://github.com/jwadow)๊ฐ€ โค๏ธ๋ฅผ ๋‹ด์•„ ์ œ์ž‘ [![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![FastAPI](https://img.shields.io/badge/FastAPI-0.100+-green.svg)](https://fastapi.tiangolo.com/) [![Sponsor](https://img.shields.io/badge/๐Ÿ’–_Sponsor-๊ฐœ๋ฐœ_์ง€์›-ff69b4)](#-ํ”„๋กœ์ ํŠธ-ํ›„์›) *Kiro์˜ Claude ๋ชจ๋ธ์„ Claude Code, OpenCode, Cursor, Cline, Roo Code, Kilo Code, Obsidian, OpenAI SDK, LangChain, Continue ๋ฐ ๊ธฐํƒ€ OpenAI ๋˜๋Š” Anthropic ํ˜ธํ™˜ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ* [๋ชจ๋ธ](#-์ง€์›-๋ชจ๋ธ) โ€ข [๊ธฐ๋Šฅ](#-๊ธฐ๋Šฅ) โ€ข [๋น ๋ฅธ-์‹œ์ž‘](#-๋น ๋ฅธ-์‹œ์ž‘) โ€ข [์„ค์ •](#%EF%B8%8F-์„ค์ •) โ€ข [๐Ÿ’– ํ›„์›](#-ํ”„๋กœ์ ํŠธ-ํ›„์›)
--- ## ๐Ÿค– ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋ธ > โš ๏ธ **์ค‘์š”:** ๋ชจ๋ธ ๊ฐ€์šฉ์„ฑ์€ Kiro ํ”Œ๋žœ(๋ฌด๋ฃŒ/์œ ๋ฃŒ)์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ฒŒ์ดํŠธ์›จ์ด๋Š” ๊ตฌ๋…์— ๋”ฐ๋ผ IDE ๋˜๋Š” CLI์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋ธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋ชฉ๋ก์€ **๋ฌด๋ฃŒ ํ”Œ๋žœ**์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋ธ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. > ๐Ÿ”’ **Claude Opus 4.5**๋Š” 2026๋…„ 1์›” 17์ผ์— ๋ฌด๋ฃŒ ํ”Œ๋žœ์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์œ ๋ฃŒ ํ”Œ๋žœ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค โ€” 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`์™€ ๊ฐ™์€ ๋ฒ„์ „ ์ด๋ฆ„๋„. ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ์ž๋™์œผ๋กœ ์ •๊ทœํ™”ํ•ฉ๋‹ˆ๋‹ค. --- ## โœจ ๊ธฐ๋Šฅ | ๊ธฐ๋Šฅ | ์„ค๋ช… | |------|------| | ๐Ÿ”Œ **OpenAI ํ˜ธํ™˜ API** | OpenAI ํ˜ธํ™˜ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์ž‘๋™ | | ๐Ÿ”Œ **Anthropic ํ˜ธํ™˜ API** | ๋„ค์ดํ‹ฐ๋ธŒ `/v1/messages` ์—”๋“œํฌ์ธํŠธ | | ๐ŸŒ **VPN/ํ”„๋ก์‹œ ์ง€์›** | ์ œํ•œ๋œ ๋„คํŠธ์›Œํฌ์šฉ HTTP/SOCKS5 ํ”„๋ก์‹œ | | ๐Ÿง  **ํ™•์žฅ ์‚ฌ๊ณ ** | ์ถ”๋ก  ๊ธฐ๋Šฅ์€ ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋งŒ์˜ ๋…์  ๊ธฐ๋Šฅ | | ๐Ÿ‘๏ธ **๋น„์ „ ์ง€์›** | ๋ชจ๋ธ์— ์ด๋ฏธ์ง€ ์ „์†ก | | ๐Ÿ› ๏ธ **๋„๊ตฌ ํ˜ธ์ถœ** | ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ง€์› | | ๐Ÿ’ฌ **์ „์ฒด ๋ฉ”์‹œ์ง€ ๊ธฐ๋ก** | ์™„์ „ํ•œ ๋Œ€ํ™” ์ปจํ…์ŠคํŠธ ์ „๋‹ฌ | | ๐Ÿ“ก **์ŠคํŠธ๋ฆฌ๋ฐ** | ์™„์ „ํ•œ SSE ์ŠคํŠธ๋ฆฌ๋ฐ ์ง€์› | | ๐Ÿ”„ **์žฌ์‹œ๋„ ๋กœ์ง** | ์˜ค๋ฅ˜ ์‹œ ์ž๋™ ์žฌ์‹œ๋„ (403, 429, 5xx) | | ๐Ÿ“‹ **ํ™•์žฅ ๋ชจ๋ธ ๋ชฉ๋ก** | ๋ฒ„์ „ ๋ชจ๋ธ ํฌํ•จ | | ๐Ÿ” **์Šค๋งˆํŠธ ํ† ํฐ ๊ด€๋ฆฌ** | ๋งŒ๋ฃŒ ์ „ ์ž๋™ ๊ฐฑ์‹  | --- ## ๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘ ### ์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ - Python 3.10+ - ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜: - ๋กœ๊ทธ์ธ๋œ ๊ณ„์ •์ด ์žˆ๋Š” [Kiro IDE](https://kiro.dev/), ๋˜๋Š” - AWS SSO (AWS IAM Identity Center, OIDC)๊ฐ€ ์žˆ๋Š” [Kiro CLI](https://kiro.dev/cli/) - ๋ฌด๋ฃŒ Builder ID ๋˜๋Š” ๊ธฐ์—… ๊ณ„์ • ### ์„ค์น˜ ```bash # ์ €์žฅ์†Œ ํด๋ก  (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๊ฐ€ ์žˆ๋Š” ๊ธฐ์—… ๊ณ„์ •์šฉ ```env KIRO_CREDS_FILE="~/.aws/sso/cache/kiro-auth-token.json" # ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ (์•ˆ์ „ํ•œ ๋ฌธ์ž์—ด ์„ค์ •) # ๊ฒŒ์ดํŠธ์›จ์ด์— ์—ฐ๊ฒฐํ•  ๋•Œ api_key๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค PROXY_API_KEY="my-super-secret-password-123" ```
๐Ÿ“„ JSON ํŒŒ์ผ ํ˜•์‹ ```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 } ``` > **์ฐธ๊ณ :** `~/.aws/sso/cache/`์— ๋‘ ๊ฐœ์˜ JSON ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ (์˜ˆ: `kiro-auth-token.json` ๋ฐ ํ•ด์‹œ ์ด๋ฆ„์˜ ํŒŒ์ผ), `KIRO_CREDS_FILE`์—์„œ `kiro-auth-token.json`์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ๋‹ค๋ฅธ ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
### ์˜ต์…˜ 2: ํ™˜๊ฒฝ ๋ณ€์ˆ˜ (.env ํŒŒ์ผ) ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— `.env` ํŒŒ์ผ ์ƒ์„ฑ: ```env # ํ•„์ˆ˜ REFRESH_TOKEN="your_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) AWS SSO (AWS IAM Identity Center)์™€ ํ•จ๊ป˜ `kiro-cli` ๋˜๋Š” Kiro IDE๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ์ž๋™์œผ๋กœ ์ ์ ˆํ•œ ์ธ์ฆ์„ ๊ฐ์ง€ํ•˜๊ณ  ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฌด๋ฃŒ Builder ID ๊ณ„์ •๊ณผ ๊ธฐ์—… ๊ณ„์ • ๋ชจ๋‘์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ```env KIRO_CREDS_FILE="~/.aws/sso/cache/your-sso-cache-file.json" # ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ PROXY_API_KEY="my-super-secret-password-123" # ์ฐธ๊ณ : AWS SSO (Builder ID ๋ฐ ๊ธฐ์—… ๊ณ„์ •) ์‚ฌ์šฉ์ž๋Š” PROFILE_ARN ๋ถˆํ•„์š” # ๊ฒŒ์ดํŠธ์›จ์ด๋Š” ๊ทธ๊ฒƒ ์—†์ด๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค ```
๐Ÿ“„ AWS SSO JSON ํŒŒ์ผ ํ˜•์‹ AWS SSO ์ž๊ฒฉ ์ฆ๋ช… ํŒŒ์ผ (`~/.aws/sso/cache/`์—์„œ)์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค: ```json { "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: kiro-cli SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค `kiro-cli`๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ: ```env KIRO_CLI_DB_FILE="~/.local/share/kiro-cli/data.sqlite3" # ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ PROXY_API_KEY="my-super-secret-password-123" # ์ฐธ๊ณ : AWS SSO (Builder ID ๋ฐ ๊ธฐ์—… ๊ณ„์ •) ์‚ฌ์šฉ์ž๋Š” PROFILE_ARN ๋ถˆํ•„์š” # ๊ฒŒ์ดํŠธ์›จ์ด๋Š” ๊ทธ๊ฒƒ ์—†์ด๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค ```
๐Ÿ“„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์œ„์น˜ | 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 ์‚ฌ์šฉ - ์ˆ˜๋™ ํ† ํฐ ์ถ”์ถœ ๋ถˆํ•„์š”!
๐Ÿ”ง ๊ณ ๊ธ‰: ์ˆ˜๋™ ํ† ํฐ ์ถ”์ถœ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ์ˆ˜๋™์œผ๋กœ ์ถ”์ถœํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ (์˜ˆ: ๋””๋ฒ„๊น…์šฉ), Kiro IDE ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: - ๋‹ค์Œ์œผ๋กœ์˜ ์š”์ฒญ ์ฐพ๊ธฐ: `prod.us-east-1.auth.desktop.kiro.dev/refreshToken`
--- ## ๐ŸŒ VPN/ํ”„๋ก์‹œ ์ง€์› **์ค‘๊ตญ, ๊ธฐ์—… ๋„คํŠธ์›Œํฌ ๋˜๋Š” AWS ์„œ๋น„์Šค ์—ฐ๊ฒฐ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์ง€์—ญ์˜ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.** ๊ฒŒ์ดํŠธ์›จ์ด๋Š” ๋ชจ๋“  Kiro API ์š”์ฒญ์„ VPN ๋˜๋Š” ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ๋ผ์šฐํŒ…ํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. AWS ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ๊ธฐ์—… ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ### ์„ค์ • `.env` ํŒŒ์ผ์— ์ถ”๊ฐ€: ```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** โ€” HTTP/SOCKS5 ํ”„๋ก์‹œ ์ง€์›์ด ์žˆ๋Š” ์ตœ์‹  VPN ํด๋ผ์ด์–ธํŠธ - **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 ์š”์ฒญ ```bash 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`์„ `.env` ํŒŒ์ผ์— ์„ค์ •ํ•œ `PROXY_API_KEY`๋กœ ๊ต์ฒดํ•˜์„ธ์š”.
๐Ÿ”น ์ŠคํŠธ๋ฆฌ๋ฐ ์š”์ฒญ ```bash 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 }' ```
๐Ÿ› ๏ธ ๋„๊ตฌ ํ˜ธ์ถœ ํฌํ•จ ```bash 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 ```python from openai import OpenAI client = OpenAI( base_url="http://localhost:8000/v1", api_key="my-super-secret-password-123" # .env์˜ PROXY_API_KEY ) 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 ```python from langchain_openai import ChatOpenAI llm = ChatOpenAI( base_url="http://localhost:8000/v1", api_key="my-super-secret-password-123", # .env์˜ PROXY_API_KEY model="claude-sonnet-4-5" ) response = llm.invoke("์•ˆ๋…•ํ•˜์„ธ์š”, ์–ด๋–ป๊ฒŒ ์ง€๋‚ด์„ธ์š”?") print(response.content) ```
### Anthropic API
๐Ÿ”น ๊ฐ„๋‹จํ•œ cURL ์š”์ฒญ ```bash 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๋Š” `Authorization: Bearer` ๋Œ€์‹  `x-api-key` ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์ง€์›๋ฉ๋‹ˆ๋‹ค.
๐Ÿ”น ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ํฌํ•จ ```bash 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`์€ ๋ฉ”์‹œ์ง€๊ฐ€ ์•„๋‹Œ ๋ณ„๋„์˜ ํ•„๋“œ์ž…๋‹ˆ๋‹ค.
๐Ÿ“ก ์ŠคํŠธ๋ฆฌ๋ฐ ```bash 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 ```python import anthropic client = anthropic.Anthropic( api_key="my-super-secret-password-123", # .env์˜ PROXY_API_KEY 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`์— ์ถ”๊ฐ€: ```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](../../LICENSE) ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”. ### ์™œ AGPL-3.0์ธ๊ฐ€? AGPL-3.0์€ ์ด ์†Œํ”„ํŠธ์›จ์–ด์— ๋Œ€ํ•œ ๊ฐœ์„ ์ด ์ „์ฒด ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์ด์ต์ด ๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์„œ๋น„์Šค๋กœ ๋ฐฐํฌํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž์™€ ๊ฐœ์„  ์‚ฌํ•ญ์„ ๊ณต์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ### ๊ธฐ์—ฌ์ž ๋ผ์ด์„ ์Šค ๊ณ„์•ฝ (CLA) ์ด ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌ๋ฅผ ์ œ์ถœํ•จ์œผ๋กœ์จ [๊ธฐ์—ฌ์ž ๋ผ์ด์„ ์Šค ๊ณ„์•ฝ (CLA)](../../CLA.md)์˜ ์กฐ๊ฑด์— ๋™์˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค์Œ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค: - ๊ธฐ์—ฌ๋ฅผ ์ œ์ถœํ•  ๊ถŒ๋ฆฌ๊ฐ€ ์žˆ์Œ - ๋ฉ”์ธํ…Œ์ด๋„ˆ์—๊ฒŒ ๊ธฐ์—ฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žฌ๋ผ์ด์„ ์Šคํ•  ๊ถŒ๋ฆฌ๋ฅผ ๋ถ€์—ฌํ•จ - ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ฒ•์ ์œผ๋กœ ๋ณดํ˜ธ๋จ --- ## ๐Ÿ’– ํ”„๋กœ์ ํŠธ ํ›„์›
Love **์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ์‹œ๊ฐ„์ด๋‚˜ ๋ˆ์„ ์ ˆ์•ฝํ•ด ์ฃผ์—ˆ๋‹ค๋ฉด ํ›„์›์„ ๊ณ ๋ คํ•ด ์ฃผ์„ธ์š”!** ๋ชจ๋“  ๊ธฐ์—ฌ๊ฐ€ ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์„ฑ์žฅ์‹œํ‚ค๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค
### ๐Ÿค‘ ๊ธฐ๋ถ€ [**โ˜• ์ผํšŒ์„ฑ ๊ธฐ๋ถ€**](https://app.lava.top/jwadow?tabId=donate)  โ€ข  [**๐Ÿ’Ž ์›”๊ฐ„ ํ›„์›**](https://app.lava.top/jwadow?tabId=subscriptions)
### ๐Ÿช™ ๋˜๋Š” ์•”ํ˜ธํ™”ํ ์ „์†ก | ํ†ตํ™” | ๋„คํŠธ์›Œํฌ | ์ฃผ์†Œ | |:----:|:-------:|:-----| | **USDT** | TRC20 | `TSVtgRc9pkC1UgcbVeijBHjFmpkYHDRu26` | | **BTC** | Bitcoin | `12GZqxqpcBsqJ4Vf1YreLqwoMGvzBPgJq6` | | **ETH** | Ethereum | `0xc86eab3bba3bbaf4eb5b5fff8586f1460f1fd395` | | **SOL** | Solana | `9amykF7KibZmdaw66a1oqYJyi75fRqgdsqnG66AK3jvh` | | **TON** | TON | `UQBVh8T1H3GI7gd7b-_PPNnxHYYxptrcCVf3qQk5v41h3QTM` |
--- ## โš ๏ธ ๋ฉด์ฑ… ์กฐํ•ญ ์ด ํ”„๋กœ์ ํŠธ๋Š” Amazon Web Services (AWS), Anthropic ๋˜๋Š” Kiro IDE์™€ ์ œํœด, ์Šน์ธ ๋˜๋Š” ํ›„์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์‹ ์˜ ์ฑ…์ž„ ํ•˜์— ์‚ฌ์šฉํ•˜๊ณ  ๊ธฐ๋ณธ API์˜ ์„œ๋น„์Šค ์•ฝ๊ด€์„ ์ค€์ˆ˜ํ•˜์„ธ์š”. ---
**[โฌ† ๋งจ ์œ„๋กœ](#-kiro-gateway)**