Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

32 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

freebuff2cloudflare-api

License: MIT

freebuff ๋ฌด๋ฃŒ ๋ชจ๋ธ์„ OpenAI ํ˜ธํ™˜ API๋กœ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Cloudflare Worker์ž…๋‹ˆ๋‹ค. TypeScript ์†Œ์Šค๋ฅผ Wrangler๊ฐ€ ํ•˜๋‚˜์˜ Worker๋กœ ๋ฒˆ๋“ค๋งํ•˜๋ฉฐ, ๋ณ„๋„ ๋Ÿฐํƒ€์ž„ ์˜์กด์„ฑ ์—†์ด ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

  • ๊ณ„์ •ยท๋ชจ๋ธ๋ณ„ ํ•œ๋„ ๊ด€์ธก โ€” ์ธ์ฆ๋œ GET /v1/accounts?refresh=1์œผ๋กœ Worker egress ๊ธฐ์ค€ ๊ณ„์ • tier์™€ DeepSeek FlashยทMuse Spark์˜ upstream ํ•œ๋„ ์Šค๋ƒ…์ƒท์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚˜๋จธ์ง€ ๋ชจ๋ธ๋„ ์ •์ƒ ํ˜ธ์ถœ โ€” meta/muse-spark-1.2-contributor๋Š” minimal ~ xhigh๊นŒ์ง€ ๊ณต์‹ reasoning_effort๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ฐฐํฌ ํ™˜๊ฒฝ(๋ฏธ๊ตญ ๋ฆฌ์ „ ๊ณ ์ •)์—์„œ๋Š” high, xhigh ๋“ฑ์œผ๋กœ ์‹ค์ œ ํ˜ธ์ถœ์ด ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฏธ๊ตญ ๋ฆฌ์ „ ๊ณ ์ • ๋ฐฐํฌ โ€” wrangler.toml์˜ [placement] region = "aws:us-west-1"๋กœ Worker ์‹คํ–‰ ์œ„์น˜๋ฅผ ๋ฏธ๊ตญ ์„œ๋ถ€ ๊ทผ์ฒ˜๋กœ ๊ณ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. freebuff ๋ฌด๋ฃŒ ๋ชจ๋ธ์ด ๋ฏธ๊ตญ ์ถœ๊ตฌ IP๋ฅผ ์š”๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ์„ธ์…˜๋ณ„ ๊ณ„์ • ๊ณ ์ • โ€” ํ•˜๋‚˜์˜ ํด๋ผ์ด์–ธํŠธ ๋Œ€ํ™”๋Š” ํ•œ upstream ๊ณ„์ •๋งŒ ๊ณ„์† ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ณ„์ •์ด ์‹ค์ œ 429๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋งŒ ๋‹ค์Œ ๊ณ„์ •์œผ๋กœ ๊ฐ™์€ ์š”์ฒญ์„ ์žฌ์‹œ๋„ํ•˜๊ณ  ๋ฐ”์ธ๋”ฉ์„ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ์†Œ์ง„ ๊ณ„์ • ํšŒํ”ผ โ€” upstream์˜ ๋ชจ๋ธ ์‚ฌ์šฉ๋Ÿ‰์ด ํ•œ๋„์— ๋„๋‹ฌํ–ˆ๊ฑฐ๋‚˜ 429 ํ•œ๋„ ์ดˆ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ ๊ณ„์ •ยท๋ชจ๋ธ ์กฐํ•ฉ์€ 45๋ถ„ ๋™์•ˆ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํ›„๋ณด๊ฐ€ ์†Œ์ง„๋˜๋ฉด Worker๋Š” HTTP 429์™€ Retry-After๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ค‘๋ณต ํ† ํฐ ์ž๋™ ์ •๋ฆฌ โ€” ๊ฐ™์€ ํ† ํฐ์„ ๋‘ ๋ฒˆ ๋„ฃ์–ด๋„ ํ•˜๋‚˜์˜ ๊ณ„์ •์œผ๋กœ๋งŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  • ์‚ด์•„ ์žˆ๋Š” ์„ธ์…˜ ์žฌ์‚ฌ์šฉ ์šฐ์„  โ€” ์„ธ์…˜์€ ๋ณดํ†ต 1์‹œ๊ฐ„ ์ •๋„ ์œ ์ง€๋˜๋ฉฐ ๋งŒ๋“ค ๋•Œ๋งŒ ํ•œ๋„๊ฐ€ ์ฐจ๊ฐ๋ฉ๋‹ˆ๋‹ค. ์•„์ง ์œ ํšจํ•œ ์„ธ์…˜์ด ์žˆ์œผ๋ฉด ๊ฐ™์€ ๊ณ„์ •์„ ๊ณ„์† ์“ฐ๊ณ , ์—†์„ ๋•Œ๋งŒ ๋‹ค๋ฅธ ๊ณ„์ •์œผ๋กœ ์˜ฎ๊ฒจ ํ•œ๋„๋ฅผ ์•„๋‚ฉ๋‹ˆ๋‹ค.
  • ๊ด‘๊ณ  ์š”์ฒญ ํ๋ฆ„ ๋ชจ๋ฐฉ โ€” ์„ธ์…˜ ํ™•๋ณด ํ›„ ๋…ผ๋ฆฌ์  ํ”„๋กฌํ”„ํŠธ๋‹น ๊ณต์‹ ํ˜•์‹์˜ ๊ด‘๊ณ  ์š”์ฒญ์„ ํ•œ ๋ฒˆ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์‹คํŒจํ•ด๋„ ์ฑ„ํŒ…์—๋Š” ์˜ํ–ฅ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ๋Œ€ํ™” ID ์ •ํ•ฉ โ€” ๊ฐ™์€ ๋Œ€ํ™”์˜ ๊ณ„์ • ๋ฐ”์ธ๋”ฉ, chat client_id, ads sessionId๊ฐ€ ํ•˜๋‚˜์˜ ์•ˆ์ •์ ์ธ UUID๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.
  • Freebuff ์ŠคํŠธ๋ฆผ ๋ณต๊ตฌ โ€” tool call์ด ์—†๋Š” ์‘๋‹ต์ด reasoning ๋„์ค‘ ๋Š๊ธฐ๊ฑฐ๋‚˜ reasoning๋งŒ ๋‚จ๊ธฐ๊ณ  ๋๋‚˜๋ฉด ๊ณต์‹ CLI์ฒ˜๋Ÿผ ๊ฐ™์€ ๊ณ„์ •ยท์„ธ์…˜์—์„œ ์ตœ๋Œ€ 3ํšŒ ์ด์–ด์„œ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  • ์ „์—ญ ๊ณ„์ • ์„ธ์…˜ ์กฐ์ • โ€” Durable Object๊ฐ€ ๋ชจ๋“  Worker isolate์—์„œ ๊ฐ™์€ ๊ณ„์ •์˜ Freebuff session/run/chat์„ ์ง๋ ฌํ™”ํ•˜๊ณ , ์œ ํœด 10๋ถ„ ๋’ค ๊ณต์‹ CLI ์ข…๋ฃŒ์ฒ˜๋Ÿผ upstream session์„ DELETEํ•ฉ๋‹ˆ๋‹ค.
  • OpenAI ํ˜ธํ™˜ โ€” GET /v1/models, POST /v1/chat/completions์„ ์ŠคํŠธ๋ฆฌ๋ฐ๊ณผ ์ผ๋ฐ˜ ์‘๋‹ต ๋ชจ๋‘ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ํ—ฌ์Šค ์ฒดํฌ โ€” GET /healthz๋Š” ์ธ์ฆ ์—†์ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • TypeScript ๋ชจ๋“ˆ โ€” session/run, SSE ๋ณต๊ตฌ, message ์ •๊ทœํ™”, Durable Object๋ฅผ ์ฑ…์ž„๋ณ„ ๋ชจ๋“ˆ๋กœ ๋‚˜๋ˆ„๊ณ  strict typecheck๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ „์ฒด ํ•œ๊ตญ์–ด โ€” ์ฝ”๋“œ ์ฃผ์„, CLI ์ถœ๋ ฅ, ํ…”๋ ˆ๊ทธ๋žจ ์•Œ๋ฆผ๊นŒ์ง€ ๋ชจ๋‘ ํ•œ๊ตญ์–ด์ž…๋‹ˆ๋‹ค.

