Skip to content

Latest commit

ย 

History

History
283 lines (221 loc) ยท 64.1 KB

development_ko.md

File metadata and controls

283 lines (221 loc) ยท 64.1 KB

๊ฐœ๋ฐœ ์•ˆ๋‚ด

็ฎ€ไฝ“ไธญๆ–‡ | English | ๆ—ฅๆœฌ่ชž | ํ•œ๊ตญ์–ด | ะ ัƒััะบะธะน | Espaรฑol | Portuguรชs (Brasil)

์†Œ์Šค์—์„œ AnyModelBot์„ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ํŒจํ‚ค์ง•ํ•˜๊ณ  ๊ธฐ์—ฌํ•˜๋ ค๋Š” ๋ถ„์„ ์œ„ํ•œ ์•ˆ๋‚ด์ž…๋‹ˆ๋‹ค. ์•ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋งŒ ํ•˜๋ ค๋ฉด ๋ฆด๋ฆฌ์Šค์—์„œ ์„ค์น˜ ํŒŒ์ผ์„ ๋ฐ›์œผ์„ธ์š”. README๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

  • ๋ด‡์€ ์—ญํ• , ๊ธฐ๋ณธ ๋ชจ๋ธ, ๊ธฐ์–ต์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ณ„์ •์€ ์ „์—ญ ์„ค์ •(์„ค์ • โ€บ ์ฑ„ํŒ… ์ฑ„๋„)์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ ๋ชจ๋“  ๋ด‡์ด ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค๋ณ„ ๊ณ„์ • ์ˆ˜๋Š” ์ž์œ ๋กญ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ์‚ฌ๋žŒ์ด ๊ฐœ์ธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋ธ์€ Modelflare ๊ณ„์ • ๋˜๋Š” ๋‚ด ๊ณต์‹ API ํ‚ค๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Modelflare์—์„œ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ ์‹คํ–‰ํ•  ๋•Œ ๋กœ๊ทธ์ธํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ž…ํ•˜๋ฉด ๋ชจ๋ธ ๋ชฉ๋ก์ด ์ž๋™์œผ๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์€ ๋‚ด์žฅ magpie ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.
  • ํ•˜๋‚˜์˜ ์ฝ”๋“œ๋กœ ์„ธ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค: ๋ฐ์Šคํฌํ†ฑ ์•ฑ(Electron), ๋ช…๋ น์ค„ npm start, Docker.

์ €์žฅ์†Œ ๊ตฌ์กฐ

src/
  core/          ๊ณตํ†ต ๋ฉ”์‹œ์ง€ ํƒ€์ž…, ์„ธ์…˜ ๋Œ€๊ธฐ์—ด๊ณผ ์ค‘๋ณต ์ œ๊ฑฐ, ๋Ÿฐํƒ€์ž„(/model /reset, ์ŠคํŠธ๋ฆฌ๋ฐ), ์žฌ์‹œ์ž‘ ์•ˆ๋‚ด, ์ ‘๊ทผ ํ—ˆ๊ฐ€(์†Œ์œ ์ž+ํ—ˆ์šฉ ๋ชฉ๋ก), ์˜๊ตฌ ๋ณด๋‚ผ ํŽธ์ง€ํ•จ
  delivery/      ๋จผ์ € ๋ณด๋‚ด๋Š” ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ: ๋ฐฉํ•ด ๊ธˆ์ง€ ์‹œ๊ฐ„, ํ•˜๋ฃจ ์ƒํ•œ, ์š”์•ฝ ๋ฌถ์Œ, WeChat 24์‹œ๊ฐ„ ์ฐฝ๊ณผ ์—ฐ์žฅ ์•Œ๋ฆผ
  agent/         ์—์ด์ „ํŠธ ๋ชจ๋“œ: DSH ํ˜ธ์ŠคํŠธยท๋ธŒ๋ฆฌ์ง€, ์Šน์ธ, ๊ถŒํ•œ ํ”„๋ฆฌ์…‹, ๊ธฐ์–ตยท์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž, DSH ์„ธ์…˜ ํด๋”
    prompts/     ์—์ด์ „ํŠธ ๋ชจ๋ธ์ด ์ฝ๋Š” ๋ชจ๋“  ํ”„๋กฌํ”„ํŠธ: ์—ญํ• , ๋Œ€ํ™” ๊ทœ์น™, ๊ธฐ์–ต ์•ˆ๋‚ด, ๊ตฌ๊ฐ„ ์ฒซ ๋ฉ”์‹œ์ง€, ์Šคํ‚ฌ
  tools/         ์—์ด์ „ํŠธ๊ฐ€ ์“ฐ๋Š” ๊ธฐ๋Šฅ: ์›น ๊ฒ€์ƒ‰(search.ts), ์ด๋ฏธ์ง€ยท๋™์˜์ƒ ์ƒ์„ฑ(media/), ์ปดํ“จํ„ฐ ์‚ฌ์šฉ(computer-use/), Windows PowerShell(pwsh/), ์•ฑ ์—ฐ๊ฒฐ โ€” ๊ธฐ๋ณธ ์ œ๊ณต ์•ฑ ์ปค๋„ฅํ„ฐ์™€ ์ปค์Šคํ…€ MCP(apps/), ๊ธฐ์กด NotionยทFeishu ๊ณ„์ •(accounts/)
  llm/           OpenAI ํ˜ธํ™˜ ํด๋ผ์ด์–ธํŠธ(๋ชจ๋ธ ์ ‘๊ทผ ์ธํ„ฐํŽ˜์ด์Šค)
  magpie/        magpie ๊ด€๋ฆฌ: ๊ฒฉ๋ฆฌ ํด๋”, ๋นˆ ํฌํŠธ, ๋น„๋ฐ€ ๊ฐ’ ์ƒ์„ฑ, ์ƒํƒœ ๊ฒ€์‚ฌ, ์ถฉ๋Œ ํ›„ ์žฌ์‹œ์ž‘, ์ •์ƒ ์ข…๋ฃŒ
  channels/      feishu/(์ง€์† ์—ฐ๊ฒฐ+CardKit) weixin/(iLink; MIT ๊ณ ์ง€๋Š” LICENSE.openclaw-weixin) messenger/(TelegramยทSlackยทDiscord ๊ณตํ†ต ์†ก์ˆ˜์‹  ๊ฒฝ๋กœ)
  tasks/         ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…๊ณผ ๊ทœ์น™: ์‹คํ–‰, ๋‹จ๊ณ„, ๋น„์šฉ, ๋ณด์กด๊ณผ ์ •๋ฆฌ, ์ผ์ •
  botkit/        ์นดํƒˆ๋กœ๊ทธ ๋ด‡ ํ”„๋ ˆ์ž„์›Œํฌ: ํŒจํ‚ค์ง€ ํ˜•์‹, ๊ฒ€์‚ฌ, ํŒจํ‚น๊ณผ ์„œ๋ช…, ์นดํƒˆ๋กœ๊ทธ, ์„ค์น˜, UI ์ •์  ๊ฒฝ๋กœ(docs/bot-framework.md ์ฐธ๊ณ )
  skills/        ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์„ค์น˜ํ•˜๋Š” ์Šคํ‚ฌ(ZIP ํŒจํ‚ค์ง€)
  store/         SQLite(node:sqlite, ๋„ค์ดํ‹ฐ๋ธŒ ๋นŒ๋“œ ๋ถˆํ•„์š”)
  domain/        ์ˆœ์ˆ˜ ๋ฐ์ดํ„ฐ ํ˜•ํƒœ์™€ ๊ทœ์น™: ๋ด‡ ์„ค์ •, ๋ฐฉํ•ด ๊ธˆ์ง€ ์‹œ๊ฐ„, ์ผ์ •, ์นดํƒˆ๋กœ๊ทธ ๋ด‡ ๊ธฐ๋ก, ์—์ด์ „ํŠธ ๋‹จ๊ณ„. I/O ์—†์Œ, i18n์—๋งŒ ์˜์กด. store๋Š” ์—ฌ๊ธฐ์—๋งŒ ์˜์กด(์˜์กด ๋ฐฉํ–ฅ์€ test/architecture.unit.test.ts์—์„œ ๊ฒ€์‚ฌ)
  account/       Modelflare ๊ณ„์ •: PKCE ๋ฃจํ”„๋ฐฑ ๋กœ๊ทธ์ธ, ํ† ํฐ ๊ต์ฒด, ์ž”์•กยท์•Œ๋ฆผ, ๋ด‡๋ณ„ ์˜ˆ์‚ฐ ํ‚ค, ๋ชจ๋ธ ๊ธฐ๋Šฅยท์ฐธ๊ณ  ๊ฐ€๊ฒฉ
  web/           ์ฝ˜์†” ์„œ๋ฒ„: server.ts๊ฐ€ ์‹œ์ž‘ยท์ธ์ฆยท๋ถ„๋ฐฐ, routes/์— ์˜์—ญ๋ณ„ API(JSON API+SSE ์‹ค์‹œ๊ฐ„ ๋Œ€ํ™”), http.ts๋Š” ๊ณต์šฉ ๋„์šฐ๋ฏธ
  cli/           ์ฒซ ์‹คํ–‰ init ๋งˆ๋ฒ•์‚ฌ, weixin-login
  providers/     ๋ชจ๋ธ ์ถœ์ฒ˜: modelflare.ts(๊ฒฝ๋กœ, ํ‚ค ๊ฒ€์ฆ GET /v1/models, ๋ชจ๋ธ ๋ผ์šฐํŒ…ยท์ถœ์ฒ˜ ํ‘œ์‹œ), modelflare-domains.ts(๊ฒฝ๋กœ ์†๋„ ์ธก์ •), official.ts(๊ณต์‹ API ์ œ๊ณต์—…์ฒด ๋ชฉ๋ก, ์ฃผ์†Œ ๊ณ ์ •)
  updates/       ์—…๋ฐ์ดํŠธ: check.ts(์ƒˆ ๋ฒ„์ „ ํ™•์ธ), desktop.ts(๋ฐ์Šคํฌํ†ฑ ๋‹ค์šด๋กœ๋“œ์™€ ์žฌ์‹œ์ž‘)
  guide.ts       ์‹œ์ž‘ ์ฒดํฌ๋ฆฌ์ŠคํŠธ ์ง„ํ–‰ ์ƒํƒœ
  i18n/          ์„œ๋ฒ„ ๋‹ค๊ตญ์–ด: ์˜ค๋ฅ˜, ์ƒํƒœ ๋ฌธ๊ตฌ, ํŠธ๋ ˆ์ด ๋ฉ”๋‰ด, ๋ด‡ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€(messages/<namespace>.ts)
  diagnostics.ts ๋ฌธ์ œ ํ•ด๊ฒฐ: ์ง„๋‹จ ์š”์ฒญ, ์ตœ๊ทผ ๋กœ๊ทธ, ๋น„๋ฐ€ ์ •๋ณด๋ฅผ ๊ฐ€๋ฆฐ ์ง„๋‹จ ๋ณด๊ณ ์„œ
  version.ts     ์•ฑ ๋ฒ„์ „(package.json)
  main.ts        ๋ช…๋ น์ค„ ์ง„์ž…์ 
electron/        ๋ฐ์Šคํฌํ†ฑ ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค(์‹คํ–‰๊ธฐ+ํŠธ๋ ˆ์ด)
ui/              ์ฝ˜์†” ํ™”๋ฉด(Preact+htm, ๋ณ„๋„ ๋นŒ๋“œ ์—†์Œ)
  design/        ๋””์ž์ธ ์‹œ์Šคํ…œ: tokens/, base/, components/, ๋ด‡ ์บ๋ฆญํ„ฐ bots/
  locales/       ํ™”๋ฉด ๋ฌธ๊ตฌ: zh-CN/, en/ ๋“ฑ ์–ธ์–ด๋ณ„ยท๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ณ„ ํŒŒ์ผ
  css/ lib/ components/ screens/ assets/ main.js
dsh-runtime/     DSH ์—์ด์ „ํŠธ ๋Ÿฐํƒ€์ž„ ์˜์กด์„ฑ ๋ฐ AnyModelBot ํ”Œ๋Ÿฌ๊ทธ์ธ(plugins/)
scripts/         setup / build-magpie / fetch-cua-driver / prepare-dsh / bundle-dsh / electron-smoke / check-readme ๋“ฑ
vendor/          Git ์„œ๋ธŒ๋ชจ๋“ˆ: magpie(๋นŒ๋“œ ์‹œ ์ปดํŒŒ์ผ), deepseek-harness, kimi-computer-use
site/            ์›น์‚ฌ์ดํŠธ(Astro ์ •์  ์‚ฌ์ดํŠธ), site/README.md ์ฐธ์กฐ
docs/            ๊ฐœ๋ฐœ ์•ˆ๋‚ด, ๊ฐœ์ธ์ •๋ณด ์•ˆ๋‚ด, README ์ž๋ฃŒ(docs/assets/)

์†Œ์Šค์—์„œ ์‹คํ–‰ํ•˜๊ธฐ(๋ช…๋ น์ค„)

Node.js 22.13 ์ด์ƒ๊ณผ magpie ์†Œ์Šค ์ปดํŒŒ์ผ์„ ์œ„ํ•œ Go 1.26.8 ์ด์ƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

npm install
npm run setup        # vendor/magpie ์„œ๋ธŒ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์™€ build/bin/์— ์ปดํŒŒ์ผ
npm run init         # ์„ ํƒ: ํ„ฐ๋ฏธ๋„์—์„œ ์ฒซ ์„ค์ •(Modelflare ๋กœ๊ทธ์ธ, Feishu ์ธ์ฆ ์ •๋ณด)
npm start            # ๊ฒŒ์ดํŠธ์›จ์ด+๋ด‡+http://127.0.0.1:3600/ ์ฝ˜์†” ์‹œ์ž‘

๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํด๋”๋Š” ./data์ด๋ฉฐ AMB_DATA_DIR๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” .env.example์„ ํ™•์ธํ•˜์„ธ์š”.

๋ฐ์Šคํฌํ†ฑ ์•ฑ(Electron)

npm run electron:dev     # ๊ฐœ๋ฐœ ๋ชจ๋“œ ์‹คํ–‰
npm run electron:smoke   # ์Šค๋ชจํฌ ํ…Œ์ŠคํŠธ(ํ™”๋ฉด ์—†๋Š” Linux๋Š” xvfb-run ์ž๋™ ์‚ฌ์šฉ)
npm run dist             # ํ˜„์žฌ ํ”Œ๋žซํผ์šฉ ํŒจํ‚ค์ง•(magpie๋Š” resources/magpie/์— ํฌํ•จ)
npm run dist:linux | dist:mac | dist:win
npm run test:dsh-bundle  # ํŒจํ‚ค์ง•๋œ build/dsh์˜ ์‹ค์ œ DSH ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ(Electron, ๋จผ์ € prepare:dsh+bundle:dsh ์‹คํ–‰)
  • DSH ์—์ด์ „ํŠธ ๋Ÿฐํƒ€์ž„: scripts/prepare-dsh.mjs๊ฐ€ ๋Œ€์ƒ ํ”Œ๋žซํผ์— ๋งž๊ฒŒ dsh-runtime/์„ ์„ค์น˜ํ•˜๊ณ  scripts/bundle-dsh.mjs๊ฐ€ resources/dsh/dsh.asar(๋ชจ๋“  JavaScript๋ฅผ ํ•œ ํŒŒ์ผ๋กœ)์™€ resources/dsh/node_modules/(๋„ค์ดํ‹ฐ๋ธŒ ํŒจํ‚ค์ง€๋งŒ, ์•ฝ 55๊ฐœ ํŒŒ์ผ)๋กœ ๋ฌถ์Šต๋‹ˆ๋‹ค. Electron ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์™€ ELECTRON_RUN_AS_NODE ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” asar๋ฅผ ์ง์ ‘ ์ฝ์œผ๋ฉฐ ์ฒซ ์‹คํ–‰ ๋•Œ ์••์ถ•์„ ํ’€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์ด ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํŒŒ์ผ๋งŒ ํ’€๋ฉด ๋˜๋ฏ€๋กœ Windows์˜ ์••์ถ• ํ•ด์ œ์™€ ํŒŒ์ผ๋ณ„ ๋ฐฑ์‹  ๊ฒ€์‚ฌ๋กœ ์ธํ•œ ์ง€์—ฐ์„ ์ค„์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ์ค‘์—๋Š” dsh-runtime/์„ ์ง์ ‘ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Windows ์—์ด์ „ํŠธ ๋ช…๋ น์šฉ PowerShell: ์ƒŒ๋“œ๋ฐ•์Šค์—์„œ Windows PowerShell 5.1์€ ๋ช…๋ น๋‹น 20~30์ดˆ, PowerShell 7์€ ์•ฝ 1์ดˆ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์„ ํƒ ์ˆœ์„œ๋Š” ์‹œ์Šคํ…œ์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ PowerShell 7(DSH์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ํ•œ ๋ฒˆ ์‹œํ—˜ํ•˜๋ฉฐ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์Œ) โ†’ ์•ฑ ์ „์šฉ PowerShell 7 โ†’ Windows PowerShell 5.1์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ 7์ด ์—†๊ณ  ์—์ด์ „ํŠธ ๋ชจ๋“œ๊ฐ€ ์ผœ์ ธ ์žˆ์œผ๋ฉด ๊ณต์‹ PowerShell 7.6.9(LTS) zip์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ %LOCALAPPDATA%\AnyModelBot\pwsh\๋กœ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž ๊ถŒํ•œ, ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์“ฐ๊ธฐ, PATH ๋ณ€๊ฒฝ์ด ํ•„์š” ์—†์œผ๋ฉฐ ๊ธฐ์กด PowerShell์—๋„ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฒ„์ „๊ณผ x64/arm64 zip์˜ SHA256์€ src/tools/pwsh/private.ts์— ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค(node scripts/pwsh-hashes.mjs <version>์œผ๋กœ ๊ฐฑ์‹ ). ๋‹ค์šด๋กœ๋“œ ํ›„ ํ•ด์‹œ, ์••์ถ• ํ•ด์ œ ํ›„ Microsoft Authenticode ์„œ๋ช…์„ ํ™•์ธํ•˜๊ณ  DSH ๋ฐฉ์‹์˜ ์‹œํ—˜ ์‹คํ–‰(๋ฒ„์ „, ์ž„์‹œ ํŒŒ์ผ ์ฝ๊ธฐยท์“ฐ๊ธฐ, ์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰)์„ ํ†ต๊ณผํ•ด์•ผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ๋ฏธ์™„๋ฃŒ๋œ ์„ค์น˜๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‹ค์Œ ์‹คํ–‰ ์‹œ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜ ์ค‘์—๋Š” ๋Œ€ํ™” ํ™”๋ฉด, ์„ค์ • โ†’ ์ผ๋ฐ˜, /status์— ์ง„ํ–‰ ์ƒํ™ฉ์„ ํ‘œ์‹œํ•˜๋ฉฐ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ 5.1์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๊ธฐ ์ค‘์ธ ์—์ด์ „ํŠธ๋Š” ์•ฑ ์žฌ์‹œ์ž‘ ์—†์ด ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ์ค‘ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๋ฉด(์‚ญ์ œยท๋ฐฑ์‹  ๊ฒฉ๋ฆฌยท์ •์ฑ… ์ฐจ๋‹จ) ์ด์ „ ์„ ํƒ์ง€๋กœ ๋Œ์•„๊ฐ€๊ณ  ์ด์œ ๋ฅผ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค. ์„ค์ • โ†’ ๋ฌธ์ œ ํ•ด๊ฒฐ์—์„œ ์„ค์น˜ยท์žฌ์„ค์น˜ยท์‹œ์Šคํ…œ ๊ธฐ๋ณธ๊ฐ’ ๋ณต๊ท€๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Windows 10 1607 / Server 2016๋ณด๋‹ค ์˜ค๋ž˜๋œ ์‹œ์Šคํ…œ์—์„œ๋Š” ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ์Šคํฌํ†ฑ ์•ฑ์€ Chromium ๋„คํŠธ์›Œํฌ ์Šคํƒ์œผ๋กœ ์‹œ์Šคํ…œ ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ช…๋ น์ค„์€ Node fetch๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(์ตœ๊ทผ Node์—์„œ๋Š” NODE_USE_ENV_PROXY=1์ผ ๋•Œ HTTPS_PROXY ์ ์šฉ). AMB_PWSH_MIRROR๋กœ ๋ฏธ๋Ÿฌ ์ ‘๋‘์‚ฌ๋ฅผ ์ง€์ •ํ•ด๋„ ํ•ด์‹œ์™€ ์„œ๋ช…์€ ๊ฒ€์‚ฌํ•˜๋ฉฐ AMB_PWSH_AUTO_INSTALL=0์œผ๋กœ ์ž๋™ ์„ค์น˜๋ฅผ ๋•๋‹ˆ๋‹ค.
  • ์—์ด์ „ํŠธ ๋ช…๋ น์€ ๋„คํŠธ์›Œํฌ์— ์ ‘๊ทผํ•˜๋ฉฐ ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(์ƒŒ๋“œ๋ฐ•์Šค๋Š” ์“ฐ๊ธฐ๋งŒ ์ œํ•œ). HTTP_PROXY / HTTPS_PROXY / ALL_PROXY / NO_PROXY์™€ ์†Œ๋ฌธ์ž ํ˜•ํƒœ, ์ธ์ฆ์„œยทํŒจํ‚ค์ง€ ์ธ๋ฑ์Šค ๋ณ€์ˆ˜(SSL_CERT_FILE, REQUESTS_CA_BUNDLE, NODE_EXTRA_CA_CERTS, PIP_INDEX_URL, npm_config_registry, GOPROXY ๋“ฑ)๋ฅผ ์•ฑ ํ™˜๊ฒฝ์—์„œ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ™˜๊ฒฝ์— ํ”„๋ก์‹œ๊ฐ€ ์—†์œผ๋ฉด ๋ฐ์Šคํฌํ†ฑ ์•ฑ์ด ์—์ด์ „ํŠธ ์‹œ์ž‘๋งˆ๋‹ค ์‹œ์Šคํ…œ ์„ค์ •๊ณผ PAC๋ฅผ ์กฐํšŒํ•ด http://host:port ํ˜•ํƒœ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค(src/agent/proxy-env.ts). ๋ฃจํ”„๋ฐฑ(127.0.0.1, localhost, ::1)์€ ํ•ญ์ƒ NO_PROXY์— ์ถ”๊ฐ€ํ•˜๋ฉฐ ํ”„๋ก์‹œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ํด๋”: <userData>/data(macOS ~/Library/Application Support/anymodel bot/data, Windows %APPDATA%\anymodel bot\data, Linux ~/.config/anymodel bot/data). ๋กœ๊ทธ๋Š” ๋ฐ์ดํ„ฐ ํด๋”์˜ logs/app.log์— ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฐฝ์„ ๋‹ซ์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ํŠธ๋ ˆ์ด์— ์ˆจ๊น๋‹ˆ๋‹ค(์„ค์ • โ†’ ์ผ๋ฐ˜์—์„œ ์ข…๋ฃŒํ•˜๋„๋ก ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ). ํŠธ๋ ˆ์ด ๋ฉ”๋‰ด: ์—ด๊ธฐ / ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด๊ธฐ / ๋กœ๊ทธ์ธ ์‹œ ์‹คํ–‰(macOS, Windows) / ๋ฐ์ดํ„ฐ ํด๋” ์—ด๊ธฐ / ์ข…๋ฃŒ.
  • macOS ์ฐฝ์—๋Š” ์ œ๋ชฉ ํ‘œ์‹œ์ค„์ด ์—†๊ณ  ์ฐฝ ์ œ์–ด ๋ฒ„ํŠผ์€ ์‚ฌ์ด๋“œ๋ฐ” ์ƒ๋‹จ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์†Œ ์ฐฝ ๋„ˆ๋น„๋Š” 860์ž…๋‹ˆ๋‹ค.
  • ์ฝ˜์†”์€ 127.0.0.1์—์„œ๋งŒ ์ˆ˜์‹  ๋Œ€๊ธฐํ•˜๊ณ  ์‹œ์ž‘๋งˆ๋‹ค ์ž„์˜ ์ ‘๊ทผ ํ† ํฐ์„ ์ƒ์„ฑํ•˜์—ฌ ๋‹ค๋ฅธ ๋กœ์ปฌ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ด€๋ฆฌ API ์ง์ ‘ ํ˜ธ์ถœ์„ ๋ง‰์Šต๋‹ˆ๋‹ค.
  • ์ข…๋ฃŒ ์‹œ ์ฑ„๋„์„ ๋จผ์ € ์ค‘์ง€ํ•˜๊ณ  magpie๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ์‹คํ–‰์ด ๊ฐ•์ œ ์ข…๋ฃŒ๋˜์–ด magpie๊ฐ€ ๋‚จ์•˜๋‹ค๋ฉด ๋‹ค์Œ ์‹คํ–‰์—์„œ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค(Linux/macOS).

