Skip to main content

floopy/types/
routing.rs

1use std::collections::HashMap;
2
3use async_openai::types::chat::ChatCompletionRequestMessage;
4use serde::{Deserialize, Serialize};
5
6/// Outcome of a routing dry-run.
7#[derive(Debug, Clone, Deserialize)]
8pub struct RoutingExplainResult {
9    /// Provider/model the gateway would route to, or `None` when the
10    /// firewall blocks the request.
11    pub would_select: Option<HashMap<String, String>>,
12    /// Firewall verdict (`"allow"` / `"block_input"`).
13    pub firewall_decision: String,
14    /// Firewall reasoning, if any.
15    pub reasoning: Option<String>,
16    /// Matched routing rule id, if any.
17    pub routing_rule_id: Option<String>,
18}
19
20/// Arguments for [`crate::resources::Routing::explain`]. `messages` reuses
21/// the `async-openai` request-message type, so a request can be dry-run
22/// before it is sent.
23#[derive(Debug, Clone, Serialize)]
24pub struct RoutingExplainParams {
25    /// Model to plan for.
26    pub model: String,
27    /// Conversation to plan for.
28    pub messages: Vec<ChatCompletionRequestMessage>,
29    /// Optional sampling temperature.
30    #[serde(skip_serializing_if = "Option::is_none")]
31    pub temperature: Option<f64>,
32    /// Optional max tokens.
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub max_tokens: Option<u32>,
35    /// Optional nucleus-sampling top-p.
36    #[serde(skip_serializing_if = "Option::is_none")]
37    pub top_p: Option<f64>,
38}
39
40impl RoutingExplainParams {
41    /// A dry-run for `model` over `messages` with default sampling.
42    #[must_use]
43    pub fn new(model: impl Into<String>, messages: Vec<ChatCompletionRequestMessage>) -> Self {
44        Self {
45            model: model.into(),
46            messages,
47            temperature: None,
48            max_tokens: None,
49            top_p: None,
50        }
51    }
52}