๋ชจ๋ธ๊ณผ ํ•œ๋„

ํ•œ๋„๋Š” ๋ชจ๋ธยท๊ณ„์ •๋ณ„๋กœ ๋‹ค๋ฅด๋ฉฐ, ์„œ๋ฒ„๊ฐ€ ์ˆ˜์‹œ๋กœ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์‹ค์ธก ๊ธฐ์ค€ rateLimitsByModel์—์„œ ํ™•์ธํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค.

๋ชจ๋ธ ํ•œ๋„
deepseek/deepseek-v4-flash ๊ณ„์ •๋ณ„ ์ƒ์ด. limited ๊ณ„์ •์—์„œ๋Š” ์‹ค์ธก 6ํšŒ/ํƒœํ‰์–‘์ผ
mimo/mimo-v2.5 ๊ณ„์ •๋ณ„ ์ƒ์ด. upstream rateLimitsByModel๋กœ ํ™•์ธ
meta/muse-spark-1.2-contributor ๊ณ„์ •๋งˆ๋‹ค ๋‹ค๋ฆ„ โ€” ์–ด๋–ค ๊ณ„์ •์€ 6ํšŒ/์ผ, ์–ด๋–ค ๊ณ„์ •์€ ์ œํ•œ ์—†์Œ
z-ai/glm-5.2 ๋ ˆํผ๋Ÿด ์—†์ด๋Š” ํ•œ๋„ 0 (์„ธ์…˜ ์ƒ์„ฑ 429)

ํ•œ๋„๋Š” ํƒœํ‰์–‘ ์‹œ๊ฐ„ ๊ธฐ์ค€ ํ•˜๋ฃจ ๋‹จ์œ„์ด๋ฉฐ, ํ•œ๊ตญ ์‹œ๊ฐ„์œผ๋กœ๋Š” ๋ณดํ†ต ์˜คํ›„ 4์‹œ์ฏค ๋ฆฌ์…‹๋ฉ๋‹ˆ๋‹ค. ์„ธ์…˜์„ ์ƒˆ๋กœ ๋งŒ๋“ค ๋•Œ๋งŒ ์ฐจ๊ฐ๋ฉ๋‹ˆ๋‹ค.

์ „์ฒด ๋ชจ๋ธ ๋ชฉ๋ก

