Spaces:
Running
Running
| #!/usr/bin/env python3 | |
| """ | |
| 尝试获取 Amazon Q API 支持的所有模型 | |
| """ | |
| import requests | |
| import json | |
| import re | |
| from typing import List, Dict, Optional | |
| BASE_URL = "http://localhost:8000" | |
| def try_models_endpoint(): | |
| """尝试调用 /v1/models 端点(如果存在)""" | |
| try: | |
| response = requests.get(f"{BASE_URL}/v1/models", timeout=10) | |
| if response.status_code == 200: | |
| data = response.json() | |
| print("✅ 发现 /v1/models 端点") | |
| return data | |
| else: | |
| print(f"❌ /v1/models 端点返回: {response.status_code}") | |
| return None | |
| except Exception as e: | |
| print(f"❌ /v1/models 端点异常: {e}") | |
| return None | |
| def extract_model_from_error(error_text: str) -> List[str]: | |
| """从错误信息中提取可能的模型名称""" | |
| models = [] | |
| # 常见的模型名称模式 | |
| patterns = [ | |
| r'claude-[\w\.-]+', | |
| r'anthropic\.[\w\.-]+', | |
| r'model\s+["\']?([a-zA-Z0-9_\.-]+)["\']?', | |
| r'available\s+models?[:\s]+([^\n\r]+)', | |
| r'supported\s+models?[:\s]+([^\n\r]+)', | |
| ] | |
| for pattern in patterns: | |
| matches = re.findall(pattern, error_text, re.IGNORECASE) | |
| models.extend(matches) | |
| return list(set(models)) # 去重 | |
| def try_common_amazon_q_models() -> List[str]: | |
| """尝试 Amazon Q 可能支持的其他模型名称""" | |
| # 基于 AWS Bedrock 和 Amazon Q 的常见模型命名 | |
| amazon_q_models = [ | |
| # Claude 模型 (AWS Bedrock 格式) | |
| "anthropic.claude-v2:1", | |
| "anthropic.claude-v2", | |
| "anthropic.claude-instant-v1", | |
| "anthropic.claude-3-sonnet-20240229-v1:0", | |
| "anthropic.claude-3-sonnet-20240229-v1", | |
| "anthropic.claude-3-haiku-20240307-v1:0", | |
| "anthropic.claude-3-haiku-20240307-v1", | |
| "anthropic.claude-3-opus-20240229-v1:0", | |
| "anthropic.claude-3-opus-20240229-v1", | |
| # Amazon Q 特定模型 | |
| "amazon.q", | |
| "amazon.q-turbo", | |
| "amazon.q-pro", | |
| "amazon.q-max", | |
| "q.amazon", | |
| "q-turbo.amazon", | |
| "q-pro.amazon", | |
| "q-max.amazon", | |
| # 其他可能的命名 | |
| "claude", | |
| "claude-v2", | |
| "claude-instant", | |
| "claude-3-sonnet", | |
| "claude-3-haiku", | |
| "claude-3-opus", | |
| "sonnet", | |
| "haiku", | |
| "opus", | |
| # 通用模型名 | |
| "default", | |
| "base", | |
| "latest", | |
| "text-davinci-003", # 测试是否支持OpenAI模型名 | |
| "gpt-3.5-turbo", | |
| "gpt-4", | |
| ] | |
| return amazon_q_models | |
| def test_model_with_details(model_name: str) -> Dict[str, any]: | |
| """详细测试单个模型""" | |
| url = f"{BASE_URL}/v1/chat/completions" | |
| payload = { | |
| "model": model_name, | |
| "messages": [ | |
| {"role": "user", "content": "test"} | |
| ], | |
| "stream": False, | |
| "max_tokens": 5 | |
| } | |
| try: | |
| response = requests.post(url, json=payload, timeout=15) | |
| result = { | |
| "model": model_name, | |
| "status_code": response.status_code, | |
| "available": response.status_code == 200, | |
| "error": None, | |
| "error_details": None | |
| } | |
| if response.status_code != 200: | |
| result["error"] = response.text[:300] | |
| # 尝试从错误中提取模型信息 | |
| extracted_models = extract_model_from_error(response.text) | |
| if extracted_models: | |
| result["extracted_models"] = extracted_models | |
| return result | |
| except Exception as e: | |
| return { | |
| "model": model_name, | |
| "status_code": None, | |
| "available": False, | |
| "error": str(e), | |
| "error_details": None | |
| } | |
| def comprehensive_model_search(): | |
| """全面搜索可用模型""" | |
| print("🔍 全面搜索 Amazon Q API 支持的模型") | |
| print("=" * 60) | |
| # 1. 尝试标准 models 端点 | |
| print("\n1️⃣ 尝试标准 /v1/models 端点...") | |
| models_data = try_models_endpoint() | |
| if models_data: | |
| print("发现模型列表:") | |
| if isinstance(models_data, dict) and "data" in models_data: | |
| for model in models_data["data"]: | |
| print(f" • {model.get('id', 'unknown')}") | |
| elif isinstance(models_data, list): | |
| for model in models_data: | |
| if isinstance(model, dict): | |
| print(f" • {model.get('id', model.get('model', 'unknown'))}") | |
| else: | |
| print(f" • {model}") | |
| return models_data | |
| # 2. 测试更多模型名称 | |
| print("\n2️⃣ 测试扩展的模型名称列表...") | |
| additional_models = try_common_amazon_q_models() | |
| print(f"测试 {len(additional_models)} 个额外的模型名称...") | |
| available_models = [] | |
| error_models = [] | |
| extracted_from_errors = set() | |
| for i, model in enumerate(additional_models, 1): | |
| print(f"[{i}/{len(additional_models)}] {model}...", end=" ") | |
| result = test_model_with_details(model) | |
| if result["available"]: | |
| print("✅") | |
| available_models.append(model) | |
| else: | |
| print("❌") | |
| error_models.append((model, result["error"])) | |
| # 从错误中提取模型信息 | |
| if "extracted_models" in result: | |
| extracted_from_errors.update(result["extracted_models"]) | |
| # 避免请求过快 | |
| import time | |
| time.sleep(0.3) | |
| # 3. 输出结果 | |
| print("\n" + "=" * 60) | |
| print("📊 搜索结果") | |
| print("=" * 60) | |
| if available_models: | |
| print(f"\n✅ 发现可用模型 ({len(available_models)} 个):") | |
| for model in available_models: | |
| print(f" • {model}") | |
| else: | |
| print("\n❌ 没有发现新的可用模型") | |
| if extracted_from_errors: | |
| print(f"\n🔍 从错误信息中提取的可能模型 ({len(extracted_from_errors)} 个):") | |
| for model in sorted(extracted_from_errors): | |
| print(f" • {model}") | |
| # 4. 保存结果 | |
| search_results = { | |
| "available_models": available_models, | |
| "error_models": [{"model": m, "error": e} for m, e in error_models[:10]], # 只保存前10个错误 | |
| "extracted_from_errors": list(extracted_from_errors), | |
| "timestamp": str(time.time()) | |
| } | |
| with open("model_search_results.json", "w", encoding="utf-8") as f: | |
| json.dump(search_results, f, ensure_ascii=False, indent=2) | |
| print(f"\n📁 详细结果已保存到: model_search_results.json") | |
| return search_results | |
| def inspect_api_info(): | |
| """检查API的其他信息端点""" | |
| endpoints_to_try = [ | |
| "/", | |
| "/docs", | |
| "/openapi.json", | |
| "/info", | |
| "/v1", | |
| "/status", | |
| "/health" | |
| ] | |
| print("\n🔍 检查API信息端点...") | |
| for endpoint in endpoints_to_try: | |
| try: | |
| response = requests.get(f"{BASE_URL}{endpoint}", timeout=5) | |
| if response.status_code == 200: | |
| print(f"✅ {endpoint} - 可访问") | |
| # 检查是否包含模型信息 | |
| content = response.text.lower() | |
| if any(keyword in content for keyword in ["model", "claude", "anthropic"]): | |
| print(f" 📄 可能包含模型相关信息") | |
| else: | |
| print(f"❌ {endpoint} - {response.status_code}") | |
| except: | |
| print(f"❌ {endpoint} - 连接失败") | |
| if __name__ == "__main__": | |
| import time | |
| # 检查API信息端点 | |
| inspect_api_info() | |
| # 全面模型搜索 | |
| comprehensive_model_search() | |
| print("\n✨ 搜索完成!") | |