1use serde::{Deserialize, Serialize};
2
3use crate::ids::CallId;
4use crate::usage::TokenUsage;
5
6#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
8#[serde(tag = "type", rename_all = "snake_case")]
9pub enum UserPart {
10 Text { text: String },
11 File { path: String },
12}
13
14#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
16#[serde(tag = "type", rename_all = "snake_case")]
17pub enum Part {
18 Text {
19 text: String,
20 },
21 Reasoning {
22 text: String,
23 #[serde(default, skip_serializing_if = "Option::is_none")]
24 signature: Option<String>,
25 },
26 ToolCall {
27 id: CallId,
28 name: String,
29 input: serde_json::Value,
30 },
31 ToolResult {
32 id: CallId,
33 content: String,
34 is_error: bool,
35 },
36 File {
37 path: String,
38 },
39 Finish {
40 reason: FinishReason,
41 usage: TokenUsage,
42 },
43}
44
45#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
47#[serde(tag = "type", rename_all = "snake_case")]
48pub enum PartDelta {
49 Text { delta: String },
50 Reasoning { delta: String },
51 ToolInput { json: String },
52}
53
54#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
55#[serde(rename_all = "snake_case")]
56pub enum FinishReason {
57 EndTurn,
58 ToolUse,
59 MaxTokens,
60 Canceled,
61 Error,
62}
63
64#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
65#[serde(rename_all = "snake_case")]
66pub enum Role {
67 User,
68 Assistant,
69}