Metadata-Version: 2.5
Name: openoutnews
Version: 0.1.6
Summary: Explore/exploit news curation for a newsletter: fetch candidates, learn a reader's taste, print a CSV.
Project-URL: Homepage, https://openoutreach.app
Project-URL: Source, https://github.com/eracle/OpenOutNews
Project-URL: Issues, https://github.com/eracle/OpenOutNews/issues
Author-email: OpenOutNews <hello@openoutreach.app>
License-Expression: GPL-3.0-or-later
License-File: LICENCE.md
Keywords: active-learning,curation,explore-exploit,newsletter,open-source,self-hosted
Classifier: Development Status :: 2 - Pre-Alpha
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Communications :: Email
Requires-Python: >=3.11
Requires-Dist: fastembed<1,>=0.4
Requires-Dist: numpy<3,>=1.26
Requires-Dist: openoutlearn<1,>=0.1.1
Requires-Dist: scikit-learn<2,>=1.4
Requires-Dist: scipy<2,>=1.11
Provides-Extra: dev
Requires-Dist: pytest-mock>=3.14; extra == 'dev'
Requires-Dist: pytest>=8; extra == 'dev'
Description-Content-Type: text/markdown

# OpenOutNews

Explore/exploit news curation for a newsletter: fetch candidate articles,
learn what a reader engages with, print a CSV of what to send next.

The scoring mechanism — a GP regressor over article embeddings, ranked by
posterior fit probability once enough labels exist and by BALD uncertainty
before that — is [OpenOutLearn](https://github.com/eracle/OpenOutLearn)'s
`GPBaldQualifier`, the same engine [OpenOutFind](https://github.com/eracle/OpenOutFind)'s
lead qualifier subclasses. Here the label is reader engagement (read/skip)
instead of an LLM's ICP-fit verdict — see `openoutnews/ml/qualifier.py`.

This is a first version: a CSV in, a CSV out, no wizard, no send step.

## Install

```bash
pip install -e .
```

## Configure

```bash
export OPENOUTNEWS_TOPICS="open source AI,B2B sales tools"
```

## Use

```bash
outnews find 10 > picks.csv
# ... send the newsletter, see what the reader engaged with ...
outnews label <id> read
outnews label <id> skip
```

Each `find` run fetches fresh candidates for the configured topics, embeds
the ones it hasn't seen, and picks by whichever side of explore/exploit the
label balance currently favors — newest-first until at least one "read" and
one "skip" exist.