๋ฆด๋ฆฌ์Šค: CHANGELOG.md, CHANGELOG_en.md, CHANGELOG_ja.md, CHANGELOG_ko.md, CHANGELOG_ru.md, CHANGELOG_es.md, CHANGELOG_pt.md์— ํ•ด๋‹น ๋ฒ„์ „์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค(์›น์‚ฌ์ดํŠธ๋‚˜ ๋‚ด๋ถ€ ๊ตฌํ˜„๋ณด๋‹ค ์‚ฌ์šฉ์ž๊ฐ€ ๋А๋ผ๋Š” ๋ณ€๊ฒฝ ์ค‘์‹ฌ, ์˜๋ฌธ ์‚ฌ์ดํŠธ๋Š” WeChatยทFeishu๊ฐ€ ์–ธ๊ธ‰๋œ ์ค„ ์ œ์™ธ). package.json์˜ version์„ ์˜ฌ๋ฆฌ๊ณ  ์ปค๋ฐ‹ํ•œ ๋’ค v<version> ํƒœ๊ทธ๋ฅผ ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ๋‚ด์—ญ์ด ์—†์œผ๋ฉด ๋ฆด๋ฆฌ์Šค ์›Œํฌํ”Œ๋กœ๊ฐ€ ์ฒ˜์Œ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์žˆ์œผ๋ฉด GitHub Release ๋…ธํŠธ์™€ ์‚ฌ์ดํŠธ ๋ณ€๊ฒฝ ๋‚ด์—ญ์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ์•ฑ์˜ โ€˜์—…๋ฐ์ดํŠธ ๋‚ด์šฉโ€™ ๋Œ€ํ™”์ƒ์ž๋„ ๊ฐ™์€ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ์ฝ์Šต๋‹ˆ๋‹ค. CHANGELOG*.md๋Š” ์„ค์น˜ ํŒŒ์ผ๊ณผ Docker ์ด๋ฏธ์ง€์— ํฌํ•จ๋˜๋ฉฐ(src/changelog.ts), ์•„์ง ์„ค์น˜ํ•˜์ง€ ์•Š์€ ์ƒˆ ๋ฒ„์ „์˜ ๋‚ด์šฉ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์—ด ๋•Œ ํ•ด๋‹น ๋ฒ„์ „ ํƒœ๊ทธ์—์„œ ์ฝ์–ด ์˜ต๋‹ˆ๋‹ค. .github/workflows/release.yml์ด 6๊ฐœ OS/์•„ํ‚คํ…์ฒ˜ ๋Ÿฌ๋„ˆ์—์„œ ๋นŒ๋“œํ•˜๊ณ  ์„ค์น˜ ํŒŒ์ผ๊ณผ SHA256SUMS๋ฅผ GitHub Release์— ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ช…ยท๊ณต์ฆ์— ํ•„์š”ํ•œ ์ €์žฅ์†Œ ๋น„๋ฐ€ ๊ฐ’์€ ํ•ด๋‹น ํŒŒ์ผ ์ƒ๋‹จ ์ฃผ์„์„ ํ™•์ธํ•˜์„ธ์š”. ๊ฐ™์€ ํƒœ๊ทธ๊ฐ€ .github/workflows/docker.yml๋„ ์‹คํ–‰ํ•˜์—ฌ x64+arm64 ์ด๋ฏธ์ง€๋ฅผ ghcr.io/modelflare-ai/anymodel-bot์— <version>, latest ํƒœ๊ทธ๋กœ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค. ํƒœ๊ทธ๋กœ ๋ฐฐํฌํ•  ๋•Œ macOS ์„ค์น˜ ํŒŒ์ผ์€ Developer ID ์„œ๋ช…๊ณผ ๊ณต์ฆ์ด ํ•„์ˆ˜์ด๋ฉฐ, ํŒจํ‚ค์ง• ํ›„ .app๊ณผ DMG ์•ˆ์˜ .app์„ spctl ๋“ฑ์œผ๋กœ ๊ฒ€์‚ฌํ•ด ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•˜๋ฉด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ •์‹ ๋นŒ๋“œ๋Š” ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ๋•๋‹ˆ๋‹ค. ๋””๋ฒ„๊ทธ ๋นŒ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋ฉด npm run dist:debug๋ฅผ ์“ฐ๊ฑฐ๋‚˜ Release๋ฅผ ์ˆ˜๋™ ์‹คํ–‰ํ•  ๋•Œ debug_build๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค(ํŒŒ์ผ ์ด๋ฆ„์— -debug-๊ฐ€ ๋ถ™๊ณ , ํƒœ๊ทธ์—์„œ๋Š” ๊ฑฐ๋ถ€๋˜๋ฉฐ, scripts/check-build-flavor.mjs๊ฐ€ ํŒจํ‚ค์ง€ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค).

๋ฒ„์ „์„ ๋ฐฐํฌํ•  ๋•Œ๋งˆ๋‹ค ๊ณต์‹ ์‚ฌ์ดํŠธ, ๊ด€๋ จ ๋ฌธ์„œ์™€ ๋ชจ๋“  ์–ธ์–ด์˜ README๋ฅผ ํ•จ๊ป˜ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. npm --prefix site run sync๋กœ ์‚ฌ์ดํŠธ ๋‚ด์šฉ์„ ๋™๊ธฐํ™”ํ•˜๊ณ  GitHub Release์™€ Docker ์ด๋ฏธ์ง€ ๊ฒŒ์‹œ ํ›„ ์‚ฌ์ดํŠธ ๋ฐฐํฌ ์•ˆ๋‚ด์— ๋”ฐ๋ผ ์šด์˜ ์‚ฌ์ดํŠธ๋ฅผ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. /download, /changelog, /bots์˜ ๋ฒ„์ „, ๋‹ค์šด๋กœ๋“œ ๋งํฌ์™€ ์„ค๋ช…์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ฉฐ ์šด์˜ ์‚ฌ์ดํŠธ๊นŒ์ง€ ๋ฐ˜์˜๋˜์–ด์•ผ ๋ฐฐํฌ๊ฐ€ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

์•ฑ ๋‚ด ์—…๋ฐ์ดํŠธ๋Š” 0.1.29๋ถ€ํ„ฐ ํŒจํ‚ค์ง•๋œ macOS, Windows, Linux AppImage์—์„œ electron-updater๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ui.autoDownloadUpdates์˜ ๊ธฐ๋ณธ๊ฐ’์€ true์ด๋ฉฐ ์„ค์ • โ†’ ์ผ๋ฐ˜์—์„œ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์šด๋กœ๋“œ ํ›„ ์•Œ๋ฆผ๋งŒ ํ‘œ์‹œํ•˜๊ณ  ์ผ๋ฐ˜ ์ข…๋ฃŒ ์‹œ์—๋Š” ์„ค์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์žฌ์‹œ์ž‘ ์ „์— ์‹คํ–‰ ์ค‘์ธ ๋Œ€ํ™”์™€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. 0.1.28 ์ด์ „ ์‚ฌ์šฉ์ž๋Š” ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋œ ๋ฒ„์ „์„ ํ•œ ๋ฒˆ ์ง์ ‘ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. GitHub ๋นŒ๋“œ๋Š” macOS DMG์™€ ์—…๋ฐ์ดํŠธ์šฉ ZIP, ์•„ํ‚คํ…์ฒ˜๋ณ„ latest-${arch} ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ blockmap์„ ๋งŒ๋“ค๊ณ  ๋ชจ๋“  ํŒŒ์ผ ์—…๋กœ๋“œ ํ›„ Release๋ฅผ ๊ณต๊ฐœํ•ฉ๋‹ˆ๋‹ค. CLI, Docker์™€ ํŒจํ‚ค์ง•ํ•˜์ง€ ์•Š์€ ๊ฐœ๋ฐœ ์‹คํ–‰์€ ์ˆ˜๋™ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Docker

์‚ฌ์šฉ์ž๋Š” ๊ฒŒ์‹œ๋œ ์ด๋ฏธ์ง€๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค: docker run -d --name amb -p 3600:3600 -v amb-data:/data ghcr.io/modelflare-ai/anymodel-bot. ์†Œ์Šค์—์„œ ์ง์ ‘ ๋นŒ๋“œํ•˜๋ ค๋ฉด:

git submodule update --init --depth 1 vendor/magpie
docker build -t anymodel-bot .
docker run -d --name amb -p 3600:3600 -v amb-data:/data anymodel-bot
docker exec amb cat /data/ui-token     # http://<host>:3600/?token=<token> ์—ด๊ธฐ

