API / kiro-gateway /docs /ko /README.md
sshinmen's picture
Clean deploy to HF Space
bf9e111
|
Raw
History Blame Contribute Delete
20.2 kB

๐Ÿ‘ป Kiro Gateway

Kiro API (Amazon Q Developer / AWS CodeWhisperer) ํ”„๋ก์‹œ ๊ฒŒ์ดํŠธ์›จ์ด

๐Ÿ‡ฌ๐Ÿ‡ง English โ€ข ๐Ÿ‡ท๐Ÿ‡บ ะ ัƒััะบะธะน โ€ข ๐Ÿ‡จ๐Ÿ‡ณ ไธญๆ–‡ โ€ข ๐Ÿ‡ช๐Ÿ‡ธ Espaรฑol โ€ข ๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesia โ€ข ๐Ÿ‡ง๐Ÿ‡ท Portuguรชs โ€ข ๐Ÿ‡ฏ๐Ÿ‡ต ๆ—ฅๆœฌ่ชž

@Jwadow๊ฐ€ โค๏ธ๋ฅผ ๋‹ด์•„ ์ œ์ž‘

License: AGPL v3 Python 3.10+ FastAPI Sponsor

Kiro์˜ Claude ๋ชจ๋ธ์„ Claude Code, OpenCode, Cursor, Cline, Roo Code, Kilo Code, Obsidian, OpenAI SDK, LangChain, Continue ๋ฐ ๊ธฐํƒ€ OpenAI ๋˜๋Š” Anthropic ํ˜ธํ™˜ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ

๋ชจ๋ธ โ€ข ๊ธฐ๋Šฅ โ€ข ๋น ๋ฅธ-์‹œ์ž‘ โ€ข ์„ค์ • โ€ข ๐Ÿ’– ํ›„์›


๐Ÿค– ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋ธ

โš ๏ธ ์ค‘์š”: ๋ชจ๋ธ ๊ฐ€์šฉ์„ฑ์€ 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, ๋˜๋Š”
    • AWS SSO (AWS IAM Identity Center, OIDC)๊ฐ€ ์žˆ๋Š” Kiro CLI - ๋ฌด๋ฃŒ Builder ID ๋˜๋Š” ๊ธฐ์—… ๊ณ„์ •

์„ค์น˜

# ์ €์žฅ์†Œ ํด๋ก  (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
}

์ฐธ๊ณ : ~/.aws/sso/cache/์— ๋‘ ๊ฐœ์˜ JSON ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ (์˜ˆ: kiro-auth-token.json ๋ฐ ํ•ด์‹œ ์ด๋ฆ„์˜ ํŒŒ์ผ), KIRO_CREDS_FILE์—์„œ kiro-auth-token.json์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ๋‹ค๋ฅธ ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜ 2: ํ™˜๊ฒฝ ๋ณ€์ˆ˜ (.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 ๊ณ„์ •๊ณผ ๊ธฐ์—… ๊ณ„์ • ๋ชจ๋‘์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

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/์—์„œ)์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค:

{
  "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 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ:

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 ํŒŒ์ผ์— ์ถ”๊ฐ€:

# 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 ์š”์ฒญ
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๋กœ ๊ต์ฒดํ•˜์„ธ์š”.

๐Ÿ”น ์ŠคํŠธ๋ฆฌ๋ฐ ์š”์ฒญ
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"  # .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
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 ์š”์ฒญ
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 ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์ง€์›๋ฉ๋‹ˆ๋‹ค.

๐Ÿ”น ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ํฌํ•จ
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",  # .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์— ์ถ”๊ฐ€:

# ๋””๋ฒ„๊ทธ ๋กœ๊น… ๋ชจ๋“œ:
# - 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)์˜ ์กฐ๊ฑด์— ๋™์˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค์Œ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค:

  • ๊ธฐ์—ฌ๋ฅผ ์ œ์ถœํ•  ๊ถŒ๋ฆฌ๊ฐ€ ์žˆ์Œ
  • ๋ฉ”์ธํ…Œ์ด๋„ˆ์—๊ฒŒ ๊ธฐ์—ฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žฌ๋ผ์ด์„ ์Šคํ•  ๊ถŒ๋ฆฌ๋ฅผ ๋ถ€์—ฌํ•จ
  • ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ฒ•์ ์œผ๋กœ ๋ณดํ˜ธ๋จ

๐Ÿ’– ํ”„๋กœ์ ํŠธ ํ›„์›

Love

์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ์‹œ๊ฐ„์ด๋‚˜ ๋ˆ์„ ์ ˆ์•ฝํ•ด ์ฃผ์—ˆ๋‹ค๋ฉด ํ›„์›์„ ๊ณ ๋ คํ•ด ์ฃผ์„ธ์š”!

๋ชจ๋“  ๊ธฐ์—ฌ๊ฐ€ ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์„ฑ์žฅ์‹œํ‚ค๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค


๐Ÿค‘ ๊ธฐ๋ถ€

โ˜• ์ผํšŒ์„ฑ ๊ธฐ๋ถ€  โ€ข  ๐Ÿ’Ž ์›”๊ฐ„ ํ›„์›


๐Ÿช™ ๋˜๋Š” ์•”ํ˜ธํ™”ํ ์ „์†ก

ํ†ตํ™” ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ
USDT TRC20 TSVtgRc9pkC1UgcbVeijBHjFmpkYHDRu26
BTC Bitcoin 12GZqxqpcBsqJ4Vf1YreLqwoMGvzBPgJq6
ETH Ethereum 0xc86eab3bba3bbaf4eb5b5fff8586f1460f1fd395
SOL Solana 9amykF7KibZmdaw66a1oqYJyi75fRqgdsqnG66AK3jvh
TON TON UQBVh8T1H3GI7gd7b-_PPNnxHYYxptrcCVf3qQk5v41h3QTM

โš ๏ธ ๋ฉด์ฑ… ์กฐํ•ญ

์ด ํ”„๋กœ์ ํŠธ๋Š” Amazon Web Services (AWS), Anthropic ๋˜๋Š” Kiro IDE์™€ ์ œํœด, ์Šน์ธ ๋˜๋Š” ํ›„์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์‹ ์˜ ์ฑ…์ž„ ํ•˜์— ์‚ฌ์šฉํ•˜๊ณ  ๊ธฐ๋ณธ API์˜ ์„œ๋น„์Šค ์•ฝ๊ด€์„ ์ค€์ˆ˜ํ•˜์„ธ์š”.