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

+8
View File
@@ -30,6 +30,7 @@ use tokio::net::TcpListener;
use crate::api;
use crate::auth::{HostEnv, INTERNAL_HEADER, InternalClient};
use crate::engine;
use crate::oai;
use crate::store::Store;
use crate::ui;
@@ -62,6 +63,8 @@ pub struct Config {
struct Proxy {
client: Client<HttpConnector, Incoming>,
/// Vers le moteur (llama-server / Strata), pour `/v1`.
engine: oai::EngineClient,
backend: SocketAddr,
ctx: api::Ctx,
}
@@ -75,6 +78,7 @@ pub async fn serve(
let client = Client::builder(TokioExecutor::new()).build_http();
let proxy = Arc::new(Proxy {
client,
engine: Client::builder(TokioExecutor::new()).build_http(),
backend: cfg.backend,
ctx: api::Ctx {
store: Store::new(cfg.backend, cfg.internal_token.clone()),
@@ -131,6 +135,10 @@ impl Proxy {
if let Some(resp) = ui::serve(req.method(), path, req.headers()) {
return resp;
}
// Surface OpenAI : relayée au moteur, décisions demandées au Go.
if path.starts_with("/v1/") {
return oai::serve(&self.ctx, &self.engine, req).await;
}
if api::handles(req.method(), path) {
return api::serve(&self.ctx, req).await;
}