์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ์ฝ˜์†”์€ 0.0.0.0์—์„œ ์ˆ˜์‹  ๋Œ€๊ธฐํ•˜๋ฏ€๋กœ ํ† ํฐ ์ ‘๊ทผ์ด ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. 3600 ํฌํŠธ๋ฅผ ์ธํ„ฐ๋„ท์— ์ง์ ‘ ๋…ธ์ถœํ•˜์ง€ ๋งˆ์„ธ์š”. WeChat QR ๋กœ๊ทธ์ธ์€ ์„ค์ • โ€บ ์ฑ„ํŒ… ์ฑ„๋„์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋ธ(Modelflare)

  • ์ฒซ ํ™”๋ฉด์˜ โ€˜Modelflare ๋กœ๊ทธ์ธ / ํšŒ์›๊ฐ€์ž…โ€™์„ ๋ˆ„๋ฅด๋ฉด ์‹œ์Šคํ…œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋กœ๊ทธ์ธยท๊ฐ€์ž…ํ•˜๊ณ  ๊ณ„์† ๋ฒ„ํŠผ์œผ๋กœ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์œผ๋กœ ๋Œ์•„์˜ค๋ฉด ์ด ์ปดํ“จํ„ฐ ์ „์šฉ API ํ‚ค๋ฅผ ๋ฐœ๊ธ‰ยท์—ฐ๊ฒฐํ•˜๊ณ  ๊ธฐ๋ณธ ๋ชจ๋ธ์„ ์„ ํƒํ•œ ๋’ค ๋Œ€ํ™”๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. Dockerยท์›๊ฒฉ ๋ฐฐํฌ๋Š” ๋ธŒ๋ผ์šฐ์ € ์ฝœ๋ฐฑ์„ ๋ฐ›์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ๋กœ๊ทธ์ธ ํ›„ ์ด๋™ํ•˜๋Š” ์—ด๋ฆฌ์ง€ ์•Š๋Š” 127.0.0.1 ์ฃผ์†Œ์˜ ๋งํฌ๋ฅผ ์ฒซ ํ™”๋ฉด์— ๋ถ™์—ฌ ๋„ฃ์Šต๋‹ˆ๋‹ค(POST /amb/api/account/login/complete, state์™€ PKCE ๊ฒ€์ฆ์€ ๋™์ผ). ์ด์ „ ๋ฒ„์ „์—์„œ API ํ‚ค๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ ํ‚ค๋ฅผ ๊ธฐ๊ธฐ์—์„œ ์ œ๊ฑฐํ•˜๋ฏ€๋กœ ๋กœ๊ทธ์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ์ฝœ๋ฐฑ ํŽ˜์ด์ง€๋Š” ๋จผ์ € โ€˜๋กœ๊ทธ์ธ์„ ์™„๋ฃŒํ•˜๋Š” ์ค‘โ€™์„ ๋ณด์—ฌ ์ฃผ๊ณ , ํ† ํฐ ๊ตํ™˜ยท๊ณ„์ • ์กฐํšŒยท๊ธฐ๊ธฐ ์ „์šฉ ํ‚ค ๋ฐœ๊ธ‰ยท๊ฒŒ์ดํŠธ์›จ์ด ์—ฐ๊ฒฐ์ด ๋ชจ๋‘ ์„ฑ๊ณตํ•œ ๋’ค์—์•ผ โ€˜๋กœ๊ทธ์ธ ์„ฑ๊ณตโ€™์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค(์‹คํŒจํ•˜๋ฉด ์ด์œ  ํ‘œ์‹œ). ๋ฐ์Šคํฌํ†ฑ ์•ฑ์€ anymodelbot:// ๋งํฌ๋ฅผ ๋“ฑ๋กํ•˜๊ณ , ํŽ˜์ด์ง€๋Š” ์—ด๋ฆด ๋•Œ ํ•œ ๋ฒˆ ์•ฑ์„ ์—ด์–ด ๋ณด๋ฉฐ โ€˜AnyModelBot ์—ด๊ธฐโ€™๋กœ ๋‹ค์‹œ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฑ์ด ์‹ค์ œ๋กœ ๊ทธ ๋งํฌ๋ฅผ ๋ฐ›์•˜์„ ๋•Œ๋งŒ โ€˜๋Œ์•„๊ฐ”์Šต๋‹ˆ๋‹คโ€™๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ง์ ‘ API ํ‚ค๋ฅผ ์“ฐ๋Š” ํ™”๋ฉด์—์„œ๋„ Modelflare ๊ณ„์ •์œผ๋กœ ๋ฐ”๋กœ ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ ์—ฐ๊ฒฐํ•  ๋•Œ ์ „์—ญ ๊ธฐ๋ณธ ๋ชจ๋ธ์ด ๋น„์–ด ์žˆ์œผ๋ฉด src/account/first-model.ts์˜ ๊ทœ์น™(๋„๊ตฌ ํ˜ธ์ถœ ์ง€์›, 1ํšŒ ์„ ์  ๊ธˆ์•ก๊ณผ ๋Œ€ํ‘œ ์ž‘์—… ๋น„์šฉ์ด ์ฒดํ—˜ ํ•œ๋„ ์•ˆ, DeepSeek ์šฐ์„ )์œผ๋กœ ์ฒซ ์‚ฌ์šฉ ๋ชจ๋ธ์„ ํ•œ ๋ฒˆ ๊ณ ๋ฆ…๋‹ˆ๋‹ค. ๋งž๋Š” ๋ชจ๋ธ์ด ์—†์œผ๋ฉด ๋ฏธ๋ฆฌ ๊ณ ๋ฅด์ง€ ์•Š๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๋ฆ…๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์ธ ๋ฐฉ์‹์€ RFC 8252์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์— ๋งž์ถ˜ OIDC ์ธ์ฆ ์ฝ”๋“œ+PKCE(RFC 7636)์ž…๋‹ˆ๋‹ค. ๊ณต๊ฐœ ํด๋ผ์ด์–ธํŠธ(client_id: anymodel-bot)๋กœ์„œ ํด๋ผ์ด์–ธํŠธ ๋น„๋ฐ€ ๊ฐ’์ด ์—†๊ณ  ํ•„์š”ํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” 127.0.0.1์˜ ์ž„์‹œ ํฌํŠธ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. Modelflare ํ”„๋กœํ•„์˜ ์ธ์ฆ๋œ ์•ฑ์—์„œ ๊ถŒํ•œ์„ ์ทจ์†Œํ•˜๋ฉด ์•ฑ์ด ์ด๋ฅผ ๊ฐ์ง€ํ•ด ๋กœ๊ทธ์ธ ํ™”๋ฉด์œผ๋กœ ๋Œ์•„์˜ต๋‹ˆ๋‹ค.
  • ๊ฐฑ์‹  ํ† ํฐ์€ ๋ฐ์ดํ„ฐ ํด๋”์˜ modelflare-account.json(๊ถŒํ•œ 600)์— ์ €์žฅํ•˜๋ฉฐ, ๋‚ด์žฅ ๊ฒŒ์ดํŠธ์›จ์ด์˜ API ํ‚ค์ฒ˜๋Ÿผ ํŒŒ์ผ ๊ถŒํ•œ์œผ๋กœ๋งŒ ๋ณดํ˜ธํ•˜๊ณ  ์‹œ์Šคํ…œ ํ‚ค์ฒด์ธ์€ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค(0.1.30 ์ดํ•˜ ๋ฐ์Šคํฌํ†ฑ ์•ฑ์ด ์•”ํ˜ธํ™”ํ•œ ํŒŒ์ผ์€ ์ฒ˜์Œ ์ฝ์„ ๋•Œ ํ‰๋ฌธ์œผ๋กœ ๋‹ค์‹œ ์”๋‹ˆ๋‹ค). ํ™”๋ฉด์—๋Š” ๊ณ„์ • ์ด๋ฆ„๋งŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์•„์›ƒํ•˜๋ฉด ์ปดํ“จํ„ฐ์˜ ๊ถŒํ•œ์„ ์ทจ์†Œํ•˜๊ณ  Modelflare๊ฐ€ ๋กœ๊ทธ์ธ ์‹œ ์ปดํ“จํ„ฐยท๋ด‡์— ๋ฐœ๊ธ‰ํ•œ ํ‚ค๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
  • ์ž”์•ก์€ ์ƒ์‹œ ํ‘œ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์ด๋“œ๋ฐ” ์™ผ์ชฝ ์•„๋ž˜ ์•„๋ฐ”ํƒ€ ๋˜๋Š” ์„ค์ • โ†’ ๋ชจ๋ธ์—์„œ ์ง€๊ฐ‘ ์ž”์•ก์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ถฉ์ „์€ Modelflare ์›น์‚ฌ์ดํŠธ๋ฅผ ์—ด๊ณ  ์•ฑ์œผ๋กœ ๋Œ์•„์˜ค๋ฉด ์ž”์•ก์„ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. ์•Œ๋ฆผ ๊ธฐ์ค€(๊ธฐ๋ณธ US$1, ๋ณ€๊ฒฝยทํ•ด์ œ ๊ฐ€๋Šฅ) ์•„๋ž˜๊ฐ€ ๋˜๋ฉด ํ•œ ๋ฒˆ ์•Œ๋ฆฌ๋ฉฐ WeChat/Feishu๋กœ๋„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์ธํ•˜๋ฉด ์„ค์ • โ†’ ๋ชจ๋ธ์— ์ผ๋ณ„ยท๋ชจ๋ธ๋ณ„ ์‚ฌ์šฉ๋Ÿ‰, Modelflare ์•Œ๋ฆผ, ์ดˆ๋Œ€ ๋งํฌ๋„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • ๋ด‡ ์˜ˆ์‚ฐ(๋กœ๊ทธ์ธ ํ•„์š”): ๋ด‡ ์„ค์ • โ†’ ์˜ˆ์‚ฐ. ์ผœ๋ฉด ์„ค์ • ๊ธˆ์•ก์ด ํ•œ๋„์ธ ์ „์šฉ ํ‚ค(๊ฒŒ์ดํŠธ์›จ์ด์˜ ๋ณ„๋„ provider)๋ฅผ ์“ฐ๊ณ  ๋„๋ฉด ๊ณต์œ  ํ‚ค๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.
  • ์ถ”๋ก  ๊ฐ•๋„: ๋ชจ๋ธ ์„ ํƒ ํŒจ๋„ ๋˜๋Š” ์„ค์ • โ†’ ๋ชจ๋ธ์—์„œ ๊ณ ๋ฆ…๋‹ˆ๋‹ค(์ž๋™ / ๋‚ฎ์Œ / ๋ณดํ†ต / ๋†’์Œ). ์ „์—ญ ์„ค์ • ํ•˜๋‚˜์ด๋ฉฐ ๋‹ค์Œ ํ„ด๋ถ€ํ„ฐ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ž๋™์ด๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณด๋‚ด์ง€ ์•Š๊ณ  ๋ชจ๋ธ ๊ธฐ๋ณธ๊ฐ’์„ ์”๋‹ˆ๋‹ค. ์ง€์›ํ•˜๋Š” ๋ชจ๋ธ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. Responses API์˜ ์ถ”๋ก  ๋ชจ๋ธ, ๋ชจ๋ธ ํ”„๋กœํ•„์— ์ถ”๋ก ์œผ๋กœ ํ‘œ์‹œ๋œ Chat ๋ฐ Claude์ž…๋‹ˆ๋‹ค(Claude 4.6 ์ด์ƒ์€ adaptive์™€ output_config.effort, ์ด์ „ ๋ชจ๋ธ์€ budget_tokens).
  • ์ด๋ฏธ์ง€ยท๋™์˜์ƒ ์ƒ์„ฑ: ์—์ด์ „ํŠธ์— media_models(๋ชจ๋ธยท๊ธฐ๋ณธ๊ฐ’ยท๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฒ”์œ„ยท์ฐธ๊ณ  ๊ฐ€๊ฒฉ), media_docs(docs.modelflare.dev์—์„œ ์š”์ฒญ ํ˜•์‹ ์‹ค์‹œ๊ฐ„ ์กฐํšŒ), generate_image, generate_video์™€ ๋‚ด์žฅ ๋ฏธ๋””์–ด ์Šคํ‚ฌ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ๋งˆ๋‹ค ํ˜•์‹์ด ๋‹ฌ๋ผ ๋ฌธ์„œ๋ฅผ ๋ณด๊ณ  ์š”์ฒญ ๋ณธ๋ฌธ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—… ๊ณต๊ฐ„์˜ ์ฐธ๊ณ  ์ด๋ฏธ์ง€๋Š” workspace:path๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ํ‚ค๋Š” ์•ฑ์„ ๋ฒ—์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ฑ์ด ๋ด‡ ํ‚ค๋กœ Modelflare๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ž‘์—… ๊ณต๊ฐ„ media/์— ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด ๋Œ€ํ™”๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒ์„ฑ ์ „ ํ™•์ธ: ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฆ‰์‹œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ชจ๋ธ์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ ์š”์ฒญ์ด ๋ชจํ˜ธํ•˜๋‹ค๋Š” ์ด์œ ๋งŒ์œผ๋กœ ๋ฌป์ง€ ์•Š๊ณ  ํ•ฉ๋ฆฌ์ ์œผ๋กœ ํ•ด์„ํ•œ ๋’ค ๊ฒฐ๊ณผ์—์„œ ์‚ฌ์šฉํ•œ ๋‚ด์šฉ์„ ํ•œ ์ค„๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ƒ ๋น„์šฉ์ด $0.5๋ฅผ ๋„˜์„ ๋•Œ๋งŒ ํ”„๋กฌํ”„ํŠธยท๋งค๊ฐœ๋ณ€์ˆ˜ยท์ฐธ๊ณ  ๊ฐ€๊ฒฉยทํ™•์ธ ์ด์œ ์™€ ํ•จ๊ป˜ ๋ชจ๋ธ์„ ๋ฌป์Šต๋‹ˆ๋‹ค(์ด๋ฏธ์ง€ ์ˆ˜, ๋™์˜์ƒ ๊ธธ์ดยทํ•ด์ƒ๋„ ๋“ฑ์œผ๋กœ ๊ณ„์‚ฐํ•˜๋ฉฐ ๋น„์šฉ์„ ์ถ”์ •ํ•  ์ˆ˜ ์—†๋Š” ๋™์˜์ƒ๋„ ํฌํ•จ). ์Šน์ธยท๋ชจ๋ธ ๋ณ€๊ฒฝยท์ทจ์†Œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ WeChat์—์„œ๋Š” ๋ฒˆํ˜ธ๋‚˜ ๋ชจ๋ธ ์ด๋ฆ„์œผ๋กœ, Feishu/์›น์—์„œ๋Š” ํด๋ฆญ์œผ๋กœ ๋‹ตํ•ฉ๋‹ˆ๋‹ค. 10๋ถ„ ๋‚ด ๋‹ต์ด ์—†์œผ๋ฉด ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ํ™•์ธํ•˜๋ ค๋ฉด ๋ด‡ ์„ค์ • โ†’ ์ด๋ฏธ์ง€์™€ ๋™์˜์ƒ โ†’ ์ƒ์„ฑ ์ „์— ํ™•์ธ โ†’ ํ•ญ์ƒ ํ™•์ธ์„ ์„ ํƒํ•˜์„ธ์š”.
  • ์›น ๊ฒ€์ƒ‰: web_search๋Š” DeepSeek ํ‚ค๊ฐ€ ํ•„์š”ํ•œ ์ž์ฒด ๊ฒ€์ƒ‰์„ ์“ฐ์ง€ ์•Š๊ณ  amb-web-search ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•ด ์•ฑ์— ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๊ฒ€์ƒ‰์€ ๋ฌด๋ฃŒ์ด๋ฉฐ Exa ๊ณต๊ฐœ MCP, Bing, DuckDuckGo๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์‹œ๋„ํ•˜๋˜ ์ตœ๊ทผ ์„ฑ๊ณตํ•œ ๊ฒƒ์„ ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ์ œ๊ณต์—…์ฒด(์š”์ฒญ ์ œํ•œ, ๋ด‡ ๊ฒ€์‚ฌ, ๋ฌด๊ด€ํ•œ Bing ๊ฒฐ๊ณผ)๋Š” 10๋ถ„๊ฐ„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ์„ค์ • โ†’ ๋„คํŠธ์›Œํฌ ๋ฐ ์ ‘๊ทผ โ†’ ์›น ๊ฒ€์ƒ‰์—์„œ Tavily, Exa, Bocha, Zhipu(ํ‚ค ํ•„์š”), ์ž์ฒด SearXNG๋ฅผ ์ง€์ •ํ•˜๋ฉด ์šฐ์„  ์‚ฌ์šฉํ•˜๊ณ  ์‹คํŒจ ์‹œ ๋ฌด๋ฃŒ ๊ฒ€์ƒ‰์œผ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ํ‚ค๋Š” ์ฑ„๋„ ํ† ํฐ์ฒ˜๋Ÿผ ๋กœ์ปฌ DB์— ์ €์žฅํ•˜๋ฉฐ ์—์ด์ „ํŠธ์— ์ „๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ์Šคํฌํ†ฑ์€ ์‹œ์Šคํ…œ ํ”„๋ก์‹œ, ๋ช…๋ น์ค„์€ Node fetch(NODE_USE_ENV_PROXY=1์ด๋ฉด HTTPS_PROXY ์ ์šฉ)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ฑ„ํŒ… ์ฑ„๋„ ๊ณ„์ •(src/core/routes.ts): WeChat, Feishu, Telegram, Slack, Discord๋„ ์ „์—ญ ๊ณ„์ •์ž…๋‹ˆ๋‹ค. ์„ค์ • โ€บ ์ฑ„ํŒ… ์ฑ„๋„์—์„œ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ณ„์นญ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€ ์ˆ˜์‹  ๋ด‡์€ ์‚ฌ์šฉ์ž๊ฐ€ /bot์œผ๋กœ ์„ ํƒํ•œ ๋ด‡ โ†’ ๊ณ„์ • ๊ธฐ๋ณธ ๋ด‡ โ†’ ์ฒซ ๋ฒˆ์งธ ๋ด‡ ์ˆœ์„œ์ž…๋‹ˆ๋‹ค. /bot์€ ๋ชฉ๋ก, /bot name์€ ์ „ํ™˜ ํ›„ ์„ ํƒ ์ €์žฅ์ž…๋‹ˆ๋‹ค. ๊ฐ ๋ด‡์˜ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ๋‹ค๋ฅธ ๋ด‡๊ณผ ์ „ํ™˜๋ฒ•์„ ๋„ฃ์–ด ๊ด€๋ จ ์งˆ๋ฌธ์— ๋‹ตํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์†Œ์œ ์žยทํ—ˆ์šฉ ๋ชฉ๋ก์€ ๊ณ„์ •์— ์†ํ•˜๋ฏ€๋กœ ํ—ˆ์šฉ๋œ ์‚ฌ์šฉ์ž๋Š” ๋ชจ๋“  ๋ด‡๊ณผ ๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ„์ • ํ‚ค๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ด๋ฉฐ ๊ธฐ์กด ์ฑ„๋„์€ ์ด์ „ ๋ด‡ ID๋ฅผ ์œ ์ง€ํ•ด ๋กœ๊ทธ์ธยทํ•œ๋„ยทํ—ˆ์šฉ ๋ชฉ๋กยท๋Œ€๊ธฐ์—ด๊ณผ ๊ธฐ๋ณธ ๋ด‡์ด ๊ทธ๋Œ€๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค. ๋ด‡ ์‚ญ์ œ๋Š” ๊ณ„์ •์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์•ฑ ์—ฐ๊ฒฐ(src/tools/apps/service.ts): ์ „์—ญ ๋ชฉ๋ก ํ•˜๋‚˜(์•„๋ฐ”ํƒ€ ๋ฉ”๋‰ด โ€บ ์•ฑ ์—ฐ๊ฒฐ)์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๋ด‡์ด ์—ฐ๊ฒฐ๋œ ์•ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ๋ด‡๋ณ„ยท๋„๊ตฌ๋ณ„๋กœ ์ขํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋ด‡ ์„ค์ • โ€บ ์•ฑ). ์•ฑ์€ ์•ฑ ํŽ˜์ด์ง€์—์„œ ์นด๋“œ ํ•˜๋‚˜๋กœ ํ‘œ์‹œ๋˜๋ฉฐ ์—ฌ๋Ÿฌ ๊ณ„์ •์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋ด‡์—๊ฒŒ๋“  โ€˜์ฒซ ๋ฒˆ์งธ Feishu์™€ ๋‘ ๋ฒˆ์งธ Feishu ํ™•์ธํ•ด ์ค˜โ€™๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ณ„์ •์€ ๋„๊ตฌ์˜ account ์ธ์ˆ˜(๋ฒˆํ˜ธ ๋˜๋Š” ์ด๋ฆ„)๋กœ ๊ณ ๋ฆ…๋‹ˆ๋‹ค.
    • ๊ธฐ๋ณธ ์ œ๊ณต ์•ฑ(catalog.ts): Feishu, Tencent Docs, DingTalk, Amap, Yuque, Notion, GitHub, Linear, Atlassian, Canva. ์ธ์ฆ ๋ฐฉ์‹์€ ์ปค์Šคํ…€ ์ปค๋„ฅํ„ฐ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค: ๋กœ๊ทธ์ธ ์ธ์ฆ(OAuth, ๋™์  ๋“ฑ๋ก, oauth.ts), ์š”์ฒญ ํ—ค๋”, ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜, ์ „์šฉ URL. Yuque๋Š” ์•ฑ์— ํฌํ•จ๋œ ๋กœ์ปฌ ํ”„๋กœ๊ทธ๋žจ(vendor/yuque-mcp, scripts/vendor-yuque-mcp.mjs๋กœ ์ƒ์„ฑ)์ด๋ฉฐ ์‚ฌ์šฉ์ž๋Š” ํ† ํฐ๋งŒ ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค.
    • ์ปค์Šคํ…€ ์ปค๋„ฅํ„ฐ: ์›๊ฒฉ Streamable HTTP(์—ฐ๊ฒฐ๋˜์ง€ ์•Š์œผ๋ฉด ๊ตฌํ˜• SSE) ๋˜๋Š” ๋กœ์ปฌ ๋ช…๋ น, ์ตœ๋Œ€ 20๊ฐœ. ๋ถ™์—ฌ๋„ฃ๊ธฐ ์ธ์‹๊ณผ ์–‘์‹ โ‡„ JSON ๋ณ€ํ™˜์€ ui/lib/connector-config.js์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ๋ช…๋ น์€ ๋กœ๊ทธ์ธ ์…ธ์˜ PATH(shell-path.ts)๋กœ ์‹คํ–‰ํ•˜๋ฉฐ, ์ฒ˜์Œ์— ํŒจํ‚ค์ง€๋ฅผ ๋‚ด๋ ค๋ฐ›๋Š” ์‹คํ–‰๊ธฐ(npx, uvx)๋Š” ๋” ์˜ค๋ž˜ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
    • ์—ฐ๊ฒฐ์€ ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•ฉ๋‹ˆ๋‹ค(mcp-client.ts, ๊ณต์‹ @modelcontextprotocol/client): ์ž๊ฒฉ ์ฆ๋ช…์€ ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์—๋งŒ ์žˆ๊ณ  app-secrets.json(๊ถŒํ•œ 600, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ–, secrets.ts)์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. amb-connections ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๊ฐ ๋„๊ตฌ ํ˜ธ์ถœ์„ bridge๋ฅผ ํ†ตํ•ด ์•ฑ์— ๋„˜๊น๋‹ˆ๋‹ค. MCP ์—ฐ๊ฒฐ์˜ ๋„๊ตฌ๋Š” ํ•˜๋‚˜์”ฉ ๋“ฑ๋กํ•˜์ง€ ์•Š๊ณ , ๋ชจ๋ธ์—๋Š” ๊ณ ์ •๋œ ๋„๊ตฌ ์„ธ ๊ฐœ๋ฅผ ์ค๋‹ˆ๋‹ค: app_tools(๋„๊ตฌ ์ฐพ๊ธฐ), app_tool_schema(๋งค๊ฐœ๋ณ€์ˆ˜ ๋ณด๊ธฐ), app_call(์‹คํ–‰). ๊ทธ๋ฆฌ๊ณ  app_connect๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋Œ€ํ™”์— ์นด๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ณ , ์—ฐ๊ฒฐ๋˜๋ฉด ์ž‘์—…์„ ์ด์–ด๊ฐ‘๋‹ˆ๋‹ค).
    • ์Šน์ธ(service.ts์˜ gate, ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌป๋Š” ๋ถ€๋ถ„์€ agent/manager.ts): ์ฝ๊ธฐ๋Š” ๋ฐ”๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์“ฐ๊ธฐ๋Š” ๋ด‡์˜ ๊ถŒํ•œ ์ˆ˜์ค€์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค(์ฝ๊ธฐ ์ „์šฉ ๋ด‡์—๋Š” ์ฃผ์ง€ ์•Š๊ณ , ๊ธฐ๋ณธ ์ˆ˜์ค€์—์„œ๋Š” ๋จผ์ € ๋ฌป๋˜ โ€˜์•ž์œผ๋กœ ์ด ๋„๊ตฌ๋Š” ํ•ญ์ƒ ํ—ˆ์šฉโ€™์„ ๊ณ ๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ „์ฒด ๊ถŒํ•œ์—์„œ๋Š” ๋ฐ”๋กœ ์‹คํ–‰). ์‚ญ์ œ์™€ ์™ธ๋ถ€ ์ „์†ก์€ ๋งค๋ฒˆ ๋ฌป๊ณ , โ€˜๊ด€์ฐฐ๋งŒโ€™ ํ•˜๋Š” ๊ทœ์น™์€ ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋„๊ตฌ์˜ ์ข…๋ฅ˜๋Š” classify.ts์—์„œ ์ •ํ•ฉ๋‹ˆ๋‹ค: ๊ธฐ๋ณธ ์ œ๊ณต ์•ฑ์€ ๋‚ด์žฅ ๋ชฉ๋ก๊ณผ ๊ณต์‹ ์ฃผ์„์„ ์“ฐ๊ณ , ์ปค์Šคํ…€ ์ปค๋„ฅํ„ฐ์˜ ์ฃผ์„์€ ์ดˆ๊นƒ๊ฐ’์ผ ๋ฟ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ธฐ์กด NotionยทFeishu ๊ณ„์ •(src/tools/accounts/): ์—…๊ทธ๋ ˆ์ด๋“œ ์ „์— ์—ฐ๊ฒฐํ•œ ๊ณ„์ •์€ ๋‹ค์‹œ ์ธ์ฆํ•˜์ง€ ์•Š์•„๋„ ๊ทธ๋Œ€๋กœ ์“ธ ์ˆ˜ ์žˆ๊ณ , ํ† ํฐ์€ ์ฒซ ์‹คํ–‰ ๋•Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ app-secrets.json์œผ๋กœ ์˜ฎ๊ฒจ์ง‘๋‹ˆ๋‹ค. Notion(notion.ts)์€ ํ•œ ๋ฒˆ์˜ ์ ‘๊ทผ ํ—ˆ์šฉ ๋˜๋Š” ํ† ํฐ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค: ํ† ํฐ์€ REST API, ์ ‘๊ทผ ํ—ˆ์šฉ์€ OAuth + PKCE + ๋™์  ๋“ฑ๋ก์œผ๋กœ ๋กœ์ปฌ /oauth/notion/callback์— ๋Œ์•„์˜จ ๋’ค ๊ณต์‹ ์›๊ฒฉ MCP(mcp.notion.com)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ์—๋Š” ์—ฌ์ „ํžˆ notion_search, notion_read_page, notion_query_database, notion_create_page, notion_update_page๊ฐ€ ๋ณด์ด๋ฉฐ ์‚ญ์ œ๋Š” ์—†์Šต๋‹ˆ๋‹ค. Feishu(feishu.ts)์˜ ๊ธฐ์กด ๊ณ„์ •์€ ์‚ฌ์šฉ์ž ์‹ ์›์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ๊ธฐ๋งŒ ํ•ฉ๋‹ˆ๋‹ค(feishu_list_chats, feishu_read_chat, feishu_search_messages). ์ƒˆ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” Feishu ๊ณ„์ •์€ ๊ณต์‹ ์›๊ฒฉ MCP(ํด๋ผ์šฐ๋“œ ๋ฌธ์„œ ์ฝ๊ธฐ/์“ฐ๊ธฐ + ๋ฉ”์‹œ์ง€ ์ฝ๊ธฐ)๋ฅผ ์“ฐ๊ณ , ๊ธฐ์กด ๊ณ„์ •๋„ ๋‹ค์‹œ ์ธ์ฆํ•˜๋ฉด ์ด์ชฝ์œผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ์ด๋ฏธ์ง€ยท๋™์˜์ƒ ๋ชจ๋ธ์€ ์ฒซ ์„ค์ • ๋•Œ ํ…์ŠคํŠธ ๋ชจ๋ธ๊ณผ ํ•จ๊ป˜ ์„ ํƒํ•˜๊ณ  ์„ค์ • โ†’ ๋ชจ๋ธ์—์„œ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ž๋™์€ ์ถ”์ฒœ ์ˆœ์„œ ์ค‘ ์ฐธ๊ณ  ์ž๋ฃŒ๊ฐ€ ํ•„์š” ์—†๋Š” ์ฒซ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋ธ ์„ ํƒ๊ธฐ๋Š” ์ปจํ…์ŠคํŠธ ๊ธธ์ด, ์ด๋ฏธ์ง€ ์ดํ•ดยท๋„๊ตฌยท์ถ”๋ก  ๊ธฐ๋Šฅ, ๊ณต๊ฐœ ๊ฐ€๊ฒฉํ‘œ์˜ 100๋งŒ ์ž…๋ ฅ/์ถœ๋ ฅ ํ† ํฐ๋‹น ์ตœ์ € ์ฐธ๊ณ  ๊ฐ€๊ฒฉ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ข… ๊ธˆ์•ก์€ ์ฒญ๊ตฌ์„œ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค.
  • ๊ฐ€์„ฑ๋น„(๋กœ๊ทธ์ธ ํ•„์š”): ์ปดํ“จํ„ฐ ํ‚ค์™€ ๋ด‡ ์˜ˆ์‚ฐ ํ‚ค์— Modelflare Smart Key์˜ routing_strategy๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค. ์ €๋ ดํ•œ ๊ฐ€๊ฒฉ low_cost๋Š” ์ตœ์ € ๋ฐฐ์ˆ˜๋ถ€ํ„ฐ, ๊ท ํ˜• balanced๋Š” ์ค‘๊ฐ„ ๊ฐ€๊ฒฉ๋ถ€ํ„ฐ(๊ธฐ๋ณธ๊ฐ’), ํ’ˆ์งˆ stable์€ ์ตœ๊ณ  ๋ฐฐ์ˆ˜๋ถ€ํ„ฐ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ • โ†’ ๋ชจ๋ธ โ†’ ๊ฐ€์„ฑ๋น„ ๋˜๋Š” ๋ชจ๋ธ ์„ ํƒ๊ธฐ ์ฒซ ์Šฌ๋ผ์ด๋”์—์„œ ๋ฐ”๊พธ๋ฉด ๊ธฐ์กด ํ‚ค๋„ PATCH /api/connected-app/api-keys/<id>๋กœ ๊ฐฑ์‹ ํ•˜๊ณ  ๋กœ์ปฌ DB account.routing์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ ์ด๋ ฅ์ด ์—†๋Š” ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž๋Š” ์ฒซ ํ‚ค ๊ฒ€์‚ฌ ๋•Œ ๊ธฐ์กด ํ‚ค์— ๊ท ํ˜•์„ ํ•œ ๋ฒˆ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค(๋กœ๊ทธ: applied the default key routing strategy). Modelflare๊ฐ€ routing_strategy๋ฅผ ์‘๋‹ต์— ๋Œ๋ ค์ค˜์•ผ ์ง€์›์œผ๋กœ ํŒ์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ๋ฅผ ๊ฑฐ๋ถ€ํ•˜๋ฉด(400/422) ์ œ์™ธํ•˜๊ณ  ๋‹ค์‹œ ๋ฐœ๊ธ‰ํ•˜๋ฏ€๋กœ ๋ฐœ๊ธ‰ยท๊ฒ€์‚ฌยท์˜ˆ์‚ฐ ๊ธฐ๋Šฅ์ด ์‹คํŒจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌด์‹œํ•˜์—ฌ ์‘๋‹ต์— ์—†์„ ๋•Œ๋„ ๋ฏธ์ง€์›์œผ๋กœ ๋ณด๊ณ  ์„ค์ •์„ ์ˆจ๊ธด ๋’ค ํ•˜๋ฃจ ํ›„ ์žฌ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
  • ์ง€๋Šฅ(๋‘ ๋ฒˆ์งธ ์Šฌ๋ผ์ด๋”): ๊ณ„์ •์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  Artificial Analysis ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๋ชจ๋ธ์˜ ์ง€๋Šฅ ์ง€์ˆ˜(๋†’์„์ˆ˜๋ก ์ข‹์Œ)์™€ ์ž‘์—…๋‹น ๋น„์šฉ(๋‚ฎ์„์ˆ˜๋ก ์ข‹์Œ)์œผ๋กœ ํŒŒ๋ ˆํ†  ๊ฒฝ๊ณ„๋ฅผ ๊ตฌํ•ด ์ตœ๋Œ€ 5๊ฐœ ์ง€์ ์„ ์ œ์‹œํ•˜๋ฉฐ ์ตœ์ €๊ฐ€ยท์ตœ๊ณ  ์„ฑ๋Šฅ ๋ชจ๋ธ์„ ํ•ญ์ƒ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์ถ”๋ก  ๊ฐ•๋„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋ฏ€๋กœ Responses API ์ถ”๋ก  ๋ชจ๋ธ์€ ๊ธฐ๋ณธ medium์— ๋งž๋Š” AA ํ–‰, ๊ทธ ์™ธ๋Š” ๊ธฐ๋ณธ ํ–‰์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(src/account/model-quality.ts). ๋น„์šฉ์€ AA ๊ณต์‹ ๊ฐ€๊ฒฉ ๊ธฐ์ค€ ์ž‘์—…๋‹น ๋น„์šฉ ร— ํ˜„์žฌ ๊ฐ€์„ฑ๋น„ ์„ค์ •์˜ ๊ฐ€๊ฒฉ ๊ณ„์ˆ˜(์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐœ ๊ทธ๋ฃน ๋ฐฐ์ˆ˜ ร— ํŒ๋งค ๋ฐฐ์ˆ˜)์ž…๋‹ˆ๋‹ค. ์ €๋ ดํ•œ ๊ฐ€๊ฒฉ์€ ์ตœ์ €, ํ’ˆ์งˆ์€ ์ตœ๊ณ , ๊ท ํ˜•์€ ์ค‘๊ฐ„์„ ์“ฐ๊ณ  ๊ธฐ์—… ์ „์šฉ ๊ทธ๋ฃน์€ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์•„์›ƒยท๋ฏธ์ง€์›์€ ๊ท ํ˜•์œผ๋กœ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด๋”๋กœ ๋ชจ๋ธ์„ ์ „ํ™˜ํ•˜๋ฉฐ ์ด๋ฆ„์„ ๋ˆ„๋ฅด๋ฉด ์ „์ฒด ๋ชฉ๋ก์—์„œ ์ง์ ‘ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ง€์ ์— ์—†๋Š” ๋ชจ๋ธ์€ ์‚ฌ์šฉ์ž ์ง€์ •์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  ์ง€์ ์ด ๋‘ ๊ฐœ ๋ฏธ๋งŒ์ด๋ฉด ๋ชฉ๋ก๋งŒ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค. ๊ณ„์‚ฐ์€ ui/lib/frontier.js์— ์žˆ์Šต๋‹ˆ๋‹ค.
  • AA ๋ฐ์ดํ„ฐ๋Š” assets/model-quality.json(updatedAt, source, ํ•„์š”ํ•œ ํ•„๋“œ๋งŒ, Modelflare ID ๋งคํ•‘ ์™„๋ฃŒ)์— ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. node scripts/update-model-quality.mjs๋Š” ๊ณต๊ฐœ ์ˆœ์œ„ https://artificialanalysis.ai/leaderboards/models ์™€ Modelflare ๊ณต๊ฐœ ๊ฐ€๊ฒฉํ‘œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. AA_API_KEY๊ฐ€ ์žˆ์œผ๋ฉด ๊ณต์‹ API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(ํ‚ค๋กœ ๋ฐ˜ํ™˜ ํ•„๋“œ๋ฅผ ์•„์ง ๊ฒ€์ฆํ•˜์ง€ ์•Š์Œ). --html <file>, --pricing <file>์€ ์ €์žฅํ•œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ณ  --dry-run์€ ์ถœ๋ ฅ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์—ด ๋ˆ„๋ฝ, ํ–‰ ํ˜•์‹ ๋ณ€๊ฒฝ, ์ˆซ์ž ๋ณ€ํ™˜ ์‹คํŒจ, ํ–‰ยท๋งคํ•‘ ๋ชจ๋ธ ์ˆ˜ ๋ถ€์กฑ ์‹œ ๋ฌธ์ œ๋ฅผ ์•Œ๋ฆฌ๊ณ  ์ข…๋ฃŒ ์ฝ”๋“œ 1๋กœ ๋๋‚ด๋ฉฐ ๊ธฐ์กด ์Šค๋ƒ…์ƒท์€ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ทœ์น™์œผ๋กœ ๋งคํ•‘๋˜์ง€ ์•Š๋Š” ์ด๋ฆ„์€ ์Šคํฌ๋ฆฝํŠธ์˜ OVERRIDES์— ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์ถœ์ฒ˜ Artificial Analysis๋Š” ์„ ํƒ๊ธฐ ํ•˜๋‹จ์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • ์ถœ์ฒ˜ ํ‘œ์‹œ: Modelflare ์š”์ฒญ์—๋Š” X-Modelflare-Skill: anymodel-bot/<version>, ๋งํฌ์—๋Š” utm_source=anymodelbot&utm_campaign=amb_<placement>๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค. ์•ฑ์€ amb_signup, amb_topup, amb_console ๋“ฑ, READMEยท์ €์žฅ์†Œ ๋ฌธ์„œ๋Š” amb_readme, ์›น์‚ฌ์ดํŠธ๋Š” amb_homepage๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. test/utm.unit.test.ts๊ฐ€ ํ˜•์‹์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • API ๋„๋ฉ”์ธ: ์„ค์ • โ†’ ๋ชจ๋ธ โ†’ API ๋„๋ฉ”์ธ์—์„œ https://modelflare.dev/v1, https://origin.modelflare.dev/v1, https://cf.modelflare.dev/v1์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋™ ๊ฒ€์‚ฌ๋Š” ์•ฑ ์‹คํ–‰ ๊ธฐ๊ธฐ์—์„œ ์„ธ ๋„๋ฉ”์ธ์˜ /v1/models์— ์ธ์ฆ ์—†์ด ์„ธ ๋ฒˆ ์š”์ฒญํ•ด ์ค‘์•™ ์‘๋‹ต ์‹œ๊ฐ„๊ณผ ์„ฑ๊ณต ํšŸ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. HTTP 401์€ API ์‘๋‹ต์œผ๋กœ ๊ณ„์‚ฐํ•˜๋ฉฐ ํ‚ค ์œ ํšจ์„ฑ์ด๋‚˜ ์ƒ์„ฑ ์†๋„์˜ ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ž๋™ ์ „ํ™˜์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์„ค์ • auto/global์€ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ, cn์€ origin, cf๋Š” cf์— ๋Œ€์‘ํ•˜๋ฉฐ ์ง€์—ญยทํ’ˆ์งˆ ์˜๋ฏธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์„ค์ • โ†’ ๋ชจ๋ธ: ๊ณ„์ •, ์ž”์•กยท์ถฉ์ „, ์ž”์•ก ์•Œ๋ฆผ, ์‚ฌ์šฉ๋Ÿ‰, ์•Œ๋ฆผ, ์ดˆ๋Œ€, ๊ฐ€์„ฑ๋น„, ์ถ”๋ก  ๊ฐ•๋„, ๊ธฐ๋ณธ ๋ชจ๋ธ, ๋ชจ๋ธ ๋ชฉ๋ก ์ƒˆ๋กœ๊ณ ์นจ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ž…๋ ฅ์ฐฝ ์˜ค๋ฅธ์ชฝ์˜ ๋ชจ๋ธ ๋ฒ„ํŠผ์€ ํ˜„์žฌ ์„ธ์…˜์˜ ๋ชจ๋ธ์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ๋ด‡ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. /model, /reset, /new, /status, /stop, /help๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ž‘์—… ๋‚ด์—ญ: ๋ชจ๋ธ ์š”์ฒญ์˜ ์‹œ๊ฐ„ยทํ† ํฐ, ๋„๊ตฌ ์ธ์ˆ˜ยท์ถœ๋ ฅ, ์žฌ์‹œ๋„, ํ•˜์œ„ ์—์ด์ „ํŠธ ๋“ฑ ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ๋‹ต๋ณ€ ์œ„ ์‹œ๊ฐ„ ํ‘œ์‹œ์ค„์— ์ ‘์–ด ๋‘ก๋‹ˆ๋‹ค. ํด๋ฆญํ•˜๋ฉด ํŽผ์นฉ๋‹ˆ๋‹ค. WeChat/Feishu ์„ธ์…˜์€ ์ •๋ณด ํŒจ๋„ โ†’ ์ตœ๊ทผ ์„ธ์…˜์—์„œ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณด๊ณ  ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฉˆ์ถ˜ ๋ฉ”์‹œ์ง€: ๋ชจ๋“  ์ฑ„๋„์˜ /stop ๋˜๋Š” ์ •๋ณด ํŒจ๋„์˜ ์ค‘์ง€๋กœ ํ˜„์žฌ ๋Œ€ํ™” ์ฐจ๋ก€๋ฅผ ์ฆ‰์‹œ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. 10๋ถ„ ๋™์•ˆ ๋ชจ๋ธ ์‘๋‹ตยท๋„๊ตฌ ํ™œ๋™ ์—†์ด ์žฌ์‹œ๋„๋งŒ ํ•˜๋Š” ๋“ฑ ์ง„ํ–‰์ด ์—†์œผ๋ฉด ์ž๋™ ์ค‘์ง€ํ•˜๋ฉฐ ์Šน์ธยท๋‹ต๋ณ€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์€ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์ฐจ๋ก€์˜ ์ƒํ•œ์€ 30๋ถ„์ž…๋‹ˆ๋‹ค(AMB_AGENT_IDLE_TIMEOUT_MS, AMB_AGENT_TURN_TIMEOUT_MS). ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€ amb-control ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ•ด๋‹น ์ฐจ๋ก€๋งŒ ์ทจ์†Œํ•˜๊ณ  ๋‹ค๋ฅธ ๋Œ€ํ™”๋Š” ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค. 10์ดˆ(AMB_STOP_GRACE_MS) ์•ˆ์— ๋ฉˆ์ถ”์ง€ ์•Š์„ ๋•Œ๋งŒ ์—์ด์ „ํŠธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. /status๋กœ ํ˜„์žฌ ๋‹จ๊ณ„์™€ ๋งˆ์ง€๋ง‰ ์ง„ํ–‰ ์ดํ›„ ์‹œ๊ฐ„์„ ๋ด…๋‹ˆ๋‹ค. ์›น์—์„œ ๋‹ค๋ฅธ ๋ด‡์œผ๋กœ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ์ฐฝ์„ ์ƒˆ๋กœ๊ณ ์นจํ•ด๋„ ์ฒ˜๋ฆฌ๋Š” ๊ณ„์†๋˜๋ฉฐ ๋Œ์•„์˜ค๋ฉด ๋‚ด ๋ฉ”์‹œ์ง€, ์ž‘์„ฑ ์ค‘์ธ ์‘๋‹ต, ํ™œ๋™์ด ๋ณต์›๋ฉ๋‹ˆ๋‹ค. ์ค‘์ง€ ๋ฒ„ํŠผ์€ ๋Œ€๊ธฐ์—ดยท์‹œ์ž‘ ์ค‘ยท์Šน์ธ ๋Œ€๊ธฐยท์ผ๋ฐ˜ ๋Œ€ํ™”์—์„œ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ์ถ”๊ฐ€ ์š”์ฒญ: ์ž‘์—… ์ค‘ ๋ณด๋‚ธ ํ…์ŠคํŠธยท์ด๋ฏธ์ง€ยทํŒŒ์ผ์€ ํ˜„์žฌ ์ฐจ๋ก€์— ์ถ”๊ฐ€๋˜๋ฉฐ ๋ชจ๋ธ์ด ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ์ฝ๊ณ  ํ•œ ๋ฒˆ์— ๋‹ตํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์งง์€ ์ˆ˜์‹  ์•ˆ๋‚ด๋ฅผ ๋ณด๋‚ผ ํŽธ์ง€ํ•จ์œผ๋กœ ์ „์†กํ•˜๋ฉฐ 10๋ถ„ ์•ˆ์— ์ „์†กํ•˜์ง€ ๋ชปํ•˜๋ฉด ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ํ—ˆ์šฉ ๋ชฉ๋ก ๊ฒ€์‚ฌ๋Š” ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋˜์–ด ๋ฏธํ—ˆ๊ฐ€์ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ•ฉ๋ฅ˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ๊ฐ€ ์ด์ „ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ธฐ ์ „์ด๊ฑฐ๋‚˜ ๋งˆ๋ฌด๋ฆฌ ์ค‘์ด๋ฉด ๊ธฐ์กด์ฒ˜๋Ÿผ ๋Œ€๊ธฐ์—ด์— ๋„ฃ์œผ๋ฉฐ /model, /reset ๊ฐ™์€ ๋ช…๋ น๋„ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์›น์—์„œ๋„ ์‘๋‹ต ์ค‘ ๊ณ„์† ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธด ๋ช…๋ น์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. 30์ดˆ(Windows PowerShell์€ 60์ดˆ) ์ด์ƒ ์‹คํ–‰ ์ค‘์ด๋ฉด ํ˜„์žฌ ์ฐจ๋ก€๋ฅผ ๋ง‰์ง€ ์•Š๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ  ์‹คํ–‰ ์ค‘์ž„์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ๋๋‚˜๋ฉด ์—์ด์ „ํŠธ๋ฅผ ๊นจ์›Œ ๊ฐ™์€ ๋Œ€ํ™”์— ์ƒˆ ๋ฉ”์‹œ์ง€๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์›น์€ ์‹ค์‹œ๊ฐ„ ํ‘œ์‹œ, WeChatยทFeishu๋Š” ์ผ๋ฐ˜ ๋‹ต๋ณ€์ฒ˜๋Ÿผ ๋ณด๋‚ผ ํŽธ์ง€ํ•จ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ID๋Š” ์—์ด์ „ํŠธ ์„ธ์…˜ยท์ฐจ๋ก€์—์„œ ๋„์ถœํ•ด ํ•œ ๋ฒˆ๋งŒ ์ „์†กํ•˜๋ฉฐ WeChat ์ œํ•œ์€ ์ „์†ก ์‹œ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. Feishu๋Š” DB์— ์ €์žฅํ•œ ์ตœ์‹  ์ˆ˜์‹  ๋ฉ”์‹œ์ง€ ID์— ๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—… ๋‚ด์—ญ์— ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋‹จ๊ณ„๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  /status, ์ค‘์ง€, ๊ฐ์‹œ ํƒ€์ด๋จธ๋„ ์ผ๋ฐ˜ ์ฐจ๋ก€์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ€ํ™”๋ณ„ ๋ชจ๋ธ: ํ•˜๋‚˜์˜ ์—์ด์ „ํŠธ ํ”„๋กœ์„ธ์Šค ์•ˆ์—์„œ๋„ ๋Œ€ํ™”๋งˆ๋‹ค ๋ชจ๋ธ๊ณผ API๋ฅผ ๋‹ฌ๋ฆฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(API๋ณ„ provider, ๋ชจ๋ธ๋ณ„ ์ปจํ…์ŠคํŠธยท์ตœ๋Œ€ ์ถœ๋ ฅ). ๋ชจ๋ธ์„ ๋ฐ”๊ฟ”๋„ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ดˆ๊ธฐ ํŒจ์น˜์— ์—†๋˜ ๋ชจ๋ธ์€ ์‹คํ–‰ ์ค‘ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋กœ์„ธ์Šค ๊ต์ฒด: DSH SDK๋Š” ์„ธ์…˜ ๋‹ซ๊ธฐ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์•„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…ยท๊ทœ์น™ ์‹คํ–‰์˜ ์„ธ์…˜์ด ์žฌ์‹œ์ž‘๊นŒ์ง€ ๋‚จ์Šต๋‹ˆ๋‹ค(์™„๋ฃŒ ํ›„ ์œ ํœด ์„ธ์…˜๋‹น ์‹ค์ธก ์•ฝ 0.25~0.45MB). 100๊ฐœ๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์™„์ „ํžˆ ์œ ํœด์ผ ๋•Œ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ํ™”, ์‹คํ–‰ยท์ •๋ฆฌ ์ค‘์ธ ์ž‘์—…์ด๋‚˜ ๊ทœ์น™, ์Šน์ธ, ์••์ถ•, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ช…๋ น์ด ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์„ธ์…˜์€ ์ด์–ด์ง€๊ณ  ์ค‘๋‹จ์ด๋‚˜ ์‚ฌ์šฉ์ž ์•Œ๋ฆผ์€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ ํ•ด๊ฒฐ ์ƒํƒœ์˜ taskSessions, recycles๋กœ ํ™•์ธํ•˜๋ฉฐ AMB_DSH_RECYCLE_SESSIONS๋กœ ๊ธฐ์ค€์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • ์žฌ์‹œ์ž‘ ์•ˆ๋‚ด: ์•ฑ ์ข…๋ฃŒยท์ถฉ๋Œ ๋‹น์‹œ ์ฒ˜๋ฆฌ ์ค‘์ด๋˜ ๋ฉ”์‹œ์ง€๋Š” ๋Œ€ํ™”๋ณ„ DB ํ‘œ์‹œ๋กœ ์ถ”์ ํ•˜๊ณ  ์™„๋ฃŒ ์‹œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์‹œ์ž‘์— ํ•ด๋‹น ๋Œ€ํ™”๋กœ โ€˜์•ฑ์ด ๋‹ค์‹œ ์‹œ์ž‘๋˜์–ด ๋งˆ์ง€๋ง‰ ๋ฉ”์‹œ์ง€์˜ ์ฒ˜๋ฆฌ๋ฅผ ์™„๋ฃŒํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋ณด๋‚ด ์ฃผ์„ธ์š”โ€™๋ผ๊ณ  ํ•œ ๋ฒˆ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ์ž๋™ ์žฌ์ „์†กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›น์€ ๊ธฐ๋ก์— ์ถ”๊ฐ€ํ•˜๊ณ  WeChat์€ ์ €์žฅํ•œ context_token๊ณผ ๊ธฐ์กด ๋ฐœ์‹  ํ•œ๋„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 24์‹œ๊ฐ„ยทํšŸ์ˆ˜ ์ œํ•œ์— ๊ฑธ๋ฆฌ๋ฉด ๋‹ค์Œ ์ˆ˜์‹  ๋ฉ”์‹œ์ง€์˜ ๋‹ต๋ณ€ ์•ž์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค. Feishu๋Š” ์›๋ž˜ ๋Œ€ํ™”๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ์—์ด์ „ํŠธ API: Modelflare ๊ณต๊ฐœ ๋ชฉ๋ก์˜ ์ง€์› ์ •๋ณด์— ๋”ฐ๋ผ Responses API ๋ชจ๋ธ(GPT-5.4 ์ด์ƒ, Grok 4.5 ์ด์ƒ, DeepSeek V4, GLM-5, Kimi K3 ๋“ฑ)์€ /v1/responses๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(์ถ”๋ก  ๊ธฐ๋ณธ medium, ์•”ํ˜ธํ™”๋œ ์ถ”๋ก ์„ ๊ธฐ๋ก๊ณผ ํ•จ๊ป˜ ์žฌ์ „์†ก). Responses ์—†์ด Anthropic Messages๋ฅผ ์ง€์›ํ•˜๋Š” Claude๋Š” /v1/messages, ๋‚˜๋จธ์ง€ยท๋ชฉ๋ก ์กฐํšŒ ์‹คํŒจยท์™ธ๋ถ€ ์—”๋“œํฌ์ธํŠธ๋Š” Chat Completions์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ชจ๋ธ์„ ์ฒ˜์Œ ์“ธ ๋•Œ ์„ ํƒํ•˜๋ฉฐ ๋ฌธ์ œ ํ•ด๊ฒฐ ์ƒํƒœ์— ๋งˆ์ง€๋ง‰ ์ฐจ๋ก€์˜ api์™€ ๋ชจ๋ธ ๋ชฉ๋ก์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. AMB_AGENT_API=chat์œผ๋กœ ์ „์ฒด๋ฅผ Chat Completions๋กœ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๊ณ  ์ผ๋ฐ˜ ๋Œ€ํ™”๋Š” ๊ณ„์† ์ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ƒ์œ„ ์„œ๋น„์Šค๊ฐ€ Responses/Messages๋ฅผ ๊ฑฐ๋ถ€ํ•˜๋ฉด(HTTP 400/404/405/415/422 ๋˜๋Š” unsupported parameter/endpoint) ํ•ด๋‹น ๋ชจ๋ธ์€ 24์‹œ๊ฐ„ Chat Completions๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ ์ œํ•œยท์ž”์•กยท๊ถŒํ•œยท์„œ๋น„์Šค ์žฅ์• ยท์ปจํ…์ŠคํŠธ ์ดˆ๊ณผ๋Š” ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ํด๋” dsh/api-fallback.json์— ๊ธฐ๋กํ•˜๊ณ  ๋กœ๊ทธ์— ๊ฒฝ๊ณ ํ•˜๋ฉฐ ์ƒํƒœ์— openai-completions (fallback: reason)์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋„๊ตฌ๋ฅผ ์•„์ง ํ˜ธ์ถœํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ํ”„๋กœ์„ธ์Šค ์žฌ์‹œ์ž‘ ์—†์ด ํ˜„์žฌ ์ฐจ๋ก€๋ฅผ Chat์œผ๋กœ ์ž๋™ ์žฌ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ํ˜ธ์ถœํ–ˆ๋‹ค๋ฉด ์˜ค๋ฅ˜๋ฅผ ์•Œ๋ฆฌ๊ณ  ๋‹ค์Œ ์ฐจ๋ก€๋ถ€ํ„ฐ Chat์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚ด์žฅ ๊ฒŒ์ดํŠธ์›จ์ด: magpie๋Š” ๋ฐ์ดํ„ฐ ํด๋” ์•ˆ์˜ ๋…๋ฆฝ HOMEยท์„ค์ •์œผ๋กœ --gateway ๋ชจ๋“œ์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ปดํ“จํ„ฐ์˜ ๊ธฐ์กด Claude/Codex ๊ตฌ๋… ์ธ์ฆ ์ •๋ณด๋ฅผ ์ฝ์ง€ ์•Š๊ณ , ์—์ด์ „ํŠธ ์„ค์ •์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ž๋™ ์—…๋ฐ์ดํŠธยท๊ณ„์ • ๊ฒ€์ƒ‰๋„ ๋•๋‹ˆ๋‹ค. ์•ฑ ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ํ˜ธ์ถœํ•˜๋ฉฐ ์ฝ˜์†”์€ magpie ํŽ˜์ด์ง€๋‚˜ /v1์„ ํ”„๋ก์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • API ํ‚ค๋Š” ๊ฒฉ๋ฆฌ๋œ ๊ฒŒ์ดํŠธ์›จ์ด ์„ค์ •์—๋งŒ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์ค„์ด๋‚˜ ๋กœ๊ทธ์— ๊ธฐ๋กํ•˜์ง€ ์•Š๊ณ  ํ”„๋ŸฐํŠธ์—”๋“œ์—๋Š” ๋๋ถ€๋ถ„๋งŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœยทํ…Œ์ŠคํŠธ: AMB_MAGPIE_BASE_URL์„ OpenAI ํ˜ธํ™˜ ์—”๋“œํฌ์ธํŠธ๋กœ ์ง€์ •ํ•˜๋ฉด ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ์‹œ์ž‘ํ•˜์ง€ ์•Š๊ณ  ํ™”๋ฉด์€ ์—ฐ๊ฒฐ ์ƒํƒœ๊ฐ€ ๋˜๋ฉฐ ๊ณ„์ • ๊ธฐ๋Šฅ์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. AMB_MODELFLARE_BASE_URL์€ Modelflare ๊ธฐ๋ณธ URL, AMB_MODELFLARE_ISSUER๋Š” ๋กœ๊ทธ์ธยท๊ณ„์ • API๋ฅผ ๋กœ์ปฌ ๋ชจ์˜ ์„œ๋ฒ„๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ณต์‹ API ํ‚ค

  • ์‹œ์ž‘ ํ™”๋ฉด์˜ โ€˜๋‚ด API ํ‚ค ์‚ฌ์šฉโ€™๊ณผ ์„ค์ • โ†’ ๋ชจ๋ธ์—์„œ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์› ์ œ๊ณต์—…์ฒด์™€ ์ฃผ์†Œ๋Š” src/providers/official.ts์— ๊ณ ์ •๋˜์–ด ์žˆ๊ณ , API(GET /amb/api/official, PUT/DELETE /amb/api/official/<id>)๋Š” ๋ชฉ๋ก์˜ ID๋งŒ ๋ฐ›์œผ๋ฉฐ ์ฃผ์†Œ๋Š” ์ง€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ฐ๊ฐ ๋‚ด์žฅ ๊ฒŒ์ดํŠธ์›จ์ด์˜ provider์ด๋ฉฐ ID๋Š” official-<์ œ๊ณต์—…์ฒด>, ๋ชจ๋ธ ID๋Š” official-<์ œ๊ณต์—…์ฒด>/<๋ชจ๋ธ>์ž…๋‹ˆ๋‹ค. Modelflare์˜ ๊ฐ™์€ ์ด๋ฆ„ ๋ชจ๋ธ๊ณผ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค. ํ‚ค๋Š” ๋ช…๋ น์ค„ ์ธ์ˆ˜๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๊ฒŒ์ดํŠธ์›จ์ด ๋กœ์ปฌ API์˜ ์š”์ฒญ ๋ณธ๋ฌธ์œผ๋กœ ๊ฒฉ๋ฆฌ๋œ ์„ค์ •์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.
  • ํ™•์ธ์—๋Š” ๊ฒŒ์ดํŠธ์›จ์ด์˜ ๋ชจ๋ธ ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•˜๊ณ (ํ”„๋ก์‹œ์™€ ์ œ๊ณต์—…์ฒด๋ณ„ ์ธ์ฆ ๋ฐฉ์‹์€ ๊ฒŒ์ดํŠธ์›จ์ด์— ์žˆ์Œ), ํ†ต๊ณผํ•ด์•ผ๋งŒ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ์€ 1์‹œ๊ฐ„๋งˆ๋‹ค ์ œ๊ณต์—…์ฒด ๋ชฉ๋ก๊ณผ ๋Œ€์กฐํ•˜๋ฉฐ ๋Œ€ํ™”ํ•  ์ˆ˜ ์—†๋Š” ๋ชจ๋ธ(์Œ์„ฑ, ์ด๋ฏธ์ง€, ์ž„๋ฒ ๋”ฉ ๋“ฑ)์€ ์„ ํƒ๊ธฐ์— ๋„ฃ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์—์ด์ „ํŠธ API๋Š” ์ œ๊ณต์—…์ฒด๋ณ„๋กœ ์ •ํ•ด์ง‘๋‹ˆ๋‹ค. OpenAI๋Š” Responses, Anthropic์€ Messages, ๋‚˜๋จธ์ง€๋Š” Chat Completions์ž…๋‹ˆ๋‹ค. ์ปจํ…์ŠคํŠธ ๊ธธ์ด, ๊ฐ€๊ฒฉ, ์ถ”๋ก  ์ง€์›์€ ๊ฒŒ์ดํŠธ์›จ์ด์˜ ๋ชจ๋ธ ๋ชฉ๋ก(/v1/models)์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ณต์‹ ํ‚ค๋งŒ ์žˆ์œผ๋ฉด Modelflare์˜ ๋ชฉ๋ก๊ณผ ๊ณ„์ •์„ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ณต์‹ API ๋ชจ๋ธ์—๋Š” X-Modelflare-Skill์„ ๋ถ™์ด์ง€ ์•Š๊ณ , ์„œ๋ฒ„ ์ธก ์••์ถ•์„ ํ•˜์ง€ ์•Š์œผ๋ฉฐ(์••์ถ• ์—”๋“œํฌ์ธํŠธ๋Š” Modelflare ๋ชฉ๋ก์—์„œ ์˜ด), ๋ด‡ ์˜ˆ์‚ฐ์˜ ์ œํ•œ๋„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์˜ˆ์‚ฐ์€ Modelflare ํ‚ค์˜ ํ•œ๋„์ž…๋‹ˆ๋‹ค). ์ด๋ฏธ์ง€ยท๋™์˜์ƒ ์ƒ์„ฑ์€ Modelflare์— ์—ฐ๊ฒฐ๋œ ๋™์•ˆ์—๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ: AMB_OFFICIAL_BASE_URL๋กœ ๋ชจ๋“  ์ œ๊ณต์—…์ฒด๋ฅผ ๋กœ์ปฌ ๋ชจ์˜ ์„œ๋ฒ„๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค(test/official-providers.integration.test.ts).