API ๋ชจ๋ธ ์ด๋ฆ„ ์„ธ์…˜ ๋ชจ๋ธ upstream agentId
deepseek/deepseek-v4-flash ๋™์ผ base2-free-deepseek-flash
deepseek/deepseek-v4-pro ๋™์ผ base2-free-deepseek
minimax/minimax-m3 ๋™์ผ base2-free-minimax-m3
mimo/mimo-v2.5 ๋™์ผ base2-free-mimo
openai/gpt-5.6-luna ๋™์ผ base2-free-luna
z-ai/glm-5.2 ๋™์ผ base2-free-glm
poolside/laguna-s-2.1 ๋™์ผ base2-free-laguna-s-2-1
openrouter/poolside/laguna-s-2.1 ๋™์ผ base2-free-laguna-s-2-1-openrouter
inclusionai/ling-3.0-flash:free ๋™์ผ base2-free-ling-3-flash
crof/greg-2-ultra ๋™์ผ base2-free-greg-2-ultra
crof/greg-2-super ๋™์ผ base2-free-greg-2-super
anthropic/claude-fable-5 ๋™์ผ base2-free-fable
meta/muse-spark-1.2-contributor ๋™์ผ base2-free-muse-spark

reasoning_effort (Muse Spark)

  • none์€ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (400 ์˜ค๋ฅ˜)
  • minimal, low, medium, high, xhigh๋งŒ ๊ณต์‹์—์„œ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค
  • max, extreme, ultra๋Š” ๊ณต์‹์— ์—†๊ณ  ๋ฌด์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

์ฐธ๊ณ : https://dev.meta.ai/docs/reasoning

๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ํ•˜๊ธฐ

  1. freebuff ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค (์•„๋ž˜ `FREEBUFF_TOKEN ๋ฐœ๊ธ‰` ์ฐธ๊ณ )
  2. Worker๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค (์•„๋ž˜ `๋ฐฐํฌ` ์ฐธ๊ณ . ์ฝ˜์†”์— ๋ถ™์—ฌ๋„ฃ๊ฑฐ๋‚˜ wrangler๋กœ ๋ฐฐํฌ)
  3. Cloudflare ๋Œ€์‹œ๋ณด๋“œ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค
    • FREEBUFF_TOKEN (ํ•„์ˆ˜)
    • FREEBUFF_API_KEY (์„ ํƒ, ๋น„์›Œ๋‘๋ฉด freebuff-default-key)
  4. OpenAI ํ˜ธํ™˜ ํด๋ผ์ด์–ธํŠธ์—์„œ ์•„๋ž˜์ฒ˜๋Ÿผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค
    • Base URL: https://<์›Œ์ปค ์ฃผ์†Œ>/v1
    • API Key: FREEBUFF_API_KEY์— ๋„ฃ์€ ๊ฐ’

ํ—ฌ์Šค ์ฒดํฌ

curl https://<์›Œ์ปค ์ฃผ์†Œ>/healthz
# {"status":"ok","version":"1.6.0","time":"..."}

์ธ์ฆ ์—†์ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์–ด ๋ชจ๋‹ˆํ„ฐ๋ง์šฉ์œผ๋กœ ์“ฐ๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค.

๊ณ„์ • ๊ถŒํ•œยท๋ชจ๋ธ ํ•œ๋„ ์กฐํšŒ

์ธ์ฆ๋œ ๊ณ„์ • ๊ด€์ธก endpoint์ž…๋‹ˆ๋‹ค. ํ† ํฐ์€ ๋ 4์ž๋ฆฌ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

# ํ˜„์žฌ Worker isolate์— ์บ์‹œ๋œ ์ƒํƒœ๋งŒ ๋ฐ˜ํ™˜. upstream ํ˜ธ์ถœ ์—†์Œ.
curl -H "Authorization: Bearer <API_KEY>" \
  https://<์›Œ์ปค ์ฃผ์†Œ>/v1/accounts

# Worker egress์—์„œ ๊ฐ ๊ณ„์ •์˜ upstream GET /session์„ ์‹คํ–‰ํ•ด ์ƒํƒœ๋ฅผ ์ƒˆ๋กœ ์กฐํšŒ.
curl -H "Authorization: Bearer <API_KEY>" \
  'https://<์›Œ์ปค ์ฃผ์†Œ>/v1/accounts?refresh=1'

refresh=1 ์‘๋‹ต์€ ๊ณ„์ •๋ณ„ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

  • upstream.access_tier: upstream ๊ณ„์ • ๊ถŒํ•œ (full, limited ๋“ฑ)
  • upstream.status: free session ์ƒํƒœ (none, active ๋“ฑ)
  • upstream.country_code, upstream.country_block_reason: Worker egress ๊ธฐ์ค€ upstream ์ง€์—ญ/๋ฆฌ์Šคํฌ ํŒ์ •
  • models.deepseek/deepseek-v4-flash.rateLimitsEntry, models.meta/muse-spark-1.2-contributor.rateLimitsEntry: upstream ์›๋ณธ ํ•œ๋„ ๋ฐ์ดํ„ฐ (limit, recentCount, resetAt ๋“ฑ)

rateLimitsEntry: null์€ upstream์ด ํ•ด๋‹น ๋ชจ๋ธ ํ•œ๋„๋ฅผ ์ด ์‘๋‹ต์— ์‹ฃ์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ๋ฌด์ œํ•œ์„ ๋ณด์žฅํ•˜๋Š” ํ‘œ์‹œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. refresh=1์€ ์„ธ์…˜์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๋ชจ๋ธ์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š์ง€๋งŒ, ํ™œ์„ฑ free session์˜ ์ƒํƒœ๋ฅผ ์กฐํšŒํ•˜๋ฏ€๋กœ ์šด์˜ ์ค‘์ธ ๋Œ€ํ™”์™€ ๊ฒน์น˜์ง€ ์•Š์„ ๋•Œ๋งŒ ์‹คํ–‰ํ•˜์„ธ์š”.

