Skip to content

Commit

Permalink
Merge pull request #2 from difizen/brokun_dev
Browse files Browse the repository at this point in the history
refactor(API): core agent
  • Loading branch information
sunshinesmilelk authored Jul 3, 2024
2 parents 71bb53f + 38376c0 commit e536668
Show file tree
Hide file tree
Showing 15 changed files with 277 additions and 259 deletions.
32 changes: 32 additions & 0 deletions api/core/agent.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
'''Agent'''
from typing import AsyncIterator, List
from abc import ABC, abstractmethod
from langchain.schema.messages import BaseMessage, BaseMessageChunk
from pydantic import BaseModel

from models.chat import MessageModel

from .base import ConfigMeta


class Agent(BaseModel, ABC):
meta: ConfigMeta

'''Abstract agent'''
@abstractmethod
def invoke(
self,
config: ConfigMeta,
chat_id: int,
history: List[MessageModel],
message: MessageModel,
) -> BaseMessage | None:
"""Chat with agent"""

@abstractmethod
def invoke_astream(self,
config: ConfigMeta,
chat_id: int,
history: List[MessageModel],
message: MessageModel,) -> AsyncIterator[BaseMessageChunk] | None:
"""Chat with agent and get answer via stream"""
40 changes: 40 additions & 0 deletions api/core/agent_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
'''Agent manager
'''


from typing import List
from pydantic import BaseModel

from .agent_provider import AgentProvider
from .base import ConfigMeta


class AgentManager(BaseModel):
'''Agent Manager
get or create agent from provider by manager
'''

providers: List[AgentProvider] = []

def registe_provider(self, provider: AgentProvider):
'''add provider'''
self.providers.append(provider)

def get_provider(self, config: ConfigMeta) -> AgentProvider:
'''retrieve the best matching provider'''
selected_provider = None
highest_priority = -1

for provider in self.providers:
priority = provider.can_handle(config)
if priority > highest_priority:
highest_priority = priority
selected_provider = provider

if selected_provider is None:
raise Exception("No suitable provider found")

return selected_provider


agent_manager = AgentManager()
20 changes: 20 additions & 0 deletions api/core/agent_provider.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
'''Agent Provider'''
from abc import ABC, abstractmethod
from pydantic import BaseModel

from .agent import Agent

from .base import ConfigMeta


class AgentProvider(BaseModel, ABC):
'''Agent Provider'''
name: str = "custom"

def can_handle(self, config: ConfigMeta) -> int:
'''Priority of provider for handling agent config'''
return -1

@abstractmethod
def provide(self, config: ConfigMeta, chat_id: int) -> Agent:
"""List chat executors."""
15 changes: 15 additions & 0 deletions api/core/base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
'''Base model'''
from typing import Any, List
from pydantic import BaseModel


class ModelMeta(BaseModel):
'''LLM meta model '''
key: str


class ConfigMeta(BaseModel):
'''agent meta model'''
persona: str
model: ModelMeta
tools: List[Any] = []
23 changes: 10 additions & 13 deletions api/core/chat.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,14 @@
from typing import List

from langchain.schema.messages import BaseMessage, SystemMessage, HumanMessage, AIMessage
from pydantic import BaseModel
from models.agent_config import AgentConfigModel
from models.chat import MessageModel, MessageSenderType
from .chat_executor import chat_object_manager
from .agent_manager import agent_manager
from .base import ConfigMeta

from .langchain_agent_provider import langchain_agent_provider

class ModelMeta(BaseModel):
key: str


class ConfigMeta(BaseModel):
persona: str
model: ModelMeta
agent_manager.registe_provider(langchain_agent_provider)


def get_config_meta(agent_config: AgentConfigModel) -> ConfigMeta:
Expand All @@ -35,8 +30,9 @@ def chat(agent_config: AgentConfigModel, chat_id: int, history: List[MessageMode
system_msg = SystemMessage(content=config.persona)
msgs = [to_message(m) for m in history]
msgs.insert(0, system_msg)
executor = chat_object_manager.get_executor(config.model.key)
answer = executor.run(msgs)
provider = agent_manager.get_provider(config)
agent = provider.provide(config, chat_id)
answer = agent.invoke(config, chat_id, history, message)
return answer


Expand All @@ -45,6 +41,7 @@ def chat_stream(agent_config: AgentConfigModel, chat_id: int, history: List[Mess
system_msg = SystemMessage(content=config.persona)
msgs = [to_message(m) for m in history]
msgs.insert(0, system_msg)
executor = chat_object_manager.get_executor(config.model.key)
answer = executor.astream(msgs)
provider = agent_manager.get_provider(config)
agent = provider.provide(config, chat_id)
answer = agent.invoke_astream(config, chat_id, history, message)
return answer
7 changes: 0 additions & 7 deletions api/core/chat_executor/__init__.py

This file was deleted.

29 changes: 0 additions & 29 deletions api/core/chat_executor/executor.py

This file was deleted.

22 changes: 0 additions & 22 deletions api/core/chat_executor/item.py

This file was deleted.

24 changes: 0 additions & 24 deletions api/core/chat_executor/object.py

This file was deleted.

65 changes: 0 additions & 65 deletions api/core/chat_executor/object_manager.py

This file was deleted.

53 changes: 0 additions & 53 deletions api/core/chat_executor/openai.py

This file was deleted.

Loading

0 comments on commit e536668

Please sign in to comment.