ํ™”๋ฉด

  • ๊ทธ๋ฃน ๋Œ€ํ™”(src/core/groups.ts, ui/screens/group.js): ๋ด‡ ๋‘ ๊ฐœ ์ด์ƒ์ด๋ฉด ๏ผ‹ ๋ฉ”๋‰ด์—์„œ ๊ทธ๋ฃน์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์›๋งˆ๋‹ค <bot>:web:group:<group> ๋Œ€ํ™”๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ ๋ชจ๋ธยท๊ถŒํ•œยท๊ธฐ์–ตยท์Šน์ธยท๋น„์šฉ์€ ๊ฐœ์ธ ๋Œ€ํ™”์™€ ๊ฐ™์€ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€๋Š” group:<group>์— ์ €์žฅํ•˜๊ณ  ํƒ€์ž„๋ผ์ธ์€ ID๋กœ ํ•ฉ์นฉ๋‹ˆ๋‹ค. @๋กœ ์ง€๋ชฉํ•œ ๋ด‡์ด ๋‹ตํ•˜๋ฉฐ @everyone์€ ์ „์ฒด์ž…๋‹ˆ๋‹ค. ์ง€๋ชฉ์ด ์—†์œผ๋ฉด ๋งˆ์ง€๋ง‰ ์‘๋‹ต ๋ด‡์ด ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค. ๋‹ต๋ณ€์—์„œ ๋‹ค๋ฅธ ๋ด‡์„ @ํ•˜๋ฉด ์ธ๊ณ„ํ•˜๋ฉฐ ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€๋‹น ์ตœ๋Œ€ 6ํšŒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฃน์—์„œ๋Š” ํ•œ ๋ฒˆ์— ํ•œ ๋ด‡๋งŒ ๋‹ตํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์ด๋“œ๋ฐ”: ์•„๋ฐ”ํƒ€ยท์ด๋ฆ„ยท์ตœ๊ทผ ๋ฉ”์‹œ์ง€๋ฅผ ํฌํ•จํ•œ ๋ด‡ ๋ชฉ๋ก, ๏ผ‹ ์ƒˆ๋กœ ๋งŒ๋“ค๊ธฐ, ์šฐํด๋ฆญ ์ด๋ฆ„ ๋ณ€๊ฒฝยท์‚ญ์ œ. ๋ชฉ๋ก์€ ๋งŒ๋“ค๊ธฐยท์ด๋ฆ„ ๋ณ€๊ฒฝยท์‚ญ์ œยท๋“œ๋ž˜๊ทธ ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•œ ์„น์…˜์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค(๊ธฐ๋ณธ์€ โ€œ๋‚ด ๋ด‡โ€๊ณผ โ€œ์ƒˆ๋กœ ๋‚˜์˜ดโ€, ์„œ๋ฒ„์— ์ €์žฅ๋˜์–ด ๋ชจ๋“  ์ฐฝ์ด ๊ณต์œ ). ๋ด‡, ๊ทธ๋ฃน ์ฑ„ํŒ…, ์นดํƒˆ๋กœ๊ทธ ๋ด‡์€ ๋“œ๋ž˜๊ทธํ•˜๊ฑฐ๋‚˜ โ€œ์„น์…˜์œผ๋กœ ์ด๋™โ€์œผ๋กœ ๋‹ค๋ฅธ ์„น์…˜์— ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๊ณ , ์ƒˆ๋กœ ๊ณต๊ฐœ๋œ ์นดํƒˆ๋กœ๊ทธ ๋ด‡์€ โ€œ์ƒˆ๋กœ ๋‚˜์˜ดโ€์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ์™ผ์ชฝ ์•„๋ž˜ ์•„๋ฐ”ํƒ€๋กœ ์ž”์•ก์„ ๋ณด๊ณ  ํ†ฑ๋‹ˆ๋ฐ”ํ€ด๋กœ ์„ค์ •์„ ์—ฝ๋‹ˆ๋‹ค(โŒ˜/Ctrl+,).
  • ๋Œ€ํ™” ํ™”๋ฉด: ์ƒ๋‹จ ๋ด‡ ์ด๋ฆ„์„ ๋ˆ„๋ฅด๋ฉด ์ •๋ณด ํŒจ๋„(โŒ˜/Ctrl+โ‡ง+I)์ด ์—ด๋ฆฝ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์‘๋‹ต ์ฑ„๋„ ๊ณ„์ •, ์Šน์ธ ๋Œ€๊ธฐ, ์ž‘์—…ยท๊ทœ์น™, ๊ธฐ์–ต, ์ตœ๊ทผ ์„ธ์…˜์„ ๋ณด์—ฌ ์ฃผ๋ฉฐ โš™๋กœ ๋ด‡ ์„ค์ •์„ ์—ฝ๋‹ˆ๋‹ค. ์‘๋‹ต์€ Markdown๊ณผ ์ฝ”๋“œ ํ•œ ๋ฒˆ์— ๋ณต์‚ฌ๋ฅผ ์ง€์›ํ•˜๋ฉฐ ์‹ค์‹œ๊ฐ„ ํ‘œ์‹œํ•˜๊ณ  Esc๋กœ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ์Šน์ธยท์งˆ๋ฌธ์€ ์นด๋“œ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์œ„๋กœ ์Šคํฌ๋กคํ•ด๋„ ๊ฐ•์ œ๋กœ ๋งจ ์•„๋ž˜๋กœ ์ด๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ช…๋ น ํŒ”๋ ˆํŠธ๋Š” โŒ˜/Ctrl+K์ž…๋‹ˆ๋‹ค. ํ…Œ๋งˆ(์‹œ์Šคํ…œ/๋ผ์ดํŠธ/๋‹คํฌ)๋Š” ์„ค์ • โ†’ ์ผ๋ฐ˜์— ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์–ธ์–ด: ์„ค์ • โ†’ ์ผ๋ฐ˜ โ†’ ์–ธ์–ด์—์„œ ์ค‘๊ตญ์–ด ๊ฐ„์ฒดยท์˜์–ดยท์ผ๋ณธ์–ดยทํ•œ๊ตญ์–ดยท๋Ÿฌ์‹œ์•„์–ดยท์ŠคํŽ˜์ธ์–ดยทํฌ๋ฅดํˆฌ๊ฐˆ์–ด(๋ธŒ๋ผ์งˆ)๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ํ™”๋ฉด ์˜ค๋ฅธ์ชฝ ์œ„์™€ ๋ช…๋ น ํŒ”๋ ˆํŠธ์—์„œ๋„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์€ ์‹œ์Šคํ…œ ์–ธ์–ด์ด๋ฉฐ ๋ฏธ์ง€์› ์–ธ์–ด๋Š” ์˜์–ด์ž…๋‹ˆ๋‹ค. ์„ ํƒ์€ config.json์˜ ui.lang์— ์ €์žฅํ•˜๊ณ  ํŠธ๋ ˆ์ด ๋ฉ”๋‰ด, ์„œ๋ฒ„ ์˜ค๋ฅ˜ยท์ƒํƒœ, WeChat/Feishu์˜ /helpยท์Šน์ธ ์•ˆ๋‚ด ๋“ฑ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์ค„ยทDocker์˜ ์‹œ์Šคํ…œ ์–ธ์–ด๋Š” AMB_LANG, LC_ALL/LC_MESSAGES/LANG ์ˆœ์ด๋ฉฐ ์—†์œผ๋ฉด ์ค‘๊ตญ์–ด ๊ฐ„์ฒด์ž…๋‹ˆ๋‹ค. ๋กœ๊ทธ, ๋ชจ๋ธ ํ”„๋กฌํ”„ํŠธ, ์‚ฌ์šฉ์ž๊ฐ€ ์ •ํ•œ ๋ด‡ ์ด๋ฆ„์€ ๋ฒˆ์—ญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ํ™”๋ฉด ๋ฌธ๊ตฌ๋Š” ui/locales/<lang>/<namespace>.js์— ์žˆ๊ณ  t("namespace.key", { params })๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(ui/lib/i18n.js). ์„œ๋ฒ„ ๋ฌธ๊ตฌ๋Š” src/i18n/messages/<namespace>.ts์ด๋ฉฐ ํ‚ค๋ฅผ ํƒ€์ž… ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํ™”๋ฉด ์š”์ฒญ์€ x-amb-lang์„ ๋ณด๋‚ด๋ฉฐ ์„œ๋ฒ„๋„ ํ•ด๋‹น ์–ธ์–ด๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.
    • ์ƒˆ ๋ฌธ๊ตฌ๋Š” ๋‘ ๊ธฐ์ค€ ์–ธ์–ด์— ๋ชจ๋‘ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. node scripts/i18n-check.mjs [filesโ€ฆ]๋Š” ํ™”๋ฉด ์ฝ”๋“œ์˜ ์ค‘๊ตญ์–ด ์ž”์—ฌ ๋ฌธ๊ตฌ, ์—†๋Š” ํ‚ค, zh/en ๋ถˆ์ผ์น˜๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค(npm test์˜ test/i18n.unit.test.ts๋„ ๋™์ผ ๊ฒ€์‚ฌ). ๊ธ€๊ผด ์ด๋ฆ„ยท์ค‘๊ตญ์–ด ์ž…๋ ฅ ์ •๊ทœ์‹์ฒ˜๋Ÿผ ํ•„์š”ํ•œ ์ค‘๊ตญ์–ด๋Š” ํ•ด๋‹น ์ค„์— // i18n-ignore๋ฅผ ๋ถ™์ž…๋‹ˆ๋‹ค.
  • ์‹œ์ž‘ ์ฒดํฌ๋ฆฌ์ŠคํŠธ: ๋นˆ ๋Œ€ํ™”์—๋Š” ์ธ์‚ฌ, ๋ชจ๋ธ ๋ณ€๊ฒฝ, WeChat ์—ฐ๊ฒฐ, ์ž‘์—… ๋งก๊ธฐ๊ธฐ, ๊ธฐ์–ตํ•˜๊ธฐ, ์ด๋ฏธ์ง€ ์ƒ์„ฑ์˜ ์—ฌ์„ฏ ๋‹จ๊ณ„๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๋Š” ๊ณ„์ •์˜ ๋ฏธ๋””์–ด ๋ชจ๋ธ ์—ฌ๋ถ€์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋‚ด์žฅ ๋ฐ๋ชจ๋งŒ ์žฌ์ƒํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๊ธฐ๋ณธ ํ๋ฆ„์ฒ˜๋Ÿผ ์ฆ‰์‹œ ์ƒ์„ฑํ•ด ๋Œ€ํ™”์— ๋ณด์ด์ง€๋งŒ ๋ด‡์— ์ „์†กํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋ธ ํ˜ธ์ถœยท๊ณผ๊ธˆ๋„ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋Š” ui/assets/guide-demo.svg์ž…๋‹ˆ๋‹ค. ๋น„์šฉ ์—†์ด ํ๋ฆ„์„ ๋ฐฐ์šฐ๋„๋ก ํ•œ ๊ฒƒ์ด๋ฉฐ ์‹ค์ œ ์ด๋ฏธ์ง€ ์š”์ฒญยท์ˆ˜์‹ ์œผ๋กœ๋„ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ๋ณด๋‚ด๊ธฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ง์ ‘ ์‹œ๋„ํ•˜๊ณ  ์ด๋™ํ•˜๊ธฐ ๋˜๋Š” ์™ผ์ชฝ ์•„๋ž˜ ํ•ญ๋ชฉ์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ์ œ์–ด ์š”์†Œ๋ฅผ ํ…Œ๋‘๋ฆฌ๋กœ ๊ฐ•์กฐํ•˜๋Š” ์•ˆ๋‚ด ์นด๋“œ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค. ์‘๋‹ต, ๋ชจ๋ธ ๋ณ€๊ฒฝ, ํŒŒ์ผยท์ด๋ฏธ์ง€ ์ˆ˜์‹ , ์ฑ„๋„ ์—ฐ๊ฒฐ, ๊ธฐ์–ต ์ €์žฅ์— ๋”ฐ๋ผ ์ž๋™ ์™„๋ฃŒ๋˜๋ฉฐ config.json์˜ ui.guide(API /amb/api/guide)์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ ํ•œ ๋‹จ๊ณ„๋„ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. ์™ผ์ชฝ ์•„๋ž˜๋กœ ์ ‘๊ฑฐ๋‚˜ ์™„์ „ํžˆ ์ˆจ๊ธธ ์ˆ˜ ์žˆ๊ณ  ์„ค์ • โ†’ ์ผ๋ฐ˜ โ†’ ์‹œ์ž‘ ์ฒดํฌ๋ฆฌ์ŠคํŠธ์—์„œ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ธ์‚ฌ๋Š” ์‹ค์ œ ์‘๋‹ต์ด ์žˆ์–ด์•ผ ํ•˜๊ณ (์˜ค๋ฅ˜ ์•ˆ๋‚ด๋Š” ์ œ์™ธ), ์ฑ„๋„์€ ์‹ค์ œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์„ค์ •๋งŒ์œผ๋กœ๋Š” ์™„๋ฃŒ๋˜์ง€ ์•Š์Œ). โ€˜์ž์ฃผ ์“ฐ๋Š” ์ฑ„ํŒ… ์•ฑ ์—ฐ๊ฒฐโ€™์—์„œ๋Š” WeChat, Feishu, Telegram, Slack, Discord๋ฅผ ๊ณ ๋ฅผ ์ˆ˜ ์žˆ๊ณ  UI ์–ธ์–ด๋Š” ์ถ”์ฒœ ํ•ญ๋ชฉ๋งŒ ์ •ํ•ฉ๋‹ˆ๋‹ค. โ€˜๊ธฐ์–ตํ•ดโ€ฆโ€™๋ผ๊ณ  ๋ถ„๋ช…ํžˆ ๋งํ•˜๋ฉด ํ„ด ํ›„ ๊ธฐ์–ต ์ •๋ฆฌ๋ฅผ 90์ดˆ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ง„ํ–‰ ์ƒํ™ฉ์€ ์‚ฌ์šฉ์ž๋ณ„๋กœ ์ €์žฅ๋˜๋ฉฐ(Modelflare ๋กœ๊ทธ์ธ ์‹œ ๊ณ„์ •๋ณ„๋กœ KV guide.owner.*, ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์•˜์œผ๋ฉด ๊ธฐ์กด๋Œ€๋กœ config.json์˜ ui.guide), ๋ชจ๋‘ ๋งˆ์น˜๋ฉด ์ดํ›„ ์ž๋™์œผ๋กœ ์ˆจ๊ฒจ์ง‘๋‹ˆ๋‹ค. ์Šค์Šค๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ์•ˆ๋‚ด ์นด๋“œ๋Š” ์ž…๋ ฅ์ฐฝ์— ์ดˆ์•ˆ์ด ์žˆ๊ฑฐ๋‚˜ ์ž‘์—…์ด ์‹คํ–‰ ์ค‘์ด๋ฉด ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ ๋””์ž์ธ: ๋ฌด์ฑ„์ƒ‰๊ณผ ๊ตฌ์„ฑ ์š”์†Œ๋Š” magpie(MIT)๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ˆ˜์ •ํ–ˆ๊ณ  ๊ฐ•์กฐ์ƒ‰์€ Modelflare์˜ ํ˜•๊ด‘ ์—ฐ๋‘์ƒ‰ #d7ff00์ž…๋‹ˆ๋‹ค. ui/design/README.md์— ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์ง€ํ™”์™€ ๋ฆด๋ฆฌ์Šค ๊ฒ€์‚ฌ

