CoolFace
Apppublic

shubZk17/equity-research-agent

sourceHugging Facemitupdated 24d agoView on Hugging Face
0likes
App README

<p align="center"> <img src="docs/banner.png" alt="ARA-1 Banner" width="100%"/> </p>

<h1 align="center">ARA-1 โ€” Autonomous Research Agent</h1>

<p align="center"> <b>A retrieval-aware autonomous financial intelligence system built with LangGraph and the ReAct framework.</b> </p>

<p align="center"> <img src="https://img.shields.io/badge/Python-3.12+-3776AB?style=for-the-badge&logo=python&logoColor=white" alt="Python"/> <img src="https://img.shields.io/badge/LangGraph-ReAct-FF6F00?style=for-the-badge&logo=langchain&logoColor=white" alt="LangGraph"/> <img src="https://img.shields.io/badge/ChromaDB-Vector%20Store-4A154B?style=for-the-badge" alt="ChromaDB"/> <img src="https://img.shields.io/badge/LLM-Groq%20%7C%20OpenAI%20%7C%20Claude-10A37F?style=for-the-badge" alt="LLM"/> </p>


๐Ÿ“Œ What is ARA-1?

ARA-1 is an autonomous AI agent that performs end-to-end financial research on publicly traded companies. Give it a ticker symbol or a research question, and it will:

  • โ€”๐Ÿ” Dynamically select tools to gather real-time stock data, financial metrics, company profiles, and news
  • โ€”๐Ÿง  Reason step-by-step using the ReAct (Reasoning + Acting) framework
  • โ€”๐Ÿ“š Store & retrieve knowledge from a persistent vector memory (ChromaDB)
  • โ€”๐Ÿ“Š Score source reliability using a 3-tier evidence governance system
  • โ€”โšก Detect conflicting information and surface it transparently
  • โ€”๐Ÿ—‚๏ธ Learn from past analyses through episodic memory

ARA-1 is not a chatbot wrapper. It is a fully autonomous agent that decides what to do, when to do it, and when to stop โ€” all without human intervention.


๐Ÿ—๏ธ Architecture

ARA-1 is built on a layered modular architecture with clean separation of concerns:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚              main.py  ยท  app.py  ยท  api/                โ”‚  โ† Entry points
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚              LangGraph StateGraph (agent/)              โ”‚  โ† The ReAct loop
โ”‚         reasoning_node โ†’ tool_node โ†’ output_node        โ”‚
โ”‚         + state ยท prompts ยท react_parser                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚      Tool Layer          โ”‚      knowledge/              โ”‚
โ”‚      (tools/)            โ”‚                              โ”‚
โ”‚                          โ”‚  ingestion/   cleanยทchunk    โ”‚
โ”‚  โ€ข stock_price           โ”‚  retrieval/   storeยทsearch   โ”‚
โ”‚  โ€ข company_info          โ”‚  memory/      episodic       โ”‚
โ”‚  โ€ข financial_metrics     โ”‚  reliability/ tiersยทstalenessโ”‚
โ”‚  โ€ข news                  โ”‚               ยทconflicts     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                       analysis/                         โ”‚  โ† Evidence โ†’ thesis
โ”‚   financial โ†’ sentiment โ†’ misalignment โ†’ risk โ†’         โ”‚
โ”‚   confidence โ†’ report                                   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                       quality/                          โ”‚  โ† Observes only,
โ”‚   evaluation/ ยท observability/ ยท dashboard              โ”‚    never blocks a run
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚              config/  ยท  utils/logger                   โ”‚  โ† Support
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Data flows top to bottom. The graph only covers the ReAct loop โ€”
analysis/ runs after it completes, on the finished state.

โš™๏ธ How It Works โ€” End-to-End Workflow

