✨ feat: 灵台引擎五神齐备与 Go/Rust 官方绑定(WP-15)
- C++ 新增四模块(modules.cpp,19 个导出符号全部 hj_*): 小周天 hj_stream:流会话(sequence/delta_index 单调)与 content.block.delta envelope 确定性编码(重放字节一致) 烛照 hj_policy:URL 协议白名单(拒 file/javascript/data)、路径授权根与 .. 段拒绝、幂等键非空≤128、四维决策表(autonomy×risk→allow/ask/deny,非法输入 deny fail-closed) 洛书 hj_plan:预算核算(达限/负数拒绝) 河图 hj_recall:确定性重排(词频×稳定排序,canonical JSON 输出;非法输入 PARSE_FAILED) - doctest 22 用例 20135 断言全绿(含每模块 golden 与确定性双跑) - Go 绑定(cgo 自包含编译引擎源码):Engine RAII/TransformMarkdown/ValidateURL/ValidatePath/Decide/CheckBudget/RecallRerank;go test 3 用例通过(transform/rerank golden 与 C++ 字节一致) - Rust 绑定(bindgen 生成 + 安全包装):Engine RAII(Drop 释放)、Error 枚举映射全部 HjStatus、Send/Sync(HjEngine 线程安全);cargo test 3 用例通过(同 golden) - 三端(C++/Go/Rust)与 Python golden 一致:同一 markdown 输入在四端输出字节相同(跨端一致性首次全语言验证)
This commit is contained in:
1 parent
99a7789432
commit
a39cec5287
15 files changed
+1205
-3
No files matched your search
@@ -0,0 +1,33 @@
|
||||
use hunjing_lingtai::{decide, check_budget, transform_version, validate_path, validate_url, Engine};
|
||||
|
||||
#[test]
|
||||
fn lifecycle_and_transform_golden() {
|
||||
assert_eq!(transform_version(), "hunjing-markdown-v1");
|
||||
let engine = Engine::new().expect("引擎初始化");
|
||||
let out = engine
|
||||
.transform_markdown("x\n```mermaid\nA-->B\n```\n$$\nz\n$$\n")
|
||||
.expect("transform");
|
||||
let want = r#"{"parser_version":"hunjing-markdown-v1","blocks":[{"type":"markdown","text":"x","flavor":"hunjing-gfm-v1","status":"completed"},{"type":"mermaid","source":"A-->B","status":"completed"},{"type":"math","notation":"latex","display":"block","source":"z","status":"completed"}]}"#;
|
||||
assert_eq!(out, want);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn policy_primitives() {
|
||||
validate_url("https://ok.example").unwrap();
|
||||
assert!(validate_url("javascript:alert(1)").is_err());
|
||||
validate_path("/data/d/f", "/data/d").unwrap();
|
||||
assert!(validate_path("/data/d/../x", "/data/d").is_err());
|
||||
assert_eq!(decide(1, 0), 0); // 循律+只读 = allow
|
||||
assert_eq!(decide(0, 2), 2); // 自省+高影响 = deny
|
||||
assert!(check_budget(10, 10).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn recall_rerank_deterministic() {
|
||||
let engine = Engine::new().unwrap();
|
||||
let input = r#"{"query_terms":["魂镜"],"candidates":[{"id":"a","text":"魂镜 系统"},{"id":"b","text":"无"}]}"#;
|
||||
let out1 = engine.recall_rerank(input).unwrap();
|
||||
let out2 = engine.recall_rerank(input).unwrap();
|
||||
assert_eq!(out1, out2);
|
||||
assert_eq!(out1, r#"{"ranked":[{"id":"a","score":10},{"id":"b","score":0}]}"#);
|
||||
}
|
||||
Reference in new issue
Block a user