Jaspers Hub

jaspers / agents

pluginOfficialReviewed★ 0↓ 0

Research Agents: Lets you define research agents that chat and answer with citations from SEC filings, your documents, and the web, via Jaspers' research-store service.

8.4 KB

plugin-research-agents

Research agents for Jaspers Terminal: agents you define, a conversation in each panel where you tag them, and the research store they answer from: companies' SEC filings, cut by their sections and labeled by form, fiscal year, and filing date, beside your own documents and the pages agents read. Each search is held to filters, reranked for relevance, and hands the model at most three passages that clear a minimum score, never a whole document.

The store is a Jaspers service (research-store): nothing runs on your machine but the agents. A company read in once is there for everyone; your documents and the pages your agents read are your account's alone. How the parts fit and how documents are chunked, stored, and searched: How it works. Where data flows between the view, the backend, the app, and the store: Architecture.

First start

Sign in with Jaspers in the Terminal's Settings. The panel shows the chat once the Terminal reaches the store as your account; nothing is downloaded, installed, or asked. A Jaspers account is all it takes: no subscription, no credits.

Companies

Every agent reads every company in the store, and reads in the ones a question needs itself (add_company): only the kinds of a company's filings a question needs, for the years it asks: reports (10-K, 10-Q, 20-F, 40-F), events (8-K, 6-K), proxies, insiders (Forms 3, 4, 5, 144), holders (13D, 13G, 13F), offerings (registrations, prospectuses, merger communications), each with its amendments; a bank's thousands of 424B2 note supplements and free writing prospectuses are no kind. A question about risk factors reads the reports: 40 of FLWS's 791 filings in 2016–2026, 542 of the rest insiders' forms; a later question that needs another kind adds it, and the prompt lists each company's kinds and their years. The store reads filings eight at a time, never more than ten requests a second to SEC, for every job at once, and add_company answers once they are read and embedded. A company another account already read in is there at once. A search that names a company the store holds first checks it for new filings when SEC last listed them more than 15 minutes ago (the company's recently_as_of): the store lists the years since and reads in, and embeds, only what is new. A 10-K, 10-Q, or 8-K is cut by its Items, any other narrative filing kept as one document, ownership and data forms (3, 4, 5, 144, D, 13F, the structured Schedules 13D and 13G) kept as their parsed data, and text exhibits as sections of their own. Under the agents, the side panel lists the companies this conversation touches (the ones its agents searched, found, or read in, a company being read in from its first filing), each a chip with its ticker, a line along its foot while it is read or embedded, and a red mark if something failed; hovering it opens a card with its kinds of filing and their years, how far it is, and its refresh.

Documents

Drop files on the view, or hover the paperclip beside the message box and choose Attach file: txt, md, csv, tsv, json, html (as its text), xml, log, and PDF (read with pdf.js, page by page; a scan with no text layer is refused). Each goes to the store, yours alone, cut by its pages or headings; the same name again replaces it. A file attached in a conversation is noted there: the agents answering the next message are told it was just attached and that the message is most likely about it, with its document id to search it alone, and later answers see where in the conversation it was attached. Added files, in the same menu, lists them, each deleted by pressing its trash can twice. An agent with web on also finds pages with search_web, through the search provider set in the Terminal's Settings, and reads them into the store with fetch_page. Every agent works out its figures with calculate, and cites the calculation; and reads a company's filings into the store itself with add_company.

Citations

Every sentence an agent states cites the passage it rests on, like [p2]; an answer that leaves a sentence uncited, or cites a passage no search gave, goes back once to fix it, and a citation of a passage no search gave that is still there is said under it. Hover a citation and its document opens beside the chat: the whole document in order, drawn as Markdown, its cited section open with the passage marked and in view, the other sections a click away. A click on the citation pins the window open.

The copy icon under a finished answer copies it with a Sources list: each passage it cites, with where it is from and its link.

While an agent works, its answer shows the step it is on (Thinking…, Searching “free cash flow” · 10-K 2025, Loading skill dcf) with a light passing over it, and above that the model's latest note to itself: its words beside its searches, or its thinking where the provider hands it back (Anthropic's). The line moves a step at a time, since a plugin's model call answers whole.

The microphone at the right under the message box listens: press it, talk, press it again, and what you said lands in the box to edit and send (Escape drops it). The Terminal records and transcribes with your voice provider (Settings, Voice); the plugin gets the words, never the audio.

Conversations

Each panel of the plugin is one conversation: place another panel for a new one. The Stop button beside the microphone stops the answers being written. A panel remembers its conversation, and whether its side panel is folded (the button at the top left). Conversations stay in chats/ in the plugin's data folder.

The Terminal's assistant asks the agents the same way you do: it places a panel with the question in its state (ask, tagging an agent with @id when you named one), or posts to a panel already open (agents/post), and the question and answers show in the panel. That is all it does: the store is the plugin's own, so the assistant is never offered its tools, and the agents read in the filings they need. A message that tags no one goes to the agent asked last, else the first in the list; with no agents, a Research Analyst is made for it.

Agents

An agent is a Markdown file in ~/Jaspers/agents/defs/<id>.md: frontmatter, then the instructions it works by. Its id, what you tag it with, comes from the name it is made with (Documents Analyst is @documents-analyst, numbered if another agent has it) and stays when the name changes.

---
name: Thesis desk
documents: [doc:3f1c…]
form: [10-K, 10-Q]
origin: [sec, upload]
since: 2021-01-01
web: true
skills: [dcf]
---

Answer from the filings and my thesis.

Every agent reads every company's filings; documents, when it names any, are the documents it reads, by the ids the store gave them (the editor lists them by name), and none means all of them. form, origin (sec, upload, web), and since narrow that. The form in the view writes all of these, under Advanced. Within them the model asks each search's own filters (company, form, fiscal year and period, section like Item 1A, filing dates), searches as often as it needs, and answers with citations to the passages.

skills are the app's skills it may use, by name: the ones in Settings, under Skills, which the form lists to tick. The agent sees each one's name and description, and loads a skill's instructions, or reads one of its files, only when a question calls for it; the answer shows what it loaded. A skill shapes how it works; what it states still comes from cited passages. Each answer starts fresh, so a skill used in one answer is loaded again by the next that needs it.

Needs

  • Jaspers Terminal 0.12.0 or later (SDK 0.7.0, for a connection the assistant is never offered).
  • A Jaspers account, signed in under Settings: the research store is reached as it.
  • A language model set in Jaspers Terminal: the agents answer with it. Agents with web on also use its search provider.

A store from the plugin's earlier versions (~/Jaspers/agents/research.db, sec/, models/, docs/) is not read any more and can be deleted; documents are attached again.

Develop

git clone https://github.com/JaspersAI/plugin-research-agents.git ~/Jaspers/plugins/agents
cd ~/Jaspers/plugins/agents
npm install
npm run typecheck
npm test

To work against a store run elsewhere (uv run research-store api in the research-store repo, at http://127.0.0.1:8080/mcp), change STORE_URL in plugin.tsx.

License

MIT