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, adssessionId๊ฐ ํ๋์ ์์ ์ ์ธ 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 |
none์ ์ง์ํ์ง ์์ต๋๋ค (400 ์ค๋ฅ)minimal,low,medium,high,xhigh๋ง ๊ณต์์์ ์ง์ํฉ๋๋คmax,extreme,ultra๋ ๊ณต์์ ์๊ณ ๋ฌด์๋ ์ ์์ต๋๋ค
์ฐธ๊ณ : https://dev.meta.ai/docs/reasoning
- freebuff ํ ํฐ์ ๋ฐ๊ธํฉ๋๋ค (์๋ `FREEBUFF_TOKEN ๋ฐ๊ธ` ์ฐธ๊ณ )
- Worker๋ฅผ ๋ฐฐํฌํฉ๋๋ค (์๋ `๋ฐฐํฌ` ์ฐธ๊ณ . ์ฝ์์ ๋ถ์ฌ๋ฃ๊ฑฐ๋ wrangler๋ก ๋ฐฐํฌ)
- Cloudflare ๋์๋ณด๋์์ ๋ณ์๋ฅผ ์ค์ ํฉ๋๋ค
FREEBUFF_TOKEN(ํ์)FREEBUFF_API_KEY(์ ํ, ๋น์๋๋ฉดfreebuff-default-key)
- OpenAI ํธํ ํด๋ผ์ด์ธํธ์์ ์๋์ฒ๋ผ ์ฐ๊ฒฐํฉ๋๋ค
- Base URL:
https://<์์ปค ์ฃผ์>/v1 - API Key:
FREEBUFF_API_KEY์ ๋ฃ์ ๊ฐ
- Base URL:
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_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/workflows/extract-token.yml).
ํ์ํ ์ค๋น๋ฌผ
- ํ
๋ ๊ทธ๋จ์์ @BotFather์๊ฒ
/newbot์ ๋ณด๋ด ๋ด์ ๋ง๋ ๋ค HTTP API ํ ํฐ์ ๋ฐ์ต๋๋ค - @freebuff_token_bot(๋ฐฉ๊ธ ๋ง๋ ๋ด)์ ์ด๊ณ
/start๋ฅผ ๋ณด๋ธ ๋ค, ํฐ๋ฏธ๋์์curl "https://api.telegram.org/bot<ํ ํฐ>/getUpdates"๋กchat.id๋ฅผ ํ์ธํฉ๋๋ค - ์ ์ฅ์์
Settings โ Secrets and variables โ Actions์์ ๋ secret์ ๋ฃ์ต๋๋คTG_BOT_TOKEN: ๋ด ํ ํฐTG_CHAT_ID: ์ซ์ chat id
์คํ
Actions โ Freebuff authToken ๋ฐ๊ธ โ Run workflow โ Run์ ๋๋ฅด๋ฉด GitHub์ ๋ฏธ๊ตญ ๋ฌ๋์์ ์ธ์ฆ ์ ์ฐจ๊ฐ ์์๋ฉ๋๋ค.
ํ
๋ ๊ทธ๋จ ๋ด ์ฑํ
์ผ๋ก ์ธ์ฆ ๋งํฌ๊ฐ ์ค๋ฉด, ๊ผญ ์ ๊ตฌ๊ธ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํ์ธ์. ๊ฐ์ ๊ตฌ๊ธ ๊ณ์ ์ผ๋ก ๋ค์ ๋ก๊ทธ์ธํ๋ฉด ๊ฐ์ ํ ํฐ์ด ๋ค์ ๋ฐ๊ธ๋ ์ ์์ต๋๋ค. ์ธ์ฆ์ด ๋๋๋ฉด ์ ํ ํฐ์ด ํ
๋ ๊ทธ๋จ์ผ๋ก ์ต๋๋ค.
- ํ
๋ ๊ทธ๋จ ๋ด ํ ํฐ์ ์ฑํ
์ ๊ทธ๋๋ก ์ฌ๋ฆฌ๋ฉด ์ฆ์ ์ ์ถ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ํ์ธ ๋ค @BotFather์์
/revoke๋ก ์ฌ๋ฐ๊ธํ์ธ์. - ์ค์ ํ ํฐ์ ์ฑํ ์ ๋ถ์ฌ๋ฃ์ง ๋ง์ธ์.
- https://dash.cloudflare.com ์์ Workers & Pages๋ก ์ด๋ํ ๋ค ์ด GitHub ์ ์ฅ์๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค.
- Build command๋ ๋น์ ๋๊ณ deploy command๋ฅผ
npx wrangler deploy๋ก ์ค์ ํฉ๋๋ค. Wrangler๊ฐsrc/worker.ts์ import๋ TypeScript ๋ชจ๋์ ํ๋์ Worker ๋ฒ๋ค๋ก ๋ง๋ญ๋๋ค. - Settings, Variables and Secrets์์ Add๋ฅผ ๋๋ฌ ์๋ ๊ฐ์ ๋ฃ์ต๋๋ค
FREEBUFF_TOKENFREEBUFF_API_KEY(์ ํ)
- ๋ฐฐํฌ๊ฐ ์ ๋๋์ง ํ์ธํฉ๋๋ค
curl https://<์์ปค ์ฃผ์>/healthz
curl https://<์์ปค ์ฃผ์>/v1/models -H "Authorization: Bearer <API_KEY>"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_KEYwrangler.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๋ ๊ณ์ ๋ง๋ค ํ๋๊ฐ ๋ค๋ฆ
๋๋ค โ ์ด๋ค ๊ณ์ ์ 6ํ/์ผ, ์ด๋ค ๊ณ์ ์ ํ๋ ํญ๋ชฉ ์์ฒด๊ฐ ์์ต๋๋ค. ํ์ฌ ํ์ 3๊ณ์ ๋ชจ๋ 6ํ๋ก ๋์ผํ์ง๋ง, ์ด์ ์๋ ์ค๋ณต ํ ํฐ์ผ๋ก ํ ๊ณ์ ์ด ๋ ๋ฒ ๋ณด์ด๋ฉฐ ์ค์ ๋ก๋ ํ๋๋ง ๊ณต์ ๋๋ ์ํ๊ฐ ์๊ฒผ๊ณ , ๋ 6ํ ๊ณ์ ์ด ๋จผ์ ์ ํ๋์ด ๋ฐ๋ก ํ๋์ ๊ฑธ๋ฆฌ๋ฉด ๋ฌด์ ํ ๊ณ์ ์ ๋์ค์์ผ ์ ํ๋๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์ง๊ธ์ ๊ฐ์ ํ ํฐ์ Set์ผ๋ก ์ค๋ณต์ ์ ๊ฑฐํ๊ณ , ํ ๊ณ์ ์ด 429 ํ๋ ์ด๊ณผ๋ก ๊ฑฐ๋ถ๋๋ฉด ๊ทธ ๋ชจ๋ธ์ ๋ํด ์์ง์ผ๋ก ๊ธฐ์ตํด ๋๊ณ ๋ค์ ์์ฒญ๋ถํฐ๋ ์์ง๋์ง ์์ ๊ณ์ ์ ๋จผ์ ์ ํํฉ๋๋ค (45๋ถ ์ ์ง).
์ฒ์ ๋ก์ปฌ์์ ๋ฐ๊ธ๋ฐ์ ํ ํฐ์ ์ธ์
์กฐํ์์ accessTier: limited์๊ณ , GitHub Actions ๋ฏธ๊ตญ ๋ฌ๋์์ ์๋ก ๋ฐ๊ธ๋ฐ์ ํ ํฐ์ full๋ก ํ์๋์์ต๋๋ค. freebuff๊ฐ ๊ฐ์
/๋ก๊ทธ์ธ ์์ ์ ์ถ๊ตฌ IP(๋ฆฌ์ )์ ๋ฐ๋ผ ๋ฑ๊ธ์ ๋งค๊ธฐ๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. ํ๊ตญ IP์ ๋ฏธ๊ตญ IP์์ ๊ฐ์ ์ ์ฐจ๋ก ๋ฐ์๋ tier๊ฐ ๋ฌ๋์ต๋๋ค.
์ถ๊ฐ๋ก, ์ฒ์์๋ muse-spark๊ฐ limited ๊ณ์ ์์ session_model_mismatch๋ก ๊ฑฐ๋ถ๋์๊ณ , ๊ฐ์ ํ ํฐ์ ๋ฏธ๊ตญ ์ถ๊ตฌ Worker์ ๊ทธ๋๋ก ๋๋ฉด ์ ์ ๋์ํ์ต๋๋ค. ํ๊ตญ ๋ก์ปฌ๊ณผ ๋ฏธ๊ตญ Worker์ ์ฐจ์ด๊ฐ ์ค์ ํธ์ถ์๋ ๋ฐ์๋ฉ๋๋ค.
๋ ํผ๋ด ์ฝ๋ (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ํฉ๋๋ค.
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ํฉ๋๋ค.