|
|
|
|
|
"""Manual demo for the smart model-mapping helpers.""" |
|
|
|
|
|
from __future__ import annotations |
|
|
|
|
|
import sys |
|
|
from pathlib import Path |
|
|
|
|
|
sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) |
|
|
|
|
|
from kiro_proxy.config import map_model_name, detect_model_tier, get_best_model_by_tier |
|
|
|
|
|
def test_tier_detection(): |
|
|
"""测试等级检测功能""" |
|
|
print("测试模型等级检测:") |
|
|
|
|
|
test_cases = [ |
|
|
|
|
|
("claude-4-opus", "opus"), |
|
|
("gpt-o1-preview", "opus"), |
|
|
("gemini-1.5-pro", "opus"), |
|
|
("claude-3-opus-20240229", "opus"), |
|
|
("some-premium-model", "opus"), |
|
|
|
|
|
|
|
|
("claude-3.5-sonnet", "sonnet"), |
|
|
("gpt-4o", "sonnet"), |
|
|
("gemini-2.0-flash", "sonnet"), |
|
|
("claude-4-standard", "sonnet"), |
|
|
|
|
|
|
|
|
("claude-3-haiku", "haiku"), |
|
|
("gpt-4o-mini", "haiku"), |
|
|
("gpt-3.5-turbo", "haiku"), |
|
|
("claude-haiku-fast", "haiku"), |
|
|
|
|
|
|
|
|
("unknown-model-xyz", "sonnet"), |
|
|
("", "sonnet"), |
|
|
] |
|
|
|
|
|
for model, expected in test_cases: |
|
|
result = detect_model_tier(model) |
|
|
status = "OK" if result == expected else "FAIL" |
|
|
print(f" {status} {model:<25} -> {result:<6} (期望: {expected})") |
|
|
|
|
|
def test_dynamic_mapping(): |
|
|
"""测试动态模型映射(等级对等 + 智能降级)""" |
|
|
print("\n测试动态模型映射(等级对等策略):") |
|
|
|
|
|
|
|
|
scenarios = [ |
|
|
{ |
|
|
"name": "全部可用", |
|
|
"available": {"claude-sonnet-4.5", "claude-sonnet-4", "claude-haiku-4.5", "auto"} |
|
|
}, |
|
|
{ |
|
|
"name": "缺少4.5版本", |
|
|
"available": {"claude-sonnet-4", "claude-haiku-4.5", "auto"} |
|
|
}, |
|
|
{ |
|
|
"name": "仅有Haiku", |
|
|
"available": {"claude-haiku-4.5", "auto"} |
|
|
}, |
|
|
{ |
|
|
"name": "仅有Sonnet-4", |
|
|
"available": {"claude-sonnet-4", "auto"} |
|
|
} |
|
|
] |
|
|
|
|
|
test_models = [ |
|
|
("claude-4-opus", "opus"), |
|
|
("gpt-4o", "sonnet"), |
|
|
("gpt-4o-mini", "haiku"), |
|
|
("unknown-future-model", "sonnet") |
|
|
] |
|
|
|
|
|
for scenario in scenarios: |
|
|
print(f"\n 场景: {scenario['name']}") |
|
|
print(f" 可用模型: {scenario['available']}") |
|
|
|
|
|
for model, expected_tier in test_models: |
|
|
result = map_model_name(model, scenario['available']) |
|
|
tier = detect_model_tier(model) |
|
|
print(f" {model:<20} ({tier:<6}) -> {result}") |
|
|
|
|
|
def test_tier_mapping_logic(): |
|
|
"""测试等级对等映射逻辑""" |
|
|
print("\n测试等级对等映射逻辑:") |
|
|
|
|
|
|
|
|
full_available = {"claude-sonnet-4.5", "claude-sonnet-4", "claude-haiku-4.5", "auto"} |
|
|
|
|
|
test_cases = [ |
|
|
|
|
|
("claude-4-opus", "opus", "claude-sonnet-4.5"), |
|
|
("gpt-4o", "sonnet", "claude-sonnet-4.5"), |
|
|
("gpt-4o-mini", "haiku", "claude-haiku-4.5"), |
|
|
("o1-preview", "opus", "claude-sonnet-4.5"), |
|
|
("claude-3.5-sonnet", "sonnet", "claude-sonnet-4.5"), |
|
|
("gpt-3.5-turbo", "haiku", "claude-haiku-4.5"), |
|
|
] |
|
|
|
|
|
for model, expected_tier, expected_output in test_cases: |
|
|
tier = detect_model_tier(model) |
|
|
result = map_model_name(model, full_available) |
|
|
tier_ok = "OK" if tier == expected_tier else "FAIL" |
|
|
output_ok = "OK" if result == expected_output else "FAIL" |
|
|
print(f" {tier_ok}/{output_ok} {model:<20} -> {tier:<6} -> {result}") |
|
|
if tier != expected_tier: |
|
|
print(f" 等级检测错误: 期望 {expected_tier}, 实际 {tier}") |
|
|
if result != expected_output: |
|
|
print(f" 映射错误: 期望 {expected_output}, 实际 {result}") |
|
|
|
|
|
def test_degradation_paths(): |
|
|
"""测试降级路径""" |
|
|
print("\n测试降级路径:") |
|
|
|
|
|
degradation_scenarios = [ |
|
|
{ |
|
|
"name": "Opus降级测试", |
|
|
"model": "claude-4-opus", |
|
|
"scenarios": [ |
|
|
({"claude-sonnet-4.5", "auto"}, "claude-sonnet-4.5"), |
|
|
({"claude-sonnet-4", "auto"}, "claude-sonnet-4"), |
|
|
({"claude-haiku-4.5", "auto"}, "claude-haiku-4.5"), |
|
|
({"auto"}, "auto"), |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"name": "Haiku降级测试", |
|
|
"model": "gpt-4o-mini", |
|
|
"scenarios": [ |
|
|
({"claude-haiku-4.5", "auto"}, "claude-haiku-4.5"), |
|
|
({"claude-sonnet-4", "auto"}, "claude-sonnet-4"), |
|
|
({"claude-sonnet-4.5", "auto"}, "claude-sonnet-4.5"), |
|
|
({"auto"}, "auto"), |
|
|
] |
|
|
} |
|
|
] |
|
|
|
|
|
for test_group in degradation_scenarios: |
|
|
print(f"\n {test_group['name']}:") |
|
|
model = test_group['model'] |
|
|
tier = detect_model_tier(model) |
|
|
|
|
|
for available, expected in test_group['scenarios']: |
|
|
result = map_model_name(model, available) |
|
|
status = "OK" if result == expected else "FAIL" |
|
|
print(f" {status} 可用:{available} -> {result} (期望:{expected})") |
|
|
|
|
|
def test_backward_compatibility(): |
|
|
"""测试向后兼容性""" |
|
|
print("\n测试向后兼容性:") |
|
|
|
|
|
|
|
|
legacy_tests = [ |
|
|
("gpt-4o", "claude-sonnet-4"), |
|
|
("claude-3-5-sonnet-20241022", "claude-sonnet-4"), |
|
|
("o1-preview", "claude-sonnet-4.5"), |
|
|
("gemini-1.5-pro", "claude-sonnet-4.5"), |
|
|
] |
|
|
|
|
|
for model, expected in legacy_tests: |
|
|
result = map_model_name(model) |
|
|
status = "OK" if result == expected else "FAIL" |
|
|
print(f" {status} {model:<25} -> {result:<20} (期望: {expected})") |
|
|
|
|
|
def test_edge_cases(): |
|
|
"""测试边界情况""" |
|
|
print("\n测试边界情况:") |
|
|
|
|
|
edge_cases = [ |
|
|
("", "auto"), |
|
|
(None, "auto"), |
|
|
("CLAUDE-4-OPUS", "claude-sonnet-4.5"), |
|
|
("gpt-4o-MINI-turbo", "claude-haiku-4.5"), |
|
|
("claude_sonnet_4", "claude-sonnet-4"), |
|
|
] |
|
|
|
|
|
for model, expected in edge_cases: |
|
|
try: |
|
|
result = map_model_name(model or "") |
|
|
tier = detect_model_tier(model or "") |
|
|
status = "OK" if result == expected else "FAIL" |
|
|
print(f" {status} {str(model):<25} ({tier}) -> {result}") |
|
|
except Exception as e: |
|
|
print(f" ERROR {str(model):<25} -> 错误: {e}") |
|
|
|
|
|
if __name__ == "__main__": |
|
|
print("KiroProxy 智能模型映射测试(等级对等策略)\n") |
|
|
|
|
|
test_tier_detection() |
|
|
test_tier_mapping_logic() |
|
|
test_degradation_paths() |
|
|
test_dynamic_mapping() |
|
|
test_backward_compatibility() |
|
|
test_edge_cases() |
|
|
|
|
|
print("\n测试完成!") |
|
|
|