tirea_contract/runtime/inference/
response.rs1pub use crate::runtime::tool_call::{ToolResult, ToolStatus};
2use crate::thread::ToolCall;
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
11pub enum StopReason {
12 EndTurn,
14 MaxTokens,
16 ToolUse,
18 StopSequence,
20}
21
22#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
24pub struct TokenUsage {
25 #[serde(skip_serializing_if = "Option::is_none")]
26 pub prompt_tokens: Option<i32>,
27 #[serde(skip_serializing_if = "Option::is_none")]
28 pub completion_tokens: Option<i32>,
29 #[serde(skip_serializing_if = "Option::is_none")]
30 pub total_tokens: Option<i32>,
31 #[serde(skip_serializing_if = "Option::is_none")]
32 pub cache_read_tokens: Option<i32>,
33 #[serde(skip_serializing_if = "Option::is_none")]
34 pub cache_creation_tokens: Option<i32>,
35}
36
37#[derive(Debug, Clone)]
39pub struct StreamResult {
40 pub text: String,
42 pub tool_calls: Vec<ToolCall>,
44 pub usage: Option<TokenUsage>,
46 pub stop_reason: Option<StopReason>,
49}
50
51impl StreamResult {
52 pub fn needs_tools(&self) -> bool {
54 !self.tool_calls.is_empty()
55 }
56}
57
58#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
60pub struct InferenceError {
61 #[serde(rename = "type")]
63 pub error_type: String,
64 pub message: String,
66 #[serde(skip_serializing_if = "Option::is_none")]
68 pub error_class: Option<String>,
69}
70
71#[derive(Debug, Clone)]
73pub struct LLMResponse {
74 pub outcome: Result<StreamResult, InferenceError>,
76}
77
78impl LLMResponse {
79 pub fn success(result: StreamResult) -> Self {
80 Self {
81 outcome: Ok(result),
82 }
83 }
84
85 pub fn error(error: InferenceError) -> Self {
86 Self {
87 outcome: Err(error),
88 }
89 }
90}