API / kiro-gateway /docs /ko /README.md
sshinmen's picture
Clean deploy to HF Space
bf9e111
|
Raw
History Blame Contribute Delete
20.2 kB
<div align="center">
# ๐Ÿ‘ป 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-์„ค์ •) โ€ข [๐Ÿ’– ํ›„์›](#-ํ”„๋กœ์ ํŠธ-ํ›„์›)
</div>
---
## ๐Ÿค– ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋ธ
> โš ๏ธ **์ค‘์š”:** ๋ชจ๋ธ ๊ฐ€์šฉ์„ฑ์€ 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"
```
<details>
<summary>๐Ÿ“„ JSON ํŒŒ์ผ ํ˜•์‹</summary>
```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`์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ๋‹ค๋ฅธ ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
</details>
### ์˜ต์…˜ 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 ๋ถˆํ•„์š”
# ๊ฒŒ์ดํŠธ์›จ์ด๋Š” ๊ทธ๊ฒƒ ์—†์ด๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค
```
<details>
<summary>๐Ÿ“„ AWS SSO JSON ํŒŒ์ผ ํ˜•์‹</summary>
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`์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ดํŠธ์›จ์ด๋Š” ๊ทธ๊ฒƒ ์—†์ด๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค (์ง€์ •๋œ ๊ฒฝ์šฐ ๋ฌด์‹œ๋จ).
</details>
<details>
<summary>๐Ÿ” ์ž‘๋™ ๋ฐฉ์‹</summary>
๊ฒŒ์ดํŠธ์›จ์ด๋Š” ์ž๊ฒฉ ์ฆ๋ช… ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ์ฆ ์œ ํ˜•์„ ์ž๋™ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค:
- **Kiro Desktop Auth** (๊ธฐ๋ณธ๊ฐ’): `clientId`์™€ `clientSecret`์ด ์—†์„ ๋•Œ ์‚ฌ์šฉ
- ์—”๋“œํฌ์ธํŠธ: `https://prod.{region}.auth.desktop.kiro.dev/refreshToken`
- **AWS SSO (OIDC)**: `clientId`์™€ `clientSecret`์ด ์žˆ์„ ๋•Œ ์‚ฌ์šฉ
- ์—”๋“œํฌ์ธํŠธ: `https://oidc.{region}.amazonaws.com/token`
์ถ”๊ฐ€ ์„ค์ • ๋ถˆํ•„์š” โ€” ์ž๊ฒฉ ์ฆ๋ช… ํŒŒ์ผ๋งŒ ์ง€์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค!
</details>
### ์˜ต์…˜ 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 ๋ถˆํ•„์š”
# ๊ฒŒ์ดํŠธ์›จ์ด๋Š” ๊ทธ๊ฒƒ ์—†์ด๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค
```
<details>
<summary>๐Ÿ“„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์œ„์น˜</summary>
| 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 ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ๋‘ ํ‚ค ํ˜•์‹ ๋ชจ๋‘ ์ง€์›๋ฉ๋‹ˆ๋‹ค.
</details>
### ์ž๊ฒฉ ์ฆ๋ช… ์–ป๊ธฐ
**Kiro IDE ์‚ฌ์šฉ์ž:**
- Kiro IDE์— ๋กœ๊ทธ์ธํ•˜๊ณ  ์œ„์˜ ์˜ต์…˜ 1 (JSON ์ž๊ฒฉ ์ฆ๋ช… ํŒŒ์ผ) ์‚ฌ์šฉ
- ์ž๊ฒฉ ์ฆ๋ช… ํŒŒ์ผ์€ ๋กœ๊ทธ์ธ ํ›„ ์ž๋™ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค
**Kiro CLI ์‚ฌ์šฉ์ž:**
- `kiro-cli login`์œผ๋กœ ๋กœ๊ทธ์ธํ•˜๊ณ  ์œ„์˜ ์˜ต์…˜ 3 ๋˜๋Š” 4 ์‚ฌ์šฉ
- ์ˆ˜๋™ ํ† ํฐ ์ถ”์ถœ ๋ถˆํ•„์š”!
<details>
<summary>๐Ÿ”ง ๊ณ ๊ธ‰: ์ˆ˜๋™ ํ† ํฐ ์ถ”์ถœ</summary>
๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ์ˆ˜๋™์œผ๋กœ ์ถ”์ถœํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ (์˜ˆ: ๋””๋ฒ„๊น…์šฉ), Kiro IDE ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
- ๋‹ค์Œ์œผ๋กœ์˜ ์š”์ฒญ ์ฐพ๊ธฐ: `prod.us-east-1.auth.desktop.kiro.dev/refreshToken`
</details>
---
## ๐ŸŒ 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
<details>
<summary>๐Ÿ”น ๊ฐ„๋‹จํ•œ cURL ์š”์ฒญ</summary>
```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`๋กœ ๊ต์ฒดํ•˜์„ธ์š”.
</details>
<details>
<summary>๐Ÿ”น ์ŠคํŠธ๋ฆฌ๋ฐ ์š”์ฒญ</summary>
```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
}'
```
</details>
<details>
<summary>๐Ÿ› ๏ธ ๋„๊ตฌ ํ˜ธ์ถœ ํฌํ•จ</summary>
```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"]
}
}
}]
}'
```
</details>
<details>
<summary>๐Ÿ Python OpenAI SDK</summary>
```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="")
```
</details>
<details>
<summary>๐Ÿฆœ LangChain</summary>
```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)
```
</details>
### Anthropic API
<details>
<summary>๐Ÿ”น ๊ฐ„๋‹จํ•œ cURL ์š”์ฒญ</summary>
```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` ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์ง€์›๋ฉ๋‹ˆ๋‹ค.
</details>
<details>
<summary>๐Ÿ”น ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ํฌํ•จ</summary>
```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`์€ ๋ฉ”์‹œ์ง€๊ฐ€ ์•„๋‹Œ ๋ณ„๋„์˜ ํ•„๋“œ์ž…๋‹ˆ๋‹ค.
</details>
<details>
<summary>๐Ÿ“ก ์ŠคํŠธ๋ฆฌ๋ฐ</summary>
```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": "์•ˆ๋…•ํ•˜์„ธ์š”!"}]
}'
```
</details>
<details>
<summary>๐Ÿ Python Anthropic SDK</summary>
```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)
```
</details>
---
## ๐Ÿ”ง ๋””๋ฒ„๊น…
๋””๋ฒ„๊ทธ ๋กœ๊น…์€ **๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”**๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด `.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)์˜ ์กฐ๊ฑด์— ๋™์˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค์Œ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค:
- ๊ธฐ์—ฌ๋ฅผ ์ œ์ถœํ•  ๊ถŒ๋ฆฌ๊ฐ€ ์žˆ์Œ
- ๋ฉ”์ธํ…Œ์ด๋„ˆ์—๊ฒŒ ๊ธฐ์—ฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žฌ๋ผ์ด์„ ์Šคํ•  ๊ถŒ๋ฆฌ๋ฅผ ๋ถ€์—ฌํ•จ
- ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ฒ•์ ์œผ๋กœ ๋ณดํ˜ธ๋จ
---
## ๐Ÿ’– ํ”„๋กœ์ ํŠธ ํ›„์›
<div align="center">
<img src="https://raw.githubusercontent.com/Tarikul-Islam-Anik/Animated-Fluent-Emojis/master/Emojis/Smilies/Smiling%20Face%20with%20Hearts.png" alt="Love" width="80" />
**์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ์‹œ๊ฐ„์ด๋‚˜ ๋ˆ์„ ์ ˆ์•ฝํ•ด ์ฃผ์—ˆ๋‹ค๋ฉด ํ›„์›์„ ๊ณ ๋ คํ•ด ์ฃผ์„ธ์š”!**
๋ชจ๋“  ๊ธฐ์—ฌ๊ฐ€ ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์„ฑ์žฅ์‹œํ‚ค๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค
<br>
### ๐Ÿค‘ ๊ธฐ๋ถ€
[**โ˜• ์ผํšŒ์„ฑ ๊ธฐ๋ถ€**](https://app.lava.top/jwadow?tabId=donate) &nbsp;โ€ข&nbsp; [**๐Ÿ’Ž ์›”๊ฐ„ ํ›„์›**](https://app.lava.top/jwadow?tabId=subscriptions)
<br>
### ๐Ÿช™ ๋˜๋Š” ์•”ํ˜ธํ™”ํ ์ „์†ก
| ํ†ตํ™” | ๋„คํŠธ์›Œํฌ | ์ฃผ์†Œ |
|:----:|:-------:|:-----|
| **USDT** | TRC20 | `TSVtgRc9pkC1UgcbVeijBHjFmpkYHDRu26` |
| **BTC** | Bitcoin | `12GZqxqpcBsqJ4Vf1YreLqwoMGvzBPgJq6` |
| **ETH** | Ethereum | `0xc86eab3bba3bbaf4eb5b5fff8586f1460f1fd395` |
| **SOL** | Solana | `9amykF7KibZmdaw66a1oqYJyi75fRqgdsqnG66AK3jvh` |
| **TON** | TON | `UQBVh8T1H3GI7gd7b-_PPNnxHYYxptrcCVf3qQk5v41h3QTM` |
</div>
---
## โš ๏ธ ๋ฉด์ฑ… ์กฐํ•ญ
์ด ํ”„๋กœ์ ํŠธ๋Š” Amazon Web Services (AWS), Anthropic ๋˜๋Š” Kiro IDE์™€ ์ œํœด, ์Šน์ธ ๋˜๋Š” ํ›„์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์‹ ์˜ ์ฑ…์ž„ ํ•˜์— ์‚ฌ์šฉํ•˜๊ณ  ๊ธฐ๋ณธ API์˜ ์„œ๋น„์Šค ์•ฝ๊ด€์„ ์ค€์ˆ˜ํ•˜์„ธ์š”.
---
<div align="center">
**[โฌ† ๋งจ ์œ„๋กœ](#-kiro-gateway)**
</div>