์ฝ˜ํ…์ธ ๋กœ ์ด๋™
OmniRoute source

๐Ÿ—œ๏ธ Prompt Compression Guide โ€” OmniRoute (ํ•œ๊ตญ์–ด)

์••์ถ•์„ ์ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฉ”์‹œ์ง€๊ฐ€ ๋ณ€๊ฒฝ ์—†์ด ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์•ˆ์ „ํ•œ ๋ชจ๋“œ๋กœ, ์˜๋ฏธ๋Š” ์ „ํ˜€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์„œ์‹๋งŒ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ฒ• ์„ค๋ช…
collapseWhitespace ์—ฐ์†๋œ ๋นˆ ์ค„๊ณผ ์ค„ ๋ ๊ณต๋ฐฑ ๋ณ‘ํ•ฉ
dedupSystemPrompt ์ค‘๋ณต ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ์ œ๊ฑฐ
compressToolResults ์žฅํ™ฉํ•œ ๋„๊ตฌ/ํ•จ์ˆ˜ ์ถœ๋ ฅ ์••์ถ•
removeRedundantContent ๋ฐ˜๋ณต๋˜๋Š” ์ง€์นจ ์ œ๊ฑฐ
replaceImageUrls base64 ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ URI ๋‹จ์ถ•

์ ํ•ฉํ•œ ์šฉ๋„: ์ƒ์‹œ ์‚ฌ์šฉ, ์•ˆ์ „์ด ์ค‘์š”ํ•œ ์›Œํฌํ”Œ๋กœ.

Caveman์—์„œ ์˜๊ฐ์„ ๋ฐ›์•„ ์˜๋ฏธ๋ฅผ ๋ณด์กดํ•˜๋ฉด์„œ ๊ตฐ๋”๋”๊ธฐ ๋‹จ์–ด์™€ ์žฅํ™ฉํ•œ ํ‘œํ˜„์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

  • ๊ตฐ๋”๋”๊ธฐ ๋‹จ์–ด ์ œ๊ฑฐ(โ€œpleaseโ€, โ€œI thinkโ€, โ€œbasicallyโ€, โ€œactuallyโ€)
  • ์žฅํ™ฉํ•œ ๋ฌธ๊ตฌ ์ถ•์•ฝ(โ€œin order toโ€ โ†’ โ€œtoโ€, โ€œas a result ofโ€ โ†’ โ€œbecauseโ€)
  • ์™„๊ณกํ•˜๊ณ  ์ •์ค‘ํ•œ ํ‘œํ˜„ ์ œ๊ฑฐ(โ€œWould you mindโ€ฆโ€, โ€œIf you could possiblyโ€ฆโ€)
  • ์ฝ”๋”ฉ ํ”„๋กฌํ”„ํŠธ์— ๋งž๊ฒŒ ์กฐ์ •๋œ 30๊ฐœ ์ด์ƒ์˜ ์ •๊ทœ์‹ ๊ทœ์น™

์ ํ•ฉํ•œ ์šฉ๋„: ์ผ์ƒ์ ์ธ ์ฝ”๋”ฉ ์›Œํฌํ”Œ๋กœ, ๋น„์šฉ์„ ์ค‘์‹œํ•˜๋Š” ํŒ€.

๊ธด ์„ธ์…˜์„ ์œ„ํ•œ ์Šค๋งˆํŠธ ๊ธฐ๋ก ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

  • ๋ฉ”์‹œ์ง€ ์—์ด์ง• โ€” ์˜ค๋ž˜๋œ ๋ฉ”์‹œ์ง€์ผ์ˆ˜๋ก ์ ์ง„์ ์œผ๋กœ ๋” ๋งŽ์ด ์••์ถ•
  • ๋„๊ตฌ ๊ฒฐ๊ณผ ์š”์•ฝ โ€” ๊ธด ๋„๊ตฌ ์ถœ๋ ฅ์„ ์š”์•ฝ์œผ๋กœ ๋Œ€์ฒด
  • ๊ตฌ์กฐ์  ๋ฌด๊ฒฐ์„ฑ ๋ณดํ˜ธ ์žฅ์น˜ โ€” tool_use + tool_result ์Œ์˜ ์ผ๊ด€์„ฑ ์œ ์ง€
  • ์ปจํ…์ŠคํŠธ ์ฐฝ ์ธ์‹ โ€” ๋ชจ๋ธ๋ณ„ ํ† ํฐ ์ œํ•œ ์ค€์ˆ˜

์ ํ•ฉํ•œ ์šฉ๋„: ์žฅ์‹œ๊ฐ„ ๋””๋ฒ„๊น… ์„ธ์…˜, ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค.

ํ† ํฐ์ด ๋งค์šฐ ์ค‘์š”ํ•œ ์ƒํ™ฉ์„ ์œ„ํ•œ ์ตœ๋Œ€ ์••์ถ• ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค.

  • ํœด๋ฆฌ์Šคํ‹ฑ ๊ฐ€์ง€์น˜๊ธฐ โ€” ๊ด€๋ จ์„ฑ ์ž„๊ณ„๊ฐ’๋ณด๋‹ค ๋‚ฎ์€ ๋ฉ”์‹œ์ง€ ์ œ๊ฑฐ
  • ์ฝ”๋“œ ๋ธ”๋ก ์ถ•์†Œ โ€” ๋ฐ˜๋ณต์ ์ธ ์ฝ”๋“œ ์˜ˆ์ œ ์••์ถ•
  • ์ด์ง„ ํƒ์ƒ‰ ์ ˆ๋‹จ โ€” ์ปจํ…์ŠคํŠธ ์ฐฝ์— ๋งž๋Š” ์ตœ์ ์˜ ์ ˆ๋‹จ ์ง€์  ํƒ์ƒ‰
  • Aggressive ๋ชจ๋“œ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ ํฌํ•จ

์ ํ•ฉํ•œ ์šฉ๋„: ์ปจํ…์ŠคํŠธ ์ œํ•œ์— ๋ฐ˜๋ณต์ ์œผ๋กœ ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ.

