Skip to main content

starweaver_model/request/
types.rs

1use serde::{Deserialize, Serialize};
2use serde_json::{Map, Value};
3
4use crate::{
5    adapter::ModelRequestParameters,
6    message::ModelMessage,
7    profile::{ModelProfile, StructuredOutputMode},
8    settings::{ModelSettings, ThinkingSettings},
9};
10
11/// Prepared model request evidence produced before provider wire mapping.
12#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
13pub struct PreparedModelRequest {
14    /// Canonical history before profile normalization.
15    pub canonical_messages: Vec<ModelMessage>,
16    /// Messages after active profile normalization.
17    pub normalized_messages: Vec<ModelMessage>,
18    /// Prepared request parameters after profile negotiation.
19    pub params: ModelRequestParameters,
20    /// Merged model settings.
21    #[serde(default, skip_serializing_if = "Option::is_none")]
22    pub settings: Option<ModelSettings>,
23    /// Active model profile.
24    pub profile: ModelProfile,
25    /// Selected output strategy for this request.
26    pub output_mode: OutputMode,
27    /// Selected thinking settings for this request.
28    #[serde(default, skip_serializing_if = "Option::is_none")]
29    pub thinking: Option<ThinkingSettings>,
30    /// Preparation evidence for replay and traces.
31    #[serde(default, skip_serializing_if = "Map::is_empty")]
32    pub metadata: Map<String, Value>,
33}
34
35impl PreparedModelRequest {
36    pub(super) fn with_thinking_from_params(mut self) -> Self {
37        self.thinking = self.params.thinking.clone();
38        self
39    }
40}
41
42/// Output strategy selected for a prepared request.
43#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
44#[serde(rename_all = "snake_case")]
45pub enum OutputMode {
46    /// Select the best available output strategy from model profile and schema.
47    Auto,
48    /// Plain text output.
49    Text,
50    /// Provider-native JSON schema output.
51    NativeJsonSchema,
52    /// Provider-native JSON object output.
53    NativeJsonObject,
54    /// Tool/function output.
55    Tool,
56    /// Tool/function output while allowing text fallback.
57    ToolOrText,
58    /// Prompted output instructions.
59    Prompted,
60    /// Provider-native image output.
61    Image,
62}
63
64impl OutputMode {
65    /// Convert profile structured-output mode to request output mode.
66    #[must_use]
67    pub const fn from_structured_output_mode(mode: StructuredOutputMode) -> Self {
68        match mode {
69            StructuredOutputMode::NativeJsonSchema => Self::NativeJsonSchema,
70            StructuredOutputMode::NativeJsonObject => Self::NativeJsonObject,
71            StructuredOutputMode::Tool => Self::Tool,
72            StructuredOutputMode::Prompted => Self::Prompted,
73        }
74    }
75}