From 55f491461564e1dcfee9631b76c7fd762bdf147f Mon Sep 17 00:00:00 2001 From: Mikhail Makeev Date: Tue, 28 Jul 2026 20:23:38 +0300 Subject: [PATCH] Add AlphaAI integration --- integrations/alphai.md | 119 +++++++++++++++++++++++++++++++++++++++++ logos/alphai.png | Bin 0 -> 14438 bytes 2 files changed, 119 insertions(+) create mode 100644 integrations/alphai.md create mode 100644 logos/alphai.png diff --git a/integrations/alphai.md b/integrations/alphai.md new file mode 100644 index 00000000..aa5fe9b3 --- /dev/null +++ b/integrations/alphai.md @@ -0,0 +1,119 @@ +--- +layout: integration +name: AlphaAI +description: AI-scored financial news and SEC Form 4 insider events as Haystack Documents +authors: + - name: AlphaAI + socials: + github: makeev + twitter: alphai_io + linkedin: https://www.linkedin.com/company/alphai-io +pypi: https://pypi.org/project/alphai-haystack +repo: https://github.com/makeev/alphai-haystack +type: Data Ingestion +report_issue: https://github.com/makeev/alphai-haystack/issues +logo: /logos/alphai.png +version: Haystack 2.0 +toc: true +--- + +### Table of Contents + +- [Overview](#overview) +- [Installation](#installation) +- [Usage](#usage) + - [AlphaAINewsFetcher](#alphaainewsfetcher) + - [AlphaAIInsiderNewsFetcher](#alphaainsidernewsfetcher) + - [In a Pipeline](#in-a-pipeline) +- [Document shape](#document-shape) +- [License](#license) + +## Overview + +[AlphaAI](https://alphai.io) is a financial-news platform built for AI agents: every article is +enriched at ingest with per-ticker impact analysis, a category, and a 1-10 relevance score, and +SEC Form 4 insider filings become structured events about 6 minutes after they hit EDGAR. + +This integration provides: + +- `AlphaAINewsFetcher`: fetches the scored news feed as Haystack `Document` objects, with + ticker / category / relevance filters and optional same-story collapsing. +- `AlphaAIInsiderNewsFetcher`: fetches SEC Form 4 insider events with a structured + `meta["insider"]` block (side, shares, average price, total value, who traded, 10b5-1 flag). + +An API key is required — the free tier (20 requests/min, 100/day, no card) is enough to try it: +[alphai.io/developers](https://alphai.io/developers). The components read the key from the +`ALPHAI_API_KEY` environment variable. + +## Installation + +```bash +pip install alphai-haystack +``` + +## Usage + +### AlphaAINewsFetcher + +```python +from alphai_haystack import AlphaAINewsFetcher + +fetcher = AlphaAINewsFetcher(symbol="NVDA", min_relevance=7) +documents = fetcher.run()["documents"] + +for doc in documents: + print(doc.meta["relevance_score"], doc.meta["title"]) +``` + +Filters set in `__init__` (`symbol`, `category`, `min_relevance`, `top_k`) can be overridden +per `run()` call. + +### AlphaAIInsiderNewsFetcher + +```python +from alphai_haystack import AlphaAIInsiderNewsFetcher + +fetcher = AlphaAIInsiderNewsFetcher(min_relevance=7) # higher floor = larger trades only +for doc in fetcher.run()["documents"]: + insider = doc.meta["insider"] + print(insider["insider_name"], insider["side"], insider["total_value_usd"], doc.meta["tickers"]) +``` + +### In a Pipeline + +```python +from haystack import Pipeline +from haystack.components.builders import PromptBuilder +from haystack.components.generators import OpenAIGenerator + +from alphai_haystack import AlphaAINewsFetcher + +template = """Summarize what moved {{ symbol }} today, using only these articles: +{% for doc in documents %} +- {{ doc.content }} (relevance {{ doc.meta.relevance_score }}/10) +{% endfor %} +""" + +pipeline = Pipeline() +pipeline.add_component("news", AlphaAINewsFetcher(min_relevance=6, collapse_stories=True)) +pipeline.add_component("prompt", PromptBuilder(template=template)) +pipeline.add_component("llm", OpenAIGenerator(model="gpt-4o-mini")) +pipeline.connect("news.documents", "prompt.documents") +pipeline.connect("prompt", "llm") + +result = pipeline.run({"news": {"symbol": "NVDA"}, "prompt": {"symbol": "NVDA"}}) +print(result["llm"]["replies"][0]) +``` + +Both components serialize with the rest of the pipeline (`to_dict` / `from_dict`); the API key +is stored as an environment-variable reference, never as the raw value. + +## Document shape + +`content` is the article title plus summary. `meta` carries `uid`, `url`, `title`, `source`, +`source_domain`, `published_at` (ISO 8601), `tickers`, `category`, `relevance_score` (1-10), +and — on the insider feed — the structured `insider` block. + +## License + +MIT — see the [repository](https://github.com/makeev/alphai-haystack). diff --git a/logos/alphai.png b/logos/alphai.png new file mode 100644 index 0000000000000000000000000000000000000000..8072e8a840cbbe842531c700d98b6407e738cc3b GIT binary patch literal 14438 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 JN^?Bve*t3E^@9Ka literal 0 HcmV?d00001