RTK ๋ชจ๋“œ๋Š” ์ฝ”๋”ฉ ์—์ด์ „ํŠธ ์„ธ์…˜์— ๋‚˜ํƒ€๋‚˜๋Š” ์žฅํ™ฉํ•œ ๋„๊ตฌ ์ถœ๋ ฅ์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • git status, git diff, git log, ํ…Œ์ŠคํŠธ ์‹คํ–‰๊ธฐ, TypeScript/Vite/Webpack ๋นŒ๋“œ, ESLint/Biome/Prettier, npm ๊ฐ์‚ฌ/์„ค์น˜, Docker ๋กœ๊ทธ, ์ธํ”„๋ผ ์ถœ๋ ฅ ๋ฐ ์ผ๋ฐ˜ ์…ธ ์ถœ๋ ฅ๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด/์ถœ๋ ฅ ํด๋ž˜์Šค ๊ฐ์ง€
  • open-sse/services/compression/engines/rtk/filters/์˜ JSON ํ•„ํ„ฐ ํŒฉ ์ ์šฉ
  • ํ”„๋กœ์ ํŠธ ๋˜๋Š” ์ „์—ญ filters.toml ํŒŒ์ผ์—์„œ RTK TOML ์Šคํ‚ค๋งˆ v1 ํ•„ํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉฐ, ์ธ๋ผ์ธ ํ…Œ์ŠคํŠธ ๊ฒ€์ฆ ๋ฐ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์— ๋Œ€ํ•œ ์‹ ๋ขฐ ๊ฒŒ์ดํŒ… ์ ์šฉ
  • ์ธ๋ผ์ธ ๊ฒ€์ฆ ์ƒ˜ํ”Œ์ด ํฌํ•จ๋œ 49๊ฐœ์˜ ๊ธฐ๋ณธ ์ œ๊ณต ํ•„ํ„ฐ ์ œ๊ณต
  • ANSI ์ œ์–ด ์‹œํ€€์Šค, ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„, ๋ฐ˜๋ณต๋˜๋Š” ์ค„ ๋ฐ ์‹คํ–‰ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋…ธ์ด์ฆˆ ์ œ๊ฑฐ
  • ์‹คํŒจ, ์˜ค๋ฅ˜, ๊ฒฝ๊ณ , ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ, ์š”์•ฝ ๋ฐ ๊ธด ์ถœ๋ ฅ์˜ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„ ๋ณด์กด
  • ์‹ ๋ขฐ ๊ฒŒ์ดํŒ…์ด ์ ์šฉ๋œ ํ”„๋กœ์ ํŠธ ํ•„ํ„ฐ, ์ „์—ญ ํ•„ํ„ฐ ๋ฐ ์„ ํƒ์ ์ธ ์ˆ˜์ • ์ฒ˜๋ฆฌ๋œ ์›์‹œ ์ถœ๋ ฅ ๋ณต๊ตฌ ์ง€์›

์ ํ•ฉํ•œ ์šฉ๋„: ์…ธ, ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, git, grep ๋ฐ ํŒŒ์ผ ์ถœ๋ ฅ ๊ธฐ๋ก์ด ํฌํ•จ๋œ ์—์ด์ „ํŠธ ์„ธ์…˜.

Stacked ๋ชจ๋“œ๋Š” ์—ฌ๋Ÿฌ ์••์ถ• ์—”์ง„์„ ๊ฒฐ์ •๋ก ์  ์ˆœ์„œ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํŒŒ์ดํ”„๋ผ์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

RTK -> Caveman

์ด ์ˆœ์„œ๋Š” ๋จผ์ € ํ„ฐ๋ฏธ๋„/๋„๊ตฌ ์ถœ๋ ฅ์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“  ๋‹ค์Œ, ๋‚จ์€ ์ž์—ฐ์–ด ํ”„๋กฌํ”„ํŠธ์— Caveman ์˜๋ฏธ ์••์ถ•์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. Stacked ํŒŒ์ดํ”„๋ผ์ธ์€ ์ „์—ญ์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ผ์šฐํŒ… ์ฝค๋ณด์— ํ• ๋‹น๋œ ์••์ถ• ์ฝค๋ณด๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ํ•ฉํ•œ ์šฉ๋„: ๋Œ€๊ทœ๋ชจ ๋„๊ตฌ ๋กœ๊ทธ์™€ ์‚ฌ์šฉ์ž ์ง€์นจ ๋˜๋Š” ์–ด์‹œ์Šคํ„ดํŠธ ์š”์•ฝ์ด ํ•จ๊ป˜ ํฌํ•จ๋œ ํ˜ผํ•ฉ ์ปจํ…์ŠคํŠธ.


OmniRoute๋Š” ์—…์ŠคํŠธ๋ฆผ ํ”„๋กœ์ ํŠธ ๋ฒค์น˜๋งˆํฌ์™€ OmniRoute ์ž์ฒด ์—”์ง„ ์กฐํ•ฉ์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์ถœ์ฒ˜๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์••์ถ• ์ ˆ๊ฐ๋ฅ ์„ ๋ฌธ์„œํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ ์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉ๋œ ์—…์ŠคํŠธ๋ฆผ README ์ˆ˜์น˜
Caveman ์ถœ๋ ฅ ํ† ํฐ ~75% ๊ฐ์†Œ, ๋ฒค์น˜๋งˆํฌ ํ‰๊ท  ์ถœ๋ ฅ ์ ˆ๊ฐ๋ฅ  65%, ๋ฒ”์œ„ 22-87%, ์ž…๋ ฅ ์••์ถ• ๋„๊ตฌ ~46%
RTK ๋ช…๋ น ์ถœ๋ ฅ ์ ˆ๊ฐ๋ฅ  60-90%; ์ƒ˜ํ”Œ ์„ธ์…˜ ํ† ํฐ ~118,000 -> ~23,900, ์ฆ‰ 79.7% ์ ˆ๊ฐ(~80%)

์ค‘๋ณต๋˜๋Š” ๋„๊ตฌ/์ปจํ…์ŠคํŠธ ํŽ˜์ด๋กœ๋“œ์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ OmniRoute ์กฐํ•ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—”์ง„์„ ์—ฐ๊ณ„ํ•ฉ๋‹ˆ๋‹ค.

RTK -> Caveman

๊ฒฐํ•ฉ ์ ˆ๊ฐ๋ฅ ์€ ๋ง์…ˆ ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ ๊ณฑ์…ˆ ๋ฐฉ์‹์œผ๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.

๊ฒฐํ•ฉ๊ฐ’ = 1 - (1 - RTK ์ ˆ๊ฐ๋ฅ ) * (1 - Caveman ์ž…๋ ฅ ์ ˆ๊ฐ๋ฅ )
ํ‰๊ท  = 1 - (1 - 0.80) * (1 - 0.46) = 89.2%
๋ฒ”์œ„ = 1 - (1 - 0.60..0.90) * (1 - 0.46) = 78.4-94.6%

์ด 78-95% ์ˆ˜์น˜๋Š” RTK์™€ Caveman์ด ๋™์ผํ•œ ์ž…๋ ฅ/์ปจํ…์ŠคํŠธ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋ชจ๋‘ ์ค„์ผ ์ˆ˜ ์žˆ์„ ๋•Œ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. Caveman ์‘๋‹ต ์ถœ๋ ฅ ๋ชจ๋“œ๋Š” ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค. ์ด ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•œ ๊ฒฝ์šฐ Caveman ์ž์ฒด ์ถœ๋ ฅ ์ ˆ๊ฐ๋ฅ (ํ‰๊ท  65%, ๋Œ€ํ‘œ ์ˆ˜์น˜ ~75%, ๋ฒ”์œ„ 22-87%)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ๊ธˆ ์ ˆ๊ฐ๋ฅ ์€ ํ”„๋กฌํ”„ํŠธ์™€ ์ถœ๋ ฅ์˜ ๊ตฌ์„ฑ ๋น„์œจ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

15-95%๋ผ๋Š” ๋Œ€ํ‘œ ๋ฒ”์œ„๋Š” ์‹ค์ œ ์ˆ˜์น˜์ด์ง€๋งŒ, ๋ฐ˜๋ณต๋˜๋Š” ์˜ค๋ฅ˜ ์ค„, ๋™์ผํ•œ ๊ฒฝ๊ณ ๋ฅผ ์Ÿ์•„๋‚ด๋Š” ๋นŒ๋“œ ๋กœ๊ทธ, ์ง€๋‚˜์น˜๊ฒŒ ํฐ grep/ํŒŒ์ผ ์ฝ๊ธฐ ๋คํ”„์™€ ๊ฐ™์€ ์ค‘๋ณต๋˜๊ฑฐ๋‚˜ ์žฅํ™ฉํ•œ ์ฝ˜ํ…์ธ ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์š”์ฒญ์—์„œ ๊ทธ๋งŒํผ ์ ˆ๊ฐ๋œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

