feat: support moonshot (#369)

pull/372/head
sigoden 6 months ago committed by GitHub
parent 527da63d18
commit 774d991144
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -53,6 +53,7 @@ Download it from [GitHub Releases](https://github.com/sigoden/aichat/releases),
- VertexAI: Gemini-1/Gemini-1.5 (paid, vision) - VertexAI: Gemini-1/Gemini-1.5 (paid, vision)
- Ernie (paid) - Ernie (paid)
- Qianwen (paid, vision) - Qianwen (paid, vision)
- Moonshot (paid)
- Support [Command Mode](#command) and [Chat-REPL Mode](#chat-repl) - Support [Command Mode](#command) and [Chat-REPL Mode](#chat-repl)
- Support [roles](#roles) - Support [roles](#roles)
- Support sessions (context-aware conversation) - Support sessions (context-aware conversation)

@ -65,7 +65,7 @@ clients:
api_key: Basic xxx # Set authorization header api_key: Basic xxx # Set authorization header
chat_endpoint: /chat # Optional field chat_endpoint: /chat # Optional field
models: models:
- name: mistral - name: llama2
max_input_tokens: 8192 max_input_tokens: 8192
# See https://learn.microsoft.com/en-us/azure/ai-services/openai/chatgpt-quickstart # See https://learn.microsoft.com/en-us/azure/ai-services/openai/chatgpt-quickstart
@ -92,3 +92,7 @@ clients:
# See https://help.aliyun.com/zh/dashscope/ # See https://help.aliyun.com/zh/dashscope/
- type: qianwen - type: qianwen
api_key: sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx api_key: sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# See https://platform.moonshot.cn/docs/intro
- type: moonshot
api_key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

@ -20,7 +20,8 @@ register_client!(
AzureOpenAIConfig, AzureOpenAIConfig,
AzureOpenAIClient AzureOpenAIClient
), ),
(vertexai, "vertexai", VertexAIConfig, VertexAIClient),
(ernie, "ernie", ErnieConfig, ErnieClient), (ernie, "ernie", ErnieConfig, ErnieClient),
(qianwen, "qianwen", QianwenConfig, QianwenClient), (qianwen, "qianwen", QianwenConfig, QianwenClient),
(vertexai, "vertexai", VertexAIConfig, VertexAIClient), (moonshot, "moonshot", MoonshotConfig, MoonshotClient),
); );

@ -0,0 +1,67 @@
use super::openai::{openai_build_body, OPENAI_TOKENS_COUNT_FACTORS};
use super::{ExtraConfig, MoonshotClient, Model, PromptType, SendData};
use crate::utils::PromptKind;
use anyhow::Result;
use async_trait::async_trait;
use reqwest::{Client as ReqwestClient, RequestBuilder};
use serde::Deserialize;
const API_URL: &str = "https://api.moonshot.cn/v1/chat/completions";
const MODELS: [(&str, usize, &str); 3] = [
// https://platform.moonshot.cn/docs/intro
("moonshot-v1-8k", 8000, "text"),
("moonshot-v1-32k", 32000, "text"),
("moonshot-v1-128k", 128000, "text"),
];
#[derive(Debug, Clone, Deserialize)]
pub struct MoonshotConfig {
pub name: Option<String>,
pub api_key: Option<String>,
pub extra: Option<ExtraConfig>,
}
openai_compatible_client!(MoonshotClient);
impl MoonshotClient {
config_get_fn!(api_key, get_api_key);
pub const PROMPTS: [PromptType<'static>; 1] = [
("api_key", "API Key:", false, PromptKind::String),
];
pub fn list_models(local_config: &MoonshotConfig) -> Vec<Model> {
let client_name = Self::name(local_config);
MODELS
.into_iter()
.map(|(name, max_input_tokens, capabilities)| {
Model::new(client_name, name)
.set_capabilities(capabilities.into())
.set_max_input_tokens(Some(max_input_tokens))
.set_tokens_count_factors(OPENAI_TOKENS_COUNT_FACTORS)
})
.collect()
}
fn request_builder(&self, client: &ReqwestClient, data: SendData) -> Result<RequestBuilder> {
let api_key = self.get_api_key().ok();
let mut body = openai_build_body(data, self.model.name.clone());
self.model.merge_extra_fields(&mut body);
let url = API_URL;
debug!("Moonshot Request: {url} {body}");
let mut builder = client.post(url).json(&body);
if let Some(api_key) = api_key {
builder = builder.bearer_auth(api_key);
}
Ok(builder)
}
}
Loading…
Cancel
Save