fix(agent): Fix load db models error (#2290)

This commit is contained in:
Fangyin Cheng 2025-01-09 15:36:23 +08:00 committed by GitHub
parent 22249840de
commit ddfb435fd4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 67 additions and 39 deletions

View File

@ -5,13 +5,16 @@ import uuid
from typing import Any, Dict, List, Optional, Tuple, Type, cast from typing import Any, Dict, List, Optional, Tuple, Type, cast
from dbgpt.agent import AgentMessage, ConversableAgent from dbgpt.agent import AgentMessage, ConversableAgent
from dbgpt.serve.agent.agents.app_agent_manage import get_app_manager
from dbgpt.util import ParameterDescription from dbgpt.util import ParameterDescription
from .base import Resource, ResourceParameters, ResourceType from .base import Resource, ResourceParameters, ResourceType
def _get_app_list(): def _get_app_list():
# TODO: Don't import dbgpt.serve in dbgpt.agent module
from dbgpt.serve.agent.agents.app_agent_manage import get_app_manager
# Only call this function when the system app is initialized
apps = get_app_manager().get_dbgpts() apps = get_app_manager().get_dbgpts()
results = [ results = [
{ {
@ -24,53 +27,63 @@ def _get_app_list():
return results return results
@dataclasses.dataclass def _create_app_resource_parameters() -> Type[ResourceParameters]:
class AppResourceParameters(ResourceParameters): """Create AppResourceParameters."""
"""Application resource class."""
app_code: str = dataclasses.field( @dataclasses.dataclass
metadata={ class _DynAppResourceParameters(ResourceParameters):
"help": "app code", """Application resource class."""
"valid_values": _get_app_list(),
},
)
@classmethod app_code: str = dataclasses.field(
def to_configurations( metadata={
cls, "help": "app code",
parameters: Type["AppResourceParameters"], "valid_values": _get_app_list(),
version: Optional[str] = None, },
**kwargs,
) -> Any:
"""Convert the parameters to configurations."""
conf: List[ParameterDescription] = cast(
List[ParameterDescription], super().to_configurations(parameters)
) )
version = version or cls._resource_version()
if version != "v1":
return conf
# Compatible with old version
for param in conf:
if param.param_name == "app_code":
return param.valid_values or []
return []
@classmethod @classmethod
def from_dict( def to_configurations(
cls, data: dict, ignore_extra_fields: bool = True cls,
) -> ResourceParameters: parameters: Type["ResourceParameters"],
"""Create a new instance from a dictionary.""" version: Optional[str] = None,
copied_data = data.copy() **kwargs,
if "app_code" not in copied_data and "value" in copied_data: ) -> Any:
copied_data["app_code"] = copied_data.pop("value") """Convert the parameters to configurations."""
return super().from_dict(copied_data, ignore_extra_fields=ignore_extra_fields) conf: List[ParameterDescription] = cast(
List[ParameterDescription], super().to_configurations(parameters)
)
version = version or cls._resource_version()
if version != "v1":
return conf
# Compatible with old version
for param in conf:
if param.param_name == "app_code":
return param.valid_values or []
return []
@classmethod
def from_dict(
cls, data: dict, ignore_extra_fields: bool = True
) -> ResourceParameters:
"""Create a new instance from a dictionary."""
copied_data = data.copy()
if "app_code" not in copied_data and "value" in copied_data:
copied_data["app_code"] = copied_data.pop("value")
return super().from_dict(
copied_data, ignore_extra_fields=ignore_extra_fields
)
return _DynAppResourceParameters
class AppResource(Resource[AppResourceParameters]): class AppResource(Resource[ResourceParameters]):
"""AppResource resource class.""" """AppResource resource class."""
def __init__(self, name: str, app_code: str, **kwargs): def __init__(self, name: str, app_code: str, **kwargs):
"""Initialize AppResource resource.""" """Initialize AppResource resource."""
# TODO: Don't import dbgpt.serve in dbgpt.agent module
from dbgpt.serve.agent.agents.app_agent_manage import get_app_manager
self._resource_name = name self._resource_name = name
self._app_code = app_code self._app_code = app_code
@ -101,7 +114,7 @@ class AppResource(Resource[AppResourceParameters]):
@classmethod @classmethod
def resource_parameters_class(cls, **kwargs) -> Type[ResourceParameters]: def resource_parameters_class(cls, **kwargs) -> Type[ResourceParameters]:
"""Return the resource parameters class.""" """Return the resource parameters class."""
return AppResourceParameters return _create_app_resource_parameters()
async def get_prompt( async def get_prompt(
self, self,
@ -172,6 +185,9 @@ async def _start_app(
conv_uid: Optional[str] = None, conv_uid: Optional[str] = None,
) -> AgentMessage: ) -> AgentMessage:
"""Start App By AppResource.""" """Start App By AppResource."""
# TODO: Don't import dbgpt.serve in dbgpt.agent module
from dbgpt.serve.agent.agents.app_agent_manage import get_app_manager
conv_uid = str(uuid.uuid4()) if conv_uid is None else conv_uid conv_uid = str(uuid.uuid4()) if conv_uid is None else conv_uid
gpts_app = get_app_manager().get_app(app_code) gpts_app = get_app_manager().get_app(app_code)
app_agent = await get_app_manager().create_agent_by_app_code( app_agent = await get_app_manager().create_agent_by_app_code(

View File

@ -107,6 +107,18 @@ class MultiAgents(BaseComponent, ABC):
super().__init__(system_app) super().__init__(system_app)
self.system_app = system_app self.system_app = system_app
def on_init(self):
"""Called when init the application.
Import your own module here to ensure the module is loaded before the application starts
"""
from ..db.gpts_app import (
GptsAppCollectionEntity,
GptsAppDetailEntity,
GptsAppEntity,
UserRecentAppsEntity,
)
def get_dbgpts(self, user_code: str = None, sys_code: str = None): def get_dbgpts(self, user_code: str = None, sys_code: str = None):
apps = self.gpts_app.app_list( apps = self.gpts_app.app_list(
GptsAppQuery(user_code=user_code, sys_code=sys_code) GptsAppQuery(user_code=user_code, sys_code=sys_code)