File size: 5,836 Bytes
f12ea8b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#!/usr/bin/env python3
"""
测试 Amazon Q API 可用模型的脚本
"""

import requests
import json
import time
from typing import List, Dict, Optional

# API 配置
BASE_URL = "http://localhost:8000"
API_KEY = ""  # 根据你的 .env 配置设置,如果为空则使用开发模式

# 常见的 Claude 模型列表(基于 Amazon Q 可能支持的模型)
TEST_MODELS = [
    "claude-sonnet-4",
    "claude-sonnet-3.5", 
    "claude-haiku-3.5",
    "claude-opus-3",
    "claude-sonnet-3",
    "claude-haiku-3",
    "claude-instant-1.2",
    "anthropic.claude-3-sonnet-20240229-v1:0",
    "anthropic.claude-3-haiku-20240307-v1:0",
    "anthropic.claude-3-opus-20240229-v1:0",
]

def test_model(model_name: str, api_key: str = "") -> Dict[str, any]:
    """测试单个模型是否可用"""
    url = f"{BASE_URL}/v1/chat/completions"
    
    headers = {
        "Content-Type": "application/json",
    }
    
    if api_key:
        headers["Authorization"] = f"Bearer {api_key}"
    
    payload = {
        "model": model_name,
        "messages": [
            {"role": "user", "content": "请简单回复:你好"}
        ],
        "stream": False,
        "max_tokens": 10
    }
    
    try:
        response = requests.post(url, headers=headers, json=payload, timeout=30)
        
        result = {
            "model": model_name,
            "status_code": response.status_code,
            "available": response.status_code == 200,
            "error": None,
            "response_preview": None
        }
        
        if response.status_code == 200:
            try:
                data = response.json()
                content = data.get("choices", [{}])[0].get("message", {}).get("content", "")
                result["response_preview"] = content[:100]  # 只显示前100个字符
            except:
                result["response_preview"] = "解析响应失败"
        else:
            result["error"] = response.text[:200]  # 只显示前200个字符的错误信息
            
    except requests.exceptions.Timeout:
        result = {
            "model": model_name,
            "status_code": None,
            "available": False,
            "error": "请求超时",
            "response_preview": None
        }
    except Exception as e:
        result = {
            "model": model_name,
            "status_code": None,
            "available": False,
            "error": str(e)[:200],
            "response_preview": None
        }
    
    return result

def check_api_health() -> bool:
    """检查 API 服务是否健康"""
    try:
        response = requests.get(f"{BASE_URL}/healthz", timeout=10)
        return response.status_code == 200
    except:
        return False

def check_accounts() -> bool:
    """检查是否有可用账号"""
    try:
        headers = {"Authorization": f"Bearer {API_KEY}"} if API_KEY else {}
        response = requests.get(f"{BASE_URL}/v2/accounts", headers=headers, timeout=10)
        if response.status_code == 200:
            accounts = response.json()
            enabled_accounts = [acc for acc in accounts if acc.get("enabled", False)]
            return len(enabled_accounts) > 0
        return False
    except:
        return False

def main():
    """主函数"""
    print("🔍 Amazon Q API 模型测试脚本")
    print("=" * 50)
    
    # 检查 API 服务状态
    print("📡 检查 API 服务状态...")
    if not check_api_health():
        print("❌ API 服务不可用,请确保服务正在运行在 http://localhost:8000")
        return
    
    print("✅ API 服务正常")
    
    # 检查账号状态
    print("👤 检查可用账号...")
    if not check_accounts():
        print("❌ 没有可用的账号,请先添加并启用 Amazon Q 账号")
        return
    
    print("✅ 发现可用账号")
    
    # 测试模型
    print(f"\n🧪 开始测试 {len(TEST_MODELS)} 个模型...")
    print("-" * 80)
    
    available_models = []
    failed_models = []
    
    for i, model in enumerate(TEST_MODELS, 1):
        print(f"[{i}/{len(TEST_MODELS)}] 测试: {model}...", end=" ")
        
        result = test_model(model, API_KEY)
        
        if result["available"]:
            print("✅ 可用")
            available_models.append(model)
            if result["response_preview"]:
                print(f"    响应预览: {result['response_preview']}")
        else:
            print("❌ 不可用")
            failed_models.append((model, result["error"]))
        
        # 避免请求过于频繁
        time.sleep(0.5)
    
    # 输出结果总结
    print("\n" + "=" * 80)
    print("📊 测试结果总结")
    print("=" * 80)
    
    if available_models:
        print(f"\n✅ 可用模型 ({len(available_models)} 个):")
        for model in available_models:
            print(f"  • {model}")
    else:
        print("\n❌ 没有发现可用的模型")
    
    if failed_models:
        print(f"\n❌ 不可用模型 ({len(failed_models)} 个):")
        for model, error in failed_models[:5]:  # 只显示前5个错误
            print(f"  • {model}: {error}")
        if len(failed_models) > 5:
            print(f"  ... 还有 {len(failed_models) - 5} 个模型不可用")
    
    # 生成配置建议
    if available_models:
        print(f"\n💡 建议配置:")
        print(f"推荐使用: {available_models[0]}")
        print(f"在代码中使用: model = \"{available_models[0]}\"")
        
        # 保存可用模型到文件
        with open("available_models.txt", "w", encoding="utf-8") as f:
            f.write("可用模型列表:\n")
            for model in available_models:
                f.write(f"{model}\n")
        print(f"📁 可用模型已保存到: available_models.txt")

if __name__ == "__main__":
    main()