File size: 2,612 Bytes
4ef118d
 
 
 
 
 
 
 
 
 
 
 
 
592cb1d
4ef118d
 
 
 
 
 
 
 
 
 
 
 
 
592cb1d
4ef118d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
"""
Agent for auto mode API routes.
"""

from __future__ import annotations

import logging

from fastapi import APIRouter, Request
from fastapi.responses import JSONResponse
from starlette.responses import Response

from ..providers import is_provider_supported
from ._request_secrets import get_llm_api_key
from ..services.generation import generate_agent_for_auto
from ..utils.json_stream import create_streaming_json_response

router = APIRouter(tags=["agent-for-auto"])
logger = logging.getLogger(__name__)


@router.post("/agent-for-auto")
async def agent_for_auto(request: Request) -> Response:
    body = await request.json()
    provider = body.get("provider")
    message = body.get("message")
    current_space = body.get("currentSpace")
    api_key = get_llm_api_key(request)
    base_url = body.get("baseUrl")
    model = body.get("model")
    user_timezone = body.get("userTimezone")
    user_locale = body.get("userLocale")

    if not provider or not message:
        return JSONResponse(
            status_code=400,
            content={"error": "Missing required fields: provider, message"},
        )
    if not is_provider_supported(provider):
        return JSONResponse(status_code=400, content={"error": f"Unsupported provider: {provider}"})

    # Auto agent preselection is best-effort and must not break user chat flow.
    # On provider auth/config errors, gracefully return null and let frontend fallback.
    return create_streaming_json_response(
        _build_agent_for_auto_result(
            provider=provider,
            message=message,
            current_space=current_space,
            api_key=api_key,
            base_url=base_url,
            model=model,
            user_timezone=user_timezone,
            user_locale=user_locale,
        )
    )


async def _build_agent_for_auto_result(
    *,
    provider: str,
    message: str,
    current_space: dict | None,
    api_key: str,
    base_url: str | None,
    model: str | None,
    user_timezone: str | None,
    user_locale: str | None,
) -> dict[str, str | None]:
    try:
        agent_name = await generate_agent_for_auto(
            provider=provider,
            user_message=message,
            current_space=current_space,
            api_key=api_key,
            base_url=base_url,
            model=model,
            user_timezone=user_timezone,
            user_locale=user_locale,
        )
        return {"agentName": agent_name}
    except Exception as exc:  # noqa: BLE001
        logger.warning("agent-for-auto failed, fallback to null agent: %s", exc)
        return {"agentName": None}