starweaver_model/request/
types.rs1use 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#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
13pub struct PreparedModelRequest {
14 pub canonical_messages: Vec<ModelMessage>,
16 pub normalized_messages: Vec<ModelMessage>,
18 pub params: ModelRequestParameters,
20 #[serde(default, skip_serializing_if = "Option::is_none")]
22 pub settings: Option<ModelSettings>,
23 pub profile: ModelProfile,
25 pub output_mode: OutputMode,
27 #[serde(default, skip_serializing_if = "Option::is_none")]
29 pub thinking: Option<ThinkingSettings>,
30 #[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#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
44#[serde(rename_all = "snake_case")]
45pub enum OutputMode {
46 Auto,
48 Text,
50 NativeJsonSchema,
52 NativeJsonObject,
54 Tool,
56 ToolOrText,
58 Prompted,
60 Image,
62}
63
64impl OutputMode {
65 #[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}