๊ด€๋ฆฌ์ž๊ฐ€ ๊ฐ ๋ฒˆ์—ญ์„ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ณ  ํ˜„์ง€ํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋ฒˆ์—ญ API๋กœ ๋ฌธ๊ตฌ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋งˆ์„ธ์š”. ์ œํ’ˆ๋ช…, ๋ชจ๋ธ ID, ๋ช…๋ น, URL, {placeholder} ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์œ ์ง€ํ•˜์„ธ์š”.

  • ์•ฑ ๋ฌธ๊ตฌ: ui/locales/<language>/<module>.js. ์ƒˆ ์„œ๋ฒ„ ์–ธ์–ด: src/i18n/locales/<language>/<module>.ts.
  • ์›น์‚ฌ์ดํŠธ ๋ฌธ๊ตฌ: site/src/i18n/locales/<language>/. ์˜ˆ๋ฅผ ๋“ค์–ด home/hero.ts๋Š” home.hero.*์— ๋Œ€์‘ํ•˜๋ฉฐ ํŽ˜์ด์ง€๋Š” ์‚ฌ์ „์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ui/locales/manifest.json์€ ๋Œ€์ƒ ์–ธ์–ด์™€ ready ์ƒํƒœ๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. ์›น์‚ฌ์ดํŠธ์˜ site/src/i18n/manifest.json๊ณผ ๊ฐ™์•„์•ผ ํ•˜๋ฉฐ ๊ฒ€์‚ฌ๊ธฐ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ์™„๋ฃŒ ์–ธ์–ด๋Š” ready: false๋กœ ์œ ์ง€ํ•˜๊ณ  ๊ณต๊ฐœ ๋ฉ”๋‰ด์™€ ๊ฒ€์ƒ‰ ์—”์ง„ ์–ธ์–ด ํ‘œ์‹œ์— ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • npm run i18n:status๋Š” ์–ธ์–ดยท์˜์—ญ๋ณ„ ์ง„ํ–‰๋ฅ ์„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. npm run i18n:check๋Š” ๋ชจ๋“  ๋Œ€์ƒ ์–ธ์–ด์™€ ๋ณด์กฐ ๋ฌธ์„œ๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๋ฝยท๋นˆ ๊ฐ’ยท์ถ”๊ฐ€ ํ‚ค, ํ›ผ์†๋œ ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ณต์ˆ˜ํ˜• ๋ˆ„๋ฝ์€ ๋ฆด๋ฆฌ์Šค๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ์ค‘ ์˜์–ด ๋Œ€์ฒด๋Š” ๋ฒˆ์—ญ ์™„๋ฃŒ๋กœ ์ธ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋Ÿฌ์‹œ์•„์–ด ๋ณต์ˆ˜ํ˜•์€ one / few / many / other, ์ŠคํŽ˜์ธ์–ดยทํฌ๋ฅดํˆฌ๊ฐˆ์–ด๋Š” one / many / other(many๋Š” ๋ฐฑ๋งŒ ๋‹จ์œ„ ์ˆ˜์—๋งŒ ์“ฐ๋ฉฐ other์™€ ๊ฐ™๊ฒŒ ์ž‘์„ฑ), ์ผ๋ณธ์–ดยทํ•œ๊ตญ์–ด๋Š” other๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ†ตํ™”, ์‹œ๊ฐ„๋Œ€, ๊ธˆ์•ก์„ ๋ฐ”๊พธ์ง€ ์•Š๊ณ  ํ‘œ์‹œ๋งŒ ํ˜„์ง€ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์›น์‚ฌ์ดํŠธ์˜ npm run build๋Š” ๋ชจ๋“  ์–ธ์–ด, ๋™๊ธฐํ™” ๋ฌธ์„œ, ๊ณต์œ  ์ด๋ฏธ์ง€๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. build:draft๋Š” ๋กœ์ปฌ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ์šฉ์ด๋ฉฐ ๋ฆด๋ฆฌ์Šค ๊ฒ€์‚ฌ๋ฅผ ๋Œ€์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ญํ• ๊ณผ ํ”„๋กฌํ”„ํŠธ

