Skip to main content

agent_context_contract/
records.rs

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/// The smallest replayable external-knowledge record. References are opaque to
32/// Context Infra and never imply ownership of the provider's source document.
33#[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/// One ordered item that was actually visible to the model.
50#[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/// Audit record for the exact request snapshot supplied to one model call.
151#[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}