FREEBUFF_TOKEN ๋ฐœ๊ธ‰

freebuff_tools/extract_freebuff.py๋ฅผ ์”๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

cd freebuff_tools
python3 extract_freebuff.py login   # ์ธ์ฆ ์ฃผ์†Œ๊ฐ€ ๋‚˜์˜ค๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด๊ณ  ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ, ์ดํ›„ ์ž๋™์œผ๋กœ ํ† ํฐ ์ €์žฅ
python3 extract_freebuff.py show    # ์ €์žฅ๋œ ํ† ํฐ ํ™•์ธ (๋งˆ์Šคํ‚น๋˜์–ด ํ‘œ์‹œ)
python3 extract_freebuff.py tgsend  # ํ…”๋ ˆ๊ทธ๋žจ ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ (์„ ํƒ)

ํ† ํฐ์€ freebuff_tools/freebuff_credentials.json์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ๊นƒ์— ์˜ฌ๋ฆฌ์ง€ ๋งˆ์„ธ์š”. login์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฉ”์ผ์˜ @ ์•ž๋ถ€๋ถ„์„ ํ”„๋กœํ•„ ๋ ˆ์ด๋ธ”๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, session --label <๋ ˆ์ด๋ธ”>, chat --label <๋ ˆ์ด๋ธ”>, quota --label <๋ ˆ์ด๋ธ”>๋กœ ํŠน์ • ๊ณ„์ •์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GitHub Actions๋กœ ์›๊ฒฉ ๋ฐœ๊ธ‰ (๊ถŒ์žฅ โ€” ๋ฏธ๊ตญ IP๋กœ ๋ฐ›์œผ๋ฉด tier๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Œ)

์ด ์ €์žฅ์†Œ์—๋Š” ์ด๋ฏธ ์›Œํฌํ”Œ๋กœ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค (.github/workflows/extract-token.yml).

ํ•„์š”ํ•œ ์ค€๋น„๋ฌผ

  1. ํ…”๋ ˆ๊ทธ๋žจ์—์„œ @BotFather์—๊ฒŒ /newbot์„ ๋ณด๋‚ด ๋ด‡์„ ๋งŒ๋“  ๋’ค HTTP API ํ† ํฐ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค
  2. @freebuff_token_bot(๋ฐฉ๊ธˆ ๋งŒ๋“  ๋ด‡)์„ ์—ด๊ณ  /start๋ฅผ ๋ณด๋‚ธ ๋’ค, ํ„ฐ๋ฏธ๋„์—์„œ curl "https://api.telegram.org/bot<ํ† ํฐ>/getUpdates"๋กœ chat.id๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค
  3. ์ €์žฅ์†Œ์˜ Settings โ†’ Secrets and variables โ†’ Actions์—์„œ ๋‘ secret์„ ๋„ฃ์Šต๋‹ˆ๋‹ค
    • TG_BOT_TOKEN: ๋ด‡ ํ† ํฐ
    • TG_CHAT_ID: ์ˆซ์ž chat id

์‹คํ–‰

Actions โ†’ Freebuff authToken ๋ฐœ๊ธ‰ โ†’ Run workflow โ†’ Run์„ ๋ˆ„๋ฅด๋ฉด GitHub์˜ ๋ฏธ๊ตญ ๋Ÿฌ๋„ˆ์—์„œ ์ธ์ฆ ์ ˆ์ฐจ๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ํ…”๋ ˆ๊ทธ๋žจ ๋ด‡ ์ฑ„ํŒ…์œผ๋กœ ์ธ์ฆ ๋งํฌ๊ฐ€ ์˜ค๋ฉด, ๊ผญ ์ƒˆ ๊ตฌ๊ธ€ ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•˜์„ธ์š”. ๊ฐ™์€ ๊ตฌ๊ธ€ ๊ณ„์ •์œผ๋กœ ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•˜๋ฉด ๊ฐ™์€ ํ† ํฐ์ด ๋‹ค์‹œ ๋ฐœ๊ธ‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ์ฆ์ด ๋๋‚˜๋ฉด ์ƒˆ ํ† ํฐ์ด ํ…”๋ ˆ๊ทธ๋žจ์œผ๋กœ ์˜ต๋‹ˆ๋‹ค.

  • ํ…”๋ ˆ๊ทธ๋žจ ๋ด‡ ํ† ํฐ์„ ์ฑ„ํŒ…์— ๊ทธ๋Œ€๋กœ ์˜ฌ๋ฆฌ๋ฉด ์ฆ‰์‹œ ์œ ์ถœ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ ๋’ค @BotFather์—์„œ /revoke๋กœ ์žฌ๋ฐœ๊ธ‰ํ•˜์„ธ์š”.
  • ์‹ค์ œ ํ† ํฐ์„ ์ฑ„ํŒ…์— ๋ถ™์—ฌ๋„ฃ์ง€ ๋งˆ์„ธ์š”.

๋ฐฐํฌ

๋ฐฉ๋ฒ• A: Cloudflare ์ฝ˜์†”์— ๋ถ™์—ฌ๋„ฃ๊ธฐ (๊ถŒ์žฅ)

  1. https://dash.cloudflare.com ์—์„œ Workers & Pages๋กœ ์ด๋™ํ•œ ๋’ค ์ด GitHub ์ €์žฅ์†Œ๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  2. Build command๋Š” ๋น„์›Œ ๋‘๊ณ  deploy command๋ฅผ npx wrangler deploy๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Wrangler๊ฐ€ src/worker.ts์™€ import๋œ TypeScript ๋ชจ๋“ˆ์„ ํ•˜๋‚˜์˜ Worker ๋ฒˆ๋“ค๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  3. Settings, Variables and Secrets์—์„œ Add๋ฅผ ๋ˆŒ๋Ÿฌ ์•„๋ž˜ ๊ฐ’์„ ๋„ฃ์Šต๋‹ˆ๋‹ค
    • FREEBUFF_TOKEN
    • FREEBUFF_API_KEY (์„ ํƒ)
  4. ๋ฐฐํฌ๊ฐ€ ์ž˜ ๋๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค
