chore(deps): upgrade workspace deps and adapt code

This commit is contained in:
wangnov committed 2026-01-04 17:43:18 +08:00
1 parent 4eebb0aa56
commit 106d7776b7
8 files changed
+268 -313

No files matched your search

Generated
+218 -274
View File
File diff suppressed because it is too large. Load diff
+8 -10
View File
@@ -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"
+8 -5
View File
@@ -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"
+13 -13
View File
@@ -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))
+8 -4
View File
@@ -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)))
}
+8 -1
View File
@@ -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};
+2 -3
View File
@@ -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"
+3 -3
View File
@@ -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"))
}