dexter Documentation

An autonomous agent for deep financial research

27,499 stars TypeScript TypeScript 1 file ยท ~3,163 tokens
RAW Doc

File: README.md

Dexter ๐Ÿค–

Dexter is an autonomous financial research agent that thinks, plans, and learns as it works. It performs analysis using task planning, self-reflection, and real-time market data. Think Claude Code, but built specifically for financial research.

Table of Contents

โš ๏ธ Disclaimer

This project is for educational, entertainment, and informational purposes only. It is not intended for real trading or investment.

  • Not financial, investment, tax, or legal advice
  • No guarantees of accuracy, completeness, or fitness for any purpose
  • Outputs may be incorrect, incomplete, or out of date
  • Creator and contributors assume no liability for any financial losses or damages
  • Consult a licensed financial advisor before making investment decisions
  • Past performance does not indicate future results

By using this software, you agree to use it solely for learning and informational purposes and accept all risks associated with its use.

๐Ÿ‘‹ Overview

Dexter takes complex financial questions and turns them into clear, step-by-step research plans. It runs those tasks using live market data, checks its own work, and refines the results until it has a confident, data-backed answer.

Key Capabilities:

  • Intelligent Task Planning: Automatically decomposes complex queries into structured research steps
  • Autonomous Execution: Selects and executes the right tools to gather financial data
  • Self-Validation: Checks its own work and iterates until tasks are complete
  • Real-Time Financial Data: Access to income statements, balance sheets, and cash flow statements
  • Safety Features: Built-in loop detection and step limits to prevent runaway execution

โœ… Prerequisites

  • Bun runtime (v1.0 or higher)
  • OpenAI API key (get here)
  • Financial Datasets API key (get here)
  • Exa API key (get here) - optional, for web search

Installing Bun

If you don't have Bun installed, you can install it using curl:

macOS/Linux:

bash
curl -fsSL https://bun.com/install | bash

Windows:

bash
powershell -c "irm bun.sh/install.ps1|iex"

After installation, restart your terminal and verify Bun is installed:

bash
bun --version

๐Ÿ’ป How to Install

  1. Clone the repository:
bash
git clone https://github.com/virattt/dexter.git
cd dexter
  1. Install dependencies with Bun:
bash
bun install
  1. Set up your environment variables:
bash
# Copy the example environment file
cp env.example .env

# Edit .env and add your API keys (if using cloud providers)
# OPENAI_API_KEY=your-openai-api-key
# ANTHROPIC_API_KEY=your-anthropic-api-key (optional)
# GOOGLE_API_KEY=your-google-api-key (optional)
# XAI_API_KEY=your-xai-api-key (optional)
# OPENROUTER_API_KEY=your-openrouter-api-key (optional)

# Institutional-grade market data for agents
# FINANCIAL_DATASETS_API_KEY=your-financial-datasets-api-key

# (Optional) If using Ollama locally
# OLLAMA_BASE_URL=http://127.0.0.1:11434

# Web Search (Exa preferred, Tavily fallback)
# EXASEARCH_API_KEY=your-exa-api-key
# TAVILY_API_KEY=your-tavily-api-key

๐Ÿš€ How to Run

Run Dexter in interactive mode:

bash
bun start

Or with watch mode for development:

bash
bun dev

๐Ÿ“Š How to Evaluate

Dexter includes an evaluation suite that tests the agent against a dataset of financial questions. Evals use LangSmith for tracking and an LLM-as-judge approach for scoring correctness.

Run on all questions:

bash
bun run src/evals/run.ts

Run on a random sample of data:

bash
bun run src/evals/run.ts --sample 10

The eval runner displays a real-time UI showing progress, current question, and running accuracy statistics. Results are logged to LangSmith for analysis.

๐Ÿ› How to Debug

Dexter logs all tool calls to a scratchpad file for debugging and history tracking. Each query creates a new JSONL file in .dexter/scratchpad/.

