diff --git a/surfsense_backend/app/agents/multi_agent_chat/calendar/__init__.py b/surfsense_backend/app/agents/multi_agent_chat/calendar/__init__.py new file mode 100644 index 000000000..7d207b01f --- /dev/null +++ b/surfsense_backend/app/agents/multi_agent_chat/calendar/__init__.py @@ -0,0 +1,11 @@ +"""Google Calendar vertical slice: connector tools, domain agent, ``domain_prompt.md``.""" + +from app.agents.multi_agent_chat.calendar.agent import build_calendar_domain_agent +from app.agents.multi_agent_chat.calendar.connector_tools import ( + build_google_calendar_connector_tools, +) + +__all__ = [ + "build_calendar_domain_agent", + "build_google_calendar_connector_tools", +] diff --git a/surfsense_backend/app/agents/multi_agent_chat/calendar/agent.py b/surfsense_backend/app/agents/multi_agent_chat/calendar/agent.py new file mode 100644 index 000000000..23110ea61 --- /dev/null +++ b/surfsense_backend/app/agents/multi_agent_chat/calendar/agent.py @@ -0,0 +1,21 @@ +"""Google Calendar domain agent graph.""" + +from __future__ import annotations + +from collections.abc import Sequence + +import app.agents.multi_agent_chat.calendar as calendar_pkg +from langchain_core.language_models import BaseChatModel +from langchain_core.tools import BaseTool + +from app.agents.multi_agent_chat.shared.domain_agent_factory import build_domain_agent + + +def build_calendar_domain_agent(llm: BaseChatModel, tools: Sequence[BaseTool]): + """Compiled Calendar domain-agent graph (prompt + tools co-located under ``calendar``).""" + return build_domain_agent( + llm, + tools, + prompt_package=calendar_pkg.__name__, + prompt_stem="domain_prompt", + ) diff --git a/surfsense_backend/app/agents/multi_agent_chat/calendar/connector_tools.py b/surfsense_backend/app/agents/multi_agent_chat/calendar/connector_tools.py new file mode 100644 index 000000000..8fb7356ff --- /dev/null +++ b/surfsense_backend/app/agents/multi_agent_chat/calendar/connector_tools.py @@ -0,0 +1,33 @@ +"""Google Calendar connector LangChain tools (``new_chat`` factories).""" + +from __future__ import annotations + +from langchain_core.tools import BaseTool +from sqlalchemy.ext.asyncio import AsyncSession + +from app.agents.multi_agent_chat.shared.deps import connector_binding +from app.agents.new_chat.tools.google_calendar import ( + create_create_calendar_event_tool, + create_delete_calendar_event_tool, + create_search_calendar_events_tool, + create_update_calendar_event_tool, +) + + +def build_google_calendar_connector_tools( + *, + db_session: AsyncSession, + search_space_id: int, + user_id: str, +) -> list[BaseTool]: + d = connector_binding( + db_session=db_session, + search_space_id=search_space_id, + user_id=user_id, + ) + return [ + create_search_calendar_events_tool(**d), + create_create_calendar_event_tool(**d), + create_update_calendar_event_tool(**d), + create_delete_calendar_event_tool(**d), + ] diff --git a/surfsense_backend/app/agents/multi_agent_chat/calendar/domain_prompt.md b/surfsense_backend/app/agents/multi_agent_chat/calendar/domain_prompt.md new file mode 100644 index 000000000..6815e77db --- /dev/null +++ b/surfsense_backend/app/agents/multi_agent_chat/calendar/domain_prompt.md @@ -0,0 +1 @@ +You are the Google Calendar domain agent. Use only the tools provided to complete calendar-related tasks. Stay focused on scheduling and calendar operations and respond concisely.