use crate::language_models::openai::{OpenAIChat, OpenAIConfig};
use std::env;
pub const DEEPSEEK_BASE_URL: &str = "https://api.deepseek.com/v1";
pub const DEEPSEEK_MODELS: [&str; 4] = [
"deepseek-chat", "deepseek-coder", "deepseek-reasoner", "deepseek-v3", ];
#[derive(Debug, Clone)]
pub struct DeepSeekConfig {
pub api_key: String,
pub base_url: String,
pub model: String,
pub temperature: Option<f32>,
pub max_tokens: Option<usize>,
}
impl Default for DeepSeekConfig {
fn default() -> Self {
Self {
api_key: String::new(),
base_url: DEEPSEEK_BASE_URL.to_string(),
model: "deepseek-chat".to_string(),
temperature: None,
max_tokens: None,
}
}
}
impl DeepSeekConfig {
pub fn new(api_key: impl Into<String>) -> Self {
Self {
api_key: api_key.into(),
..Default::default()
}
}
pub fn from_env() -> Self {
let api_key =
env::var("DEEPSEEK_API_KEY").expect("DEEPSEEK_API_KEY environment variable not set");
let base_url =
env::var("DEEPSEEK_BASE_URL").unwrap_or_else(|_| DEEPSEEK_BASE_URL.to_string());
let model = env::var("DEEPSEEK_MODEL").unwrap_or_else(|_| "deepseek-chat".to_string());
Self {
api_key,
base_url,
model,
..Default::default()
}
}
pub fn with_model(mut self, model: impl Into<String>) -> Self {
self.model = model.into();
self
}
pub fn with_temperature(mut self, temp: f32) -> Self {
self.temperature = Some(temp);
self
}
pub fn with_max_tokens(mut self, max: usize) -> Self {
self.max_tokens = Some(max);
self
}
pub fn into_openai_config(self) -> OpenAIConfig {
OpenAIConfig {
api_key: self.api_key,
base_url: self.base_url,
model: self.model,
temperature: self.temperature,
max_tokens: self.max_tokens,
top_p: None,
frequency_penalty: None,
presence_penalty: None,
streaming: false,
organization: None,
tools: None,
tool_choice: None,
}
}
}
pub struct DeepSeekChat {
inner: OpenAIChat,
}
impl DeepSeekChat {
pub fn new(config: DeepSeekConfig) -> Self {
Self {
inner: OpenAIChat::new(config.into_openai_config()),
}
}
pub fn from_env() -> Self {
Self::new(DeepSeekConfig::from_env())
}
pub fn with_model(model: impl Into<String>) -> Self {
let config = DeepSeekConfig::from_env().with_model(model);
Self::new(config)
}
}
impl std::ops::Deref for DeepSeekChat {
type Target = OpenAIChat;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl std::ops::DerefMut for DeepSeekChat {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner
}
}