Scratchpad location:

text
.dexter/scratchpad/
โ”œโ”€โ”€ 2026-01-30-111400_9a8f10723f79.jsonl
โ”œโ”€โ”€ 2026-01-30-143022_a1b2c3d4e5f6.jsonl
โ””โ”€โ”€ ...

Each file contains newline-delimited JSON entries tracking:

  • init: The original query
  • tool_result: Each tool call with arguments, raw result, and LLM summary
  • thinking: Agent reasoning steps

Example scratchpad entry:

json
{"type":"tool_result","timestamp":"2026-01-30T11:14:05.123Z","toolName":"get_income_statements","args":{"ticker":"AAPL","period":"annual","limit":5},"result":{...},"llmSummary":"Retrieved 5 years of Apple annual income statements showing revenue growth from $274B to $394B"}

This makes it easy to inspect exactly what data the agent gathered and how it interpreted results.

๐Ÿ“ฑ How to Use with WhatsApp

Chat with Dexter through WhatsApp by linking your phone to the gateway. Messages you send to yourself are processed by Dexter and responses are sent back to the same chat.

Quick start:

bash
# Link your WhatsApp account (scan QR code)
bun run gateway:login

# Start the gateway
bun run gateway

Then open WhatsApp, go to your own chat (message yourself), and ask Dexter a question.

For detailed setup instructions, configuration options, and troubleshooting, see the WhatsApp Gateway README.

๐Ÿค How to Contribute

  1. Fork the repository
  2. Create a feature branch
  3. Commit your changes
  4. Push to the branch
  5. Create a Pull Request

Important: Please keep your pull requests small and focused. This will make it easier to review and merge.

๐Ÿ“„ License

This project is licensed under the MIT License.


File: src/gateway/channels/whatsapp/README.md

WhatsApp Gateway

Chat with Dexter through WhatsApp by linking your phone to the gateway. Messages you send to yourself (self-chat) are processed by Dexter and responses are sent back to the same chat.

Table of Contents

โœ… Prerequisites

  • Dexter installed and working (see main README)
  • WhatsApp installed on your phone
  • Your phone connected to the internet

Link your WhatsApp account to Dexter by scanning a QR code:

bash
bun run gateway:login

This will:

  1. Display a QR code in your terminal
  2. Open WhatsApp on your phone
  3. Go to Settings > Linked Devices > Link a Device
  4. Scan the QR code

After linking, you'll be asked how you want to use Dexter:

Option 1: Self-chat (personal phone)

Use your own WhatsApp to talk to Dexter by messaging yourself. The linked phone number is added to allowFrom and self-chat mode is activated automatically.

Option 2: Dedicated bot phone

If Dexter has its own phone number (e.g. a separate SIM), choose this option and enter the phone number(s) allowed to message it. The gateway will be configured with dmPolicy: "allowlist" so other people can DM the bot.

Credentials are saved to .dexter/credentials/whatsapp/default/.

๐Ÿš€ How to Run

Start the gateway to begin receiving messages:

bash
bun run gateway

You should see:

text
[whatsapp] Connected
Dexter gateway running. Press Ctrl+C to stop.

The gateway will now listen for incoming WhatsApp messages and respond using Dexter.

๐Ÿ’ฌ How to Chat

Once the gateway is running:

  1. Open WhatsApp on your phone
  2. Go to your own chat (message yourself)
  3. Send a message like "What is Apple's revenue?"
  4. You'll see a typing indicator while Dexter processes
  5. Dexter's response will appear in the chat

Example conversation:

text
You: What was NVIDIA's revenue in 2024?
Dexter: NVIDIA's revenue for fiscal year 2024 was $60.9 billion...

โš™๏ธ Configuration

The gateway configuration is stored at .dexter/gateway.json. It's auto-created when you run gateway:login.

Self-chat configuration (personal phone, message yourself):

