amazonq2api / discover_models.py
liuzhao521
Update app.py and add model discovery tools
f12ea8b
#!/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✨ 搜索完成!")