1use chrono::{DateTime, Utc};
6use serde::{Deserialize, Serialize};
7
8pub use crate::task::{TaskStatus, TaskType};
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
13pub struct AgentCard {
14 pub name: String,
16 pub description: Option<String>,
17 pub version: String,
19 pub capabilities: Vec<String>,
20 pub auth_methods: Vec<String>,
22 pub url: String,
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
27pub struct Task {
28 pub id: String,
30 pub status: TaskStatus,
31 pub input: TaskInput,
33 pub output: Option<TaskOutput>,
34 pub context_id: Option<String>,
36 pub created_at: DateTime<Utc>,
37 pub updated_at: DateTime<Utc>,
39}
40
41impl Task {
42 pub fn new(prompt: String) -> Self {
43 let now = Utc::now();
44 Self {
45 id: uuid::Uuid::new_v4().to_string(),
46 status: TaskStatus::Submitted,
47 input: TaskInput {
48 prompt,
49 params: serde_json::Value::Object(serde_json::Map::new()),
50 },
51 output: None,
52 context_id: None,
53 created_at: now,
54 updated_at: now,
55 }
56 }
57
58 pub fn set_status(&mut self, status: TaskStatus) {
59 self.status = status;
60 self.updated_at = Utc::now();
61 }
62
63 pub fn is_terminal(&self) -> bool {
64 matches!(self.status, TaskStatus::Completed | TaskStatus::Failed | TaskStatus::Cancelled)
65 }
66}
67
68#[derive(Debug, Clone, Serialize, Deserialize)]
70pub struct TaskInput {
71 pub prompt: String,
73 pub params: serde_json::Value,
74}
75
76#[derive(Debug, Clone, Serialize, Deserialize)]
78pub struct TaskOutput {
79 pub result: serde_json::Value,
81 pub error: Option<String>,
82}
83
84#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
86#[serde(rename_all = "lowercase")]
87pub enum Role {
88 User,
89 Agent,
90 System,
91}
92
93#[derive(Debug, Clone, Serialize, Deserialize)]
95pub struct Message {
96 pub role: Role,
98 pub parts: Vec<Part>,
99}
100
101#[derive(Debug, Clone, Serialize, Deserialize)]
103#[serde(tag = "type")]
104pub enum Part {
105 #[serde(rename = "text")]
106 Text { content: String },
107 #[serde(rename = "image")]
108 Image { url: String },
109 #[serde(rename = "data")]
110 Data { content: Vec<u8>, mime_type: String },
111}
112
113impl Part {
114 pub fn text(content: impl Into<String>) -> Self {
115 Part::Text {
116 content: content.into(),
117 }
118 }
119}
120
121#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
123#[serde(rename_all = "lowercase")]
124pub enum ArtifactType {
125 Code,
126 Document,
127 Image,
128 Data,
129}
130
131#[derive(Debug, Clone, Serialize, Deserialize)]
133pub struct Artifact {
134 pub id: String,
136 pub artifact_type: ArtifactType,
137 pub content: String,
139 pub metadata: Option<serde_json::Value>,
140}