# Project export: Honeycomb

This document was generated by HackStack to give an AI agent context about a hackathon project. Sections are labeled with their provenance; content marked as truncated was cut to keep this document small.

## Project metadata

- Hackathon: TreeHacks 2025
- Tagline: From Natural Language to Intelligent Action: Your AI Workflow, Evolved. Seamlessly coordinate specialized AI agents to turn simple language commands into complex, automated enterprise workflows.
- Devpost: https://devpost.com/software/coeus-pfvn7c
- GitHub: https://github.com/jasondu7297/honeycomb
- Video: https://www.youtube.com/embed/mHJpF4UJrWw?enablejsapi=1&hl=en_US&rel=0&start=&version=3&wmode=transparent
- Team: 3 GitHub contributor(s) — Alex Cholmsky (36 commits), Adrian Davila (26 commits), Jason Du (14 commits)

## Devpost submission (written by the team)

### Inspiration

Garry Tan’s post about building a secure, user-focused AI app store sparked an idea that inspired us—the need for a platform that seamlessly integrates new AI capabilities without requiring developers to reinvent the wheel. We envisioned an environment where multiple language models could coexist, enabling users to experiment with prompts, connect data sources, and transform natural language into powerful workflows. We also recognize enterprises’ growing desire to streamline and automate their workflows—we decided to build a workflow automation platform that encompasses these traits, emphasizing data control, shared memory, and user-centric design that empowers both technical and non-technical users to specify tasks in natural language.

### What it does

Honeycomb is a unified platform for experimenting with AI models, building sophisticated workflows, and seamlessly integrating data sources: AI Platform: Access different language models in a single, secure environment. Prompt Experimentation: Easily compare results across multiple models by tweaking prompts and observing outcomes in real time. Workflow Automation: Use natural language to design multi-step processes. If an error occurs at any step, the system can roll back and retry from that point forward. Unified Memory – All models and agents share the same memory and context, ensuring a seamless and consistent workflow all in one environment. Interactive Data Visualization – The platform features an interactive timeline visualizer that maps out each step taken by the orchestrator and agents. Users can modify inputs and outputs at any stage, track branching when agents explore alternate trajectories, and view changes made through user adjustments to the workflow. Agent-Orchestrated: Let specialized agents take on tasks (like searching emails or scheduling in Google Calendar), all orchestrated by a central “chain of thought.” Enterprise-Ready: Scalable from a personal productivity tool up to large enterprise workflows, integrating directly with existing cloud and on-prem data.

### How we built it

We combined several powerful tools and technologies to bring Honeycomb to life: LangChain: Specifically LangGraph helped facilitate building complex multi-agent graphs, building specialized agents, and managing advanced prompts. Codeium’s WindSurf IDE: Despite being back-end engineers at heart, we utilized WindSurf IDE to build a functional and interactive front end. This IDE offered agent-based components that made creating our own agents very fun and easy. OpenAI: The first language model we integrated, providing robust text generation and conversational capabilities. Google Suite APIs: Created dedicated agents for Gmail, Google Calendar, Drive, and Search to automate tasks within the Google ecosystem. Elasticsearch VectorDB: Stores historical chat data and context, enabling quick vector searches and large-scale retrieval for RAG (Retrieval-Augmented Generation).

### Challenges we ran into

Front-End Development: As primarily back-end engineers, building an interactive UI was a learning curve. WindSurf IDE helped us accelerate this process, but we still had to adapt to new technologies quickly. Chaining Complexity: Implementing robust “chain of thought” logic required careful design. If one task fails, the system needs to backtrack seamlessly and re-run subsequent tasks. Degradation when Number of Tools Increase: There is a clear trade-off between the number of agents you can provide to your orchestrator, and the orchestrator's abilities to effectively handle complex workflows. With the strong desire to continue growing this platform, we explored ways to optimize decision-making within the orchestrator, allowing it to intelligently allocate resources and construct workflows more effectively. Scalability: Designing for individuals and large enterprises alike meant ensuring our architecture could handle numerous models and tools.

### Accomplishments we're proud of

Modular Orchestrator: We successfully built a chain-of-thought orchestrator that can dynamically break down prompts, handle errors mid-flow, and resume tasks without losing context. Seamless App Store Approach: We proved the viability of the AI App Store idea by integrating multiple models, data sources, and specialized agents into one platform. Unified Experience: Our platform keeps chat context, data visualization, and workflow automation under one roof, drastically reducing the need for multiple, disconnected apps. Developer Ease of Use – Designed for seamless integration, the bring up of tools and agents is easy and can take as quickly as a few minutes. We envision a community-driven marketplace where developers can effortlessly add and share new models, expanding the platform’s capabilities.

### What we learned