๋ชจ๋ธ์ด ์ฝ๋Š” ๋ชจ๋“  ํ”„๋กฌํ”„ํŠธ๋Š” src/agent/prompts/์— ์žˆ์Šต๋‹ˆ๋‹ค. test/prompts.unit.test.ts๋Š” ๊ฐ ๋ถ€๋ถ„์˜ ํ•„์ˆ˜ยท๊ธˆ์ง€ ๋ฌธ๊ตฌ์™€ ๋ฌธ์ž ์ˆ˜ ํ•œ๋„๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ , test/agent.integration.test.ts๋Š” ์‹ค์ œ DSH ์ž์‹ ํ”„๋กœ์„ธ์Šค๋กœ ๋ชจ๋ธ์ด ๋ฐ›๋Š” ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์™€ ์ „์ฒด ํ”„๋กฌํ”„ํŠธยท๋„๊ตฌ ์ •์˜ ์˜ˆ์‚ฐ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ ์—ญํ• : DSH ์ž์ฒด ์—ญํ• ์€ ์ฝ”๋”ฉ ์—์ด์ „ํŠธ์ด๋ฉฐ โ€œYou are an AI agent powered by DeepSeek Harness.โ€๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํŒจ์น˜(host.ts์˜ writePatch)๊ฐ€ personaPrefix๋ฅผ ๋Œ€ํ™”ยท์ฝ”๋”ฉยท๋ช…๋ นยทํŒŒ์ผยท์ปดํ“จํ„ฐ ์‚ฌ์šฉ ์‹œ ๋ฐ์Šคํฌํ†ฑ ์•ฑ ์กฐ์ž‘์„ ํ•˜๋Š” ๊ฐœ์ธ ๋„์šฐ๋ฏธ๋กœ ๋ฐ”๊พธ๊ณ  ์›นํŽ˜์ด์ง€ยทํŒŒ์ผยท์ „๋‹ฌ ๋ฉ”์‹œ์ง€์˜ ๊ธ€์€ ๋ช…๋ น์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ๋กœ ์ทจ๊ธ‰ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ•œ ๋ฌธ์žฅ๋งŒ ์ œ์–ดํ•˜๋Š” includeHarnessIdentity๋„ ๋•๋‹ˆ๋‹ค.
  • ๋ด‡ ์„น์…˜: ๋Œ€ํ™” ๊ทœ์น™, ๊ธฐ์–ต ์‚ฌ์šฉ๋ฒ•(์ผœ์ง„ ๊ฒฝ์šฐ), ๋ด‡ ์ด๋ฆ„, ์‚ฌ์šฉ์ž ์—ญํ•  ์„ค๋ช…์ด ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ๋งˆ์ง€๋ง‰ amb:bot ์„น์…˜์ž…๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ๊ฐ€ ๋งค ์ฐจ๋ก€ ๋ฐ์ดํ„ฐ ํด๋”์˜ dsh/.prompts/<bot>.md์— ๊ธฐ๋กํ•˜๋ฉฐ ์—์ด์ „ํŠธ ํŒŒ์ผ ๋„๊ตฌ๋กœ ์ฝ๊ฑฐ๋‚˜ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๊ณ  ๋™์ผ ๋‚ด์šฉ์€ ๋‹ค์‹œ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. dsh-runtime/plugins/amb-prompt.mjs๊ฐ€ ๋งค ๋ชจ๋ธ ์š”์ฒญ์— ์ฝ์œผ๋ฏ€๋กœ ์ด๋ฆ„ยท์—ญํ•  ๋ณ€๊ฒฝ์ด ๋‹ค์Œ ๋ฉ”์‹œ์ง€๋ถ€ํ„ฐ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. /new๋‚˜ ํ”„๋กœ์„ธ์Šค ์žฌ์‹œ์ž‘์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. DSH 0.2.1-rc.4์˜ ์„น์…˜ text๋Š” ๋™๊ธฐ์‹์œผ๋กœ Promise๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์•„ ๋ธŒ๋ฆฌ์ง€ ๋Œ€์‹  ํŒŒ์ผ์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์—ญํ• ๊ณผ ๋Œ€ํ™” ๊ทœ์น™์ด ์ถฉ๋Œํ•˜๋ฉด ์—ญํ• ์ด ์šฐ์„ ํ•˜๋ฉฐ ์‚ฌ์šฉ์ž์™€ ๋Œ€ํ™”ํ•˜์ง€ ์•Š๋Š” ํ•˜์œ„ ์—์ด์ „ํŠธ์—๋Š” ์ด ์„น์…˜์„ ์ „๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋Œ€ํ™” ๊ทœ์น™: ์ค‘๊ตญ์–ด์ด๋ฉฐ dsh-superagent์˜ ์ฃผ์˜ ์›์น™์„ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ต๋ถ€ํ„ฐ ์ œ์‹œํ•˜๊ณ  ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฉด ํ•  ์ผ์„ ํ•œ ์ค„๋กœ ์•Œ๋ฆฐ ๋’ค ๋‹จ๊ณ„๋ณ„ ์ค‘๊ณ„๋Š” ํ™œ๋™ ํŒจ๋„์— ๋งก๊น๋‹ˆ๋‹ค. ์™„๋ฃŒ ์‹œ ๊ฒฐ๊ณผ์™€ ์œ„์น˜๋ฅผ ๋งํ•˜๊ณ  ๋ฏธ์™„๋ฃŒยท์‹คํŒจ๋Š” ๊ทธ๋Œ€๋กœ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ์–ธ์–ดยทํ˜•์‹ยท๋ฒ”์œ„ยท๋ฌธ์ฒด๋Š” ์Šค์Šค๋กœ ์ •ํ•ด ์„ค๋ช…ํ•˜๋ฉฐ, ์ž˜๋ชป๋œ ์ถ”์ธก์ด ํ”ผํ•ดยท๋น„์šฉยท๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—… ๋‚ญ๋น„๋ฅผ ์ผ์œผํ‚ฌ ๋•Œ, ์‚ฌ์šฉ์ž๋งŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋กœ๊ทธ์ธยทํŒŒ์ผยท๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํ•„์š”ํ•  ๋•Œ, ๊ฒฐ์ œยท๋ฐ์ดํ„ฐ ์‚ญ์ œยทํƒ€์ธ์—๊ฒŒ ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ์ฒ˜๋Ÿผ ๋˜๋Œ๋ฆด ์ˆ˜ ์—†์„ ๋•Œ๋งŒ ์งˆ๋ฌธํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์— ๊ตฌ์ฒด์ ์ธ ์งˆ๋ฌธ ํ•˜๋‚˜๋ฅผ ํ•˜๋ฉฐ ์„ ํƒ์ง€๋Š” ask_user_question์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ตฐ๋”๋”๊ธฐ ์—†์ด WeChatยทFeishu ์‘๋‹ต์€ ์งง๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…๋„ ๊ฐ™์€ ์›์น™์œผ๋กœ ์„ ํƒํ•œ ๋‚ด์šฉ์„ ๊ฒฐ๊ณผ์— ๋ฐํž™๋‹ˆ๋‹ค.
  • ๊ตฌ๊ฐ„ ์ฒซ ๋ฉ”์‹œ์ง€: ์ฑ„๋„(WeChat์€ ์ผ๋ฐ˜ ํ…์ŠคํŠธ, Feishuยท์›น์€ Markdown), ๋‹น์‹œ ์žฅ๊ธฐ ๊ธฐ์–ต ์Šค๋ƒ…์ƒท, ์ด์ „ ๊ตฌ๊ฐ„ ์ธ๊ณ„ ๋ฉ”๋ชจ, ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€ ์ˆœ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฃน ๊ธฐ์–ตยท์ฑ„๋„ ๋“ฑ ๋Œ€ํ™”๋ณ„ ์ •๋ณด๊ฐ€ ๋‹ค๋ฅด๊ณ  ๊ธฐ์–ต๋งˆ๋‹ค ๋ฐ”๋€Œ์–ด ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ๋„ฃ์œผ๋ฉด ๊ณต์œ  ์ ‘๋‘์‚ฌ ์บ์‹œ๊ฐ€ ๊นจ์ง€๋ฏ€๋กœ ์—ฌ๊ธฐ ๋‘ก๋‹ˆ๋‹ค. ๊ตฌ๊ฐ„ ๋‚ด์—์„œ๋Š” ๊ณ ์ •ํ•˜๊ณ  ์ดํ›„ ๊ธฐ์–ต ๋ณ€๊ฒฝ์€ recall๋กœ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ์ ‘๋‘์‚ฌ ์บ์‹œ: ์„น์…˜์ด ๊ฐ™์œผ๋ฉด ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋Š” ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋™์ผํ•˜๊ณ  ์—ญํ•  ์ˆ˜์ •์€ ๋งˆ์ง€๋ง‰ ์„น์…˜๋งŒ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ์—…๊ทธ๋ ˆ์ด๋“œ ์ „ ์‹œ์ž‘ํ•œ ๋Œ€ํ™”์˜ ์ฒซ ๋ฉ”์‹œ์ง€์—๋Š” ๋‹ค์Œ ๊ตฌ๊ฐ„(/new ๋˜๋Š” ๊ด€๋ฆฌ์ž ์ „ํ™˜)๊นŒ์ง€ ์ด์ „ ์—ญํ• ์ด ๋‚จ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ๊ถŒํ•œ

์—์ด์ „ํŠธ ๋ชจ๋“œ์—์„œ ์ž…๋ ฅ์ฐฝ ์™ผ์ชฝ ์•„๋ž˜ ๊ถŒํ•œ ๋ฒ„ํŠผ ๋˜๋Š” ๋ด‡ ์„ค์ • โ†’ ๊ถŒํ•œ์œผ๋กœ ํ”„๋ฆฌ์…‹์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. /status์—์„œ๋„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • ์ž‘์—… ๊ณต๊ฐ„ ์“ฐ๊ธฐ(๊ธฐ๋ณธ): ์ƒŒ๋“œ๋ฐ•์Šค์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ณ  ํ•ด๋‹น ๋ด‡์˜ ์ž‘์—… ๊ณต๊ฐ„๋งŒ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€ ์ž‘์—…์€ ๋Œ€ํ™”์—์„œ ๋จผ์ € ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ๊ธฐ ์ „์šฉ: ํŒŒ์ผ์„ ๋ฐ”๊พธ์ง€ ์•Š์œผ๋ฉฐ ๋ช…๋ น๋„ ์ฝ๊ธฐ ์ „์šฉ ์ƒŒ๋“œ๋ฐ•์Šค์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ „์ฒด ์ ‘๊ทผ: ์œ„ํ—˜์„ ์ดํ•ดํ•˜๊ณ  ์žฆ์€ ์Šน์ธ์ด ๋ถˆํŽธํ•œ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ƒŒ๋“œ๋ฐ•์Šค ์—†์ด ๋‚ด ์‚ฌ์šฉ์ž ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์™ธ๋ถ€ ์ž‘์—…๋„ ๋ฌป์ง€ ์•Š์Šต๋‹ˆ๋‹ค. DBยท์ฑ„๋„ ํ† ํฐยทํ‚ค ๋“ฑ AnyModelBot ๋ฐ์ดํ„ฐ ํด๋”๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์žฌ๊ท€ ์‚ญ์ œ๋งŒ ๊ธฐ์กด ์Šน์ธ ํ๋ฆ„(WeChat ๋ฒˆํ˜ธ ์‘๋‹ต, Feishuยท์›น ์นด๋“œ)์œผ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ rm -r/-rf/--recursive(sudo, xargs, sh -c ๋‚ด๋ถ€ ํฌํ•จ), find -delete, git clean, rsync --delete, PowerShell Remove-Item/rm/del/rd/rmdir์˜ -Recurse ๋ฐ ์ถ•์•ฝ, cmd rd /s, del /s, robocopy /MIR, Python shutil.rmtree, Node fs.rm(โ€ฆ, { recursive }) ๋“ฑ์ด๋ฉฐ ๋ช…๋ น์ด ์ฐธ์กฐํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๋„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ ์ „ ํ™•์ธํ•˜๋ฉฐ ๋ฒ„ํŠผยท์„ค์ •์— ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋Š” ์‹ค์ˆ˜ ์‚ญ์ œ ๋ฐฉ์ง€ ์žฅ์น˜์ด๋ฉฐ ๋ณด์•ˆ ๊ฒฝ๊ณ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ช…๋ น ํ…์ŠคํŠธ๋ฅผ ๊ฒ€์‚ฌํ•˜๋ฏ€๋กœ ์‹คํ–‰ ์ค‘ ์กฐํ•ฉํ•œ ๋ช…๋ น(eval "$(โ€ฆ)", curl โ€ฆ | sh)์ด๋‚˜ make clean, npm run clean ๊ฐ™์€ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ์˜ ๋‚ด๋ถ€ ๋™์ž‘์€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ถˆํ™•์‹คํ•˜๋ฉด ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ชจ๋ธ๊ณผ ์ž‘์—…์„ ์‹ ๋ขฐํ•  ๋•Œ๋งŒ ์ผœ์„ธ์š”.

