# 🗜️ 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) · 🇪🇸 [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) · 🇰🇷 [ko](../../../ko/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 υλοποιεί μια αρθρωτή διοχέτευση συμπίεσης προτροπών που εκτελείται **προληπτικά**, προτού τα αιτήματα φτάσουν στους ανάντη παρόχους. Αυτό σημαίνει ότι η εξοικονόμηση token γίνεται με διαφανή τρόπο — δεν απαιτούνται αλλαγές στη ροή εργασίας σας. ``` Αίτημα πελάτη → Επιλογέας στρατηγικής συμπίεσης → Παράκαμψη μέσω συνδυασμού; → Χρήση ρύθμισης συνδυασμού → Όριο αυτόματης ενεργοποίησης; → Χρήση αυτόματης λειτουργίας → Προεπιλεγμένη λειτουργία; → Χρήση καθολικής ρύθμισης → Απενεργοποιημένη; → Παράλειψη συμπίεσης → Επιλεγμένη λειτουργία συμπίεσης → Απενεργοποιημένη: Χωρίς συμπίεση → Ελαφριά: Ασφαλής εκκαθάριση κενών διαστημάτων/μορφοποίησης (~15%) → Τυπική: Αφαίρεση περιττών λέξεων τύπου Caveman (~30%) → Επιθετική: Παλαίωση ιστορικού + σύνοψη (~50%) → Υπερσυμπίεση: Ευρετικό κλάδεμα + αραίωση μπλοκ κώδικα (~75%) → RTK: Φιλτράρισμα εξόδου τερματικού/εργαλείων με επίγνωση εντολών (ανάντη εύρος 60-90%) → Στοιβαγμένη: Διατεταγμένη διοχέτευση πολλαπλών μηχανών, συνήθως RTK και έπειτα Caveman (επιλέξιμο εύρος 78-95%) → Συμπιεσμένο αίτημα → Πάροχος ``` --- ## Λειτουργίες συμπίεσης ### Απενεργοποιημένη Δεν εφαρμόζεται συμπίεση. Όλα τα μηνύματα διαβιβάζονται χωρίς αλλαγές. ### Ελαφριά λειτουργία (~15% εξοικονόμηση, καθυστέρηση <1ms) Η ασφαλέστερη λειτουργία — καμία σημασιολογική αλλαγή, μόνο εκκαθάριση μορφοποίησης: | Τεχνική | Περιγραφή | | ------------------------ | ----------------------------------------------------- | | `collapseWhitespace` | Συγχώνευση διαδοχικών κενών γραμμών και τελικών κενών | | `dedupSystemPrompt` | Αφαίρεση διπλότυπων μηνυμάτων συστήματος | | `compressToolResults` | Συμπίεση αναλυτικών εξόδων εργαλείων/συναρτήσεων | | `removeRedundantContent` | Αφαίρεση επαναλαμβανόμενων οδηγιών | | `replaceImageUrls` | Συντόμευση URI δεδομένων εικόνων base64 | **Ιδανική για:** Συνεχή χρήση, ροές εργασίας κρίσιμες για την ασφάλεια. ### Τυπική λειτουργία (~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 κανόνες regex, ρυθμισμένοι για προτροπές προγραμματισμού **Ιδανική για:** Καθημερινές ροές εργασίας προγραμματισμού, ομάδες που επιδιώκουν τον περιορισμό του κόστους. ### Επιθετική λειτουργία (~50% εξοικονόμηση) Έξυπνη διαχείριση ιστορικού για μεγάλες συνεδρίες: - **Παλαίωση μηνυμάτων** — τα παλαιότερα μηνύματα συμπιέζονται προοδευτικά - **Συμπίεση αποτελεσμάτων εργαλείων** — οι μεγάλες έξοδοι εργαλείων περικόπτονται ή παραλείπονται (πρώτες/τελευταίες γραμμές, φιλτράρισμα γραμμών αντιστοίχισης, σύμπτυξη κλειδιών JSON) - **Μηχανισμοί προστασίας δομικής ακεραιότητας** — διασφαλίζουν ότι τα ζεύγη `tool_use` + `tool_result` παραμένουν συνεπή - **Επίγνωση παραθύρου περιεχομένου** — σέβεται τα όρια token ανά μοντέλο **Ιδανική για:** Εκτεταμένες συνεδρίες αποσφαλμάτωσης, μεγάλες βάσεις κώδικα. ### Λειτουργία υπερσυμπίεσης (~75% εξοικονόμηση) Μέγιστη συμπίεση για σενάρια όπου τα token είναι κρίσιμα: - **Ευρετικό κλάδεμα** — κλάδεμα token πεζού λόγου βάσει βαθμολογίας - **Διατήρηση δομής** — τα περιφραγμένα μπλοκ κώδικα, ο ενσωματωμένος κώδικας, τα URL και τα αναγνωριστικά αντικαθίστανται προσωρινά από δείκτες και επανασυνδέονται αυτούσια, χωρίς να κλαδεύονται ποτέ - **Προαιρετικό επίπεδο SLM** — ένα μικρό τοπικό μοντέλο μπορεί να βελτιώσει το κλάδεμα όταν έχει διαμορφωθεί - Ανεξάρτητη από την Επιθετική λειτουργία: δεν εκτελεί παλαίωση μηνυμάτων, συμπίεση αποτελεσμάτων εργαλείων ή τον εφεδρικό μηχανισμό σύνοψης (μόνο μια αποτυχία στο επίπεδο SLM μπορεί να δρομολογήσει ένα εφεδρικό πέρασμα μέσω της Επιθετικής λειτουργίας) **Ιδανική για:** Όταν φτάνετε επανειλημμένα στα όρια περιεχομένου. ### Λειτουργία RTK (ανάντη εύρος 60-90%) Η λειτουργία RTK είναι βελτιστοποιημένη για αναλυτικές εξόδους εργαλείων που εμφανίζονται σε συνεδρίες πρακτόρων προγραμματισμού: - Εντοπίζει κατηγορίες εντολών/εξόδων όπως `git status`, `git diff`, `git log`, εκτελεστές δοκιμών, build των TypeScript/Vite/Webpack, ESLint/Biome/Prettier, ελέγχους/εγκαταστάσεις npm, αρχεία καταγραφής Docker, εξόδους υποδομής και γενικές εξόδους κελύφους - Εφαρμόζει πακέτα φίλτρων JSON από το `open-sse/services/compression/engines/rtk/filters/` - Εισάγει φίλτρα σχήματος RTK TOML v1 από αρχεία `filters.toml` του έργου ή καθολικά αρχεία, με επικύρωση ενσωματωμένων δοκιμών και έλεγχο αξιοπιστίας για αρχεία έργου - Περιλαμβάνει 55 ενσωματωμένα φίλτρα με ενσωματωμένα δείγματα επαλήθευσης - Αφαιρεί ακολουθίες ελέγχου ANSI, γραμμές προόδου, επαναλαμβανόμενες γραμμές και μη αξιοποιήσιμο θόρυβο - Διατηρεί αποτυχίες, σφάλματα, προειδοποιήσεις, τροποποιημένα αρχεία, συνόψεις και το τέλος εκτεταμένων εξόδων - Υποστηρίζει φίλτρα έργου με έλεγχο αξιοπιστίας, καθολικά φίλτρα και προαιρετική ανάκτηση αποχαρακτηρισμένης ανεπεξέργαστης εξόδου **Ιδανική για:** Συνεδρίες πρακτόρων με καταγραφές κελύφους, build, δοκιμών, git, grep και εξόδων αρχείων. ### Στοιβαγμένη λειτουργία (επιλέξιμο εύρος 78-95%) Η Στοιβαγμένη λειτουργία εκτελεί πολλαπλές μηχανές συμπίεσης με ντετερμινιστική σειρά. Η προεπιλεγμένη διοχέτευση είναι: ```txt RTK -> Caveman ``` Αυτή η σειρά συμπτύσσει πρώτα την έξοδο τερματικού/εργαλείων και κατόπιν εφαρμόζει τη σημασιολογική σύμπτυξη του Caveman στην υπόλοιπη προτροπή φυσικής γλώσσας. Οι στοιβαγμένες διοχετεύσεις μπορούν να διαμορφωθούν καθολικά ή μέσω συνδυασμών συμπίεσης που έχουν εκχωρηθεί σε συνδυασμούς δρομολόγησης. **Ιδανική για:** Μικτό περιεχόμενο με μεγάλα αρχεία καταγραφής εργαλείων μαζί με ανθρώπινες οδηγίες ή συνόψεις βοηθού. --- ## Υπολογισμός εξοικονόμησης σε σχέση με τα upstream έργα Το OmniRoute τεκμηριώνει την εξοικονόμηση μέσω συμπίεσης από δύο πηγές: τα benchmarks των upstream έργων και τη σύνθεση των μηχανών του ίδιου του OmniRoute. | Πηγή | Αριθμητικά στοιχεία από το upstream README που χρησιμοποιούνται εδώ | | ------- | --------------------------------------------------------------------------------------------------------------------------------- | | Caveman | `~75%` λιγότερα token εξόδου, `65%` μέση εξοικονόμηση εξόδου στα benchmarks, εύρος `22-87%` και εργαλείο συμπίεσης εισόδου `~46%` | | RTK | `60-90%` εξοικονόμηση στην έξοδο εντολών· ενδεικτική συνεδρία `~118,000 -> ~23,900` token ή εξοικονόμηση `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%`). Η συνολική εξοικονόμηση στη χρέωση εξαρτάται από την αναλογία prompt/εξόδου. ### Τι σημαίνει πραγματικά «κατάλληλο» Το προβαλλόμενο εύρος 15-95% είναι πραγματικό, αλλά ισχύει μόνο για **πλεονάζον ή υπερβολικά αναλυτικό** περιεχόμενο — επαναλαμβανόμενες γραμμές σφαλμάτων, ένα αρχείο καταγραφής build που κατακλύζει την έξοδο με την ίδια προειδοποίηση, μια υπερβολικά μεγάλη έξοδο `grep`/ανάγνωσης αρχείου. Αυτό **δεν** σημαίνει ότι κάθε αίτημα εξοικονομεί τόσο πολύ. Έχει επαληθευτεί εμπειρικά (`tests/unit/compression/stacked-compression-tool-result-savings.test.ts`): μια εκτέλεση `stacked` (RTK + Caveman) σε ένα μπλοκ `tool_result` μορφής Anthropic, το οποίο περιείχε 300 πανομοιότυπες γραμμές σφάλματος, απέφερε **95.93% εξοικονόμηση token / 96.26% εξοικονόμηση χαρακτήρων** — ακριβώς εντός του διαφημιζόμενου εύρους. Ωστόσο, η ίδια διοχέτευση, όταν εκτελείται σε κανονική, μη πλεονάζουσα έξοδο εργαλείου (μια καθαρή λίστα αντιστοιχιών `grep`, μια σύντομη ανάγνωση αρχείου, συνηθισμένο συνομιλιακό κείμενο), παράγει ορθώς **σχεδόν μηδενική εξοικονόμηση**, επειδή δεν υπάρχει τίποτα επαναλαμβανόμενο προς αφαίρεση και η `validateCompression()` (`validation.ts`) αρνείται να χρησιμοποιήσει μια αναδιατύπωση που θα αφαιρούσε ή θα αλλοίωνε μπλοκ κώδικα, URL, επικεφαλίδες, εκδόσεις ή αναγνωριστικά σταθερών γραμμένα ΕΞ ΟΛΟΚΛΗΡΟΥ ΜΕ ΚΕΦΑΛΑΙΑ. Αυτή είναι αναμενόμενη και ασφαλής συμπεριφορά, όχι σφάλμα: μια συνεδρία προγραμματισμού που κυρίως διαβάζει/αναζητά σε καθαρά αρχεία θα παρουσιάζει περιορισμένη συνολική εξοικονόμηση ακόμη και με τη συμπίεση πλήρως ενεργοποιημένη, ενώ μια συνεδρία που συναντά έναν βρόχο αποτυχίας ή ένα ιδιαίτερα φλύαρο linter θα παρουσιάζει το πλήρες εύρος 78-95% σε αυτήν την κίνηση. Μη χρησιμοποιείτε το χαμηλό συνολικό ποσοστό εξοικονόμησης μιας μεμονωμένης συνεδρίας ως απόδειξη ότι η συμπίεση έχει ρυθμιστεί εσφαλμένα — ελέγξτε πρώτα αν η υποκείμενη έξοδος του εργαλείου ήταν πράγματι πλεονάζουσα. --- ## Οπτικοποίηση εξοικονόμησης token ``` Χωρίς συμπίεση: 47K token αποστέλλονται στο LLM Με Lite: 40K token αποστέλλονται (15% εξοικονόμηση — ασφαλές, πάντα ενεργό) Με Standard: 33K token αποστέλλονται (30% εξοικονόμηση — κανόνες caveman-speak) Με Aggressive: 24K token αποστέλλονται (50% εξοικονόμηση — παλαίωση + σύνοψη) Με Ultra: 12K token αποστέλλονται (75% εξοικονόμηση — ευρετικό κλάδεμα) Με RTK: 19K-5K token αποστέλλονται (60-90% εξοικονόμηση στην έξοδο εντολών/εργαλείων) Με Stacked: 10K-2.5K token αποστέλλονται (78-95% κατάλληλο εύρος RTK+Caveman) ``` --- ## Διαμόρφωση ### Πίνακας ελέγχου Μεταβείτε στο `Dashboard → Context & Cache`: - **Caveman** — επιλογή λειτουργίας, πακέτα γλωσσών, προεπισκόπηση και καθολικές προεπιλογές - **RTK** — προεπισκόπηση φίλτρων εντολών, ρυθμίσεις ασφάλειας RTK και κατάλογος φίλτρων - **Compression Combos** — επώνυμες αλυσίδες μηχανών που αντιστοιχίζονται σε συνδυασμούς δρομολόγησης - **Auto-Trigger Threshold** — αυτόματη ενεργοποίηση της συμπίεσης όταν το πλήθος των token υπερβαίνει το όριο ### Παράκαμψη ανά συνδυασμό Στο `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 ``` Αυτό σας επιτρέπει να χρησιμοποιείτε διαδοχική συμπίεση σε δωρεάν παρόχους/παρόχους προγραμματισμού, διατηρώντας παράλληλα τη λειτουργία lite στις επί πληρωμή συνδρομές. Αυτή η αντιστοίχιση «Παράκαμψη ανά συνδυασμό» αποτελεί διαφορετικό στοιχείο ελέγχου από την παράκαμψη **λειτουργίας συμπίεσης συνδυασμού δρομολόγησης** (Default/Off/Lite/Standard/Aggressive/Ultra/Codex Responses — το schema του πεδίου δέχεται επίσης `rtk`, `stacked` και `omniglyph`) — αυτή η παράκαμψη δεν επιλέγει μια επώνυμη αλυσίδα συνδυασμού συμπίεσης· απλώς ορίζει το πεδίο `compressionMode` που χρησιμοποιείται από το `resolveCompressionPlan`. Μπορεί να οριστεί είτε στην κάρτα συνδυασμού (`Dashboard → Combos`) είτε, από την #6760 και μετά, ανά συνδυασμό δρομολόγησης στη λίστα «Assign to routing» στο `Dashboard → Context & Cache → Compression Combos`, ακριβώς δίπλα στο πλαίσιο ελέγχου αντιστοίχισης αλυσίδας που τεκμηριώνεται παραπάνω. Και οι δύο διεπαφές αποθηκεύουν τις αλλαγές μέσω του ίδιου endpoint `PUT /api/combos/{id}`. ### Παράκαμψη ανά αίτημα Στείλτε την κεφαλίδα αιτήματος `x-omniroute-compression` για να παρακάμψετε το πλάνο συμπίεσης για ένα μεμονωμένο αίτημα. Έχει την υψηλότερη προτεραιότητα — υπερισχύει της παράκαμψης συνδυασμού δρομολόγησης, του ενεργού προφίλ, της αυτόματης ενεργοποίησης και της επιλογής Default του πίνακα. Οι άγνωστες τιμές αγνοούνται (το αίτημα δεν απορρίπτεται ποτέ) και ο καθολικός κύριος διακόπτης εξακολουθεί να ελέγχει τα πάντα: όταν η συμπίεση είναι καθολικά απενεργοποιημένη, η κεφαλίδα δεν μπορεί να την ενεργοποιήσει. Τιμές: | Τιμή | Αποτέλεσμα | | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | | `off` | Καμία συμπίεση για αυτό το αίτημα. | | `default` | Το προφίλ 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/stacked 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 και δομημένα δεδομένα - ✅ Αναγνωριστικά και προστατευμένα τεχνικά διακριτικά - ✅ Μαθηματικές εκφράσεις - ✅ Ορισμούς κλήσεων εργαλείων/συναρτήσεων - ✅ Προτροπές συστήματος (σε λειτουργία lite) Η ανάκτηση ανεπεξέργαστης εξόδου 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, Συνδυασμοί Συμπίεσης | ✅ Κυκλοφόρησε | | Φάση 4 | Στυλ Εξόδου, Ultra επιπέδου SLM, πλαίσιο αξιολόγησης | ✅ Κυκλοφόρησε | | Φάση 4C | Προσαρμοστικός προϋπολογισμός περιβάλλοντος ("dial") — μηχανή υπολογισμού + API (`contextBudget` στο `PUT /api/settings/compression`) + στοιχεία ελέγχου λειτουργίας/πολιτικής στον πίνακα εργαλείων | ✅ Κυκλοφόρησε | --- ## Ευχαριστίες Οι κανόνες συμπίεσης της λειτουργίας Standard είναι εμπνευσμένοι από το **[Caveman](https://github.com/JuliusBrussee/caveman)** του **[JuliusBrussee](https://github.com/JuliusBrussee)** (⭐ 51K+) — το viral έργο «γιατί να χρησιμοποιείς πολλά διακριτικά όταν λίγα κάνουν τη δουλειά». Το Caveman αναφέρει `~75%` λιγότερα διακριτικά εξόδου, μέση εξοικονόμηση εξόδου `65%` σε δοκιμές επιδόσεων, εύρος εξόδου `22-87%` και ένα εργαλείο συμπίεσης εισόδου `~46%`. Η λειτουργία RTK είναι εμπνευσμένη από το **[RTK - Rust Token Killer](https://github.com/rtk-ai/rtk)** της **[RTK AI](https://github.com/rtk-ai)** — το έργο συμπίεσης εξόδου εντολών υψηλών επιδόσεων για φιλτράρισμα εξόδου τερματικού, build, δοκιμών, git και εργαλείων. Το RTK αναφέρει εξοικονόμηση `60-90%`, ενώ το δείγμα συνεδρίας στο README του δείχνει εξοικονόμηση `~80%`. --- ## Προηγμένα Συστήματα Συμπίεσης Πέρα από τις 7 λειτουργίες που περιγράφονται παραπάνω (ο πηγαίος κώδικας δέχεται επίσης τις λειτουργίες `codex-responses` και `omniglyph`, τις οποίες δεν καλύπτει αυτός ο οδηγός), οι παρακάτω ενότητες καλύπτουν δυνατότητες που λειτουργούν μέσα σε αυτές τις λειτουργίες ή παράλληλα με αυτές: η Συμπίεση Αποτελεσμάτων Εργαλείων και η Προοδευτική Παλαίωση είναι τα βήματα 1 και 2 της επιθετικής μηχανής (λειτουργία Aggressive και ένα βήμα `aggressive` μιας στοιβαγμένης διοχέτευσης), η Στοιβαγμένη Διοχέτευση είναι ο τρόπος εκτέλεσης της λειτουργίας Stacked, η Συμπίεση με Επίγνωση Cache υποβαθμίζει τα `aggressive` και `ultra` σε `standard` για παρόχους με caching όσο η συμπίεση είναι ενεργή, ενώ η Λειτουργία Εξόδου Caveman και τα Στυλ Εξόδου είναι προαιρετικές οδηγίες system prompt, απενεργοποιημένες από προεπιλογή, οι οποίες διαμορφώνουν την έξοδο του μοντέλου αντί να συμπιέζουν το αίτημα. ### Συμπίεση με Επίγνωση Cache Ορισμένοι πάροχοι (όπως η Anthropic με caching προτροπών) υποστηρίζουν **caching προτροπών**, το οποίο τους επιτρέπει να αποθηκεύουν προσωρινά τμήματα της προτροπής για να μειώνουν το κόστος και την καθυστέρηση. Όταν το caching είναι ενεργοποιημένο, η επιθετική συμπίεση μπορεί στην πραγματικότητα να **βλάψει** την απόδοση, επειδή αλλάζει τα προσωρινά αποθηκευμένα token, ακυρώνοντας την cache. Το module `cachingAware.ts` επιλύει αυτό το πρόβλημα **ανιχνεύοντας το περιβάλλον caching** και **προσαρμόζοντας ανάλογα τη στρατηγική συμπίεσης**. #### Πώς λειτουργεί 1. **Ανίχνευση περιβάλλοντος caching** — Σαρώνει το σώμα του αιτήματος για δείκτες `cache_control` 2. **Αναγνώριση παρόχων caching** — Ελέγχει αν ο πάροχος-στόχος υποστηρίζει caching 3. **Προσαρμογή στρατηγικής** — Υποβαθμίζει τα `aggressive`/`ultra` σε `standard` για παρόχους caching 4. **Παράλειψη system prompt** — Τα system prompt συνήθως αποθηκεύονται στην cache, επομένως δεν συμπιέζονται Η βοηθητική συνάρτηση στρατηγικής επιστρέφει επίσης μια σημαία `deterministicOnly`, αλλά ο δημιουργός πλάνου χρησιμοποιεί μόνο τη στρατηγική — αυτήν τη στιγμή τίποτα στα επόμενα στάδια δεν διαβάζει τη σημαία. #### Παράδειγμα κώδικα ```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" }, // ← Δείκτης cache }; const ctx = detectCachingContext(body, { provider: "anthropic" }); // → { hasCacheControl: true, provider: "anthropic", targetFormat: null, isCachingProvider: true } const strategy = getCacheAwareStrategy("aggressive", ctx); // → { strategy: "standard", skipSystemPrompt: true, deterministicOnly: true } ``` #### Πότε χρησιμοποιείται Η συμπίεση με επίγνωση cache είναι **πάντα ενεργή** — δεν απαιτείται διαμόρφωση. Ενεργοποιείται κάθε φορά που η συμπίεση είναι ενεργή και ο πάροχος-στόχος υποστηρίζει caching προτροπών (Anthropic, OpenAI κ.λπ.)· δεν απαιτούνται ρητοί δείκτες `cache_control` — ένας πάροχος caching από μόνος του ενεργοποιεί την υποβάθμιση, ενώ οι δείκτες από μόνοι τους δεν το κάνουν ποτέ (η ανίχνευση δεικτών τροφοδοτεί την τηλεμετρία cache και όχι την απόφαση στρατηγικής). ### Προοδευτική Παλαίωση Οι μεγάλες συνομιλίες συσσωρεύουν πολλούς γύρους μηνυμάτων, αλλά οι παλαιότεροι γύροι γίνονται λιγότερο συναφείς. Το module `progressiveAging.ts` **υποβαθμίζει τα μηνύματα βάσει της απόστασης γύρων** (η απόσταση μετριέται από το τέλος της συνομιλίας). Με τις προεπιλογές που διανέμονται (`verbatim: 2, light: 2, moderate: 3`): - **Τελευταίοι 2 γύροι (απόσταση ≤ 2)**: Διατηρούνται αυτούσιοι - **Απόσταση 3**: Συμπίεση Caveman (αφαίρεση περιττού κειμένου) - **Απόσταση 4+**: Τα μηνύματα του βοηθού συνοψίζονται· τα μηνύματα του χρήστη περιορίζονται στην πρώτη γραμμή τους, με ανώτατο όριο 120 χαρακτήρων· οι άλλοι ρόλοι παραμένουν ανέπαφοι. Τα system prompt, τα ήδη παλαιωμένα μηνύματα και το πιο πρόσφατο μήνυμα χρήστη διατηρούνται πάντα αυτούσια ανεξάρτητα από την απόσταση. Τίποτα δεν απορρίπτεται πλήρως και η ζώνη `light` δεν είναι προσβάσιμη με τις προεπιλογές που διανέμονται (το `light` ισούται με το `verbatim`). #### Παράδειγμα κώδικα ```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, // απόσταση <= 8: ελαφριά συμπίεση moderate: 20, // απόσταση <= 20: συμπίεση caveman fullSummary: 5, // απαιτείται από τον τύπο, δεν διαβάζεται από τον κώδικα ζωνών // απόσταση > 20: σύνοψη (βοηθός) / διατήρηση πρώτης γραμμής (χρήστης) }); // saved = αριθμός token που εξοικονομήθηκαν ``` #### Πότε χρησιμοποιείται Η προοδευτική παλαίωση είναι **πάντα ενεργή** για τη λειτουργία `aggressive` — αποτελεί το βήμα 2 της `compressAggressive()`. Η λειτουργία Ultra δεν την εκτελεί. Είναι ιδιαίτερα αποτελεσματική για: - Μακροχρόνιες συνεδρίες προγραμματισμού - Πολυήμερες συνομιλίες - Ροές εργασίας πρακτόρων με πολλές κλήσεις εργαλείων ### Λειτουργία Εξόδου Caveman Η λειτουργία εξόδου Caveman προσθέτει **οδηγίες system prompt** που ζητούν από το ίδιο το μοντέλο λακωνική έξοδο — το επίπεδο `lite` ζητά συνοπτικές απαντήσεις που διατηρούν ολοκληρωμένες προτάσεις, το `full` του ζητά να «απαντά λακωνικά σαν έξυπνος άνθρωπος των σπηλαίων» και το `ultra` ζητά τηλεγραφική έξοδο· οι οδηγίες απλώς το ζητούν, δεν μπορούν να το εγγυηθούν. Τα αιτήματα τις λαμβάνουν μέσω της `applyOutputStyles()` (`open-sse/services/compression/outputStyles/apply.ts`): το `open-sse/handlers/chatCore.ts` επιλύει πρώτα την επιλογή με το shim οπισθόδρομης συμβατότητας (`resolveOutputStyleSelection()` στο `open-sse/services/compression/outputStyles/backCompat.ts`), το οποίο, όσο το `outputStyles` είναι κενό, αντιστοιχίζει ένα ενεργοποιημένο `cavemanOutputMode` στο στυλ εξόδου `terse-prose` με `cavemanOutputMode.intensity` (δείτε την ενότητα Οπισθόδρομη συμβατότητα παρακάτω)· μια μη κενή επιλογή `outputStyles` χρησιμοποιείται ως έχει και τα `cavemanOutputMode.enabled` και `intensity` δεν έχουν πλέον καμία επίδραση, ενώ η εναλλαγή `autoClarity` εξακολουθεί να εφαρμόζεται. Το `outputMode.ts` περιέχει τα κείμενα οδηγιών (`CAVEMAN_INSTRUCTION_BY_LANGUAGE`), την παράκαμψη περιεχομένου και τη βοηθητική συνάρτηση τοποθέτησης που χρησιμοποιείται από την εισαγωγή· ο δικός του injector `applyCavemanOutputMode()` δεν έχει κανέναν caller σε παραγωγή. #### Πώς λειτουργεί Αυτή η λειτουργία δεν συμπιέζει την είσοδο. Προσθέτει ένα μπλοκ οδηγιών στην προτροπή συστήματος (δείτε παρακάτω Πώς λειτουργεί η έγχυση), και οποιαδήποτε λειτουργία συμπίεσης εισόδου έχει επιλεγεί για το αίτημα εξακολουθεί να εκτελείται στη συνέχεια, στο σώμα που πλέον περιέχει το μπλοκ. Πριν από την κοινή ρήτρα ορίων με την οποία τελειώνει κάθε επίπεδο, το αγγλικό επίπεδο `full` αναφέρει: > "Απάντα λακωνικά σαν έξυπνος άνθρωπος των σπηλαίων. Παράλειψε άρθρα (a/an/the), περιττές λέξεις (just/really/basically/actually/simply), ευγένειες, επιφυλάξεις. Επιτρέπονται αποσπασματικές φράσεις. Σύντομα συνώνυμα (big, όχι extensive, fix, όχι implement). Διατήρησε επακριβώς όλη την τεχνική ουσία, τον κώδικα, τα σφάλματα, τα URLs και τα αναγνωριστικά." Αυτό λειτουργεί ιδιαίτερα καλά για: - Παραγωγή κώδικα (πιο λακωνική έξοδος = λιγότερα tokens) - Γρήγορες ερωταπαντήσεις (δεν χρειάζονται εκτενείς εξηγήσεις) - Μαζική επεξεργασία (μεγιστοποίηση διεκπεραιωτικής ικανότητας) #### Πότε να χρησιμοποιείται Η λειτουργία εξόδου Caveman είναι **προαιρετική**. Με ενεργοποιημένη τη συμπίεση (`enabled: true`, τον κύριο διακόπτη στη σελίδα Compression Settings), ενεργοποιήστε την με `cavemanOutputMode.enabled`· το `intensity` επιλέγει `lite`, `full` ή `ultra`: ```json { "enabled": true, "cavemanOutputMode": { "enabled": true, "intensity": "full" } } ``` Ο διακόπτης **Output Mode** ενός συνδυασμού συμπίεσης (`outputMode`, με επίπεδο στο `outputModeIntensity`) ορίζει τον ίδιο διακόπτη για τα αιτήματα στα οποία εφαρμόζεται ο συνδυασμός, και το εργαλείο MCP `omniroute_set_compression_engine` τον εγγράφει μέσω του δυαδικού ορίσματός του `outputMode`. Μια μη κενή επιλογή `outputStyles` υπερισχύει αυτού του διακόπτη. Στον πίνακα ελέγχου, η ενεργοποίηση του στυλ εξόδου **Terse prose** εισάγει το ίδιο μπλοκ (δείτε παρακάτω Στυλ εξόδου). ### Στυλ εξόδου (κατάλογος) Η παραπάνω λειτουργία εξόδου Caveman είναι η **παλαιού τύπου διαδρομή ενός στυλ**. Η Φάση 4 τη γενίκευσε σε έναν κατάλογο συνδυάσιμων στυλ εξόδου: `OUTPUT_STYLE_CATALOG` στο `open-sse/services/compression/outputStyles/catalog.ts`. Κάθε στυλ είναι μια οδηγία προτροπής συστήματος που ζητά από το ίδιο το μοντέλο οικονομικότερη έξοδο· τα στυλ μπορούν να ενεργοποιηθούν μαζί και εισάγονται με τη σειρά του καταλόγου. | Στυλ | `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 | | Αλογοουρά (τεμπέλης senior dev) | `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 | | Φίλτρο διεπαφής Antislop | `antislop-ui` | Κάθε οπτική τεχνική πρέπει να περνά δοκιμή σκοπού (ιεραρχία, ταυτότητα, αναγνωσιμότητα)· χωρίς προεπιλεγμένες διαβαθμίσεις/γυαλί/λάμψη, περιορισμένη παλέτα, χωρίς διατάξεις προτύπων. Και τα δύο στυλ antislop προσθέτουν ένα όριο απαγόρευσης ανενεργών στοιχείων ελέγχου / κατασκευασμένων ισχυρισμών. | en, pt-BR, es, de, fr, it, ru, zh, ja, id, vi | | Φίλτρο κειμένου και ανθρώπινης εμπειρίας Antislop | `antislop-copy` | Συγκεκριμένο κείμενο (χωρίς παύλα em, γενικές προτροπές για ενέργεια, πομπώδεις όρους, κατακλείδες chatbot, επινοημένα γεγονότα), μαζί με κανόνες για ανθρώπους: αντίθεση WCAG AA, ορατή εστίαση, πρόσβαση μέσω πληκτρολογίου, καταστάσεις κενού/φόρτωσης/σφάλματος, αναδιάταξη για κινητά. | en, pt-BR, es, de, fr, it, ru, zh, ja, id, vi | | Λακωνικά CJK (文言) | `terse-cjk` | Απάντηση `full`/`ultra` σε Κλασικά Κινεζικά (文言)· το `lite` ζητά μόνο σύντομες απαντήσεις χωρίς λειτουργικές λέξεις, ευγένειες ή καλλωπισμούς. | zh (περιορίζεται βάσει locale, δείτε παρακάτω) | Κάθε στυλ παρέχει τρία επίπεδα έντασης — `lite`, `full`, `ultra` — και κάθε επίπεδο τελειώνει με την κοινή ρήτρα ορίων (`SHARED_BOUNDARIES` στο `outputMode.ts`), η οποία διατηρεί επακριβώς τα μπλοκ κώδικα, τις διαδρομές αρχείων, τις εντολές, τα σφάλματα και τα URLs. Τα κείμενα επιπέδων `terse-prose` και `terse-cjk` προσθέτουν τα αναγνωριστικά σε αυτή τη λίστα. Το `terse-cjk` περιορίζεται βάσει locale στο `zh` σε δύο σημεία. Η σελίδα Compression Settings εμφανίζει τη γραμμή του μόνο όταν η γλώσσα διεπαφής του πίνακα ελέγχου είναι Κινεζικά (`zh-CN` ή `zh-TW`), και το `applyOutputStyles()` το εισάγει μόνο όταν η επιλυμένη γλώσσα του αιτήματος (δείτε παρακάτω Επιλογή γλώσσας) είναι `zh`. Η απόκρυψη της γραμμής δεν διαγράφει μια αποθηκευμένη επιλογή `terse-cjk`: το API ρυθμίσεων δέχεται οποιοδήποτε id στυλ, και η αποθήκευση άλλων στυλ στη σελίδα τη διατηρεί. Κατά την εκτέλεση του αιτήματος, ο έλεγχος γλώσσας του `applyOutputStyles()` είναι ο μόνος περιορισμός βάσει locale. #### Πώς λειτουργεί η έγχυση Η `applyOutputStyles()` (`open-sse/services/compression/outputStyles/apply.ts`) αντιστοιχίζει την επιλογή με τον κατάλογο (άγνωστα ids και στυλ που δεν αντιστοιχούν στη γλώσσα απορρίπτονται, χωρίς ποτέ να προκαλείται σφάλμα· μια επιλογή που δεν αντιστοιχίζεται σε κανένα στυλ αφήνει το σώμα αμετάβλητο και παραλείπεται ως `no_styles`), συνενώνει τις επιλεγμένες οδηγίες με τη σειρά του καταλόγου, προσθέτει τη ρήτρα ορίων **μία φορά** (μαζί με τη ρήτρα ασφαλείας, `SAFETY_BOUNDARIES` ή τη μετάφρασή της, όταν έχει επιλεγεί το `less-code` ή το `ponytail`) και ξεκινά το μπλοκ με έναν μοναδικό δείκτη ιδempotency (`[OmniRoute Output Styles]`), ώστε η εκ νέου εφαρμογή να μην επιφέρει καμία αλλαγή. Όταν η επιλυμένη γλώσσα (δείτε την ενότητα Επιλογή γλώσσας παρακάτω) διαθέτει μετάφραση, εισάγεται η τοπικοποιημένη οδηγία αντί της αγγλικής. Σε ένα σώμα με μη κενό πίνακα `messages`, ο έλεγχος ιδempotency εκτελείται πριν από την παράκαμψη περιεχομένου: όταν ο δείκτης `[OmniRoute Output Styles]` βρίσκεται ήδη στο πεδίο `system` ανώτατου επιπέδου (συμβολοσειρά ή πίνακας μπλοκ περιεχομένου) ή σε ένα μήνυμα συστήματος με περιεχόμενο συμβολοσειράς, το σώμα παραμένει αμετάβλητο ως `already_applied` και δεν εκτελείται έλεγχος λέξεων-κλειδιών. Διαφορετικά, μια παράκαμψη περιεχομένου (`shouldBypassCavemanOutputMode()` στο `open-sse/services/compression/outputMode.ts`) ελέγχει το κείμενο των τριών τελευταίων μηνυμάτων, ανεξάρτητα από τον ρόλο τους, και παραλείπει τα στυλ για ολόκληρη την αλληλεπίδραση όταν το κείμενο αντιστοιχεί στις λέξεις-κλειδιά ασφαλείας, μη αναστρέψιμων ενεργειών ή διευκρινίσεων, ή σε μια ακολουθία που εξαρτάται από τη σειρά: `first`, `then`, `after that`, `before`, `rollback` ή `backup`, ακολουθούμενο εντός 240 χαρακτήρων από `delete`, `drop`, `migrate`, `deploy` ή `release`. Η παράκαμψη εκτελείται όσο είναι ενεργός ο διακόπτης **Auto-Clarity Bypass** (`cavemanOutputMode.autoClarity`, ενεργός από προεπιλογή)· η απενεργοποίηση του διακόπτη παραλείπει τον έλεγχο λέξεων-κλειδιών. Όταν η παράκαμψη επιτρέπει τη διέλευση της αλληλεπίδρασης, η `placeSystemInstruction()` (στο ίδιο αρχείο), η οποία δεν δημιουργεί ποτέ νέο `messages[0]`, τοποθετεί το μπλοκ στο πρώτο από τα ακόλουθα που εντοπίζει: 1. Ένα αρχικό μήνυμα συστήματος με περιεχόμενο συμβολοσειράς: το μπλοκ προστίθεται μετά το κείμενό του. 2. Το πεδίο `system` ανώτατου επιπέδου: το μπλοκ προστίθεται μετά το κείμενο μιας συμβολοσειράς ή προστίθεται ως νέο μπλοκ κειμένου σε έναν πίνακα μπλοκ περιεχομένου. 3. Το πρώτο μεταγενέστερο μήνυμα συστήματος με περιεχόμενο συμβολοσειράς: το μπλοκ προστίθεται μετά το κείμενό του. 4. Κανένα από τα παραπάνω: το μπλοκ τοποθετείται σε ένα νέο μήνυμα συστήματος στο τέλος του `messages`. Σε ένα σώμα χωρίς πίνακα `messages` (ή με κενό πίνακα), δεν εκτελείται παράκαμψη περιεχομένου και δεν λαμβάνεται υπόψη ένα πεδίο `system` ανώτατου επιπέδου. Το μπλοκ προστίθεται μετά το κείμενο ενός πεδίου `instructions` τύπου συμβολοσειράς, εκτός αν το πεδίο περιέχει ήδη τον δείκτη `[OmniRoute Output Styles]`, οπότε το σώμα παραμένει αμετάβλητο ως `already_applied`. Όταν το σώμα δεν διαθέτει πεδίο `instructions` τύπου συμβολοσειράς αλλά περιέχει `input` (συμβολοσειρά ή πίνακα), το μπλοκ γίνεται `instructions`, αντικαθιστώντας οποιαδήποτε μη συμβολοσειρά τιμή περιείχε το συγκεκριμένο πεδίο. Ένα σώμα χωρίς πεδίο `instructions` τύπου συμβολοσειράς και χωρίς `input` τύπου συμβολοσειράς ή πίνακα παραμένει αμετάβλητο και παραλείπεται ως `no_messages`. #### Τρόπος ενεργοποίησης Στον πίνακα ελέγχου: **Περιβάλλον συμπίεσης → Ρυθμίσεις συμπίεσης** (`/dashboard/context/settings`), στην ενότητα Στυλ εξόδου: μία σειρά ανά στυλ με διακόπτη ενεργοποίησης/απενεργοποίησης και επιλογέα επιπέδου. Τα στυλ εισάγονται όσο είναι ενεργή η ίδια η συμπίεση (ο κύριος διακόπτης της σελίδας, `enabled`). Ο διακόπτης **Auto-Clarity Bypass** βρίσκεται στη σελίδα **Caveman** (`/dashboard/context/caveman`), στην κάρτα **Λειτουργία εξόδου**. Προγραμματιστικά, η διαμόρφωση συμπίεσης αποθηκεύει την επιλογή ως: ```json { "outputStyles": [ { "id": "i-have-adhd", "level": "full" }, { "id": "less-code", "level": "lite" } ] } ``` Συμβατότητα προς τα πίσω: όσο το `outputStyles` είναι κενό, η παλαιότερη ρύθμιση `cavemanOutputMode.enabled` αντιστοιχίζεται στο `terse-prose` με επίπεδο `cavemanOutputMode.intensity`. Στη συνέχεια, το μπλοκ ξεκινά με τον δείκτη `[OmniRoute Output Styles]`, ενώ ο παλαιότερος μηχανισμός εισαγωγής `applyCavemanOutputMode()` έγραφε `[OmniRoute Caveman Output Mode]`. Κάτω από τον δείκτη, το κείμενο αντιστοιχεί στην παλαιότερη εισαγωγή στις γλώσσες en, pt-BR, es, de, fr, it, ru, id και vi· στις ja και zh περιέχει ένα επιπλέον διάστημα πριν από τη ρήτρα ορίων. Το `terse-prose` μεταφράζεται στις pt-BR, es, de, fr, it, ru, zh, ja, id και vi, επομένως ένα αίτημα του οποίου η επιλυμένη γλώσσα είναι `hu` λαμβάνει το αγγλικό κείμενο, ενώ ο παλαιότερος μηχανισμός εισαγωγής χρησιμοποιούσε το ουγγρικό. Επιλογή γλώσσας στυλ εξόδου (`resolveOutputStyleLanguage()` στο `outputStyles/apply.ts`): όταν το `languageConfig.enabled` είναι ενεργό, το `autoDetect` λαμβάνει ως δείγμα το πιο πρόσφατο μήνυμα χρήστη στον πίνακα `messages` του αιτήματος που περιέχει κείμενο (περιεχόμενο συμβολοσειράς ή το `text` των τμημάτων περιεχομένου του) και εκτελεί σε αυτό τον ανιχνευτή της μηχανής Caveman (`detectCompressionLanguage()`). Ο ανιχνευτής επιστρέφει `zh` για κείμενο με χαρακτήρες Han και χωρίς kana· διαφορετικά, επιστρέφει όποια από τις `it`, `pt-BR`, `es`, `de`, `fr`, `ru`, `ja`, `hu` και `id` έχει τις περισσότερες αντιστοιχίες ενδείξεων, και `en` όταν δεν αντιστοιχεί καμία — για κείμενο που δεν μπορεί να ταξινομήσει χρησιμοποιεί τα αγγλικά, ποτέ το `defaultLanguage`, και η `vi` δεν ανιχνεύεται ποτέ, παρότι τα στυλ περιλαμβάνουν κείμενο στα vi. Ένα σώμα Responses API διατηρεί τις αλληλεπιδράσεις του στο `input`, το οποίο δεν λαμβάνεται ως δείγμα, επομένως χρησιμοποιεί το `defaultLanguage` και κατόπιν τα αγγλικά. Όταν κανένα μήνυμα χρήστη στο `messages` δεν περιέχει κείμενο ή όταν το `autoDetect` είναι ανενεργό, εφαρμόζεται το `defaultLanguage` και κατόπιν τα αγγλικά. Όταν το `languageConfig.enabled` είναι ανενεργό, η γλώσσα είναι τα αγγλικά — εκτός αν εφαρμόζεται στο αίτημα ένας συνδυασμός συμπίεσης (ένας συνδυασμός αντιστοιχισμένος στον συνδυασμό δρομολόγησης του αιτήματος ή ο προεπιλεγμένος συνδυασμός συμπίεσης στον οποίο επιστρέφει το chatCore για την ενσωματωμένη στοιβαγμένη διοχέτευση): η εφαρμογή ενός συνδυασμού ενεργοποιεί το `languageConfig.enabled` για το συγκεκριμένο αίτημα και ορίζει το `defaultLanguage` από τα πακέτα γλωσσών του συνδυασμού (την αποθηκευμένη τιμή, αν είναι ένα από τα πακέτα του συνδυασμού· διαφορετικά, το πρώτο πακέτο του συνδυασμού, το οποίο από προεπιλογή είναι `en`), ενώ εξακολουθεί να εφαρμόζεται το αποθηκευμένο `autoDetect` (ενεργό από προεπιλογή). Η μηχανή εισόδου Caveman επιλέγει διαφορετικά τη γλώσσα του πακέτου κανόνων της — ανά τμήμα κειμένου και, όταν η αυτόματη ανίχνευση είναι ανενεργή, με περιορισμό βάσει του `enabledPacks`. Ο πίνακας στυλ × γλώσσας καθορίζεται από το `tests/unit/compression/output-styles-i18n-matrix.test.ts`: κάθε στυλ του καταλόγου χρειάζεται μια καταχώριση στο `BASELINE_LANGUAGES` της δοκιμής· ένα στυλ που δεν περιορίζεται βάσει τοπικών ρυθμίσεων πρέπει να διαθέτει μετάφραση pt-BR (το `terse-cjk`, το οποίο περιορίζεται βάσει τοπικών ρυθμίσεων, εξαιρείται από αυτόν τον κανόνα), εκτός αν περιλαμβάνεται στο `KNOWN_ENGLISH_ONLY`, το οποίο μπορεί να περιέχει μόνο στυλ χωρίς καθόλου μεταφράσεις — ένα καταχωρισμένο στυλ που διαθέτει οποιαδήποτε μετάφραση αποτυγχάνει στη δοκιμή· και ένα στυλ αποτυγχάνει στη δοκιμή όταν χάνει μια γλώσσα που αναφέρεται στην καταχώρισή του στο `BASELINE_LANGUAGES`. Για να προσθέσετε ένα στυλ, ανατρέξτε στο [EXTENDING_COMPRESSION.md](./EXTENDING_COMPRESSION.md#adding-an-output-style). ### Συμπίεση αποτελεσμάτων εργαλείων Η `compressToolResult()` στο `open-sse/services/compression/toolResultCompressor.ts` συμπιέζει το κείμενο αποτελεσμάτων εργαλείων με **5 στρατηγικές**. Τις δοκιμάζει με την ακόλουθη σειρά και η πρώτη ενεργοποιημένη στρατηγική της οποίας ο έλεγχος αντιστοιχεί στο περιεχόμενο καθορίζει το αποτέλεσμα: 1. **`fileContent`**: περιεχόμενο 3 ή περισσότερων γραμμών, όπου τουλάχιστον μία γραμμή, αγνοώντας την αρχική εσοχή, αρχίζει με `import `, `export `, `function `, `class `, `const `, `let `, `var ` ή `return ` (τη λέξη-κλειδί συν ένα κενό διάστημα), ή με `if`, `for` ή `while` ακολουθούμενο από `(` ή ` (`, διατηρεί τις πρώτες 20 και τις τελευταίες 5 γραμμές του, με επισήμανση του ενδιάμεσου τμήματος που παραλείφθηκε. 2. **`grepSearch`**: περιεχόμενο με τουλάχιστον μία γραμμή της μορφής `::`, όπου το κείμενο πριν από την πρώτη άνω και κάτω τελεία δεν περιέχει κενά διαστήματα, διατηρεί μόνο αυτές τις γραμμές, έως 30 το πολύ, ακολουθούμενες από το πλήθος τυχόν επιπλέον αντιστοιχιών και τη λίστα των αρχείων με αντιστοιχίες· κάθε άλλη γραμμή απορρίπτεται. Μία τέτοια γραμμή αρκεί για να ενεργοποιήσει τη στρατηγική, επομένως μια γραμμή αρχείου καταγραφής που αρχίζει με χρονική σήμανση όπως `12:30:45` επίσης υπολογίζεται. 3. **`shellOutput`**: έξοδος που περιέχει μια ακολουθία ANSI CSI (`ESC[` και έπειτα ψηφία ή ελληνικά ερωτηματικά και στη συνέχεια ένα γράμμα, όπως στους κωδικούς χρωμάτων) ή ένα `$` ακολουθούμενο από κενό διάστημα οπουδήποτε στο κείμενο χάνει αυτές τις ακολουθίες (άλλες ακολουθίες διαφυγής, όπως `ESC[?25l` ή μια ακολουθία τίτλου παραθύρου OSC, διατηρούνται) και διατηρεί τις τελευταίες 50 γραμμές του, με τις διαδοχικές επαναλαμβανόμενες γραμμές συμπτυγμένες. Επειδή αυτός ο έλεγχος εκτελείται πριν από τα `json` και `errorMessage`, μια έξοδος JSON ή σφάλματος που περιέχει τέτοιο `$` δεν φτάνει ποτέ σε αυτά, όσο το `shellOutput` είναι ενεργοποιημένο. 4. **`json`**: ένα ωφέλιμο φορτίο JSON άνω των 2.000 χαρακτήρων που αρχίζει με `{` ή `[` (μετά από προαιρετικά κενά διαστήματα) και αναλύεται επιτυχώς συνοψίζεται: ένας πίνακας με περισσότερα από 7 στοιχεία διατηρεί τα πρώτα 5 και τα τελευταία 2 στοιχεία του, καθώς και το συνολικό πλήθος του, ενώ ένα αντικείμενο διατηρεί τα πρώτα 20 κλειδιά του, με κάθε τιμή ένθετου αντικειμένου ή πίνακα να αντικαθίσταται από ένα σύμβολο υποκατάστασης `{…N keys}` (για έναν πίνακα, το N είναι το μήκος του) και έναν δείκτη `_remaining__keys` που μετρά τα κλειδιά τα οποία απορρίφθηκαν μετά τα πρώτα 20. Οι βαθμωτές τιμές αντιγράφονται ολόκληρες, επομένως ένα αντικείμενο με 20 κλειδιά ή λιγότερα, χωρίς ένθετες τιμές, απλώς αναδιαμορφώνεται με εσοχές — ένα ελαχιστοποιημένο αντικείμενο αποκτά επιπλέον χαρακτήρες και παραμένει αμετάβλητο. 5. **`errorMessage`**: έξοδος που περιέχει, οπουδήποτε και ανεξάρτητα από πεζά ή κεφαλαία, `error:`, `error ` (τη λέξη ακολουθούμενη από κενό διάστημα, όπως στο `no error found`), `[error]`, `exception:`, `exception `, `[exception]` ή `traceback` διατηρεί την πρώτη γραμμή της, τις επόμενες 10 γραμμές και τις τελευταίες 3, με έναν δείκτη `… [N frames elided] …` στη θέση των ενδιάμεσων γραμμών. Ο δείκτης εμφανίζεται μόνο όταν ακολουθούν περισσότερες από 13 γραμμές μετά την πρώτη γραμμή, επομένως η έξοδος σφάλματος με 14 γραμμές ή λιγότερες δεν συντομεύεται (στις 12 ή 13 γραμμές, οι τελευταίες 3 επαναλαμβάνουν γραμμές που έχουν ήδη διατηρηθεί). Μετά την αντιστοίχιση μιας στρατηγικής, ακόμη και αν δεν εξοικονομεί τίποτα, οι επόμενες στρατηγικές δεν δοκιμάζονται. Όταν η στρατηγική που αντιστοιχεί δεν εξοικονομεί εκτιμώμενα token (μήκος ÷ 4, στρογγυλοποιημένο προς τα πάνω) — για παράδειγμα, ένα αρχείο που μοιάζει με κώδικα και έχει 25 γραμμές ή λιγότερες, ή ένας πίνακας JSON άνω των 2.000 χαρακτήρων με 7 στοιχεία ή λιγότερα — η επιθετική μηχανή διατηρεί το αρχικό αποτέλεσμα του εργαλείου: και οι δύο καλούντες (`compressAggressive()` και `compressAnthropicToolResultBlock()`) διατηρούν το αρχικό όταν το `saved` είναι 0 ή μικρότερο, ενώ η ίδια η `compressToolResult()` εξακολουθεί να επιστρέφει την έξοδο αυτής της στρατηγικής. Το βήμα αποτελέσματος εργαλείου δεν έχει τον τελευταίο λόγο: ο εφεδρικός μηχανισμός σύνοψης της μηχανής μπορεί ακόμη να συντομεύσει ένα μήνυμα `tool` ή `function` μεγαλύτερο από 8.192 χαρακτήρες (`maxTokensPerMessage`, 2.048, επί 4). #### Πότε χρησιμοποιείται Η συμπίεση αποτελεσμάτων εργαλείων είναι το βήμα 1 της επιθετικής μηχανής (`compressAggressive()` στο `open-sse/services/compression/aggressive.ts`), επομένως εκτελείται στη λειτουργία Aggressive και σε ένα βήμα `aggressive` μιας στοιβαγμένης διοχέτευσης. Συμπιέζει μηνύματα `tool` και `function` με μορφή OpenAI, καθώς και το κείμενο μέσα σε μπλοκ `tool_result` του Anthropic. Κάθε στρατηγική διαθέτει τον δικό της διακόπτη στο `aggressive.toolStrategies`, και όλοι είναι ενεργοποιημένοι από προεπιλογή. Στον πίνακα ελέγχου, οι διακόπτες βρίσκονται στην προβολή **Advanced** της σελίδας Caveman, όταν η συμπίεση είναι ενεργοποιημένη και η προεπιλεγμένη λειτουργία είναι Aggressive. ### Στοιβαγμένη διοχέτευση Η στοιβαγμένη λειτουργία εκτελεί **πολλές μηχανές διαδοχικά** — συνήθως πρώτα την RTK (εξοικονόμηση 60-90% στην έξοδο εργαλείων) και έπειτα την Caveman στο κείμενο που απομένει (~46% εξοικονόμηση εισόδου). Σε συνδυασμό, αυτό αποτελεί το **επιλέξιμο εύρος 78-95%** (βλ. Υπολογισμός εξοικονόμησης ανωτέρω): `1 - (1 - 0.60..0.90) × (1 - 0.46)` κατά μέσο όρο ≈89%. #### Πώς λειτουργεί ``` Είσοδος (1000 token) → RTK (φίλτρο με επίγνωση εντολών) → 200 token → Caveman (αφαίρεση περιττού περιεχομένου) → 108 token → Έξοδος (108 token, ~89% εξοικονόμηση) ``` #### Πότε χρησιμοποιείται Χρησιμοποιήστε τη στοιβαγμένη λειτουργία για: - Ροές εργασίας με έντονη χρήση εργαλείων (προγραμματισμός με πράκτορες, έρευνα) - Μαζική επεξεργασία με έμφαση στο κόστος - Όταν χρειάζεστε τη μέγιστη εξοικονόμηση token Οι στοιβαγμένες διοχετεύσεις διαμορφώνονται μέσω της καθολικής ρύθμισης συμπίεσης `stackedPipeline` ή μέσω ενός ονομασμένου συνδυασμού συμπίεσης που έχει εκχωρηθεί σε έναν συνδυασμό δρομολόγησης (βλ. Παράκαμψη ανά συνδυασμό ανωτέρω) — όχι μέσω ενός `modePack` αυτόματου συνδυασμού (αυτό το πεδίο απλώς αναπροσαρμόζει τα βάρη επιλογής μοντέλου του αυτόματου συνδυασμού και το `stacked` δεν είναι έγκυρο όνομα πακέτου). --- ## Παρακάμψεις Συμπίεσης ανά Συνδυασμό Μπορείτε να παρακάμψετε την καθολική λειτουργία συμπίεσης **ανά συνδυασμό**, ώστε να ρυθμίσετε λεπτομερώς τη συμπεριφορά για διαφορετικές περιπτώσεις χρήσης: ```json { "id": "coding-combo", "strategy": "priority", "config": { "weights": { "taskFit": 0.5 }, "modePack": "quality-first" }, "compressionOverride": "aggressive" } ``` Αυτό είναι χρήσιμο για: - **Συνδυασμούς προγραμματισμού**: Χρησιμοποιήστε τη λειτουργία `aggressive` για μεγάλες συνεδρίες - **Συνδυασμούς γρήγορων ερωταπαντήσεων**: Χρησιμοποιήστε τη λειτουργία `lite` για γρήγορες αποκρίσεις - **Συνδυασμούς με εκτεταμένη χρήση εργαλείων**: Χρησιμοποιήστε τη λειτουργία `stacked` για μέγιστη εξοικονόμηση - **Συνδυασμούς παραγωγής**: αφήστε την παράκαμψη απενεργοποιημένη για παρόχους προσωρινής αποθήκευσης — η πάντα ενεργή προσαρμογή με επίγνωση της προσωρινής αποθήκευσης υποβαθμίζει αυτόματα τις λειτουργίες `aggressive`/`ultra` σε `standard` (δεν υπάρχει επιλέξιμη λειτουργία `cache-aware`) --- ## Δείτε Επίσης - [Ρύθμιση Περιβάλλοντος](../reference/ENVIRONMENT.md) — Μεταβλητές περιβάλλοντος συμπίεσης - [Οδηγός Αρχιτεκτονικής](../architecture/ARCHITECTURE.md) — Εσωτερική λειτουργία της διοχέτευσης συμπίεσης - [Οδηγός Χρήστη](../guides/USER_GUIDE.md) — Ξεκινώντας με τη συμπίεση - [Συμπίεση RTK](./RTK_COMPRESSION.md) — Φίλτρα RTK, μοντέλο εμπιστοσύνης, πύλη επαλήθευσης, ανάκτηση ανεπεξέργαστης εξόδου - [Μηχανές Συμπίεσης](./COMPRESSION_ENGINES.md) — Caveman, RTK, stacked, API, MCP, πίνακας ελέγχου - [Μορφή Κανόνων Συμπίεσης](./COMPRESSION_RULES_FORMAT.md) — Μορφή πακέτου κανόνων JSON - [Πακέτα Γλωσσών Συμπίεσης](./COMPRESSION_LANGUAGE_PACKS.md) — Κανόνες Caveman ανά γλώσσα