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:
MichaelandClaude Opus 5.5 committed 2026-10-14 17:47:40 +02:00
1 parent 451770bfcf
commit c9c9ac1ddd
7 files changed
+646 -1

No files matched your search

+24
View File
@@ -62,6 +62,30 @@ impl Store {
.map_err(|_| "store : délai dépassé".to_string())?
}
/// Appel JSON à une autre route de l'API interne du Go (`/internal/v1/…`).
/// Code HTTP autre que 2xx → `Err`.
pub async fn internal_json(
&self,
method: Method,
path_and_query: &str,
body: Option<&serde_json::Value>,
) -> Result<serde_json::Value, String> {
let body = body
.map(|b| serde_json::to_vec(b).unwrap_or_default())
.unwrap_or_default();
let (status, bytes) = self.call(method, path_and_query, body).await?;
if !status.is_success() {
return Err(format!(
"{path_and_query} : {status} {}",
String::from_utf8_lossy(&bytes)
));
}
if bytes.is_empty() {
return Ok(serde_json::Value::Null);
}
serde_json::from_slice(&bytes).map_err(|e| e.to_string())
}
/// Valeur brute ; `Ok(None)` = absente, `Err` = pas pu lire (à distinguer
/// pour les secrets : comme `getBytesErr`).
pub async fn get(&self, bucket: &str, key: &str) -> Result<Option<Vec<u8>>, String> {