feat(demos): add affinity testing demo for model pinning

This commit is contained in:
Spherrrical 2026-04-09 11:18:06 -07:00
parent fbc247ab05
commit 92f6015165
5 changed files with 137 additions and 18 deletions

View file

@ -1,5 +1,5 @@
use hermesllm::apis::openai::ChatCompletionsResponse;
use hyper::header;
use serde::Deserialize;
use thiserror::Error;
use tracing::warn;
@ -12,23 +12,8 @@ pub enum HttpError {
Json(serde_json::Error, String),
}
#[derive(Debug, Deserialize)]
struct RouterChatCompletionResponse {
choices: Vec<RouterChoice>,
}
#[derive(Debug, Deserialize)]
struct RouterChoice {
message: RouterMessage,
}
#[derive(Debug, Deserialize)]
struct RouterMessage {
content: Option<String>,
}
/// Sends a POST request to the given URL and extracts the text content
/// from the first choice of a chat-completions-like response.
/// from the first choice of the `ChatCompletionsResponse`.
///
/// Returns `Some((content, elapsed))` on success, or `None` if the response
/// had no choices or the first choice had no content.
@ -45,7 +30,7 @@ pub async fn post_and_extract_content(
let body = res.text().await?;
let elapsed = start_time.elapsed();
let response: RouterChatCompletionResponse = serde_json::from_str(&body).map_err(|err| {
let response: ChatCompletionsResponse = serde_json::from_str(&body).map_err(|err| {
warn!(error = %err, body = %body, "failed to parse json response");
HttpError::Json(err, format!("Failed to parse JSON: {}", body))
})?;