This commit is contained in:
Adil Hafeez 2025-06-05 20:03:27 -07:00
parent a3872a57ed
commit 8e4960df4a
No known key found for this signature in database
GPG key ID: 9B18EF7691369645
3 changed files with 26 additions and 6 deletions

View file

@ -7,17 +7,19 @@ pub mod providers;
pub enum Provider {
Mistral,
Deepseek,
Groq,
Gemini,
OpenAI,
Claude,
Github
Github,
}
impl From<&str> for Provider {
fn from(value: &str) -> Self {
match value.to_lowercase().as_str() {
"mistral" => Provider::Mistral,
"deepseek" => Provider::Deepseek,
"groq" => Provider::Groq,
"gemini" => Provider::Gemini,
"openai" => Provider::OpenAI,
@ -32,6 +34,7 @@ impl Display for Provider {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Provider::Mistral => write!(f, "Mistral"),
Provider::Deepseek => write!(f, "Deepseek"),
Provider::Groq => write!(f, "Groq"),
Provider::Gemini => write!(f, "Gemini"),
Provider::OpenAI => write!(f, "OpenAI"),

View file

@ -1,7 +1,7 @@
use std::fmt::Display;
use serde::{Deserialize, Serialize};
use serde_json::{Value};
use serde_json::Value;
use serde_with::skip_serializing_none;
use std::convert::TryFrom;
use std::str;
@ -15,6 +15,11 @@ pub enum OpenAIError {
JsonParseError(#[from] serde_json::Error),
#[error("utf8 parsing error: {0}")]
Utf8Error(#[from] std::str::Utf8Error),
#[error("invalid streaming data err {source}, data: {data}")]
InvalidStreamingData {
source: serde_json::Error,
data: String,
},
#[error("unsupported provider: {provider}")]
UnsupportedProvider { provider: String },
}
@ -134,6 +139,7 @@ impl ChatCompletionsRequest {
pub fn to_bytes(&self, provider: Provider) -> Result<Vec<u8>> {
match provider {
Provider::OpenAI
| Provider::Deepseek
| Provider::Mistral
| Provider::Groq
| Provider::Gemini
@ -218,9 +224,18 @@ where
if data == "[DONE]" {
return None;
}
if data == r#"{"type": "ping"}"# {
continue; // Skip ping messages - that is usually from anthropic
}
return Some(
serde_json::from_str::<ChatCompletionStreamResponse>(data)
.map_err(OpenAIError::from),
serde_json::from_str::<ChatCompletionStreamResponse>(data).map_err(|e| {
OpenAIError::InvalidStreamingData {
source: e,
data: data.to_string(),
}
}),
);
}
}

View file

@ -373,9 +373,11 @@ impl HttpContext for StreamContext {
return Action::Continue;
}
let llm_provider_str = self.llm_provider().provider_interface.to_string();
let hermes_llm_provider = Provider::from(llm_provider_str.as_str());
// convert chat completion request to llm provider specific request
let deserialized_body_bytes = match deserialized_body.to_bytes(hermesllm::Provider::OpenAI)
{
let deserialized_body_bytes = match deserialized_body.to_bytes(hermes_llm_provider) {
Ok(bytes) => bytes,
Err(e) => {
warn!("Failed to serialize request body: {}", e);