|
|
@ -1,6 +1,6 @@
|
|
|
|
use super::{
|
|
|
|
use super::{
|
|
|
|
maybe_catch_error, message::*, Client, CompletionDetails, ExtraConfig, Model, ModelConfig,
|
|
|
|
maybe_catch_error, message::*, sse_stream, Client, CompletionDetails, ExtraConfig, Model,
|
|
|
|
PromptType, QianwenClient, SendData, SseHandler,
|
|
|
|
ModelConfig, PromptType, QianwenClient, SendData, SseHandler,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
use crate::utils::{sha256sum, PromptKind};
|
|
|
|
use crate::utils::{sha256sum, PromptKind};
|
|
|
@ -8,12 +8,10 @@ use crate::utils::{sha256sum, PromptKind};
|
|
|
|
use anyhow::{anyhow, bail, Context, Result};
|
|
|
|
use anyhow::{anyhow, bail, Context, Result};
|
|
|
|
use async_trait::async_trait;
|
|
|
|
use async_trait::async_trait;
|
|
|
|
use base64::{engine::general_purpose::STANDARD, Engine};
|
|
|
|
use base64::{engine::general_purpose::STANDARD, Engine};
|
|
|
|
use futures_util::StreamExt;
|
|
|
|
|
|
|
|
use reqwest::{
|
|
|
|
use reqwest::{
|
|
|
|
multipart::{Form, Part},
|
|
|
|
multipart::{Form, Part},
|
|
|
|
Client as ReqwestClient, RequestBuilder,
|
|
|
|
Client as ReqwestClient, RequestBuilder,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
use reqwest_eventsource::{Error as EventSourceError, Event, RequestBuilderExt};
|
|
|
|
|
|
|
|
use serde::Deserialize;
|
|
|
|
use serde::Deserialize;
|
|
|
|
use serde_json::{json, Value};
|
|
|
|
use serde_json::{json, Value};
|
|
|
|
use std::borrow::BorrowMut;
|
|
|
|
use std::borrow::BorrowMut;
|
|
|
@ -109,37 +107,22 @@ async fn send_message_streaming(
|
|
|
|
handler: &mut SseHandler,
|
|
|
|
handler: &mut SseHandler,
|
|
|
|
is_vl: bool,
|
|
|
|
is_vl: bool,
|
|
|
|
) -> Result<()> {
|
|
|
|
) -> Result<()> {
|
|
|
|
let mut es = builder.eventsource()?;
|
|
|
|
let handle = |data: &str| -> Result<bool> {
|
|
|
|
|
|
|
|
let data: Value = serde_json::from_str(data)?;
|
|
|
|
while let Some(event) = es.next().await {
|
|
|
|
maybe_catch_error(&data)?;
|
|
|
|
match event {
|
|
|
|
if is_vl {
|
|
|
|
Ok(Event::Open) => {}
|
|
|
|
if let Some(text) =
|
|
|
|
Ok(Event::Message(message)) => {
|
|
|
|
data["output"]["choices"][0]["message"]["content"][0]["text"].as_str()
|
|
|
|
let data: Value = serde_json::from_str(&message.data)?;
|
|
|
|
{
|
|
|
|
maybe_catch_error(&data)?;
|
|
|
|
handler.text(text)?;
|
|
|
|
if is_vl {
|
|
|
|
|
|
|
|
if let Some(text) =
|
|
|
|
|
|
|
|
data["output"]["choices"][0]["message"]["content"][0]["text"].as_str()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
handler.text(text)?;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if let Some(text) = data["output"]["text"].as_str() {
|
|
|
|
|
|
|
|
handler.text(text)?;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
Err(err) => {
|
|
|
|
|
|
|
|
match err {
|
|
|
|
|
|
|
|
EventSourceError::StreamEnded => {}
|
|
|
|
|
|
|
|
_ => {
|
|
|
|
|
|
|
|
bail!("{}", err);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
es.close();
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if let Some(text) = data["output"]["text"].as_str() {
|
|
|
|
|
|
|
|
handler.text(text)?;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Ok(false)
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
sse_stream(builder, handle).await
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn build_body(data: SendData, model: &Model, is_vl: bool) -> Result<(Value, bool)> {
|
|
|
|
fn build_body(data: SendData, model: &Model, is_vl: bool) -> Result<(Value, bool)> {
|
|
|
|