forked from wangtao/AI4SE_Practices
api
This commit is contained in:
parent
7f4dd7f34b
commit
7da226c3fe
|
|
@ -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`
|
||||||
|
|
||||||
|
|
@ -15,6 +15,7 @@ app = FastAPI(
|
||||||
version=__version__,
|
version=__version__,
|
||||||
docs_url="/docs",
|
docs_url="/docs",
|
||||||
redoc_url="/redoc",
|
redoc_url="/redoc",
|
||||||
|
openapi_url="/openapi.json", # 明确指定OpenAPI JSON路径
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import List, Optional, Dict, Any
|
from typing import List, Optional, Dict, Any
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from pydantic import BaseModel, Field, HttpUrl
|
from pydantic import BaseModel, Field, HttpUrl, ConfigDict
|
||||||
|
|
||||||
|
|
||||||
class ToolType(str, Enum):
|
class ToolType(str, Enum):
|
||||||
|
|
@ -75,6 +75,9 @@ class WebsiteInfo(BaseModel):
|
||||||
|
|
||||||
class ToolBase(BaseModel):
|
class ToolBase(BaseModel):
|
||||||
"""工具基础模型"""
|
"""工具基础模型"""
|
||||||
|
# 禁用受保护命名空间检查,允许使用 model_ 开头的字段名
|
||||||
|
model_config = ConfigDict(protected_namespaces=())
|
||||||
|
|
||||||
name: str = Field(..., description="工具名称")
|
name: str = Field(..., description="工具名称")
|
||||||
type: ToolType = Field(..., description="工具类型")
|
type: ToolType = Field(..., description="工具类型")
|
||||||
category: str = Field(..., description="工具分类")
|
category: str = Field(..., description="工具分类")
|
||||||
|
|
@ -82,7 +85,7 @@ class ToolBase(BaseModel):
|
||||||
website: Optional[WebsiteInfo] = None
|
website: Optional[WebsiteInfo] = None
|
||||||
pricing: Optional[PricingInfo] = None
|
pricing: Optional[PricingInfo] = None
|
||||||
model_base: Optional[str] = Field(None, description="底层模型,如GPT-4、CodeLlama等")
|
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
|
language_support: Optional[LanguageSupport] = None
|
||||||
deployment: Optional[DeploymentType] = None
|
deployment: Optional[DeploymentType] = None
|
||||||
version: Optional[VersionInfo] = None
|
version: Optional[VersionInfo] = None
|
||||||
|
|
|
||||||
|
|
@ -213,7 +213,7 @@ class ToolService:
|
||||||
"""获取所有工具"""
|
"""获取所有工具"""
|
||||||
tools = self._load_tools()
|
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:
|
if filter_params:
|
||||||
|
|
@ -239,7 +239,7 @@ class ToolService:
|
||||||
"""根据分类获取工具"""
|
"""根据分类获取工具"""
|
||||||
tools = self._load_tools()
|
tools = self._load_tools()
|
||||||
return [
|
return [
|
||||||
ToolOverview(**tool.dict())
|
ToolOverview(**tool.model_dump())
|
||||||
for tool in tools.values()
|
for tool in tools.values()
|
||||||
if tool.category == category
|
if tool.category == category
|
||||||
]
|
]
|
||||||
|
|
@ -248,7 +248,7 @@ class ToolService:
|
||||||
"""根据类型获取工具"""
|
"""根据类型获取工具"""
|
||||||
tools = self._load_tools()
|
tools = self._load_tools()
|
||||||
return [
|
return [
|
||||||
ToolOverview(**tool.dict())
|
ToolOverview(**tool.model_dump())
|
||||||
for tool in tools.values()
|
for tool in tools.values()
|
||||||
if tool.type == tool_type
|
if tool.type == tool_type
|
||||||
]
|
]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue