Fixes https://github.com/etkecc/baibot/issues/22 Ultimate related to `anthropic-rs` hardcoding models as enumeration variants in the code and not updating them. See: - https://github.com/roushou/mesh/issues/1 - https://github.com/roushou/mesh/pull/2 https://github.com/cortesi/misanthropy was also considered as an alternative, but it did not allow configuring the base API URL like our old Anthropic library (`anthropic-rs`) and like our new choice (`anthropic`). We'd rather not lose support for this, so we're going with the `anthropic` library.
73 lines
1.8 KiB
Rust
73 lines
1.8 KiB
Rust
use serde::{Deserialize, Serialize};
|
|
|
|
use crate::agent::{default_prompt, provider::ConfigTrait};
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct Config {
|
|
pub base_url: String,
|
|
|
|
pub api_key: String,
|
|
|
|
pub text_generation: Option<TextGenerationConfig>,
|
|
}
|
|
|
|
impl Default for Config {
|
|
fn default() -> Self {
|
|
Self {
|
|
base_url: "https://api.anthropic.com/v1".to_owned(),
|
|
api_key: "YOUR_API_KEY_HERE".to_owned(),
|
|
text_generation: Some(TextGenerationConfig::default()),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl ConfigTrait for Config {
|
|
fn validate(&self) -> Result<(), String> {
|
|
if self.base_url.is_empty() {
|
|
return Err("The base URL must not be empty.".to_owned());
|
|
}
|
|
if !self.base_url.ends_with("/v1") {
|
|
return Err("The base URL must end with '/v1'.".to_owned());
|
|
}
|
|
if self.api_key.is_empty() {
|
|
return Err("The API key must not be empty.".to_owned());
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct TextGenerationConfig {
|
|
#[serde(default = "default_text_model_id")]
|
|
pub model_id: String,
|
|
|
|
#[serde(default)]
|
|
pub prompt: Option<String>,
|
|
|
|
#[serde(default = "super::super::default_temperature")]
|
|
pub temperature: f32,
|
|
|
|
#[serde(default)]
|
|
pub max_response_tokens: u32,
|
|
|
|
#[serde(default)]
|
|
pub max_context_tokens: u32,
|
|
}
|
|
|
|
impl Default for TextGenerationConfig {
|
|
fn default() -> Self {
|
|
Self {
|
|
model_id: default_text_model_id(),
|
|
prompt: Some(default_prompt().to_owned()),
|
|
temperature: super::super::default_temperature(),
|
|
max_response_tokens: 8192,
|
|
max_context_tokens: 204_800,
|
|
}
|
|
}
|
|
}
|
|
|
|
fn default_text_model_id() -> String {
|
|
"claude-3-7-sonnet-20250219".to_owned()
|
|
}
|