๋ด‡์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ

์—์ด์ „ํŠธ๋Š” ๋‚ด ์ปดํ“จํ„ฐ์—์„œ, ๋•Œ๋กœ๋Š” ์ „์ฒด ์ ‘๊ทผ์œผ๋กœ ์‹คํ–‰๋˜๋ฏ€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ ์†Œ์œ ์ž์™€ ํ—ˆ์šฉํ•œ ์‚ฌ๋žŒ๋งŒ ๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฑ„๋„ ๊ณ„์ •๋ณ„๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ ํ•ด๋‹น ๊ณ„์ •์—์„œ ํ—ˆ์šฉ๋˜๋ฉด ๋ชจ๋“  ๋ด‡๊ณผ ๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(src/core/access.ts).

  • ์†Œ์œ ์ž: WeChat์€ QR ์ฝ”๋“œ๋ฅผ ์Šค์บ”ํ•œ ๊ณ„์ •์ž…๋‹ˆ๋‹ค. Feishu๋Š” QR๋กœ ์•ฑ์„ ๋งŒ๋“ค๋“  App IDยทSecret์„ ๋„ฃ๋“  ์ž์ฒด ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ์ด ์—†์œผ๋ฏ€๋กœ ์—ฐ๊ฒฐ ํ›„ ์ฒ˜์Œ์œผ๋กœ ๊ฐœ์ธ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ์‚ฌ๋žŒ์ด ์†Œ์œ ์ž๊ฐ€ ๋ฉ๋‹ˆ๋‹ค(์ฒซ ์‚ฌ์šฉ ์‹ ๋ขฐ). ์—ฐ๊ฒฐ ํ›„ ๋ณธ์ธ ๊ณ„์ •์œผ๋กœ ํ•œ ์ค„ ๋ณด๋‚ด๋ฉด ํ‰์†Œ์ฒ˜๋Ÿผ ๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์Šค์บ๋„ˆ ID๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์€ WeChat ๋กœ๊ทธ์ธ๋„ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋ด‡ ์„ค์ • โ†’ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์‚ฌ๋žŒ์—์„œ Feishu ์†Œ์œ ์ž๋ฅผ ํ™•์ธํ•˜๊ณ  ๋ณ€๊ฒฝ์„ ๋ˆ„๋ฅธ ๋’ค ํ™•์ธํ•˜๋ฉด ์ดˆ๊ธฐํ™”๋˜์–ด ๋‹ค์Œ ๋ฐœ์‹ ์ž๊ฐ€ ์†Œ์œ ์ž๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ Feishu ์•ฑ์œผ๋กœ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์—ฐ๊ฒฐ์„ ํ•ด์ œํ•ด๋„ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ถ€๋œ ์‚ฌ์šฉ์ž๋Š” ์†Œ์œ ์ž๊ฐ€ ๋  ์ˆ˜ ์—†์œผ๋ฉฐ ๋กœ์ปฌ ์›น ๋Œ€ํ™”๋Š” ์ œํ•œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ทธ ์™ธ ์‚ฌ์šฉ์ž: โ€˜์•„์ง ์ด ๋ด‡์˜ ์‚ฌ์šฉ ํ—ˆ๊ฐ€๋ฅผ ๋ฐ›์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์†Œ์œ ์ž์—๊ฒŒ ์•Œ๋ ธ์Šต๋‹ˆ๋‹คโ€™๋ผ๋Š” ํ•œ ์ค„๋งŒ ์‚ฌ๋žŒ๋‹น ์ตœ๋Œ€ ์‹œ๊ฐ„๋‹น ํ•œ ๋ฒˆ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋Œ€๊ธฐ์—ดยท๋ชจ๋ธ ํ˜ธ์ถœยท๋น„์šฉ์€ ์—†์Šต๋‹ˆ๋‹ค. ์„ค์ • โ€บ ์ฑ„ํŒ… ์ฑ„๋„์˜ ํ•ด๋‹น ๊ณ„์ • ๊ด€๋ฆฌ์— ํ—ˆ์šฉยท๊ฑฐ๋ถ€ ์š”์ฒญ์ด ํ‘œ์‹œ๋˜๊ณ  4์ž๋ฆฌ ํŽ˜์–ด๋ง ์ฝ”๋“œ๋กœ ์†Œ์œ ์ž์—๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค(๊ณ„์ •๋‹น ์‹œ๊ฐ„๋‹น ์ตœ๋Œ€ 3๊ฑด, ์†Œ์œ ์ž๊ฐ€ ์ตœ๊ทผ 24์‹œ๊ฐ„ ๋‚ด ํ•ด๋‹น ์ฑ„๋„์—์„œ ๋ฐœ์–ธํ•œ ๊ฒฝ์šฐ๋งŒ). ์†Œ์œ ์ž๋Š” ๅŒๆ„ 1234/ๆ‹’็ป 1234 ๋˜๋Š” yes 1234/no 1234๋กœ ๋‹ตํ•ฉ๋‹ˆ๋‹ค. ํŽ˜์–ด๋ง ์ฝ”๋“œ๋Š” ๋„๊ตฌ ์Šน์ธ ์ฝ”๋“œ์™€ ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฑฐ๋ถ€๋œ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋‹ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ—ˆ์šฉ ๋ชฉ๋ก์€ ์„ค์ • โ€บ ์ฑ„ํŒ… ์ฑ„๋„์˜ ํ•ด๋‹น ๊ณ„์ • ๊ด€๋ฆฌ์— ์žˆ์œผ๋ฉฐ ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ญ์ œ๋œ ์‚ฌ์šฉ์ž๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด ๋‹ค์‹œ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. /status์—๋„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • ์—…๊ทธ๋ ˆ์ด๋“œ ์‹œ ๊ธฐ์กด ๊ฐœ์ธ ๋Œ€ํ™” ์ƒ๋Œ€๋Š” โ€˜์—…๊ทธ๋ ˆ์ด๋“œ ์ „ ์‚ฌ์šฉโ€™ ํ‘œ์‹œ๋กœ ํ—ˆ์šฉ ๋ชฉ๋ก์— ๋„ฃ์–ด ์ ‘๊ทผ์ด ๋Š๊ธฐ์ง€ ์•Š๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ WeChat ๊ณ„์ •์œผ๋กœ ๋‹ค์‹œ ์Šค์บ”ํ•ด๋„ ์ด์ „ ์†Œ์œ ์ž๋Š” ํ—ˆ์šฉ ๋ชฉ๋ก์— ๋‚จ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ฃน ๋Œ€ํ™”: ํ˜„์žฌ ์–ด๋–ค ์ฑ„๋„๋„ ๊ทธ๋ฃน์„ ์ „๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(Feishu๋Š” ๊ฐœ์ธ ๋ฉ”์‹œ์ง€๋งŒ, WeChat iLink๋Š” ๊ทธ๋ฃน ๋ฏธ์ง€์›). ๊ธฐ์กด ๊ทธ๋ฃน ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ์ฑ„๋„์ด ๊ทธ๋ฃน์„ ์ง€์›ํ•  ๋•Œ access.ts์— ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋‹ต๋ณ€ ์ „๋‹ฌ์˜ ์ง€์†์„ฑ

์ตœ์ข… ๋‹ต๋ณ€, ํŒŒ์ผ, ์Šน์ธ ์š”์ฒญ, ์•ˆ๋‚ด๋Š” ์ „์†ก ์ „์— ๋กœ์ปฌ DB ๋ณด๋‚ผ ํŽธ์ง€ํ•จ์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค(src/core/outbox.ts). ์‹ค์‹œ๊ฐ„ ์นด๋“œ ๊ฐฑ์‹ ๊ณผ ์ž…๋ ฅ ์ค‘ ํ‘œ์‹œ๋Š” ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

  • ํ•œ ๋Œ€ํ™”์˜ ๋ฉ”์‹œ์ง€๋Š” ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋‚˜์”ฉ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌยทํ”Œ๋žซํผ ์˜ค๋ฅ˜๋Š” 5์ดˆ๋ถ€ํ„ฐ ์ตœ๋Œ€ 5๋ถ„๊นŒ์ง€ ๊ฐ„๊ฒฉ์„ ๋Š˜๋ ค ์žฌ์‹œ๋„ํ•˜๊ณ  ์ฑ„๋„์ด ์˜คํ”„๋ผ์ธ์ด๋ฉด ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  • ์•ฑ ์ข…๋ฃŒยท์ถฉ๋Œ ํ›„ ๋‹ค์Œ ์‹คํ–‰์—์„œ ์ด์–ด ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด๋ฏธ ๋ณด๋‚ธ ๋ฉ”์‹œ์ง€๋Š” ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ธด ์‘๋‹ต์€ ์ฒซ ๋ฏธ์ „์†ก ๋ถ€๋ถ„๋ถ€ํ„ฐ ์žฌ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์‹  ๋ฉ”์‹œ์ง€์—์„œ ID๋ฅผ ๋„์ถœํ•˜๋ฏ€๋กœ ํ”Œ๋žซํผ์ด ์ค‘๋ณต ์ „๋‹ฌํ•ด๋„ ์ตœ์ข… ์‘๋‹ต์€ ํ•œ ๋ฒˆ์ž…๋‹ˆ๋‹ค. ์ถฉ๋Œ ์ˆœ๊ฐ„ ์ „์†ก ์ค‘์ด๋˜ ๋ถ€๋ถ„๋งŒ ์ค‘๋ณต๋  ์ˆ˜ ์žˆ๊ณ  ๊ณ ์ • Feishu uuid(1์‹œ๊ฐ„ ์ค‘๋ณต ์ œ๊ฑฐ)์™€ WeChat client_id๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • WeChat์€ ๋งˆ์ง€๋ง‰ ์ˆ˜์‹  ํ›„ 24์‹œ๊ฐ„ ์ด๋‚ด, ๋ฉ”์‹œ์ง€๋‹น ์ตœ๋Œ€ 10ํšŒ๋งŒ ๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œํ•œ ๋•Œ๋ฌธ์— ๋ชป ๋ณด๋‚ธ ๋‚ด์šฉ์€ ๋ฒ„๋ฆฌ์ง€ ์•Š๊ณ  ๋ณด๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ฉ”์‹œ์ง€๊ฐ€ ์˜ค๋ฉด ๋‹ต๋ณ€ ์ „์— ์›๋ž˜ ์ˆœ์„œ๋Œ€๋กœ ํ•œ ๋ฒˆ์”ฉ ๋ณด๋‚ด๋ฉฐ ํ•œ ๋ฉ”์‹œ์ง€ ํฌ๊ธฐ์— ๋“ค์–ด๊ฐ€๋Š” ํ…์ŠคํŠธ๋Š” โ€˜์ž๋ฆฌ๋ฅผ ๋น„์šด ๋™์•ˆ: โ€ฆโ€™์œผ๋กœ ํ•ฉ์น˜๊ณ  ํŒŒ์ผ์€ ๊ทธ๋Œ€๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ตœ๋Œ€ 7์ผ ๋ณด๊ด€ํ•˜๋ฉฐ ์ˆ˜์‹  ์•ˆ๋‚ดยท์Šน์ธ ์š”์ฒญ์ฒ˜๋Ÿผ ์งง์€ ์ˆ˜๋ช…์˜ ํ•ญ๋ชฉ์€ ์ž์ฒด ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ˜๋ณต ๊ฑฐ๋ถ€ยท๋Œ€๊ธฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋“ฑ์œผ๋กœ ๋” ์ด์ƒ ์ „์†กํ•  ์ˆ˜ ์—†์œผ๋ฉด ์‚ฌ์œ ๋ฅผ ๋กœ๊ทธ์™€ ์ง„๋‹จ ์ •๋ณด์— ๋‚จ๊น๋‹ˆ๋‹ค.

๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…๊ณผ ๊ทœ์น™

์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•ด ๋Œ€ํ™”๋ฅผ ๋ง‰์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์„ค๊ณ„ docs/design/background-tasks-and-proactive.md, ์ฝ”๋“œ src/tasks/).

  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…: ๋Œ€ํ™” ์—์ด์ „ํŠธ๊ฐ€ task_start๋กœ ์ „์šฉ DSH ์„ธ์…˜ task-<id>์™€ ์ž‘์—… ๊ณต๊ฐ„ ํด๋” tasks/<name>-<id6>/๋ฅผ ๋งŒ๋“ค๊ณ  ํ•  ์ผ์„ ํ•œ ์ค„๋กœ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ์š”์ฒญํ•œ ๋Œ€ํ™”๋กœ ๋Œ์•„์˜ค๋ฉฐ WeChat ์ธ์šฉยทFeishu ๋‹ต์žฅ์œผ๋กœ ์ด์–ด๊ฐ‘๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ํ™•์ธ์€ ๋Œ€ํ™”๋‹น ํ•œ ๋ฒˆ์— ํ•œ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ฑ ์žฌ์‹œ์ž‘ ํ›„ ๊ณ„์†ํ•˜๋˜ ์™ธ๋ถ€ ๋™์ž‘์„ ๋ฐ˜๋ณตํ•˜๊ธฐ ์ „์— ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. /tasks๋กœ ์ž‘์—…ยท๊ทœ์น™์„ ๋‚˜์—ดํ•˜๊ณ  /stop <number>๋กœ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค.
  • ๊ทœ์น™: rule_create ๋˜๋Š” ๋ด‡ ์„ค์ • โ€บ ๋จผ์ € ๋ณด๋‚ด๋Š” ๋ฉ”์‹œ์ง€ โ€บ ๊ทœ์น™์—์„œ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๋ฌธ๊ตฌ๊ฐ€ ๊ถŒํ•œ ๋ถ€์—ฌ์ด๋ฏ€๋กœ ์ฆ‰์‹œ ์‹คํ–‰ ๋ชจ๋“œ๊ฐ€ ๋˜์–ด ๋งค๋ฒˆ ํ™•์ธํ•˜๊ณ  ์ค‘์š”ํ•œ ๋‚ด์šฉ๋งŒ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋ฌธ๊ตฌ ์ˆ˜์ • ํ›„์—๋„ ์‹คํ–‰ ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค. โ€˜์šฐ์„  ๊ด€์ฐฐํ•ด ์ค˜โ€™ ๋˜๋Š” ํŽธ์ง‘๊ธฐ์˜ ๊ด€์ฐฐ์„ ์„ ํƒํ•˜๋ฉด ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋ณด๋‚ด์ง€ ์•Š๊ณ  โ€˜์ „์†ก ์˜ˆ์ •โ€™์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. 3ํšŒ ๊ด€์ฐฐ ํ›„ โ€˜๋‚ด ํ™•์ธ ํ•„์š”โ€™์—์„œ ์‹คํ–‰ ์ „ํ™˜ ์—ฌ๋ถ€๋ฅผ ๋ฌป์Šต๋‹ˆ๋‹ค. ๋งค ์‹คํ–‰์€ ์ƒˆ ์„ธ์…˜์ด๋ฉฐ ๊ธฐ๋ก์€ Markdown์œผ๋กœ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ๋ณด์ด๋˜ ์‹œ๋„๋Ÿฝ์ง€ ์•Š๊ฒŒ: ์ •๋ณด ํŒจ๋„์˜ ์ž‘์—… ๊ทธ๋ฃน์— ์ž‘์—…ยท๊ทœ์น™์„ ํ‘œ์‹œํ•˜๊ณ  ๋๋‚œ ์ž‘์—…์€ ์ข…๋ฃŒ ํ•ญ๋ชฉ์œผ๋กœ ์ ‘์Šต๋‹ˆ๋‹ค. ์ถœ์ฒ˜, ์ตœ๊ทผ ์ง„ํ–‰, ์˜ˆ์‚ฐ, ํด๋”, ์‹คํ–‰ ๋‹จ๊ณ„๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ•ญ๋ชฉ์€ ์‚ฌ์ด๋“œ๋ฐ” โ€˜๋‚ด ํ™•์ธ ํ•„์š”โ€™์— ๋ชจ์๋‹ˆ๋‹ค. ๊ฒฐ๊ณผยท๊ฒฐ์ • ์š”์ฒญยท์‹คํŒจ๋งŒ ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉํ•ด ๊ธˆ์ง€(๊ธฐ๋ณธ 22:00~08:00), ์ผ์ผ ํ•œ๋„(WeChat 3๊ฐœ, Feishu 5๊ฐœ), ๋ฌถ์Œ ์•Œ๋ฆผ์€ ๋ด‡ ์„ค์ • โ€บ ๋จผ์ € ๋ณด๋‚ด๋Š” ๋ฉ”์‹œ์ง€์— ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ์‚ฐ: ๊ธฐ๋ณธ ์ž‘์—…๋‹น $1, ๊ทœ์น™ ์‹คํ–‰๋‹น $0.10, ๊ทœ์น™๋ณ„ ์›” $3์ด๋ฉฐ Modelflare ์ฐธ๊ณ  ๊ฐ€๊ฒฉ์œผ๋กœ ์ถ”์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•œ๋„์— ๋„๋‹ฌํ•˜๋ฉด ๋ฉˆ์ถ”๊ณ  ๋ฌป์Šต๋‹ˆ๋‹ค. ์ž‘์—… ์ƒ์„ธยท๊ทœ์น™ ํŽธ์ง‘๊ธฐ์—์„œ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๋ด‡ ์˜ˆ์‚ฐ ํ‚ค์˜ ์ž”์•ก์ด 20% ์•„๋ž˜๋ฉด ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋ฅผ ์ค‘์ง€ํ•ด ๋Œ€ํ™”์šฉ์œผ๋กœ ๋‚จ๊น๋‹ˆ๋‹ค.
  • ์ผ์‹œ ์ค‘์ง€: ๋ด‡ ์„ค์ • โ€บ ๋จผ์ € ๋ณด๋‚ด๋Š” ๋ฉ”์‹œ์ง€ โ€บ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… ์ผ์‹œ ์ค‘์ง€ ๋˜๋Š” ๋ด‡์—๊ฒŒ ์š”์ฒญํ•˜๋ฉด ์ž‘์—…ยท๊ทœ์น™ยทํ‘ธ์‹œ๋ฅผ ๋ณด๋ฅ˜ํ•˜๊ณ  ๋Œ€ํ™”๋Š” ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณด์กด: ์ž‘์—…ยท๊ธฐ๋ก์€ 30์ผ ๋ณด๊ด€ํ•˜๋ฉฐ 30์ผ ๋ฏธ์‚ฌ์šฉ ์ž‘์—…์€ ๋ณด๊ด€ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. 30์ผ ๋ฏธ์‚ฌ์šฉ ํด๋”๋Š” DSH ์„ธ์…˜ ํŒŒ์ผ(dsh/<bot>/sessions/)๊ณผ ํ•จ๊ป˜ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. SDK์— ์‚ญ์ œ ๊ธฐ๋Šฅ์ด ์—†์–ด ์•ฑ์ด ์ง์ ‘ ์ง€์šฐ๋ฉฐ ํ”„๋กœ์„ธ์Šค์— ์—ด๋ฆฐ ์„ธ์…˜์€ ๊ต์ฒด ํ›„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ๋ณ„๋„ ์งˆ๋ฌธยท์•Œ๋ฆผ์€ ์—†์Šต๋‹ˆ๋‹ค. 27์ผ์งธ ์‚ญ์ œ ์˜ˆ์ •์ผ์„ ์„ค์ •ํ•ด ์ž‘์—… ์ƒ์„ธ์— ํ‘œ์‹œํ•˜๋ฉฐ ๋ณด๊ด€์„ ๋ˆ„๋ฅด๋ฉด ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ •์ผ ์„ค์ • ํ›„ ์ตœ์†Œ 3์ผ ์ „์— ์‚ญ์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒ์„ธ์—์„œ ํด๋” ํฌ๊ธฐ๋ฅผ ๋ณด๊ณ  ํด๋”์™€ ํ•จ๊ป˜ ์ž‘์—…์„ ์‚ญ์ œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปดํ“จํ„ฐ ์‚ฌ์šฉ

