Metadata-Version: 2.4
Name: poindexter
Version: 0.136.0
Summary: Poindexter — the open-source AI content pipeline: CLI, services, plugins and the brain watchdog, as one package. Built by Glad Labs LLC.
License-Expression: Apache-2.0
License-File: LICENSE.md
Author: Glad Labs LLC
Author-email: hello@gladlabs.io
Requires-Python: >=3.13,<3.14
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.13
Provides-Extra: ml
Provides-Extra: pipeline
Provides-Extra: profiling
Provides-Extra: qa
Provides-Extra: rag
Provides-Extra: rerank
Provides-Extra: youtube
Requires-Dist: aiohttp (>=3.9,<4.0)
Requires-Dist: aiolimiter (>=1.2,<2.0)
Requires-Dist: apprise (>=1.12.0,<2.0)
Requires-Dist: apscheduler (>=3.11.3,<4.0.0)
Requires-Dist: asyncpg (>=0.31,<0.32)
Requires-Dist: beautifulsoup4 (>=4.12,<5.0)
Requires-Dist: boto3 (>=1.42.84,<2.0.0)
Requires-Dist: click (>=8.1,<9.0)
Requires-Dist: cloudinary (>=1.45,<2.0)
Requires-Dist: cryptography (>=48.0.1)
Requires-Dist: datasets ; extra == "qa"
Requires-Dist: ddgs (>=9.0,<10.0)
Requires-Dist: deepeval ; extra == "qa"
Requires-Dist: diffusers ; extra == "ml"
Requires-Dist: email-validator (>=2.3.0,<3.0.0)
Requires-Dist: fastapi (>=0.138.2)
Requires-Dist: feedparser (>=6.0,<7.0)
Requires-Dist: google-api-python-client ; extra == "youtube"
Requires-Dist: google-auth ; extra == "youtube"
Requires-Dist: google-auth-oauthlib ; extra == "youtube"
Requires-Dist: httpx (>=0.28,<0.29)
Requires-Dist: langchain-community ; extra == "rag"
Requires-Dist: langchain-core (>=1.5.1,<2.0)
Requires-Dist: langchain-ollama ; extra == "rag"
Requires-Dist: langfuse (>=4.13,<5.0)
Requires-Dist: langgraph (>=1.2.9,<2.0)
Requires-Dist: langgraph-checkpoint (>=4.2.0,<5.0)
Requires-Dist: langgraph-checkpoint-postgres (>=3.1.2,<4.0)
Requires-Dist: litellm ; extra == "pipeline"
Requires-Dist: llama-index-core ; extra == "rag"
Requires-Dist: llama-index-embeddings-ollama ; extra == "rag"
Requires-Dist: markdown (>=3.10,<4.0)
Requires-Dist: mcp (>=2.0.0,<3)
Requires-Dist: opentelemetry-exporter-otlp (>=1.41,<2.0)
Requires-Dist: opentelemetry-instrumentation-fastapi (>=0.62b0,<0.63)
Requires-Dist: opentelemetry-instrumentation-httpx (>=0.62b0,<0.63)
Requires-Dist: pillow (>=12.2.0)
Requires-Dist: playwright ; extra == "pipeline"
Requires-Dist: prefect ; extra == "pipeline"
Requires-Dist: prometheus-client (>=0.26.0,<0.27.0)
Requires-Dist: psycopg[binary,pool] (>=3.3.5,<4.0)
Requires-Dist: pyasn1 ; extra == "youtube"
Requires-Dist: pydantic[email] (>=2.12.5,<3.0.0)
Requires-Dist: pyjwt (>=2.12.0,<3.0.0)
Requires-Dist: pyroscope-io ; extra == "profiling"
Requires-Dist: python-multipart (>=0.0.31)
Requires-Dist: ragas ; extra == "qa"
Requires-Dist: resend (>=2.35.0,<3.0.0)
Requires-Dist: sentence-transformers ; extra == "rerank"
Requires-Dist: sentry-sdk[fastapi] (>=2.68.0,<3.0.0)
Requires-Dist: setuptools (<84)
Requires-Dist: slowapi (>=0.1.9,<0.2.0)
Requires-Dist: starlette (>=1.3.1)
Requires-Dist: structlog (>=26,<27)
Requires-Dist: tenacity (>=9.1,<10.0)
Requires-Dist: torch ; extra == "ml"
Requires-Dist: transformers ; extra == "ml"
Requires-Dist: tzdata
Requires-Dist: uvicorn[standard] (>=0.52.4,<0.53)
Description-Content-Type: text/markdown

# poindexter

