zai_rs/tool/file_parser_create/
data.rs1use std::path::Path;
7
8use serde_json;
9
10use super::{request::*, response::*};
11use crate::ZaiResult;
12
13pub struct FileParserCreateRequest {
35 pub key: String,
37 pub file_path: std::path::PathBuf,
39 pub tool_type: ToolType,
41 pub file_type: FileType,
43}
44
45impl FileParserCreateRequest {
46 pub fn new(
60 key: String,
61 file_path: &Path,
62 tool_type: ToolType,
63 file_type: FileType,
64 ) -> crate::ZaiResult<Self> {
65 if !file_path.exists() {
67 return Err(crate::client::error::ZaiError::FileError {
68 code: 0,
69 message: format!("File does not exist: {}", file_path.display()),
70 });
71 }
72
73 if !file_type.is_supported_by(&tool_type) {
75 return Err(crate::client::error::ZaiError::ApiError {
76 code: 1200,
77 message: format!(
78 "File type {:?} is not supported by tool type {:?}",
79 file_type, tool_type
80 ),
81 });
82 }
83
84 Ok(Self {
85 key,
86 file_path: file_path.to_path_buf(),
87 tool_type,
88 file_type,
89 })
90 }
91
92 pub fn new_with_auto_type(
106 key: String,
107 file_path: &Path,
108 tool_type: ToolType,
109 ) -> crate::ZaiResult<Self> {
110 let file_type = FileType::from_path(file_path).ok_or_else(|| {
111 crate::client::error::ZaiError::FileError {
112 code: 0,
113 message: format!(
114 "Could not determine file type from path: {}",
115 file_path.display()
116 ),
117 }
118 })?;
119
120 Self::new(key, file_path, tool_type, file_type)
121 }
122
123 pub async fn send(&self) -> ZaiResult<FileParserCreateResponse> {
129 println!("📤 Creating file parser task...");
130 println!("📁 File: {}", self.file_path.display());
131 println!("🛠️ Tool type: {:?}", self.tool_type);
132 println!("📄 File type: {:?}", self.file_type);
133 println!("🔑 API key: {}...", &self.key[..10]);
134
135 let file_bytes = tokio::fs::read(&self.file_path).await?;
136 let file_name = self
137 .file_path
138 .file_name()
139 .unwrap_or_default()
140 .to_string_lossy()
141 .to_string();
142
143 println!("📊 File size: {} bytes", file_bytes.len());
144 println!("📝 File name: {}", file_name);
145
146 let file_part = reqwest::multipart::Part::bytes(file_bytes)
147 .file_name(file_name)
148 .mime_str("application/octet-stream")?;
149
150 let form = reqwest::multipart::Form::new()
151 .part("file", file_part)
152 .text("tool_type", format!("{:?}", self.tool_type).to_lowercase())
153 .text("file_type", format!("{:?}", self.file_type));
154
155 let client = reqwest::Client::new();
156 println!("🌐 Sending request to: https://open.bigmodel.cn/api/paas/v4/files/parser/create");
157
158 let response = client
159 .post("https://open.bigmodel.cn/api/paas/v4/files/parser/create")
160 .bearer_auth(&self.key)
161 .multipart(form)
162 .send()
163 .await?;
164
165 let status = response.status();
166 println!("📡 Response status: {}", status);
167
168 let response_text = response.text().await.unwrap_or_default();
169 println!("📄 Raw response: {}", response_text);
170
171 if !status.is_success() {
172 return Err(crate::client::error::ZaiError::HttpError {
173 status: status.as_u16(),
174 message: response_text,
175 });
176 }
177
178 let create_response: FileParserCreateResponse = serde_json::from_str(&response_text)
179 .map_err(|e| crate::client::error::ZaiError::ApiError {
180 code: 1200,
181 message: format!(
182 "Failed to decode response: {} - Response was: {}",
183 e, response_text
184 ),
185 })?;
186
187 println!("✅ Task created successfully: {:?}", create_response);
188
189 if !create_response.is_success() {
190 return Err(crate::client::error::ZaiError::ApiError {
191 code: 0,
192 message: format!("Task creation failed: {}", create_response.message),
193 });
194 }
195
196 Ok(create_response)
197 }
198}