Iterative Development: Building a system that can roll back and retry tasks requires a deeper understanding of stateful workflows, concurrency, and error handling. Collaboration with Tools: Embracing Codeium’s WindSurf IDE and specialized agents taught us the importance of letting powerful tools handle repetitive or boilerplate tasks, leaving us to focus on core functionality.

### What's next

Expanded LLM Support: Integrating more language models (e.g., Anthropic, Cohere, and local LLaMA instances) for broader capabilities and user choice. Extended Agent Ecosystem: Developing new agents for popular third-party services (e.g., Slack, Trello, AWS) to further automate enterprise workflows. Fine-Grained Access Control – Providing users with detailed permission settings, allowing them to specify which data sources each model can access, ensuring greater privacy, security, and customization. App Store Launch: Creating a dedicated marketplace where developers can publish “AI apps” (pre-configured agents and workflows), and users can discover and safely install them. Developer Extensions – Open-sourcing key components to foster a collaborative ecosystem where developers can contribute new models, agents, and features. Benchmarking and Performance Optimizations – Continuously refining the platform to enhance efficiency, responsiveness, and overall user experience for both developers and end users. We’re excited about Honeycomb's potential to transform how we interact with AI in everyday life—whether it’s for personal productivity or large-scale enterprise solutions.

## README (from the GitHub repository)

# Honeycomb - Repeatable Workflows via Natural Language