์‹ค์ฆ์ ์œผ๋กœ ๊ฒ€์ฆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(tests/unit/compression/stacked-compression-tool-result-savings.test.ts). ๋™์ผํ•œ ์˜ค๋ฅ˜ ์ค„ 300๊ฐœ๊ฐ€ ํฌํ•จ๋œ Anthropic ํ˜•์‹์˜ tool_result ๋ธ”๋ก์„ ๋Œ€์ƒ์œผ๋กœ stacked(RTK + Caveman)๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ, **ํ† ํฐ ์ ˆ๊ฐ๋ฅ  95.93% / ๋ฌธ์ž ์ ˆ๊ฐ๋ฅ  96.26%**๋ฅผ ๊ธฐ๋กํ•˜์—ฌ ๋ช…์‹œ๋œ ๋ฒ”์œ„์— ์ •ํ™•ํžˆ ๋“ค์–ด์™”์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์ธ ๋น„์ค‘๋ณต ๋„๊ตฌ ์ถœ๋ ฅ(๊น”๋”ํ•œ grep ์ผ์น˜ ๋ชฉ๋ก, ์งง์€ ํŒŒ์ผ ์ฝ๊ธฐ, ํ‰๋ฒ”ํ•œ ๋Œ€ํ™” ํ…์ŠคํŠธ)์— ๋™์ผํ•œ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰ํ•˜๋ฉด ์˜ˆ์ƒ๋Œ€๋กœ ๊ฑฐ์˜ 0์— ๊ฐ€๊นŒ์šด ์ ˆ๊ฐ๋ฅ ์ด ๋‚˜์˜ต๋‹ˆ๋‹ค. ์ œ๊ฑฐํ•  ๋งŒํ•œ ๋ฐ˜๋ณต ๋‚ด์šฉ์ด ์—†๊ณ , validateCompression()(validation.ts)์ด ์ฝ”๋“œ ๋ธ”๋ก, URL, ์ œ๋ชฉ, ๋ฒ„์ „ ๋˜๋Š” ALL-CAPS ์ƒ์ˆ˜ ์‹๋ณ„์ž๋ฅผ ๋ˆ„๋ฝํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์žฌ์ž‘์„ฑ์„ ์ „์†กํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๋Š” ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ์˜ˆ์ƒ๋œ ์•ˆ์ „ ๋™์ž‘์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ ๊น”๋”ํ•œ ํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜ grep์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ฝ”๋”ฉ ์„ธ์…˜์€ ์••์ถ•์„ ์™„์ „ํžˆ ํ™œ์„ฑํ™”ํ•˜๋”๋ผ๋„ ์ด ์ ˆ๊ฐ๋ฅ ์ด ํฌ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹คํŒจ ๋ฃจํ”„๋‚˜ ์žฅํ™ฉํ•œ ๋ฆฐํ„ฐ ์ถœ๋ ฅ์„ ๋งŒ๋‚˜๋Š” ์„ธ์…˜์—์„œ๋Š” ํ•ด๋‹น ํŠธ๋ž˜ํ”ฝ์— ๋Œ€ํ•ด ์ „์ฒด 78-95% ๋ฒ”์œ„์˜ ์ ˆ๊ฐ๋ฅ ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ์„ธ์…˜์˜ ๋‚ฎ์€ ์ด ์ ˆ๊ฐ๋ฅ ์„ ์••์ถ•์ด ์ž˜๋ชป ๊ตฌ์„ฑ๋˜์—ˆ๋‹ค๋Š” ์ฆ๊ฑฐ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ๋จผ์ € ๊ธฐ๋ฐ˜ ๋„๊ตฌ ์ถœ๋ ฅ์ด ์‹ค์ œ๋กœ ์ค‘๋ณต๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.


์••์ถ• ๋ฏธ์‚ฌ์šฉ: LLM์— 47K ํ† ํฐ ์ „์†ก
Lite ์‚ฌ์šฉ: 40K ํ† ํฐ ์ „์†ก (15% ์ ˆ๊ฐ โ€” ์•ˆ์ „ํ•œ ์ƒ์‹œ ์ ์šฉ)
Standard ์‚ฌ์šฉ: 33K ํ† ํฐ ์ „์†ก (30% ์ ˆ๊ฐ โ€” caveman-speak ๊ทœ์น™)
Aggressive ์‚ฌ์šฉ: 24K ํ† ํฐ ์ „์†ก (50% ์ ˆ๊ฐ โ€” ์—์ด์ง• + ์š”์•ฝ)
Ultra ์‚ฌ์šฉ: 12K ํ† ํฐ ์ „์†ก (75% ์ ˆ๊ฐ โ€” ํœด๋ฆฌ์Šคํ‹ฑ ๊ฐ€์ง€์น˜๊ธฐ)
RTK ์‚ฌ์šฉ: 19K-5K ํ† ํฐ ์ „์†ก (๋ช…๋ น/๋„๊ตฌ ์ถœ๋ ฅ์—์„œ 60-90% ์ ˆ๊ฐ)
Stacked ์‚ฌ์šฉ: 10K-2.5K ํ† ํฐ ์ „์†ก (์ ์šฉ ๊ฐ€๋Šฅํ•œ RTK+Caveman ๋ฒ”์œ„์—์„œ 78-95% ์ ˆ๊ฐ)

Dashboard โ†’ Context & Cache๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค:

  • Caveman โ€” ๋ชจ๋“œ ์„ ํƒ, ์–ธ์–ด ํŒฉ, ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐ ์ „์—ญ ๊ธฐ๋ณธ๊ฐ’
  • RTK โ€” ๋ช…๋ น-ํ•„ํ„ฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ, RTK ์•ˆ์ „ ์„ค์ • ๋ฐ ํ•„ํ„ฐ ์นดํƒˆ๋กœ๊ทธ
  • Compression Combos โ€” ๋ผ์šฐํŒ… ์ฝค๋ณด์— ํ• ๋‹น๋œ ๋ช…๋ช…๋œ ์—”์ง„ ํŒŒ์ดํ”„๋ผ์ธ
  • Auto-Trigger Threshold โ€” ํ† ํฐ ์ˆ˜๊ฐ€ ์ž„๊ณ„๊ฐ’์„ ์ดˆ๊ณผํ•  ๋•Œ ์ž๋™์œผ๋กœ ์••์ถ•์„ ์‹œ์ž‘

Dashboard โ†’ Context & Cache โ†’ Compression Combos์—์„œ ๋ผ์šฐํŒ… ์ฝค๋ณด์— ์••์ถ• ์ฝค๋ณด๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค:

Combo: "free-tier-fallback"
Compression Combo: "coding-agent-stack"
Pipeline: RTK -> Caveman
Targets:
1. if/kimi-k2.7-code
2. if/qwen3.8-max-preview

