champ-ed / classes /session_router.py
MalikS-343
squash
cbfe36d
Raw
History Blame Contribute Delete
3.71 kB
from typing import Any
from agent.agent import Agent
from agent.agent_client import AgentClient, ChatOutcome, SkillsAgentClient
from agent.champ_client import ChampAgentClient
from agent.fake_client import FakeAgentClient
from agent.frontier_client import (
GEMINI_CONSERVATIVE_TEMPERATURE,
GEMINI_CREATIVE_TEMPERATURE,
GeminiAgentClient,
GptAgentClient,
)
from classes.base_models import ChatRequest
from providers.protocol import ChatProvider
SessionId = str
ConversationId = str
ModelType = str
class SessionRouter:
"""Per-(session, conversation) registry of AgentClient instances."""
def __init__(
self,
wiki_skills_agent: Agent,
wiki_skills_agent_short: Agent,
champ_provider: ChatProvider,
champ_vector_store: Any,
openai_provider: ChatProvider,
openai_model_id: str,
gemini_provider: ChatProvider,
gemini_model_id: str,
fake_provider: ChatProvider,
) -> None:
self.session_clients: dict[tuple[SessionId, ConversationId], AgentClient] = {}
self.wiki_skills_agent = wiki_skills_agent
self.wiki_skills_agent_short = wiki_skills_agent_short
self.champ_provider = champ_provider
self.champ_vector_store = champ_vector_store
self.openai_provider = openai_provider
self.openai_model_id = openai_model_id
self.gemini_provider = gemini_provider
self.gemini_model_id = gemini_model_id
self.fake_provider = fake_provider
def delete_session(self, session_id: SessionId) -> None:
"""Drop every AgentClient (and its ConversationHistory) for this session."""
keys = [k for k in self.session_clients if k[0] == session_id]
for k in keys:
del self.session_clients[k]
def send(
self, payload: ChatRequest, documents: dict[str, str] | None = None
) -> ChatOutcome:
# TODO: session/conversation ids should be created backend-side, not client-side.
key = (payload.session_id, payload.conversation_id)
agent_client = self.session_clients.get(key)
if agent_client is None:
agent_client = self._create_agent_client(payload.model_type)
self.session_clients[key] = agent_client
return agent_client.call(
payload.human_message, lang=payload.lang, documents=documents
)
def _create_agent_client(self, model_type: str) -> AgentClient:
if model_type == "skills_wiki":
return SkillsAgentClient(agent=self.wiki_skills_agent)
if model_type == "skills_wiki_short":
return SkillsAgentClient(agent=self.wiki_skills_agent_short)
if model_type == "champ":
return ChampAgentClient(
provider=self.champ_provider,
vector_store=self.champ_vector_store,
)
if model_type == "openai":
return GptAgentClient(
provider=self.openai_provider,
model_id=self.openai_model_id,
)
if model_type == "google-conservative":
return GeminiAgentClient(
provider=self.gemini_provider,
model_id=self.gemini_model_id,
temperature=GEMINI_CONSERVATIVE_TEMPERATURE,
)
if model_type == "google-creative":
return GeminiAgentClient(
provider=self.gemini_provider,
model_id=self.gemini_model_id,
temperature=GEMINI_CREATIVE_TEMPERATURE,
)
if model_type == "fake":
return FakeAgentClient(provider=self.fake_provider)
raise RuntimeError(f"Unknown model_type: {model_type}")