starweaver_model/message/
provider.rs1use serde::{Deserialize, Serialize};
4use serde_json::Map;
5
6use super::Metadata;
7
8#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
10pub struct ProviderPartInfo {
11 #[serde(default, skip_serializing_if = "Option::is_none")]
13 pub id: Option<String>,
14 #[serde(default, skip_serializing_if = "Option::is_none")]
16 pub provider_name: Option<String>,
17 #[serde(default, skip_serializing_if = "Map::is_empty")]
19 pub details: Metadata,
20}
21
22impl ProviderPartInfo {
23 #[must_use]
25 pub fn new(provider_name: impl Into<String>) -> Self {
26 Self {
27 id: None,
28 provider_name: Some(provider_name.into()),
29 details: Metadata::default(),
30 }
31 }
32
33 #[must_use]
35 pub fn with_id(mut self, id: impl Into<String>) -> Self {
36 let id = id.into();
37 if !id.is_empty() {
38 self.id = Some(id);
39 }
40 self
41 }
42
43 #[must_use]
45 pub fn with_details(mut self, details: Metadata) -> Self {
46 self.details = details;
47 self
48 }
49
50 #[must_use]
52 pub fn is_provider(&self, provider_name: &str) -> bool {
53 self.provider_name.as_deref() == Some(provider_name)
54 }
55}
56
57#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
59pub struct ProviderInfo {
60 pub name: String,
62 #[serde(default, skip_serializing_if = "Option::is_none")]
64 pub response_id: Option<String>,
65 #[serde(default, skip_serializing_if = "Map::is_empty")]
67 pub details: Metadata,
68}
69
70#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
72#[serde(rename_all = "snake_case")]
73pub enum FinishReason {
74 Stop,
76 Length,
78 ToolCalls,
80 ContentFilter,
82 Unknown,
84}
85
86impl ProviderPartInfo {
87 pub(super) fn is_empty(&self) -> bool {
88 self.id.is_none() && self.provider_name.is_none() && self.details.is_empty()
89 }
90}