1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4use crate::{AuthorizedScope, ConversationScope};
5
6pub const WINDOWS_PATH: &str = "/internal/v1/context/windows";
7pub const WINDOW_GET_PATH: &str = "/internal/v1/context/windows/get";
8pub const DERIVATIONS_PATH: &str = "/internal/v1/context/derivations";
9pub const MODEL_INVOCATIONS_PATH: &str = "/internal/v1/context/model-invocations";
10pub const MODEL_INVOCATION_GET_PATH: &str = "/internal/v1/context/model-invocations/get";
11pub const MAX_WINDOW_ITEMS: usize = 2_000;
12pub const MAX_WINDOW_BYTES: usize = 16 * 1024 * 1024;
13
14#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
15#[serde(rename_all = "snake_case")]
16pub enum ContextWindowStage {
17 Original,
18 Assembled,
19 Compressed,
20}
21
22#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
23#[serde(rename_all = "snake_case")]
24pub enum ContextWindowItemKind {
25 Message,
26 ToolResult,
27 ContextInsight,
28 KnowledgeEvidence,
29}
30
31#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
34#[serde(rename_all = "camelCase", deny_unknown_fields)]
35pub struct KnowledgeEvidence {
36 pub provider: String,
37 pub resource_ref: String,
38 #[serde(default, skip_serializing_if = "Option::is_none")]
39 pub revision_ref: Option<String>,
40 #[serde(default, skip_serializing_if = "Option::is_none")]
41 pub segment_ref: Option<String>,
42 pub excerpt: String,
43 #[serde(default, skip_serializing_if = "Option::is_none")]
44 pub citation: Option<String>,
45 #[serde(default, skip_serializing_if = "Value::is_null")]
46 pub metadata: Value,
47}
48
49#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
51#[serde(rename_all = "camelCase", deny_unknown_fields)]
52pub struct ContextWindowItem {
53 pub id: String,
54 pub ordinal: u32,
55 pub kind: ContextWindowItemKind,
56 #[serde(default, skip_serializing_if = "Option::is_none")]
57 pub role: Option<String>,
58 pub content: Value,
59 #[serde(default, skip_serializing_if = "Option::is_none")]
60 pub source_record_id: Option<String>,
61 #[serde(default, skip_serializing_if = "Option::is_none")]
62 pub knowledge_evidence: Option<KnowledgeEvidence>,
63 #[serde(default, skip_serializing_if = "Value::is_null")]
64 pub metadata: Value,
65}
66
67#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
68#[serde(rename_all = "camelCase", deny_unknown_fields)]
69pub struct ContextWindow {
70 pub id: String,
71 pub scope: AuthorizedScope,
72 pub conversation: ConversationScope,
73 pub stage: ContextWindowStage,
74 pub purpose: String,
75 pub token_count: u64,
76 pub items: Vec<ContextWindowItem>,
77 pub created_at_ms: i64,
78}
79
80#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
81#[serde(rename_all = "camelCase", deny_unknown_fields)]
82pub struct CreateContextWindowRequest {
83 pub id: String,
84 pub conversation: ConversationScope,
85 pub stage: ContextWindowStage,
86 pub purpose: String,
87 pub token_count: u64,
88 pub items: Vec<ContextWindowItem>,
89}
90
91#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
92#[serde(rename_all = "camelCase", deny_unknown_fields)]
93pub struct GetContextWindowRequest {
94 pub window_id: String,
95}
96
97#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
98#[serde(rename_all = "snake_case")]
99pub enum ContextDerivationKind {
100 Assemble,
101 Compress,
102 Trim,
103 Reorder,
104}
105
106#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
107#[serde(rename_all = "camelCase", deny_unknown_fields)]
108pub struct ContextDerivation {
109 pub id: String,
110 pub scope: AuthorizedScope,
111 pub source_window_id: String,
112 pub target_window_id: String,
113 pub kind: ContextDerivationKind,
114 pub strategy: String,
115 pub strategy_version: String,
116 pub input_token_count: u64,
117 pub output_token_count: u64,
118 pub input_item_count: u32,
119 pub output_item_count: u32,
120 #[serde(default, skip_serializing_if = "Value::is_null")]
121 pub metadata: Value,
122 pub created_at_ms: i64,
123}
124
125#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
126#[serde(rename_all = "camelCase", deny_unknown_fields)]
127pub struct CreateContextDerivationRequest {
128 pub id: String,
129 pub source_window_id: String,
130 pub target_window_id: String,
131 pub kind: ContextDerivationKind,
132 pub strategy: String,
133 pub strategy_version: String,
134 pub input_token_count: u64,
135 pub output_token_count: u64,
136 pub input_item_count: u32,
137 pub output_item_count: u32,
138 #[serde(default, skip_serializing_if = "Value::is_null")]
139 pub metadata: Value,
140}
141
142#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
143#[serde(rename_all = "snake_case")]
144pub enum ModelInvocationState {
145 Prepared,
146 Succeeded,
147 Failed,
148}
149
150#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
152#[serde(rename_all = "camelCase", deny_unknown_fields)]
153pub struct ModelInvocation {
154 pub id: String,
155 pub scope: AuthorizedScope,
156 pub conversation_id: String,
157 pub request_window_id: String,
158 pub model: String,
159 pub provider: String,
160 pub state: ModelInvocationState,
161 #[serde(default, skip_serializing_if = "Option::is_none")]
162 pub response: Option<Value>,
163 #[serde(default, skip_serializing_if = "Option::is_none")]
164 pub error_code: Option<String>,
165 #[serde(default, skip_serializing_if = "Value::is_null")]
166 pub usage: Value,
167 pub created_at_ms: i64,
168 pub completed_at_ms: Option<i64>,
169}
170
171#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
172#[serde(rename_all = "camelCase", deny_unknown_fields)]
173pub struct PutModelInvocationRequest {
174 pub id: String,
175 pub conversation_id: String,
176 pub request_window_id: String,
177 pub model: String,
178 pub provider: String,
179 pub state: ModelInvocationState,
180 #[serde(default, skip_serializing_if = "Option::is_none")]
181 pub response: Option<Value>,
182 #[serde(default, skip_serializing_if = "Option::is_none")]
183 pub error_code: Option<String>,
184 #[serde(default, skip_serializing_if = "Value::is_null")]
185 pub usage: Value,
186 #[serde(default, skip_serializing_if = "Option::is_none")]
187 pub completed_at_ms: Option<i64>,
188}
189
190#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
191#[serde(rename_all = "camelCase", deny_unknown_fields)]
192pub struct GetModelInvocationRequest {
193 pub invocation_id: String,
194}