DB-GPT/dbgpt/serve/agent/app/controller.py
明天 b124ecc10b
feat: (0.6)New UI (#1855)
Co-authored-by: 夏姜 <wenfengjiang.jwf@digital-engine.com>
Co-authored-by: aries_ckt <916701291@qq.com>
Co-authored-by: wb-lh513319 <wb-lh513319@alibaba-inc.com>
Co-authored-by: csunny <cfqsunny@163.com>
2024-08-21 17:37:45 +08:00

359 lines
12 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import json
import logging
from typing import List, Optional
from fastapi import APIRouter, Depends
from dbgpt._private.config import Config
from dbgpt.agent.core.agent_manage import get_agent_manager
from dbgpt.agent.resource.manage import get_resource_manager
from dbgpt.agent.util.llm.llm import LLMStrategyType
from dbgpt.app.openapi.api_view_model import Result
from dbgpt.serve.agent.app.gpts_server import available_llms
from dbgpt.serve.agent.db.gpts_app import (
GptsApp,
GptsAppCollectionDao,
GptsAppDao,
GptsAppQuery,
native_app_params,
)
from dbgpt.serve.agent.team.base import TeamMode
from dbgpt.serve.utils.auth import UserRequest, get_user_from_headers
CFG = Config()
router = APIRouter()
logger = logging.getLogger(__name__)
gpts_dao = GptsAppDao()
collection_dao = GptsAppCollectionDao()
@router.post("/v1/app/create")
async def create(
gpts_app: GptsApp, user_info: UserRequest = Depends(get_user_from_headers)
):
try:
gpts_app.user_code = (
user_info.user_id if user_info.user_id is not None else gpts_app.user_code
)
return Result.succ(gpts_dao.create(gpts_app))
except Exception as ex:
return Result.failed(code="E000X", msg=f"create app error: {ex}")
@router.post("/v1/app/list")
async def app_list(
query: GptsAppQuery, user_info: UserRequest = Depends(get_user_from_headers)
):
try:
# query.user_code = (
# user_info.user_id if user_info.user_id is not None else query.user_code
# )
query.ignore_user = "true"
return Result.succ(gpts_dao.app_list(query, True))
except Exception as ex:
logger.exception("app_list exception!")
return Result.failed(code="E000X", msg=f"query app list error: {ex}")
@router.get("/v1/app/info")
async def app_detail(
chat_scene: str,
app_code: str = None,
):
logger.info(f"app_detail:{chat_scene},{app_code}")
try:
if app_code:
return Result.succ(gpts_dao.app_detail(app_code))
else:
from dbgpt.app.scene.base import ChatScene
scene: ChatScene = ChatScene.of_mode(chat_scene)
return Result.succ(gpts_dao.native_app_detail(scene.scene_name()))
except Exception as ex:
logger.exception("query app detail error!")
return Result.failed(code="E000X", msg=f"query app detail error: {ex}")
@router.get("/v1/app/export")
async def app_export(
chat_scene: str,
app_code: str = None,
):
logger.info(f"app_export:{app_code}")
try:
if app_code:
app_info = gpts_dao.app_detail(app_code)
else:
from dbgpt.app.scene.base import ChatScene
scene: ChatScene = ChatScene.of_mode(chat_scene)
app_info = gpts_dao.native_app_detail(scene.scene_name())
return Result.succ(app_info)
except Exception as ex:
logger.exception("export app info error!")
return Result.failed(code="E000X", msg=f"export app info error: {ex}")
@router.get("/v1/app/{app_code}")
async def get_app_by_code(
app_code: str,
):
try:
return Result.succ(gpts_dao.app_detail(app_code))
except Exception as ex:
logger.exception("query app detail error!")
return Result.failed(code="E000X", msg=f"query app detail error: {ex}")
@router.post("/v1/app/hot/list")
async def hot_app_list(
query: GptsAppQuery, user_info: UserRequest = Depends(get_user_from_headers)
):
try:
query.user_code = (
user_info.user_id if user_info.user_id is not None else query.user_code
)
list_hot_apps = gpts_dao.list_hot_apps(query)
return Result.succ(list_hot_apps)
except Exception as ex:
logger.exception("hot_app_list exception")
return Result.failed(code="E000X", msg=f"query hot app error: {ex}")
@router.post("/v1/app/detail")
async def app_list(
gpts_app: GptsApp, user_info: UserRequest = Depends(get_user_from_headers)
):
try:
gpts_app.user_code = (
user_info.user_id if user_info.user_id is not None else gpts_app.user_code
)
return Result.succ(gpts_dao.app_detail(gpts_app.app_code))
except Exception as ex:
return Result.failed(code="E000X", msg=f"query app error: {ex}")
@router.post("/v1/app/edit")
async def edit(
gpts_app: GptsApp, user_info: UserRequest = Depends(get_user_from_headers)
):
try:
gpts_app.user_code = (
user_info.user_id if user_info.user_id is not None else gpts_app.user_code
)
return Result.succ(gpts_dao.edit(gpts_app))
except Exception as ex:
logger.exception(" app edit exception!")
return Result.failed(code="E000X", msg=f"edit app error: {ex}")
@router.get("/v1/agents/list")
async def all_agents(user_info: UserRequest = Depends(get_user_from_headers)):
try:
agents = get_agent_manager().list_agents()
for agent in agents:
label = agent["name"]
agent["label"] = label
return Result.succ(agents)
except Exception as ex:
return Result.failed(code="E000X", msg=f"query agents error: {ex}")
@router.post("/v1/app/remove", response_model=Result)
async def delete(
gpts_app: GptsApp, user_info: UserRequest = Depends(get_user_from_headers)
):
try:
gpts_app.user_code = (
user_info.user_id if user_info.user_id is not None else gpts_app.user_code
)
gpts_dao.delete(gpts_app.app_code, gpts_app.user_code, gpts_app.sys_code)
return Result.succ()
except Exception as ex:
logger.exception("app remove exception!")
return Result.failed(code="E000X", msg=f"delete app error: {ex}")
@router.post("/v1/app/collect", response_model=Result)
async def collect(
gpts_app: GptsApp, user_info: UserRequest = Depends(get_user_from_headers)
):
try:
gpts_app.user_code = (
user_info.user_id if user_info.user_id is not None else gpts_app.user_code
)
collection_dao.collect(gpts_app.app_code, gpts_app.user_code, gpts_app.sys_code)
return Result.succ()
except Exception as ex:
return Result.failed(code="E000X", msg=f"collect app error: {ex}")
@router.post("/v1/app/uncollect", response_model=Result)
async def uncollect(
gpts_app: GptsApp, user_info: UserRequest = Depends(get_user_from_headers)
):
try:
gpts_app.user_code = (
user_info.user_id if user_info.user_id is not None else gpts_app.user_code
)
collection_dao.uncollect(
gpts_app.app_code, gpts_app.user_code, gpts_app.sys_code
)
return Result.succ()
except Exception as ex:
return Result.failed(code="E000X", msg=f"uncollect app error: {ex}")
@router.get("/v1/team-mode/list")
async def team_mode_list(user_info: UserRequest = Depends(get_user_from_headers)):
try:
return Result.succ([mode.to_dict() for mode in TeamMode])
except Exception as ex:
logger.exception(str(ex))
return Result.failed(code="E000X", msg=f"query team mode list error: {ex}")
@router.get("/v1/resource-type/list")
async def team_mode_list(user_info: UserRequest = Depends(get_user_from_headers)):
try:
resources = get_resource_manager().get_supported_resources_type()
return Result.succ(resources)
except Exception as ex:
logger.exception(str(ex))
return Result.failed(code="E000X", msg=f"query resource type list error: {ex}")
@router.get("/v1/llm-strategy/list")
async def llm_strategies(user_info: UserRequest = Depends(get_user_from_headers)):
try:
return Result.succ([type.to_dict() for type in LLMStrategyType])
except Exception as ex:
logger.exception(str(ex))
return Result.failed(
code="E000X", msg=f"query llm strategy type list error: {ex}"
)
@router.get("/v1/llm-strategy/value/list")
async def llm_strategy_values(
type: str, user_info: UserRequest = Depends(get_user_from_headers)
):
try:
results = []
match type:
case LLMStrategyType.Priority.value:
results = await available_llms()
return Result.succ(results)
except Exception as ex:
logger.exception(str(ex))
return Result.failed(
code="E000X", msg=f"query llm strategy type list error: {ex}"
)
@router.get("/v1/app/resources/list", response_model=Result)
async def app_resources(
type: str,
name: Optional[str] = None,
user_code: Optional[str] = None,
sys_code: Optional[str] = None,
user_info: UserRequest = Depends(get_user_from_headers),
):
"""
Get agent resources, such as db, knowledge, internet, plugin.
"""
try:
resources = get_resource_manager().get_supported_resources(
version="v1", type=type, user_id=None
)
results = resources.get(type, [])
return Result.succ(results)
except Exception as ex:
logger.exception(str(ex))
return Result.failed(code="E000X", msg=f"query app resources error: {ex}")
@router.post("/v1/app/publish", response_model=Result)
async def publish(
gpts_app: GptsApp, user_info: UserRequest = Depends(get_user_from_headers)
):
try:
gpts_app.user_code = (
user_info.user_id if user_info.user_id is not None else gpts_app.user_code
)
gpts_dao.publish(gpts_app.app_code, gpts_app.user_code, gpts_app.sys_code)
return Result.succ([])
except Exception as ex:
logger.exception(str(ex))
return Result.failed(code="E000X", msg=f"publish app error: {ex}")
@router.post("/v1/app/unpublish", response_model=Result)
async def unpublish(
gpts_app: GptsApp, user_info: UserRequest = Depends(get_user_from_headers)
):
try:
gpts_app.user_code = (
user_info.user_id if user_info.user_id is not None else gpts_app.user_code
)
gpts_dao.unpublish(gpts_app.app_code, gpts_app.user_code, gpts_app.sys_code)
return Result.succ([])
except Exception as ex:
logger.exception("unpublish:" + str(ex))
return Result.failed(code="E000X", msg=f"unpublish app error: {ex}")
@router.post("/v1/app/native/init", response_model=Result)
async def init_native_apps(
gpts_app: GptsApp, user_info: UserRequest = Depends(get_user_from_headers)
):
try:
user_code = (
user_info.user_id if user_info.user_id is not None else gpts_app.user_code
)
gpts_dao.init_native_apps(user_code)
return Result.succ([])
except Exception as ex:
logger.exception("init natove error!")
return Result.failed(code="E000X", msg=f"init natove error: {ex}")
@router.get("/v1/native_scenes")
async def native_scenes(user_info: UserRequest = Depends(get_user_from_headers)):
return Result.succ(native_app_params())
@router.post("/v1/app/admins/update")
def update_admins(
gpts_app: GptsApp, user_info: UserRequest = Depends(get_user_from_headers)
):
return Result.succ(gpts_dao.update_admins(gpts_app.app_code, gpts_app.admins))
@router.get("/v1/app/{app_code}/admins")
async def query_admins(
app_code: str,
user_info: UserRequest = Depends(get_user_from_headers),
):
try:
return Result.succ(gpts_dao.get_admins(app_code))
except Exception as ex:
logger.exception("query_admins:" + str(ex))
return Result.failed(code="E000X", msg=f"query admins error: {ex}")
@router.get("/v1/dbgpts/list", response_model=Result[List[GptsApp]])
async def get_dbgpts(user_code: str = None, sys_code: str = None):
logger.info(f"get_dbgpts:{user_code},{sys_code}")
try:
query: GptsAppQuery = GptsAppQuery()
query.ignore_user = "true"
response = gpts_dao.app_list(query, True)
return Result.succ(response.app_list)
except Exception as e:
logger.error(f"get_dbgpts failed:{str(e)}")
return Result.failed(msg=str(e), code="E300003")