205 lines
7.1 KiB
Python
205 lines
7.1 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
测试Cloudflare网关的Gemini API
|
||
使用用户提供的新配置
|
||
"""
|
||
|
||
import requests
|
||
import json
|
||
import logging
|
||
|
||
# 配置日志
|
||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||
logger = logging.getLogger(__name__)
|
||
|
||
def test_cloudflare_gemini():
|
||
"""测试Cloudflare网关的Gemini API"""
|
||
|
||
# 用户提供的新配置
|
||
API_KEY = "AIzaSyAQ2TXFAzmTKm4aFqgrjkhjgsp95bDsAyE"
|
||
BASE_URL = "https://gateway.ai.cloudflare.com/v1/e167cb36a5b95cb3cc8daf77a3f7d0b3/default/google-ai-studio"
|
||
MODEL = "models/gemini-2.5-pro"
|
||
|
||
logger.info(f"🧪 测试Cloudflare Gemini配置:")
|
||
logger.info(f"📡 BASE_URL: {BASE_URL}")
|
||
logger.info(f"🔑 API_KEY: {API_KEY[:10]}...")
|
||
logger.info(f"🤖 MODEL: {MODEL}")
|
||
|
||
# 构建请求
|
||
url = f"{BASE_URL}/v1beta/{MODEL}:generateContent"
|
||
|
||
headers = {
|
||
"Content-Type": "application/json",
|
||
"x-goog-api-key": API_KEY
|
||
}
|
||
|
||
payload = {
|
||
"contents": [
|
||
{
|
||
"parts": [
|
||
{
|
||
"text": "你好,请简单介绍一下你自己"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"generationConfig": {
|
||
"maxOutputTokens": 1000,
|
||
"temperature": 0.7
|
||
}
|
||
}
|
||
|
||
try:
|
||
logger.info("🚀 发送请求到Cloudflare网关...")
|
||
logger.info(f"📍 请求URL: {url}")
|
||
|
||
response = requests.post(
|
||
url,
|
||
json=payload,
|
||
headers=headers,
|
||
timeout=60
|
||
)
|
||
|
||
logger.info(f"📊 状态码: {response.status_code}")
|
||
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
logger.info(f"✅ 请求成功!")
|
||
logger.info(f"📋 完整响应: {json.dumps(result, ensure_ascii=False, indent=2)}")
|
||
|
||
# 提取内容
|
||
if 'candidates' in result and len(result['candidates']) > 0:
|
||
candidate = result['candidates'][0]
|
||
if 'content' in candidate and 'parts' in candidate['content']:
|
||
content = candidate['content']['parts'][0].get('text', '')
|
||
logger.info(f"🗣️ Gemini回应: {content}")
|
||
return True, content
|
||
|
||
return True, "响应格式异常"
|
||
|
||
else:
|
||
logger.error(f"❌ 请求失败: {response.status_code}")
|
||
logger.error(f"📋 错误响应: {response.text}")
|
||
return False, response.text
|
||
|
||
except requests.exceptions.Timeout:
|
||
logger.error(f"⏰ 请求超时 (60秒)")
|
||
return False, "请求超时"
|
||
except requests.exceptions.ConnectionError as e:
|
||
logger.error(f"🔌 连接错误: {e}")
|
||
return False, str(e)
|
||
except Exception as e:
|
||
logger.error(f"💥 未知错误: {e}")
|
||
return False, str(e)
|
||
|
||
def test_gemini_breakdown():
|
||
"""测试Gemini的问题分解能力"""
|
||
|
||
API_KEY = "AIzaSyAQ2TXFAzmTKm4aFqgrjkhjgsp95bDsAyE"
|
||
BASE_URL = "https://gateway.ai.cloudflare.com/v1/e167cb36a5b95cb3cc8daf77a3f7d0b3/default/google-ai-studio"
|
||
MODEL = "models/gemini-2.5-pro"
|
||
|
||
url = f"{BASE_URL}/v1beta/{MODEL}:generateContent"
|
||
|
||
headers = {
|
||
"Content-Type": "application/json",
|
||
"x-goog-api-key": API_KEY
|
||
}
|
||
|
||
topic = "工作量证明vs无限制爬虫:从李时珍采药到AI数据获取的激励机制变革"
|
||
|
||
payload = {
|
||
"contents": [
|
||
{
|
||
"parts": [
|
||
{
|
||
"text": f"你是太上老君,负责将复杂问题分解为多个子问题。请将以下问题分解为3-5个子问题,以JSON格式返回:\n\n{topic}\n\n返回格式:{{\"subtopics\": [{{\"title\": \"子问题标题\", \"description\": \"详细描述\"}}]}}"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"generationConfig": {
|
||
"maxOutputTokens": 2000,
|
||
"temperature": 0.7
|
||
}
|
||
}
|
||
|
||
try:
|
||
logger.info("🧠 测试Gemini问题分解能力...")
|
||
|
||
response = requests.post(
|
||
url,
|
||
json=payload,
|
||
headers=headers,
|
||
timeout=60
|
||
)
|
||
|
||
logger.info(f"📊 状态码: {response.status_code}")
|
||
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
logger.info(f"✅ 分解测试成功!")
|
||
|
||
# 提取内容
|
||
if 'candidates' in result and len(result['candidates']) > 0:
|
||
candidate = result['candidates'][0]
|
||
if 'content' in candidate and 'parts' in candidate['content']:
|
||
content = candidate['content']['parts'][0].get('text', '')
|
||
logger.info(f"📋 分解结果:\n{content}")
|
||
|
||
# 尝试解析JSON
|
||
try:
|
||
# 提取JSON部分
|
||
if '```json' in content:
|
||
json_start = content.find('```json') + 7
|
||
json_end = content.find('```', json_start)
|
||
json_content = content[json_start:json_end].strip()
|
||
elif '{' in content and '}' in content:
|
||
json_start = content.find('{')
|
||
json_end = content.rfind('}') + 1
|
||
json_content = content[json_start:json_end]
|
||
else:
|
||
json_content = content
|
||
|
||
parsed_json = json.loads(json_content)
|
||
logger.info(f"🎯 JSON解析成功: {json.dumps(parsed_json, ensure_ascii=False, indent=2)}")
|
||
return True, parsed_json
|
||
|
||
except json.JSONDecodeError as e:
|
||
logger.warning(f"⚠️ JSON解析失败: {e}")
|
||
logger.warning(f"📝 原始内容: {content}")
|
||
return True, content
|
||
|
||
return True, "响应格式异常"
|
||
|
||
else:
|
||
logger.error(f"❌ 分解测试失败: {response.status_code}")
|
||
logger.error(f"📋 错误响应: {response.text}")
|
||
return False, response.text
|
||
|
||
except Exception as e:
|
||
logger.error(f"💥 分解测试错误: {e}")
|
||
return False, str(e)
|
||
|
||
if __name__ == "__main__":
|
||
logger.info("🎯 开始Cloudflare Gemini API测试")
|
||
|
||
# 基础连接测试
|
||
success1, result1 = test_cloudflare_gemini()
|
||
|
||
if success1:
|
||
logger.info("🎉 基础测试通过!")
|
||
|
||
# 问题分解测试
|
||
success2, result2 = test_gemini_breakdown()
|
||
|
||
if success2:
|
||
logger.info("🎉 所有测试通过!Gemini API工作正常")
|
||
logger.info("✅ 可以安全运行完整的循环赛系统")
|
||
else:
|
||
logger.error("💀 问题分解测试失败")
|
||
else:
|
||
logger.error("💀 基础连接测试失败")
|
||
|
||
logger.info("🏁 测试完成") |