curl https://<์›Œ์ปค ์ฃผ์†Œ>/healthz
curl https://<์›Œ์ปค ์ฃผ์†Œ>/v1/models -H "Authorization: Bearer <API_KEY>"

๋ฐฉ๋ฒ• B: wrangler CLI

npm i -g wrangler
npx wrangler login
npm install
npm run typecheck
cp .env.example .dev.vars  # FREEBUFF_TOKEN ์ž…๋ ฅ
npm run dev                # ๋กœ์ปฌ์—์„œ ํ…Œ์ŠคํŠธ
npm run deploy             # ๋ฐฐํฌ
npx wrangler secret put FREEBUFF_TOKEN
npx wrangler secret put FREEBUFF_API_KEY

Placement (๋ฏธ๊ตญ ๊ณ ์ • โ€” ์ง€์—ฐ ์‹ค์ธก์œผ๋กœ ๊ณ ์ •)

wrangler.toml์— ์•„๋ž˜ ์„ค์ •์ด ์ถ”๊ฐ€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

[placement]
region = "aws:us-west-1"

freebuff ๋ฌด๋ฃŒ ๋ชจ๋ธ์€ ๋ฏธ๊ตญ ์ถœ๊ตฌ IP๋ฅผ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. Cloudflare Workers๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฏธ๊ตญ ์ชฝ์œผ๋กœ ๋‚˜๊ฐ€์ง€๋งŒ, ์ด ์„ค์ •์„ ๋„ฃ์œผ๋ฉด ์‹คํ–‰ ์œ„์น˜ ์ž์ฒด๋ฅผ ๋ฏธ๊ตญ ์„œ๋ถ€(N. California) ๊ทผ์ฒ˜๋กœ ๊ณ ์ •ํ•ด ์ง€์—ฐ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ๋ฏธ 6๊ฐœ ๋ฆฌ์ „์„ ์‹ค์ œ๋กœ ๋ฐฐํฌํ•ด๊ฐ€๋ฉฐ ์‹ค์ธกํ•œ ๊ฒฐ๊ณผ (์„œ์šธ์—์„œ)

๋ฆฌ์ „ median healthz
aws:us-west-2 (Oregon) 0.308์ดˆ
aws:us-west-1 (N. California) 0.326์ดˆ โ€” ํŽธ์ฐจ ์ตœ์†Œ
gcp:us-west1 0.319์ดˆ
gcp:us-central1 0.335์ดˆ
gcp:us-east4 0.315์ดˆ
aws:us-east-1 (Virginia ๋™๋ถ€, ์ด์ „ ๊ธฐ๋ณธ๊ฐ’) 0.382์ดˆ
  • ์„œ๋ถ€ ๋ฆฌ์ „์ด ๋™๋ถ€ ๋Œ€๋น„ 50~75ms ๋น ๋ฆ…๋‹ˆ๋‹ค
  • aws:us-west-1์ด ํŽธ์ฐจ๊ฐ€ ๊ฐ€์žฅ ์ž‘์•„ ์ตœ์ข… ๊ณ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค
  • mode = "smart"๋Š” ๋ถ๋ฏธ๊ฐ€ ์•„๋‹Œ ๊ณณ์œผ๋กœ ํŠˆ ์ˆ˜ ์žˆ์–ด ์“ฐ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค
  • chat ์Šค๋ชจํฌ(deepseek-v4-flash)๋Š” 6/6 ๋ฆฌ์ „ ๋ชจ๋‘ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค

๊ด€๋ จ ๋ฌธ์„œ: https://developers.cloudflare.com/workers/configuration/placement/

์ปค์Šคํ…€ ๋„๋ฉ”์ธ

*.workers.dev ์ ‘์†์ด ๋ง‰ํžŒ ํ™˜๊ฒฝ์ด๋ผ๋ฉด Worker์— ๋ณธ์ธ ๋„๋ฉ”์ธ์„ ์—ฐ๊ฒฐํ•œ ๋’ค Base URL์„ https://api.๋‚ด๋„๋ฉ”์ธ/v1 ํ˜•ํƒœ๋กœ ๋ฐ”๊พธ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํ˜ธ์ถœ ์˜ˆ์‹œ

curl https://<์›Œ์ปค ์ฃผ์†Œ>/v1/chat/completions \
  -H "Authorization: Bearer <API_KEY>" -H "Content-Type: application/json" \
  -d '{"model":"deepseek/deepseek-v4-flash","messages":[{"role":"user","content":"์•ˆ๋…•"}],"reasoning_effort":"high"}'

curl -N https://<์›Œ์ปค ์ฃผ์†Œ>/v1/chat/completions \
  -H "Authorization: Bearer <API_KEY>" -H "Content-Type: application/json" \
  -d '{"model":"meta/muse-spark-1.2-contributor","messages":[{"role":"user","content":"์ฆ๋ช…ํ•ด์ค˜"}],"reasoning_effort":"xhigh","stream":true}'

์—ฌ๋Ÿฌ ๊ณ„์ •์œผ๋กœ ์“ฐ๊ธฐ