mermaid
flowchart TD
    A["๐Ÿง‘ User Query"] --> B["Load Episodic Memory<br/>(prior run context)"]
    B --> C["Build Initial State"]
    C --> D["LangGraph: reasoning_node"]

    D --> E{"LLM Decision"}
    E -->|Use a Tool| F["tool_node<br/>Execute Tool"]
    F --> G["Auto-Ingest Output<br/>โ†’ Clean โ†’ Chunk โ†’ Embed โ†’ Store"]
    G --> D

    E -->|Final Answer| H["output_node"]

    D --> I["Retrieve Evidence<br/>from Vector Memory"]
    I --> J["Score Reliability<br/>+ Detect Conflicts"]
    J --> D

    H --> K["Save Episode<br/>to Episodic Memory"]
    K --> L["Save Final Analysis<br/>to Vector Memory"]
    L --> M["๐Ÿ–ฅ๏ธ Display Results"]

    style A fill:#1a1a2e,color:#e94560
    style D fill:#0f3460,color:#16213e,color:#fff
    style G fill:#533483,color:#fff
    style H fill:#0f3460,color:#fff
    style M fill:#1a1a2e,color:#e94560

Step-by-Step Breakdown

StepWhat Happens
1. QueryUser provides a research question (e.g., "Analyze NVDA stock")
2. Episodic RecallAgent checks if it has analyzed this ticker before and loads prior experience
3. Reasoning LoopLLM uses ReAct framework: Thought โ†’ Action โ†’ Observation โ†’ repeat
4. Tool ExecutionAgent dynamically selects and calls tools (stock price, metrics, news, etc.)
5. Auto-IngestionEvery tool output is automatically cleaned, chunked, embedded, and stored in ChromaDB
6. Evidence RetrievalAt each reasoning step, relevant evidence is semantically retrieved from vector memory
7. Reliability ScoringRetrieved evidence is scored by source tier (Tier 1โ€“3) with staleness decay
8. Conflict DetectionContradictory evidence is flagged (numeric, sentiment, or temporal conflicts)
9. Final SynthesisAgent produces a grounded analysis citing evidence with confidence scores
10. Memory UpdateEpisode saved for future learning; final analysis stored in vector memory

๐Ÿš€ Local Setup & Usage

Prerequisites

  • โ€”Python 3.12+
  • โ€”Git
  • โ€”At least one LLM API key: Groq (free), OpenAI, or Anthropic

1. Clone the Repository

bash
git clone https://github.com/your-username/ara-agent.git
cd ara-agent

2. Create a Virtual Environment

bash
# Windows
python -m venv .venv
.venv\Scripts\activate

# macOS / Linux
python3 -m venv .venv
source .venv/bin/activate

3. Install Dependencies

bash
pip install -r requirements.txt

4. Configure Environment Variables

Copy the example config and add your API keys:

bash
cp .env.example .env

Edit .env with your preferred editor:

env
# ============================================================
# ARA-1 Environment Configuration
# ============================================================

# --- LLM Provider (pick one) ---
# Option A: Groq (FREE โ€” recommended for getting started)
GROQ_API_KEY=your-groq-api-key-here
LLM_PROVIDER=groq
GROQ_MODEL=llama-3.3-70b-versatile

# Option B: OpenAI
# OPENAI_API_KEY=your-openai-api-key-here
# LLM_PROVIDER=openai
# OPENAI_MODEL=gpt-4o

# Option C: Anthropic
# ANTHROPIC_API_KEY=your-anthropic-api-key-here
# LLM_PROVIDER=claude
# ANTHROPIC_MODEL=claude-sonnet-4-20250514

# --- Agent Settings ---
MAX_ITERATIONS=10
LOG_LEVEL=INFO

# --- Phase 2: Embeddings (optional, enhances retrieval quality) ---
# OPENAI_API_KEY=your-openai-api-key-here
๐Ÿ’ก Tip: Get a free Groq API key at console.groq.com. No credit card required.

5. Run the Agent

Interactive mode (prompts for a query):

bash
python main.py

With a query argument:

bash
python main.py "Analyze Tesla stock as a long-term investment"

More example queries:

bash
python main.py "What are the financial risks of investing in AAPL?"
python main.py "Compare NVDA and AMD financial performance"
python main.py "Provide a comprehensive analysis of Microsoft (MSFT)"

