2025-12-10 20:52:44 +08:00
|
|
|
|
"""
|
|
|
|
|
|
OpenAI API 端点
|
|
|
|
|
|
|
|
|
|
|
|
- /v1/chat/completions - OpenAI Chat API
|
|
|
|
|
|
- /v1/responses - OpenAI Responses API (CLI)
|
2026-02-19 21:26:18 +08:00
|
|
|
|
- /v1/responses/compact - OpenAI Responses Compaction API (CLI)
|
2025-12-14 20:01:19 +08:00
|
|
|
|
|
|
|
|
|
|
注意: /v1/models 端点由 models.py 统一处理,根据请求头返回对应格式
|
2025-12-10 20:52:44 +08:00
|
|
|
|
"""
|
|
|
|
|
|
|
2026-01-30 14:30:57 +08:00
|
|
|
|
from typing import Any
|
2026-02-01 17:28:00 +08:00
|
|
|
|
|
2025-12-10 20:52:44 +08:00
|
|
|
|
from fastapi import APIRouter, Depends, Request
|
|
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
|
|
|
2026-03-14 11:59:07 +08:00
|
|
|
|
from src.api.base.pipeline import get_pipeline
|
2025-12-10 20:52:44 +08:00
|
|
|
|
from src.database import get_db
|
|
|
|
|
|
|
2026-02-01 17:28:00 +08:00
|
|
|
|
router = APIRouter(tags=["OpenAI API"])
|
2026-03-14 11:59:07 +08:00
|
|
|
|
pipeline = get_pipeline()
|
2025-12-10 20:52:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
2026-03-31 19:19:04 +08:00
|
|
|
|
async def _run_openai_route_shell(adapter: Any, http_request: Request, db: Session) -> Any:
|
|
|
|
|
|
return await pipeline.run(
|
|
|
|
|
|
adapter=adapter,
|
|
|
|
|
|
http_request=http_request,
|
|
|
|
|
|
db=db,
|
|
|
|
|
|
mode=adapter.mode,
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-12-10 20:52:44 +08:00
|
|
|
|
@router.post("/v1/chat/completions")
|
|
|
|
|
|
async def create_chat_completion(
|
|
|
|
|
|
http_request: Request,
|
|
|
|
|
|
db: Session = Depends(get_db),
|
2026-01-30 14:30:57 +08:00
|
|
|
|
) -> Any:
|
2026-01-07 14:55:07 +08:00
|
|
|
|
"""
|
|
|
|
|
|
OpenAI Chat Completions API
|
|
|
|
|
|
|
|
|
|
|
|
兼容 OpenAI Chat Completions API 格式的代理接口。
|
|
|
|
|
|
|
|
|
|
|
|
**认证方式**: Bearer Token(API Key 或 JWT Token)
|
|
|
|
|
|
|
|
|
|
|
|
**请求格式**:
|
|
|
|
|
|
```json
|
|
|
|
|
|
{
|
|
|
|
|
|
"model": "gpt-4",
|
|
|
|
|
|
"messages": [{"role": "user", "content": "Hello"}],
|
|
|
|
|
|
"stream": false
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**支持的参数**: model, messages, stream, temperature, max_tokens 等标准 OpenAI 参数
|
|
|
|
|
|
"""
|
2026-03-14 11:59:07 +08:00
|
|
|
|
from src.api.handlers.openai import OpenAIChatAdapter
|
|
|
|
|
|
|
2025-12-10 20:52:44 +08:00
|
|
|
|
adapter = OpenAIChatAdapter()
|
2026-03-31 19:19:04 +08:00
|
|
|
|
return await _run_openai_route_shell(adapter, http_request, db)
|
2025-12-10 20:52:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
2026-02-19 21:26:18 +08:00
|
|
|
|
@router.post("/v1/responses/compact")
|
|
|
|
|
|
async def create_responses_compact(
|
|
|
|
|
|
http_request: Request,
|
|
|
|
|
|
db: Session = Depends(get_db),
|
|
|
|
|
|
) -> Any:
|
|
|
|
|
|
"""
|
|
|
|
|
|
OpenAI Responses Compaction API (CLI)
|
|
|
|
|
|
|
|
|
|
|
|
用于压缩/总结之前的 responses,永远非流式。
|
|
|
|
|
|
Codex CLI 使用 compact 模型后缀(如 gpt-5-compact)时调用此端点。
|
|
|
|
|
|
|
|
|
|
|
|
**认证方式**: Bearer Token(API Key 或 JWT Token)
|
|
|
|
|
|
"""
|
2026-03-14 11:59:07 +08:00
|
|
|
|
from src.api.handlers.openai_cli import OpenAICompactAdapter
|
|
|
|
|
|
|
2026-03-01 23:55:26 +08:00
|
|
|
|
adapter = OpenAICompactAdapter()
|
2026-03-31 19:19:04 +08:00
|
|
|
|
return await _run_openai_route_shell(adapter, http_request, db)
|
2026-02-19 21:26:18 +08:00
|
|
|
|
|
|
|
|
|
|
|
2025-12-10 20:52:44 +08:00
|
|
|
|
@router.post("/v1/responses")
|
|
|
|
|
|
async def create_responses(
|
|
|
|
|
|
http_request: Request,
|
|
|
|
|
|
db: Session = Depends(get_db),
|
2026-01-30 14:30:57 +08:00
|
|
|
|
) -> Any:
|
2026-01-07 14:55:07 +08:00
|
|
|
|
"""
|
|
|
|
|
|
OpenAI Responses API (CLI)
|
|
|
|
|
|
|
|
|
|
|
|
兼容 OpenAI Codex CLI 使用的 Responses API 格式,请求透传到上游。
|
|
|
|
|
|
|
|
|
|
|
|
**认证方式**: Bearer Token(API Key 或 JWT Token)
|
|
|
|
|
|
"""
|
2026-03-14 11:59:07 +08:00
|
|
|
|
from src.api.handlers.openai_cli import OpenAICliAdapter
|
|
|
|
|
|
|
2025-12-10 20:52:44 +08:00
|
|
|
|
adapter = OpenAICliAdapter()
|
2026-03-31 19:19:04 +08:00
|
|
|
|
return await _run_openai_route_shell(adapter, http_request, db)
|