# Compression Engines (ํ•œ๊ตญ์–ด) ๐ŸŒ **Languages:** ๐Ÿ‡บ๐Ÿ‡ธ [English](../../../../compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ช๐Ÿ‡น [am](../../../am/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ธ๐Ÿ‡ฆ [ar](../../../ar/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฆ๐Ÿ‡ฟ [az](../../../az/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ง๐Ÿ‡ฌ [bg](../../../bg/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ง๐Ÿ‡ฉ [bn](../../../bn/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ง๐Ÿ‡ฆ [bs](../../../bs/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡จ๐Ÿ‡ฟ [cs](../../../cs/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฉ๐Ÿ‡ฐ [da](../../../da/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฉ๐Ÿ‡ช [de](../../../de/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฌ๐Ÿ‡ท [el](../../../el/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ช๐Ÿ‡ธ [es](../../../es/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ช๐Ÿ‡ช [et](../../../et/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ท [fa](../../../fa/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ซ๐Ÿ‡ฎ [fi](../../../fi/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ซ๐Ÿ‡ท [fr](../../../fr/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ช [ga](../../../ga/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [gu](../../../gu/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ณ๐Ÿ‡ฌ [ha](../../../ha/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ฑ [he](../../../he/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [hi](../../../hi/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ญ๐Ÿ‡ท [hr](../../../hr/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ญ๐Ÿ‡บ [hu](../../../hu/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฆ๐Ÿ‡ฒ [hy](../../../hy/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ฉ [id](../../../id/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ณ๐Ÿ‡ฌ [ig](../../../ig/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฎ๐Ÿ‡น [it](../../../it/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฏ๐Ÿ‡ต [ja](../../../ja/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฌ๐Ÿ‡ช [ka](../../../ka/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฐ๐Ÿ‡ญ [km](../../../km/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [kn](../../../kn/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฑ๐Ÿ‡น [lt](../../../lt/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฑ๐Ÿ‡ป [lv](../../../lv/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [ml](../../../ml/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [mr](../../../mr/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฒ๐Ÿ‡พ [ms](../../../ms/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฒ๐Ÿ‡น [mt](../../../mt/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฒ๐Ÿ‡ฒ [my](../../../my/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ณ๐Ÿ‡ต [ne](../../../ne/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ณ๐Ÿ‡ฑ [nl](../../../nl/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ณ๐Ÿ‡ด [no](../../../no/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [or](../../../or/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [pa](../../../pa/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ต๐Ÿ‡ญ [phi](../../../phi/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ต๐Ÿ‡ฑ [pl](../../../pl/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ต๐Ÿ‡น [pt](../../../pt/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ง๐Ÿ‡ท [pt-BR](../../../pt-BR/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ท๐Ÿ‡ด [ro](../../../ro/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ท๐Ÿ‡บ [ru](../../../ru/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฑ๐Ÿ‡ฐ [si](../../../si/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ธ๐Ÿ‡ฐ [sk](../../../sk/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ธ๐Ÿ‡ฎ [sl](../../../sl/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ท๐Ÿ‡ธ [sr](../../../sr/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ธ๐Ÿ‡ช [sv](../../../sv/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฐ๐Ÿ‡ช [sw](../../../sw/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [ta](../../../ta/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [te](../../../te/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡น๐Ÿ‡ญ [th](../../../th/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡น๐Ÿ‡ท [tr](../../../tr/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡บ๐Ÿ‡ฆ [uk-UA](../../../uk-UA/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ต๐Ÿ‡ฐ [ur](../../../ur/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡บ๐Ÿ‡ฟ [uz](../../../uz/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ป๐Ÿ‡ณ [vi](../../../vi/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡ณ๐Ÿ‡ฌ [yo](../../../yo/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡จ๐Ÿ‡ณ [zh-CN](../../../zh-CN/docs/compression/COMPRESSION_ENGINES.md) ยท ๐Ÿ‡น๐Ÿ‡ผ [zh-TW](../../../zh-TW/docs/compression/COMPRESSION_ENGINES.md) --- OmniRoute ์••์ถ•์€ ์—”์ง„ ๊ณ„์•ฝ์„ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์ถ•๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“œ๋Š” ํ•˜๋‚˜์˜ ์—”์ง„์„ ์ง์ ‘ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ (`caveman` ๋˜๋Š” `rtk`) ์—ฌ๋Ÿฌ ์—”์ง„์„ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒฐ์ •๋ก ์  ์Šคํƒ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ## ๋ชจ๋“œ | ๋ชจ๋“œ | ์—”์ง„ ๊ฒฝ๋กœ | ์˜๋„๋œ ์ž…๋ ฅ | | ------------ | -------------------------------------------------------------------------------------------- | -------------------------------------------- | | `off` | ์—†์Œ | ์ •ํ™•ํ•œ ํ”„๋กฌํ”„ํŠธ ๋ณด์กด | | `lite` | Caveman ๋ผ์ดํŠธ ํ—ฌํผ | ์œ„ํ—˜ ๋ถ€๋‹ด์ด ์ ์€ ์ƒ์‹œ ์ •๋ฆฌ | | `standard` | Caveman | ์ž์—ฐ์–ด ํ”„๋กฌํ”„ํŠธ ์••์ถ• | | `aggressive` | Caveman + ๊ธฐ๋ก/๋„๊ตฌ ์š”์•ฝ๊ธฐ | ๊ธด ์ฑ„ํŒ… ์„ธ์…˜ | | `ultra` | Caveman + ๊ฐ€์ง€์น˜๊ธฐ ํ—ฌํผ | ์ปจํ…์ŠคํŠธ ์ œํ•œ ๋ณต๊ตฌ | | `rtk` | RTK | ํ„ฐ๋ฏธ๋„, ์…ธ, ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ ๋ฐ Git ์ถœ๋ ฅ | | `omniglyph` | OmniGlyph | ๋„ค์ดํ‹ฐ๋ธŒ ๊ณต๊ธ‰์ž ์™€์ด์–ด์—์„œ ์ด๋ฏธ์ง•๋œ ์ปจํ…์ŠคํŠธ | | `stacked` | ํŒŒ์ดํ”„๋ผ์ธ. ์š”์ฒญ ๊ธฐ๋ณธ๊ฐ’์€ `session-dedup -> lite`์ž…๋‹ˆ๋‹ค. `rtk -> caveman`์€ ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. | ํ˜ผํ•ฉ๋œ ๋„๊ตฌ ๋กœ๊ทธ ๋ฐ ์‚ฐ๋ฌธ, ์ตœ๋Œ€ ์ ˆ์•ฝ | ### OmniGlyph ์••์ถ• ํ”„๋กœํ•„ `omniglyph` ์—”์ง„(ํŒจํ‚ค์ง€ `omniglyph`, 1.4.0 ์ด์ƒ)์€ ๋ช…๋ช…๋œ ์˜๋ฏธ ํ”„๋กœํ•„์„ ํ—ˆ์šฉํ•˜๋ฉฐ, ์ด๋Š” ์••์ถ• ์„ค์ •์˜ `omniglyph.profile`์„ ํ†ตํ•ด ์ „์—ญ์ ์œผ๋กœ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์Šคํƒํ˜• ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋‹จ๊ณ„ ๊ตฌ์„ฑ์„ ํ†ตํ•ด ๋‹จ๊ณ„๋ณ„๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: | ํ”„๋กœํ•„ | ๊ฒฝ๊ณ„ | | ------------- | ---------------------------------------------------------------------------------------- | | `aggressive` | ๊ธฐ๋ณธ๊ฐ’. ๊ณต๊ฐœ๋œ ์˜์ˆ˜์ฆ์—์„œ ์ธก์ •๋œ ์ •์ฑ… โ€” ์ด๋ฏธ์ง€ ์‹œ์Šคํ…œ, ๋„๊ตฌ ๋ฌธ์„œ ๋ฐ ๋ฐ€์ง‘๋œ ๊ธฐ๋ก | | `balanced` | ๋ผ์ด๋ธŒ ์ƒํƒœ๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์œ ์ง€ํ•˜๊ณ , ๋งˆ์ง€๋ง‰ 8ํ„ด์„ ๋ณดํ˜ธํ•˜๋ฉฐ, ์˜ค๋ž˜๋œ ๋‹ซํžŒ ๊ธฐ๋ก์„ ์ถ•์†Œํ•ฉ๋‹ˆ๋‹ค. | | `coding-safe` | ๊ถŒํ•œ, ๋„๊ตฌ ์Šคํ‚ค๋งˆ ๋ฐ ๋ผ์ด๋ธŒ ๋„๊ตฌ ์ถœ๋ ฅ์„ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์œ ์ง€ํ•˜๊ณ , ๋งˆ์ง€๋ง‰ 12ํ„ด์„ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค. | | `passthrough` | ๋ณ€ํ™˜ ์—†์ด ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค; ์—”์ง„์€ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. | ํ”„๋กœํ•„์€ **์ฒœ์žฅ์ด์ง€ ๋ฐ”๋‹ฅ์ด ์•„๋‹™๋‹ˆ๋‹ค**: ํŒจํ‚ค์ง€์˜ `mergeCompressionProfileOptions`๋Š” ํ˜ธ์ถœ์ž๊ฐ€ ํ”„๋กœํ•„์ด ๋‹ซ์€ ์†์‹ค์ด ์žˆ๋Š” ๋ ˆ์ธ์„ ๋‹ค์‹œ ์—ด๋„๋ก ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋‹จ๊ณ„๋ณ„ `preserveSystemPrompt: false`๋Š” `coding-safe` ํ•˜์—์„œ ์‹œ์Šคํ…œ ์••์ถ•์„ ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ธก์ •๋œ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด: `coding-safe` ๋ฐ `balanced`๋Š” `minCompressChars`๋ฅผ ์ตœ๋Œ€๋กœ ๋†’์ด๊ณ  ์‹œ์Šคํ…œ, ๋„๊ตฌ ์Šคํ‚ค๋งˆ ๋ฐ ๋„๊ตฌ ๊ฒฐ๊ณผ๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์œ ์ง€ํ•˜๋ฏ€๋กœ, ์•„์ง ๊ธฐ๋ก์ด ๋ˆ„์ ๋˜์ง€ ์•Š์€ ์„ธ์…˜์€ `below_min_chars`์—์„œ ์ค‘๋‹จ๋˜๊ณ  ์—”์ง„์€ ์•„๋ฌด๊ฒƒ๋„ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ํ”„๋กœํ•„ ๋Œ€์‹  `aggressive`๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์ธ ์ด์œ ์ž…๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋Š” ํ™˜๊ฒฝ ๊ตฌ์„ฑ์—์„œ ์ž์ฒด ๋ชจ๋ธ ๋ฒ”์œ„์™€ ํ”„๋กœํ•„์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. OmniRoute๋Š” ๊ฒฐ์ •์„ ์œ„์ž„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค: ์–ด๋Œ‘ํ„ฐ๋Š” ๋ชจ๋ธ ๊ฒŒ์ดํŠธ๋ฅผ ํŒจํ‚ค์ง€์˜ ๊ฐ€์žฅ ์ œํ•œ์ ์ธ ๋ฒ”์œ„์— ๊ณ ์ •ํ•˜๋ฏ€๋กœ, ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ ์„ค์ •์€ ํ—ˆ์šฉ ๋ชฉ๋ก์„ ์ขํž ์ˆ˜๋งŒ ์žˆ๊ณ , OmniRoute์˜ ์ธก์ •๋œ ์˜์ˆ˜์ฆ์„ ๋„˜์–ด ํ™•์žฅํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ## ์—”์ง„ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋Š” `open-sse/services/compression/engines/registry.ts`์— ์žˆ์Šต๋‹ˆ๋‹ค. ์—”์ง„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณตํ†ต ๊ณ„์•ฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. - `id`: `caveman` ๋˜๋Š” `rtk`์™€ ๊ฐ™์€ ์•ˆ์ •์ ์ธ ์—”์ง„ ID - `apply(text, config)`: ์Šคํƒํ˜• ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ ˆ๊ฑฐ์‹œ ์‹คํ–‰ ๊ฒฝ๋กœ - `compress(input, config)`: ํ…์ŠคํŠธ + ํ†ต๊ณ„๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋ณธ ์‹คํ–‰ ๊ฒฝ๋กœ - `getConfigSchema()`: ์œ ํšจํ•œ ์„ค์ •์˜ JSON-Schema ์œ ์‚ฌ ๊ตฌ์กฐ๋ฅผ ๋ฐ˜ํ™˜ - `validateConfig(config)`: `{ valid, errors[] }`๋ฅผ ๋ฐ˜ํ™˜ ๋“ฑ๋ก์—๋Š” `registerCompressionEngine(engine)`(๊ณ ๊ธ‰ ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ `registerEngine`)์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด ํ•จ์ˆ˜๋Š” ์—”์ง„์„ ์ˆ˜๋ฝํ•˜๊ธฐ ์ „์— `assertValidEngine()`๊ณผ `validateConfig(defaultConfig)`๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์— ์—”์ง„์„ ์ œ๊ฑฐํ•˜๋ ค๋ฉด `unregisterCompressionEngine(id)`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. `strategySelector.ts`๋Š” ์••์ถ•์ด ์‹คํ–‰๋˜๊ธฐ ์ „์— ๊ธฐ๋ณธ ์ œ๊ณต ์—”์ง„์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ, ๋Ÿฐํƒ€์ž„ ์••์ถ•, ์Šคํƒํ˜• ๋ชจ๋“œ, ํ…Œ์ŠคํŠธ ๋ฐ ํ–ฅํ›„ ์—”์ง„์ด ๋™์ผํ•œ ์‹คํ–‰ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### MCP ์„ค๋ช… ์••์ถ•(๊ด€๋ จ ํ•ญ๋ชฉ) ๋ณ„๋„์˜ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๊ฐ€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ˆ˜์ค€์—์„œ MCP ๋„๊ตฌ ์„ค๋ช… ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ `open-sse/mcp-server/descriptionCompressor.ts` ๋ฐ [MCP-SERVER.md](../frameworks/MCP-SERVER.md)๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ์ด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋Š” Caveman ๊ทœ์น™์„ ์žฌ์‚ฌ์šฉํ•˜์ง€๋งŒ ์š”์ฒญ ํŽ˜์ด๋กœ๋“œ๊ฐ€ ์•„๋‹Œ ๋„๊ตฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ### ์ถ”๊ฐ€ ๊ธฐ๋ณธ ์ œ๊ณต ์—”์ง„ Caveman, RTK ๋ฐ LLMLingua-2 ์™ธ์—๋„ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ํŠน์ˆ˜ ๋ฌด์†์‹ค / ๊ตฌ์กฐ์  ์—”์ง„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค(์Šคํƒํ˜• ํŒŒ์ดํ”„๋ผ์ธ, ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ๋ฐ ํ…Œ์ŠคํŠธ์—์„œ ์‚ฌ์šฉ). | ์—”์ง„ | ID | ๊ธฐ๋Šฅ | | ------------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | | CCR | `ccr` | Content-Compress-Retrieve(H4): ์—ฐ์†๋œ ๋Œ€์šฉ๋Ÿ‰ ํ…์ŠคํŠธ ๋ธ”๋ก์„ ์ฝ˜ํ…์ธ  ์ฃผ์†Œ ๊ธฐ๋ฐ˜ ์ฐธ์กฐ๋กœ ๋Œ€์ฒดํ•˜์—ฌ, ๋ฐ˜๋ณต๋˜๊ฑฐ๋‚˜ ํฐ ๋ธ”๋ก์„ ํ•œ ๋ฒˆ๋งŒ ์ „์†กํ•˜๊ณ  ์ดํ›„์—๋Š” ์ฐธ์กฐํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. | | headroom | `headroom` | SmartCrusher(H3 + N5): ๋™์ข… JSON ๋ฐฐ์—ด ํŽ˜์ด๋กœ๋“œ๋ฅผ ์—ด ๊ธฐ๋ฐ˜ `[N rows]` ํ˜•์‹์œผ๋กœ ๋ฌด์†์‹ค ํ‘œ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค. | | ionizer | `ionizer` | ๋งค์šฐ ํฐ ๋™์ข… ๋ธ”๋ก์˜ ์ฒ˜์Œ/์ค‘๊ฐ„/๋งˆ์ง€๋ง‰ ํ–‰์„ ์ƒ˜ํ”Œ๋งํ•˜๊ณ , ์ƒ๋žต๋œ ์ค‘๊ฐ„ ๋ถ€๋ถ„์„ CCR ์ฝ˜ํ…์ธ  ์ฃผ์†Œ ๊ธฐ๋ฐ˜ ์ฐธ์กฐ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. | | session-dedup | `session-dedup` | ์ฝ˜ํ…์ธ  ์ฃผ์†Œ ๊ธฐ๋ฐ˜ ํ„ด ๊ฐ„ ์ค‘๋ณต ์ œ๊ฑฐ(TokenMizer์—์„œ ์˜๊ฐ ๋ฐ›์Œ): ๋™์ผํ•œ ์„ธ์…˜์˜ ์ด์ „ ํ„ด์—์„œ ์ด๋ฏธ ๋‚˜ํƒ€๋‚œ ํ…์ŠคํŠธ๋ฅผ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค. | **CCR ๊ฒ€์ƒ‰ ํ”„๋กœํ† ์ฝœ ์ง€์นจ(#8033):** CCR์ด ์š”์ฒญ์—์„œ ์ฒ˜์Œ์œผ๋กœ 1๊ฐœ ์ด์ƒ์˜ ๋ธ”๋ก์„ ๋Œ€์ฒดํ•˜๋ฉด, ์—”์ง„์€ ๋งˆ์ปค โ†’ ๋„๊ตฌ ๊ณ„์•ฝ์„ ํ˜ธ์ถœ์ž์—๊ฒŒ ์•Œ๋ ค ์ฃผ๋Š” ๋‹จ์ผ ๋ฉฑ๋“ฑ์„ฑ `system` ๋ฉ”์‹œ์ง€ (`[CCR protocol]` ์„ผํ‹ฐ๋„๋กœ ์‹œ์ž‘)๋ฅผ ์•ž์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์‹œ์ง€๋Š” `[CCR retrieve hash=<24hex> chars=N]` ๋งˆ์ปค์˜ ์˜๋ฏธ, ํ•ด์‹œ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ์  (16์ง„์ˆ˜ 24์ž ์ „์ฒด โ€” ํ•ด์‹œ๋ฅผ ์ž˜๋ชป ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด "block not found" ์˜ค๋ฅ˜์˜ ์ฃผ์š” ์›์ธ), ๊ทธ๋ฆฌ๊ณ  `[dedup:ref sha=...]` ๋งˆ์ปค๋Š” "๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•˜๋ผ"๊ฐ€ ์•„๋‹ˆ๋ผ "๊ธฐ๋ก์„ ๋˜๋Œ์•„๋ณด๋ผ"๋Š” ์˜๋ฏธ์ž„์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด ์•ˆ๋‚ด๋Š” ํ˜ธ์ถœ์ž๊ฐ€ ์ œ๊ณตํ•œ๋‹ค๊ณ  ๋ช…์‹œํ•œ `tools[]`๋ฅผ ํ†ตํ•ด ์‹ค์ œ๋กœ `omniroute_ccr_retrieve`์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ์ด ์ž…์ฆ๋œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค (`open-sse/services/compression/engines/ccr/protocolInstruction.ts`์˜ `callerSupportsCcrRetrieve()`). ํ•ด๋‹น ๋„๊ตฌ๊ฐ€ ์—†๋Š” ์ผ๋ฐ˜ OpenAI ํ˜ธํ™˜ ํ˜ธ์ถœ์ž์—๊ฒŒ๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๋Œ€์ƒ์„ ํ˜ธ์ถœํ•˜๋ผ๋Š” ์ง€์นจ์ด ์ „๋‹ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฝ์ž… ์ „์— ๋ฉ”์‹œ์ง€ ๊ธฐ๋ก์—์„œ ์„ผํ‹ฐ๋„์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋ฉฑ๋“ฑ์„ฑ์„ ๋ณด์žฅํ•˜๋ฏ€๋กœ, ์ด์ „ ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ค์‹œ ๋ณด๋‚ด๋Š” ๋ฉ€ํ‹ฐํ„ด ์š”์ฒญ์—์„œ๋„ ํ„ด๋งˆ๋‹ค ์•ˆ๋‚ด๊ฐ€ ์ค‘๋ณต์œผ๋กœ ์Œ“์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ## Caveman Caveman ๋ชจ๋“œ๋Š” ์ผ๋ฐ˜ ์‚ฐ๋ฌธ์˜ ์˜๋ฏธ๋ก ์  ์••์ถ•์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค: - ์ฝ”๋“œ ๋ธ”๋ก, URL, JSON, ๊ฒฝ๋กœ ๋ฐ ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค - ๊ตฐ๋”๋”๊ธฐ, ์œ ๋ณด์  ํ‘œํ˜„, ๋ฐ˜๋ณต๋˜๋Š” ๋งฅ๋ฝ ๋ฐ ์žฅํ™ฉํ•œ ์—ฐ๊ฒฐ ํ‘œํ˜„์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค - `open-sse/services/compression/rules/`์—์„œ ์–ธ์–ด๋ณ„ ํŒŒ์ผ ๊ทœ์น™ ํŒฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค - ๋ ˆ๊ฑฐ์‹œ `standard`, `aggressive`, `ultra` ๋ชจ๋“œ์—์„œ๋„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๋Œ€์‹œ๋ณด๋“œ ๊ฒฝ๋กœ๋Š” `Dashboard -> Context & Cache -> Caveman`์ž…๋‹ˆ๋‹ค. Caveman ์—…์ŠคํŠธ๋ฆผ์€ ์ถœ๋ ฅ ํ† ํฐ์ด `~75%` ๊ฐ์†Œํ•˜๊ณ , ๋ฒค์น˜๋งˆํฌ์—์„œ ํ‰๊ท  ์ถœ๋ ฅ ์ ˆ๊ฐ๋ฅ ์ด `65%`์ด๋ฉฐ ๋ฒ”์œ„๋Š” `22-87%`๋ผ๊ณ  ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž…๋ ฅ ์••์ถ• ๋„๊ตฌ์˜ ์ ˆ๊ฐ๋ฅ ์€ `~46%`์ž…๋‹ˆ๋‹ค. OmniRoute๋Š” ์ค‘์ฒฉ๋œ ํ”„๋กฌํ”„ํŠธ/์ปจํ…์ŠคํŠธ ์ ˆ๊ฐ ํšจ๊ณผ๋ฅผ ๋ฌธ์„œํ™”ํ•  ๋•Œ Caveman์˜ ์ž…๋ ฅ ์ธก ์ˆ˜์น˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Caveman ์ถœ๋ ฅ ๋ชจ๋“œ๋Š” ๋ณ„๋„์˜ ์‘๋‹ต ๋™์ž‘ ๊ธฐ๋Šฅ์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ## RTK RTK ๋ชจ๋“œ๋Š” ๋ช…๋ น ๋ฐ ๋„๊ตฌ ์ถœ๋ ฅ์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค: - `git status`, `git branch`, `git diff`, Vitest/Jest/Pytest, Cargo/Go ํ…Œ์ŠคํŠธ, TypeScript/Vite/Webpack ๋นŒ๋“œ, ESLint, npm ๊ฐ์‚ฌ/์„ค์น˜, Docker ๋กœ๊ทธ, ์…ธ `find`/`grep`, ์Šคํƒ ์ถ”์  ๋ฐ ์ผ๋ฐ˜ ๋กœ๊ทธ์™€ ๊ฐ™์€ ์ถœ๋ ฅ ํด๋ž˜์Šค๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค - `open-sse/services/compression/engines/rtk/filters/`์˜ 49๊ฐœ JSON ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค - ANSI ์ œ๊ฑฐ, ์น˜ํ™˜, ์ถœ๋ ฅ ์ผ์น˜ ์‹œ ๋‹จ๋ฝ ํ‰๊ฐ€, ์ค„ ์ œ๊ฑฐ/์œ ์ง€, ์ค„๋ณ„ ์ž˜๋ผ๋‚ด๊ธฐ, ๋จธ๋ฆฌ/๊ผฌ๋ฆฌ/์ตœ๋Œ€ ์ค„ ์ˆ˜ ์ž˜๋ผ๋‚ด๊ธฐ ๋ฐ ๋น„์–ด ์žˆ์„ ๋•Œ์˜ ํด๋ฐฑ์œผ๋กœ ๊ตฌ์„ฑ๋œ RTK ์Šคํƒ€์ผ ์„ ์–ธ์  ํŒŒ์ดํ”„๋ผ์ธ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค - `.rtk/filters.json`์˜ ์‹ ๋ขฐ ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ ํ•„ํ„ฐ์™€ `DATA_DIR/rtk/filters.json`์˜ ์ „์—ญ ํ•„ํ„ฐ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค - ANSI ์‹œํ€€์Šค, ์ง„ํ–‰ ์ƒํƒœ ๋…ธ์ด์ฆˆ, ๋ฐ˜๋ณต๋œ ์ค„ ๋ฐ ๋ถˆํ•„์š”ํ•œ ์ƒ์šฉ๊ตฌ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค - ์กฐ์น˜ ๊ฐ€๋Šฅํ•œ ์‹คํŒจ, ๊ฒฝ๊ณ , ์š”์•ฝ, ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ ๋ฐ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์˜ ๋งฅ๋ฝ์„ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค - ์ธ์ฆ๋œ ๊ด€๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•œ ๋ณต๊ตฌ/๋””๋ฒ„๊น…์„ ์œ„ํ•ด ์ˆ˜์ • ์ฒ˜๋ฆฌ๋œ ์›์‹œ ์ถœ๋ ฅ์„ ์„ ํƒ์ ์œผ๋กœ ๋ณด์กดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๋Œ€์‹œ๋ณด๋“œ ๊ฒฝ๋กœ๋Š” `Dashboard -> Context & Cache -> RTK`์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ํ•„ํ„ฐ, ์‹ ๋ขฐ, ๊ฒ€์ฆ ๋ฐ ์›์‹œ ์ถœ๋ ฅ ๋ณต๊ตฌ์— ๊ด€ํ•œ ์šด์˜ ์„ธ๋ถ€ ์ •๋ณด๋Š” [`RTK_COMPRESSION.md`](./RTK_COMPRESSION.md)์— ์žˆ์Šต๋‹ˆ๋‹ค. RTK ์—…์ŠคํŠธ๋ฆผ์€ ๋ช…๋ น ์ถœ๋ ฅ ์••์ถ•์—์„œ `60-90%`์˜ ์ ˆ๊ฐ๋ฅ ์„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. README ์˜ˆ์‹œ์—์„œ๋Š” 30๋ถ„๊ฐ„์˜ Claude Code ์„ธ์…˜์ด `~118,000`๊ฐœ ํ† ํฐ์—์„œ `~23,900`๊ฐœ๋กœ ๊ฐ์†Œํ•˜์—ฌ `79.7%`๊ฐ€ ์ ˆ๊ฐ๋ฉ๋‹ˆ๋‹ค. ## LLMLingua-2 (์˜๋ฏธ๋ก ์  ๊ฐ€์ง€์น˜๊ธฐ) LLMLingua-2 ๋ชจ๋“œ๋Š” ์†Œํ˜• ONNX ํ† ํฐ ๋ถ„๋ฅ˜๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฐ๋ฌธ์— **์˜๋ฏธ๋ก ์  ํ† ํฐ ๊ฐ€์ง€์น˜๊ธฐ**๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ๊ทœ์น™ ๊ธฐ๋ฐ˜ Caveman ๋ฐ RTK ์—”์ง„์„ ๋ณด์™„ํ•ฉ๋‹ˆ๋‹ค: - ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€๊ฐ€ ์•„๋‹Œ ๋ฉ”์‹œ์ง€์˜ ์‚ฐ๋ฌธ๋งŒ ์••์ถ•ํ•˜๋ฉฐ, ํŽœ์Šค ์ฝ”๋“œ ๋ธ”๋ก ๋ฐ ๊ธฐํƒ€ ๋ณด์กด ๋Œ€์ƒ ๊ตฌ์กฐ๋Š” ์ ˆ๋Œ€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค - ์›Œ์ปค ์Šค๋ ˆ๋“œ์—์„œ `@atjsh/llmlingua-2` ๋ฐฑ์—”๋“œ(`@huggingface/transformers`๋ฅผ ํ†ตํ•œ ONNX)๋ฅผ ์‹คํ–‰ํ•˜๋ฏ€๋กœ ๋ชจ๋ธ ์ถ”๋ก ์ด ์š”์ฒญ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค - **์ค‘์ฒฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**(`stackPriority` 35). ์ค‘์ฒฉ๋œ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ๋Š” ๊ตฌ์กฐ์  ์—”์ง„ (CCR, session-dedup, headroom, Caveman) ๋‹ค์Œ, `ultra` ์ด์ „์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์˜๋ฏธ๋ก ์  ๊ฐ€์ง€์น˜๊ธฐ๋Š” ์ด๋ฏธ ๊ตฌ์กฐ์ ์œผ๋กœ ์••์ถ•๋œ ํ…์ŠคํŠธ์— ๊ฐ€์žฅ ํšจ๊ณผ์ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ: `rtk -> caveman -> llmlingua` - **์–ด๋–ค ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์—ด๋ฆฐ ์ƒํƒœ๋กœ ์‹คํŒจ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค**(์„ ํƒ์  ์˜์กด์„ฑ ๋ˆ„๋ฝ, ์›Œ์ปค ์ƒ์„ฑ, ๋ชจ๋ธ ๋กœ๋“œ, ์ถ”๋ก  ๋˜๋Š” ์‹œ๊ฐ„ ์ดˆ๊ณผ) โ†’ ์˜ค๋ฅ˜ ๋Œ€์‹  ์›๋ณธ ํ…์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝ ์—†์ด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค ์—”์ง„ ์œ„์น˜: `open-sse/services/compression/engines/llmlingua/`. ๋Œ€์‹œ๋ณด๋“œ ๊ฒฝ๋กœ๋Š” `Dashboard -> Context & Cache -> LLMLingua`์ž…๋‹ˆ๋‹ค. ### ๋ชจ๋ธ ๊ธฐ๋ณธ ๋ชจ๋ธ์€ ๋น ๋ฅธ **TinyBERT**(`atjsh/llmlingua-2-js-tinybert-meetingbank`, ์•ฝ 57 MB)์ž…๋‹ˆ๋‹ค. ์ •ํ™•๋„๊ฐ€ ๋” ๋†’์€ **BERT-base** ๋ชจ๋ธ(`Arcoldd/llmlingua4j-bert-base-onnx`, ์•ฝ 710 MB)์€ ์—”์ง„ ๊ตฌ์„ฑ์˜ `model` ํ•„๋“œ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `@huggingface/transformers`๋Š” ์ฒซ ํ˜ธ์ถœ ์‹œ ์„ ํƒ๋œ ๋ชจ๋ธ์„ HuggingFace Hub์—์„œ `${DATA_DIR}/models/llmlingua`๋กœ ์ง€์—ฐ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค(`modelStore.ts`). ๋Œ€์‹  `modelPath` ๊ตฌ์„ฑ ์žฌ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ์ปฌ ์‚ฌ๋ณธ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜คํ”„๋ผ์ธ/์—์–ด๊ฐญ ์„ค์น˜). ### ์„ ํƒ์  ์˜์กด์„ฑ ๋ฐ ์˜จ๋””๋งจ๋“œ ์„ค์น˜ ๊ฐ€์ง€์น˜๊ธฐ ๊ฐ€๋Šฅํ•œ LLMLingua ๋Ÿฐํƒ€์ž„ ํ”ผ์–ด ์Šคํƒ์€ **์„ ํƒ ์‚ฌํ•ญ**์ž…๋‹ˆ๋‹ค. ๋‘ ํŒจํ‚ค์ง€๊ฐ€ `package.json`์—์„œ `optionalDependencies`๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์œผ๋ฉฐ, ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ๋Š” **์™ธ๋ถ€ ํ•ญ๋ชฉ**์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค(`scripts/build/prepublish.ts`๊ฐ€ ๋ฒˆ๋“ค์— ํฌํ•จํ•˜์ง€ ์•Š์Œ): | ํŒจํ‚ค์ง€ | ๋ฒ„์ „(๊ณ ์ •) | ์ฐธ๊ณ  | | -------------------- | ---------- | --------------------------------------------- | | `@atjsh/llmlingua-2` | `2.0.5` | ์ง„์ž…์  ํŒจํ‚ค์ง€์ด๋ฉฐ, ๋‚˜๋จธ์ง€๋ฅผ ํ”ผ์–ด๋กœ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค | | `js-tiktoken` | `^1.0.20` | ํ† ํฌ๋‚˜์ด์ € | `@huggingface/transformers`๋Š” `^4.2.0`์œผ๋กœ ๊ณ ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค(๋กœ์ปฌ ์ž„๋ฒ ๋”ฉ ๊ฒฝ๋กœ์™€ ๊ณต์œ ๋˜๋ฉฐ ๋…๋ฆฝ ์‹คํ–‰ํ˜• ๋ฒˆ๋“ค์—๋„ ์ถ”์  ํฌํ•จ๋จ). `@atjsh/llmlingua-2@2.0.5`๋Š” ์ด๋ฅผ `"^3.5.2 || ^4.0.0"` ๋ฒ”์œ„์˜ ํ”ผ์–ด๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ Transformers.js v3์™€ v4๊ฐ€ ๋ชจ๋‘ ์ง€์›๋ฉ๋‹ˆ๋‹ค. 2.0.4๋ถ€ํ„ฐ `@atjsh/llmlingua-2`๋Š” ๋” ์ด์ƒ `@tensorflow/tfjs`๋ฅผ ์š”๊ตฌํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ด์— ๋”ฐ๋ผ SLM ์Šคํƒ์˜ ๊ฐ€์žฅ ํฐ ๋‹จ์ผ ๊ตฌ์„ฑ ์š”์†Œ์˜€๋˜ TensorFlow.js๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์œ„ ๋‘ ํŒจํ‚ค์ง€๋งŒ ๊ฐ€์ง€์น˜๊ธฐ ๊ฐ€๋Šฅํ•œ SLM ํ”ผ์–ด์ž…๋‹ˆ๋‹ค. ํ‘œ์ค€ `npm install`(๊ฐœ๋ฐœ)์€ ์„ ํƒ์  ์˜์กด์„ฑ์„ ์ƒ๋žตํ•˜์ง€ ์•Š๋Š” ํ•œ ์„ ํƒ์  ์Šคํƒ์„ ์ž๋™์œผ๋กœ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. **์˜จ๋””๋งจ๋“œ ๋ฐฉ์‹์˜ ์ด์œ :** npm์— ๊ฒŒ์‹œ๋œ ํŒจํ‚ค์ง€, ๋…๋ฆฝ ์‹คํ–‰ํ˜• ๋ฒˆ๋“ค ๋ฐ Docker ์ด๋ฏธ์ง€๋Š” ํฌ๊ธฐ๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ์˜์กด์„ฑ์„ **ํฌํ•จํ•˜์ง€ ์•Š๊ณ ** ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ์˜์กด์„ฑ์ด ์—†์œผ๋ฉด ์›Œ์ปค์˜ ์˜์กด์„ฑ ๊ฒŒ์ดํŠธ(`worker.ts`์˜ `@atjsh/llmlingua-2` ํ•ด์„ ๊ฒ€์‚ฌ)๊ฐ€ ์‹คํŒจํ•˜๊ณ  ์—”์ง„์€ **์กฐ์šฉํžˆ ์—ด๋ฆฐ ์ƒํƒœ๋กœ ์‹คํŒจ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค**. ์ฆ‰, LLMLingua๋ฅผ ์„ ํƒํ•ด๋„ ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ…์ŠคํŠธ๊ฐ€ ๋ณ€๊ฒฝ ์—†์ด ๋ฐ˜ํ™˜๋˜๊ณ  ์˜ค๋ฅ˜๋„ ๊ธฐ๋ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ€์ง€์น˜๊ธฐ๋œ ํ™˜๊ฒฝ์—์„œ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ์„ ํƒ์  ์Šคํƒ์„ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค: ```bash # package.json optionalDependencies์— ์„ ์–ธ๋œ ๋ฒ„์ „์œผ๋กœ ๊ณ ์ • npm install @atjsh/llmlingua-2@2.0.5 js-tiktoken ``` `@tensorflow/tfjs` ์ œ๊ฑฐ(2.0.4+)๋กœ ์ด์ „์— ๋Œ€๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•˜๋˜ ์•ฝ 800 MB์˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. ๋‚จ์€ ์šฉ๋Ÿ‰์€ transformers.js ๋ฐ onnxruntime-node ๋Ÿฐํƒ€์ž„๊ณผ ์ตœ์ดˆ ์‚ฌ์šฉ ์‹œ ๋‹ค์šด๋กœ๋“œ๋˜๋Š” TinyBERT ๋ชจ๋ธ(์•ฝ 57 MB, npm์„ ํ†ตํ•ด ๋ฐ›์ง€ ์•Š์Œ)์ž…๋‹ˆ๋‹ค. ํ™˜๊ฒฝ๋ณ„: - **๊ฐœ๋ฐœ / `npm install`** โ€” `--omit=optional`(๋˜๋Š” `--no-optional`)์„ ์ „๋‹ฌํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ž๋™์œผ๋กœ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ์กฐ์น˜๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - **์ „์—ญ npm (`npm i -g omniroute`) / ๋…๋ฆฝ ์‹คํ–‰ํ˜•** โ€” ์„ค์น˜๋œ ํŒจํ‚ค์ง€ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ์œ„์˜ ์„ค์น˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜, ์„ ํƒ์  ์˜์กด์„ฑ์„ ์ƒ๋žตํ•˜์ง€ ์•Š๊ณ  ๋‹ค์‹œ ์„ค์น˜ํ•˜์„ธ์š”. - **Docker** โ€” ํŒŒ์ƒ ์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด์— ์„ค์น˜ ๋ช…๋ น์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”. ๋ฐฐํฌ๋œ ์ด๋ฏธ์ง€๋Š” ์˜๋„์ ์œผ๋กœ ๊ฒฝ๋Ÿ‰ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. - **VPS (PM2)** โ€” ์•ฑ์˜ `node_modules`์— ์„ค์น˜ํ•œ ๋‹ค์Œ, ์›Œ์ปค๊ฐ€ ๊ฒŒ์ดํŠธ๋ฅผ ๋‹ค์‹œ ํƒ์ง€ํ•˜๋„๋ก ํ”„๋กœ์„ธ์Šค๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์„ธ์š”. - **์›์‹œ Next ๋…๋ฆฝ ์‹คํ–‰ํ˜• (`npm run build` โ†’ `.build/next/standalone/server.js`)** โ€” ๋…๋ฆฝ ์‹คํ–‰ํ˜• ์ถ”์  ๊ฒฐ๊ณผ์—๋Š” ์›Œ์ปค์™€ ์„ ํƒ์  ์˜์กด์„ฑ์ด ๋ชจ๋‘ ํฌํ•จ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์—”์ง„์ด ๋ณ„๋‹ค๋ฅธ ์•Œ๋ฆผ ์—†์ด ํŽ˜์ผ ์˜คํ”ˆ๋ฉ๋‹ˆ๋‹ค. `scripts/build/colocate-standalone.mjs`๋Š” ๋‘ ์š”์†Œ(์›Œ์ปค esbuild + ๋…๋ฆฝ ์‹คํ–‰ํ˜• ํŠธ๋ฆฌ์— ๋Œ€ํ•œ ์„ ํƒ์  ์˜์กด์„ฑ ํด๋กœ์ €)๋ฅผ ๋ชจ๋‘ ๋‹ค์‹œ ์ ์šฉํ•˜๋ฉฐ, ๋งค ๋นŒ๋“œ ํ›„ `postbuild` npm ํ›…์„ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ฉฑ๋“ฑ์„ฑ์„ ๊ฐ€์ง€๋ฉฐ, ์˜์กด์„ฑ์ด ์—†์„ ๋•Œ๋„ ์˜ค๋ฅ˜ ์—†์ด ์ •์ƒ์ ์œผ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. **ํ™œ์„ฑํ™” ์—ฌ๋ถ€ ํ™•์ธ:** LLMLingua๋ฅผ ์„ ํƒํ–ˆ์„ ๋•Œ ์‹ค์ œ ์ผ๋ฐ˜ ํ…์ŠคํŠธ์˜ ํฌ๊ธฐ๊ฐ€ ์ค„์–ด๋“ค๋ฉด(์—”์ง„์ด ๋” ์ด์ƒ ํŽ˜์ผ ์˜คํ”ˆ๋˜์ง€ ์•Š์œผ๋ฉด) ํ™œ์„ฑํ™”๋œ ๊ฒƒ์ด๋ฉฐ, ์ฒซ ๋ฒˆ์งธ ์š”์ฒญ ์‹œ ๋ชจ๋ธ์ด `${DATA_DIR}/models/llmlingua`์— ๋‹ค์šด๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ดํŠธ๋Š” ์˜๋„์ ์œผ๋กœ `@atjsh/llmlingua-2`๋งŒ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”ผ์–ด ํŒจํ‚ค์ง€๋Š” ESM ์ „์šฉ์ด๋ฏ€๋กœ ์„ค์น˜๋˜์–ด ์žˆ์–ด๋„ `require.resolve`์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ `import()` ์‹œ์ ์— ํ”ผ์–ด ํŒจํ‚ค์ง€ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์‹ค์ œ๋กœ ๋ˆ„๋ฝ๋˜์–ด ์žˆ์œผ๋ฉด ์›Œ์ปค๋Š” ๊ณ„์† ํŽ˜์ผ ์˜คํ”ˆ๋ฉ๋‹ˆ๋‹ค. ## ์Šคํƒํ˜• ํŒŒ์ดํ”„๋ผ์ธ ์Šคํƒํ˜• ๋ชจ๋“œ๋Š” ํŒŒ์ดํ”„๋ผ์ธ ๋‹จ๊ณ„๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ```txt rtk -> caveman ``` ํ”„๋กฌํ”„ํŠธ์— ๋ช…๋ น ์ถœ๋ ฅ๊ณผ ์‚ฌ๋žŒ ๋˜๋Š” ์–ด์‹œ์Šคํ„ดํŠธ์˜ ์ž์—ฐ์–ด๊ฐ€ ํ•จ๊ป˜ ํฌํ•จ๋œ ์ฝ”๋”ฉ ์—์ด์ „ํŠธ ์„ธ์…˜์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. RTK๊ฐ€ ๋จผ์ € ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋งŽ์€ ๋„๊ตฌ ๋กœ๊ทธ๋ฅผ ์ค„์ธ ๋‹ค์Œ, Caveman์ด ๋‚จ์€ ์ž์—ฐ์–ด๋ฅผ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ ๋‹จ๊ณ„๋Š” ์••์ถ• ์„ค์ •์˜ `stackedPipeline` ๋˜๋Š” ์••์ถ• ์กฐํ•ฉ์„ ํ†ตํ•ด ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์—”์ง„์ด ๋™์ผํ•œ ์••์ถ• ๋Œ€์ƒ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ค„์ด๋ฉด ์ ˆ๊ฐ ํšจ๊ณผ๊ฐ€ ๋ˆ„์ ๋ฉ๋‹ˆ๋‹ค. ```txt combined = 1 - (1 - RTK savings) * (1 - Caveman input savings) average = 1 - (1 - 0.80) * (1 - 0.46) = 89.2% range = 1 - (1 - 0.60..0.90) * (1 - 0.46) = 78.4-94.6% ``` ## MCP ์ ‘๊ทผ์„ฑ ํŠธ๋ฆฌ ํ•„ํ„ฐ MCP ์ ‘๊ทผ์„ฑ ํŠธ๋ฆฌ ์Šค๋งˆํŠธ ํ•„ํ„ฐ๋Š” ํ”„๋กฌํ”„ํŠธ๋‚˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ์•„๋‹Œ MCP **๋„๊ตฌ ๊ฒฐ๊ณผ**์— ์ ์šฉ๋˜๋Š” ์‹คํ–‰ ํ›„ ์••์ถ• ๊ณ„์ธต์ž…๋‹ˆ๋‹ค. Playwright, computer-use ๋ฐ ๋ธŒ๋ผ์šฐ์ € ์ž๋™ํ™” MCP ์„œ๋ฒ„์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ์žฅํ™ฉํ•œ ์ ‘๊ทผ์„ฑ ํŠธ๋ฆฌ ๋ฐ ๋ธŒ๋ผ์šฐ์ € ์Šค๋ƒ…์ƒท ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ### ์ˆ˜ํ–‰ ์ž‘์—… 1. **๋…ธ์ด์ฆˆ ์ œ๊ฑฐ** โ€” ๋น„์–ด ์žˆ๋Š” ์ผ๋ฐ˜/ํ…์ŠคํŠธ ํ•ญ๋ชฉ(`- generic:`, `- text: ""`)์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. 2. **ํ˜•์ œ ํ•ญ๋ชฉ ์ถ•์•ฝ** โ€” ๊ตฌ์กฐ์ ์œผ๋กœ ๋ฐ˜๋ณต๋˜๋Š” ์ค„์ด `collapseThreshold`๊ฐœ ์ด์ƒ(๊ธฐ๋ณธ๊ฐ’ 30) ์—ฐ์†๋˜๋ฉด ์ฒซ `collapseKeepHead`๊ฐœ(๊ธฐ๋ณธ๊ฐ’ 10) ์ค„ + ๊ฐœ์ˆ˜ ์š”์•ฝ + ๋งˆ์ง€๋ง‰ `collapseKeepTail`๊ฐœ(๊ธฐ๋ณธ๊ฐ’ 5) ์ค„๋กœ ์ถ•์•ฝํ•ฉ๋‹ˆ๋‹ค. 3. **์ฐธ์กฐ ๋ณด์กด** โ€” Playwright/computer-use์— ํ•„์š”ํ•œ `[ref=eXX]` ์•ต์ปค๋Š” ์ ˆ๋Œ€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 4. **๊ฐ•์ œ ์ž˜๋ผ๋‚ด๊ธฐ** โ€” ์ถ•์•ฝ ํ›„์—๋„ ํ…์ŠคํŠธ๊ฐ€ `maxTextChars`(๊ธฐ๋ณธ๊ฐ’ 50,000)๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ๋„๋ก ํƒ์ƒ‰ ํžŒํŠธ์™€ ํ•จ๊ป˜ ์ž˜๋ผ๋ƒ…๋‹ˆ๋‹ค. ### ์—”์ง„ ์œ„์น˜ ```txt open-sse/services/compression/engines/mcpAccessibility/ index.ts โ† smartFilterText() ์ง„์ž…์  collapseRepeated.ts โ† ํ˜•์ œ ํ•ญ๋ชฉ ์ถ•์•ฝ ์•Œ๊ณ ๋ฆฌ์ฆ˜ constants.ts โ† DEFAULT_MCP_ACCESSIBILITY_CONFIG ``` ### ๊ตฌ์„ฑ ์ „์—ญ ์„ค์ •์˜ `compression.mcpAccessibility`๋กœ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค(๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ 056). ๊ธฐ๋ณธ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ```json { "enabled": true, "maxTextChars": 50000, "collapseThreshold": 30, "collapseKeepHead": 10, "collapseKeepTail": 5, "minLengthToProcess": 2000 } ``` ์ด ํ•„ํ„ฐ๋Š” `type`์ด `"text"`์ด๊ณ  ๊ธธ์ด๊ฐ€ `minLengthToProcess`๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๋„๊ตฌ ๊ฒฐ๊ณผ ํŽ˜์ด๋กœ๋“œ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กฌํ”„ํŠธ ์••์ถ•์ด๋‚˜ ์š”์ฒญ ํŽ˜์ด๋กœ๋“œ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ### ์˜ˆ์ƒ ์ ˆ๊ฐ๋ฅ  ํŽ˜์ด์ง€ ๋ณต์žก๋„์— ๋”ฐ๋ผ ๋ธŒ๋ผ์šฐ์ € ์Šค๋ƒ…์ƒท ๋„๊ตฌ ๊ฒฐ๊ณผ์˜ 60~80%๋ฅผ ์ ˆ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ถ•์•ฝ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์ค„ ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ O(n)์ด๋ฉฐ ์ถ”๊ฐ€ ์ง€์—ฐ ์‹œ๊ฐ„์€ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค. ### ์ด ํ•„ํ„ฐ์™€ ์œ„ ์••์ถ• ์—”์ง„์˜ ๋น„๊ต | ์ธก๋ฉด | Caveman / RTK / ์Šคํƒํ˜• | MCP ์ ‘๊ทผ์„ฑ ํ•„ํ„ฐ | | --------- | ------------------------ | -------------------------------------- | | ๋Œ€์ƒ | ์š”์ฒญ ํ”„๋กฌํ”„ํŠธ / ์ปจํ…์ŠคํŠธ | MCP ๋„๊ตฌ ๊ฒฐ๊ณผ | | ์‹คํ–‰ ์กฐ๊ฑด | ์••์ถ• ๋ชจ๋“œ ์„ค์ • | `compression.mcpAccessibility.enabled` | | ๋ฒ”์œ„ | ๋ชจ๋“  SSE ๋ฉ”์‹œ์ง€ | ๋„๊ตฌ ๊ฒฐ๊ณผ๋งŒ | | ์ฐธ์กฐ ์•ต์ปค | ํ•ด๋‹น ์—†์Œ | ํ•ญ์ƒ ๋ณด์กด | --- ## ์••์ถ• ์ฝค๋ณด ์••์ถ• ์ฝค๋ณด๋Š” ๋ผ์šฐํŒ… ์ฝค๋ณด์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ฆ„ ์žˆ๋Š” ์••์ถ• ํ”„๋กœํ•„์ž…๋‹ˆ๋‹ค. - `compression_combos`: ๋ชจ๋“œ, ํŒŒ์ดํ”„๋ผ์ธ, RTK ๊ตฌ์„ฑ, ์–ธ์–ด ๊ตฌ์„ฑ ๋ฐ ๊ธฐ๋ณธ๊ฐ’ ํ‘œ์‹œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค - `compression_combo_assignments`: ์••์ถ• ์ฝค๋ณด๋ฅผ ๋ผ์šฐํŒ… ์ฝค๋ณด์— ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค - ๋Ÿฐํƒ€์ž„ ํ†ตํ•ฉ์€ ์ผ๋ฐ˜ ์ฝค๋ณด ์žฌ์ •์˜๋ณด๋‹ค ๋จผ์ € ํ• ๋‹น๋œ ์••์ถ• ์ฝค๋ณด๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค - ๋ถ„์„์—๋Š” `compression_combo_id` ๋ฐ `engine`์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค ๋Œ€์‹œ๋ณด๋“œ ์œ„์น˜: `Dashboard -> Context & Cache -> Compression Combos`. ## ์ „์ œ์กฐ๊ฑด/์šด์˜์ž ๊ฐ€์ด๋“œ(CCR & session-dedup) CCR (`ccr`) ๋ฐ `session-dedup` ํ…์ŠคํŠธ๋ฅผ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๊ณ ** ์ฑ„์ ์ž** ๋’ค์—. ์ด ์„น์…˜์€ ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ, ๋‘ ๋งˆ์ปค ์ฝ๊ธฐ, ๋ˆ„๋ฝ๋œ ์ฝ˜ํ…์ธ  ๊ฒ€์ƒ‰ ๋˜๋Š” ์ง„๋‹จ์„ ์œ„ํ•œ ์šด์˜์ž ์ฐธ์กฐ์ž…๋‹ˆ๋‹ค. ๊ฐ ์—”์ง„์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์œ„์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ "์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ•ฉ๋‹ˆ๊นŒ?" ๋ ˆ์ด์–ด์ž…๋‹ˆ๋‹ค. ### ์ „์†ก ๋ฐ ์—”๋“œํฌ์ธํŠธ CCR ๋„๊ตฌ๋ฅผ ๋…ธ์ถœํ•˜๋Š” MCP ์„œ๋ฒ„๋Š” ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๊ธฐ๋ณธ URL ๋Š” `http://localhost:20128` (`OMNIROUTE_BASE_URL`)์ž…๋‹ˆ๋‹ค. | ์ˆ˜์†ก | URL / ๋ช…๋ น | ๋ฉ”๋ชจ | | --------------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | | ์ŠคํŠธ๋ฆฌ๋ฐ ๊ฐ€๋Šฅํ•œ HTTP (ํด๋ผ์ด์–ธํŠธ, ๊ถŒ์žฅ) | `http://localhost:20128/api/mcp/stream` | ํ˜„์žฌ MCP ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋Œ€ํ™”ํ•˜๋Š” ์—”๋“œํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค. | | ๋ ˆ๊ฑฐ์‹œ SSE ์‹ฑ๊ธ€ํ†ค | `http://localhost:20128/api/mcp/sse` | ์ด์ „ ์‹ฑ๊ธ€ํ†ค ์ „์†ก. ๊ทธ๊ฒƒ** ๋‹ซ๋Š”๋‹ค** ์ŠคํŠธ๋ฆฌ๋ฐ ๊ฐ€๋Šฅํ•œ ์„ธ์…˜; `/api/mcp/stream` ์— ๋Œ€ํ•ด `streamable-http` ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด ํด๋ผ์ด์–ธํŠธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. | | ์ŠคํŠœ๋””์˜ค | `omniroute --mcp` | ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” IDE MCP ๊ตฌ์„ฑ์˜ ๊ฒฝ์šฐ. `--dev` ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. `omniroute --mcp` ๋Š” stdio ์ง„์ž…์ ์ž…๋‹ˆ๋‹ค. | ### ์Šคํ† ๋ฆฌ์ง€ ๊ณ„์ธต(๋‹ค์‹œ ์‹œ์ž‘ํ•ด๋„ ์œ ์ง€๋˜๋Š” ๊ณ„์ธต) CCR ๋Š”** 2์ธต** ๋ฉ”๋ชจ๋ฆฌ ์ „์šฉ์ด ์•„๋‹Œ ์ €์žฅ: - **ํ•ซ ์ธ๋ฉ”๋ชจ๋ฆฌ ๊ณ„์ธต** โ€” ๋ธ”๋ก๋‹น ํ•œ๋„ 2 MiB, ์ฃผ์ฒด๋‹น 16 MiB, ์ „์—ญ 64 MiB. ํ•ญ๋ชฉ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ 24์‹œ๊ฐ„ TTL (์ตœ๋Œ€ 7์ผ)๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ „์ฒด MCP ๊ฒ€์ƒ‰์€ 256 KiB ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ๋” ํฐ ๊ฒƒ์€ ์—ฌ์ „ํžˆ ranged/grep ๋ชจ๋“œ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - **๋‚ด๊ตฌ์„ฑ์ด ๋›ฐ์–ด๋‚œ SQLite ๊ณ„์ธต** ( ๊ธฐ๋ณธ์ ์œผ๋กœ `ccr_blocks`, `COMPRESSION_CCR_DURABLE_STORE`, on) โ€” ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณ„์ธต์„ ์ง€์›ํ•˜๋ฏ€๋กœ ๋ธ”๋ก์€ LRU ์ œ๊ฑฐ, ์žฌ์‹œ์ž‘ ๋˜๋Š” ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰ ์ฐฉ๋ฅ™์—์„œ ์‚ด์•„๋‚จ์Šต๋‹ˆ๋‹ค. ํ–‰์€ ๋ธ”๋ก์˜ TTL ์œ ์ง€ํ•˜๋ฏ€๋กœ ํ•ด๋‹น TTL ์ง€๋‚˜๋Š” ๋ธ”๋ก์€ ๋‘ ๊ณ„์ธต ๋ชจ๋‘์—์„œ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์„ธ ๋ช…์˜ ๊ฐ€๋“œ๊ฐ€ ๋‚ด๊ตฌ์„ฑ ๊ณ„์ธต โ€” ์ œํ•œ์ ์œผ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ๋ธ”๋ก์€ ๋ฉ”๋ชจ๋ฆฌ ์ „์šฉ์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. 1. ๋ธ”๋ก์ด ๋๋‚ฌ์–ด** 512 KB** (`MAX_DURABLE_BLOCK_BYTES`); 2. ๋Ÿฐํƒ€์ž„์€ ํด๋ผ์šฐ๋“œ ๋Ÿฐํƒ€์ž„์ž…๋‹ˆ๋‹ค(๋กœ์ปฌ ๋””์Šคํฌ ์—†์Œ). 3. `COMPRESSION_CCR_DURABLE_STORE=false`. ๋”ฐ๋ผ์„œ "๋ธ”๋ก์ด ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค"๋Š” ํฌ๊ด„์ ์ธ ์žฌ์‹œ์ž‘ ์ด์•ผ๊ธฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํด๋ผ์šฐ๋“œ๊ฐ€ ์•„๋‹Œ ๋กœ์ปฌ ๋Ÿฐํƒ€์ž„์˜ sub-512 KB ๋ธ”๋ก์€ ํ•ด๋‹น TTL ์†Œ์ง„๋  ๋•Œ๊นŒ์ง€ ๋‚ด๊ตฌ์„ฑ ๊ณ„์ธต์„ ํ†ตํ•ด ์žฌ์‹œ์ž‘ ํ›„์—๋„ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜์— ๋Œ€ํ•œ [ํ™˜๊ฒฝ ์ฐธ์กฐ๋ฅผ](../reference/ENVIRONMENT.md) ์ฐธ์กฐํ•˜์„ธ์š”. ### ๋‘ ๊ฐœ์˜ ๋งˆ์ปค | ์ฑ„์ ์ž | ์˜๋ฏธ | ๋ชจ๋ธ์ด ํ•ด์•ผ ํ•  ์ผ | | ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `[CCR retrieve hash=<24hex> chars=N]` | ํฐ ๋ธ”๋ก์ด ์ฝ˜ํ…์ธ  ์ฃผ์†Œ๋กœ ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. | ๋‹ค์Œ๊ณผ ๊ฐ™์ด `omniroute_ccr_retrieve` ์— ์ „ํ™”ํ•˜์„ธ์š”.** 24-16์ง„์ˆ˜ ํ•ด์‹œ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌ๋จ** ์›๋ณธ ํ…์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ์–ป์œผ๋ ค๋ฉด. | | `[dedup:ref sha=โ€ฆ]` | `session-dedup` ๋™์ผํ•œ ์„ธ์…˜์˜ ์ด์ „ ๋‹จ๊ณ„์—์„œ ์ด๋ฏธ ์ „์†ก๋œ ํ…์ŠคํŠธ๋ฅผ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€** ์˜๋„์ ์ธ ๋’ค๋Œ์•„๋ณด๊ธฐ** , ์†์‹ค์ด๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. | ํ•˜๋‹ค** ~ ์•„๋‹ˆ๋‹ค** ์–ด๋–ค ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ˆ˜ํ–‰** ~ ์•„๋‹ˆ๋‹ค** ๊ทธ๊ฒƒ์„ "์žฌ๊ตฌ์„ฑ"ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜์‹ญ์‹œ์˜ค. ํ…์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์€ ์ •์‹ ์‚ฌ๋ณธ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ํ„ด์€ ๋‹ค์‹œ ์ž‘์„ฑ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ดํ›„ ํ„ด์—์„œ ์ค‘๋ณต์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. | `[dedup:ref]` ๋ฃฉ๋ฐฑ์€ ์˜๋„์ ์ธ ํ”„๋กœํ† ์ฝœ ๊ฒฐ์ •์ž…๋‹ˆ๋‹ค. โ€” ์‚ฌ์ „ ์ „์†ก ์žฌ๊ตฌ์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. "์ด ์ •ํ™•ํ•œ ํ…์ŠคํŠธ๋Š” ์ด ์„ธ์…˜ ์ดˆ๊ธฐ์— ์ด๋ฏธ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค."๋กœ ์ฒ˜๋ฆฌํ•˜์„ธ์š”. ### ํด๋ผ์ด์–ธํŠธ ์ „์ œ์กฐ๊ฑด - **ํ‚ค(stdio):** stdio ํ˜ธ์ถœ์ž๋Š” ์š”์ฒญ๋ณ„ ID๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ `OMNIROUTE_API_KEY` ( MCP ์„œ๋ฒ„์˜ `env` ์— ์„ค์ •๋จ)๋กœ ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์—†์œผ๋ฉด ํ˜ธ์ถœ์ž๋Š” ์ต๋ช…์ด ๋˜๋ฉฐ ์ฃผ์ฒด๊ฐ€ ํ•„์š”ํ•œ ๋„๊ตฌ์˜ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - **`tools[]` ๋Š” ์ฃผ์ž… ์ „์ œ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค.** CCR ๊ฒ€์ƒ‰ ํ”„๋กœํ† ์ฝœ ๋ช…๋ น(#8033)์ด ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค.** ์˜ค์ง** ์š”์ฒญ์˜ ๊ด‘๊ณ ๋œ `tools[]` ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‹ค์ œ๋กœ `omniroute_ccr_retrieve` ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ์„ ์ฆ๋ช…ํ•  ๋•Œ. ์ผ์น˜๋Š” ๊ตฌ๋ถ„ ๊ธฐํ˜ธ(`__`, `.`, `/`, `:`)๋กœ ๋ฌถ์ธ ํ›„ํ–‰ ์„ธ๊ทธ๋จผํŠธ ์ผ์น˜์ž…๋‹ˆ๋‹ค. โ€” ์ ˆ๋Œ€ ํ•˜์œ„ ๋ฌธ์ž์—ด โ€” ์•„๋‹ˆ๋ฏ€๋กœ `mcp__gateway__omniroute_ccr_retrieve` ๊ณผ ๊ฐ™์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ด๋ฆ„์€ ์—ฌ์ „ํžˆ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. `tools[]` ์ด ์—†๊ฑฐ๋‚˜ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์€ ์˜๋„์ ์œผ๋กœ ๋ช…๋ น์–ด๊ฐ€ ์ฃผ์ž…๋˜์ง€ _์•Š์•˜๋‹ค_๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. - **`codemode:false` (OpenCode ํด๋ผ์ด์–ธํŠธ).** OpenCode ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฝ”๋“œ ๋ชจ๋“œ๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ธฐ๋ณธ ๋„๊ตฌ๋งŒ ๋ชจ๋ธ์— ๊ด‘๊ณ ํ•˜๊ณ ** ๊ทธ๋ ‡์ง€ ์•Š๋‹ค** MCP ๋„๊ตฌ๋ฅผ ๊ธฐ๋ณธ `tools[]` ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜์„ธ์š”. `omniroute_ccr_*` ๋„๊ตฌ๊ฐ€ ๋ณด๊ธ‰๋˜๋„๋ก MCP ์„œ๋ฒ„ ํ•ญ๋ชฉ์— `codemode: false` ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€** ๊ณ ๊ฐ** ์„ค์ •์€ OmniRoute ์„ค์ •์ด ์•„๋‹™๋‹ˆ๋‹ค. ์•„์ง CCR ๋ช…๋ น์–ด๊ฐ€ ์‚ฝ์ž…๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. OpenCode ๋„๊ตฌ์— `_` ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋ฏ€๋กœ `omniroute` ์ด๋ผ๋Š” ์„œ๋ฒ„๋Š” `omniroute_omniroute_ccr_retrieve` ๋…ธ์ถœํ•˜๊ณ  `_` ์ผ์น˜ํ•˜๋Š” ๊ตฌ๋ถ„ ๊ธฐํ˜ธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. - **๊ต์žฅ.** ์ €์žฅ ๋ฐ ๊ฒ€์ƒ‰์€ ์ธ์ฆ๋œ ์ฃผ์ฒด๋ณ„๋กœ( API ํ‚ค๋ณ„๋กœ) ๊ฒฉ๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ํ‚ค๋Š” ์ž์ฒด ๋ธ”๋ก๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### ๋„๊ตฌ๋ณ„ ๋ฒ”์œ„ ๋ฒ”์œ„๊ฐ€ ์ข์€ HTTP/SSE ํ˜ธ์ถœ์ž์— ๋Œ€ํ•ด์„œ๋Š” ๋ฒ”์œ„ ์ ์šฉ์ด ํ•ญ์ƒ ์ผœ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. `omniroute_` CCR ๋„๊ตฌ์—๋Š” ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. | ๋„๊ตฌ | ๋ฒ”์œ„ | | ------------------------ | ------------------- | | `omniroute_ccr_store` | `write:compression` | | `omniroute_ccr_delete` | `write:compression` | | `omniroute_ccr_retrieve` | `read:compression` | | `omniroute_ccr_inspect` | `read:compression` | | `omniroute_ccr_list` | `read:compression` | | `omniroute_ccr_stats` | `read:compression` | ๋ˆ„๋ฝ๋œ ๋ฒ”์œ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.**MCP ๋„๊ตฌ ์˜ค๋ฅ˜ ๊ฒฐ๊ณผ** (`isError: true`, HTTP 403 โ€” ์•„๋‹˜ `403 LOCAL_ONLY` ๋Š” ๋ณ„๋„์˜ ๋ฃจํ”„๋ฐฑ ๊ฒฝ๋กœ ๋ณดํ˜ธ ์ธ์ฆ์ž…๋‹ˆ๋‹ค.): `Error: Insufficient MCP scopes for . Missing: .` ์ตœ์†Œ ์›๊ฒฉ ํ‚ค๋Š” `mcp:connect` ( `/api/mcp/` ๋กœ์ปฌ ์ „์šฉ ๋ถ„ํ•  ์Šน์ธ)์™€ ํ•„์š”ํ•œ ํŠน์ • read/write ๋ฒ”์œ„๋ฅผ ๋ณด์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### ํด๋ผ์ด์–ธํŠธ ๋งคํŠธ๋ฆญ์Šค | ๊ณ ๊ฐ | ์ˆ˜์†ก | ์‚ฌ์šฉํ•  ๊ตฌ์„ฑ | `tools[]` ๊ด‘๊ณ ํ–ˆ์–ด? (โ†’ CCR ๋ช…๋ น์–ด ์‚ฝ์ž…๋จ) | | -------------- | ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Claude ์ฝ”๋“œ | ์ŠคํŠธ๋ฆฌ๋ฐ ๊ฐ€๋Šฅ-http | `claude mcp add --transport http omniroute http://localhost:20128/api/mcp/stream` | ์˜ˆ โ€” MCP ๊ฐ€๋Šฅ; ์ฃผ์ž…. | | Cursor / Cline | `stdio`** ๋˜๋Š”** `streamable-http` | stdio: `env` ์— `OMNIROUTE_API_KEY` ์žˆ๋Š” `omniroute --mcp` ; ๋˜๋Š” `http://localhost:20128/api/mcp/stream` ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์›๊ฒฉ MCP ํ•ญ๋ชฉ( [์„ค์ • ๊ฐ€์ด๋“œ โ†’ MCP ํด๋ผ์ด์–ธํŠธ ๊ตฌ์„ฑ](../guides/SETUP_GUIDE.md#mcp-client-configuration) ์ฐธ์กฐ) | ์˜ˆ โ€” `omniroute_ccr_*` ๋„๊ตฌ๋ฅผ ๊ด‘๊ณ ํ•ฉ๋‹ˆ๋‹ค. | | OpenCode | ์ŠคํŠธ๋ฆฌ๋ฐ ๊ฐ€๋Šฅ-http | `opencode mcp add omniroute --url http://localhost:20128/api/mcp/stream`, ํ”Œ๋Ÿฌ์Šค `codemode: false` | `codemode: false` ๋กœ๋งŒ ๊ด‘๊ณ ๋˜๋Š” ๋„๊ตฌ; `omniroute_omniroute_ccr_retrieve` ์ผ์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ช…๋ น์ด ์—ฌ์ „ํžˆ ์ฃผ์ž…๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค( [ํด๋ผ์ด์–ธํŠธ ์ „์ œ ์กฐ๊ฑด](#client-prerequisites) ์ฐธ์กฐ). | | OpenAI ํ˜ธํ™˜ | OpenAI ํ˜ธํ™˜ HTTP (์ฑ„ํŒ… ์™„๋ฃŒ) | OpenAI ํ˜ธํ™˜ ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ํ‘œ์ค€ ์ฑ„ํŒ… ์™„๋ฃŒ ํด๋ผ์ด์–ธํŠธ | **์ ˆ๋Œ€** ์ผ๋ฐ˜ OpenAI ํ˜ธํ™˜ ํ˜ธ์ถœ์ž โ€” ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•˜๋ผ๋Š” ์ง€์‹œ๊ฐ€ ์ „ํ˜€ ์ „๋‹ฌ๋˜์ง€ ์•Š์œผ๋ฉฐ ๋ช…๋ น๋„ ์ฃผ์ž…๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. | ### ๊ฒ€์ƒ‰ ์ œํ•œ ๋ฐ ํŽ˜์ด์ง€ ๋งค๊ธฐ๊ธฐ MCP ๋„๊ตฌ ํ…์ŠคํŠธ ๊ฒฐ๊ณผ๋Š” `mcpAccessibility.maxTextChars` ์ฃผ์œ„์—์„œ ์ž˜๋ฆฝ๋‹ˆ๋‹ค(๊ธฐ๋ณธ๊ฐ’ `50000`). ๋ธ”๋ก์˜ `full` ๊ฒ€์ƒ‰์€ 256 KiB โ€” ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.** ๋ฌด์ œํ•œ์˜ ์ „์ฒด ๊ฒ€์ƒ‰์ด ์—†์Šต๋‹ˆ๋‹ค.** . ๋ธ”๋ก์˜ `chars=N` ํฐ ๊ฒฝ์šฐ ์ „์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋Œ€์‹  ํŽ˜์ด์ง•ํ•˜์„ธ์š”. - ๊ฒฝํ—˜ ๋ฒ•์น™:**`chars > 40000` โ†’ `mode` ์‚ฌ์šฉํ•˜์„ธ์š”** , ๊ฒฐ์ฝ” ๊ฝ‰ ์ฐจ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - `mode:"grep"` โ€” regex `pattern` ํ•œ ์ค„์”ฉ ์ผ์น˜ํ•˜๋ฉฐ ์ตœ๋Œ€ 1,000๊ฐœ์˜ ์ผ์น˜ํ•˜๋Š” ์ค„(`unique: true` ๋ฐ˜๋ณต ์‚ญ์ œ), "ํ•„์š”ํ•œ ํ•œ ์ค„ ์ฐพ๊ธฐ"์— ๊ฐ€์žฅ ์ €๋ ดํ•ฉ๋‹ˆ๋‹ค. - `mode:"lines"` โ€” 1 ์ธ๋ฑ์Šค ๋ผ์ธ ๋ฒ”์œ„; `start` ์™€ `end` ๋ชจ๋‘ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. - `mode:"head"` / `mode:"tail"` โ€” first/last `n` ๋ผ์ธ. - `mode:"stats"` โ€” ๋ณธ๋ฌธ ์—†์ด ํ–‰, ๋ฌธ์ž ๋ฐ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. `start`/`end` ์™€ ํ•จ๊ป˜ `mode:"lines"` ์‚ฌ์šฉํ•˜๋ฉด ํ•œ ๋ฒˆ์— ๋ชจ๋“  ๊ฒƒ์„ ์š”์ฒญํ•˜๋Š” ๋Œ€์‹  ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ๊ธด ๋ธ”๋ก์„ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### ๋„๊ตฌ ์ด๋ฆ„ ์ง€์ • ๊ฒ€์ƒ‰ ๋„๊ตฌ์˜ ์ด๋ฆ„์€ ํ˜„์žฌ `omniroute_ccr_retrieve` ์ž…๋‹ˆ๋‹ค( `omniroute_` ์ ‘๋‘์‚ฌ๋Š” ์„œ๋ฒ„ ๊ฐ„ ์ด๋ฆ„ ์ถฉ๋Œ์— ๋Œ€ํ•œ ์˜ค๋ž˜๋œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค). ๋” ๊น”๋”ํ•œ ๊ฒฝ๊ณ„ ์ ‘๋ฏธ์‚ฌ ๋„๊ตฌ ์ด๋ฆ„๊ณผ MCP JSON ๊ฒฐ๊ณผ ์ž˜๋ฆฐ ์ค‘๊ฐ„ ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์€ ์—…์ŠคํŠธ๋ฆผ ํ›„์† ์กฐ์น˜๋กœ ์ถ”์ ๋ฉ๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€์—๋Š” ํ˜„์žฌ ์ œ๊ณต๋œ ๋™์ž‘๋งŒ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ### ์„ธ์…˜ ์ˆ˜๋ช…์ฃผ๊ธฐ ์ŠคํŠธ๋ฆฌ๋ฐ ๊ฐ€๋Šฅํ•œ HTTP ์„ธ์…˜์ด ์œ ํœด ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ์„ธ์…˜์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค. ์œ ํœด ๊ธฐ๊ฐ„์€ `OMNIROUTE_MCP_SESSION_IDLE_MS` ์— ์˜ํ•ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค(๊ธฐ๋ณธ๊ฐ’ 5๋ถ„, ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๊ฐ’์ด ์•„๋‹Œ ์ด๋ฆ„์œผ๋กœ ์ฐธ์กฐ๋˜๋ฏ€๋กœ ์ด ํŽ˜์ด์ง€๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ํ‘œ๋ฅ˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ์œ ํœด ์„ธ์…˜์˜ ์ฆ์ƒ์€ `Unknown Mcp-Session-Id` โ€” ๊ฐ€ ์žˆ๋Š” HTTP 404์ž…๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์„ธ์…˜์„ ๋‹ค์‹œ ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.** ~ ์•„๋‹ˆ๋‹ค** ํ‚ค๋ฅผ ํšŒ์ „ํ•˜๊ฑฐ๋‚˜, ๋ฒ”์œ„๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, ๋„๊ตฌ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋ ค๋ฉด ## API ์ธํ„ฐํŽ˜์ด์Šค | ๊ฒฝ๋กœ | ์šฉ๋„ | | -------------------------------------- | -------------------------------------------- | | `/api/settings/compression` | ์ „์—ญ ์••์ถ• ์„ค์ •(`mcpAccessibility` ๊ตฌ์„ฑ ํฌํ•จ) | | `/api/compression/preview` | ๋ชจ๋“  ์••์ถ• ๋ชจ๋“œ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ | | `/api/compression/language-packs` | ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Caveman ์–ธ์–ด ํŒฉ ๋ชฉ๋ก ์กฐํšŒ | | `/api/context/caveman/config` | Caveman ์„ค์ • ๋ณ„์นญ | | `/api/context/rtk/config` | RTK ๊ธฐ๋ณธ๊ฐ’ ๋ฐ ์„ค์ • | | `/api/context/rtk/filters` | RTK ํ•„ํ„ฐ ์นดํƒˆ๋กœ๊ทธ | | `/api/context/rtk/test` | RTK ๋ฏธ๋ฆฌ ๋ณด๊ธฐ/ํ…Œ์ŠคํŠธ ์—”๋“œํฌ์ธํŠธ | | `/api/context/rtk/raw-output/[id]` | ์ธ์ฆ๋œ ๋ฏผ๊ฐ ์ •๋ณด ์ œ๊ฑฐ ์›์‹œ ์ถœ๋ ฅ ๋ณต๊ตฌ | | `/api/context/combos` | ์••์ถ• ์ฝค๋ณด CRUD | | `/api/context/combos/[id]/assignments` | ๋ผ์šฐํŒ… ์ฝค๋ณด ํ• ๋‹น CRUD | | `/api/context/analytics` | ์••์ถ• ๋ถ„์„ ๋ณ„์นญ | ๊ด€๋ฆฌ ๊ฒฝ๋กœ์—๋Š” ๊ด€๋ฆฌ ์ธ์ฆ ๋˜๋Š” API ํ‚ค ์ •์ฑ… ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ## MCP ๋„๊ตฌ ์••์ถ• ๊ธฐ๋Šฅ์€ 5๊ฐœ์˜ MCP ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. | ๋„๊ตฌ | ๋ฒ”์œ„ | ์šฉ๋„ | | ----------------------------------- | ------------------- | ------------------------------ | | `omniroute_compression_status` | `read:compression` | ์„ค์ •, ๋ถ„์„, ์บ์‹œ ํ†ต๊ณ„ | | `omniroute_compression_configure` | `write:compression` | ์ „์—ญ ์„ค์ • ์—…๋ฐ์ดํŠธ | | `omniroute_set_compression_engine` | `write:compression` | ๋ชจ๋“œ ๋ฐ ์„ ํƒ์  ํŒŒ์ดํ”„๋ผ์ธ ์„ค์ • | | `omniroute_list_compression_combos` | `read:compression` | ์••์ถ• ์ฝค๋ณด ๋ชฉ๋ก ์กฐํšŒ | | `omniroute_compression_combo_stats` | `read:compression` | ์ฝค๋ณด/์—”์ง„ ๋ถ„์„ ์กฐํšŒ | ## ๋ฒ”์œ„ ๋ฐ ์ œ์™ธ ์‚ฌํ•ญ **์ž„๋ฒ ๋”ฉ์€ ์ ˆ๋Œ€ ์••์ถ•๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.** `open-sse/handlers/embeddings.ts`๋Š” ์–ด๋– ํ•œ ์••์ถ• ์—”์ง„๋„ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์š”์ฒญ/์‘๋‹ต ๋ณธ๋ฌธ์€ ๋ณ€๊ฒฝ ์—†์ด ์‹คํ–‰๊ธฐ๋กœ ๊ณง๋ฐ”๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด๋Š” ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ตฌ์กฐ์ ์ธ ํŠน์„ฑ์ž…๋‹ˆ๋‹ค(์ž„๋ฒ ๋”ฉ๊ณผ ์ฑ„ํŒ… ์™„์„ฑ์€ ์„œ๋กœ ๋ถ„๋ฆฌ๋œ ํ•ธ๋“ค๋Ÿฌ์ž„). ๋”ฐ๋ผ์„œ #8034์˜ ๋ฒกํ„ฐ ์™œ๊ณก ์šฐ๋ ค๋Š” ์ž„๋ฒ ๋”ฉ ๊ฒฝ๋กœ์—์„œ ๋ฐœ์ƒํ•  ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. **๋ชจ๋ธ๋ณ„/์—”๋“œํฌ์ธํŠธ๋ณ„ ์ œ์™ธ ํ•„ํ„ฐ(#8034).** ์ฑ„ํŒ… ์™„์„ฑ์˜ ๊ฒฝ์šฐ ์šด์˜์ž๋Š” ์ ˆ๋Œ€ ์••์ถ•ํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๋ชจ๋ธ ID / `provider/model` ๋Œ€์ƒ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ–ฅํ›„ ์••์ถ• ๊ธฐ๋Šฅ์ด ์ž„๋ฒ ๋”ฉ ์ธ์ ‘ ๊ฒฝ๋กœ์— ๋” ๊ฐ€๊น๊ฒŒ ์—ฐ๊ฒฐ๋  ๊ฒฝ์šฐ ์œ ์šฉํ•œ ์•ˆ์ „์žฅ์น˜์ด๋ฉฐ, ์ •ํ™•ํ•œ ๋ฐ”์ดํŠธ ๋‹จ์œ„์˜ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์ค‘์š”ํ•œ ๋ชจ๋“  ๋ชจ๋ธ(๊ฒฐ์ •๋ก ์  ํ‰๊ฐ€, ์บ์‹œ์— ๋ฏผ๊ฐํ•œ ์ ‘๋‘์‚ฌ ๋“ฑ)์—๋„ ์ผ๋ฐ˜์ ์œผ๋กœ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. - ์„ค์ • ํ•„๋“œ: ์ „์—ญ ์••์ถ• ๊ตฌ์„ฑ์˜ `exclusions?: string[]` (`GET`/`PUT /api/settings/compression`). ๊ธฐ์กด `key_value` ์••์ถ• ๋„ค์ž„์ŠคํŽ˜์ด์Šค (`src/lib/db/compression.ts`)๋ฅผ ํ†ตํ•ด ์˜์†ํ™”๋˜๋ฉฐ ์ƒˆ ํ…Œ์ด๋ธ”์€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - ๋Œ€์‹œ๋ณด๋“œ ํƒญ: **Dashboard โ†’ Compression โ†’ Exclusions** (`/dashboard/compression/exclusions`). - ํŒจํ„ด ๊ตฌ๋ฌธ: `*`๊ฐ€ ์œ ์ผํ•œ ์™€์ผ๋“œ์นด๋“œ์ž…๋‹ˆ๋‹ค. ํŒจํ„ด์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •๊ทœ์‹ ๋ฉ”ํƒ€ ๋ฌธ์ž๋Š” ๋งค์นญ ์ „์— ์ด์Šค์ผ€์ดํ”„๋˜๋ฏ€๋กœ `gpt-5.6`์€ ๋ฆฌํ„ฐ๋Ÿด ๋ฌธ์ž์—ด์—๋งŒ ์ผ์น˜ํ•˜๋ฉฐ `gpt-5x6`์—๋Š” ์ ˆ๋Œ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(ReDoS์— ์•ˆ์ „ํ•˜๊ณ  ๋ฒ”์œ„๊ฐ€ ์ œํ•œ๋˜๋ฉฐ ์ค‘์ฒฉ ์ˆ˜๋Ÿ‰์ž๊ฐ€ ์—†์Œ). ํŒจํ„ด์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋ธ ID ์ž์ฒด์™€ `provider/model` ์กฐํ•ฉ ๋ชจ๋‘์— ๋งค์นญ๋ฉ๋‹ˆ๋‹ค. `gpt-5-6`, `openai/gpt-5-6`, `openai/*`๊ฐ€ ๋ชจ๋‘ ๋™์ž‘ํ•˜๋ฉฐ `*`๋งŒ ์ง€์ •ํ•˜๋ฉด ๋ชจ๋“  ๋ชจ๋ธ์ด ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. - ๋งค์นญ: `open-sse/services/compression/exclusions.ts`์˜ `isCompressionExcluded()` / `normalizeCompressionExclusions()`. `chatCore.ts`๋Š” ์••์ถ• ์„ค์ •์„ ํ™•์ธํ•œ ์งํ›„, **์–ด๋– ํ•œ ์—”์ง„๋„ ์‹คํ–‰๋˜๊ธฐ ์ „์—** ์ œ์™ธ ๋Œ€์ƒ์„ ๊ฒ€์‚ฌํ•˜๋ฉฐ, ์ผ์น˜ ํ•ญ๋ชฉ์„ ์ „์—ญ์ ์œผ๋กœ ์••์ถ•์ด ๋น„ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ์™€ ์ •ํ™•ํžˆ ๋™์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์š”์ฒญ ๋ณธ๋ฌธ์€ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋™์ผํ•จ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ฑด๋„ˆ๋›ฐ๊ธฐ๋Š” ๋ถ„์„ ๊ฐ€์‹œ์„ฑ์„ ์œ„ํ•ด `writeCompressionSkip(..., "excluded")`๋ฅผ ํ†ตํ•ด ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. - ๊ธฐ๋ณธ๊ฐ’(๋ชฉ๋ก์ด ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์—†์Œ): #8034 ์ด์ „ ๋™์ž‘๊ณผ ๋™์ผํ•˜๊ฒŒ ์•„๋ฌด๊ฒƒ๋„ ์ œ์™ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ## ์•Œ๋ ค์ง„ ์ œํ•œ ์‚ฌํ•ญ - **LLMLingua-2(SLM)์—๋Š” ๋™์ผ ์œ„์น˜์— ๋ฐฐ์น˜๋œ ์„ ํƒ์  ์ข…์†์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.** ์›Œ์ปค๋Š” `@atjsh/llmlingua-2`์™€ ํ”ผ์–ด ์ข…์†์„ฑ์ด `dist/node_modules`์— ํ•จ๊ป˜ ๋ฐฐ์น˜๋œ ๊ฒฝ์šฐ์—๋งŒ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค(`scripts/build/colocateOptionals.mjs`, #4286 ์ฐธ์กฐ). ์ด๋Ÿฌํ•œ ์ข…์†์„ฑ์ด ์—†์œผ๋ฉด ์—”์ง„์€ ์žฅ์•  ํ—ˆ์šฉ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜์—ฌ ์›๋ณธ ํ…์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์›Œ์ปค ํ™•์ธ์€ ๋” ์ด์ƒ `import.meta.url`์— ์˜์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋…๋ฆฝ ์‹คํ–‰ํ˜• ๋ฒˆ๋“ค์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Œ). ๋Œ€์‹  ๋Ÿฐํƒ€์ž„ cwd / `argv[1]`์„ ๊ธฐ์ค€์œผ๋กœ ์‚ผ์Šต๋‹ˆ๋‹ค. - **Caveman ์–ธ์–ด ํŒฉ `de` / `fr` / `ja`๋Š” ์ผ๋ถ€๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.** ์ด๋Ÿฌํ•œ ํŒฉ์—๋Š” `context` + `filler` + `structural` ๊ทœ์น™์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ `dedup` / `ultra` ํŒฉ์€ ์—†์œผ๋ฏ€๋กœ, ํ•ด๋‹น ์–ธ์–ด์—์„œ `ultra` ๊ฐ•๋„๋Š” `full`๋ณด๋‹ค ๊ฐ•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ž์ฒด ๊ทœ์น™๋งŒ ์‚ฌ์šฉํ•˜๋ฉฐ, ์™ธ๊ตญ์–ด ํ…์ŠคํŠธ๋ฅผ ํ›ผ์†ํ•  ์ˆ˜ ์žˆ๋Š” ์˜์–ด `dedup`/`ultra` ๊ทœ์น™์œผ๋กœ ์•”๋ฌต์ ์œผ๋กœ ํด๋ฐฑํ•˜์ง€ ์•Š์Œ). `en` / `es` / `id` / `pt-BR`์€ ์™„์ „ํ•˜๊ฒŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€๋งŒ ์ œ๊ณต๋˜๋Š” ํŒฉ์— ๋Œ€ํ•œ `dedup.json` + `ultra.json` ๊ธฐ์—ฌ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. - **์Šคํƒํ˜• ์›๊ฒฉ ๋ถ„์„์—๋Š” ์••์ถ•์„ ์ˆ˜ํ–‰ํ•œ ์—”์ง„๋งŒ ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค.** ์—”์ง„์ด ์‹คํ–‰๋˜์—ˆ์ง€๋งŒ ์ ˆ๊ฐ๋ฅ ์ด 0%์ธ ์Šคํƒํ˜• ํŒŒ์ดํ”„๋ผ์ธ ๋‹จ๊ณ„๋Š” `stats:null`์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ `engineBreakdown`์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฑด๋„ˆ๋›ด ๋‹จ๊ณ„์™€ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. "์‹คํ–‰๋จ, 0%"๊ณผ "๊ฑด๋„ˆ๋œ€"์„ ๊ตฌ๋ถ„ํ•˜๋ ค๋ฉด ๋ถ„์„ ๋ชจ๋ธ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ถ”ํ›„๋กœ ์—ฐ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ## ํ™•์ธ ์ด ์˜์—ญ์˜ ์ง‘์ค‘ ๊ฒŒ์ดํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ```bash node --import tsx/esm --test tests/unit/compression/rtk-*.test.ts tests/unit/compression/pipeline-integration.test.ts tests/unit/compression/context-compression-api.test.ts node --import tsx/esm --test tests/unit/compression/*.test.ts tests/golden-set/*.test.ts tests/integration/compression-pipeline.test.ts tests/unit/api/compression/compression-api.test.ts node --import tsx/esm --test tests/unit/compression/mcpAccessibility*.test.ts npm run typecheck:core ```