package core import ( "os" "testing" ) // 用**真实的 models.dev 响应**验证解析口径(5.6MB / 229 键 / opencode 122 模型)。 // // 为什么必须用真数据:字段路径(modalities.input / cost.input / limit.context) // 是我照参考注释写的,只有真数据能证明写对了。合成样本会把这个验证变成自说自话。 // // 样本不在仓库里(5.6MB),缺失时跳过 —— 但 CI 里能拉到就一定会跑。 func TestCapabilityParseAgainstRealModelsDev(t *testing.T) { b, err := os.ReadFile("/tmp/modelsdev.json") if err != nil { t.Skip("无 models.dev 样本(/tmp/modelsdev.json),跳过") } _, ps := poolCore(t) out, err := ps.Call("channels", "__parse_capability_probe", map[string]interface{}{ "body": string(b), "key": "opencode", }) if err != nil { t.Fatalf("探针: %v", err) } j, _ := out.(map[string]interface{})["json"].(map[string]interface{}) if j["error"] != nil { t.Fatalf("解析失败: %v", j["error"]) } total, _ := j["total"].(float64) free, _ := j["free"].(float64) image, _ := j["image"].(float64) ctx, _ := j["with_ctx"].(float64) t.Logf("opencode: total=%.0f free=%.0f image=%.0f with_ctx=%.0f", total, free, image, ctx) // ① 规模:实测 122 个模型(允许上游增减,给个合理区间) if total < 50 { t.Errorf("解析出的模型数太少(%.0f)—— 字段路径可能没对上真实结构", total) } // ② 免费判定必须有命中的(实测有若干 cost 全 0 的模型) if free == 0 { t.Error("一个免费模型都没识别出来 —— cost 判定路径可能错了") } if free >= total { t.Error("全部被标免费 —— cost 判定过于宽松") } // ③ 多模态也要有命中的(gpt-5.4 之类含 image) if image == 0 { t.Error("没识别出任何多模态模型 —— modalities 路径可能错了") } // ④ 上下文窗口要能取到(limit.context) if ctx == 0 { t.Error("没取到任何上下文窗口 —— limit 路径可能错了") } }