From 7da226c3fe90767b2a5735eb2d8cf2eddfa425e7 Mon Sep 17 00:00:00 2001 From: xumingyang21 <1926207361@qq.com> Date: Mon, 8 Dec 2025 20:15:10 +0800 Subject: [PATCH] api --- AI4SE-survey/api/QUICK_START.md | 163 ++++++++++++++++++++++ AI4SE-survey/api/main.py | 1 + AI4SE-survey/api/schemas/tool.py | 7 +- AI4SE-survey/api/services/tool_service.py | 6 +- 4 files changed, 172 insertions(+), 5 deletions(-) create mode 100644 AI4SE-survey/api/QUICK_START.md diff --git a/AI4SE-survey/api/QUICK_START.md b/AI4SE-survey/api/QUICK_START.md new file mode 100644 index 0000000..ed75488 --- /dev/null +++ b/AI4SE-survey/api/QUICK_START.md @@ -0,0 +1,163 @@ +# API 快速启动指南 + +## ✅ 当前状态 + +API已经可以运行!依赖已安装,代码结构完整。 + +## 🚀 运行方式 + +### 方式1:使用 run.py(推荐) + +```bash +python run.py +``` + +### 方式2:使用 start_api.py(带详细输出) + +```bash +python start_api.py +``` + +### 方式3:直接使用 uvicorn + +```bash +python -m uvicorn api.main:app --host 0.0.0.0 --port 8000 --reload +``` + +## 📍 访问地址 + +启动成功后,可以通过以下地址访问: + +- **Swagger UI(交互式API文档)**: http://localhost:8000/docs +- **ReDoc(API文档)**: http://localhost:8000/redoc +- **健康检查**: http://localhost:8000/health +- **API根路径**: http://localhost:8000/ + +## 🔍 验证API是否运行 + +### 方法1:检查端口 + +```bash +# Windows PowerShell +netstat -ano | findstr :8000 + +# 或使用 +Get-NetTCPConnection -LocalPort 8000 +``` + +### 方法2:访问健康检查接口 + +在浏览器中打开:http://localhost:8000/health + +应该返回: +```json +{"status": "healthy"} +``` + +### 方法3:使用curl测试 + +```bash +# Windows PowerShell +Invoke-WebRequest -Uri http://localhost:8000/health + +# 或使用curl(如果已安装) +curl http://localhost:8000/health +``` + +## 📋 API功能 + +### 已实现的功能 + +✅ **工具信息管理** +- 获取工具列表:`GET /api/tools/` +- 获取工具详情:`GET /api/tools/{tool_id}` +- 工具搜索和筛选 +- 获取工具分类和类型 + +✅ **测试任务管理** +- 获取所有测试任务:`GET /api/test-tasks/` +- 获取任务详情:`GET /api/test-tasks/{task_type}` + +✅ **测试结果管理** +- 获取测试结果列表:`GET /api/test-results/` +- 获取测试结果详情:`GET /api/test-results/{result_id}` +- 创建测试结果:`POST /api/test-results/` +- 更新测试结果:`PUT /api/test-results/{result_id}` +- 删除测试结果:`DELETE /api/test-results/{result_id}` + +## ⚠️ 注意事项 + +### 1. Pydantic警告 + +启动时可能会看到以下警告(不影响运行): +``` +Field "model_base" has conflict with protected namespace "model_". +Field "model_version" has conflict with protected namespace "model_". +``` + +这是Pydantic的警告,不影响功能。如需消除警告,可以在相关schema中添加: +```python +model_config = ConfigDict(protected_namespaces=()) +``` + +### 2. 路径问题 + +如果遇到模块导入错误,确保: +- 在项目根目录(AI4SE-survey)运行 +- Python路径包含项目根目录 + +### 3. 端口占用 + +如果8000端口被占用,可以修改端口: +```python +# 在 run.py 或 start_api.py 中修改 +uvicorn.run(..., port=8001) # 改为其他端口 +``` + +## 🐛 常见问题 + +### 问题1:ModuleNotFoundError: No module named 'api' + +**解决方案**: +1. 确保在项目根目录(AI4SE-survey)运行 +2. 检查Python路径: + ```python + import sys + print(sys.path) + ``` + +### 问题2:端口已被占用 + +**解决方案**: +1. 查找占用端口的进程: + ```bash + netstat -ano | findstr :8000 + ``` +2. 结束进程或修改端口 + +### 问题3:依赖未安装 + +**解决方案**: +```bash +pip install -r requirements.txt +``` + +## 📝 下一步 + +1. **访问API文档**:打开 http://localhost:8000/docs 查看所有接口 +2. **测试接口**:在Swagger UI中直接测试各个接口 +3. **查看工具数据**:访问 `/api/tools/` 查看工具列表 +4. **查看测试任务**:访问 `/api/test-tasks/` 查看测试任务 + +## 🔗 相关文档 + +- [API详细文档](./README.md) +- [项目README](../README.md) + +--- + +**提示**:如果遇到任何问题,请检查: +1. 依赖是否已安装:`pip list | findstr fastapi` +2. 代码是否有语法错误:`python -c "from api.main import app"` +3. 端口是否被占用:`netstat -ano | findstr :8000` + diff --git a/AI4SE-survey/api/main.py b/AI4SE-survey/api/main.py index 8333286..d84048f 100644 --- a/AI4SE-survey/api/main.py +++ b/AI4SE-survey/api/main.py @@ -15,6 +15,7 @@ app = FastAPI( version=__version__, docs_url="/docs", redoc_url="/redoc", + openapi_url="/openapi.json", # 明确指定OpenAPI JSON路径 ) diff --git a/AI4SE-survey/api/schemas/tool.py b/AI4SE-survey/api/schemas/tool.py index 8a228c2..5380213 100644 --- a/AI4SE-survey/api/schemas/tool.py +++ b/AI4SE-survey/api/schemas/tool.py @@ -4,7 +4,7 @@ from datetime import datetime from typing import List, Optional, Dict, Any from enum import Enum -from pydantic import BaseModel, Field, HttpUrl +from pydantic import BaseModel, Field, HttpUrl, ConfigDict class ToolType(str, Enum): @@ -75,6 +75,9 @@ class WebsiteInfo(BaseModel): class ToolBase(BaseModel): """工具基础模型""" + # 禁用受保护命名空间检查,允许使用 model_ 开头的字段名 + model_config = ConfigDict(protected_namespaces=()) + name: str = Field(..., description="工具名称") type: ToolType = Field(..., description="工具类型") category: str = Field(..., description="工具分类") @@ -82,7 +85,7 @@ class ToolBase(BaseModel): website: Optional[WebsiteInfo] = None pricing: Optional[PricingInfo] = None model_base: Optional[str] = Field(None, description="底层模型,如GPT-4、CodeLlama等") - model_version: Optional[str] = None + model_version: Optional[str] = Field(None, description="模型版本") language_support: Optional[LanguageSupport] = None deployment: Optional[DeploymentType] = None version: Optional[VersionInfo] = None diff --git a/AI4SE-survey/api/services/tool_service.py b/AI4SE-survey/api/services/tool_service.py index 489d26c..e731f0d 100644 --- a/AI4SE-survey/api/services/tool_service.py +++ b/AI4SE-survey/api/services/tool_service.py @@ -213,7 +213,7 @@ class ToolService: """获取所有工具""" tools = self._load_tools() - tool_list = [ToolOverview(**tool.dict()) for tool in tools.values()] + tool_list = [ToolOverview(**tool.model_dump()) for tool in tools.values()] # 应用筛选 if filter_params: @@ -239,7 +239,7 @@ class ToolService: """根据分类获取工具""" tools = self._load_tools() return [ - ToolOverview(**tool.dict()) + ToolOverview(**tool.model_dump()) for tool in tools.values() if tool.category == category ] @@ -248,7 +248,7 @@ class ToolService: """根据类型获取工具""" tools = self._load_tools() return [ - ToolOverview(**tool.dict()) + ToolOverview(**tool.model_dump()) for tool in tools.values() if tool.type == tool_type ]