v0.1.3-rc.4.1

This commit is contained in:
wisdgod
2025-01-28 08:46:13 +08:00
parent 0d8035fd02
commit cb244d7282
4 changed files with 95 additions and 103 deletions

2
Cargo.lock generated
View File

@@ -361,7 +361,7 @@ dependencies = [
[[package]] [[package]]
name = "cursor-api" name = "cursor-api"
version = "0.1.3-rc.4" version = "0.1.3-rc.4.1"
dependencies = [ dependencies = [
"axum", "axum",
"base64", "base64",

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "cursor-api" name = "cursor-api"
version = "0.1.3-rc.4" version = "0.1.3-rc.4.1"
edition = "2021" edition = "2021"
authors = ["wisdgod <nav@wisdgod.com>"] authors = ["wisdgod <nav@wisdgod.com>"]
description = "OpenAI format compatibility layer for the Cursor API" description = "OpenAI format compatibility layer for the Cursor API"

View File

@@ -508,21 +508,11 @@ pub async fn handle_chat(
response_data response_data
} }
let stream = { // 首先处理stream直到获得第一个结果
let mut stream = response.bytes_stream(); let mut stream = response.bytes_stream();
// 处理第一个chunk并获取first_result
while !decoder.lock().await.is_first_result_ready() { while !decoder.lock().await.is_first_result_ready() {
match stream.next().await { match stream.next().await {
Some(first_chunk) => { Some(Ok(chunk)) => {
let chunk = first_chunk.map_err(|e| {
let error_message = format!("Failed to read response chunk: {}", e);
(
StatusCode::INTERNAL_SERVER_ERROR,
Json(ChatError::RequestFailed(error_message).to_json()),
)
})?;
if let Err(StreamError::ChatError(error)) = if let Err(StreamError::ChatError(error)) =
decoder.lock().await.decode(&chunk, convert_web_ref) decoder.lock().await.decode(&chunk, convert_web_ref)
{ {
@@ -538,8 +528,7 @@ pub async fn handle_chat(
{ {
log.status = LogStatus::Failed; log.status = LogStatus::Failed;
log.error = Some(error_response.native_code()); log.error = Some(error_response.native_code());
log.timing.total = log.timing.total = format_time_ms(start_time.elapsed().as_secs_f64());
format_time_ms(start_time.elapsed().as_secs_f64());
state.error_requests += 1; state.error_requests += 1;
} }
} }
@@ -549,6 +538,13 @@ pub async fn handle_chat(
)); ));
} }
} }
Some(Err(e)) => {
let error_message = format!("Failed to read response chunk: {}", e);
return Err((
StatusCode::INTERNAL_SERVER_ERROR,
Json(ChatError::RequestFailed(error_message).to_json()),
));
}
None => { None => {
// 更新请求日志为失败 // 更新请求日志为失败
{ {
@@ -566,16 +562,14 @@ pub async fn handle_chat(
} }
return Err(( return Err((
StatusCode::INTERNAL_SERVER_ERROR, StatusCode::INTERNAL_SERVER_ERROR,
Json( Json(ChatError::RequestFailed("Empty stream response".to_string()).to_json()),
ChatError::RequestFailed("Empty stream response".to_string())
.to_json(),
),
)); ));
} }
} }
} }
stream.then({ // 处理后续的stream
let stream = stream.then({
let decoder = decoder.clone(); let decoder = decoder.clone();
let response_id = response_id.clone(); let response_id = response_id.clone();
let model = request.model.clone(); let model = request.model.clone();
@@ -604,6 +598,7 @@ pub async fn handle_chat(
current_id, current_id,
}; };
// 使用decoder处理chunk
let messages = match decoder.lock().await.decode(&chunk, convert_web_ref) { let messages = match decoder.lock().await.decode(&chunk, convert_web_ref) {
Ok(msgs) => msgs, Ok(msgs) => msgs,
Err(e) => { Err(e) => {
@@ -612,25 +607,22 @@ pub async fn handle_chat(
} }
}; };
// let mut response_data = String::new(); let mut response_data = String::new();
// if let Some(first_msg) = decoder.lock().await.take_first_result() { if let Some(first_msg) = decoder.lock().await.take_first_result() {
// let first_response = process_messages(first_msg, &ctx).await; let first_response = process_messages(first_msg, &ctx).await;
// if !first_response.is_empty() { response_data.push_str(&first_response);
// response_data.push_str(&first_response); }
// }
// }
let response_data = process_messages(messages, &ctx).await; let current_response = process_messages(messages, &ctx).await;
// if !current_response.is_empty() { if !current_response.is_empty() {
// response_data.push_str(&current_response); response_data.push_str(&current_response);
// } }
Ok(Bytes::from(response_data)) Ok(Bytes::from(response_data))
} }
} }
}) });
};
Ok(Response::builder() Ok(Response::builder()
.header("Cache-Control", "no-cache") .header("Cache-Control", "no-cache")

View File

@@ -77,15 +77,15 @@ impl StreamDecoder {
} }
} }
// pub fn take_first_result(&mut self) -> Option<Vec<StreamMessage>> { pub fn take_first_result(&mut self) -> Option<Vec<StreamMessage>> {
// if !self.buffer.is_empty() { if !self.buffer.is_empty() {
// return None; return None;
// } }
// if self.first_result.is_some() { if self.first_result.is_some() {
// self.first_result_taken = true; self.first_result_taken = true;
// } }
// self.first_result.take() self.first_result.take()
// } }
#[cfg(test)] #[cfg(test)]
fn is_incomplete(&self) -> bool { fn is_incomplete(&self) -> bool {