mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 01:10:23 +08:00
fix(normalizer): 移除 Claude system 中的 billing header
This commit is contained in:
@@ -369,8 +369,8 @@ def test_claude_request_metadata_preserved() -> None:
|
||||
assert out["metadata"]["user_id"] == "user_abc123_session_xyz456"
|
||||
|
||||
|
||||
def test_claude_system_array_format() -> None:
|
||||
"""测试 Claude CLI 风格的 system 数组格式"""
|
||||
def test_claude_system_array_format_drops_billing_header() -> None:
|
||||
"""Claude system 数组中的 Anthropic billing header 不应进入内部 instructions。"""
|
||||
n = ClaudeNormalizer()
|
||||
|
||||
req = {
|
||||
@@ -386,12 +386,51 @@ def test_claude_system_array_format() -> None:
|
||||
|
||||
internal = n.request_to_internal(req)
|
||||
|
||||
# system 数组中的多个 text 应该用 \n\n 连接
|
||||
# billing header 应被移除,其余 system 文本仍按顺序保留
|
||||
assert internal.system is not None
|
||||
assert "x-anthropic-billing-header" in internal.system
|
||||
assert "x-anthropic-billing-header" not in internal.system
|
||||
assert "You are Claude Code" in internal.system
|
||||
assert "Extract file paths" in internal.system
|
||||
assert "\n\n" in internal.system
|
||||
assert internal.extra["raw"]["dropped_blocks"]["claude_system_billing_header_removed"] == 1
|
||||
|
||||
|
||||
def test_claude_system_string_strips_billing_header_and_keeps_following_prompt() -> None:
|
||||
n = ClaudeNormalizer()
|
||||
|
||||
req = {
|
||||
"model": "claude-3-opus",
|
||||
"messages": [{"role": "user", "content": "hello"}],
|
||||
"system": "x-anthropic-billing-header: cc_version=2.1.19\n\nYou are Claude Code.\nKeep answers terse.",
|
||||
"max_tokens": 4096,
|
||||
}
|
||||
|
||||
internal = n.request_to_internal(req)
|
||||
|
||||
assert internal.system == "You are Claude Code.\nKeep answers terse."
|
||||
assert internal.extra["raw"]["dropped_blocks"]["claude_system_billing_header_removed"] == 1
|
||||
|
||||
|
||||
def test_claude_system_array_strips_billing_header_prefix_but_keeps_same_block_prompt() -> None:
|
||||
n = ClaudeNormalizer()
|
||||
|
||||
req = {
|
||||
"model": "claude-3-opus",
|
||||
"messages": [{"role": "user", "content": "hello"}],
|
||||
"system": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "x-anthropic-billing-header: cc_version=2.1.19\n\nYou are Claude Code.",
|
||||
},
|
||||
{"type": "text", "text": "Extract file paths."},
|
||||
],
|
||||
"max_tokens": 4096,
|
||||
}
|
||||
|
||||
internal = n.request_to_internal(req)
|
||||
|
||||
assert internal.system == "You are Claude Code.\n\nExtract file paths."
|
||||
assert internal.extra["raw"]["dropped_blocks"]["claude_system_billing_header_removed"] == 1
|
||||
|
||||
|
||||
def test_claude_request_reuses_raw_tool_choice_and_stabilizes_message_sequence() -> None:
|
||||
|
||||
@@ -71,6 +71,67 @@ def test_claude_request_to_openai_cli_places_instructions_before_input() -> None
|
||||
assert openai_cli_req["input"][0]["role"] == "user"
|
||||
|
||||
|
||||
def test_claude_request_to_openai_cli_drops_anthropic_billing_header() -> None:
|
||||
reg = _make_registry_with_cli()
|
||||
|
||||
claude_req = {
|
||||
"model": "claude-3-5-sonnet-latest",
|
||||
"system": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "x-anthropic-billing-header: cc_version=2.1.74.705; cc_entrypoint=claude-vscode; cch=4fb9f;",
|
||||
},
|
||||
{"type": "text", "text": "You are Claude Code."},
|
||||
{"type": "text", "text": "Keep answers terse."},
|
||||
],
|
||||
"messages": [{"role": "user", "content": "hi"}],
|
||||
"max_tokens": 12,
|
||||
}
|
||||
|
||||
openai_cli_req = reg.convert_request(claude_req, "claude:chat", "openai:cli")
|
||||
|
||||
assert openai_cli_req["instructions"] == "You are Claude Code.\n\nKeep answers terse."
|
||||
assert "x-anthropic-billing-header" not in openai_cli_req["instructions"]
|
||||
|
||||
|
||||
def test_claude_request_to_openai_cli_keeps_prompt_after_billing_header_prefix() -> None:
|
||||
reg = _make_registry_with_cli()
|
||||
|
||||
claude_req = {
|
||||
"model": "claude-3-5-sonnet-latest",
|
||||
"system": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "x-anthropic-billing-header: cc_version=2.1.74.705\n\nYou are Claude Code.",
|
||||
},
|
||||
{"type": "text", "text": "Keep answers terse."},
|
||||
],
|
||||
"messages": [{"role": "user", "content": "hi"}],
|
||||
"max_tokens": 12,
|
||||
}
|
||||
|
||||
openai_cli_req = reg.convert_request(claude_req, "claude:chat", "openai:cli")
|
||||
|
||||
assert openai_cli_req["instructions"] == "You are Claude Code.\n\nKeep answers terse."
|
||||
assert "x-anthropic-billing-header" not in openai_cli_req["instructions"]
|
||||
|
||||
|
||||
def test_claude_request_to_openai_cli_strips_billing_header_from_string_system() -> None:
|
||||
reg = _make_registry_with_cli()
|
||||
|
||||
claude_req = {
|
||||
"model": "claude-3-5-sonnet-latest",
|
||||
"system": "x-anthropic-billing-header: cc_version=2.1.74.705\n\nYou are Claude Code.\nKeep answers terse.",
|
||||
"messages": [{"role": "user", "content": "hi"}],
|
||||
"max_tokens": 12,
|
||||
}
|
||||
|
||||
openai_cli_req = reg.convert_request(claude_req, "claude:chat", "openai:cli")
|
||||
|
||||
assert openai_cli_req["instructions"] == "You are Claude Code.\nKeep answers terse."
|
||||
assert "x-anthropic-billing-header" not in openai_cli_req["instructions"]
|
||||
|
||||
|
||||
def test_claude_response_to_openai_cli() -> None:
|
||||
reg = _make_registry_with_cli()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user