์ด๋ฅผ ํ†ตํ•ด ์œ ๋ฃŒ ๊ตฌ๋…์—์„œ๋Š” ๋ผ์ดํŠธ ๋ชจ๋“œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ฌด๋ฃŒ/์ฝ”๋”ฉ ์ œ๊ณต์—…์ฒด์—์„œ ์Šคํƒํ˜• ์••์ถ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด โ€œ์ฝค๋ณด๋ณ„ ์žฌ์ •์˜โ€ ํ• ๋‹น์€ ๋ผ์šฐํŒ… ์ฝค๋ณด ์••์ถ• ๋ชจ๋“œ ์žฌ์ •์˜(Default/Off/Lite/Standard/Aggressive/Ultra)์™€๋Š” ๋‹ค๋ฅธ ์ œ์–ด ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์žฌ์ •์˜๋Š” ๋ช…๋ช…๋œ ์••์ถ• ์ฝค๋ณด ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ ํƒํ•˜์ง€ ์•Š๊ณ , resolveCompressionPlan์ด ์ฐธ์กฐํ•˜๋Š” compressionMode ํ•„๋“œ๋งŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฝค๋ณด ์นด๋“œ(Dashboard โ†’ Combos) ๋˜๋Š” #6760 ์ดํ›„ Dashboard โ†’ Context & Cache โ†’ Compression Combos์˜ โ€œAssign to routingโ€ ๋ชฉ๋ก์—์„œ ํŒŒ์ดํ”„๋ผ์ธ ํ• ๋‹น ์ฒดํฌ๋ฐ•์Šค ๋ฐ”๋กœ ์˜†์— ์žˆ๋Š” ๋ผ์šฐํŒ… ์ฝค๋ณด๋ณ„๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ์ธํ„ฐํŽ˜์ด์Šค ๋ชจ๋‘ ๋™์ผํ•œ PUT /api/combos/{id} ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๋‹จ์ผ ์š”์ฒญ์— ๋Œ€ํ•œ ์••์ถ• ๊ณ„ํš์„ ์žฌ์ •์˜ํ•˜๋ ค๋ฉด x-omniroute-compression ์š”์ฒญ ํ—ค๋”๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๋ผ์šฐํŒ… ์ฝค๋ณด ์žฌ์ •์˜, ํ™œ์„ฑ ํ”„๋กœํ•„, ์ž๋™ ํŠธ๋ฆฌ๊ฑฐ ๋ฐ ํŒจ๋„ ๊ธฐ๋ณธ๊ฐ’์„ ๋Šฅ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ’์€ ๋ฌด์‹œ๋˜๋ฉฐ(์š”์ฒญ์ด ๊ฑฐ๋ถ€๋˜์ง€ ์•Š์Œ) ์ „์—ญ ๋งˆ์Šคํ„ฐ ์Šค์œ„์น˜๋Š” ์—ฌ์ „ํžˆ ๋ชจ๋“  ๊ฒƒ์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ „์—ญ์ ์œผ๋กœ ์••์ถ•์ด ๊บผ์ ธ ์žˆ์œผ๋ฉด ํ—ค๋”๊ฐ€ ์••์ถ•์„ ์ผค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ’:

๊ฐ’ ํšจ๊ณผ
off ์ด ์š”์ฒญ์— ๋Œ€ํ•œ ์••์ถ• ์—†์Œ.
default ํŒจ๋„์—์„œ ํŒŒ์ƒ๋œ ๊ธฐ๋ณธ ํ”„๋กœํ•„(ํ™œ์„ฑ ํ”„๋กœํ•„ ๋ฌด์‹œ). ์†์‹ค ์—”์ง„์€ ๊บผ์ง„ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
safe ํ—ค๋”๋ฅผ ์ƒ๋žตํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผ: ์ค‘๋ณต ์ œ๊ฑฐ ๋ฐ ๊ณต๋ฐฑ ์ ‘๊ธฐ๋งŒ ์ ์šฉ.
allow-lossy ์š”์•ฝ, ๊ด€๋ จ์„ฑ ํ•„ํ„ฐ ๋ฐ ์Šคํƒ€์ผ ์žฌ์ž‘์„ฑ์„ ํฌํ•จํ•˜์—ฌ ์ด ์š”์ฒญ์˜ ์—ฐ์‚ฐ์ž ๊ณ„ํš์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
engine:<id> ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ ๋‹จ์ผ ์—”์ง„, ์˜ˆ: engine:rtk. ์ด๋Š” ํ•ด๋‹น ์—”์ง„์— ๋Œ€ํ•œ ์š”์ฒญ๋ณ„ ์˜ตํŠธ์ธ์ž…๋‹ˆ๋‹ค.
<combo> ๋ช…๋ช…๋œ ์ฝค๋ณด๋กœ, ๋จผ์ € ์ด๋ฆ„(๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์Œ)์œผ๋กœ ์ผ์น˜์‹œํ‚จ ๋‹ค์Œ ID๋กœ ์ผ์น˜์‹œํ‚ต๋‹ˆ๋‹ค.

allow-lossy, engine:<id> ๋˜๋Š” ๋ช…๋ช…๋œ ์ฝค๋ณด๊ฐ€ ์—†์œผ๋ฉด ์†์‹ค ์—”์ง„์€ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์••์ถ•์ด ์ผœ์ ธ ์žˆ์„ ๋•Œ ์š”์ฒญ์€ ์—ฌ์ „ํžˆ ์„ธ์…˜ ์ค‘๋ณต ์ œ๊ฑฐ ๋ฐ ๊ณต๋ฐฑ ์ ‘๊ธฐ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

์ ์šฉ๋œ ๊ณ„ํš์€ X-OmniRoute-Compression: &lt;mode&gt;; source=<source> ์‘๋‹ต ํ—ค๋”์— ๋ฐ˜์˜๋˜๋ฉฐ, ์—ฌ๊ธฐ์„œ <source>๋Š” request-header, routing-override, active-profile, auto-trigger, default ๋˜๋Š” off ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

ํ„ฐ๋ฏธ๋„ ์ฐฝ
# ์••์ถ• ์„ค์ • ๊ฐ€์ ธ์˜ค๊ธฐ
curl http://localhost:20128/api/settings/compression
# ์••์ถ• ์„ค์ • ์—…๋ฐ์ดํŠธ
curl -X PUT http://localhost:20128/api/settings/compression \
-H "Content-Type: application/json" \
-d '{"defaultMode":"stacked","autoTriggerMode":"stacked","autoTriggerTokens":32000}'
# ํŠน์ • RTK/์Šคํƒํ˜• ํŽ˜์ด๋กœ๋“œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
curl -X POST http://localhost:20128/api/compression/preview \
-H "Content-Type: application/json" \
-d '{"mode":"rtk","messages":[{"role":"tool","content":"npm test output here"}]}'
# RTK ํ•„ํ„ฐ ํŒฉ ๋ชฉ๋ก
curl http://localhost:20128/api/context/rtk/filters
# ์„ ํƒ์  ๋ช…๋ น ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ RTK ์ง์ ‘ ํ…Œ์ŠคํŠธ
curl -X POST http://localhost:20128/api/context/rtk/test \
-H "Content-Type: application/json" \
-d '{"command":"npm test","text":"FAIL tests/example.test.ts\nError: boom"}'

์••์ถ• ์—”์ง„์€ ํ•ญ์ƒ ๋‹ค์Œ ํ•ญ๋ชฉ์„ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค:

  • โœ… ์ฝ”๋“œ ๋ธ”๋ก(ํŽœ์Šค ๋ฐ ์ธ๋ผ์ธ)
  • โœ… URL ๋ฐ ํŒŒ์ผ ๊ฒฝ๋กœ
  • โœ… JSON ๊ตฌ์กฐ ๋ฐ ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ
  • โœ… ์‹๋ณ„์ž ๋ฐ ๋ณดํ˜ธ๋˜๋Š” ๊ธฐ์ˆ  ํ† ํฐ
  • โœ… ์ˆ˜ํ•™ ํ‘œํ˜„์‹
  • โœ… ๋„๊ตฌ/ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ •์˜
  • โœ… ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ(๋ผ์ดํŠธ ๋ชจ๋“œ)