json
{
  "gateway": {
    "accountId": "default",
    "logLevel": "info"
  },
  "channels": {
    "whatsapp": {
      "enabled": true,
      "allowFrom": ["+1234567890"]
    }
  },
  "bindings": []
}

Bot phone configuration (dedicated Dexter phone, others message it):

json
{
  "gateway": {
    "accountId": "default",
    "logLevel": "info"
  },
  "channels": {
    "whatsapp": {
      "enabled": true,
      "accounts": {
        "default": {
          "dmPolicy": "allowlist",
          "allowFrom": ["+1555YOURNUM"],
          "groupPolicy": "disabled",
          "groupAllowFrom": []
        }
      },
      "allowFrom": ["+1555YOURNUM"]
    }
  },
  "bindings": []
}

Key settings:

Setting Description
channels.whatsapp.allowFrom Phone numbers allowed to message Dexter (E.164 format)
channels.whatsapp.enabled Enable/disable the WhatsApp channel
accounts..dmPolicy DM access policy: pairing (default), allowlist, open, or disabled
accounts..allowFrom Per-account allowed senders (overrides top-level allowFrom)
gateway.logLevel Log verbosity: silent, error, info, debug

๐Ÿ‘ฅ Group Chat

Dexter can participate in WhatsApp group chats, responding only when @-mentioned.

Setup

Add group policy to your account in .dexter/gateway.json:

jsonc
{
  "channels": {
    "whatsapp": {
      "enabled": true,
      "accounts": {
        "default": {
          "groupPolicy": "open",       // "open", "allowlist", or "disabled"
          "groupAllowFrom": ["*"]       // no need to list individual group members
        }
      },
      "allowFrom": ["+1234567890"]      // existing DM allowlist (unrelated to groups)
    }
  }
}
Setting Description
groupPolicy "open" (any group), "allowlist" (restricted), or "disabled" (default)
groupAllowFrom Which groups Dexter can participate in (["*"] for any)

You don't need to list individual group members โ€” when groupPolicy is "open", Dexter will respond to @-mentions from anyone in any group it's added to.

Usage

  1. Add Dexter's WhatsApp number to a group
  2. Send messages normally โ€” Dexter stays silent
  3. @-mention Dexter (tap @ and select from the picker) to get a response
  4. Dexter sees recent group messages for context, so it can follow the conversation

Note: You must use WhatsApp's @-mention picker (tap @ then select the contact) โ€” typing a phone number manually won't trigger a response.

If you need to relink your WhatsApp (e.g., after logging out or switching phones):

  1. Stop the gateway (Ctrl+C)
  2. Delete the credentials:
    bash
    rm -rf .dexter/credentials/whatsapp/default
  3. Run login again:
    bash
    bun run gateway:login
  4. Scan the new QR code

๐Ÿ› Troubleshooting

Gateway shows "Disconnected":

  • Check your internet connection
  • Try relinking (see above)

Messages not being received:

  • Verify your phone number is in allowFrom in .dexter/gateway.json
  • Make sure you're messaging yourself (self-chat mode)

Debug logs:

  • Check .dexter/gateway-debug.log for detailed logs

๐Ÿ”ง Full Reset

If you're experiencing persistent issues (connection problems, encryption errors, messages not sending), perform a full reset:

  1. Stop the gateway (Ctrl+C if running)

  2. Unlink from WhatsApp:

    • Open WhatsApp on your phone
    • Go to Settings > Linked Devices
    • Tap on the Dexter device and select Log Out
  3. Clear all local data:

    bash
    rm -rf .dexter/credentials/whatsapp/default
    rm -rf .dexter/gateway.json
    rm -rf .dexter/gateway-debug.log
  4. Relink and start fresh:

    bash
    bun run gateway:login
  5. Scan the QR code and start the gateway:

    bash
    bun run gateway

This clears all cached credentials and encryption sessions, which resolves most connection issues.