Skip to main content
ODAI is built on a hub-and-spoke multi-agent architecture. A central orchestrator receives every user request and delegates work to a roster of specialized agents, each responsible for a distinct domain of capabilities.
User Request → WebSocket → Orchestrator → Specialized Agent(s) → Response → User
Each spoke agent owns its own tools, prompts, and API credentials. The orchestrator never calls external APIs directly — it hands off to the agent best suited to fulfill the request.

Agent integration pattern

Every agent in ODAI follows the same structural pattern: a set of functions decorated with @function_tool and an Agent instance that exposes them.
@function_tool(is_enabled=enable_check_function)
def agent_function(wrapper: RunContextWrapper[ChatContext], ...params) -> dict:
    """Tool description and usage instructions."""
    # API call logic
    return ToolResponse(
        response_type="agent_specific_type",
        agent_name="Service Name",
        friendly_name="Human Readable Name",
        display_response=True,
        response=processed_data
    ).to_dict()

AGENT = Agent(
    name="Agent Name",
    instructions=PROMPT_PREFIX + specific_instructions,
    handoffs=[related_agents],
    tools=[agent_function, other_tools]
)

@function_tool

The @function_tool decorator registers a function as a callable tool within the OpenAI Agents framework. The optional is_enabled parameter accepts a callable that receives the current RunContextWrapper and returns a boolean — this lets agents gate tools based on user permissions (e.g. whether Google OAuth or Plaid is connected).

ToolResponse

Every tool function returns a ToolResponse serialized to a dict. The key fields are:
FieldDescription
response_typeA string identifier for the type of data returned (e.g. "yelp_search")
agent_nameInternal agent identifier
friendly_nameHuman-readable label shown in the UI
display_responseWhen False, the tool output is not forwarded to the WebSocket client
responseThe actual payload data

Agent categories

ODAI includes 35+ agents organized into eight categories.

Communication & Productivity

  • Gmail Agent — send, receive, search, and reply to email
  • Google Calendar Agent — create and manage calendar events
  • Google Docs Agent — create and search documents
  • Slack Agent — team messaging integration
  • Twilio Assistant — voice and SMS capabilities

Information & Search

  • Google Search Agent — web search via SerpAPI
  • Google News Agent — top headlines and topic search
  • Fetch Website Agent — extract content from URLs
  • Google Shopping Agent — product search and price comparison

Financial Services

  • Plaid Agent — bank account balances and transactions
  • Plaid Connector Agent — guided account connection flow
  • FinnHub Agent — stock prices and financial statements
  • CoinMarketCap Agent — cryptocurrency prices and market data
  • Exchange Rate Agent — currency conversion

Travel & Transportation

  • FlightAware Agent — real-time flight status and tracking
  • Flights Agent — IATA code lookups and airport info
  • AMADEUS Agent — flight and hotel search
  • Amtrak Agent — train status and schedules
  • Caltrain Agent — regional Bay Area train information

Local Services & Entertainment

  • Yelp Agent — restaurant and business search with reviews
  • TripAdvisor Agent — travel recommendations and reviews
  • Ticketmaster Agent — event tickets and venue details
  • MovieGlu Agent — showtimes and theater search

Weather & Location

  • AccuWeather Agent — hourly and daily forecasts by coordinates
  • WeatherAPI Agent — current conditions and multi-day forecasts
  • Location Service — IP-based location detection

E-commerce & Shopping

  • Amazon Agent — product search and detail lookup
  • Google Shopping Agent — cross-retailer product comparison

Utilities & Tools

  • EasyPost Agent — package tracking across carriers
  • Open External URL Agent — open URLs in a browser window or tab
  • Google Connections Agent — Google account OAuth setup

Agent registration

Adding a new agent to ODAI involves four steps:
1

Implement the agent file

Create a connector file in connectors/ with @function_tool-decorated functions and an Agent instance exported as a module-level constant (e.g. MY_AGENT).
2

Import into the orchestrator

Add the import and include the agent in the handoffs list in connectors/orchestrator.py.
3

Map tool call messages

Add each tool function name to the TOOL_CALLS dict in connectors/orchestrator.py with a user-facing progress string (e.g. "Searching Yelp..."). Set the value to None for internal tools that should not surface a progress message.
4

Add integration configuration

Register the agent in integrations.yaml with an id, name, description, logo, and example prompts. This drives the frontend integrations panel and user onboarding copy.

Voice agent variants

Several agents expose a REALTIME_* variant alongside their standard version. These variants are registered in connectors/voice_orchestrator.py and are optimized for real-time speech: concise response formatting, no markdown, and faster execution. See Voice Interface for details.

Build docs developers (and LLMs) love