RTK ์›์‹œ ์ถœ๋ ฅ ๋ณต๊ตฌ ๊ธฐ๋Šฅ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๊ธฐ ์ „์— ์ผ๋ฐ˜์ ์ธ API ํ‚ค, bearer ํ† ํฐ, Slack ํ† ํฐ, AWS ์•ก์„ธ์Šค ํ‚ค, ๋น„๋ฐ€๋ฒˆํ˜ธ, ํ† ํฐ ๋ฐ ๋น„๋ฐ€ ์ •๋ณด๋ฅผ ๋งˆ์Šคํ‚นํ•ฉ๋‹ˆ๋‹ค.


์••์ถ•๋œ ๋ชจ๋“  ์š”์ฒญ์—๋Š” ์„œ๋ฒ„ ๋กœ๊ทธ์— ํ†ต๊ณ„๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค:

{
"originalTokens": 47200,
"compressedTokens": 40120,
"savingsPercent": 15.0,
"techniquesUsed": ["collapseWhitespace", "dedupSystemPrompt"],
"mode": "lite",
"engine": "caveman",
"compressionComboId": "coding-agent-stack",
"durationMs": 0.8,
"rtkRawOutputPointers": []
}

๋‹จ๊ณ„ ๋ชจ๋“œ ์ƒํƒœ
1๋‹จ๊ณ„ Off, Lite โœ… ์ถœ์‹œ๋จ
2๋‹จ๊ณ„ Standard, Aggressive, Ultra โœ… ์ถœ์‹œ๋จ
3๋‹จ๊ณ„ RTK, Stacked, Compression Combos โœ… ์ถœ์‹œ๋จ
4๋‹จ๊ณ„ Output Styles, SLM-tier Ultra, eval harness โœ… ์ถœ์‹œ๋จ
4C๋‹จ๊ณ„ ์ ์‘ํ˜• ์ปจํ…์ŠคํŠธ ์˜ˆ์‚ฐ (โ€œ๋‹ค์ด์–ผโ€) โ€” ์ปดํ“จํŒ… ์—”์ง„ + API (contextBudget on PUT /api/settings/compression) + ๋Œ€์‹œ๋ณด๋“œ ๋ชจ๋“œ/์ •์ฑ… ์ œ์–ด โœ… ์ถœ์‹œ๋จ

Standard ๋ชจ๋“œ ์••์ถ• ๊ทœ์น™์€ JuliusBrussee(โญ 51K+)์˜ **Caveman**์—์„œ ์˜๊ฐ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” โ€œ์ ์€ ํ† ํฐ์œผ๋กœ ์ถฉ๋ถ„ํ•œ๋ฐ ์™œ ๋งŽ์€ ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€โ€๋ผ๋Š” ๋ฌธ๊ตฌ๋กœ ๋„๋ฆฌ ์•Œ๋ ค์กŒ์Šต๋‹ˆ๋‹ค. Caveman์€ ์ถœ๋ ฅ ํ† ํฐ์ด ~75% ๊ฐ์†Œํ•˜๊ณ , ๋ฒค์น˜๋งˆํฌ ํ‰๊ท  ์ถœ๋ ฅ ์ ˆ๊ฐ๋ฅ ์ด 65%, ์ถœ๋ ฅ ์ ˆ๊ฐ ๋ฒ”์œ„๊ฐ€ 22-87%์ด๋ฉฐ, ์ž…๋ ฅ ์••์ถ• ๋„๊ตฌ์˜ ์ ˆ๊ฐ๋ฅ ์€ ~46%๋ผ๊ณ  ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

RTK ๋ชจ๋“œ๋Š” **RTK AI**์˜ **RTK - Rust Token Killer**์—์„œ ์˜๊ฐ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” ํ„ฐ๋ฏธ๋„, ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, git ๋ฐ ๋„๊ตฌ ์ถœ๋ ฅ ํ•„ํ„ฐ๋ง์„ ์œ„ํ•œ ๊ณ ์„ฑ๋Šฅ ๋ช…๋ น ์ถœ๋ ฅ ์••์ถ• ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. RTK๋Š” 60-90%์˜ ์ ˆ๊ฐ๋ฅ ์„ ๋ณด๊ณ ํ•˜๋ฉฐ, README์˜ ์ƒ˜ํ”Œ ์„ธ์…˜์—์„œ๋Š” ~80%๊ฐ€ ์ ˆ๊ฐ๋œ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.


7๊ฐ€์ง€ ํ‘œ์ค€ ๋ชจ๋“œ ์™ธ์—๋„ OmniRoute๋Š” ์ปจํ…์ŠคํŠธ์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ณ ๊ธ‰ ์••์ถ• ์‹œ์Šคํ…œ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ถ€ ๊ณต๊ธ‰์ž(ํ”„๋กฌํ”„ํŠธ ์บ์‹ฑ์„ ์‚ฌ์šฉํ•˜๋Š” Anthropic ๋“ฑ)๋Š” ํ”„๋กฌํ”„ํŠธ ์บ์‹ฑ์„ ์ง€์›ํ•˜์—ฌ ํ”„๋กฌํ”„ํŠธ์˜ ์ผ๋ถ€๋ฅผ ์บ์‹œํ•˜์—ฌ ๋น„์šฉ๊ณผ ์ง€์—ฐ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์บ์‹ฑ์ด ํ™œ์„ฑํ™”๋˜๋ฉด ๊ณต๊ฒฉ์ ์ธ ์••์ถ•์€ ์บ์‹œ๋œ ํ† ํฐ์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์บ์‹œ๋ฅผ ๋ฌดํšจํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ์„ฑ๋Šฅ์„ ์ €ํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

cachingAware.ts ๋ชจ๋“ˆ์€ ์บ์‹ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ์••์ถ• ์ „๋žต์„ ์กฐ์ •ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

  1. ์บ์‹ฑ ์ปจํ…์ŠคํŠธ ๊ฐ์ง€ โ€” ์š”์ฒญ ๋ณธ๋ฌธ์—์„œ cache_control ๋งˆ์ปค๋ฅผ ์Šค์บ”ํ•ฉ๋‹ˆ๋‹ค.
  2. ์บ์‹ฑ ๊ณต๊ธ‰์ž ์‹๋ณ„ โ€” ๋Œ€์ƒ ๊ณต๊ธ‰์ž๊ฐ€ ์บ์‹ฑ์„ ์ง€์›ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  3. ์ „๋žต ์กฐ์ • โ€” ์บ์‹ฑ ๊ณต๊ธ‰์ž์˜ ๊ฒฝ์šฐ aggressive/ultra๋ฅผ standard๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค.
  4. ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ๊ฑด๋„ˆ๋›ฐ๊ธฐ โ€” ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์บ์‹œ๋˜๋ฏ€๋กœ ์••์ถ•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  5. ๊ฒฐ์ •๋ก ์  ๋ณ€ํ™˜ ์‚ฌ์šฉ โ€” ์ผ๊ด€๋œ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜๋Š” ๋ณ€ํ™˜๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
import {
detectCachingContext,
getCacheAwareStrategy,
} from "@omniroute/open-sse/services/compression/cachingAware";
const body = {
model: "anthropic/claude-sonnet-4.5",
messages: [{ role: "user", content: "Hello" }],
cache_control: { type: "ephemeral" }, // โ† ์บ์‹œ ๋งˆ์ปค
};
const ctx = detectCachingContext(body, { provider: "anthropic" });
// โ†’ { hasCacheControl: true, provider: "anthropic", isCachingProvider: true }
const strategy = getCacheAwareStrategy("aggressive", ctx);
// โ†’ { strategy: "standard", skipSystemPrompt: true, deterministicOnly: true }

์บ์‹œ ์ธ์‹ ์••์ถ•์€ ํ•ญ์ƒ ์ผœ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค โ€” ๋ณ„๋„์˜ ๊ตฌ์„ฑ์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  • ์š”์ฒญ์— cache_control ๋งˆ์ปค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ
  • ๋Œ€์ƒ ๊ณต๊ธ‰์ž๊ฐ€ ํ”„๋กฌํ”„ํŠธ ์บ์‹ฑ์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ (Anthropic, OpenAI ๋“ฑ)

๊ธด ๋Œ€ํ™”๋Š” ๋งŽ์€ ๋ฉ”์‹œ์ง€ ํ„ด์„ ์ถ•์ ํ•˜์ง€๋งŒ, ์˜ค๋ž˜๋œ ํ„ด์€ ๊ด€๋ จ์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค. progressiveAging.ts ๋ชจ๋“ˆ์€ ํ„ด ๊ฑฐ๋ฆฌ์— ๋”ฐ๋ผ ๋ฉ”์‹œ์ง€๋ฅผ ์ €ํ•˜์‹œํ‚ต๋‹ˆ๋‹ค:

  • ์ตœ๊ทผ ํ„ด (0-3): ๊ทธ๋Œ€๋กœ ์œ ์ง€ (์ „์ฒด ์„ธ๋ถ€ ์ •๋ณด)
  • ์ค‘๊ฐ„ ํ„ด (4-8): ๊ฐ€๋ฒผ์šด ์••์ถ• (๊ณต๋ฐฑ, ์„œ์‹ ์ •๋ฆฌ)
  • ์˜ค๋ž˜๋œ ํ„ด (9+): ์›์‹œ์ธ ์••์ถ• (๋ถˆํ•„์š”ํ•œ ๋‚ด์šฉ ์ œ๊ฑฐ, ์š”์•ฝ)
  • ๋งค์šฐ ์˜ค๋ž˜๋œ ํ„ด (20+): ์‹ฌํ•˜๊ฒŒ ์š”์•ฝ๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋จ
import { applyAging } from "@omniroute/open-sse/services/compression/progressiveAging";
const messages = [
{ role: "system", content: "You are a helpful assistant" },
{ role: "user", content: "What is 2+2?" },
{ role: "assistant", content: "4" },
// ... 50๊ฐœ ์ด์ƒ์˜ ํ„ด ...
];
const { messages: aged, saved } = applyAging(messages, {
verbatim: 3, // ์ฒซ 3๊ฐœ ํ„ด: ๊ทธ๋Œ€๋กœ
light: 8, // 4-8 ํ„ด: ๊ฐ€๋ฒผ์šด ์••์ถ•
moderate: 20, // 9-20 ํ„ด: ์›์‹œ์ธ ์••์ถ•
// 21+ ํ„ด: ์‹ฌํ•œ ์š”์•ฝ
});
// saved = ์ ˆ์•ฝ๋œ ํ† ํฐ ์ˆ˜

์ ์ง„์  ๋…ธํ™”๋Š” aggressive ๋ฐ ultra ๋ชจ๋“œ์—์„œ ํ•ญ์ƒ ์ผœ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋‹ค์Œ ๊ฒฝ์šฐ์— ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

  • ์žฅ์‹œ๊ฐ„ ์ฝ”๋”ฉ ์„ธ์…˜
  • ์—ฌ๋Ÿฌ ๋‚ ์— ๊ฑธ์นœ ๋Œ€ํ™”
  • ๋งŽ์€ ๋„๊ตฌ ํ˜ธ์ถœ์ด ์žˆ๋Š” ์—์ด์ „ํŠธ ์›Œํฌํ”Œ๋กœ์šฐ

outputMode.ts ๋ชจ๋“ˆ์€ ๋ชจ๋ธ ์ž์ฒด๊ฐ€ ์••์ถ•๋˜๊ณ  ๊ฐ„๊ฒฐํ•œ ์ถœ๋ ฅ(โ€œ์›์‹œ์ธโ€ ์Šคํƒ€์ผ)์„ ์ƒ์„ฑํ•˜๋„๋ก ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ์ง€์นจ์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.

์ž…๋ ฅ์„ ์••์ถ•ํ•˜๋Š” ๋Œ€์‹ , ์ด ๋ชจ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

โ€œ์ตœ์†Œํ•œ์˜ ๋‹จ์–ด๋กœ ๋‹ตํ•˜์„ธ์š”. ๋ถˆํ•„์š”ํ•œ ์ธ์‚ฌ๋Š” ๊ฑด๋„ˆ๋›ฐ์„ธ์š”. ์งง์€ ๋ฌธ์žฅ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.โ€

์ด๊ฒƒ์€ ๋‹ค์Œ ๊ฒฝ์šฐ์— ํŠนํžˆ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  • ์ฝ”๋“œ ์ƒ์„ฑ (๊ฐ„๊ฒฐํ•œ ์ถœ๋ ฅ = ์ ์€ ํ† ํฐ)
  • ๋น ๋ฅธ Q&A (์ •๊ตํ•œ ์„ค๋ช… ๋ถˆํ•„์š”)
  • ์ผ๊ด„ ์ฒ˜๋ฆฌ (์ฒ˜๋ฆฌ๋Ÿ‰ ๊ทน๋Œ€ํ™”)

์›์‹œ์ธ ์ถœ๋ ฅ ๋ชจ๋“œ๋Š” ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค โ€” ์ฝค๋ณด ๊ตฌ์„ฑ์„ ํ†ตํ•ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

{
"strategy": "auto",
"config": {
"auto": {
"outputMode": "caveman"
}
}
}

์œ„์˜ ์›์‹œ์ธ ์ถœ๋ ฅ ๋ชจ๋“œ๋Š” ๋ ˆ๊ฑฐ์‹œ ๋‹จ์ผ ์Šคํƒ€์ผ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. Phase 4์—์„œ๋Š” ์ด๋ฅผ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ์ถœ๋ ฅ ์Šคํƒ€์ผ ์นดํƒˆ๋กœ๊ทธ๋กœ ์ผ๋ฐ˜ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค: open-sse/services/compression/outputStyles/catalog.ts์˜ OUTPUT_STYLE_CATALOG. ๊ฐ ์Šคํƒ€์ผ์€ ๋ชจ๋ธ ์ž์ฒด๊ฐ€ ๋” ์ €๋ ดํ•œ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜๋„๋ก ํ•˜๋Š” ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ์ง€์นจ์ด๋ฉฐ, ์Šคํƒ€์ผ์€ ํ•จ๊ป˜ ํ™œ์„ฑํ™”๋  ์ˆ˜ ์žˆ๊ณ  ์นดํƒˆ๋กœ๊ทธ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค.

์Šคํƒ€์ผ id ๊ธฐ๋Šฅ ์ง€์‹œ์–ด ์–ธ์–ด
๊ฐ„๊ฒฐํ•œ ์‚ฐ๋ฌธ terse-prose ๋ถˆํ•„์š”ํ•œ ๋‹จ์–ด/๊ด€์‚ฌ/์™„๊ณก์–ด๋ฒ•์„ ์ œ๊ฑฐํ•˜๊ณ  ๊ธฐ์ˆ ์  ๋‚ด์šฉ์€ ์ •ํ™•ํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ๊ฑฐ์‹œ caveman ์ถœ๋ ฅ ๋ชจ๋“œ์™€ ๋™์ผํ•œ ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค(์ฐธ์กฐ๋˜์—ˆ์œผ๋ฉฐ ๋‹ค์‹œ ์ž…๋ ฅ๋˜์ง€ ์•Š์Œ). en, pt-BR, es, de, fr, it, ru, zh, ja, id, vi
์ฝ”๋“œ ์ค„์ด๊ธฐ less-code YAGNI ์›์น™: ์ตœ์†Œํ•œ์˜ ์ž‘๋™ ๋ณ€๊ฒฝ, ์š”์ฒญํ•˜์ง€ ์•Š์€ ์ถ”์ƒํ™” ์—†์Œ. en, pt-BR, es, de, fr, it, ru, zh, ja, id, vi
ํฌ๋‹ˆํ…Œ์ผ (๊ฒŒ์œผ๋ฅธ ์„ ์ž„ ๊ฐœ๋ฐœ์ž) ponytail โ€œ์ตœ๊ณ ์˜ ์ฝ”๋“œ๋Š” ์ž‘์„ฑ๋˜์ง€ ์•Š์€ ์ฝ”๋“œโ€: ์žฌ์‚ฌ์šฉ > ์žฌ์ž‘์„ฑ, ๊ทผ๋ณธ ์›์ธ > ์ฆ์ƒ, ๊ฐ€์žฅ ์งง์€ ์ž‘๋™ ์ฐจ์ด. en, pt-BR, es, de, fr, it, ru, zh, ja, id, vi
ADHD๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (ํ–‰๋™ ์šฐ์„ ) i-have-adhd ํ–‰๋™ ์šฐ์„  (์‚ฐ๋ฌธ๋ณด๋‹ค ๋ช…๋ น/๊ฒฝ๋กœ/์ฝ”๋“œ ์กฐ๊ฐ), ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ง„ ์ œํ•œ๋œ ๋‹จ๊ณ„, ํ•˜๋‚˜์˜ ๊ตฌ์ฒด์ ์ธ ๋‹ค์Œ ๋‹จ๊ณ„, ์„œ๋ฌธ/์š”์•ฝ/๋งˆ๋ฌด๋ฆฌ ์—†์Œ. ayghri/i-have-adhd (MIT)์—์„œ ์ฑ„ํƒ. en, pt-BR, es, de, fr, it, ru, zh, ja, id, vi
๊ฐ„๊ฒฐํ•œ CJK (ๆ–‡่จ€) terse-cjk ๊ณ ์ „ ์ค‘๊ตญ์–ด์˜ ์ดˆ๊ฐ„๊ฒฐ ์Šคํƒ€์ผ. zh (๋กœ์ผ€์ผ ์ œํ•œ: ํ•ด๊ฒฐ๋œ ์–ธ์–ด๊ฐ€ zh์ผ ๋•Œ๋งŒ ์ œ๊ณต)

๋ชจ๋“  ์Šคํƒ€์ผ์€ lite, full, ultra ์„ธ ๊ฐ€์ง€ ๊ฐ•๋„ ์ˆ˜์ค€์„ ์ œ๊ณตํ•˜๋ฉฐ, ๋ชจ๋“  ์ˆ˜์ค€์€ ์ฝ”๋“œ ๋ธ”๋ก, ํŒŒ์ผ ๊ฒฝ๋กœ, ๋ช…๋ น, ์˜ค๋ฅ˜ ๋ฌธ์ž์—ด, URL ๋ฐ ์‹๋ณ„์ž๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋Š” ๊ณตํ†ต ๊ฒฝ๊ณ„ ์ ˆ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค.

applyOutputStyles() (open-sse/services/compression/outputStyles/apply.ts)๋Š” ์นดํƒˆ๋กœ๊ทธ์— ๋Œ€ํ•ด ์„ ํƒ ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•˜๊ณ  (์•Œ ์ˆ˜ ์—†๋Š” ID ๋ฐ ๋กœ์ผ€์ผ ๋ถˆ์ผ์น˜ ์Šคํƒ€์ผ์€ ์‚ญ์ œ๋˜๋ฉฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ), ์นดํƒˆ๋กœ๊ทธ ์ˆœ์„œ๋Œ€๋กœ ์„ ํƒ๋œ ์ง€์นจ์„ ์—ฐ๊ฒฐํ•˜๊ณ , ๊ฒฝ๊ณ„ ์ ˆ์„ ํ•œ ๋ฒˆ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ, ๋‹จ์ผ ๋ฉฑ๋“ฑ์„ฑ ๋งˆ์ปค ([OmniRoute Output Styles]) ๋’ค์— ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ๊ฒฐ๊ณผ๋ฅผ ๋ฏธ๋ฆฌ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•„๋ฌด๋Ÿฐ ์ž‘์šฉ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ์ง€๋œ ์š”์ฒญ ์–ธ์–ด์— ๋ฒˆ์—ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ์˜์–ด ๋Œ€์‹  ํ˜„์ง€ํ™”๋œ ์ง€์นจ์ด ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค.

๋Œ€์‹œ๋ณด๋“œ์—์„œ: Context โ†’ Settings โ†’ Compression โ€” ๊ฐ ์Šคํƒ€์ผ์— ๋Œ€ํ•ด ์ผœ๊ธฐ/๋„๊ธฐ ํ† ๊ธ€๊ณผ ์ˆ˜์ค€ ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ๋Š” ํ•œ ์ค„. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์••์ถ• ๊ตฌ์„ฑ์€ ์„ ํƒ ์‚ฌํ•ญ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

{
"outputStyles": [
{ "id": "i-have-adhd", "level": "full" },
{ "id": "less-code", "level": "lite" }
]
}

ํ•˜์œ„ ํ˜ธํ™˜์„ฑ: ๋ ˆ๊ฑฐ์‹œ outputMode: "caveman" ์ฝค๋ณด ์„ค์ •์€ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜๋ฉฐ terse-prose์— ๋งคํ•‘๋˜๋ฉฐ, ๋ชจ๋“  ๋ ˆ๊ฑฐ์‹œ ์–ธ์–ด์—์„œ ์ด์ „ ์ฃผ์ž…๊ณผ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์–ธ์–ด ์„ ํƒ: languageConfig.enabled๊ฐ€ ์ผœ์ ธ ์žˆ์œผ๋ฉด autoDetect๊ฐ€ ์ตœ์‹  ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€์˜ ์–ธ์–ด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค (์ž…๋ ฅ ์—”์ง„๊ณผ ๋™์ผํ•œ ๊ฐ์ง€๊ธฐ). autoDetect๋ฅผ ๋„๋ฉด defaultLanguage๊ฐ€ ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค. ๋„๋ฉด โ†’ ์˜์–ด.

