rowboat/apps/rowboat_agents
akhisud3195 9157f87dc7 Add hosted tools + revamp tools UX
Replace db storage with api calls to klavis for list servers and add filters to hosted tool views

Add logging and simplify oauth

Refactor klavis API calls to go via a proxy

Add projectAuthCheck() to klavis actions

Fix build error in stream-response route.ts

PARTIAL: Revamp tools modal

PARTIAL: Manage mcp servers at project level document

PARTIAL: Fetch tools from MCP servers upon toggle ON

PARTIAL: Propogate hosted MCP tools to entity_list in build view

Show tool toggle banner

Add sync explicitly to prevent long page load time for MCP server's tools

PARTIAL: Fix auth flow DB writes

PARTIAL: Add tools with isready flag for auth-related server handling

PARTIAL: Bring back sync tools CTA

Fix tool selection issues

PARTIAL: Fix sync issues with enriched and available tools and log unenriched tool names

Remove buggy log statement

Refactor common components and refactor HostedServer

PARTIAL: Add custom servers and standardize the UI

PARTIAL: Add modal and small UI improvements to custom servers page

Show clubbed MCP tools in entity_list

Add tool filters in tools section of entity_list

Revert text in add tool CTA

Make entity_list sections collapsed when one is expanded

Merge project level tools to workflow level tools when sending requests to agent service

Restore original panel-common variants

Reduce agentic workflow request by removing tools from mcp servers

Merge project level tools to workflow level tools when sending requests to copilot service

Fix padding issues in entity_list headers

Update package-lock.json

Revert package* files to devg

Revert tsconfig to dev

PARTIAL: Change tabs and switch to heroui pending switch issues

Fix switch issues with heroui

Pass projectTools via workflow/app to entity_list and do not write to DB

Fix issue with tool_config rendering and @ mentions for project tools

Include @ mentioned project tools in agent request

Update copilot usage of project tools

Read mcp server url directly from tool config in agents service

Make entity_list panels resizable

Update resize handlers across the board

Change Hosted MCP servers ---> Tools Library

Remove tools filter

Remove filter tabs in hosted tools

Move tools selected / tools available labels below card titles

Remove tools from config / settings page

Bring back old mcp servers handling in agents service for backward compatibility as fallback

Remove web_search from project template

Add icons for agents, tools and prompts in entity_list

Enable agents reordering in entity_list

Fix build errors

Make entity_list icons more transparent

Add logos for hosted tools and fix importsg

Fix server card component sizes and overflow

Add error handling in hosted servers pageg

Add node_modules to gitignore

remove root package json

add project auth checks

revert to project mcpServers being optional

refactor tool merging and conversion

revert stream route change

Move authURL klavis logic to klavis_actions

Fix tool enrichment for post-auth tools and make logging less verbose

Expand tool schema to include comprehensive json schema fields

Add enabled and ready filters to hosted tools

Add needs auth warning above auth button

Update tools icon

Add github and google client ids to docker-compose

Clean up MCP servers upon project deletion

Remove klavis ai label

Improve server loading on and off UX

Fix bug that was not enriching un-auth servers

Add tool testing capabilities

Fix un-blurred strip in tool testing modal view

Disable server card CTAs during toggling on or off transition

Add beta tag to tools

Add tool and server counts

Truncate long tool descriptions

Add separators between filters in servers view

Support multiple format types in tool testing fields

Fix menu position issue for @ mentions
2025-06-03 17:34:16 +05:30
..
configs Move tracing toggle and max child turns to .env file 2025-05-06 22:47:35 +05:30
src Add hosted tools + revamp tools UX 2025-06-03 17:34:16 +05:30
tests Clean up tools.py and interactive.py 2025-05-09 10:17:36 +05:30
.dockerignore docker fixes for agents 2025-03-26 17:01:49 +05:30
.env.example Merge changes v1 2025-03-26 15:51:59 +05:30
.gitignore Merge changes v1 2025-03-26 15:51:59 +05:30
__init__.py Merge changes v1 2025-03-26 15:51:59 +05:30
Dockerfile docker fixes for agents 2025-03-26 17:01:49 +05:30
NOTICE.md Merge changes v1 2025-03-26 15:51:59 +05:30
poetry.lock Add support for other providers - litellm, openrouter 2025-04-29 13:22:22 +05:30
pyproject.toml Add support for other providers - litellm, openrouter 2025-04-29 13:22:22 +05:30
README.md Merge changes v1 2025-03-26 15:51:59 +05:30
requirements.txt Add support for other providers - litellm, openrouter 2025-04-29 13:22:22 +05:30

🤖 Agents