๐Ÿ“‚ Project Structure

ARA-1/
โ”‚
โ”œโ”€โ”€ main.py                   # ๐Ÿš€ CLI entry point & system assembly
โ”œโ”€โ”€ app.py                    # ๐Ÿ–ฅ๏ธ  Streamlit UI (the Hugging Face Space)
โ”‚
โ”œโ”€โ”€ agent/                    # ๐Ÿง  The reasoning loop
โ”‚   โ”œโ”€โ”€ state.py              #    AgentState โ€” the single source of truth
โ”‚   โ”œโ”€โ”€ graph.py              #    LangGraph wiring: 3 nodes, 1 loop
โ”‚   โ”œโ”€โ”€ nodes.py              #    reasoning โ†’ tool โ†’ output
โ”‚   โ”œโ”€โ”€ prompts.py            #    System prompt template + builders
โ”‚   โ”œโ”€โ”€ react_parser.py       #    LLM text โ†’ structured action (5 fallbacks)
โ”‚   โ”œโ”€โ”€ retry_handler.py      #    โš ๏ธ built, not wired
โ”‚   โ””โ”€โ”€ checkpoint_manager.py #    โš ๏ธ built, not wired
โ”‚
โ”œโ”€โ”€ tools/                    # ๐Ÿ”ง Where all external data enters
โ”‚   โ”œโ”€โ”€ base.py               #    BaseTool โ€” subclass this to add one
โ”‚   โ”œโ”€โ”€ registry.py           #    Register in main.py, that's the whole step
โ”‚   โ”œโ”€โ”€ stock_price.py        #    Price, day range, 52w range, volume
โ”‚   โ”œโ”€โ”€ company_info.py       #    Sector, industry, HQ, headcount
โ”‚   โ”œโ”€โ”€ financial_metrics.py  #    P/E, margins, ROE, growth, leverage
โ”‚   โ””โ”€โ”€ news.py               #    Recent headlines
โ”‚
โ”œโ”€โ”€ knowledge/                # ๐Ÿ“š What the agent knows and how it recalls it
โ”‚   โ”œโ”€โ”€ ingestion/            #    Text in:  clean โ†’ chunk โ†’ embed โ†’ store
โ”‚   โ”œโ”€โ”€ retrieval/            #    Text out: vector store + semantic search
โ”‚   โ”œโ”€โ”€ memory/               #    What survives across runs (episodic.py)
โ”‚   โ””โ”€โ”€ reliability/          #    Source tiers, staleness, conflict detection
โ”‚
โ”œโ”€โ”€ analysis/                 # ๐Ÿ“Š Turning evidence into a thesis
โ”‚   โ”œโ”€โ”€ engine.py             #    Orchestrates the 6 stages below
โ”‚   โ”œโ”€โ”€ financial_engine.py   #    1. Score ~22 metrics against thresholds
โ”‚   โ”œโ”€โ”€ sentiment_analyzer.py #    2. Lexicon-based news sentiment
โ”‚   โ”œโ”€โ”€ misalignment_detector.py #  3. Does the story match the numbers?
โ”‚   โ”œโ”€โ”€ risk_analyzer.py      #    4. Valuation, leverage, volatility risks
โ”‚   โ”œโ”€โ”€ confidence_calibrator.py #  5. How much should we trust this?
โ”‚   โ”œโ”€โ”€ report_generator.py   #    6. Render Markdown + PDF
โ”‚   โ””โ”€โ”€ schemas.py            #    Pydantic models tying it together
โ”‚
โ”œโ”€โ”€ quality/                  # ๐Ÿ”ฌ Did it do a good job? Can we see how?
โ”‚   โ”œโ”€โ”€ evaluation/           #    22 metrics + hallucination detection
โ”‚   โ”œโ”€โ”€ observability/        #    โš ๏ธ built, zero instrumentation call sites
โ”‚   โ””โ”€โ”€ dashboard.py          #    Read-only Streamlit monitor
โ”‚
โ”œโ”€โ”€ api/server.py             # ๐ŸŒ FastAPI wrapper (POST /analyze)
โ”œโ”€โ”€ config/settings.py        # โš™๏ธ  Frozen settings singleton, reads .env
โ”œโ”€โ”€ utils/logger.py           # ๐Ÿ“‹ Rich console + per-session file logging
โ”‚
โ”œโ”€โ”€ data/                     # ๐Ÿ’พ Runtime state (gitignored)
โ”‚   โ”œโ”€โ”€ chroma/               #    Vector database
โ”‚   โ”œโ”€โ”€ episodic/             #    One JSON per past run
โ”‚   โ””โ”€โ”€ evaluations/          #    Evaluation output
โ”œโ”€โ”€ reports/                  # ๐Ÿ“„ Generated analysis reports
โ”œโ”€โ”€ logs/                     # ๐Ÿ“„ Per-session logs
โ”‚
โ”œโ”€โ”€ CLAUDE.md                 # ๐Ÿงญ Architecture notes + known defects
โ”œโ”€โ”€ plan.md                   # ๐Ÿ—บ๏ธ  Roadmap (Phases 5โ€“8)
โ”œโ”€โ”€ requirements.txt
โ””โ”€โ”€ .env.example

