Metadata-Version: 2.4
Name: poma
Version: 0.5.1
Summary: Official Python SDK for the Poma document-processing API
Author-email: "POMA AI GmbH, Berlin" <sdk@poma-ai.com>
License-Expression: MPL-2.0
Keywords: chunking,structure,rag,poma,documents,ai
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: httpx>=0.28.1
Requires-Dist: typing_extensions>=4.5.0
Provides-Extra: langchain
Requires-Dist: langchain>=0.3.27; extra == "langchain"
Requires-Dist: langchain-text-splitters>=0.3.9; extra == "langchain"
Requires-Dist: pydantic>=2; extra == "langchain"
Provides-Extra: llamaindex
Requires-Dist: llama-index>=0.13.0; extra == "llamaindex"
Requires-Dist: pydantic>=2; extra == "llamaindex"
Provides-Extra: qdrant
Requires-Dist: qdrant-client[fastembed]>=1.16.2; extra == "qdrant"
Provides-Extra: all
Requires-Dist: langchain>=0.3.27; extra == "all"
Requires-Dist: langchain-text-splitters>=0.3.9; extra == "all"
Requires-Dist: llama-index>=0.13.0; extra == "all"
Requires-Dist: llama-index-vector-stores-faiss>=0.5.0; extra == "all"
Requires-Dist: faiss-cpu>=1.10.0; extra == "all"
Requires-Dist: langchain_openai>=0.3.28; extra == "all"
Requires-Dist: langchain_community>=0.3.27; extra == "all"
Requires-Dist: llama-index-embeddings-langchain>=0.4.0; extra == "all"
Requires-Dist: qdrant-client[fastembed]>=1.16.2; extra == "all"
Requires-Dist: dotenv; extra == "all"
Dynamic: license-file

![POMA AI Logo](https://raw.githubusercontent.com/poma-ai/.github/main/assets/POMA_AI_Logo_Pink.svg)
# POMA: Preserving Optimal Markdown Architecture

## Quick-Start Guide

### Installation

Requires Python 3.10+. Install the core package:
```bash
pip install poma
```

For different integrations:
```bash
pip install 'poma[langchain]'
pip install 'poma[llamaindex]'
pip install 'poma[qdrant]'

# Or LangChain/LlamaIndex/Qdrant including example extras:
pip install 'poma[all]'
```

- You may also want: `pip install python-dotenv` to load API keys from a .env file.
- API keys required (POMA_API_KEY) for the POMA AI client via environment variables.
- **To request a POMA_API_KEY, please contact us at sdk@poma-ai.com**


### Usage

```python
from poma import PrimeCut, generate_cheatsheets

pc = PrimeCut(api_key="your_key")

# Ingest a document — submits the file, polls, and returns typed results
result = pc.ingest("document.pdf")

print(result.chunksets[0])
print(result.chunks[0].content)

# Eco ingestion uses the same flow against the eco endpoints
eco_result = pc.ingest_eco("document.pdf")
```

To test this flow from the command line (requires `POMA_API_KEY` in the environment):

```bash
python -m poma document.pdf          # run both ingest and ingest_eco
python -m poma path/to/file.pdf      # custom file
python -m poma document.pdf --no-eco   # standard ingest only
python -m poma document.pdf --eco     # eco ingest only
```

Generate cheatsheets as a top-level utility:
```python
cheatsheets = generate_cheatsheets(
    relevant_chunksets=result.chunksets,
    all_chunks=result.chunks,
)
print(cheatsheets[0]["content"])
```

If you already have a `.poma` archive, unpack it directly:
```python
from poma import unpack

archived_result = unpack("document.poma")
print(archived_result.chunks[0].content)
```

Async clients use the same API shape:
```python
import asyncio

from poma import AsyncPrimeCut


async def main() -> None:
    async with AsyncPrimeCut(api_key="your_key") as pc:
        result = await pc.ingest("document.pdf")
        print(result.chunksets[0])


asyncio.run(main())
```

### Grill (RAG / hybrid search)

Grill ingests documents into a per-project namespace and serves prompt-ready retrieval context for RAG.

> **Auth note**: Grill endpoints require a **project-level** key (prefix `poma_proj_gr_...`), **not** the account-level `POMA_API_KEY`. Set `POMA_GRILL_API_KEY` in your environment. The SDK validates the prefix at construction and raises `InvalidGrillApiKeyError` if you accidentally use the wrong one.

```python
from poma import Grill

g = Grill()  # reads POMA_GRILL_API_KEY

# 1. Ingest a document. Grill indexes it into your project namespace
#    (no archive download). `result.status == "done"` when ready.
result = g.ingest("document.pdf")
print(result.job_id, result.status, result.usage)

# 2. Run hybrid search across all documents in the namespace.
#    Returns a prompt-ready XML+Markdown block — drop it into an LLM prompt.
ctx = g.search("How do I configure retries?", target_tokens=2048)
print(ctx.context)

# 3. List, inspect, and delete documents in the namespace.
#    To find the doc you just ingested, match source_job_id to the job_id.
for doc in g.list_docs():
    print(doc.doc_id, doc.filename, doc.pages)

deleted = g.delete_doc(doc.doc_id)
print(deleted.vectors_deleted, deleted.storage_deleted)
```

The async client mirrors the same surface:

```python
import asyncio
from poma import AsyncGrill


async def main() -> None:
    async with AsyncGrill() as g:
        ctx = await g.search_in_doc("summarize section 3", "doc_abc123")
        print(ctx.context)


asyncio.run(main())
```


### Example Implementations

All examples, integrations, and additional information can be found in our GitHub repository: [poma-ai/poma](https://github.com/poma-ai/)

We provide example implementations to help you get started with POMA AI:
- example.py — A standalone implementation for documents, showing the basic POMA AI workflow with simple keyword-based retrieval
- example_langchain.py — Integration with LangChain, demonstrating how easy it is to use POMA AI with LangChain
- example_llamaindex.py — Integration with LlamaIndex, showing how simple it is to use POMA AI with LlamaIndex

*Note: The integration examples use OpenAI embeddings. Make sure to set your OPENAI_API_KEY environment variable, or replace the embeddings with your preferred ones.*

All examples follow the same two-phase process (ingest → retrieve) but demonstrate different integration options for your RAG pipeline.

! Please do NOT send any sensitive and/or personal information to POMA AI endpoints without having a signed contract & DPA !