The open-source AI content pipeline from [Glad Labs](https://gladlabs.io), as one
installable package: the `poindexter` command-line client, the service layer it
delegates to, the plugin registry, and the standalone brain watchdog daemon. The
CLI, the worker, and the MCP servers all import the same `poindexter.*` modules —
one schema, one client, zero drift.

## Install

```bash
pip install poindexter
poindexter --help
```

Python 3.13. The package talks to a PostgreSQL database with the `pgvector`
extension; `poindexter setup` writes `~/.poindexter/bootstrap.toml` and runs the
schema migrations against it.

The bare install is the CLI and the client library. The generation stacks are
extras, so a machine that only operates the pipeline does not download them:

```bash
pip install "poindexter[pipeline,qa,rag]"   # a full pipeline node
```

| Extra      | Pulls in                                           | Needed for                                         |
| ---------- | -------------------------------------------------- | -------------------------------------------------- |
| `pipeline` | prefect, playwright, litellm                       | running the content flow, screenshots, LLM routing |
| `qa`       | deepeval, ragas, datasets                          | the LLM-judge QA rails                             |
| `rag`      | llama-index, langchain-community, langchain-ollama | the RAG retrieval stack                            |
| `rerank`   | sentence-transformers (+ torch)                    | the cross-encoder reranker                         |

A command that needs an extra you did not install fails with a plain
`ModuleNotFoundError` naming the package — never a silent degradation.

To run the whole stack (worker, brain daemon, Prefect, Grafana, ...) rather than
the client alone, clone the repository and start the consumer compose file:

```bash
git clone https://github.com/Glad-Labs/poindexter
cd poindexter
docker compose -f docker-compose.consumer.yml up -d
```

## Quick start

```bash
# 1. Point the CLI at a Postgres instance (pgvector enabled) and run migrations.
poindexter setup

# Non-interactive — takes an explicit DSN:
poindexter setup --db-url="postgresql://user:pass@host:5432/poindexter_brain"

# Re-run the sanity checks against an existing bootstrap.toml:
poindexter setup --check

# 2. Ask questions of the shared memory spine:
poindexter memory search "why gemma3"

# 3. Inspect the current pipeline task queue:
poindexter tasks list --limit 20

# 4. Read or change runtime app_settings:
poindexter settings list
poindexter settings set enable_pyroscope true
```

Every command respects `-v / --verbose` for client-side info logs and `-h /
--help` for a per-subcommand usage summary.

## Command groups

| Group      | What it does                                                                               |
| ---------- | ------------------------------------------------------------------------------------------ |
| `setup`    | First-run wizard — writes `~/.poindexter/bootstrap.toml`, runs migrations, seeds defaults. |
| `memory`   | Query, store, and stat the shared pgvector memory store.                                   |
| `tasks`    | Browse and manage the content pipeline task queue.                                         |
| `posts`    | Query and manage published / draft blog posts.                                             |
| `settings` | Read and write `app_settings` (DB-first config, no `.env` needed).                         |
| `costs`    | Pipeline spending and operational metrics.                                                 |
| `doctor`   | Aggregate every health probe into one report.                                              |
| `auth`     | Manage OAuth 2.1 client credentials for the API and MCP servers.                           |
| `vercel`   | Vercel deployment status via the REST API (no Vercel CLI needed).                          |
| `pro`      | Operate the Poindexter Pro delivery chain.                                                 |

Run `poindexter --help` for the full list (forty-odd groups) and any group with
`--help` for its subcommands, e.g. `poindexter memory --help`.

## Import root

Everything ships under one package:

```python
from poindexter.services.site_config import SiteConfig
from poindexter.plugins.registry import get_taps
from poindexter.brain.bootstrap import resolve_database_url
```

The pre-1046 flat spellings (`import services.x`) are gone — there is exactly
one module object per name, and nothing is installed at the top level except
`poindexter`.

## Configuration

`poindexter` reads its infrastructure secrets (mostly: a Postgres DSN) from
`~/.poindexter/bootstrap.toml`, which `poindexter setup` writes for you.
Everything else — API keys, feature flags, quality thresholds, model pins — is
stored in the `app_settings` table in Postgres and can be managed with
`poindexter settings`.

There are no required environment variables. `DATABASE_URL`, if present, is
accepted as a convenience override.

## How versions work

The PyPI version tracks the upstream
[poindexter](https://github.com/Glad-Labs/poindexter) repository via
[release-please](https://github.com/googleapis/release-please). Each release on
`main` cuts a tag `v<major>.<minor>.<patch>`; that tag fires the publish
workflow, which builds the wheel, installs it into a clean venv, runs
`poindexter --help`, and only then ships it.

Breaking changes in the CLI show up in the repo's
[CHANGELOG](https://github.com/Glad-Labs/poindexter/blob/main/CHANGELOG.md).

## Development / working from a clone

If you've cloned the upstream repo you don't need PyPI — everything is already
wired up:

```bash
# From repo root:
cd src/cofounder_agent
poetry install --extras "pipeline qa rag"
poetry run poindexter --help
```

To build the distribution yourself (the manifest is `src/cofounder_agent/pyproject.toml`):

```bash
cd src/cofounder_agent
uv build                     # or: python -m build
pip install dist/poindexter-*.whl
poindexter --help
```

## License

Apache 2.0. See [LICENSE](https://github.com/Glad-Labs/poindexter/blob/main/LICENSE)
in the upstream repo.

## Support

- Bugs and feature requests: <https://github.com/Glad-Labs/poindexter/issues>
- Documentation: <https://github.com/Glad-Labs/poindexter#readme>
- Security: see [SECURITY.md](https://github.com/Glad-Labs/poindexter/blob/main/SECURITY.md)

