Everything you need to know about Ray, the investigation assistant — what he can do, how to ask, and where the data comes from.
The CIU Chatbot is an AI investigation assistant named Ray. Ray is not a generic chatbot — every answer is grounded in the Epstein investigation corpus.
Ray can search across multiple data layers:
Zero wiki hits does not mean zero corpus coverage. Many questions need the graph, documents, or archive as fallback.
OpenRouter key: Get one at openrouter.ai/keys. Add credits to your OpenRouter account — all model usage is billed through your key.
Brave key: Get one at brave.com/search/api. Without it, Ray cannot search the web (Web Search, Deep Web Research, and Read a Web Article will not be available).
The recommended investigation flow:
Ray uses as many tool calls as the question needs — often 2–3 is enough, up to 8 for complex investigations. If the first few calls produce a solid answer, Ray stops early. Each tool can be called at most 5 times per turn.
wiki_searchCORESearches the curated, investigator-authored wiki pages. Returns matched passages with page path, title, heading, and content. The wiki is only one layer — zero wiki hits does not mean zero corpus coverage.
| Param | Type | Note |
|---|---|---|
query | string | Search text |
match_count | number | null | Results to return. Default 8 |
scope | "all" | "cases" | "actors" | null | Filter by page type. Default "all" |
neo4j_search_graph_nodesCORESearches 5M+ entities across all datasets — people, organizations, locations, events, documents, flights, offshore entities, and more. The graph is far larger than the wiki.
| Param | Type | Note |
|---|---|---|
query | string | Search text |
label | string | null | Filter to a node label (e.g. Person, Organization) |
source_dataset | string | null | Fuzzy match source dataset |
exact_source_dataset | string | null | Exact source dataset match |
offset | number | null | Pagination offset. Default 0 |
limit | number | null | Max results. Default 25, max 100 |
neo4j_get_node_profileCOREPulls everything known about a single entity — all properties, labels, and metadata. Use entity IDs from search results.
| Param | Type | Note |
|---|---|---|
node_id | string | The entity ID to look up |
neo4j_node_neighborsCOREShows who and what is connected to any entity — relationships, neighbors, and how they relate.
| Param | Type | Note |
|---|---|---|
node_id | string | The entity ID |
limit | number | null | Max connections. Default 25, max 100 |
neo4j_graph_statsCONDITIONALShows high-level numbers for the entire graph: total entities, total relationships, person count, and dataset breakdowns.
| Param | Type | Note |
|---|---|---|
source_limit | number | null | Max source datasets to show. Default 30 |
neo4j_shortest_pathCONDITIONALTraces the shortest chain of connections between two entities. Shows every person, organization, or event along the path.
| Param | Type | Note |
|---|---|---|
from_id | string | Starting entity ID |
to_id | string | Ending entity ID |
max_hops | number | null | Max path length. Default 6, max 10 |
neo4j_read_cypherCONDITIONALRuns a custom read-only Cypher query against the graph for advanced investigators. Write operations are blocked.
| Param | Type | Note |
|---|---|---|
query | string | Cypher query. Must contain LIMIT |
params | object | null | Optional query parameters |
neo4j_lookup_contactCONDITIONALSearches Epstein's contact book and related datasets by name, email, company, or alias. Privacy rules enforced: victims excluded, witnesses anonymized.
| Param | Type | Note |
|---|---|---|
query | string | Search text |
limit | number | null | Max results. Default 10, max 50 |
document_searchCORESearches the document corpus by text, title, filename, or source dataset. Use this to find specific documents or browse by category.
| Param | Type | Note |
|---|---|---|
query | string | null | Search text |
source_dataset | string | null | Fuzzy match source dataset |
source_document_id | string | null | Exact source document ID |
title | string | null | Title filter (contains match) |
filename | string | null | Filename filter (contains match) |
partial_text | string | null | Search within document text |
exact_source_dataset | string | null | Exact source dataset match |
offset | number | null | Pagination offset. Default 0 |
limit | number | null | Max results. Default 25, max 100 |
document_fetchCORERetrieves the text and metadata of a document by its ID, EFTA number, source document ID, or filename.
| Param | Type | Note |
|---|---|---|
id | string | null | Primary entity ID |
document_id | string | null | Document ID field |
efta_number | string | null | EFTA number (e.g. EFTA01374407) |
source_dataset | string | null | Filter by source dataset |
source_document_id | string | null | Source document ID |
filename | string | null | Filename to match |
limit | number | null | Max documents. Default 3, max 10 |
max_chars | number | null | Max text characters. Default 4000 |
include_text | boolean | null | Include text content. Default true |
document_extractCONDITIONALPulls page-level text from scanned documents using OCR. Use when you need specific pages rather than the full document.
| Param | Type | Note |
|---|---|---|
document_id | string | null | Document or entity ID |
efta_number | string | null | EFTA number |
page | number | null | Starting page. Default 1 |
max_pages | number | null | Max pages. Default 5, max 20 |
max_chars | number | null | Max chars per page. Default 3000 |
archive_findings_searchCORESearches 7,591 reviewed findings and 17,541 citations from prior deep investigations. Check here before starting fresh research — someone may have already found what you need.
| Param | Type | Note |
|---|---|---|
query | string | Search query |
type | "all" | "finding" | "citation" | null | Filter type. Default "all" |
dateFrom | string | null | Start date (ISO format) |
dateTo | string | null | End date (ISO format) |
limit | number | null | Max results. Default 20 |
offset | number | null | Pagination offset. Default 0 |
archive_finding_evidenceCONDITIONALRetrieves the full citation and source chain behind a specific finding — every document, reference, and supporting source.
| Param | Type | Note |
|---|---|---|
finding_id | string | Finding ID from search results |
write_case_fileCORECreates or updates a case file for your investigation notes. Files are saved to your account and persist across sessions.
| Param | Type | Note |
|---|---|---|
path | string | File path ending in .md |
content | string | Markdown content |
mode | "overwrite" | "append" | null | Write mode. Default "overwrite" |
read_case_fileCOREReads any case file — notes you created OR uploaded files. Handles text documents, PDFs (extracts text via AI), images (vision analysis), and YouTube videos (transcript extraction). Pass the ID from list_case_files.
| Param | Type | Note |
|---|---|---|
path | string | File path, file ID, or asset ID |
question | string | null | Focus question for PDF/image analysis |
max_chars | number | null | Max characters for uploaded files. Default 8000 |
list_case_filesCOREShows all files in your current case: notes you created AND uploaded documents (PDFs, images, text files). Each entry shows whether it's a 'note' or 'upload'.
| Param | Type | Note |
|---|---|---|
directory | string | null | Directory prefix filter (notes only) |
offset | number | null | Pagination offset. Default 0 |
limit | number | null | Max files. Default 50, max 100 |
web_searchCORESearches the web for current information to verify or extend investigation findings. Requires a Brave API key in your Dashboard settings.
| Param | Type | Note |
|---|---|---|
query | string | Web search query |
max_results | number | null | Max results. Default 5 |
deep_web_researchCONDITIONALRuns an autonomous multi-round research loop — searches the web, extracts key names and entities, then refines the next search automatically. Much more thorough than a single web search.
| Param | Type | Note |
|---|---|---|
topic | string | Research topic |
rounds | number | null | Research rounds. Default 3, range 1-5 |
queries_per_round | number | null | Results per round. Default 5, range 1-8 |
extract_articleCONDITIONALFetches a web page and extracts the full article text. Use this to read articles found during web search.
| Param | Type | Note |
|---|---|---|
url | string | URL to fetch |
max_chars | number | null | Max text characters. Default 20000, max 50000 |
submit_findingCONDITIONALSends a workspace file to the admin review queue. Approved findings get published to the public wiki.
| Param | Type | Note |
|---|---|---|
file_id | string | Workspace markdown file ID |
case_path | string | Wiki case page path |
case_title | string | Case title |
submit_caseCONDITIONALSends a complete case file to the admin review queue. Case files are comprehensive investigation packages.
| Param | Type | Note |
|---|---|---|
file_id | string | Workspace markdown file ID |
case_path | string | Wiki case page path |
case_title | string | Case title |
save_investigation_noteCONDITIONALSaves a persistent note that Ray will remember across all future conversations. Use for preferences, focus areas, or facts you always want Ray to know.
| Param | Type | Note |
|---|---|---|
note | string | Note to persist (concise and actionable) |
forget_investigation_noteCONDITIONALRemoves a previously saved note so Ray stops remembering it.
| Param | Type | Note |
|---|---|---|
note | string | Exact text of note to remove (case-insensitive) |
document_interlinkCONDITIONALScans your workspace files and discovers hidden connections — shared names, entities, document IDs, and themes across different files.
| Param | Type | Note |
|---|---|---|
scope | string | null | "workspace" for personal files, "all" for repo files. Default "workspace" |
max_connections | number | null | Max connections. Default 30, max 100 |
file_forensicsCONDITIONALExtracts forensic metadata from a document — creation dates, authors, source provenance, hashes, bates numbers, and redaction indicators.
| Param | Type | Note |
|---|---|---|
node_id | string | Document entity ID |
trace_chainCONDITIONALFollows money trails, travel sequences, communication chains, or cause-effect paths through the graph from a starting entity. Up to 8 hops deep.
| Param | Type | Note |
|---|---|---|
start_id | string | Starting entity ID |
direction | "backward" | "forward" | "both" | null | Trace direction. Default "both" |
max_depth | number | null | Max hops. Default 4, max 8 |
relationship_types | string[] | null | Filter to specific relationship types |
query_submissionsCONDITIONALSee what other investigators have submitted, what cases they're tracking, and the status of reviewed findings.
| Param | Type | Note |
|---|---|---|
query | string | null | Search text (null for all) |
status | "pending" | "approved" | "rejected" | "all" | null | Filter by status. Default "all" |
limit | number | null | Max results. Default 20, max 50 |
fetch_pdfCONDITIONALDownloads a PDF from any public URL and extracts its text. Use for court filings, PACER documents, or PDFs found during web research — no attachment required.
| Param | Type | Note |
|---|---|---|
url | string | PDF URL |
question | string | null | Focus question for extraction |
max_chars | number | null | Max characters. Default 8000, max 50000 |
Ray does not load all 37 tools on every turn. A dynamic selection system picks the right tools based on your question:
These are available on every turn regardless of what you ask: Search the Wiki, Search the Network Graph, Get Full Profile, Find Connections, Search Documents, Read a Document, Search Past Findings, Save a Case File, Read a Case File, List All Case Files, Web Search.
Your question is scanned for keywords that trigger additional tool groups:
| Keywords | Tools Loaded |
|---|---|
| connect, path, network, graph, stats, cypher, contact, address, phone, between | Network Statistics, Find the Link Between Two People, Custom Graph Query, Search the Contact Book |
| evidence, extract, citation, page, ocr, reconstruct, finding | Extract Pages from a Document, Get Evidence for a Finding |
| research, article, osint, web, url, http, deep research | Deep Web Research, Read a Web Article |
| submit, case, finding, note, save, remember, forget, preference, submission | Submit Finding for Review, Submit Case File for Review, Remember Something, Forget Something, View Other Investigators' Work |
| trace, forensic, interlink, chain, provenance, metadata, connections between files | Find Hidden Connections Between Files, Document Forensics, Trace a Chain, Read a PDF from a URL |
| Dataset | Content |
|---|---|
| doj-epstein-files | DOJ Epstein case files |
| icij-offshore | ICIJ offshore entities and officers |
| open-sanctions | Sanctioned entities |
| rhowardstone-corpus | R. Howard Stone research corpus |
| pacer-courtlistener | Court records from PACER/CourtListener |
| efta-db | EFTA document database |
| epstein-network | Gold dataset — primary Epstein network graph |
| contact-book | Epstein contact/address book |
| house-oversight | House Oversight Committee records |
| fbi-vault | FBI Vault records |