FREEBUFF_TOKEN์— token1,token2์ฒ˜๋Ÿผ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•ด ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ๋Œ€ํ™”๋Š” ์ฒซ ์š”์ฒญ์—์„œ ์„ ํƒ๋œ ํ•œ ๊ณ„์ •์— 24์‹œ๊ฐ„ ๋™์•ˆ ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ณ„์ •์ด upstream 429๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋งŒ ๋‹ค์Œ ๊ณ„์ •์œผ๋กœ ๊ฐ™์€ ์š”์ฒญ์„ ์žฌ์‹œ๋„ํ•˜๊ณ , ์„ฑ๊ณตํ•œ ๊ณ„์ •์„ ์ดํ›„ ์š”์ฒญ์—๋„ ๊ณ„์† ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 428/409๋Š” ๊ฐ™์€ ๊ณ„์ •์—์„œ ์„ธ์…˜๋งŒ ์žฌ์ƒ์„ฑํ•˜๋ฉฐ timeoutยท5xxยท๊ธฐํƒ€ ์˜ค๋ฅ˜ ๋•Œ๋ฌธ์— ๊ณ„์ •์„ ๋ฐ”๊พธ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ x-freebuff-session-id, x-session-id, x-client-session-id ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ณด๋‚ด๋ฉด ๊ทธ ๊ฐ’์„ ๋Œ€ํ™” ํ‚ค๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณ„๋„ ID๊ฐ€ ์—†๋Š” OpenAI ํ˜ธํ™˜ ํด๋ผ์ด์–ธํŠธ๋Š” ์ฒซ user ๋ฉ”์‹œ์ง€์—์„œ ์•ˆ์ •์ ์ธ ๋Œ€ํ™” ํ‚ค๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

์„ฑ๊ณต ์‘๋‹ต์—๋Š” ์šด์˜ ์ง„๋‹จ์šฉ X-Freebuff-Session-Key, X-Freebuff-Account-Tail ํ—ค๋”๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. 429 ๋•Œ๋ฌธ์— ๊ณ„์ •์ด ์ด๋™ํ•œ ์š”์ฒญ์—๋Š” X-Freebuff-Failover: ์ด์ „๋4์ž->์ƒˆ๋4์ž๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ค‘๋ณต์œผ๋กœ ๋„ฃ์–ด๋„ ๋ฌดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ํ† ํฐ์„ ๋‘ ๋ฒˆ ๋„ฃ์–ด๋„ ๋‚ด๋ถ€์—์„œ ํ•˜๋‚˜์˜ ๊ณ„์ •์œผ๋กœ๋งŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๊ณ„์ •์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ต์ฒดํ•œ ๋’ค์—๋Š” GET /v1/accounts?refresh=1๋กœ ๊ฐ๊ฐ์˜ token_tail, access_tier, refresh_errors๋ฅผ ํ™•์ธํ•˜์„ธ์š”. 401 unauthorized๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š” ํ† ํฐ์€ ๋งค ์š”์ฒญ์˜ ์‹คํŒจ ๋น„์šฉ๋งŒ ๋Š˜๋ฆฌ๋ฏ€๋กœ FREEBUFF_TOKEN๊ณผ FREEBUFF_USER_IDS ์–‘์ชฝ์—์„œ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฌด์ œํ•œ/ํ•œ๋„ ๊ณ„์ •์ด ์„ž์˜€์„ ๋•Œ (muse-spark)

muse-spark๋Š” ๊ณ„์ •๋งˆ๋‹ค ํ•œ๋„๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค โ€” ์–ด๋–ค ๊ณ„์ •์€ 6ํšŒ/์ผ, ์–ด๋–ค ๊ณ„์ •์€ ํ•œ๋„ ํ•ญ๋ชฉ ์ž์ฒด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ํ’€์€ 3๊ณ„์ • ๋ชจ๋‘ 6ํšŒ๋กœ ๋™์ผํ•˜์ง€๋งŒ, ์ด์ „์—๋Š” ์ค‘๋ณต ํ† ํฐ์œผ๋กœ ํ•œ ๊ณ„์ •์ด ๋‘ ๋ฒˆ ๋ณด์ด๋ฉฐ ์‹ค์ œ๋กœ๋Š” ํ•œ๋„๋งŒ ๊ณต์œ ๋˜๋Š” ์ƒํƒœ๊ฐ€ ์ƒ๊ฒผ๊ณ , ๋˜ 6ํšŒ ๊ณ„์ •์ด ๋จผ์ € ์„ ํƒ๋˜์–ด ๋ฐ”๋กœ ํ•œ๋„์— ๊ฑธ๋ฆฌ๋ฉด ๋ฌด์ œํ•œ ๊ณ„์ •์€ ๋‚˜์ค‘์—์•ผ ์„ ํƒ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๊ฐ™์€ ํ† ํฐ์€ Set์œผ๋กœ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ , ํ•œ ๊ณ„์ •์ด 429 ํ•œ๋„ ์ดˆ๊ณผ๋กœ ๊ฑฐ๋ถ€๋˜๋ฉด ๊ทธ ๋ชจ๋ธ์— ๋Œ€ํ•ด ์†Œ์ง„์œผ๋กœ ๊ธฐ์–ตํ•ด ๋‘๊ณ  ๋‹ค์Œ ์š”์ฒญ๋ถ€ํ„ฐ๋Š” ์†Œ์ง„๋˜์ง€ ์•Š์€ ๊ณ„์ •์„ ๋จผ์ € ์„ ํƒํ•ฉ๋‹ˆ๋‹ค (45๋ถ„ ์œ ์ง€).

