diff --git a/internal/lua/vm_test.go b/internal/lua/vm_test.go index 5d56486..5a9f913 100644 --- a/internal/lua/vm_test.go +++ b/internal/lua/vm_test.go @@ -135,6 +135,39 @@ func TestOpenCodeAdapterFingerprint(t *testing.T) { } } +func TestOpenCodeNormalizesRoles(t *testing.T) { + vm := NewVM(freshAdapterDir(t)) + if err := vm.Start(); err != nil { + t.Fatal(err) + } + defer vm.Stop() + // zen 上游只接受 system/user/assistant/tool/latest_reminder; + // OpenAI 系客户端发 `developer`(Claude Code 还会用 `function`)必须归一化成 system。 + body := `{"model":"x","messages":[ + {"role":"developer","content":"you are helpful"}, + {"role":"system","content":"sys"}, + {"role":"user","content":"hi"}, + {"role":"assistant","content":"ok"}, + {"role":"tool","tool_call_id":"t1","content":"{\"ok\":true}"} + ]}` + out, err := vm.Transform("opencode", "transform_request", body) + if err != nil { + t.Fatal(err) + } + if strings.Contains(out, `"developer"`) { + t.Fatalf("developer role must be normalized: %s", out) + } + if !strings.Contains(out, `"system"`) || !strings.Contains(out, `"user"`) { + t.Fatalf("allowed roles must survive: %s", out) + } + if !strings.Contains(out, `"assistant"`) { + t.Fatalf("assistant role must survive: %s", out) + } + if !strings.Contains(out, `"tool"`) { + t.Fatalf("tool role must survive: %s", out) + } +} + func TestOpenCodeStripsMultiModalParts(t *testing.T) { vm := NewVM(freshAdapterDir(t)) if err := vm.Start(); err != nil {