#!/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()