mirror of
https://github.com/wisdgod/cursor-api.git
synced 2025-10-05 14:46:53 +08:00
v0.1.3-rc.4.1
This commit is contained in:
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -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",
|
||||||
|
@@ -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"
|
||||||
|
@@ -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(¤t_response);
|
response_data.push_str(¤t_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")
|
||||||
|
@@ -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 {
|
||||||
|
Reference in New Issue
Block a user