mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-22 06:28:11 +02:00
Lot 5 : /v1 relayé par la façade directement au moteur
La surface compatible OpenAI ne fait plus le détour par le Go : la façade authentifie avec la clé des complétions (préflight CORS exempté), réécrit le corps vers le second slot quand il est en service (id_slot à 1, valeurs gardées telles quelles), retire les X-Forwarded-* et relaie au moteur sans tampon — Host d'origine, sauf pour Strata. Les décisions restent au Go, qui tient l'état de la conversation : la façade lui demande où router, ouvre un ticket « en vol » avant de relayer (refus pendant un benchmark ou une optimisation, avec Retry-After) et le rend quand le flux se termine, que le client parte ou que le moteur soit injoignable. Sans ticket obtenu, la requête est refusée : le Go pourrait sinon effacer le slot en plein calcul. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
451770bfcf
commit
c9c9ac1ddd
7 files changed
+646
-1
No files matched your search
@@ -24,6 +24,12 @@ pub struct FakeGo {
|
||||
pub broken: Mutex<bool>,
|
||||
/// Chemins relayés (hors API interne).
|
||||
pub relayed: Mutex<Vec<String>>,
|
||||
/// /v1 : port du faux moteur, second slot en service, refus à renvoyer
|
||||
/// par begin, journal des begin/end.
|
||||
pub engine_port: Mutex<u16>,
|
||||
pub side_live: Mutex<bool>,
|
||||
pub refuse: Mutex<Option<serde_json::Value>>,
|
||||
pub oai_log: Mutex<Vec<String>>,
|
||||
}
|
||||
|
||||
impl FakeGo {
|
||||
@@ -95,6 +101,39 @@ async fn handle(st: Arc<FakeGo>, req: Request<Incoming>) -> Response<Full<Bytes>
|
||||
let key = st.get("state", "web_key").unwrap_or_default();
|
||||
resp(200, format!(r#"{{"web_key":"{key}","version":"0.15.0"}}"#))
|
||||
}
|
||||
"/internal/v1/oai/route" => {
|
||||
let key = st.get("state", "api_key").unwrap_or_default();
|
||||
let v = serde_json::json!({
|
||||
"port": *st.engine_port.lock().unwrap(),
|
||||
"strata": false,
|
||||
"key": key,
|
||||
"key_ok": true,
|
||||
"max_body": 1024,
|
||||
"side_live": *st.side_live.lock().unwrap(),
|
||||
});
|
||||
resp(200, v.to_string())
|
||||
}
|
||||
"/internal/v1/oai/begin" => {
|
||||
let body = req.into_body().collect().await.unwrap().to_bytes();
|
||||
let v: serde_json::Value = serde_json::from_slice(&body).unwrap();
|
||||
st.oai_log.lock().unwrap().push(format!(
|
||||
"begin read={} side={} post_v1={}",
|
||||
v["read"], v["side"], v["post_v1"]
|
||||
));
|
||||
if let Some(r) = st.refuse.lock().unwrap().clone() {
|
||||
return resp(200, serde_json::json!({ "refuse": r }).to_string());
|
||||
}
|
||||
resp(200, r#"{"ticket":7}"#)
|
||||
}
|
||||
"/internal/v1/oai/end" => {
|
||||
let body = req.into_body().collect().await.unwrap().to_bytes();
|
||||
let v: serde_json::Value = serde_json::from_slice(&body).unwrap();
|
||||
st.oai_log
|
||||
.lock()
|
||||
.unwrap()
|
||||
.push(format!("end {}", v["ticket"]));
|
||||
resp(204, "")
|
||||
}
|
||||
"/internal/v1/store/all" => {
|
||||
let s = st.store.lock().unwrap();
|
||||
let m: BTreeMap<String, String> = s
|
||||
|
||||
Reference in new issue
Block a user