update fmt

This commit is contained in:
jhqxxx
2026-03-14 20:23:07 +08:00
parent 21caee0522
commit 813f4decaf
19 changed files with 48 additions and 32 deletions
+4
View File
@@ -25,6 +25,10 @@
aha is a high-performance, cross-platform AI inference engine built with Rust and the Candle framework. It brings state-of-the-art AI models to your local machine—no API keys, no cloud dependencies, just pure, fast AI running directly on your hardware.
## Changelog
### 2026-03-14
- update rust version
- Added Qwen3.5 gguf support, but the 4B model still has issues; to be resolved.
### v0.2.2 (2026-03-07)
- Added GLM-OCR model
+4
View File
@@ -25,6 +25,10 @@
aha 是一款基于 Rust 和 Candle 框架构建的高性能跨平台 AI 推理引擎。将最先进的 AI 模型带到您的本地机器——无需 API 密钥,无需云依赖,纯粹、快速的 AI,直接在您的硬件上运行。
## 更新日志
### 2026-03-14
- 更新rust版本
- 增加了对 Qwen3.5 gguf 的支持,但 4B 模型仍然存在问题;待解决。
### v0.2.2 (2026-03-07)
- 新增GLM-OCR 模型
+4
View File
@@ -5,6 +5,10 @@ All notable changes to aha will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
### 2026-03-14
- update rust version
- Added Qwen3.5 gguf support, but the 4B model still has issues; to be resolved.
## [0.2.2] (2026-03-07)
- Added GLM-OCR model
+4
View File
@@ -5,6 +5,10 @@
格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/)
本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/spec/v2.0.0.html)。
### 2026-03-14
- 更新rust版本
- 增加了对 Qwen3.5 gguf 的支持,但 4B 模型仍然存在问题;待解决。
## [0.2.2] (2026-03-07)
- 新增 GLM-OCR 模型
+2 -2
View File
@@ -44,8 +44,8 @@ fn deepseek_ocr_generate() -> Result<()> {
let res = model.generate(mes)?;
let i_duration = i_start.elapsed();
println!("generate: \n {:?}", res);
if res.usage.is_some() {
let num_token = res.usage.as_ref().unwrap().total_tokens;
if let Some(usage) = &res.usage {
let num_token = usage.total_tokens;
let duration_secs = i_duration.as_secs_f64();
let tps = num_token as f64 / duration_secs;
println!("Tokens per second (TPS): {:.2}", tps);
+2 -2
View File
@@ -42,8 +42,8 @@ fn fun_asr_nano_generate() -> Result<()> {
let res = fun_asr_model.generate(mes)?;
let i_duration = i_start.elapsed();
println!("generate: \n {:?}", res);
if res.usage.is_some() {
let num_token = res.usage.as_ref().unwrap().total_tokens;
if let Some(usage) = &res.usage {
let num_token = usage.total_tokens;
let duration_secs = i_duration.as_secs_f64();
let tps = num_token as f64 / duration_secs;
println!("Tokens per second (TPS): {:.2}", tps);
+2 -2
View File
@@ -66,8 +66,8 @@ fn gelab_zero_generate() -> Result<()> {
let res = qwen3vl.generate(mes)?;
let i_duration = i_start.elapsed();
println!("generate: \n {:?}", res);
if res.usage.is_some() {
let num_token = res.usage.as_ref().unwrap().total_tokens;
if let Some(usage) = &res.usage {
let num_token = usage.total_tokens;
let duration_secs = i_duration.as_secs_f64();
let tps = num_token as f64 / duration_secs;
println!("Tokens per second (TPS): {:.2}", tps);
+2 -2
View File
@@ -53,8 +53,8 @@ fn gguf_test() -> Result<()> {
let res = gguf_qwen3_5.generate(mes)?;
let i_duration = i_start.elapsed();
println!("generate: \n {:?}", res);
if res.usage.is_some() {
let num_token = res.usage.as_ref().unwrap().total_tokens;
if let Some(usage) = &res.usage {
let num_token = usage.total_tokens;
let duration_secs = i_duration.as_secs_f64();
let tps = num_token as f64 / duration_secs;
println!("Tokens per second (TPS): {:.2}", tps);
+2 -2
View File
@@ -43,8 +43,8 @@ fn glm_asr_nano_generate() -> Result<()> {
let res = glm_asr_model.generate(mes)?;
let i_duration = i_start.elapsed();
println!("generate: \n {:?}", res);
if res.usage.is_some() {
let num_token = res.usage.as_ref().unwrap().total_tokens;
if let Some(usage) = &res.usage {
let num_token = usage.total_tokens;
let duration_secs = i_duration.as_secs_f64();
let tps = num_token as f64 / duration_secs;
println!("Tokens per second (TPS): {:.2}", tps);
+2 -2
View File
@@ -43,8 +43,8 @@ fn glm_ocr_generate() -> Result<()> {
let res = model.generate(mes)?;
let i_duration = i_start.elapsed();
println!("generate: \n {:?}", res);
if res.usage.is_some() {
let num_token = res.usage.as_ref().unwrap().total_tokens;
if let Some(usage) = &res.usage {
let num_token = usage.total_tokens;
let duration_secs = i_duration.as_secs_f64();
let tps = num_token as f64 / duration_secs;
println!("Tokens per second (TPS): {:.2}", tps);
+2 -2
View File
@@ -43,8 +43,8 @@ fn hunyuan_ocr_generate() -> Result<()> {
let res = model.generate(mes)?;
let i_duration = i_start.elapsed();
println!("generate: \n {:?}", res);
if res.usage.is_some() {
let num_token = res.usage.as_ref().unwrap().total_tokens;
if let Some(usage) = &res.usage {
let num_token = usage.total_tokens;
let duration_secs = i_duration.as_secs_f64();
let tps = num_token as f64 / duration_secs;
println!("Tokens per second (TPS): {:.2}", tps);
+2 -2
View File
@@ -37,8 +37,8 @@ fn minicpm_generate() -> Result<()> {
let result = model.generate(mes)?;
let i_duration = i_start.elapsed();
println!("generate: \n {:?}", result);
if result.usage.is_some() {
let num_token = result.usage.as_ref().unwrap().total_tokens;
if let Some(usage) = &result.usage {
let num_token = usage.total_tokens;
let duration_secs = i_duration.as_secs_f64();
let tps = num_token as f64 / duration_secs;
println!("Tokens per second (TPS): {:.2}", tps);
+2 -2
View File
@@ -44,8 +44,8 @@ fn paddleocr_vl_generate() -> Result<()> {
let res = model.generate(mes)?;
let i_duration = i_start.elapsed();
println!("generate: \n {:?}", res);
if res.usage.is_some() {
let num_token = res.usage.as_ref().unwrap().total_tokens;
if let Some(usage) = &res.usage {
let num_token = usage.total_tokens;
let duration_secs = i_duration.as_secs_f64();
let tps = num_token as f64 / duration_secs;
println!("Tokens per second (TPS): {:.2}", tps);
+2 -2
View File
@@ -50,8 +50,8 @@ fn qwen2_5vl_generate() -> Result<()> {
let result = model.generate(mes)?;
let i_duration = i_start.elapsed();
println!("generate: \n {:?}", result);
if result.usage.is_some() {
let num_token = result.usage.as_ref().unwrap().total_tokens;
if let Some(usage) = &result.usage {
let num_token = usage.total_tokens;
let duration_secs = i_duration.as_secs_f64();
let tps = num_token as f64 / duration_secs;
println!("Tokens per second (TPS): {:.2}", tps);
+2 -2
View File
@@ -34,8 +34,8 @@ fn qwen3_0_6b_generate() -> Result<()> {
let result = model.generate(mes)?;
let i_duration = i_start.elapsed();
println!("generate: \n {:?}", result);
if result.usage.is_some() {
let num_token = result.usage.as_ref().unwrap().total_tokens;
if let Some(usage) = &result.usage {
let num_token = usage.total_tokens;
let duration_secs = i_duration.as_secs_f64();
let tps = num_token as f64 / duration_secs;
println!("Tokens per second (TPS): {:.2}", tps);
+2 -2
View File
@@ -46,8 +46,8 @@ fn qwen3_5_generate() -> Result<()> {
let res = qwen3_5.generate(mes)?;
let i_duration = i_start.elapsed();
println!("generate: \n {:?}", res);
if res.usage.is_some() {
let num_token = res.usage.as_ref().unwrap().total_tokens;
if let Some(usage) = &res.usage {
let num_token = usage.total_tokens;
let duration_secs = i_duration.as_secs_f64();
let tps = num_token as f64 / duration_secs;
println!("Tokens per second (TPS): {:.2}", tps);
+2 -2
View File
@@ -39,8 +39,8 @@ fn qwen3_asr_generate() -> Result<()> {
let res = model.generate(mes)?;
let i_duration = i_start.elapsed();
println!("generate: \n {:?}", res);
if res.usage.is_some() {
let num_token = res.usage.as_ref().unwrap().total_tokens;
if let Some(usage) = &res.usage {
let num_token = usage.total_tokens;
let duration_secs = i_duration.as_secs_f64();
let tps = num_token as f64 / duration_secs;
println!("Tokens per second (TPS): {:.2}", tps);
+4 -4
View File
@@ -47,8 +47,8 @@ fn qwen3vl_thinking_generate() -> Result<()> {
let res = qwen3vl.generate(mes)?;
let i_duration = i_start.elapsed();
println!("generate: \n {:?}", res);
if res.usage.is_some() {
let num_token = res.usage.as_ref().unwrap().total_tokens;
if let Some(usage) = &res.usage {
let num_token = usage.total_tokens;
let duration_secs = i_duration.as_secs_f64();
let tps = num_token as f64 / duration_secs;
println!("Tokens per second (TPS): {:.2}", tps);
@@ -98,8 +98,8 @@ fn qwen3vl_generate() -> Result<()> {
let res = qwen3vl.generate(mes)?;
let i_duration = i_start.elapsed();
println!("generate: \n {:?}", res);
if res.usage.is_some() {
let num_token = res.usage.as_ref().unwrap().total_tokens;
if let Some(usage) = &res.usage {
let num_token = usage.total_tokens;
let duration_secs = i_duration.as_secs_f64();
let tps = num_token as f64 / duration_secs;
println!("Tokens per second (TPS): {:.2}", tps);
+2 -2
View File
@@ -38,8 +38,8 @@ fn robo_brain_generate() -> Result<()> {
let result = model.generate(mes)?;
let i_duration = i_start.elapsed();
println!("generate: \n {:?}", result);
if result.usage.is_some() {
let num_token = result.usage.as_ref().unwrap().total_tokens;
if let Some(usage) = &result.usage {
let num_token = usage.total_tokens;
let duration_secs = i_duration.as_secs_f64();
let tps = num_token as f64 / duration_secs;
println!("Tokens per second (TPS): {:.2}", tps);