๊ณ„์ •์ด full/limited๋กœ ๋ณด์ด๋Š” ์ฐจ์ด

์ฒ˜์Œ ๋กœ์ปฌ์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ ํ† ํฐ์€ ์„ธ์…˜ ์กฐํšŒ์—์„œ accessTier: limited์˜€๊ณ , GitHub Actions ๋ฏธ๊ตญ ๋Ÿฌ๋„ˆ์—์„œ ์ƒˆ๋กœ ๋ฐœ๊ธ‰๋ฐ›์€ ํ† ํฐ์€ full๋กœ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. freebuff๊ฐ€ ๊ฐ€์ž…/๋กœ๊ทธ์ธ ์‹œ์ ์˜ ์ถœ๊ตฌ IP(๋ฆฌ์ „)์— ๋”ฐ๋ผ ๋“ฑ๊ธ‰์„ ๋งค๊ธฐ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ํ•œ๊ตญ IP์™€ ๋ฏธ๊ตญ IP์—์„œ ๊ฐ™์€ ์ ˆ์ฐจ๋กœ ๋ฐ›์•„๋„ tier๊ฐ€ ๋‹ฌ๋ž์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€๋กœ, ์ฒ˜์Œ์—๋Š” muse-spark๊ฐ€ limited ๊ณ„์ •์—์„œ session_model_mismatch๋กœ ๊ฑฐ๋ถ€๋˜์—ˆ๊ณ , ๊ฐ™์€ ํ† ํฐ์„ ๋ฏธ๊ตญ ์ถœ๊ตฌ Worker์— ๊ทธ๋Œ€๋กœ ๋‘๋ฉด ์ •์ƒ ๋™์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•œ๊ตญ ๋กœ์ปฌ๊ณผ ๋ฏธ๊ตญ Worker์˜ ์ฐจ์ด๊ฐ€ ์‹ค์ œ ํ˜ธ์ถœ์—๋„ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

๋ ˆํผ๋Ÿด๊ณผ GLM 5.2

๋ ˆํผ๋Ÿด ์ฝ”๋“œ (FREEBUFF_TOKEN๊ณผ ํ•จ๊ป˜ ์˜ค๋Š” referral/streak ์ •๋ณด)๋Š” ํ˜„์žฌ z-ai/glm-5.2์˜ ํ•œ๋„๋ฅผ ์—ฌ๋Š” ๋ฐ ์ฃผ๋กœ ๊ด€์—ฌํ•ฉ๋‹ˆ๋‹ค. ๋ ˆํผ๋Ÿด ์—†์ด๋Š” limit 0์œผ๋กœ ์„ธ์…˜ ์ƒ์„ฑ 429๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค. muse-spark, deepseek, mimo์˜ ํ•œ๋„๋Š” ๋ ˆํผ๋Ÿด๋กœ ํฌ๊ฒŒ ๋Š˜์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๋™์ž‘

์„ธ์…˜ ์ƒ์„ฑ -> agent-runs (root START + context-pruner์˜ ๋กœ์ปฌ untracked id) -> chat/completions

์ด ์ „์ฒด ๊ณผ์ •์„ Worker๊ฐ€ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. upstream์—์„œ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๊ฒ€์ฆํ•˜๋Š” You are Buffy, the strategic coding assistant. ์ ‘๋‘์‚ฌ๋„ ์ž๋™์œผ๋กœ ๋ถ™์ž…๋‹ˆ๋‹ค. /v1/models๋Š” upstream์„ ์กฐํšŒํ•˜์ง€ ์•Š๊ณ  ๋ชฉ๋ก์„ ๊ทธ๋Œ€๋กœ ๋Œ๋ ค์ค๋‹ˆ๋‹ค. ํ•œ ๊ณ„์ •์—์„œ ๋™์‹œ์— ์„ธ์…˜์„ ํ•˜๋‚˜๋งŒ ์“ธ ์ˆ˜ ์žˆ์–ด, ์กฐํšŒ๊ฐ€ ์ง„ํ–‰ ์ค‘์ธ ๋Œ€ํ™”๋ฅผ ๋ฐฉํ•ดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋Š๊ฒผ์„ ๋•Œ ์žฌ์‹œ๋„

