mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-23 23:18:13 +02:00
Compactage : politique d'écho et comptes de wire.rs plutôt qu'une copie
Le port du compactage et celui de la charge utile avaient chacun leur version d'echoPolicy / echoTokens / echoable / hasBody. Une seule reste, celle de wire.rs ; les 111 tests du chat passent inchangés. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
e862ac834e
commit
4c615d131f
1 file changed
+5
-40
@@ -115,14 +115,9 @@ const CTX_UPD_CLOSE: &str = "</context_update>";
|
|||||||
|
|
||||||
// ---- configuration -------------------------------------------------------
|
// ---- configuration -------------------------------------------------------
|
||||||
|
|
||||||
/// Politique de raisonnement renvoyé (`echoPolicy`, REASONING_ECHO) : ce qui
|
/// Politique de raisonnement renvoyé : celle de `wire.rs` (même port de
|
||||||
/// décide si le raisonnement rangé compte dans le contexte. Défaut : coupé.
|
/// `echoPolicy`).
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Default)]
|
pub use super::wire::EchoPolicy;
|
||||||
pub struct EchoPolicy {
|
|
||||||
pub on: bool,
|
|
||||||
pub model: String,
|
|
||||||
pub keeps_past: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Instantané de l'état global Go que lit la compaction.
|
/// Instantané de l'état global Go que lit la compaction.
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
@@ -289,25 +284,6 @@ pub fn msg_tokens(m: &Message) -> i64 {
|
|||||||
n + m.img_tokens
|
n + m.img_tokens
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `hasBody` : texte ou appels d'outils.
|
|
||||||
fn has_body(m: &Message) -> bool {
|
|
||||||
if !m.tool_calls.is_empty() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
match &m.content {
|
|
||||||
None | Some(Value::Null) => false,
|
|
||||||
Some(Value::String(s)) => !s.is_empty(),
|
|
||||||
Some(_) => true,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn echoable(m: &Message, p: &EchoPolicy) -> bool {
|
|
||||||
p.on && m.role == "assistant"
|
|
||||||
&& !m.reasoning_content.is_empty()
|
|
||||||
&& m.reasoning_model == p.model
|
|
||||||
&& has_body(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `echoTokens` : jetons que le raisonnement renvoyé ajoute, message par
|
/// `echoTokens` : jetons que le raisonnement renvoyé ajoute, message par
|
||||||
/// message (`None` = aucun).
|
/// message (`None` = aucun).
|
||||||
fn echo_tokens(msgs: &[Message], p: &EchoPolicy) -> Option<Vec<i64>> {
|
fn echo_tokens(msgs: &[Message], p: &EchoPolicy) -> Option<Vec<i64>> {
|
||||||
@@ -317,20 +293,9 @@ fn echo_tokens(msgs: &[Message], p: &EchoPolicy) -> Option<Vec<i64>> {
|
|||||||
echo_tokens_for(msgs, p)
|
echo_tokens_for(msgs, p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// `echoTokensFor` de `wire.rs`, en i64 (unité des comptes de ce module).
|
||||||
fn echo_tokens_for(msgs: &[Message], p: &EchoPolicy) -> Option<Vec<i64>> {
|
fn echo_tokens_for(msgs: &[Message], p: &EchoPolicy) -> Option<Vec<i64>> {
|
||||||
if !p.on {
|
super::wire::echo_tokens_for(msgs, p).map(|v| v.into_iter().map(|n| n as i64).collect())
|
||||||
return None;
|
|
||||||
}
|
|
||||||
let last_user = msgs.iter().rposition(|m| m.role == "user");
|
|
||||||
let mut out: Option<Vec<i64>> = None;
|
|
||||||
for (i, m) in msgs.iter().enumerate() {
|
|
||||||
let before_last = last_user.is_some_and(|lu| i < lu);
|
|
||||||
if !echoable(m, p) || (before_last && !p.keeps_past) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
out.get_or_insert_with(|| vec![0; msgs.len()])[i] = m.reasoning_content.len() as i64 / 4;
|
|
||||||
}
|
|
||||||
out
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `estimateTokens` : taille estimée de l'historique, raisonnement renvoyé
|
/// `estimateTokens` : taille estimée de l'historique, raisonnement renvoyé
|
||||||
|
|||||||
Reference in new issue
Block a user