Where to start reading

Follow the data, in this order:

  1. 1.`main.py` โ€” the assembly point. Everything is wired here and nowhere else.
  2. 2.`agent/state.py` โ€” AgentState is what flows between every node. Read this before any node.
  3. 3.`agent/graph.py` โ€” 3 nodes and one loop. Small file, whole control flow.
  4. 4.`agent/nodes.py` โ€” where reasoning and tool execution actually happen.
  5. 5.`tools/stock_price.py` โ€” the simplest tool; the shape all others follow.
  6. 6.`analysis/engine.py` โ€” the 6-stage synthesis pipeline.
One thing that surprises everyone: synthesis is not part of the graph. The graph is only the ReAct loop. main.py runs it to completion, then hands the finished state to analysis/engine.py as a separate step.

๐Ÿงช Example Output

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  ARA-1 - Autonomous Research Agent                          โ”‚
โ”‚  Phase 2: Retrieval-Aware Financial Intelligence            โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
[OK] Configuration valid
[OK] LLM Provider: groq (llama-3.3-70b-versatile)
[OK] Phase 2 systems initialized:
     Vector Store: chroma (4 existing docs)
     Embeddings: text-embedding-3-small
     Episodic Memory: 1 prior episodes

Starting analysis...
Query: Analyze NVDA stock performance
Max iterations: 10

  === Iteration 1/10 ===
  Thought: I need to gather NVDA's current stock price...
  >> Action: get_stock_price({'ticker': 'NVDA'})
  Ingested 1 chunk (total in store: 5)

  === Iteration 2/10 ===
  Retrieved 5 evidence items in 6.3ms
  Thought: Now I need financial metrics...
  >> Action: get_financial_metrics({'ticker': 'NVDA'})
  Ingested 1 chunk (total in store: 6)

  ...

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ [OK] Analysis Complete โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                                                                  โ”‚
โ”‚  NVIDIA Corporation (NVDA) is a technology company operating     โ”‚
โ”‚  in the semiconductors industry. Current price: USD 224.65,     โ”‚
โ”‚  trailing P/E: 45.83, revenue growth: 73.20%, market cap:       โ”‚
โ”‚  $5.46T. Strong financial position with 55.60% profit margin.   โ”‚
โ”‚                                                                  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Tool Usage Summary:
โ”Œโ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ # โ”‚ Tool                  โ”‚ Input              โ”‚ Status โ”‚
โ”œโ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 1 โ”‚ get_stock_price       โ”‚ {'ticker': 'NVDA'} โ”‚ OK     โ”‚
โ”‚ 2 โ”‚ get_financial_metrics โ”‚ {'ticker': 'NVDA'} โ”‚ OK     โ”‚
โ”‚ 3 โ”‚ get_company_info      โ”‚ {'ticker': 'NVDA'} โ”‚ OK     โ”‚
โ””โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Memory Operations:
  ๐Ÿ“ฆ ingested:get_stock_price:NVDA:1chunks
  ๐Ÿ“ฆ ingested:get_financial_metrics:NVDA:1chunks
  ๐Ÿ“ฆ ingested:get_company_info:NVDA:1chunks