์ค‘๊ฐ„์— ๋Š๊ธฐ๋Š” ์›์ธ์€ ๋Œ€๋ถ€๋ถ„ upstream codebuff.com์˜ free ์ฑ„๋„ ๋ถˆ์•ˆ์ •(๋™์‹œ 1 ์ดˆ๊ณผ ์‹œ queued ํƒ€์ž„์•„์›ƒ โ€” ์ตœ๋Œ€ 8ํšŒร—1.5์ดˆ ํด๋ง, 428 waiting_room_required, ์„ธ์…˜ ๋งŒ๋ฃŒ 409 ๋“ฑ)์ž…๋‹ˆ๋‹ค. ์„ธ์…˜ ๋งŒ๋ฃŒ 428/409๋Š” ๋ฐ”์ธ๋”ฉ๋œ ๊ฐ™์€ ๊ณ„์ •์˜ sessCache๋ฅผ ๋น„์šฐ๊ณ  ๊ฐ•์ œ ์žฌ์ƒ์„ฑํ•ด 1ํšŒ ์žฌ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์ •๋ณ„ ๋ฎคํ…์Šค์™€ 300ms ๊ฐ„๊ฒฉ์œผ๋กœ ๊ฐ™์€ ๊ณ„์ •์˜ upstream ์š”์ฒญ์„ ์ง๋ ฌํ™”ํ•˜๋ฉฐ, ์ŠคํŠธ๋ฆฌ๋ฐ ์‘๋‹ต ๋ณธ๋ฌธ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ํ•ด๋‹น ๊ณ„์ • ๋ฝ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์ • ์ „ํ™˜์€ upstream 429์—์„œ๋งŒ ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ณ„์ •์—์„œ๋„ 429๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉด ๋งˆ์ง€๋ง‰ upstream 429 body์™€ Retry-After๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. timeoutยท5xxยท๊ธฐํƒ€ ์˜ค๋ฅ˜๋Š” ํ˜„์žฌ ๋Œ€ํ™”์˜ ๊ณ„์ • ๋ฐ”์ธ๋”ฉ์„ ์œ ์ง€ํ•œ ์ฑ„ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ŠคํŠธ๋ฆผ์ด finish_reason ์—†์ด ๋๋‚˜๊ฑฐ๋‚˜ reasoning๋งŒ ์ถœ๋ ฅํ•˜๊ณ  length/stop์œผ๋กœ ์ข…๋ฃŒ๋˜๋ฉด Worker๊ฐ€ ์ด๋ฏธ ๋ฐ›์€ assistant reasoning์„ history์— ๋„ฃ๊ณ  ๊ณต์‹ recovery prompt๋ฅผ ์ถ”๊ฐ€ํ•ด ๊ฐ™์€ ๊ณ„์ •์—์„œ ์ตœ๋Œ€ 3ํšŒ ์žฌ๊ฐœํ•ฉ๋‹ˆ๋‹ค. tool-call delta๋Š” arguments JSON์ด ์™„์„ฑ๋  ๋•Œ๊นŒ์ง€ Worker๊ฐ€ ๋ฒ„ํผ๋งํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ์™„์„ฑ ์ƒํƒœ์—์„œ ๋Š๊ธฐ๋ฉด client์— ๋…ธ์ถœ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์žฌ๊ฐœํ•˜๊ณ , ์™„์„ฑ๋œ call์€ ํ•œ ๋ฒˆ์— ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ๋งŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์™„์„ฑ call์„ ์ „๋‹ฌํ•œ ๋’ค์—๋Š” ๋„๊ตฌ ์ด์ค‘ ์‹คํ–‰์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์ž๋™ ์žฌ๊ฐœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

agent-runs๋Š” ์‚ฌ์šฉ์ž turn๋งˆ๋‹ค ์ƒˆ START/FINISH ํ•œ ์Œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€ recovery ์š”์ฒญ์€ ์›๋ž˜ turn์˜ run_id๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, ์ •์ƒ ์™„๋ฃŒ๋Š” completed, 429ยทupstream ์˜ค๋ฅ˜ยท๋ณต๊ตฌ ์‹คํŒจ๋Š” failed, client ์ทจ์†Œ๋Š” cancelled ์ƒํƒœ์™€ error message๋กœ FINISHํ•ฉ๋‹ˆ๋‹ค.

Durable Object ์กฐ์ •

ConversationRouter๋Š” ๋Œ€ํ™”๋ณ„ clientId์™€ ๊ณ„์ • token์„ ์›์ž์ ์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ๋“ค์–ด์˜จ ์ฒซ ์š”์ฒญ๋„ ๊ฐ™์€ ๋Œ€ํ™”๋ผ๋ฉด ํ•˜๋‚˜์˜ ๊ณ„์ •๋งŒ ์„ ํƒ๋˜๋ฉฐ, 429 failover๋Š” ๊ธฐ์กด token์ด ์˜ˆ์ƒ ๊ณ„์ •์ผ ๋•Œ๋งŒ compare-and-set์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

AccountCoordinator๋Š” Freebuff token์„ ๊ทธ๋Œ€๋กœ ๊ณ„์ • ์‹๋ณ„์ž๋กœ ์‚ฌ์šฉํ•ด ๊ณ„์ • ํ•˜๋‚˜๋‹น ํ•˜๋‚˜์”ฉ ์กด์žฌํ•˜๋ฉฐ ์ตœ๋Œ€ 30์ดˆ ๋™์•ˆ FIFO์— ๊ฐ€๊นŒ์šด lease ๋Œ€๊ธฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. lease๊ฐ€ ์žˆ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ๋Œ€ํ™”๋Š” ๊ธฐ์กด upstream session์„ ๋นผ์•—์ง€ ์•Š์Šต๋‹ˆ๋‹ค. stream ๋ณธ๋ฌธ๊ณผ FINISH๊ฐ€ ๋๋‚œ ๋’ค lease๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋งˆ์ง€๋ง‰ ์‚ฌ์šฉ ํ›„ 10๋ถ„ ๋™์•ˆ ์ƒˆ ์š”์ฒญ์ด ์—†์œผ๋ฉด alarm์—์„œ DELETE /api/v1/freebuff/session์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ์ด ๋ฐ”๋€Œ๋ฉด ์ƒˆ lease๋ฅผ ์žก์€ ๋’ค ๊ธฐ์กด session์„ ๋จผ์ € DELETEํ•˜๊ณ  ์ƒˆ ๋ชจ๋ธ session์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Durable Object binding์ด ์—†๋Š” ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๊ธฐ์กด isolate-local mutex์™€ ๋ฉ”๋ชจ๋ฆฌ route๋กœ ์ž๋™ fallbackํ•ฉ๋‹ˆ๋‹ค.

๋ผ์ด์„ ์Šค

MIT

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages