# ๐Ÿ—œ๏ธ Prompt Compression Guide โ€” OmniRoute (ํ•œ๊ตญ์–ด) ๐ŸŒ **Languages:** ๐Ÿ‡บ๐Ÿ‡ธ [English](../../../../compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ช๐Ÿ‡น [am](../../../am/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ธ๐Ÿ‡ฆ [ar](../../../ar/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฆ๐Ÿ‡ฟ [az](../../../az/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ง๐Ÿ‡ฌ [bg](../../../bg/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ง๐Ÿ‡ฉ [bn](../../../bn/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ง๐Ÿ‡ฆ [bs](../../../bs/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡จ๐Ÿ‡ฟ [cs](../../../cs/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฉ๐Ÿ‡ฐ [da](../../../da/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฉ๐Ÿ‡ช [de](../../../de/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฌ๐Ÿ‡ท [el](../../../el/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ช๐Ÿ‡ธ [es](../../../es/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ช๐Ÿ‡ช [et](../../../et/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ท [fa](../../../fa/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ซ๐Ÿ‡ฎ [fi](../../../fi/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ซ๐Ÿ‡ท [fr](../../../fr/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ช [ga](../../../ga/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [gu](../../../gu/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ณ๐Ÿ‡ฌ [ha](../../../ha/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ฑ [he](../../../he/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [hi](../../../hi/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ญ๐Ÿ‡ท [hr](../../../hr/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ญ๐Ÿ‡บ [hu](../../../hu/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฆ๐Ÿ‡ฒ [hy](../../../hy/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ฉ [id](../../../id/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ณ๐Ÿ‡ฌ [ig](../../../ig/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡น [it](../../../it/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฏ๐Ÿ‡ต [ja](../../../ja/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฌ๐Ÿ‡ช [ka](../../../ka/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฐ๐Ÿ‡ญ [km](../../../km/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [kn](../../../kn/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฑ๐Ÿ‡น [lt](../../../lt/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฑ๐Ÿ‡ป [lv](../../../lv/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [ml](../../../ml/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [mr](../../../mr/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฒ๐Ÿ‡พ [ms](../../../ms/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฒ๐Ÿ‡น [mt](../../../mt/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฒ๐Ÿ‡ฒ [my](../../../my/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ณ๐Ÿ‡ต [ne](../../../ne/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ณ๐Ÿ‡ฑ [nl](../../../nl/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ณ๐Ÿ‡ด [no](../../../no/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [or](../../../or/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [pa](../../../pa/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ต๐Ÿ‡ญ [phi](../../../phi/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ต๐Ÿ‡ฑ [pl](../../../pl/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ต๐Ÿ‡น [pt](../../../pt/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ง๐Ÿ‡ท [pt-BR](../../../pt-BR/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ท๐Ÿ‡ด [ro](../../../ro/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ท๐Ÿ‡บ [ru](../../../ru/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฑ๐Ÿ‡ฐ [si](../../../si/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ธ๐Ÿ‡ฐ [sk](../../../sk/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ธ๐Ÿ‡ฎ [sl](../../../sl/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ท๐Ÿ‡ธ [sr](../../../sr/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ธ๐Ÿ‡ช [sv](../../../sv/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฐ๐Ÿ‡ช [sw](../../../sw/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [ta](../../../ta/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [te](../../../te/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡น๐Ÿ‡ญ [th](../../../th/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡น๐Ÿ‡ท [tr](../../../tr/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡บ๐Ÿ‡ฆ [uk-UA](../../../uk-UA/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ต๐Ÿ‡ฐ [ur](../../../ur/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡บ๐Ÿ‡ฟ [uz](../../../uz/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ป๐Ÿ‡ณ [vi](../../../vi/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡ณ๐Ÿ‡ฌ [yo](../../../yo/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡จ๐Ÿ‡ณ [zh-CN](../../../zh-CN/docs/compression/COMPRESSION_GUIDE.md) ยท ๐Ÿ‡น๐Ÿ‡ผ [zh-TW](../../../zh-TW/docs/compression/COMPRESSION_GUIDE.md) --- > ์ ๊ฒฉ ์ปจํ…์ŠคํŠธ์—์„œ 15~95%๋ฅผ ์ž๋™์œผ๋กœ ์ ˆ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋น ๋ฅด๊ฒŒ ์‚ดํŽด๋ณด๋ ค๋ฉด [README ์••์ถ• ์„น์…˜](../README.md#%EF%B8%8F-prompt-compression--save-15-95-eligible-tokens-automatically)์„ ์ฐธ์กฐํ•˜์„ธ์š”. ## ๊ฐœ์š” OmniRoute๋Š” ์š”์ฒญ์ด ์—…์ŠคํŠธ๋ฆผ ์ œ๊ณต์ž์— ๋„๋‹ฌํ•˜๊ธฐ **์ „์— ์„ ์ œ์ ์œผ๋กœ** ์‹คํ–‰๋˜๋Š” ๋ชจ๋“ˆ์‹ ํ”„๋กฌํ”„ํŠธ ์••์ถ• ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์›Œํฌํ”Œ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„๋„ ํˆฌ๋ช…ํ•˜๊ฒŒ ํ† ํฐ์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ``` ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ โ†’ ์••์ถ• ์ „๋žต ์„ ํƒ๊ธฐ โ†’ ์ฝค๋ณด ์žฌ์ •์˜? โ†’ ์ฝค๋ณด ์„ค์ • ์‚ฌ์šฉ โ†’ ์ž๋™ ์‹คํ–‰ ์ž„๊ณ„๊ฐ’? โ†’ ์ž๋™ ๋ชจ๋“œ ์‚ฌ์šฉ โ†’ ๊ธฐ๋ณธ ๋ชจ๋“œ? โ†’ ์ „์—ญ ์„ค์ • ์‚ฌ์šฉ โ†’ ๊บผ์ง? โ†’ ์••์ถ• ๊ฑด๋„ˆ๋›ฐ๊ธฐ โ†’ ์„ ํƒํ•œ ์••์ถ• ๋ชจ๋“œ โ†’ ๊บผ์ง: ์••์ถ• ์—†์Œ โ†’ Lite: ์•ˆ์ „ํ•œ ๊ณต๋ฐฑ/์„œ์‹ ์ •๋ฆฌ(~15%) โ†’ Standard: ์ „๋ณด๋ฌธ์ฒด์‹ ๊ตฐ๋”๋”๊ธฐ ์ œ๊ฑฐ(~30%) โ†’ Aggressive: ๊ธฐ๋ก ์—์ด์ง• + ์š”์•ฝ(~50%) โ†’ Ultra: ํœด๋ฆฌ์Šคํ‹ฑ ๊ฐ€์ง€์น˜๊ธฐ + ์ฝ”๋“œ ๋ธ”๋ก ์ถ•์†Œ(~75%) โ†’ RTK: ๋ช…๋ น์–ด ์ธ์‹ํ˜• ํ„ฐ๋ฏธ๋„/๋„๊ตฌ ์ถœ๋ ฅ ํ•„ํ„ฐ๋ง(์—…์ŠคํŠธ๋ฆผ ๊ธฐ์ค€ 60~90%) โ†’ Stacked: ์ˆœ์ฐจ์  ๋‹ค์ค‘ ์—”์ง„ ํŒŒ์ดํ”„๋ผ์ธ, ์ผ๋ฐ˜์ ์œผ๋กœ RTK ์‹คํ–‰ ํ›„ Caveman ์‹คํ–‰(์ ๊ฒฉ ๋ฒ”์œ„ ๊ธฐ์ค€ 78~95%) โ†’ ์••์ถ•๋œ ์š”์ฒญ โ†’ ์ œ๊ณต์ž ``` --- ## ์••์ถ• ๋ชจ๋“œ ### ๊บผ์ง ์••์ถ•์„ ์ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฉ”์‹œ์ง€๊ฐ€ ๋ณ€๊ฒฝ ์—†์ด ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ### Lite ๋ชจ๋“œ(์•ฝ 15% ์ ˆ๊ฐ, ์ง€์—ฐ ์‹œ๊ฐ„ <1ms) ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ๋ชจ๋“œ๋กœ, ์˜๋ฏธ๋Š” ์ „ํ˜€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์„œ์‹๋งŒ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. | ๊ธฐ๋ฒ• | ์„ค๋ช… | | ------------------------ | ------------------------------ | | `collapseWhitespace` | ์—ฐ์†๋œ ๋นˆ ์ค„๊ณผ ์ค„ ๋ ๊ณต๋ฐฑ ๋ณ‘ํ•ฉ | | `dedupSystemPrompt` | ์ค‘๋ณต ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ์ œ๊ฑฐ | | `compressToolResults` | ์žฅํ™ฉํ•œ ๋„๊ตฌ/ํ•จ์ˆ˜ ์ถœ๋ ฅ ์••์ถ• | | `removeRedundantContent` | ๋ฐ˜๋ณต๋˜๋Š” ์ง€์นจ ์ œ๊ฑฐ | | `replaceImageUrls` | base64 ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ URI ๋‹จ์ถ• | **์ ํ•ฉํ•œ ์šฉ๋„:** ์ƒ์‹œ ์‚ฌ์šฉ, ์•ˆ์ „์ด ์ค‘์š”ํ•œ ์›Œํฌํ”Œ๋กœ. ### Standard ๋ชจ๋“œ(์•ฝ 30% ์ ˆ๊ฐ) [Caveman](https://github.com/JuliusBrussee/caveman)์—์„œ ์˜๊ฐ์„ ๋ฐ›์•„ ์˜๋ฏธ๋ฅผ ๋ณด์กดํ•˜๋ฉด์„œ ๊ตฐ๋”๋”๊ธฐ ๋‹จ์–ด์™€ ์žฅํ™ฉํ•œ ํ‘œํ˜„์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. - ๊ตฐ๋”๋”๊ธฐ ๋‹จ์–ด ์ œ๊ฑฐ("please", "I think", "basically", "actually") - ์žฅํ™ฉํ•œ ๋ฌธ๊ตฌ ์ถ•์•ฝ("in order to" โ†’ "to", "as a result of" โ†’ "because") - ์™„๊ณกํ•˜๊ณ  ์ •์ค‘ํ•œ ํ‘œํ˜„ ์ œ๊ฑฐ("Would you mind...", "If you could possibly...") - ์ฝ”๋”ฉ ํ”„๋กฌํ”„ํŠธ์— ๋งž๊ฒŒ ์กฐ์ •๋œ 30๊ฐœ ์ด์ƒ์˜ ์ •๊ทœ์‹ ๊ทœ์น™ **์ ํ•ฉํ•œ ์šฉ๋„:** ์ผ์ƒ์ ์ธ ์ฝ”๋”ฉ ์›Œํฌํ”Œ๋กœ, ๋น„์šฉ์„ ์ค‘์‹œํ•˜๋Š” ํŒ€. ### Aggressive ๋ชจ๋“œ(์•ฝ 50% ์ ˆ๊ฐ) ๊ธด ์„ธ์…˜์„ ์œ„ํ•œ ์Šค๋งˆํŠธ ๊ธฐ๋ก ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. - **๋ฉ”์‹œ์ง€ ์—์ด์ง•** โ€” ์˜ค๋ž˜๋œ ๋ฉ”์‹œ์ง€์ผ์ˆ˜๋ก ์ ์ง„์ ์œผ๋กœ ๋” ๋งŽ์ด ์••์ถ• - **๋„๊ตฌ ๊ฒฐ๊ณผ ์š”์•ฝ** โ€” ๊ธด ๋„๊ตฌ ์ถœ๋ ฅ์„ ์š”์•ฝ์œผ๋กœ ๋Œ€์ฒด - **๊ตฌ์กฐ์  ๋ฌด๊ฒฐ์„ฑ ๋ณดํ˜ธ ์žฅ์น˜** โ€” `tool_use` + `tool_result` ์Œ์˜ ์ผ๊ด€์„ฑ ์œ ์ง€ - **์ปจํ…์ŠคํŠธ ์ฐฝ ์ธ์‹** โ€” ๋ชจ๋ธ๋ณ„ ํ† ํฐ ์ œํ•œ ์ค€์ˆ˜ **์ ํ•ฉํ•œ ์šฉ๋„:** ์žฅ์‹œ๊ฐ„ ๋””๋ฒ„๊น… ์„ธ์…˜, ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค. ### Ultra ๋ชจ๋“œ(์•ฝ 75% ์ ˆ๊ฐ) ํ† ํฐ์ด ๋งค์šฐ ์ค‘์š”ํ•œ ์ƒํ™ฉ์„ ์œ„ํ•œ ์ตœ๋Œ€ ์••์ถ• ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค. - **ํœด๋ฆฌ์Šคํ‹ฑ ๊ฐ€์ง€์น˜๊ธฐ** โ€” ๊ด€๋ จ์„ฑ ์ž„๊ณ„๊ฐ’๋ณด๋‹ค ๋‚ฎ์€ ๋ฉ”์‹œ์ง€ ์ œ๊ฑฐ - **์ฝ”๋“œ ๋ธ”๋ก ์ถ•์†Œ** โ€” ๋ฐ˜๋ณต์ ์ธ ์ฝ”๋“œ ์˜ˆ์ œ ์••์ถ• - **์ด์ง„ ํƒ์ƒ‰ ์ ˆ๋‹จ** โ€” ์ปจํ…์ŠคํŠธ ์ฐฝ์— ๋งž๋Š” ์ตœ์ ์˜ ์ ˆ๋‹จ ์ง€์  ํƒ์ƒ‰ - Aggressive ๋ชจ๋“œ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ ํฌํ•จ **์ ํ•ฉํ•œ ์šฉ๋„:** ์ปจํ…์ŠคํŠธ ์ œํ•œ์— ๋ฐ˜๋ณต์ ์œผ๋กœ ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ. ### RTK ๋ชจ๋“œ(์—…์ŠคํŠธ๋ฆผ ๊ธฐ์ค€ 60~90%) 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 ๋ชจ๋“œ(์ ๊ฒฉ ๋ฒ”์œ„ ๊ธฐ์ค€ 78~95%) Stacked ๋ชจ๋“œ๋Š” ์—ฌ๋Ÿฌ ์••์ถ• ์—”์ง„์„ ๊ฒฐ์ •๋ก ์  ์ˆœ์„œ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํŒŒ์ดํ”„๋ผ์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ```txt RTK -> Caveman ``` ์ด ์ˆœ์„œ๋Š” ๋จผ์ € ํ„ฐ๋ฏธ๋„/๋„๊ตฌ ์ถœ๋ ฅ์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“  ๋‹ค์Œ, ๋‚จ์€ ์ž์—ฐ์–ด ํ”„๋กฌํ”„ํŠธ์— Caveman ์˜๋ฏธ ์••์ถ•์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. Stacked ํŒŒ์ดํ”„๋ผ์ธ์€ ์ „์—ญ์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ผ์šฐํŒ… ์ฝค๋ณด์— ํ• ๋‹น๋œ ์••์ถ• ์ฝค๋ณด๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **์ ํ•ฉํ•œ ์šฉ๋„:** ๋Œ€๊ทœ๋ชจ ๋„๊ตฌ ๋กœ๊ทธ์™€ ์‚ฌ์šฉ์ž ์ง€์นจ ๋˜๋Š” ์–ด์‹œ์Šคํ„ดํŠธ ์š”์•ฝ์ด ํ•จ๊ป˜ ํฌํ•จ๋œ ํ˜ผํ•ฉ ์ปจํ…์ŠคํŠธ. --- ## ์—…์ŠคํŠธ๋ฆผ ์ ˆ๊ฐ๋ฅ  ๊ณ„์‚ฐ OmniRoute๋Š” ์—…์ŠคํŠธ๋ฆผ ํ”„๋กœ์ ํŠธ ๋ฒค์น˜๋งˆํฌ์™€ OmniRoute ์ž์ฒด ์—”์ง„ ์กฐํ•ฉ์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์ถœ์ฒ˜๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์••์ถ• ์ ˆ๊ฐ๋ฅ ์„ ๋ฌธ์„œํ™”ํ•ฉ๋‹ˆ๋‹ค. | ์ถœ์ฒ˜ | ์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉ๋œ ์—…์ŠคํŠธ๋ฆผ README ์ˆ˜์น˜ | | ------- | -------------------------------------------------------------------------------------------- | | Caveman | ์ถœ๋ ฅ ํ† ํฐ `~75%` ๊ฐ์†Œ, ๋ฒค์น˜๋งˆํฌ ํ‰๊ท  ์ถœ๋ ฅ ์ ˆ๊ฐ๋ฅ  `65%`, ๋ฒ”์œ„ `22-87%`, ์ž…๋ ฅ ์••์ถ• ๋„๊ตฌ `~46%` | | RTK | ๋ช…๋ น ์ถœ๋ ฅ ์ ˆ๊ฐ๋ฅ  `60-90%`; ์ƒ˜ํ”Œ ์„ธ์…˜ ํ† ํฐ `~118,000 -> ~23,900`, ์ฆ‰ `79.7%` ์ ˆ๊ฐ(`~80%`) | ์ค‘๋ณต๋˜๋Š” ๋„๊ตฌ/์ปจํ…์ŠคํŠธ ํŽ˜์ด๋กœ๋“œ์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ OmniRoute ์กฐํ•ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—”์ง„์„ ์—ฐ๊ณ„ํ•ฉ๋‹ˆ๋‹ค. ```txt RTK -> Caveman ``` ๊ฒฐํ•ฉ ์ ˆ๊ฐ๋ฅ ์€ ๋ง์…ˆ ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ ๊ณฑ์…ˆ ๋ฐฉ์‹์œผ๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ```txt ๊ฒฐํ•ฉ๊ฐ’ = 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`์—์„œ ๋ผ์šฐํŒ… ์ฝค๋ณด์— ์••์ถ• ์ฝค๋ณด๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค: ```txt 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:` | ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ ๋‹จ์ผ ์—”์ง„, ์˜ˆ: `engine:rtk`. ์ด๋Š” ํ•ด๋‹น ์—”์ง„์— ๋Œ€ํ•œ ์š”์ฒญ๋ณ„ ์˜ตํŠธ์ธ์ž…๋‹ˆ๋‹ค. | | `` | ๋ช…๋ช…๋œ ์ฝค๋ณด๋กœ, ๋จผ์ € ์ด๋ฆ„(๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์Œ)์œผ๋กœ ์ผ์น˜์‹œํ‚จ ๋‹ค์Œ ID๋กœ ์ผ์น˜์‹œํ‚ต๋‹ˆ๋‹ค. | `allow-lossy`, `engine:` ๋˜๋Š” ๋ช…๋ช…๋œ ์ฝค๋ณด๊ฐ€ ์—†์œผ๋ฉด ์†์‹ค ์—”์ง„์€ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์••์ถ•์ด ์ผœ์ ธ ์žˆ์„ ๋•Œ ์š”์ฒญ์€ ์—ฌ์ „ํžˆ ์„ธ์…˜ ์ค‘๋ณต ์ œ๊ฑฐ ๋ฐ ๊ณต๋ฐฑ ์ ‘๊ธฐ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ ์šฉ๋œ ๊ณ„ํš์€ `X-OmniRoute-Compression: ; source=` ์‘๋‹ต ํ—ค๋”์— ๋ฐ˜์˜๋˜๋ฉฐ, ์—ฌ๊ธฐ์„œ ``๋Š” `request-header`, `routing-override`, `active-profile`, `auto-trigger`, `default` ๋˜๋Š” `off` ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ### API ```bash # ์••์ถ• ์„ค์ • ๊ฐ€์ ธ์˜ค๊ธฐ 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 ์•ก์„ธ์Šค ํ‚ค, ๋น„๋ฐ€๋ฒˆํ˜ธ, ํ† ํฐ ๋ฐ ๋น„๋ฐ€ ์ •๋ณด๋ฅผ ๋งˆ์Šคํ‚นํ•ฉ๋‹ˆ๋‹ค. --- ## ์••์ถ• ํ†ต๊ณ„ ์••์ถ•๋œ ๋ชจ๋“  ์š”์ฒญ์—๋Š” ์„œ๋ฒ„ ๋กœ๊ทธ์— ํ†ต๊ณ„๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค: ```json { "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](https://github.com/JuliusBrussee)**(โญ 51K+)์˜ **[Caveman](https://github.com/JuliusBrussee/caveman)**์—์„œ ์˜๊ฐ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” "์ ์€ ํ† ํฐ์œผ๋กœ ์ถฉ๋ถ„ํ•œ๋ฐ ์™œ ๋งŽ์€ ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€"๋ผ๋Š” ๋ฌธ๊ตฌ๋กœ ๋„๋ฆฌ ์•Œ๋ ค์กŒ์Šต๋‹ˆ๋‹ค. Caveman์€ ์ถœ๋ ฅ ํ† ํฐ์ด `~75%` ๊ฐ์†Œํ•˜๊ณ , ๋ฒค์น˜๋งˆํฌ ํ‰๊ท  ์ถœ๋ ฅ ์ ˆ๊ฐ๋ฅ ์ด `65%`, ์ถœ๋ ฅ ์ ˆ๊ฐ ๋ฒ”์œ„๊ฐ€ `22-87%`์ด๋ฉฐ, ์ž…๋ ฅ ์••์ถ• ๋„๊ตฌ์˜ ์ ˆ๊ฐ๋ฅ ์€ `~46%`๋ผ๊ณ  ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. RTK ๋ชจ๋“œ๋Š” **[RTK AI](https://github.com/rtk-ai)**์˜ **[RTK - Rust Token Killer](https://github.com/rtk-ai/rtk)**์—์„œ ์˜๊ฐ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” ํ„ฐ๋ฏธ๋„, ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, git ๋ฐ ๋„๊ตฌ ์ถœ๋ ฅ ํ•„ํ„ฐ๋ง์„ ์œ„ํ•œ ๊ณ ์„ฑ๋Šฅ ๋ช…๋ น ์ถœ๋ ฅ ์••์ถ• ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. RTK๋Š” `60-90%`์˜ ์ ˆ๊ฐ๋ฅ ์„ ๋ณด๊ณ ํ•˜๋ฉฐ, README์˜ ์ƒ˜ํ”Œ ์„ธ์…˜์—์„œ๋Š” `~80%`๊ฐ€ ์ ˆ๊ฐ๋œ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. --- ## ๊ณ ๊ธ‰ ์••์ถ• ์‹œ์Šคํ…œ 7๊ฐ€์ง€ ํ‘œ์ค€ ๋ชจ๋“œ ์™ธ์—๋„ OmniRoute๋Š” ์ปจํ…์ŠคํŠธ์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ณ ๊ธ‰ ์••์ถ• ์‹œ์Šคํ…œ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ### ์บ์‹œ ์ธ์‹ ์••์ถ• ์ผ๋ถ€ ๊ณต๊ธ‰์ž(ํ”„๋กฌํ”„ํŠธ ์บ์‹ฑ์„ ์‚ฌ์šฉํ•˜๋Š” Anthropic ๋“ฑ)๋Š” **ํ”„๋กฌํ”„ํŠธ ์บ์‹ฑ**์„ ์ง€์›ํ•˜์—ฌ ํ”„๋กฌํ”„ํŠธ์˜ ์ผ๋ถ€๋ฅผ ์บ์‹œํ•˜์—ฌ ๋น„์šฉ๊ณผ ์ง€์—ฐ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์บ์‹ฑ์ด ํ™œ์„ฑํ™”๋˜๋ฉด ๊ณต๊ฒฉ์ ์ธ ์••์ถ•์€ ์บ์‹œ๋œ ํ† ํฐ์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์บ์‹œ๋ฅผ ๋ฌดํšจํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ์„ฑ๋Šฅ์„ **์ €ํ•ด**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `cachingAware.ts` ๋ชจ๋“ˆ์€ **์บ์‹ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ์ง€**ํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ **์••์ถ• ์ „๋žต์„ ์กฐ์ •**ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. #### ์ž‘๋™ ๋ฐฉ์‹ 1. **์บ์‹ฑ ์ปจํ…์ŠคํŠธ ๊ฐ์ง€** โ€” ์š”์ฒญ ๋ณธ๋ฌธ์—์„œ `cache_control` ๋งˆ์ปค๋ฅผ ์Šค์บ”ํ•ฉ๋‹ˆ๋‹ค. 2. **์บ์‹ฑ ๊ณต๊ธ‰์ž ์‹๋ณ„** โ€” ๋Œ€์ƒ ๊ณต๊ธ‰์ž๊ฐ€ ์บ์‹ฑ์„ ์ง€์›ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. 3. **์ „๋žต ์กฐ์ •** โ€” ์บ์‹ฑ ๊ณต๊ธ‰์ž์˜ ๊ฒฝ์šฐ `aggressive`/`ultra`๋ฅผ `standard`๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. 4. **์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ๊ฑด๋„ˆ๋›ฐ๊ธฐ** โ€” ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์บ์‹œ๋˜๋ฏ€๋กœ ์••์ถ•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 5. **๊ฒฐ์ •๋ก ์  ๋ณ€ํ™˜ ์‚ฌ์šฉ** โ€” ์ผ๊ด€๋œ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜๋Š” ๋ณ€ํ™˜๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. #### ์ฝ”๋“œ ์˜ˆ์‹œ ```ts 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 ๋“ฑ) ### ์ ์ง„์  ๋…ธํ™” (Progressive Aging) ๊ธด ๋Œ€ํ™”๋Š” ๋งŽ์€ ๋ฉ”์‹œ์ง€ ํ„ด์„ ์ถ•์ ํ•˜์ง€๋งŒ, ์˜ค๋ž˜๋œ ํ„ด์€ ๊ด€๋ จ์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค. `progressiveAging.ts` ๋ชจ๋“ˆ์€ **ํ„ด ๊ฑฐ๋ฆฌ์— ๋”ฐ๋ผ ๋ฉ”์‹œ์ง€๋ฅผ ์ €ํ•˜์‹œํ‚ต๋‹ˆ๋‹ค**: - **์ตœ๊ทผ ํ„ด (0-3)**: ๊ทธ๋Œ€๋กœ ์œ ์ง€ (์ „์ฒด ์„ธ๋ถ€ ์ •๋ณด) - **์ค‘๊ฐ„ ํ„ด (4-8)**: ๊ฐ€๋ฒผ์šด ์••์ถ• (๊ณต๋ฐฑ, ์„œ์‹ ์ •๋ฆฌ) - **์˜ค๋ž˜๋œ ํ„ด (9+)**: ์›์‹œ์ธ ์••์ถ• (๋ถˆํ•„์š”ํ•œ ๋‚ด์šฉ ์ œ๊ฑฐ, ์š”์•ฝ) - **๋งค์šฐ ์˜ค๋ž˜๋œ ํ„ด (20+)**: ์‹ฌํ•˜๊ฒŒ ์š”์•ฝ๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋จ #### ์ฝ”๋“œ ์˜ˆ์‹œ ```ts 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` ๋ชจ๋“œ์—์„œ **ํ•ญ์ƒ ์ผœ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค**. ํŠนํžˆ ๋‹ค์Œ ๊ฒฝ์šฐ์— ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. - ์žฅ์‹œ๊ฐ„ ์ฝ”๋”ฉ ์„ธ์…˜ - ์—ฌ๋Ÿฌ ๋‚ ์— ๊ฑธ์นœ ๋Œ€ํ™” - ๋งŽ์€ ๋„๊ตฌ ํ˜ธ์ถœ์ด ์žˆ๋Š” ์—์ด์ „ํŠธ ์›Œํฌํ”Œ๋กœ์šฐ ### ์›์‹œ์ธ ์ถœ๋ ฅ ๋ชจ๋“œ (Caveman Output Mode) `outputMode.ts` ๋ชจ๋“ˆ์€ ๋ชจ๋ธ ์ž์ฒด๊ฐ€ ์••์ถ•๋˜๊ณ  ๊ฐ„๊ฒฐํ•œ ์ถœ๋ ฅ("์›์‹œ์ธ" ์Šคํƒ€์ผ)์„ ์ƒ์„ฑํ•˜๋„๋ก **์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ์ง€์นจ**์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค. #### ์ž‘๋™ ๋ฐฉ์‹ ์ž…๋ ฅ์„ ์••์ถ•ํ•˜๋Š” ๋Œ€์‹ , ์ด ๋ชจ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. > "์ตœ์†Œํ•œ์˜ ๋‹จ์–ด๋กœ ๋‹ตํ•˜์„ธ์š”. ๋ถˆํ•„์š”ํ•œ ์ธ์‚ฌ๋Š” ๊ฑด๋„ˆ๋›ฐ์„ธ์š”. ์งง์€ ๋ฌธ์žฅ์„ ์‚ฌ์šฉํ•˜์„ธ์š”." ์ด๊ฒƒ์€ ๋‹ค์Œ ๊ฒฝ์šฐ์— ํŠนํžˆ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. - ์ฝ”๋“œ ์ƒ์„ฑ (๊ฐ„๊ฒฐํ•œ ์ถœ๋ ฅ = ์ ์€ ํ† ํฐ) - ๋น ๋ฅธ Q&A (์ •๊ตํ•œ ์„ค๋ช… ๋ถˆํ•„์š”) - ์ผ๊ด„ ์ฒ˜๋ฆฌ (์ฒ˜๋ฆฌ๋Ÿ‰ ๊ทน๋Œ€ํ™”) #### ์‚ฌ์šฉ ์‹œ์  ์›์‹œ์ธ ์ถœ๋ ฅ ๋ชจ๋“œ๋Š” **์„ ํƒ ์‚ฌํ•ญ**์ž…๋‹ˆ๋‹ค โ€” ์ฝค๋ณด ๊ตฌ์„ฑ์„ ํ†ตํ•ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ```json { "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](https://github.com/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** โ€” ๊ฐ ์Šคํƒ€์ผ์— ๋Œ€ํ•ด ์ผœ๊ธฐ/๋„๊ธฐ ํ† ๊ธ€๊ณผ ์ˆ˜์ค€ ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ๋Š” ํ•œ ์ค„. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์••์ถ• ๊ตฌ์„ฑ์€ ์„ ํƒ ์‚ฌํ•ญ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ```json { "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](./EXTENDING_COMPRESSION.md#adding-an-output-style)๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ### ๋„๊ตฌ ๊ฒฐ๊ณผ ์••์ถ• `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% ์ ˆ์•ฝ) ``` #### ์‚ฌ์šฉ ์‹œ๊ธฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ์Šคํƒํ˜• ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. - ๋„๊ตฌ ์ค‘์‹ฌ ์›Œํฌํ”Œ๋กœ์šฐ (์—์ด์ „ํŠธ ์ฝ”๋”ฉ, ์—ฐ๊ตฌ) - ๋น„์šฉ์— ๋ฏผ๊ฐํ•œ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ - ์ตœ๋Œ€ ํ† ํฐ ์ ˆ์•ฝ์ด ํ•„์š”ํ•  ๋•Œ ์ฝค๋ณด๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑ: ```json { "strategy": "auto", "config": { "auto": { "modePack": "stacked" } } } ``` --- ## ์ฝค๋ณด๋ณ„ ์••์ถ• ์žฌ์ •์˜ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋งž๊ฒŒ ๋™์ž‘์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ „์—ญ ์••์ถ• ๋ชจ๋“œ๋ฅผ **์ฝค๋ณด๋ณ„๋กœ** ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```json { "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` ๋ชจ๋“œ ์‚ฌ์šฉ --- ## ํ•จ๊ป˜ ๋ณด๊ธฐ - [ํ™˜๊ฒฝ ์„ค์ •](../reference/ENVIRONMENT.md) โ€” ์••์ถ• ํ™˜๊ฒฝ ๋ณ€์ˆ˜ - [์•„ํ‚คํ…์ฒ˜ ๊ฐ€์ด๋“œ](../architecture/ARCHITECTURE.md) โ€” ์••์ถ• ํŒŒ์ดํ”„๋ผ์ธ ๋‚ด๋ถ€ ๊ตฌ์กฐ - [์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ](../guides/USER_GUIDE.md) โ€” ์••์ถ• ์‹œ์ž‘ํ•˜๊ธฐ - [RTK ์••์ถ•](./RTK_COMPRESSION.md) โ€” RTK ํ•„ํ„ฐ, ์‹ ๋ขฐ ๋ชจ๋ธ, ๊ฒ€์ฆ ๊ฒŒ์ดํŠธ, ์›์‹œ ์ถœ๋ ฅ ๋ณต๊ตฌ - [์••์ถ• ์—”์ง„](./COMPRESSION_ENGINES.md) โ€” Caveman, RTK, ์Šคํƒํ˜• ๊ตฌ์„ฑ, API, MCP, ๋Œ€์‹œ๋ณด๋“œ - [์••์ถ• ๊ทœ์น™ ํ˜•์‹](./COMPRESSION_RULES_FORMAT.md) โ€” JSON ๊ทœ์น™ ํŒฉ ํ˜•์‹ - [์••์ถ• ์–ธ์–ด ํŒฉ](./COMPRESSION_LANGUAGE_PACKS.md) โ€” ์–ธ์–ด๋ณ„ Caveman ๊ทœ์น™