์Šคํƒ€์ผ ร— ์–ธ์–ด ๋งคํŠธ๋ฆญ์Šค๋Š” tests/unit/compression/output-styles-i18n-matrix.test.ts์— ์˜ํ•ด ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์Šคํƒ€์ผ์€ ์ตœ์†Œํ•œ pt-BR ๋ฒˆ์—ญ (๋˜๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์ถ”์ ๋œ ์˜ˆ์™ธ) ์—†์ด๋Š” ์ œ๊ณต๋  ์ˆ˜ ์—†์œผ๋ฉฐ, ๊ธฐ์กด ์Šคํƒ€์ผ์€ ๋กœ์ผ€์ผ์„ ์กฐ์šฉํžˆ ์žƒ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด EXTENDING_COMPRESSION.md๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

toolResultCompressor.ts ๋ชจ๋“ˆ์€ ๋„๊ตฌ ๊ฒฐ๊ณผ (ํ•จ์ˆ˜ ํ˜ธ์ถœ, ์—์ด์ „ํŠธ ์ถœ๋ ฅ, ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋“ฑ)์— ๋Œ€ํ•œ 5๊ฐ€์ง€ ํŠน์ˆ˜ ์••์ถ• ์ „๋žต์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  1. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์••์ถ• โ€” ์ค‘๋ณต ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ƒ์œ„ N๊ฐœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  2. ํŒŒ์ผ ์ฝ๊ธฐ ์••์ถ• โ€” ํฐ ํŒŒ์ผ์„ ์ž๋ฅด๊ณ  ํ—ค๋”/๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.
  3. ์ฝ”๋“œ ์‹คํ–‰ ์••์ถ• โ€” ํ•„์ˆ˜ stdout/stderr๋งŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ ์••์ถ• โ€” ํ–‰์„ ์ œํ•œํ•˜๊ณ  ์ž์„ธํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  5. API ์‘๋‹ต ์••์ถ• โ€” null ํ•„๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ฐฐ์—ด์„ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค.

๋„๊ตฌ ๊ฒฐ๊ณผ ์••์ถ•์€ ๋„๊ตฌ ํ˜ธ์ถœ์ด ์žˆ์„ ๋•Œ ํ•ญ์ƒ ์ผœ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์Šคํƒํ˜• ๋ชจ๋“œ๋Š” ์—ฌ๋Ÿฌ ์—”์ง„์„ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ RTK๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๊ณ  (๋„๊ตฌ ์ถœ๋ ฅ์—์„œ 60-90% ์ ˆ์•ฝ), ๊ทธ ๋‹ค์Œ Caveman์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค (๋‚˜๋จธ์ง€ ํ…์ŠคํŠธ์—์„œ ์ถ”๊ฐ€ 30% ์ ˆ์•ฝ). ์ด๋ฅผ ํ†ตํ•ด ์ด 78-95%์˜ ์ ˆ์•ฝ์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ž…๋ ฅ (1000 ํ† ํฐ)
โ†’ RTK (๋ช…๋ น ์ธ์‹ ํ•„ํ„ฐ) โ†’ 200 ํ† ํฐ
โ†’ Caveman (ํ•„๋Ÿฌ ์ œ๊ฑฐ) โ†’ 140 ํ† ํฐ
โ†’ ์ถœ๋ ฅ (140 ํ† ํฐ, 86% ์ ˆ์•ฝ)

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ์Šคํƒํ˜• ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

  • ๋„๊ตฌ ์ค‘์‹ฌ ์›Œํฌํ”Œ๋กœ์šฐ (์—์ด์ „ํŠธ ์ฝ”๋”ฉ, ์—ฐ๊ตฌ)
  • ๋น„์šฉ์— ๋ฏผ๊ฐํ•œ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ
  • ์ตœ๋Œ€ ํ† ํฐ ์ ˆ์•ฝ์ด ํ•„์š”ํ•  ๋•Œ

์ฝค๋ณด๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑ:

{
"strategy": "auto",
"config": {
"auto": {
"modePack": "stacked"
}
}
}

๋‹ค์–‘ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋งž๊ฒŒ ๋™์ž‘์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ „์—ญ ์••์ถ• ๋ชจ๋“œ๋ฅผ ์ฝค๋ณด๋ณ„๋กœ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{
"id": "coding-combo",
"strategy": "priority",
"config": {
"auto": {
"weights": { "taskFit": 0.5 },
"modePack": "quality-first"
}
},
"compressionOverride": {
"mode": "aggressive",
"stackedPipelines": ["rtk", "caveman"],
"preserveToolDefinitions": true
}
}

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์ฝ”๋”ฉ ์ฝค๋ณด: ๊ธด ์„ธ์…˜์—๋Š” aggressive ๋ชจ๋“œ ์‚ฌ์šฉ
  • ๋น ๋ฅธ Q&A ์ฝค๋ณด: ๋น ๋ฅธ ์‘๋‹ต์—๋Š” lite ๋ชจ๋“œ ์‚ฌ์šฉ
  • ๋„๊ตฌ ์ค‘์‹ฌ ์ฝค๋ณด: ๋น„์šฉ์„ ์ตœ๋Œ€ํ•œ ์ ˆ๊ฐํ•˜๋ ค๋ฉด stacked ๋ชจ๋“œ ์‚ฌ์šฉ
  • ํ”„๋กœ๋•์…˜ ์ฝค๋ณด: ์บ์‹ฑ ์ œ๊ณต์ž์—๋Š” cache-aware ๋ชจ๋“œ ์‚ฌ์šฉ


OmniRoute ์†Œ์Šค ์ฝ”๋“œ (a58000c7685f)

HagiCode

HagiCode๋Š” ๊ตฌ์กฐํ™”๋œ ์›Œํฌํ”Œ๋กœ, ๋‹ค์ค‘ ์—์ด์ „ํŠธ ์‹คํ–‰, Hero Dungeon ๋ทฐ๋ฅผ ๊ฐ–์ถ˜ ์—์ด์ „ํŠธ ์ฝ”๋”ฉ ์ž‘์—… ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

๋” ์Šค๋งˆํŠธํ•˜๊ณ  ๋น ๋ฅด๋ฉฐ ์ฆ๊ฑฐ์šด ์—์ด์ „ํŠธ ์›Œํฌํ”Œ๋กœ๋กœ ์œ ์šฉํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋งŒ๋“œ์„ธ์š”.

HagiCode ๋ผ์ดํŠธ ํ…Œ๋งˆ ๋ฉ”์ธ ํ™”๋ฉด
  • Smart๊ตฌ์กฐํ™”๋œ ์›Œํฌํ”Œ๋กœ๋Š” ์˜๋„๋ฅผ ์•„์ด๋””์–ด๋ถ€ํ„ฐ ๋ฐฐํฌ๊นŒ์ง€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • Efficient๋‹ค์ค‘ ์—์ด์ „ํŠธ ์›Œํฌํ”Œ๋กœ๋กœ ์กฐ์‚ฌ, ๊ตฌํ˜„, ๊ฒ€ํ† ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • FunHero Dungeon์€ ๊ธด ์ฝ”๋”ฉ ์„ธ์…˜์„ ์‹œ๊ฐ์ ์ด๊ณ  ํ˜‘์—…์ ์ธ ๊ฒฝํ—˜์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
HagiCode ๋ฐฉ๋ฌธ