diff options
| author | sigoden <sigoden@gmail.com> | 2024-07-25 15:56:56 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-07-26 06:56:56 +0800 |
| commit | 96ad64352dccfb9328374ef754c2a90a31c0a339 (patch) | |
| tree | 16132de380950739e22dd126e34d5495826a9192 /src/client/vertexai.rs | |
| parent | 54e78583991918c05e724ed70c2c4be4a15bc849 (diff) | |
| download | aichat-96ad64352dccfb9328374ef754c2a90a31c0a339.tar.gz | |
feat: merge vertexai-cluade with vertexai (#745)
Diffstat (limited to 'src/client/vertexai.rs')
| -rw-r--r-- | src/client/vertexai.rs | 69 |
1 files changed, 59 insertions, 10 deletions
diff --git a/src/client/vertexai.rs b/src/client/vertexai.rs index 828c300..c9ae648 100644 --- a/src/client/vertexai.rs +++ b/src/client/vertexai.rs @@ -1,4 +1,5 @@ use super::access_token::*; +use super::claude::*; use super::*; use anyhow::{anyhow, bail, Context, Result}; @@ -7,7 +8,7 @@ use chrono::{Duration, Utc}; use reqwest::{Client as ReqwestClient, RequestBuilder}; use serde::Deserialize; use serde_json::{json, Value}; -use std::path::PathBuf; +use std::{path::PathBuf, str::FromStr}; #[derive(Debug, Clone, Deserialize, Default)] pub struct VertexAIConfig { @@ -34,6 +35,7 @@ impl VertexAIClient { &self, client: &ReqwestClient, data: ChatCompletionsData, + model_category: &ModelCategory, ) -> Result<RequestBuilder> { let project_id = self.get_project_id()?; let location = self.get_location()?; @@ -41,13 +43,32 @@ impl VertexAIClient { let base_url = format!("https://{location}-aiplatform.googleapis.com/v1/projects/{project_id}/locations/{location}/publishers"); - let func = match data.stream { - true => "streamGenerateContent", - false => "generateContent", + let model_name = self.model.name(); + + let url = match model_category { + ModelCategory::Gemini => { + let func = match data.stream { + true => "streamGenerateContent", + false => "generateContent", + }; + format!("{base_url}/google/models/{model_name}:{func}") + } + ModelCategory::Claude => { + format!("{base_url}/anthropic/models/{model_name}:streamRawPredict") + } }; - let url = format!("{base_url}/google/models/{}:{func}", self.model.name()); - let mut body = gemini_build_chat_completions_body(data, &self.model)?; + let mut body = match model_category { + ModelCategory::Gemini => gemini_build_chat_completions_body(data, &self.model)?, + ModelCategory::Claude => { + let mut body = claude_build_chat_completions_body(data, &self.model)?; + if let Some(body_obj) = body.as_object_mut() { + body_obj.remove("model"); + } + body["anthropic_version"] = "vertex-2023-10-16".into(); + body + } + }; self.patch_chat_completions_body(&mut body); debug!("VertexAI Chat Completions Request: {url} {body}"); @@ -96,8 +117,12 @@ impl Client for VertexAIClient { data: ChatCompletionsData, ) -> Result<ChatCompletionsOutput> { prepare_gcloud_access_token(client, self.name(), &self.config.adc_file).await?; - let builder = self.chat_completions_builder(client, data)?; - gemini_chat_completions(builder).await + let model_category = ModelCategory::from_str(self.model.name())?; + let builder = self.chat_completions_builder(client, data, &model_category)?; + match model_category { + ModelCategory::Gemini => gemini_chat_completions(builder).await, + ModelCategory::Claude => claude_chat_completions(builder).await, + } } async fn chat_completions_streaming_inner( @@ -107,8 +132,12 @@ impl Client for VertexAIClient { data: ChatCompletionsData, ) -> Result<()> { prepare_gcloud_access_token(client, self.name(), &self.config.adc_file).await?; - let builder = self.chat_completions_builder(client, data)?; - gemini_chat_completions_streaming(builder, handler).await + let model_category = ModelCategory::from_str(self.model.name())?; + let builder = self.chat_completions_builder(client, data, &model_category)?; + match model_category { + ModelCategory::Gemini => gemini_chat_completions_streaming(builder, handler).await, + ModelCategory::Claude => claude_chat_completions_streaming(builder, handler).await, + } } async fn embeddings_inner( @@ -366,6 +395,26 @@ pub fn gemini_build_chat_completions_body( Ok(body) } +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum ModelCategory { + Gemini, + Claude, +} + +impl FromStr for ModelCategory { + type Err = anyhow::Error; + + fn from_str(s: &str) -> std::result::Result<Self, Self::Err> { + if s.starts_with("gemini-") { + Ok(ModelCategory::Gemini) + } else if s.starts_with("claude-") { + Ok(ModelCategory::Claude) + } else { + unsupported_model!(s) + } + } +} + pub async fn prepare_gcloud_access_token( client: &reqwest::Client, client_name: &str, |