[Devpost](https://devpost.com/software/coeus-pfvn7c)

Our project enables **_Repeatable Workflows via Natural Language_**, automating multi-step processes with ease. It connects to a number of data sources and uses agents to take actions during execution. Workflows are saved as checkpointed graphs for reliability. RAG-powered memory preserves context for adaptive automation.

Refer to the [Devpost](https://devpost.com/software/coeus-pfvn7c) for more details.

## Running the Project

### Requirements

- Docker & Docker Compose [(installable via Docker Desktop)](https://www.docker.com/products/docker-desktop/)
- `Python >= 3.12`

### Setup & Startup

All of the following commands should be run from the root `honeycomb/` directory.

```sh
# Create a virtual environment and install Python dependencies
./scripts/create_python_env.sh

# Activate the venv
source .venv/bin/activate

# Spin up a local ElasticSearch database
docker compose up

# Start the API
./scripts/start_api.sh
```

### Starting the web app

From `honeycomb/apps/coeus-fe/`

```sh
npm i
npm run start
```


## Detected evidence (automated analysis)

Indexed codebase: 50 recognized source files, 116 KB.
- CSS (language) — detected in the code
- Firebase (technology) — detected in the code
- HTML (language) — detected in the code
- JavaScript (language) — detected in the code
- Python (language) — detected in the code
- React (technology) — detected in the code
- LangChain (technology) — claimed on Devpost, not found in the code
- OpenAI (technology) — claimed on Devpost, not found in the code

## Codebase structure (from repository index)

### Files (56 of 56)

```
.gitignore
apps/api/config.py
apps/api/requirements/base.txt
apps/api/src/agents/Agent.py
apps/api/src/agents/AgentRegistry.py
apps/api/src/agents/GCalendarAgent.py
apps/api/src/agents/GDriveAgent.py
apps/api/src/agents/GMailAgent.py
apps/api/src/agents/GSearchAgent.py
apps/api/src/agents/RAGAgent.py
apps/api/src/agents/README.md
apps/api/src/main.py
apps/api/src/memory/db.py
apps/api/src/memory/embeddings.py
apps/api/src/memory/models.py
apps/api/src/memory/router.py
apps/api/src/memory/service.py
apps/api/src/runner.py
apps/api/src/tools/GCalendarTool.py
apps/api/src/tools/GDriveTool.py
apps/api/src/tools/GMailTool.py
apps/api/src/tools/GSearchTool.py
apps/api/src/utils/extract_state_fields.py
apps/api/src/utils/prompts.py
apps/api/src/workflows/Graph.py
apps/api/src/workflows/History.py
apps/api/src/workflows/router.py
apps/api/src/workflows/Workflow.py
apps/coeus-fe/.gitignore
apps/coeus-fe/package.json
apps/coeus-fe/public/index.html
apps/coeus-fe/public/manifest.json
apps/coeus-fe/public/robots.txt
apps/coeus-fe/README.md
apps/coeus-fe/src/App.css
apps/coeus-fe/src/App.js
apps/coeus-fe/src/App.test.js
apps/coeus-fe/src/components/ChatInterface.js
apps/coeus-fe/src/components/CoeusHeader.js
apps/coeus-fe/src/components/GraphComponent.js
apps/coeus-fe/src/components/PictureArea.js
apps/coeus-fe/src/components/Sidebar.js
apps/coeus-fe/src/components/ToolsGrid.js
apps/coeus-fe/src/index.css
apps/coeus-fe/src/index.js
apps/coeus-fe/src/reportWebVitals.js
apps/coeus-fe/src/setupTests.js
apps/coeus-fe/src/styles/chatInterface.css
apps/coeus-fe/src/utils/transformStateHistory.js
docker-compose.yml
README.md
scripts/create_python_env.sh
scripts/install_python_deps.sh
scripts/parse_gpt_history.py
scripts/start_api.sh
todo.md
```

### Dependencies

- apps/coeus-fe/package.json: @react-oauth/google@^0.12.1, @testing-library/dom@^10.4.0, @testing-library/jest-dom@^6.6.3, @testing-library/react@^16.2.0, @testing-library/user-event@^13.5.0, firebase@^11.3.1, react@^19.0.0, react-dom@^19.0.0, react-router-dom@^7.1.5, react-scripts@5.0.1, reactflow@^11.11.4, web-vitals@^2.1.4

### Recent commits (newest first)

- readme final changes
- headshot alex
- Merge branch 'main' of https://github.com/jasondu7297/coeus
- new honeycomb logo
- Merge branch 'main' of github.com:jasondu7297/coeus
- src
- update manifest.json
- polus logo
- Merge branch 'main' of https://github.com/jasondu7297/coeus
- fe clean up
- Add pipeline runner and misc clean ups
- added explore embeddings button
- add checkpoint to node creation
- Register remaining GSuite agents
- fix history update
- adding branching to main
- Merge pull request #6 from jasondu7297/viz_snapshot
- Merge branch 'main' of https://github.com/jasondu7297/coeus into viz_snapshot
- stop extract_fields from running in the background whoops
- branching from chatInterface

## Key source files (fetched from GitHub, selected and truncated for size)

### todo.md

```markdown
# Todo

## Adrian

- [ ] Look into `Context: Best AI Employee Workflow` prize.
- [ ] Use elastic serverless cluster.
- [ ] Add script to cleanup elastic if needed.
- [ ] A bit of Python tooling (mainly formatting).
- [ ] Telemetry with elastic + elastic dashboards for elastic prize
- [X] RAG agent
- [ ] Make sure someone can build our project by following our README
- [ ] fix our python packaging issues

## Jason

- [ ] Pipeline Runner

```

### docker-compose.yml

```yaml
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
    ports:
      - "9200:9200"
      - "9300:9300"
    volumes:
      - es_data:/usr/share/elasticsearch/data
    restart: unless-stopped

volumes:
  es_data:
    driver: local

```

### apps/coeus-fe/package.json

```
{
  "name": "coeus-fe",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@react-oauth/google": "^0.12.1",
    "@testing-library/dom": "^10.4.0",
    "@testing-library/jest-dom": "^6.6.3",
    "@testing-library/react": "^16.2.0",
    "@testing-library/user-event": "^13.5.0",
    "firebase": "^11.3.1",
    "react": "^19.0.0",
    "react-dom": "^19.0.0",
    "react-router-dom": "^7.1.5",
    "react-scripts": "5.0.1",
    "reactflow": "^11.11.4",
    "web-vitals": "^2.1.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

```

### apps/coeus-fe/src/index.js

```javascript
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

```

### apps/api/src/main.py

```python
from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import StreamingResponse
from src.memory.router import router as memory_router
from src.runner import Runner
from src.workflows.router import router as workflows_router
from src.utils.extract_state_fields import parse_all_snapshots
from src.workflows.History import WorkflowHistory

app = FastAPI()

# Add CORS middleware
app.add_middleware(
    CORSMiddleware,
    allow_origins=["http://localhost:3000", "http://localhost:8000"],  # Allow requests from your React app's origin
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# Sample route
@app.get("/")
def read_root():
    return {"message": "Hello, FastAPI!"}

app.include_router(memory_router, prefix='/memory')
app.include_router(workflows_router, prefix='/history')

@app.post("/run")
async def run(request: Request):
    # Parse the JSON body for the user message
    data = await request.json()
    user_input = data.get("message", "Who was the 10th US president?")

    # Create a generator that yields output from TestRunner.run()
    def event_generator():
        runner = Runner()
        for output in runner.run(user_input):
            yield output

    return StreamingResponse(event_generator(), media_type="text/plain")

```

### apps/coeus-fe/src/App.js

```javascript
import React from 'react';
import ToolsGrid from './components/ToolsGrid';
import Sidebar from './components/Sidebar';
import PictureArea from './components/PictureArea';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import ChatInterface from './components/ChatInterface';

function App() {
  // Sample data to display in the Tools grid
  const myTools = [
    { id: 1, name: 'Perplexity', imageUrl: '/icons/perplexity-ai-icon.png' },
    { id: 2, name: 'Gmail', imageUrl: '/icons/gmail_icon.png' },
    { id: 3, name: 'Google Drive', imageUrl: '/icons/google_drive_icon.png' },
    { id: 4, name: 'Google Search', imageUrl: '/icons/google-icon-rounded.png' },
  ];
  
  const myModels = [
    { id: 1, name: 'OpenAI', imageUrl: '/icons/open_ai_icon.png' },
    { id: 2, name: 'Gemini', imageUrl: '/icons/gemini_icon.png' },
    { id: 3, name: 'Mistral AI', imageUrl: '/icons/mistral_ai.png' },
  ];
  

  // Dark, futuristic theme styles
  const styles = {
    appContainer: {
      display: 'flex',
      height: '100vh',
      margin: 0,
      background: 'linear-gradient(180deg, #4e1655 0%, #0d080e 100%)',
      fontFamily: 'Arial, sans-serif',
      color: '#FFFFFF',
    },
    mainContent: {
      flex: 1,
      display: 'flex',
      flexDirection: 'column',
      padding: '20px',
      boxSizing: 'border-box',
    },
  };

  // Tab state for switching between My Tools and My Data
  const [activeTab, setActiveTab] = React.useState('tools');

  return (
    <Router>
      <Routes>
        <Route
          path="/"
          element={
            <div style={styles.appContainer}>
              {/* Sidebar */}
              <Sidebar />

              {/* Main Content */}
              <div style={styles.mainContent}>
                {/* Picture Area */}
                <PictureArea activeTab={activeTab} setActiveTab={setActiveTab} />

                {/* Tools or Data Grid */}
                {activeTab === 'tools' ? (
                  <ToolsGrid tools={myTools} />
                ) : (
                  <ToolsGrid tools={myModels} />
                )}
              </div>
            </div>
          }
        />
        <Route path="/chat" element={<ChatInterface />} />
      </Routes>
    </Router>
  );
}

export default App;

```

### scripts/install_python_deps.sh

```shell
#!/bin/bash

pip install -r apps/api/requirements/base.txt

```

### scripts/create_python_env.sh

```shell
#!/bin/bash

# create Python virtual environment
python3 -m venv .venv
source .venv/bin/activate

# install project dependencies
source install_python_deps.sh

```

### scripts/start_api.sh

```shell
#!/bin/bash

# Identify the repo root and [cd] to the root so we are always running the script from somewhere consistent 
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
export REPO_ROOT="$(cd ${SCRIPT_DIR} && git rev-parse --show-superproject-working-tree --show-toplevel | head -1)"

cd ${REPO_ROOT}

# Set the [PYTHONPATH] to the root of the [api]. Since this is our only Python project, this works nicely and solves
# our issues with module discovery.
# Run the [api] from the api/ directory
cd apps/api
PYTHONPATH=$(pwd) uvicorn src.main:app --reload

```

### scripts/parse_gpt_history.py

```python
"""
This script parses an exported ChatGPT [conversations.json], generates embeddings from it,
and generates the required files to visualize it with Wizmap.

requirements:
------------
wizmap
numpy<2.0
umap-learn
sentence-transformers
"""

import json
import wizmap

from pathlib import Path
from sentence_transformers import SentenceTransformer
from umap import UMAP

######################################################
# CONSTANTS
######################################################

file = "conversations.json"
N_DIMENSIONS = 384

######################################################
# DATA INGESTION
######################################################

data = json.loads(Path(file).open().read())

######################################################
# EMBEDDING MODEL
######################################################

model = SentenceTransformer("all-MiniLM-L6-v2", truncate_dim=N_DIMENSIONS)

def embedding_of_text(text: str):
    return model.encode(text).tolist()

######################################################
# PARSE GPT HISTORY AND PRODUCE EMBEDDINGS
######################################################

texts = []
embeddings = []

for conversation in data[:1250]:
    print(conversation["title"])
    for message in conversation["mapping"].values():
        if (
            message["message"] is None
            or message["message"]["content"]["content_type"] != "text"
        ):
            continue
        if not message["message"]["content"]["parts"]:
            continue

        for part in message["message"]["content"]["parts"]:
            if not part:
                continue
            texts.append(part)


print(len(texts))
for text in texts:
    embeddings.append(embedding_of_text(text))

######################################################
# DIMENSIONALITY REDUCTION
######################################################

reducer = UMAP(metric="cosine")
embeddings_2d = reducer.fit_transform(embeddings)

######################################################
# PRODUCE WIZMAP OUTPUT
######################################################

xs = embeddings_2d[:, 0].astype(float).tolist()
ys = embeddings_2d[:, 1].astype(float).tolist()
data_list = wizmap.generate_data_list(xs, ys, texts)
grid_dict = wizmap.generate_grid_dict(xs, ys, texts, "Chat History")

######################################################
# EXPORT DATA
######################################################

wizmap.save_json_files(data_list, grid_dict, output_dir="./")

```

[38 more indexed source files omitted to keep this export small. The full file list is in the Codebase structure section above.]