๋ด‡ ์„ค์ •(์ •๋ณด ํŒจ๋„ โš™) โ†’ ์ปดํ“จํ„ฐ ์‚ฌ์šฉ์—์„œ ์ผœ๊ธฐยท๋„๊ธฐ, ๋ฐฑ์—”๋“œ, ์Šน์ธ ๋ชจ๋“œ๋ฅผ ์ •ํ•ฉ๋‹ˆ๋‹ค. /status์™€ ์„ค์ •์—์„œ ํ˜„์žฌ ๋ฐฑ์—”๋“œยท๊ฐ€์šฉ์„ฑยท์‚ฌ์šฉ ๋ถˆ๊ฐ€ ์ด์œ ๋ฅผ ๋ด…๋‹ˆ๋‹ค.

  • ๋ฐฑ์—”๋“œ
    • Cua Driver(๊ธฐ๋ณธ, ์„ธ ๋ฐ์Šคํฌํ†ฑ ํ”Œ๋žซํผ): ๊ณต์‹ ์‚ฌ์ „ ๋นŒ๋“œ cua-driver 0.37.0(MIT)์„ ์„ค์น˜ ํŒŒ์ผ์— ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ ์‹œ scripts/fetch-cua-driver.mjs๋กœ ํ”Œ๋žซํผยท์•„ํ‚คํ…์ฒ˜๋ณ„ ๋‹ค์šด๋กœ๋“œ ํ›„ SHA256์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ๋‚ด์žฅ MCP ์„œ๋ฒ„ cua-driver mcp๋กœ ์‹คํ–‰ํ•˜๋ฉฐ ํ•ญ์ƒ CUA_DRIVER_PERMISSION_MODE=bounded์™€ ๊ธฐ๋Šฅ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ ์šฉํ•˜๊ณ  --dangerously-bypass-approvals๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์‹ ํ™˜๊ฒฝ์—์„œ ๋น„๋ฐ€ ์ •๋ณด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ํ…”๋ ˆ๋ฉ”ํŠธ๋ฆฌ์™€ run_script๋ฅผ ๋•๋‹ˆ๋‹ค. ์ฐฝยท์Šคํฌ๋ฆฐ์ƒท ์ฝ๊ธฐ, ์•ฑ ์‹คํ–‰, ํด๋ฆญ, ์ž…๋ ฅ, ํ‚คยท๋‹จ์ถ•ํ‚ค, ์Šคํฌ๋กค, ๋Œ๊ธฐ, ๊ฐ’ ์„ค์ •, ๋ฉ”๋‰ด ๋“ฑ์˜ ํ•„์š”ํ•œ 24๊ฐœ ๋„๊ตฌ๋งŒ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธยทํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒยทํด๋ฆฝ๋ณด๋“œยท๋ธŒ๋ผ์šฐ์ € ์‚ฝ์ž…ยท๋…นํ™”ยท์—…๋ฐ์ดํŠธ ๋“ฑ์€ ๋ชจ๋ธ์— ๋ณด์ด์ง€ ์•Š๊ณ  ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” ์„ค์น˜๋œ GUI ์•ฑ(Linux .desktop, macOS /Applications, Windows ์‹œ์ž‘ ๋ฉ”๋‰ด)์„ ๋‚˜์—ดํ•˜๊ณ  ์ „์ฒด ํ™”๋ฉด ์ž…๋ ฅ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ตœ๋Œ€ 24์‹œ๊ฐ„ ์œ ํšจํ•˜๋ฉฐ ๋งŒ๋ฃŒ ์ „์— ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    • Codex Computer Use ๋ธŒ๋ฆฌ์ง€(์„ ํƒ, macOS ์ „์šฉ): kimi-computer-use์ž…๋‹ˆ๋‹ค. OpenAI Codex Computer Use์˜ ๋กœ์ปฌ ์„ค์น˜๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉด Cua Driver๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์Šน์ธ: ์ฝ๊ธฐยท์Šคํฌ๋ฆฐ์ƒทยทํด๋ฆญยท์ž…๋ ฅยทํ‚คยท์Šคํฌ๋กคยท๋Œ๊ธฐยท๊ฐ’ ์„ค์ •์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์Šน์ธ ์—†์ด ์ž๋™ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์ ์œผ๋กœ ํ™”๋ฉด ๋ณ€๊ฒฝ ์ „์— ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ฝ๊ธฐ๋Š” ์ž๋™์ž…๋‹ˆ๋‹ค. ์—…๊ทธ๋ ˆ์ด๋“œ ์‹œ ๊ธฐ๋ณธ ๋ด‡์„ ํฌํ•จํ•œ ๊ธฐ์กด ๋ด‡์€ ์ž๋™ ๋ชจ๋“œ๋กœ ์ด์ „ํ•ฉ๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์ „์šฉ ๋ด‡์€ ์ฝ๊ธฐ ๋„๊ตฌ๋งŒ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ํ”Œ๋žซํผ๋ณ„ ์‚ฌํ•ญ
    • macOS: ์‹œ์Šคํ…œ ์„ค์ • โ†’ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๋ฐ ๋ณด์•ˆ์—์„œ ์†์‰ฌ์šด ์‚ฌ์šฉยทํ™”๋ฉด ๊ธฐ๋ก์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. --direct ๋ชจ๋“œ๋กœ ์‹คํ–‰ํ•˜๋ฉฐ ์‹ค์ œ ๊ธฐ๊ธฐ ๊ฒ€์ฆ์€ ์•„์ง ์™„๋ฃŒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ถŒํ•œ์ด ์—†์œผ๋ฉด ์ปดํ“จํ„ฐ ์ œ์–ด ๋„๊ตฌ ํ˜ธ์ถœ์„ ๋ง‰๊ณ  ์ด๋ฒˆ ํ„ด์„ โ€˜๊ถŒํ•œ์ด ์—†์–ด ๊ณ„์†ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹คโ€™๋กœ ๋๋‚ด๋ฉฐ, ๋Œ€ํ™”์— ๋ถ€์กฑํ•œ ๊ถŒํ•œ๋งŒ ๋‹ด์€ ์นด๋“œ๋ฅผ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค(์‹œ์Šคํ…œ ๊ธฐ๋ณธ ์š”์ฒญ, ํ•ด๋‹น ์‹œ์Šคํ…œ ์„ค์ • ์—ด๊ธฐ, ๋‹ค์‹œ ํ™•์ธ. ํ™”๋ฉด ๊ธฐ๋ก์€ ๋ณดํ†ต ์•ฑ์„ ๋‹ค์‹œ ์—ด์–ด์•ผ ํ•˜๋ฉฐ ์นด๋“œ์—์„œ ๋ฐ”๋กœ ๋‹ค์‹œ ์—ด ์ˆ˜ ์žˆ๊ณ  ๋ณด๋‚ด์ง€ ์•Š์€ ์ดˆ์•ˆ๋„ ๋Œ์•„์˜ต๋‹ˆ๋‹ค). ์ฒ˜์Œ ์‹คํ–‰ํ•  ๋•Œ๋Š” ์•„๋ฌด ๊ถŒํ•œ๋„ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • Linux: X11์€ AT-SPI๋กœ ํ™”๋ฉด์„ ์ฝ์Šต๋‹ˆ๋‹ค(at-spi2-core ๋ฐ ์•ฑ์˜ ์ ‘๊ทผ์„ฑ ํ™œ์„ฑํ™” ํ•„์š”). Wayland๋Š” ๊ธฐ๋Šฅ์ด ์ œํ•œ๋˜์–ด XWayland ์•ฑ์˜ ์ „๊ฒฝ ์ฐฝ๋งŒ ์กฐ์ž‘ํ•˜๋ฉฐ ํ™”๋ฉด์— ์ด๋ฅผ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”ฝ ์„ธ์…˜(DISPLAY / WAYLAND_DISPLAY)์ด ์—†์œผ๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    • Windows: ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ ๋Œ€ํ™”ํ˜• ๋ฐ์Šคํฌํ†ฑ ์„ธ์…˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šคยท์˜ˆ์•ฝ ์ž‘์—…์˜ ๋น„๋Œ€ํ™”ํ˜• ์„ธ์…˜์€ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์Šคํฌ๋ฆฐ์ƒท์€ ๋น„์ „ ์ง€์› ๋ชจ๋ธ์—๋งŒ ๋ณด๋‚ด๋ฉฐ WeChat/Feishu์— ์ „๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•  ๋•Œ๋งŒ ํŒŒ์ผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • cua-perception, OmniParser(AGPL), Cua Spaces(FSL) ๊ตฌ์„ฑ ์š”์†Œ๋Š” ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Feishu ์•ฑ ์„ค์ •

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ์„ค์ • โ€บ ์ฑ„ํŒ… ์ฑ„๋„ โ†’ Feishu โ†’ ๊ณ„์ • ์ถ”๊ฐ€์—์„œ QR ์ฝ”๋“œ๋ฅผ ์Šค์บ”ํ•ด ๋ด‡ ์•ฑ์„ ๋งŒ๋“ค๊ณ  Feishu์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ์กด ๊ธฐ์—…์šฉ ์‚ฌ์šฉ์ž ์ง€์ • ์•ฑ์„ ์“ฐ๋ ค๋ฉด โ€˜๋‚ด ์•ฑ ์‚ฌ์šฉโ€™์„ ์„ ํƒํ•˜๊ณ  ๋‹ค์Œ์ฒ˜๋Ÿผ ์„ค์ •ํ•˜์„ธ์š”.

  1. Feishu Open Platform์—์„œ ๊ธฐ์—…์šฉ ์‚ฌ์šฉ์ž ์ง€์ • ์•ฑ์„ ๋งŒ๋“ค๊ณ  ๋ด‡ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‹ค์Œ ๊ถŒํ•œ์„ ์ผญ๋‹ˆ๋‹ค.
    • im:message.p2p_msg:readonly: ์‚ฌ์šฉ์ž๊ฐ€ ๋ด‡์—๊ฒŒ ๋ณด๋‚ธ ๊ฐœ์ธ ๋ฉ”์‹œ์ง€ ์ฝ๊ธฐ.
    • im:message:send_as_bot: ์•ฑ์œผ๋กœ ๋ฉ”์‹œ์ง€ ์ „์†ก.
    • cardkit:card:write: ์‹ค์‹œ๊ฐ„ ์‘๋‹ต ์นด๋“œ ์ƒ์„ฑยท๊ฐฑ์‹ .
    • im:message.history:readonly: ๋Œ€ํ™” ๊ธฐ๋ก ์ฝ๊ธฐ. ์ง€์† ์—ฐ๊ฒฐ์€ ์˜คํ”„๋ผ์ธ ์ค‘ ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ค์‹œ ๋ฐ€์–ด ์ฃผ์ง€ ์•Š์•„ ์‹œ์ž‘ยท์žฌ์—ฐ๊ฒฐ ์‹œ ์ตœ๊ทผ 7์ผ ํ™œ์„ฑ ๋Œ€ํ™”์—์„œ ์ตœ๊ทผ 24์‹œ๊ฐ„ ๋ฉ”์‹œ์ง€๋ฅผ ๋Œ€ํ™”๋‹น ์ตœ๋Œ€ 20๊ฐœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์—†์–ด๋„ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์€ ๋˜์ง€๋งŒ ๋ˆ„๋ฝ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด์ถฉํ•˜์ง€ ๋ชปํ•˜๋ฉฐ ์ด๋ฅผ ํ•œ ๋ฒˆ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.
  3. ์•ฑ์˜ ์„ค์ • โ€บ ์ฑ„ํŒ… ์ฑ„๋„ โ†’ Feishu โ†’ ๊ณ„์ • ์ถ”๊ฐ€ โ†’ ๋‚ด ์•ฑ ์‚ฌ์šฉ์— App ID / App Secret์„ ๋„ฃ๊ณ  ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ €์žฅํ•˜๋ ค๋ฉด ์ง€์† ์—ฐ๊ฒฐ์ด ๋จผ์ € ์˜จ๋ผ์ธ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  4. Events & callbacks์˜ ๊ตฌ๋… ๋ชจ๋“œ์—์„œ Receive events through persistent connection์„ ์„ ํƒํ•˜๊ณ  im.message.receive_v1 ์ด๋ฒคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  5. ๋ฒ„์ „์„ ๊ฒŒ์‹œํ•˜๊ณ  ๋ณธ์ธ์„ ์ด์šฉ ๊ฐ€๋Šฅ ๋ฒ”์œ„์— ๋„ฃ์€ ๋’ค ๋ณธ์ธ Feishu์—์„œ ํ•œ ์ค„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ํ›„ ์ฒซ ๋ฐœ์‹ ์ž๊ฐ€ Feishu ์†Œ์œ ์ž๊ฐ€ ๋ฉ๋‹ˆ๋‹ค(๋ด‡์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ ์ฐธ์กฐ).

ํ˜„์žฌ ๊ฐœ์ธ(p2p) ๋Œ€ํ™”๋งŒ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ๊ทธ๋ฃน ๋ฉ”์‹œ์ง€๋Š” ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

WeChat(iLink)

  • ์„ค์ • โ€บ ์ฑ„ํŒ… ์ฑ„๋„ โ†’ WeChat โ†’ ๊ณ„์ • ์ถ”๊ฐ€ โ†’ QR ์ฝ”๋“œ๋กœ ๋กœ๊ทธ์ธ์„ ์„ ํƒํ•œ ๋’ค WeChat์œผ๋กœ ์Šค์บ”ํ•˜๊ณ  ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” npm run weixin:login์„ ์‹คํ–‰ํ•˜๋ฉด ํ„ฐ๋ฏธ๋„์— QR ์ฝ”๋“œ๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ๋ฐ์ดํ„ฐ ํด๋”์— PNG๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์ธ ์ƒํƒœ, ๋™๊ธฐํ™” ์ปค์„œ, context_token์€ ๋ฐ์ดํ„ฐ ํด๋”์— ์ €์žฅํ•˜๋ฉฐ ์žฌ์‹œ์ž‘ ํ›„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
  • ํ”Œ๋žซํผ ์ œํ•œ: ์ˆ˜์‹  ๋ฉ”์‹œ์ง€๋งˆ๋‹ค 24์‹œ๊ฐ„ ๋‚ด ์ตœ๋Œ€ 10ํšŒ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์ด ๋๋‚˜๋ฉด ํ•œ ๋ฒˆ์— ๋ณด๋‚ด๋˜ 4,000์ž๋ฅผ ๋„˜์œผ๋ฉด ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ์ƒ์„ฑ ์ค‘์—๋Š” ์ž…๋ ฅ ์ค‘ ํ‘œ์‹œ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค.
  • ์ด๋ฏธ์ง€ยทํŒŒ์ผยท๋™์˜์ƒ: ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋‚ด๊ฑฐ๋‚˜ ์ธ์šฉํ•œ ์ž๋ฃŒ๋ฅผ WeChat CDN์—์„œ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ๋ณตํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค(ํŒŒ์ผ๋‹น ์ตœ๋Œ€ 50MB). ์—์ด์ „ํŠธ ๋ชจ๋“œ์—์„œ๋Š” ์ž‘์—… ๊ณต๊ฐ„ inbox/์— ์ €์žฅํ•˜๊ณ  ๋ฉ”์‹œ์ง€์— ๊ฒฝ๋กœ๋ฅผ ์ ์–ด ์ฝ๊ธฐยท์ฒ˜๋ฆฌยท์ƒ์„ฑ ์ฐธ๊ณ  ์ด๋ฏธ์ง€๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Claude, GPT-5/6, Gemini, Grok 4, Kimi K3, Muse Spark ๋“ฑ ๋น„์ „ ๋ชจ๋ธ์—๋Š” ์ด๋ฏธ์ง€ ์ž์ฒด๋„ ์ „๋‹ฌํ•˜๊ณ  ๊ทธ ์™ธ์—๋Š” ๊ฒฝ๋กœ๋งŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. Linux๋Š” Electron์—์„œ sharp๊ฐ€ ์ถฉ๋Œํ•ด ์•„์ง ์ด๋ฏธ์ง€๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ  ๊ฒฝ๋กœ๋งŒ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋ด‡์ด ์ „๋‹ฌํ•˜๋Š” ํŒŒ์ผ(present)์€ ์ด๋ฏธ์ง€๋‚˜ ํŒŒ์ผ ํ˜•ํƒœ๋กœ WeChat์— ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ์„ธ์…˜ ๋งŒ๋ฃŒ(์˜ค๋ฅ˜ -14) ์‹œ ์ฑ„๋„์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  ํ™”๋ฉด์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ๋‹ค์‹œ ์Šค์บ”ํ•˜๋ฉด ์žฌ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ

npm run typecheck
npm test            # ๋‹จ์œ„+์˜คํ”„๋ผ์ธ ์ข…๋‹จ ๊ฐ„(Feishu/iLink/Modelflare ๋ชจ์˜, ์ŠคํŠธ๋ฆฌ๋ฐยท์ค‘์ง€ ํฌํ•จ)+๊ฒŒ์ดํŠธ์›จ์ด ํ†ตํ•ฉ(์ปดํŒŒ์ผ๋œ magpie ํ•„์š”)
npm run docs:check  # README ๊ฒ€์‚ฌ: ์ž๋ฃŒ ์กด์žฌยทํฌ๊ธฐ, zh/en ๊ตฌ์กฐ, ์ƒ๋Œ€ ๋งํฌยท์•ต์ปค, ๊ธˆ์ง€ ๋ฌธ๊ตฌ, ๋Œ€์ฒด ํ…์ŠคํŠธ

README ์ž๋ฃŒ ๋ชฉ๋ก๊ณผ ๋…นํ™” ๊ทœ๊ฒฉ์€ docs/assets/README.md๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๋ผ์ด์„ ์Šค

MIT์ด๋ฉฐ LICENSE๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. magpie(MIT, ์ˆ˜์ •ํ•œ ํ™”๋ฉด ์Šคํƒ€์ผ ํฌํ•จ), Tencent openclaw-weixin(MIT) ๋“ฑ ์ œ3์ž ๊ตฌ์„ฑ ์š”์†Œ๋Š” THIRD_PARTY_NOTICES.md ๋ฐ ์„ค์ • โ†’ ์•ฑ ์ •๋ณด์— ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์Šคํ‚ฌ๊ณผ ๋Œ€ํ™” ๊ธฐ๋ก ๊ฒ€์ƒ‰

์‚ฌ์šฉ๋ฒ•๊ณผ ZIP ํ˜•์‹์€ ์Šคํ‚ฌ ์•ˆ๋‚ด๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. src/skills/archive.ts๋Š” ๊ฒฝ๋กœ, ์••์ถ• ํ•ด์ œ ์ œํ•œ, SKILL.md๋ฅผ ๊ฒ€์ฆํ•˜๊ณ  service.ts๋Š” ๋ด‡๋ณ„ ํŒจํ‚ค์ง€, ํ™œ์„ฑํ™” ์ƒํƒœ, ๋ฒ„์ „ ์‹๋ณ„๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. src/web/skills.ts๋Š” ๋ฏธ๋ฆฌ๋ณด๊ธฐ์™€ ๊ด€๋ฆฌ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. DSH๊ฐ€ ๋Œ€๊ธฐ ์ƒํƒœ์ผ ๋•Œ ํ™œ์„ฑํ™”๋œ ์Šคํ‚ฌ์„ ๋ฐฐ์น˜ํ•˜๋ฏ€๋กœ ์ง„ํ–‰ ์ค‘์ธ ๋Œ€ํ™”, ํ•˜์œ„ ์—์ด์ „ํŠธ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ช…๋ น์„ ์ค‘๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์นดํƒˆ๋กœ๊ทธ Bot ์—…๋ฐ์ดํŠธ ์‹œ src/botkit/installer.ts๊ฐ€ ์ด๋ฆ„ ์ถฉ๋Œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

src/store/chat-search.ts๋Š” SQLite ๋ฉ”์‹œ์ง€ ๊ฒ€์ƒ‰ ์ƒ‰์ธ, ํ•„ํ„ฐ, ํŽ˜์ด์ง€ ๋‚˜๋ˆ„๊ธฐ, ์›๋ž˜ ๋ฉ”์‹œ์ง€์˜ ์ฃผ๋ณ€ ๋ฌธ๋งฅ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๊ฒ€์ƒ‰์€ ui/screens/message-search.js, ํ˜„์žฌ ๋Œ€ํ™” ๊ฒ€์ƒ‰์€ ui/components/chat-search.js์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰์€ ๋กœ์ปฌ DB๋ฅผ ์ง์ ‘ ์ฝ์œผ๋ฉฐ ๋ชจ๋ธ์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ ํ…Œ์ŠคํŠธ๋Š” test/skills*.test.ts์™€ test/chat-search*.test.ts์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๊ฒ€์ฆ์šฉ Chromium ๊ฒฝ๋กœ๋Š” AMB_TEST_CHROME์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DSH๊ฐ€ ์žˆ์œผ๋ฉด ์Šคํ‚ฌ ๋ฐœ๊ฒฌ, ๋กœ๋”ฉ, ์ž๋ฃŒ ์ฝ๊ธฐ, ์ž‘์—… ์ค‘ ๋น„ํ™œ์„ฑํ™”๋„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.