use axum::http::StatusCode;
use super::native_routes_2376::{get, post};
use crate::api::AppState;
const HIDDEN_DIM: usize = 64;
const VOCAB_SIZE: usize = 256;
fn apr_transformer_state() -> AppState {
use crate::apr_transformer::{AprTransformer, AprTransformerConfig, AprTransformerLayer};
let num_layers = 2usize;
let (num_heads, num_kv_heads) = (4usize, 4usize);
let config = AprTransformerConfig {
architecture: "test".to_string(),
hidden_dim: HIDDEN_DIM,
num_layers,
num_heads,
num_kv_heads,
vocab_size: VOCAB_SIZE,
intermediate_dim: HIDDEN_DIM * 4,
context_length: 512,
rope_theta: 10000.0,
eps: 1e-5,
eos_token_id: None,
..Default::default()
};
let head_dim = HIDDEN_DIM / num_heads;
let kv_dim = num_kv_heads * head_dim;
let qkv_out_dim = HIDDEN_DIM + kv_dim + kv_dim;
let intermediate = HIDDEN_DIM * 4;
let transformer = AprTransformer {
config,
token_embedding: vec![0.1; VOCAB_SIZE * HIDDEN_DIM],
layers: (0..num_layers)
.map(|_| AprTransformerLayer {
attn_norm_weight: vec![1.0; HIDDEN_DIM],
attn_norm_bias: None,
qkv_weight: vec![0.01; qkv_out_dim * HIDDEN_DIM],
qkv_bias: None,
attn_output_weight: vec![0.01; HIDDEN_DIM * HIDDEN_DIM],
attn_output_bias: None,
ffn_gate_weight: Some(vec![0.01; intermediate * HIDDEN_DIM]),
ffn_gate_bias: None,
ffn_up_weight: vec![0.01; intermediate * HIDDEN_DIM],
ffn_up_bias: None,
ffn_down_weight: vec![0.01; HIDDEN_DIM * intermediate],
ffn_down_bias: None,
ffn_norm_weight: Some(vec![1.0; HIDDEN_DIM]),
ffn_norm_bias: None,
attn_q_norm_weight: None,
attn_k_norm_weight: None,
linear_attn_z_weight: None,
linear_attn_b_weight: None,
linear_attn_a_weight: None,
linear_attn_conv1d_weight: None,
linear_attn_a_log: None,
linear_attn_dt_bias: None,
linear_attn_norm_weight: None,
moe_gate_weight: None,
moe_expert_gate_up: None,
moe_expert_down: None,
moe_shared_gate: None,
moe_shared_up: None,
moe_shared_down: None,
moe_shared_expert_gate_weight: None,
})
.collect(),
output_norm_weight: vec![1.0; HIDDEN_DIM],
output_norm_bias: None,
lm_head_weight: vec![0.01; VOCAB_SIZE * HIDDEN_DIM],
lm_head_bias: None,
lm_head_tied: false,
q4k_layers: None,
lm_head_weight_q6k: None,
lm_head_weight_q4k: None,
};
let vocab: Vec<String> = (0..VOCAB_SIZE)
.map(|i| {
if i == 0 {
"<unk>".to_string()
} else {
format!("t{i}")
}
})
.collect();
AppState::with_apr_transformer_and_vocab(transformer, vocab)
.expect("build AprTransformer AppState")
}
const GENERATION_ROUTES: &[(&str, &str)] = &[
("/generate", r#"{"prompt":"t1","max_tokens":1}"#),
("/batch/generate", r#"{"prompts":["t1"],"max_tokens":1}"#),
("/stream/generate", r#"{"prompt":"t1","max_tokens":1}"#),
("/realize/generate", r#"{"prompt":"t1","max_tokens":1}"#),
("/realize/batch", r#"{"prompts":["t1"],"max_tokens":1}"#),
(
"/v1/completions",
r#"{"model":"m","prompt":"t1","max_tokens":1}"#,
),
(
"/v1/chat/completions",
r#"{"model":"m","messages":[{"role":"user","content":"t1"}],"max_tokens":1}"#,
),
(
"/v1/chat/completions/stream",
r#"{"model":"m","messages":[{"role":"user","content":"t1"}],"max_tokens":1}"#,
),
(
"/api/chat",
r#"{"model":"m","messages":[{"role":"user","content":"t1"}],"stream":false}"#,
),
(
"/api/generate",
r#"{"model":"m","prompt":"t1","stream":false}"#,
),
("/v1/embeddings", r#"{"model":"m","input":"t1"}"#),
("/realize/embed", r#"{"model":"m","input":"t1"}"#),
("/api/embeddings", r#"{"model":"m","prompt":"t1"}"#),
];
#[tokio::test]
async fn apr_transformer_server_reports_loaded_and_generates() {
let (status, body) = get(apr_transformer_state(), "/health").await;
assert_eq!(status, StatusCode::OK, "body: {body}");
assert!(
body.contains("\"model_loaded\":true"),
"/health must report the resident AprTransformer; body: {body}"
);
let (status, body) = post(
apr_transformer_state(),
"/generate",
r#"{"prompt":"t1","max_tokens":1}"#,
)
.await;
assert_eq!(status, StatusCode::OK, "body: {body}");
assert!(
body.contains("\"num_generated\":1"),
"/generate must decode a real token, not an empty envelope; body: {body}"
);
}
#[tokio::test]
async fn no_routed_endpoint_is_dead_on_an_apr_transformer_server() {
for (uri, body) in GENERATION_ROUTES {
let (status, resp) = post(apr_transformer_state(), uri, body).await;
assert_eq!(status, StatusCode::OK, "POST {uri} -> {status}: {resp}");
assert!(
!resp.contains("No model available"),
"POST {uri} claimed no model on a loaded server: {resp}"
);
}
}
#[tokio::test]
async fn apr_transformer_stream_generate_emits_token_events() {
let (status, body) = post(
apr_transformer_state(),
"/stream/generate",
r#"{"prompt":"t1","max_tokens":2}"#,
)
.await;
assert_eq!(status, StatusCode::OK, "body: {body}");
assert!(
body.contains("event: token"),
"SSE stream carried no token event: {body}"
);
assert!(
!body.contains("\"num_generated\":0"),
"SSE stream terminated with zero generated tokens: {body}"
);
}
#[tokio::test]
async fn apr_transformer_chat_stream_emits_completion_chunks() {
let (status, body) = post(
apr_transformer_state(),
"/v1/chat/completions/stream",
r#"{"model":"m","messages":[{"role":"user","content":"t1"}],"max_tokens":2}"#,
)
.await;
assert_eq!(status, StatusCode::OK, "body: {body}");
assert!(
body.contains("chat.completion.chunk"),
"no OpenAI stream chunk in body: {body}"
);
assert!(body.contains("[DONE]"), "stream never terminated: {body}");
}
#[tokio::test]
async fn apr_transformer_embeddings_returns_model_width_vector() {
let (status, body) = post(
apr_transformer_state(),
"/v1/embeddings",
r#"{"model":"m","input":"t1"}"#,
)
.await;
assert_eq!(status, StatusCode::OK, "body: {body}");
let parsed: serde_json::Value = serde_json::from_str(&body).expect("embedding JSON");
let embedding = parsed["data"][0]["embedding"]
.as_array()
.expect("embedding array");
assert_eq!(
embedding.len(),
HIDDEN_DIM,
"embedding width must be the model's hidden_dim; body: {body}"
);
let norm: f64 = embedding
.iter()
.map(|v| {
let x = v.as_f64().expect("f64 component");
x * x
})
.sum();
assert!(
(norm - 1.0).abs() < 1e-3,
"embedding must be L2-normalized, got norm^2 = {norm}"
);
}
#[tokio::test]
async fn no_model_available_is_503_on_every_routed_endpoint() {
let mut observed: Vec<(&str, StatusCode)> = Vec::new();
for (uri, body) in GENERATION_ROUTES {
let state = AppState::demo_mock().expect("model-less AppState");
let (status, resp) = post(state, uri, body).await;
assert!(
resp.contains("No model available"),
"POST {uri} must report the missing model, got: {resp}"
);
assert_ne!(
status,
StatusCode::NOT_FOUND,
"POST {uri} answered 404 for a mounted route with no model: {resp}"
);
assert_ne!(
status,
StatusCode::INTERNAL_SERVER_ERROR,
"POST {uri} answered 500 for a server-side availability condition: {resp}"
);
observed.push((uri, status));
}
for (uri, status) in &observed {
assert_eq!(
*status,
StatusCode::SERVICE_UNAVAILABLE,
"POST {uri} disagreed with the rest of the surface on one condition; \
full observation: {observed:?}"
);
}
}
#[tokio::test]
async fn an_unrouted_path_is_still_404() {
let (status, body) = get(apr_transformer_state(), "/healthz").await;
assert_eq!(status, StatusCode::NOT_FOUND, "body: {body}");
assert!(
!body.contains("No model available"),
"the 404 fallback must not claim a model problem: {body}"
);
}
#[test]
fn apr_forward_hidden_states_refuses_an_over_context_sequence() {
use crate::error::RealizarError;
let state = apr_transformer_state();
let transformer = state
.apr_transformer()
.expect("resident transformer")
.clone();
let context = transformer.config.context_length;
let too_long: Vec<u32> = vec![1; context + 1];
match transformer.forward_hidden_states(&too_long) {
Err(RealizarError::ContextLimitExceeded { provided, maximum }) => {
assert_eq!(provided, context + 1);
assert_eq!(maximum, context);
},
other => panic!("over-context sequence must be refused, got: {other:?}"),
}
match transformer.forward_hidden_states(&[]) {
Err(RealizarError::InvalidShape { .. }) => {},
other => panic!("empty sequence must be refused, got: {other:?}"),
}
}
#[tokio::test]
async fn embed_unavailable_body_names_the_route_the_client_called() {
for route in ["/v1/embeddings", "/realize/embed"] {
let state = AppState::demo_mock().expect("model-less AppState");
let (_, body) = post(state, route, r#"{"model":"m","input":"t1"}"#).await;
assert!(
body.contains(route),
"POST {route} error body names another route: {body}"
);
}
}
#[tokio::test]
async fn every_advertised_route_is_alive_on_an_apr_transformer_server() {
use crate::api::{advertised_routes, RouterConfig};
let config = RouterConfig::default();
let advertised = advertised_routes(&config);
assert!(
advertised.len() > 20,
"the banner list collapsed to {} entries; the probe below would prove nothing: {advertised:?}",
advertised.len()
);
for route in &advertised {
let (method, path) = route.split_once(' ').expect("METHOD /path");
let path = path.replace(":request_id", "not-a-uuid");
let (status, body) = match method {
"GET" => get(apr_transformer_state(), &path).await,
"POST" => post(apr_transformer_state(), &path, "{}").await,
other => panic!("unhandled advertised method {other} for {route}"),
};
assert_ne!(
status,
StatusCode::NOT_FOUND,
"banner names `{route}` but the server answers 404: {body}"
);
assert!(
!body.contains("No model available"),
"banner names `{route}`, which reports no model on a loaded server: {body}"
);
}
}
#[test]
fn serve_model_banner_is_derived_from_the_route_table() {
const SOURCE: &str = include_str!("../../cli/mod_server_commands.rs");
assert_eq!(
SOURCE.matches("crate::api::advertised_routes(&router_config)").count(),
2,
"both `serve_model` and `serve_demo` must print the router's own table"
);
const METHODS: [&str; 5] = ["GET", "POST", "PUT", "DELETE", "PATCH"];
let offenders: Vec<&str> = SOURCE
.lines()
.map(str::trim)
.filter(|line| {
line.strip_prefix("eprintln!(\"")
.map(str::trim_start)
.is_some_and(|rest| METHODS.iter().any(|m| rest.starts_with(m)))
})
.collect();
assert!(
offenders.is_empty(),
"a hand-written route line is back in the banner: {offenders:?}"
);
let restated = r#"eprintln!(" POST /v1/completions - OpenAI-compatible completions");"#;
assert!(
restated
.strip_prefix("eprintln!(\"")
.map(str::trim_start)
.is_some_and(|rest| METHODS.iter().any(|m| rest.starts_with(m))),
"the guard cannot recognise the very line it exists to reject"
);
}