chore(deps): upgrade workspace deps and adapt code
This commit is contained in:
1 parent
4eebb0aa56
commit
106d7776b7
8 files changed
+268
-313
No files matched your search
Generated
+218
-274
File diff suppressed because it is too large.
Load diff
+8
-10
@@ -25,29 +25,27 @@ categories = ["api-bindings"]
|
||||
[workspace.dependencies]
|
||||
tokio = { version = "1.40", features = ["rt-multi-thread", "macros", "time", "fs", "io-util", "process", "sync"] }
|
||||
reqwest = { version = "0.12", features = ["json", "rustls-tls", "brotli", "gzip"] }
|
||||
axum = "0.7"
|
||||
tower = "0.4"
|
||||
tower-http = { version = "0.5", features = ["trace", "compression-gzip", "compression-br", "cors", "fs"] }
|
||||
axum = "0.8"
|
||||
tower = "0.5"
|
||||
tower-http = { version = "0.6", features = ["trace", "compression-gzip", "compression-br", "cors", "fs"] }
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
serde_json = "1.0"
|
||||
tracing = "0.1"
|
||||
tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt", "json"] }
|
||||
tracing-appender = "0.2"
|
||||
thiserror = "1.0"
|
||||
thiserror = "2.0"
|
||||
anyhow = "1.0"
|
||||
async-trait = "0.1"
|
||||
hmac = "0.12"
|
||||
sha2 = "0.10"
|
||||
hex = "0.4"
|
||||
sqlx = { version = "0.8", default-features = false, features = ["runtime-tokio-rustls", "macros", "chrono", "uuid", "sqlite", "postgres", "migrate"] }
|
||||
redis = { version = "0.26", features = ["tokio-comp"] }
|
||||
toml = "0.8"
|
||||
directories = "5.0"
|
||||
dirs = "5.0"
|
||||
sqlx = { version = "0.8", default-features = false, features = ["runtime-tokio-rustls", "chrono", "uuid", "sqlite", "postgres"] }
|
||||
redis = { version = "1.0", features = ["tokio-comp"] }
|
||||
toml = "0.9"
|
||||
directories = "6.0"
|
||||
clap = { version = "4.5", features = ["derive"] }
|
||||
|
||||
# The profile that 'dist' will build with
|
||||
[profile.dist]
|
||||
inherits = "release"
|
||||
lto = "thin"
|
||||
|
||||
@@ -24,20 +24,23 @@ toml = { workspace = true }
|
||||
tower = { workspace = true, features = ["make"] }
|
||||
reqwest = { workspace = true }
|
||||
regex = "1"
|
||||
rig-core = "0.24"
|
||||
rig-core = "0.27"
|
||||
tracing = { workspace = true }
|
||||
tracing-subscriber = { workspace = true }
|
||||
tracing-appender = { workspace = true }
|
||||
tower-http = { workspace = true }
|
||||
base64 = "0.22"
|
||||
uuid = { version = "1.10", features = ["v4"] }
|
||||
rand = "0.8"
|
||||
uuid = { version = "1.19", features = ["v4"] }
|
||||
rand = "0.9"
|
||||
sha2 = { workspace = true }
|
||||
hex = { workspace = true }
|
||||
chrono = { version = "0.4", features = ["serde"] }
|
||||
axum-htmx = "0.6"
|
||||
axum-htmx = "0.8"
|
||||
sqlx = { workspace = true }
|
||||
async-trait = { workspace = true }
|
||||
|
||||
[features]
|
||||
db-migrate = ["sqlx/migrate", "sqlx/macros"]
|
||||
|
||||
[dev-dependencies]
|
||||
tempfile = "3"
|
||||
tempfile = "3.24"
|
||||
@@ -32,8 +32,8 @@ pub fn api_router(state: ApiState) -> Router {
|
||||
.route("/config/import", post(config::import_config))
|
||||
// Prompts 相关
|
||||
.route("/prompts", get(prompts::list_prompts))
|
||||
.route("/prompts/:name", get(prompts::get_prompt))
|
||||
.route("/prompts/:name", put(prompts::put_prompt))
|
||||
.route("/prompts/{name}", get(prompts::get_prompt))
|
||||
.route("/prompts/{name}", put(prompts::put_prompt))
|
||||
.with_state(state)
|
||||
}
|
||||
|
||||
@@ -45,47 +45,47 @@ pub fn pages_router(state: ApiState) -> Router {
|
||||
// Bots
|
||||
.route("/bots", get(pages::bots_list))
|
||||
.route("/bots/new", get(pages::bot_new_form))
|
||||
.route("/bots/edit/:id", get(pages::bot_edit_form))
|
||||
.route("/bots/edit/{id}", get(pages::bot_edit_form))
|
||||
.route("/bots/save", post(pages::bot_save))
|
||||
.route("/bots/delete/:id", post(pages::bot_delete))
|
||||
.route("/bots/delete/{id}", post(pages::bot_delete))
|
||||
// AI Profiles
|
||||
.route("/ai-profiles", get(pages::ai_profiles_list))
|
||||
.route("/ai-profiles/new", get(pages::ai_profile_new_form))
|
||||
.route("/ai-profiles/edit/:id", get(pages::ai_profile_edit_form))
|
||||
.route("/ai-profiles/edit/{id}", get(pages::ai_profile_edit_form))
|
||||
.route("/ai-profiles/save", post(pages::ai_profile_save))
|
||||
.route("/ai-profiles/delete/:id", post(pages::ai_profile_delete))
|
||||
.route("/ai-profiles/delete/{id}", post(pages::ai_profile_delete))
|
||||
// Tools
|
||||
.route("/tools", get(pages::tools_list))
|
||||
.route("/tools/new", get(pages::tool_new_form))
|
||||
.route("/tools/edit/:id", get(pages::tool_edit_form))
|
||||
.route("/tools/edit/{id}", get(pages::tool_edit_form))
|
||||
.route("/tools/save", post(pages::tool_save))
|
||||
.route("/tools/delete/:id", post(pages::tool_delete))
|
||||
.route("/tools/delete/{id}", post(pages::tool_delete))
|
||||
// Rules
|
||||
.route("/rules", get(pages::rules_page))
|
||||
.route("/rule-templates/new", get(pages::rule_template_new_form))
|
||||
.route(
|
||||
"/rule-templates/edit/:id",
|
||||
"/rule-templates/edit/{id}",
|
||||
get(pages::rule_template_edit_form),
|
||||
)
|
||||
.route("/rule-templates/save", post(pages::rule_template_save))
|
||||
.route(
|
||||
"/rule-templates/delete/:id",
|
||||
"/rule-templates/delete/{id}",
|
||||
post(pages::rule_template_delete),
|
||||
)
|
||||
.route("/rule-instances/new", get(pages::rule_instance_new_form))
|
||||
.route(
|
||||
"/rule-instances/edit/:id",
|
||||
"/rule-instances/edit/{id}",
|
||||
get(pages::rule_instance_edit_form),
|
||||
)
|
||||
.route("/rule-instances/save", post(pages::rule_instance_save))
|
||||
.route(
|
||||
"/rule-instances/delete/:id",
|
||||
"/rule-instances/delete/{id}",
|
||||
post(pages::rule_instance_delete),
|
||||
)
|
||||
// Prompts
|
||||
.route("/prompts", get(pages::prompts_page))
|
||||
.route("/prompts/new", get(pages::prompt_new))
|
||||
.route("/prompts/edit/:name", get(pages::prompt_edit))
|
||||
.route("/prompts/edit/{name}", get(pages::prompt_edit))
|
||||
.route("/prompts/create", post(pages::prompt_create))
|
||||
// Simulator
|
||||
.route("/simulator", get(pages::simulator_page))
|
||||
|
||||
@@ -101,7 +101,7 @@ impl RateLimiter {
|
||||
guard.push_back(now);
|
||||
drop(guard);
|
||||
if self.jitter_ms > 0 {
|
||||
let jitter = rand::thread_rng().gen_range(0..=self.jitter_ms);
|
||||
let jitter = rand::rng().random_range(0..=self.jitter_ms);
|
||||
if jitter > 0 {
|
||||
time::sleep(Duration::from_millis(jitter)).await;
|
||||
}
|
||||
@@ -237,7 +237,7 @@ impl LlmClient {
|
||||
|
||||
match provider {
|
||||
"anthropic" | "claude" => {
|
||||
let mut builder = anthropic::Client::builder(&api_key);
|
||||
let mut builder = anthropic::Client::builder().api_key(&api_key);
|
||||
if let Some(ref url) = action.base_url {
|
||||
builder = builder.base_url(url.trim_end_matches('/'));
|
||||
}
|
||||
@@ -247,7 +247,7 @@ impl LlmClient {
|
||||
Ok(Self::Anthropic(client.completion_model(&action.model)))
|
||||
}
|
||||
"gemini" | "google" => {
|
||||
let mut builder = gemini::Client::builder(&api_key);
|
||||
let mut builder = gemini::Client::builder().api_key(&api_key);
|
||||
if let Some(ref url) = action.base_url {
|
||||
builder = builder.base_url(url.trim_end_matches('/'));
|
||||
}
|
||||
@@ -264,7 +264,11 @@ impl LlmClient {
|
||||
.unwrap_or("https://api.openai.com/v1")
|
||||
.trim_end_matches('/');
|
||||
|
||||
let client = openai::Client::builder(&api_key).base_url(base_url).build();
|
||||
let client = openai::Client::builder()
|
||||
.api_key(&api_key)
|
||||
.base_url(base_url)
|
||||
.build()
|
||||
.map_err(|e| anyhow!("创建 OpenAI 客户端失败: {}", e))?;
|
||||
|
||||
Ok(Self::OpenAi(client.completion_model(&action.model)))
|
||||
}
|
||||
|
||||
@@ -23,7 +23,8 @@ impl PostgresStorage {
|
||||
Ok(Self { pool })
|
||||
}
|
||||
|
||||
/// 运行迁移
|
||||
/// 运行迁移(需启用 db-migrate 特性)
|
||||
#[cfg(feature = "db-migrate")]
|
||||
pub async fn run_migrations(&self) -> Result<(), String> {
|
||||
sqlx::migrate!("./migrations")
|
||||
.run(&self.pool)
|
||||
@@ -32,6 +33,12 @@ impl PostgresStorage {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// 运行迁移(需启用 db-migrate 特性)
|
||||
#[cfg(not(feature = "db-migrate"))]
|
||||
pub async fn run_migrations(&self) -> Result<(), String> {
|
||||
Err("运行迁移需要启用 feature `db-migrate`,或改用 sqlx-cli 执行迁移".to_string())
|
||||
}
|
||||
|
||||
/// 计算 ETag
|
||||
fn compute_etag(content: &str) -> String {
|
||||
use sha2::{Digest, Sha256};
|
||||
|
||||
@@ -23,7 +23,6 @@ directories = { workspace = true }
|
||||
toml = { workspace = true }
|
||||
serde = { workspace = true }
|
||||
serde_json = { workspace = true }
|
||||
dirs = { workspace = true }
|
||||
anyhow = { workspace = true }
|
||||
axum = { workspace = true }
|
||||
tower = { workspace = true }
|
||||
@@ -32,7 +31,7 @@ async-trait = { workspace = true }
|
||||
futures = "0.3"
|
||||
chrono = { version = "0.4", features = ["serde"] }
|
||||
regex = "1"
|
||||
rand = "0.8"
|
||||
rand = "0.9"
|
||||
|
||||
[dev-dependencies]
|
||||
tempfile = "3.15"
|
||||
tempfile = "3.24"
|
||||
@@ -1,6 +1,6 @@
|
||||
use anyhow::{anyhow, Result};
|
||||
use clap::Args;
|
||||
use directories::ProjectDirs;
|
||||
use directories::{BaseDirs, ProjectDirs};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::fs;
|
||||
use std::io::Write;
|
||||
@@ -61,8 +61,8 @@ pub fn resolve_config_path(custom: Option<&Path>) -> Result<PathBuf> {
|
||||
fs::create_dir_all(dir)?;
|
||||
return Ok(dir.join("config.toml"));
|
||||
}
|
||||
let home = dirs::home_dir().ok_or_else(|| anyhow!("failed to resolve home directory"))?;
|
||||
let dir = home.join(".config/gewe");
|
||||
let base = BaseDirs::new().ok_or_else(|| anyhow!("failed to resolve home directory"))?;
|
||||
let dir = base.home_dir().join(".config/gewe");
|
||||
fs::create_dir_all(&dir)?;
|
||||
Ok(dir.join("config.toml"))
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user