chore: update dependencies and improve chart components

- Updated `foreign-types` to version 0.5.0 and added new dependencies in `Cargo.lock`.
- Removed unused dependencies `chart.js` and `react-chartjs-2` from `package.json` and `package-lock.json`.
- Enhanced `CacheHitRateChart` to use `EChart` for rendering, improving performance and visual fidelity.
- Adjusted styles for `CacheHitRateChart` to ensure proper layout and responsiveness.
- Refactored API query construction in `api.ts` for better readability.
- Updated `HomeMetrics` to support refresh functionality for dynamic data updates.
This commit is contained in:
leookun
2026-08-27 00:34:35 +08:00
parent 7058d0193d
commit 995a12df44
20 changed files with 560 additions and 154 deletions
+19 -6
View File
@@ -29,24 +29,37 @@ impl ModelAssets {
}
pub fn ensure(cache_root: &Path) -> Result<Self> {
let client = reqwest::blocking::Client::builder()
.build()
.map_err(|error| Error::ModelAsset(error.to_string()))?;
Self::ensure_with_client(cache_root, &client)
}
pub fn ensure_with_client(
cache_root: &Path,
client: &reqwest::blocking::Client,
) -> Result<Self> {
let directory = cache_root.join("models/potion-code-16M-v2");
fs::create_dir_all(&directory).map_err(|error| Error::io(&directory, error))?;
let model = Self::model_path(cache_root);
let tokenizer = directory.join("tokenizer.json");
ensure_asset(&model, MODEL_URL, MODEL_SHA256)?;
ensure_asset(&tokenizer, TOKENIZER_URL, TOKENIZER_SHA256)?;
ensure_asset(client, &model, MODEL_URL, MODEL_SHA256)?;
ensure_asset(client, &tokenizer, TOKENIZER_URL, TOKENIZER_SHA256)?;
Ok(Self { model, tokenizer })
}
}
fn ensure_asset(path: &Path, url: &str, expected: &str) -> Result<()> {
fn ensure_asset(
client: &reqwest::blocking::Client,
path: &Path,
url: &str,
expected: &str,
) -> Result<()> {
if path.is_file() && digest(path)? == expected {
return Ok(());
}
let temporary = path.with_extension(format!("tmp-{}", std::process::id()));
let response = reqwest::blocking::Client::builder()
.build()
.map_err(|error| Error::ModelAsset(error.to_string()))?
let response = client
.get(url)
.send()
.and_then(reqwest::blocking::Response::error_for_status)
+11 -1
View File
@@ -35,12 +35,22 @@ static EMBEDDERS: LazyLock<Mutex<HashMap<PathBuf, Arc<StaticEmbedder>>>> =
impl SearchEngine {
pub fn load_default(config: SembleConfig) -> Result<Self> {
let client = reqwest::blocking::Client::builder()
.build()
.map_err(|error| Error::ModelAsset(error.to_string()))?;
Self::load_default_with_client(config, &client)
}
pub fn load_default_with_client(
config: SembleConfig,
client: &reqwest::blocking::Client,
) -> Result<Self> {
let model_path = ModelAssets::model_path(&config.cache_dir);
let cached = { EMBEDDERS.lock().get(&model_path).cloned() };
let embedder = if let Some(embedder) = cached {
embedder
} else {
let assets = ModelAssets::ensure(&config.cache_dir)?;
let assets = ModelAssets::ensure_with_client(&config.cache_dir, client)?;
let embedder = Arc::new(StaticEmbedder::load(&assets.model, &assets.tokenizer)?);
EMBEDDERS
.lock()