diff --git a/crates/Cargo.lock b/crates/Cargo.lock index 8ce8097e..49c29f1b 100644 --- a/crates/Cargo.lock +++ b/crates/Cargo.lock @@ -1006,6 +1006,13 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "hermesllm" +version = "0.1.0" +dependencies = [ + "common", +] + [[package]] name = "hermit-abi" version = "0.1.19" diff --git a/crates/Cargo.toml b/crates/Cargo.toml index 12eeb3b2..5cd6b29c 100644 --- a/crates/Cargo.toml +++ b/crates/Cargo.toml @@ -1,3 +1,3 @@ [workspace] resolver = "2" -members = ["llm_gateway", "prompt_gateway", "common", "brightstaff"] +members = ["llm_gateway", "prompt_gateway", "common", "brightstaff", "hermesllm"] diff --git a/crates/hermesllm/Cargo.toml b/crates/hermesllm/Cargo.toml new file mode 100644 index 00000000..fdc60353 --- /dev/null +++ b/crates/hermesllm/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "hermesllm" +version = "0.1.0" +edition = "2021" + +[dependencies] +common = { version = "0.1.0", path = "../common" } diff --git a/crates/hermesllm/src/lib.rs b/crates/hermesllm/src/lib.rs new file mode 100644 index 00000000..91283ab8 --- /dev/null +++ b/crates/hermesllm/src/lib.rs @@ -0,0 +1,145 @@ +//! hermesllm: A library for translating LLM API requests and responses +//! between Mistral, Grok, Gemini, and OpenAI-compliant formats. + +/// Supported LLM providers. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Provider { + Mistral, + Grok, + Gemini, + OpenAI, +} + +/// OpenAI API request format (placeholder). +#[derive(Debug, Clone)] +pub struct OpenAIRequest { + // Add OpenAI request fields here + pub prompt: String, + // ... +} + +/// OpenAI API response format (placeholder). +#[derive(Debug, Clone)] +pub struct OpenAIResponse { + // Add OpenAI response fields here + pub completion: String, + // ... +} + +/// Mistral API request format (placeholder). +#[derive(Debug, Clone)] +pub struct MistralRequest { + pub input: String, + // ... +} + +/// Mistral API response format (placeholder). +#[derive(Debug, Clone)] +pub struct MistralResponse { + pub output: String, + // ... +} + +/// Grok API request format (placeholder). +#[derive(Debug, Clone)] +pub struct GrokRequest { + pub message: String, + // ... +} + +/// Grok API response format (placeholder). +#[derive(Debug, Clone)] +pub struct GrokResponse { + pub reply: String, + // ... +} + +/// Gemini API request format (placeholder). +#[derive(Debug, Clone)] +pub struct GeminiRequest { + pub query: String, + // ... +} + +/// Gemini API response format (placeholder). +#[derive(Debug, Clone)] +pub struct GeminiResponse { + pub answer: String, + // ... +} + +/// Trait for translating provider-specific requests to OpenAI format. +pub trait ToOpenAIRequest { + fn to_openai(&self) -> OpenAIRequest; +} + +/// Trait for translating OpenAI responses to provider-specific format. +pub trait FromOpenAIResponse: Sized { + fn from_openai(resp: &OpenAIResponse) -> Self; +} + +// Implementations for Mistral +impl ToOpenAIRequest for MistralRequest { + fn to_openai(&self) -> OpenAIRequest { + OpenAIRequest { + prompt: self.input.clone(), + } + } +} +impl FromOpenAIResponse for MistralResponse { + fn from_openai(resp: &OpenAIResponse) -> Self { + MistralResponse { + output: resp.completion.clone(), + } + } +} + +// Implementations for Grok +impl ToOpenAIRequest for GrokRequest { + fn to_openai(&self) -> OpenAIRequest { + OpenAIRequest { + prompt: self.message.clone(), + } + } +} +impl FromOpenAIResponse for GrokResponse { + fn from_openai(resp: &OpenAIResponse) -> Self { + GrokResponse { + reply: resp.completion.clone(), + } + } +} + +// Implementations for Gemini +impl ToOpenAIRequest for GeminiRequest { + fn to_openai(&self) -> OpenAIRequest { + OpenAIRequest { + prompt: self.query.clone(), + } + } +} +impl FromOpenAIResponse for GeminiResponse { + fn from_openai(resp: &OpenAIResponse) -> Self { + GeminiResponse { + answer: resp.completion.clone(), + } + } +} + +// Optionally, add more conversion traits as needed for bidirectional translation. + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn mistral_to_openai_and_back() { + let mistral_req = MistralRequest { input: "Hello".into() }; + let openai_req = mistral_req.to_openai(); + assert_eq!(openai_req.prompt, "Hello"); + + let openai_resp = OpenAIResponse { completion: "Hi!".into() }; + let mistral_resp = MistralResponse::from_openai(&openai_resp); + assert_eq!(mistral_resp.output, "Hi!"); + } +}