๐Ÿ”Œ Adding Custom Tools

ARA-1's tool system is fully extensible. To add a new tool:

1. Create a new file in tools/:

python
# tools/my_custom_tool.py
from tools.base import BaseTool, ToolResult

class MyCustomTool(BaseTool):
    @property
    def name(self) -> str:
        return "my_custom_tool"

    @property
    def description(self) -> str:
        return "Description of what this tool does"

    @property
    def parameters(self) -> dict:
        return {
            "param1": {"type": "string", "description": "What this param is", "required": True}
        }

    def execute(self, **kwargs) -> ToolResult:
        param1 = kwargs.get("param1", "")
        # Your logic here
        result = f"Result for {param1}"
        return ToolResult(success=True, data=result)

2. Register it in main.py:

python
from tools.my_custom_tool import MyCustomTool

def create_tool_registry() -> ToolRegistry:
    registry = ToolRegistry()
    # ... existing tools ...
    registry.register(MyCustomTool())  # โ† Add this line
    return registry

That's it. The agent will automatically discover and use your tool when relevant.


๐Ÿ”‘ Supported LLM Providers

ProviderModelFree?Configuration
Groqllama-3.3-70b-versatileโœ… YesLLM_PROVIDER=groq
OpenAIgpt-4oโŒ PaidLLM_PROVIDER=openai
Anthropicclaude-sonnet-4-20250514โŒ PaidLLM_PROVIDER=claude
Recommendation: Start with Groq โ€” it's free, fast, and the llama-3.3-70b-versatile model works excellently with ARA-1's ReAct prompts.

๐Ÿ›ก๏ธ Source Reliability Tiers

ARA-1 doesn't treat all information equally. Every piece of evidence is scored:

TierScore RangeSourcesExamples
Tier 10.85 โ€“ 1.0Official/PrimarySEC filings, exchange data, tool API outputs
Tier 20.60 โ€“ 0.84Established MediaReuters, Bloomberg, Yahoo Finance, WSJ
Tier 30.30 โ€“ 0.59Secondary/InformalSeeking Alpha, Reddit, blogs, social media

Scores also decay over time โ€” a stock price from last week is less reliable than one from today.


๐Ÿ“Š Phase Progression

PhaseStatusDescription
Phase 1โœ… CompleteReAct loop, tool execution, structured parsing, error handling
Phase 2โœ… CompleteVector memory, semantic retrieval, evidence governance, episodic learning
Phase 3๐Ÿ”ฎ PlannedMulti-agent collaboration, async tools, streaming UI, human-in-the-loop

๐Ÿงฐ Tech Stack

ComponentTechnology
Agent FrameworkLangGraph (StateGraph)
ReasoningReAct (Reason + Act)
LLM InterfaceLangChain Core
Vector DatabaseChromaDB
EmbeddingsOpenAI text-embedding-3-small
Financial Datayfinance
Data ValidationPydantic v2
CLI / DisplayRich
LoggingPython logging + Rich
Configpython-dotenv

๐Ÿค Contributing

  1. 1.Fork the repository
  2. 2.Create a feature branch (git checkout -b feature/new-tool)
  3. 3.Commit your changes (git commit -m 'Add SEC filing tool')
  4. 4.Push to the branch (git push origin feature/new-tool)
  5. 5.Open a Pull Request

๐Ÿ“œ License

This project is for educational and research purposes.


<p align="center"> <b>Built with โค๏ธ by Shubham</b><br/> <i>ARA Agent-- Any feedback is appreciated.</i> </p>