feat(gateway): dual-mount legacy routers on /api and /api/v1 (Stage 1 PR5)

Strip /api prefix from 13 legacy router APIRouter() declarations and dual-mount
each on prefix="/api" (backward compat) and prefix="/api/v1" (versioned surface)
in app.py. Auth, service-accounts, api-keys, assistants-compat remain single-mount.
Update 10 test files to pass prefix="/api" when directly including stripped routers.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
1445043649
2026-06-28 19:49:05 +08:00
parent 3f0d5c8c96
commit 2461a923be
25 changed files with 135 additions and 68 deletions
+1 -1
View File
@@ -14,7 +14,7 @@ from deerflow.config.paths import get_paths
from deerflow.runtime.user_context import get_effective_user_id
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api", tags=["agents"])
router = APIRouter(tags=["agents"])
AGENT_NAME_PATTERN = re.compile(r"^[A-Za-z0-9-]+$")
+1 -1
View File
@@ -12,7 +12,7 @@ from app.gateway.path_utils import resolve_thread_virtual_path
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api", tags=["artifacts"])
router = APIRouter(tags=["artifacts"])
ACTIVE_CONTENT_MIME_TYPES = {
"text/html",
+1 -1
View File
@@ -9,7 +9,7 @@ from pydantic import BaseModel
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/channels", tags=["channels"])
router = APIRouter(prefix="/channels", tags=["channels"])
class ChannelStatusResponse(BaseModel):
+1 -1
View File
@@ -16,7 +16,7 @@ from app.gateway.authz import require_permission
from app.gateway.deps import get_current_user, get_feedback_repo, get_run_store
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/threads", tags=["feedback"])
router = APIRouter(prefix="/threads", tags=["feedback"])
# ---------------------------------------------------------------------------
+1 -1
View File
@@ -9,7 +9,7 @@ from pydantic import BaseModel, Field
from deerflow.config.extensions_config import ExtensionsConfig, get_extensions_config, reload_extensions_config
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api", tags=["mcp"])
router = APIRouter(tags=["mcp"])
class McpOAuthConfigResponse(BaseModel):
+1 -1
View File
@@ -15,7 +15,7 @@ from deerflow.agents.memory.updater import (
from deerflow.config.memory_config import get_memory_config
from deerflow.runtime.user_context import get_effective_user_id
router = APIRouter(prefix="/api", tags=["memory"])
router = APIRouter(tags=["memory"])
class ContextSection(BaseModel):
+1 -1
View File
@@ -4,7 +4,7 @@ from pydantic import BaseModel, Field
from app.gateway.deps import get_config
from deerflow.config.app_config import AppConfig
router = APIRouter(prefix="/api", tags=["models"])
router = APIRouter(tags=["models"])
class ModelResponse(BaseModel):
+1 -1
View File
@@ -21,7 +21,7 @@ from app.gateway.services import sse_consumer, start_run
from deerflow.runtime import serialize_channel_values
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/runs", tags=["runs"])
router = APIRouter(prefix="/runs", tags=["runs"])
def _resolve_thread_id(body: RunCreateRequest) -> str:
+1 -1
View File
@@ -18,7 +18,7 @@ from deerflow.skills.types import SKILL_MD_FILE, SkillCategory
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api", tags=["skills"])
router = APIRouter(tags=["skills"])
class SkillResponse(BaseModel):
+1 -1
View File
@@ -12,7 +12,7 @@ from deerflow.models import create_chat_model
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api", tags=["suggestions"])
router = APIRouter(tags=["suggestions"])
class SuggestionMessage(BaseModel):
+1 -1
View File
@@ -25,7 +25,7 @@ from app.gateway.services import sse_consumer, start_run
from deerflow.runtime import RunRecord, serialize_channel_values
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/threads", tags=["runs"])
router = APIRouter(prefix="/threads", tags=["runs"])
# ---------------------------------------------------------------------------
+1 -1
View File
@@ -29,7 +29,7 @@ from deerflow.runtime.user_context import get_effective_user_id
from deerflow.utils.time import coerce_iso, now_iso
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/threads", tags=["threads"])
router = APIRouter(prefix="/threads", tags=["threads"])
# Metadata keys that the server controls; clients are not allowed to set
+1 -1
View File
@@ -30,7 +30,7 @@ from deerflow.utils.file_conversion import CONVERTIBLE_EXTENSIONS, convert_file_
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/threads/{thread_id}/uploads", tags=["uploads"])
router = APIRouter(prefix="/threads/{thread_id}/uploads", tags=["uploads"])
UPLOAD_CHUNK_SIZE = 8192
DEFAULT_MAX_FILES = 10