This commit is contained in:
xumingyang21 2025-12-08 20:15:10 +08:00
parent 7f4dd7f34b
commit 7da226c3fe
4 changed files with 172 additions and 5 deletions

View File

@ -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
- **ReDocAPI文档**: 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) # 改为其他端口
```
## 🐛 常见问题
### 问题1ModuleNotFoundError: 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`

View File

@ -15,6 +15,7 @@ app = FastAPI(
version=__version__,
docs_url="/docs",
redoc_url="/redoc",
openapi_url="/openapi.json", # 明确指定OpenAPI JSON路径
)

View File

@ -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

View File

@ -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
]