package lua import ( "strings" "testing" ) // 临时复现:内核发出的 assistant(content=null)+tool_calls 形状, // 经 anthropic.lua 转换后 content 是否变成对象 {}(上游期望数组)。 func TestZZReproAnthropicEmptyBlocks(t *testing.T) { vm := NewVM(freshAdapterDir(t)) if err := vm.Start(); err != nil { t.Fatal(err) } defer vm.Stop() cases := map[string]string{ "assistant content=null + tool_calls": `{"model":"x","messages":[{"role":"user","content":"hi"},{"role":"assistant","content":null,"tool_calls":[{"id":"c1","type":"function","function":{"name":"f","arguments":"{}"}}]},{"role":"tool","tool_call_id":"c1","content":"ok"}]}`, "assistant content=空串 + tool_calls": `{"model":"x","messages":[{"role":"user","content":"hi"},{"role":"assistant","content":"","tool_calls":[{"id":"c1","type":"function","function":{"name":"f","arguments":"{}"}}]},{"role":"tool","tool_call_id":"c1","content":"ok"}]}`, "仅 system": `{"model":"x","messages":[{"role":"system","content":"s"}]}`, } for name, body := range cases { out, err := vm.Transform("anthropic", "transform_request", body) if err != nil { t.Fatalf("%s: %v", name, err) } bad := strings.Contains(out, `"content":{}`) t.Logf("%-38s content为对象{}: %v\n out=%s", name, bad, out) } }