📝 Overview

  • RowBoat Agents is a multi-agent framework that powers conversations using agentic workflows.
  • Built on top of OpenAI Swarm with custom enhancements and improvements. Check the NOTICE for attribution and licensing details (MIT license).

🕸️ Graph-based Framework

  • Multi-agent systems are represented as graphs, where each agent is a node in the graph.
  • RowBoat Agents accepts Directed Acyclic Graph (DAG) workflows, which define agents, tools, and their connections.
  • Configure workflows using the RowBoat Studio (UI) with the help of an AI copilot. Setup instructions can be found in the main README.
  • The framework is stateless, meaning that it requires the upstream service to pass in the current state and messages in every turn.
  • At each conversation turn:
    • The agents are initialized using the current state.
    • The graph is traversed based on messages, state, and workflow
    • Response messages and a new state are generated.
    • If messages contain tool calls, the upstream service must invoke the necessary tools and send the tool results back to continue the interaction.

🗂️ Key Request and Response Fields

📤 Request

  • messages: List of user messages
  • state: Active agent state and histories
  • workflow: Graph of agents, tools, and connections

Example JSON: tests/sample_requests/default_example.json


📥 Response

  • messages: List of response messages (may contain tool calls)
  • state: Updated state to pass in the next request (since the framework is stateless)

Example JSON: tests/sample_responses/default_example.json


🛠️ Using the Framework

Ensure you are in this directory (cd apps/agents from the root directory of this repo) before running any of the below commands.

⚙️ Set Up Conda Environment

  • conda create -n myenv python=3.12
  • conda activate myenv
  • Note: Python >= 3.10 required

📦 Install Dependencies

If using poetry

  • pip install poetry
  • poetry install

If using pip

pip install -r requirements.txt

🔑 Set up .env file

Copy .env.example to .env and add your API keys

🧪 Run interactive test

python -m tests.interactive --config default_config.json --sample_request default_example.json --load_messages

  • --config: Config json filename, under configs folder
  • --sample_request: Path to the sample request file, under tests/sample_requests folder
  • --load_messages: If set, it will additionally load the initial set of messages from the sample request file. Else, user input will be required starting from the first message.

🌐 Set up server

  • First, add this directory to your PYTHONPATH, using: export PYTHONPATH=$PYTHONPATH:$(pwd)
  • For local testing: flask --app src.app.main run --port=4040
  • To set up the server on a remote machine: gunicorn -b 0.0.0.0:4040 src.app.main:app

🖥️ Run test client

python -m tests.app_client --sample_request default_example.json --api_key test

  • --sample_request: Path to the sample request file, under tests/sample_requests folder
  • --api_key: API key to use for authentication. This is the same key as the one in the .env file.

📖 More details

🔍 Specifics

  • Format: Uses OpenAI's messages format when passing messages.
  • LLMs: Currently, only OpenAI LLMs (e.g. gpt-4o, gpt-4o-mini) are supported. Easy to expand to other LLMs like Claude, Gemini or self-hosted models.
  • Responses: Here are some examples of responses that the framework can return:
    • A list of one user-facing message
    • A list of one or more tool calls
    • A list of one user-facing message and one or more tool calls
  • ⚠️ Errors: Errors are thrown as a tool call raise_error with the error message as the argument. Real-time error handling will be managed by the upstream service.

🗂️ Important directories and files

  • src/: Contains all source code for the agents app
    • src/app/: Contains Flask app which exposes the framework as a service
    • src/graph/: Contains logic to run every turn of the conversation
      • src/graph/core.py: Core graph implementation which parses the workflow config, creates agents from it and runs the turn of conversation (through the run_turn function)
    • src/swarm/: RowBoat's custom implementation of OpenAI Swarm, which is used by src/graph/core.py
  • tests/: Contains sample requests, an interactive client and a test client which mocks an upstream service
  • configs/: Contains graph configurations (changed infrequently)
  • tests/sample_requests/: Contains sample request files for the agents app

🔄 High-level flow

  • app/main.py receives the request JSON from an upstream service, parses it and sends it to src/graph/core.py
  • src/graph/core.py creates the agent graph object from scratch and uses src/swarm/core.py to run the turn
  • src/swarm/core.py runs the turn by performing actual LLM calls and internal tool invocations to transitiion between agents
  • src/graph/core.py returns the response messages and the new state to app/main.py, which relays it back to the upstream service
  • The upstream services appends any new user messages to the history of messages and sends the messages back along with the new state to app/main.py as part of the next request. The process repeats until the upstream service completes its conversation with the user.

🚫 Limitations

  • Does not support streaming currently.
  • Cannot respond with multiple user-facing messages in the same turn.

RowBoat Labs

🌐 Visit RowBoat Labs to learn more!