+
-A Cursor-like, AI-assisted, no-code IDE for building production-ready multi-agents. Start from a simple prompt to create fully functional agents with the Copilot; test them in AI-simulated scenarios; connect MCP servers and tools; interact through the Python SDK, a web widget, or a Twilio phone number; and continuously refine your agents by providing feedback to the Copilot.
+
The AI-assisted agent builder
+
-Built on OpenAI's Agents SDK, RowBoat is the fastest way to build multi-agents.
+[Quickstart](#quick-start) | [Docs](https://docs.rowboatlabs.com/) | [Website](https://www.rowboatlabs.com/) | [Discord](https://discord.gg/jHhUKkKHn8)
-[](https://www.rowboatlabs.com/)
+
+
+A Cursor-like, AI-assisted, no-code IDE for building production-ready multi-agents.
+
+- โจ Start from a simple prompt to create fully functional agents with the Copilot
+- ๐งช Test them in AI-simulated scenarios
+- ๐ Connect MCP servers and tools
+- ๐ Interact through the Python SDK, a web widget, or a Twilio phone number
+- โป๏ธ Continuously refine your agents by providing feedback to the Copilot
+
+
+
+Built on OpenAI's Agents SDK, **Rowboat is the fastest way to build multi-agents!**
+
+
+
# Quick start
## Prerequisites
-Before running RowBoat, ensure you have:
+Before running Rowboat, ensure you have:
1. **Docker Desktop**
- [Download Docker Desktop](https://www.docker.com/products/docker-desktop)
@@ -33,9 +41,9 @@ Before running RowBoat, ensure you have:
brew install mongodb-community@8.0
brew services start mongodb-community@8.0
```
- - Other platforms: Refer to the MongoDB documentation for details.
+ - Other platforms: Refer to the [MongoDB documentation](https://www.mongodb.com/docs/manual/installation/) for details.
-## Quickstart
+## Setup Rowboat
1. **Clone the Repository**
```bash
@@ -63,29 +71,95 @@ Before running RowBoat, ensure you have:
4. **Access the App**
- Visit [http://localhost:3000](http://localhost:3000).
+
+Refer to [Docs](https://docs.rowboatlabs.com/) to learn how to start building agents with Rowboat.
+
# Advanced
-## Enable RAG
+## 1. Tool Use
-RowBoat supports RAG capabilities to enhance responses with your custom knowledge base. To enable RAG, you'll need:
+You can add your tools / APIs to Rowboat through (a) connecting MCP servers, or (b) connecting a webhook.
-1. **Qdrant Vector Database**
- - **Option 1**: Use [Qdrant Cloud](https://cloud.qdrant.io/)
- - Create an account and cluster
- - Note your cluster URL and API key
- - **Option 2**: Run Qdrant locally with Docker:
- ```bash
- docker run -p 6333:6333 qdrant/qdrant
- ```
+### 1.1 MCP Servers
+
+You can intergrate any MCP server in Settings -> Tools -> MCP Server. The Tools on the servers will show up inside Rowboats Tools section.
+
+### 1.2 Webhook
+
+You can point Rowboat to any webhook in Settings -> Tools -> Webhook.
+
+Rowboat also includes a built-in webhook service that allows you to implement custom tool functions easily. To use this feature:
+
+1. **Generate Signing Secret**
+ Generate a secret for securing webhook requests:
+ ```bash
+ openssl rand -hex 32
+ ```
2. **Update Environment Variables**
```ini
- USE_RAG=true
- QDRANT_URL= # e.g., http://localhost:6333 for local
- QDRANT_API_KEY= # Only needed for Qdrant Cloud
+ SIGNING_SECRET=
```
-3. **Initialize Qdrant Collections**
+3. **Implement Your Functions**
+ Add your custom functions to `apps/tools_webhook/function_map.py`:
+ ```python
+ def get_weather(location: str, units: str = "metric"):
+ """Return weather data for the given location."""
+ # Your implementation here
+ return {"temperature": 20, "conditions": "sunny"}
+
+ def check_inventory(product_id: str):
+ """Check inventory levels for a product."""
+ # Your implementation here
+ return {"in_stock": 42, "warehouse": "NYC"}
+
+ # Add your functions to the map
+ FUNCTIONS_MAP = {
+ "get_weather": get_weather,
+ "check_inventory": check_inventory
+ }
+ ```
+
+4. **Start the Tools Webhook Service**
+ ```bash
+ docker compose --profile tools_webhook up -d
+ ```
+
+5. **Register Tools in Rowboat**
+ - Navigate to your project config at `/projects//config`
+ - Ensure that the webhook URL is set to: `http://tools_webhook:3005/tool_call`
+ - Tools will automatically be forwarded to your webhook implementation
+
+The webhook service handles all the security and parameter validation, allowing you to focus on implementing your tool logic.
+
+## 2. Retrieve Augmented Generation (RAG)
+
+Rowboat supports adding text directly, document uploads or scraping URLs to enhance the responses with your custom knowledge base. Rowboat uses Qdrant as the vector DB.
+
+### 2.1 Setup Qdrant
+To enable RAG you need to first setup Qdrant.
+
+1. Option1: Run Qdrant locally
+ - Run Qdrant docker
+ ```bash
+ docker run -p 6333:6333 qdrant/qdrant
+ ```
+ - Update environment variables
+ ```ini
+ USE_RAG=true
+ QDRANT_URL=http://localhost:6333
+ QDRANT_API_KEY= # Only needed for Qdrant Cloud
+ ```
+2. Option2: Use [Qdrant Cloud](https://cloud.qdrant.io/)
+ - Note your cluster URL and API key
+ - Update environment variables
+ ```ini
+ USE_RAG=true
+ QDRANT_URL=
+ QDRANT_API_KEY=
+ ```
+3. Initialize Qdrant Collections
```bash
docker compose --profile setup_qdrant up setup_qdrant
```
@@ -94,39 +168,42 @@ RowBoat supports RAG capabilities to enhance responses with your custom knowledg
```bash
docker compose --profile delete_qdrant up delete_qdrant
```
+### 2.2 Adding Knowledge Base for RAG
-### RAG Features
+You can add a knowledge corpus to Rowboat by directly adding text information, uploading supported files or by pointing Rowboat to URLs for scraping.
-RowBoat supports two types of knowledge base ingestion:
+#### (a) Create Text for Knowledge
-#### URL Scraping
+Setting up Qdrant automatically enables the RAG by adding text information inside Rowboat's RAG menu.
-Enable web page scraping to build your knowledge base:
+#### (b) Scrape URLs for Knowledge
-1. **Get Firecrawl API Key**
+Rowboat supports scraping urls using Firecrawl. To setup scraping:
+
+1. Get Firecrawl API Key
- Sign up at [Firecrawl](https://firecrawl.co)
- Generate an API key
-2. **Update Environment Variables**
+2. Update Environment Variables
```ini
USE_RAG_SCRAPING=true
FIRECRAWL_API_KEY=
```
-3. **Start the URLs Worker**
+3. Start the URLs Worker
```bash
docker compose --profile rag_urls_worker up -d
```
-#### File Uploads
+#### (c) Upload Files for Knowledge
-Enable file upload support (PDF, DOCX, TXT) for your knowledge base:
+Rowboat supports file uploads (PDF, DOCX, TXT) for your knowledge base. It uses Google's Gemini LLM to convert the documents to Markdown before indexing:
-1. **Prerequisites**
+1. Prerequisites
- An AWS S3 bucket for file storage
- Google Cloud API key with Generative Language (Gemini) API enabled (for enhanced document parsing)
-2. **Configure AWS S3**
+2. Configure AWS S3
- Create an S3 bucket
- Add the following CORS configuration to your bucket:
```json
@@ -173,7 +250,7 @@ Enable file upload support (PDF, DOCX, TXT) for your knowledge base:
}
```
-3. **Update Environment Variables**
+3. Update Environment Variables
```ini
USE_RAG_UPLOADS=true
AWS_ACCESS_KEY_ID=
@@ -183,63 +260,16 @@ Enable file upload support (PDF, DOCX, TXT) for your knowledge base:
GOOGLE_API_KEY=
```
-4. **Start the Files Worker**
+4. Start the Files Worker
```bash
docker compose --profile rag_files_worker up -d
```
-After enabling RAG and starting the required workers, you can manage your knowledge base through the RowBoat UI at `/projects//sources`.
+After enabling RAG and starting the required workers, you can manage your knowledge base through the Rowboat UI at `/projects//sources`.
-## Enable Tools Webhook
+## 3. Chat Widget
-RowBoat includes a built-in webhook service that allows you to implement custom tool functions. To use this feature:
-
-1. **Generate Signing Secret**
- Generate a secret for securing webhook requests:
- ```bash
- openssl rand -hex 32
- ```
-
-2. **Update Environment Variables**
- ```ini
- SIGNING_SECRET=
- ```
-
-3. **Implement Your Functions**
- Add your custom functions to `apps/tools_webhook/function_map.py`:
- ```python
- def get_weather(location: str, units: str = "metric"):
- """Return weather data for the given location."""
- # Your implementation here
- return {"temperature": 20, "conditions": "sunny"}
-
- def check_inventory(product_id: str):
- """Check inventory levels for a product."""
- # Your implementation here
- return {"in_stock": 42, "warehouse": "NYC"}
-
- # Add your functions to the map
- FUNCTIONS_MAP = {
- "get_weather": get_weather,
- "check_inventory": check_inventory
- }
- ```
-
-4. **Start the Tools Webhook Service**
- ```bash
- docker compose --profile tools_webhook up -d
- ```
-
-5. **Register Tools in RowBoat**
- - Navigate to your project config at `/projects//config`
- - Ensure that the webhook URL is set to: `http://tools_webhook:3005/tool_call`
- - Tools will automatically be forwarded to your webhook implementation
-
-The webhook service handles all the security and parameter validation, allowing you to focus on implementing your tool logic.
-
-## Enable Chat Widget
-
-RowBoat provides an embeddable chat widget that you can add to any website. To enable and use the chat widget:
+Rowboat provides an embeddable chat widget that you can add to any website. To enable and use the chat widget:
1. **Generate JWT Secret**
Generate a secret for securing chat widget sessions:
@@ -261,42 +291,12 @@ RowBoat provides an embeddable chat widget that you can add to any website. To e
4. **Add Widget to Your Website**
You can find the chat-widget embed code under `/projects//config`
-After setup, the chat widget will appear on your website and connect to your RowBoat project.
+After setup, the chat widget will appear on your website and connect to your Rowboat project.
-## Enable Authentication
-By default, RowBoat runs without authentication. To enable user authentication using Auth0:
+### 4. Interact with Rowboat API
-1. **Auth0 Setup**
- - **Create an Auth0 Account**: Sign up at [Auth0](https://auth0.com).
- - **Create a New Application**: Choose "Regular Web Application", select "Next.js" as the application type, and name it "RowBoat".
- - **Configure Application**:
- - **Allowed Callback URLs**: In the Auth0 Dashboard, go to your "RowBoat" application settings and set `http://localhost:3000/api/auth/callback` as an Allowed Callback URL.
- - **Get Credentials**: Collect the following from your Auth0 application settings:
- - **Domain**: Copy your Auth0 domain (ensure you append `https://` to the Domain that the Auth0 dashboard shows you)
- - **Client ID**: Your application's unique identifier
- - **Client Secret**: Your application's secret key
- - **Generate secret**: Generate a session encryption secret in your terminal and note the output for later:
- ```bash
- openssl rand -hex 32
- ```
-
-2. **Update Environment Variables**
- Add the following to your `.env` file:
- ```ini
- USE_AUTH=true
- AUTH0_SECRET=your-generated-secret # Generated using openssl command
- AUTH0_BASE_URL=http://localhost:3000 # Your application's base URL
- AUTH0_ISSUER_BASE_URL=https://example.auth0.com # Your Auth0 domain (ensure it is prefixed with https://)
- AUTH0_CLIENT_ID=your-client-id
- AUTH0_CLIENT_SECRET=your-client-secret
- ```
-
-After enabling authentication, users will need to sign in to access the application.
-
-## Interact with RowBoat API
-
-There are two ways to interact with RowBoat's API:
+There are two ways to interact with Rowboat's API:
1. **Option 1: Python SDK**
@@ -366,18 +366,35 @@ There are two ways to interact with RowBoat's API:
}
```
-## Troubleshooting
+### 5. Authentication
-1. **MongoDB Connection Issues**
- - Ensure local MongoDB service is running: `brew services list`
- - Verify connection string and network connectivity.
+By default, Rowboat runs without authentication. To enable user authentication using Auth0:
-2. **Container Start-up Issues**
- - Remove all containers: `docker-compose down`
- - Rebuild: `docker-compose up --build`
+1. **Auth0 Setup**
+ - **Create an Auth0 Account**: Sign up at [Auth0](https://auth0.com).
+ - **Create a New Application**: Choose "Regular Web Application", select "Next.js" as the application type, and name it "Rowboat".
+ - **Configure Application**:
+ - **Allowed Callback URLs**: In the Auth0 Dashboard, go to your "Rowboat" application settings and set `http://localhost:3000/api/auth/callback` as an Allowed Callback URL.
+ - **Get Credentials**: Collect the following from your Auth0 application settings:
+ - **Domain**: Copy your Auth0 domain (ensure you append `https://` to the Domain that the Auth0 dashboard shows you)
+ - **Client ID**: Your application's unique identifier
+ - **Client Secret**: Your application's secret key
+ - **Generate secret**: Generate a session encryption secret in your terminal and note the output for later:
+ ```bash
+ openssl rand -hex 32
+ ```
-3. **Sign-in Button Not Appearing**
- - If the sign-in button does not appear in the UI, ensure the Auth0 domain in your `.env` file is prefixed with `https://`.
+2. **Update Environment Variables**
+ Add the following to your `.env` file:
+ ```ini
+ USE_AUTH=true
+ AUTH0_SECRET=your-generated-secret # Generated using openssl command
+ AUTH0_BASE_URL=http://localhost:3000 # Your application's base URL
+ AUTH0_ISSUER_BASE_URL=https://example.auth0.com # Your Auth0 domain (ensure it is prefixed with https://)
+ AUTH0_CLIENT_ID=your-client-id
+ AUTH0_CLIENT_SECRET=your-client-secret
+ ```
+
+After enabling authentication, users will need to sign in to access the application.
-## Attribution
-Our agents framework is built on top of [OpenAI Swarm](https://github.com/openai/swarm) with custom enhancements and improvements. Check the [NOTICE](https://github.com/rowboatlabs/rowboat/blob/main/apps/agents/NOTICE.md) for attribution and license.
+
diff --git a/apps/copilot/copilot.py b/apps/copilot/copilot.py
index ac108654..035029be 100644
--- a/apps/copilot/copilot.py
+++ b/apps/copilot/copilot.py
@@ -197,7 +197,7 @@ Note:
4. Add any escalation related request to the escalation agent.
5. Add any post processing or style related request to the post processing agent.
6. Add you thoughts or plans to the plan section.
-7. When you are suggeting a set of actions, add a text section that describes the changes being made before and after the actions.
+7. When you are suggesting a set of actions, add a text section that describes the changes being made before and after the actions.
8. After providing the actions, add a text section with something like 'Once you review and apply the high-level plan, you can try out a basic chat first. I can then help you better configure each agent.'
9. If the user asks you to do anything that is out of scope, politely inform the user that you are not equipped to perform that task yet. E.g. "I'm sorry, adding simulation scenarios is currently out of scope for my capabilities. Is there anything else you would like me to do?"
@@ -257,11 +257,12 @@ Note : Always add a text section that describes the changes before each action.
**NOTE**: The output should be a valid JSON object. Do not include any other text or comments. Do not wrap the output in a code block.
+**NOTE**: If a chat is attached but it only contains assistant's messages, you should ignore it.
## Section 11: Examples
### Example 1:
-User: create a system to handle 2fa related customer support queries for a banking app. The queries can be: 1. setting up 2fa : ask the users preferred methods 2. changing 2fa : chaing the 2fa method 3. troubleshooting : not getting 2fa codes etc.
+User: create a system to handle 2fa related customer support queries for a banking app. The queries can be: 1. setting up 2fa : ask the users preferred methods 2. changing 2fa : changing the 2fa method 3. troubleshooting : not getting 2fa codes etc.
Copilot output:
diff --git a/apps/docs/docs/img/favicon.ico b/apps/docs/docs/img/favicon.ico
index fdd613fa..fcd3c110 100644
Binary files a/apps/docs/docs/img/favicon.ico and b/apps/docs/docs/img/favicon.ico differ
diff --git a/apps/rowboat/app/android-chrome-192x192.png b/apps/rowboat/app/android-chrome-192x192.png
index abf2f7fd..c1dc119b 100644
Binary files a/apps/rowboat/app/android-chrome-192x192.png and b/apps/rowboat/app/android-chrome-192x192.png differ
diff --git a/apps/rowboat/app/android-chrome-512x512.png b/apps/rowboat/app/android-chrome-512x512.png
index 24d0b856..4c1b0483 100644
Binary files a/apps/rowboat/app/android-chrome-512x512.png and b/apps/rowboat/app/android-chrome-512x512.png differ
diff --git a/apps/rowboat/app/app.tsx b/apps/rowboat/app/app.tsx
index 7437d7a0..549d8637 100644
--- a/apps/rowboat/app/app.tsx
+++ b/apps/rowboat/app/app.tsx
@@ -1,7 +1,7 @@
'use client';
import { TypewriterEffect } from "./lib/components/typewriter";
import Image from 'next/image';
-import logo from "@/public/rowboat-logo.png";
+import logo from "@/public/logo.png";
import { useUser } from "@auth0/nextjs-auth0/client";
import { useRouter } from "next/navigation";
import { Spinner } from "@heroui/react";
diff --git a/apps/rowboat/app/apple-touch-icon.png b/apps/rowboat/app/apple-touch-icon.png
index 9cfacfe3..b3fdcd27 100644
Binary files a/apps/rowboat/app/apple-touch-icon.png and b/apps/rowboat/app/apple-touch-icon.png differ
diff --git a/apps/rowboat/app/favicon-16x16.png b/apps/rowboat/app/favicon-16x16.png
index 1e9b385a..fe162395 100644
Binary files a/apps/rowboat/app/favicon-16x16.png and b/apps/rowboat/app/favicon-16x16.png differ
diff --git a/apps/rowboat/app/favicon-32x32.png b/apps/rowboat/app/favicon-32x32.png
index 3f97ece4..1b69f1f4 100644
Binary files a/apps/rowboat/app/favicon-32x32.png and b/apps/rowboat/app/favicon-32x32.png differ
diff --git a/apps/rowboat/app/favicon.ico b/apps/rowboat/app/favicon.ico
index fdd613fa..fcd3c110 100644
Binary files a/apps/rowboat/app/favicon.ico and b/apps/rowboat/app/favicon.ico differ
diff --git a/apps/rowboat/app/globals.css b/apps/rowboat/app/globals.css
index 25bf132f..d7b5d1bb 100644
--- a/apps/rowboat/app/globals.css
+++ b/apps/rowboat/app/globals.css
@@ -7,6 +7,32 @@
.text-balance {
text-wrap: balance;
}
+ .custom-scrollbar {
+ scrollbar-width: thin;
+ scrollbar-color: #E4E4E7 transparent;
+ }
+
+ .custom-scrollbar::-webkit-scrollbar {
+ width: 6px;
+ }
+
+ .custom-scrollbar::-webkit-scrollbar-track {
+ background: transparent;
+ }
+
+ .custom-scrollbar::-webkit-scrollbar-thumb {
+ background-color: #E4E4E7;
+ border-radius: 3px;
+ }
+
+ /* Dark mode */
+ .dark .custom-scrollbar {
+ scrollbar-color: #3F3F46 transparent;
+ }
+
+ .dark .custom-scrollbar::-webkit-scrollbar-thumb {
+ background-color: #3F3F46;
+ }
}
html, body {
@@ -67,6 +93,27 @@ html, body {
--chart-4: 280 65% 60%;
--chart-5: 340 75% 55%;
}
+ /* Define a card class that will be used for all card-like components */
+ .card {
+ @apply rounded-xl border p-4
+ border-[#E5E7EB] dark:border-[#2E2E30]
+ bg-white dark:bg-[#1C1C1E]
+ shadow-[0_2px_8px_rgba(0,0,0,0.04)]
+ transition-all duration-200 ease-in-out;
+ }
+
+ .card:hover {
+ @apply shadow-[0_4px_12px_rgba(0,0,0,0.06)]
+ transform translate-y-[-1px];
+ }
+
+ /* Update input styles */
+ input, textarea, select {
+ @apply rounded-lg border-[#E5E7EB] dark:border-[#2E2E30]
+ bg-[#F3F4F6] dark:bg-[#2A2A2D]
+ focus:ring-2 focus:ring-indigo-500 focus:ring-opacity-50
+ transition-all duration-200;
+ }
}
@layer base {
@@ -88,6 +135,20 @@ html, body {
.border-subtle {
@apply border-border dark:border-border/50;
}
+
+ /* Apply rounded corners to common interactive elements by default */
+ button,
+ input,
+ textarea,
+ select,
+ [role="button"],
+ .card,
+ .input,
+ .select,
+ .textarea,
+ .button {
+ @apply !rounded-lg;
+ }
}
* {
@@ -97,4 +158,27 @@ html, body {
* {
@apply transition-colors duration-200;
-}
\ No newline at end of file
+}
+
+/* Add Inter font */
+@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600&display=swap');
+
+/* Set base font */
+html {
+ font-family: 'Inter', system-ui, -apple-system, sans-serif;
+}
+
+@keyframes slideUpAndFade {
+ from {
+ opacity: 0;
+ transform: translateY(10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.animate-slideUpAndFade {
+ animation: slideUpAndFade 0.2s ease-out forwards;
+}
\ No newline at end of file
diff --git a/apps/rowboat/app/lib/components/copy-button.tsx b/apps/rowboat/app/lib/components/copy-button.tsx
deleted file mode 100644
index 28108d18..00000000
--- a/apps/rowboat/app/lib/components/copy-button.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-'use client';
-import { CopyIcon, CheckIcon } from "lucide-react";
-import { useState } from "react";
-
-export function CopyButton({
- onCopy,
- label,
- successLabel,
-}: {
- onCopy: () => void;
- label: string;
- successLabel: string;
-}) {
- const [showCopySuccess, setShowCopySuccess] = useState(false);
- const handleCopy = () => {
- onCopy();
- setShowCopySuccess(true);
- setTimeout(() => {
- setShowCopySuccess(false);
- }, 500);
- }
- return
-}
\ No newline at end of file
diff --git a/apps/rowboat/app/lib/components/dropdown.tsx b/apps/rowboat/app/lib/components/dropdown.tsx
index bf41a941..e0ea79b8 100644
--- a/apps/rowboat/app/lib/components/dropdown.tsx
+++ b/apps/rowboat/app/lib/components/dropdown.tsx
@@ -1,4 +1,4 @@
-import { Select, SelectItem } from "@heroui/react";
+import { Select, SelectItem, Button } from "@heroui/react";
import { ReactNode } from "react";
export interface DropdownOption {
@@ -8,24 +8,27 @@ export interface DropdownOption {
interface DropdownProps {
options: DropdownOption[];
- value: string;
+ value?: string;
onChange: (value: string) => void;
className?: string;
+ placeholder?: string;
}
export function Dropdown({
options,
value,
onChange,
- className = "w-60"
+ className = "w-60",
+ placeholder
}: DropdownProps) {
return (