diff --git a/crates/proxy/src/server/chat_completions/handler.rs b/crates/proxy/src/server/chat_completions/handler.rs index ce08c91..a9ae453 100644 --- a/crates/proxy/src/server/chat_completions/handler.rs +++ b/crates/proxy/src/server/chat_completions/handler.rs @@ -103,6 +103,15 @@ pub(crate) async fn chat_completions( state.resolve_router_tier(&rc, &signals) }) }); + if let (Some(ref ctx), Some((model, _, _))) = (&vk_ctx, &router_tier) { + if !crate::server::policy::is_model_allowed(model, &ctx.allowed_models) { + return openai_error_response( + &format!("Model '{model}' is not allowed for this API key."), + "permission_error", + StatusCode::FORBIDDEN, + ); + } + } let (mapped_model, effective, deployment) = match router_tier { Some((model, effective, deployment)) => ( mapped_model_for_backend(&original_model, model, &effective), diff --git a/crates/proxy/src/server/routes/messages.rs b/crates/proxy/src/server/routes/messages.rs index 433d236..575b399 100644 --- a/crates/proxy/src/server/routes/messages.rs +++ b/crates/proxy/src/server/routes/messages.rs @@ -104,6 +104,16 @@ pub(crate) async fn messages( } None => (body, None), }; + if let (Some(ref ctx), Some((model, _, _))) = (&vk_ctx, &router_tier) { + if !super::super::policy::is_model_allowed(model, &ctx.allowed_models) { + let err = mapping::errors_map::create_anthropic_error( + anthropic::ErrorType::PermissionError, + format!("Model '{model}' is not allowed for this API key."), + None, + ); + return (StatusCode::FORBIDDEN, Json(err)).into_response(); + } + } let (mapped_model, effective, deployment) = match router_tier { Some(v) => v, None => match state.resolve_model_and_state(&body.model) {