Metadata-Version: 2.4
Name: datarobot-genai
Version: 0.15.4
Summary: Generic helpers for GenAI
Author: DataRobot, Inc.
License: Apache-2.0
Project-URL: Homepage, https://github.com/datarobot-oss/datarobot-genai
Requires-Python: <3.14,>=3.11
Description-Content-Type: text/markdown
License-File: LICENSE
License-File: AUTHORS
Provides-Extra: core
Requires-Dist: requests<3.0.0,>=2.32.4; extra == "core"
Requires-Dist: datarobot<4.0.0,>=3.10.0; extra == "core"
Requires-Dist: datarobot-early-access==3.14.0.2026.3.18.162920; extra == "core"
Requires-Dist: datarobot-predict<2.0.0,>=1.13.2; extra == "core"
Requires-Dist: openai<3.0.0,>=2.0.0; extra == "core"
Requires-Dist: ragas<0.4.0,>=0.3.8; extra == "core"
Requires-Dist: pyjwt<3.0.0,>=2.12.0; extra == "core"
Requires-Dist: opentelemetry-instrumentation-requests<1.0.0,>=0.43b0; extra == "core"
Requires-Dist: opentelemetry-instrumentation-aiohttp-client<1.0.0,>=0.43b0; extra == "core"
Requires-Dist: opentelemetry-instrumentation-httpx<1.0.0,>=0.43b0; extra == "core"
Requires-Dist: opentelemetry-instrumentation-openai<1.0.0,>=0.40.5; extra == "core"
Requires-Dist: opentelemetry-instrumentation-threading<1.0.0,>=0.43b0; extra == "core"
Requires-Dist: ag-ui-protocol<0.2.0,>=0.1.14; extra == "core"
Requires-Dist: pyarrow==21.0.0; extra == "core"
Provides-Extra: crewai
Requires-Dist: requests<3.0.0,>=2.32.4; extra == "crewai"
Requires-Dist: datarobot<4.0.0,>=3.10.0; extra == "crewai"
Requires-Dist: datarobot-early-access==3.14.0.2026.3.18.162920; extra == "crewai"
Requires-Dist: datarobot-predict<2.0.0,>=1.13.2; extra == "crewai"
Requires-Dist: openai<3.0.0,>=2.0.0; extra == "crewai"
Requires-Dist: ragas<0.4.0,>=0.3.8; extra == "crewai"
Requires-Dist: pyjwt<3.0.0,>=2.12.0; extra == "crewai"
Requires-Dist: opentelemetry-instrumentation-requests<1.0.0,>=0.43b0; extra == "crewai"
Requires-Dist: opentelemetry-instrumentation-aiohttp-client<1.0.0,>=0.43b0; extra == "crewai"
Requires-Dist: opentelemetry-instrumentation-httpx<1.0.0,>=0.43b0; extra == "crewai"
Requires-Dist: opentelemetry-instrumentation-openai<1.0.0,>=0.40.5; extra == "crewai"
Requires-Dist: opentelemetry-instrumentation-threading<1.0.0,>=0.43b0; extra == "crewai"
Requires-Dist: ag-ui-protocol<0.2.0,>=0.1.14; extra == "crewai"
Requires-Dist: pyarrow==21.0.0; extra == "crewai"
Requires-Dist: anthropic<1.0.0,~=0.71.0; extra == "crewai"
Requires-Dist: azure-ai-inference<2.0.0,>=1.0.0b9; extra == "crewai"
Requires-Dist: crewai[litellm]>=1.11.0; extra == "crewai"
Requires-Dist: litellm<2.0.0,>=1.83.0; extra == "crewai"
Requires-Dist: crewai-tools[mcp]<0.77.0,>=0.69.0; extra == "crewai"
Requires-Dist: nvidia-nat-crewai==1.6.0; extra == "crewai"
Requires-Dist: opentelemetry-instrumentation-crewai<1.0.0,>=0.40.5; extra == "crewai"
Requires-Dist: pybase64<2.0.0,>=1.4.2; extra == "crewai"
Provides-Extra: langgraph
Requires-Dist: requests<3.0.0,>=2.32.4; extra == "langgraph"
Requires-Dist: datarobot<4.0.0,>=3.10.0; extra == "langgraph"
Requires-Dist: datarobot-early-access==3.14.0.2026.3.18.162920; extra == "langgraph"
Requires-Dist: datarobot-predict<2.0.0,>=1.13.2; extra == "langgraph"
Requires-Dist: openai<3.0.0,>=2.0.0; extra == "langgraph"
Requires-Dist: ragas<0.4.0,>=0.3.8; extra == "langgraph"
Requires-Dist: pyjwt<3.0.0,>=2.12.0; extra == "langgraph"
Requires-Dist: opentelemetry-instrumentation-requests<1.0.0,>=0.43b0; extra == "langgraph"
Requires-Dist: opentelemetry-instrumentation-aiohttp-client<1.0.0,>=0.43b0; extra == "langgraph"
Requires-Dist: opentelemetry-instrumentation-httpx<1.0.0,>=0.43b0; extra == "langgraph"
Requires-Dist: opentelemetry-instrumentation-openai<1.0.0,>=0.40.5; extra == "langgraph"
Requires-Dist: opentelemetry-instrumentation-threading<1.0.0,>=0.43b0; extra == "langgraph"
Requires-Dist: ag-ui-protocol<0.2.0,>=0.1.14; extra == "langgraph"
Requires-Dist: pyarrow==21.0.0; extra == "langgraph"
Requires-Dist: langchain-mcp-adapters<0.2.0,>=0.1.12; extra == "langgraph"
Requires-Dist: langgraph<2.0.0,>=1.0.0; extra == "langgraph"
Requires-Dist: langgraph-prebuilt<2.0.0,>=1.0.0; extra == "langgraph"
Requires-Dist: litellm<2.0.0,>=1.83.0; extra == "langgraph"
Requires-Dist: nvidia-nat-langchain==1.6.0; extra == "langgraph"
Requires-Dist: opentelemetry-instrumentation-langchain<1.0.0,>=0.40.5; extra == "langgraph"
Provides-Extra: llamaindex
Requires-Dist: requests<3.0.0,>=2.32.4; extra == "llamaindex"
Requires-Dist: datarobot<4.0.0,>=3.10.0; extra == "llamaindex"
Requires-Dist: datarobot-early-access==3.14.0.2026.3.18.162920; extra == "llamaindex"
Requires-Dist: datarobot-predict<2.0.0,>=1.13.2; extra == "llamaindex"
Requires-Dist: openai<3.0.0,>=2.0.0; extra == "llamaindex"
Requires-Dist: ragas<0.4.0,>=0.3.8; extra == "llamaindex"
Requires-Dist: pyjwt<3.0.0,>=2.12.0; extra == "llamaindex"
Requires-Dist: opentelemetry-instrumentation-requests<1.0.0,>=0.43b0; extra == "llamaindex"
Requires-Dist: opentelemetry-instrumentation-aiohttp-client<1.0.0,>=0.43b0; extra == "llamaindex"
Requires-Dist: opentelemetry-instrumentation-httpx<1.0.0,>=0.43b0; extra == "llamaindex"
Requires-Dist: opentelemetry-instrumentation-openai<1.0.0,>=0.40.5; extra == "llamaindex"
Requires-Dist: opentelemetry-instrumentation-threading<1.0.0,>=0.43b0; extra == "llamaindex"
Requires-Dist: ag-ui-protocol<0.2.0,>=0.1.14; extra == "llamaindex"
Requires-Dist: pyarrow==21.0.0; extra == "llamaindex"
Requires-Dist: llama-index<0.15.0,>=0.14.0; extra == "llamaindex"
Requires-Dist: llama-index-core<0.15.0,>=0.14.0; extra == "llamaindex"
Requires-Dist: llama-index-llms-langchain<0.8.0,>=0.6.1; extra == "llamaindex"
Requires-Dist: llama-index-llms-litellm<0.7.0,>=0.4.1; extra == "llamaindex"
Requires-Dist: litellm<2.0.0,>=1.83.0; extra == "llamaindex"
Requires-Dist: llama-index-llms-openai<0.7.0,>=0.6.0; extra == "llamaindex"
Requires-Dist: llama-index-tools-mcp<0.5.0,>=0.1.0; extra == "llamaindex"
Requires-Dist: nvidia-nat-llama-index==1.6.0; extra == "llamaindex"
Requires-Dist: opentelemetry-instrumentation-llamaindex<1.0.0,>=0.40.5; extra == "llamaindex"
Requires-Dist: pypdf<7.0.0,>=6.9.2; extra == "llamaindex"
Provides-Extra: nat
Requires-Dist: requests<3.0.0,>=2.32.4; extra == "nat"
Requires-Dist: datarobot<4.0.0,>=3.10.0; extra == "nat"
Requires-Dist: datarobot-early-access==3.14.0.2026.3.18.162920; extra == "nat"
Requires-Dist: datarobot-predict<2.0.0,>=1.13.2; extra == "nat"
Requires-Dist: openai<3.0.0,>=2.0.0; extra == "nat"
Requires-Dist: ragas<0.4.0,>=0.3.8; extra == "nat"
Requires-Dist: pyjwt<3.0.0,>=2.12.0; extra == "nat"
Requires-Dist: opentelemetry-instrumentation-requests<1.0.0,>=0.43b0; extra == "nat"
Requires-Dist: opentelemetry-instrumentation-aiohttp-client<1.0.0,>=0.43b0; extra == "nat"
Requires-Dist: opentelemetry-instrumentation-httpx<1.0.0,>=0.43b0; extra == "nat"
Requires-Dist: opentelemetry-instrumentation-openai<1.0.0,>=0.40.5; extra == "nat"
Requires-Dist: opentelemetry-instrumentation-threading<1.0.0,>=0.43b0; extra == "nat"
Requires-Dist: ag-ui-protocol<0.2.0,>=0.1.14; extra == "nat"
Requires-Dist: pyarrow==21.0.0; extra == "nat"
Requires-Dist: litellm<2.0.0,>=1.83.0; extra == "nat"
Requires-Dist: nvidia-nat==1.6.0; extra == "nat"
Requires-Dist: nvidia-nat-a2a==1.6.0; extra == "nat"
Requires-Dist: nvidia-nat-opentelemetry==1.6.0; extra == "nat"
Requires-Dist: nvidia-nat-langchain==1.6.0; extra == "nat"
Requires-Dist: nvidia-nat-mcp==1.6.0; extra == "nat"
Requires-Dist: anyio==4.11.0; extra == "nat"
Provides-Extra: auth
Requires-Dist: datarobot[auth]<4.0.0,>=3.10.0; extra == "auth"
Requires-Dist: aiohttp<4.0.0,>=3.13.3; extra == "auth"
Requires-Dist: pydantic<3.0.0,>=2.6.1; extra == "auth"
Provides-Extra: drmcp
Requires-Dist: datarobot[auth]<4.0.0,>=3.10.0; extra == "drmcp"
Requires-Dist: aiohttp<4.0.0,>=3.13.3; extra == "drmcp"
Requires-Dist: pydantic<3.0.0,>=2.6.1; extra == "drmcp"
Requires-Dist: beautifulsoup4<5.0.0,>=4.12.0; extra == "drmcp"
Requires-Dist: httpx<1.0.0,>=0.28.1; extra == "drmcp"
Requires-Dist: tavily-python<1.0.0,>=0.7.20; extra == "drmcp"
Requires-Dist: perplexityai<1.0,>=0.27; extra == "drmcp"
Requires-Dist: pypdf<7.0.0,>=6.9.2; extra == "drmcp"
Requires-Dist: polars<2.0.0,>=1.0.0; extra == "drmcp"
Requires-Dist: pyarrow<22.0.0,>=21.0.0; extra == "drmcp"
Requires-Dist: python-dateutil<3.0.0,>=2.9.0; extra == "drmcp"
Requires-Dist: datarobot-predict<2.0.0,>=1.13.2; extra == "drmcp"
Requires-Dist: pydantic<3.0.0,>=2.6.1; extra == "drmcp"
Requires-Dist: datarobot<4.0.0,>=3.10.0; extra == "drmcp"
Requires-Dist: datarobot-early-access==3.14.0.2026.3.18.162920; extra == "drmcp"
Requires-Dist: aiohttp<4.0.0,>=3.13.3; extra == "drmcp"
Requires-Dist: fastmcp<4.0.0,>=3.2.0; extra == "drmcp"
Requires-Dist: requests<3.0.0,>=2.32.4; extra == "drmcp"
Requires-Dist: openai<3.0.0,>=2.0.0; extra == "drmcp"
Requires-Dist: pyjwt<3.0.0,>=2.12.0; extra == "drmcp"
Requires-Dist: opentelemetry-instrumentation-requests<1.0.0,>=0.43b0; extra == "drmcp"
Requires-Dist: opentelemetry-instrumentation-aiohttp-client<1.0.0,>=0.43b0; extra == "drmcp"
Requires-Dist: opentelemetry-instrumentation-httpx<1.0.0,>=0.43b0; extra == "drmcp"
Requires-Dist: rich<16.0.0,>=13.0.0; extra == "drmcp"
Requires-Dist: datarobot-asgi-middleware<1.0.0,>=0.2.0; extra == "drmcp"
Requires-Dist: python-dotenv<2.0.0,>=1.1.0; extra == "drmcp"
Requires-Dist: boto3<2.0.0,>=1.34.0; extra == "drmcp"
Requires-Dist: pydantic-settings<3.0.0,>=2.1.0; extra == "drmcp"
Requires-Dist: opentelemetry-api<2.0.0,>=1.22.0; extra == "drmcp"
Requires-Dist: opentelemetry-sdk<2.0.0,>=1.22.0; extra == "drmcp"
Requires-Dist: opentelemetry-exporter-otlp<2.0.0,>=1.22.0; extra == "drmcp"
Requires-Dist: opentelemetry-exporter-otlp-proto-http<2.0.0,>=1.22.0; extra == "drmcp"
Requires-Dist: aiohttp-retry<3.0.0,>=2.8.3; extra == "drmcp"
Provides-Extra: drtools
Requires-Dist: datarobot[auth]<4.0.0,>=3.10.0; extra == "drtools"
Requires-Dist: aiohttp<4.0.0,>=3.13.3; extra == "drtools"
Requires-Dist: pydantic<3.0.0,>=2.6.1; extra == "drtools"
Requires-Dist: beautifulsoup4<5.0.0,>=4.12.0; extra == "drtools"
Requires-Dist: httpx<1.0.0,>=0.28.1; extra == "drtools"
Requires-Dist: tavily-python<1.0.0,>=0.7.20; extra == "drtools"
Requires-Dist: perplexityai<1.0,>=0.27; extra == "drtools"
Requires-Dist: pypdf<7.0.0,>=6.9.2; extra == "drtools"
Requires-Dist: polars<2.0.0,>=1.0.0; extra == "drtools"
Requires-Dist: pyarrow<22.0.0,>=21.0.0; extra == "drtools"
Requires-Dist: python-dateutil<3.0.0,>=2.9.0; extra == "drtools"
Requires-Dist: datarobot-predict<2.0.0,>=1.13.2; extra == "drtools"
Requires-Dist: pydantic<3.0.0,>=2.6.1; extra == "drtools"
Requires-Dist: datarobot<4.0.0,>=3.10.0; extra == "drtools"
Requires-Dist: datarobot-early-access==3.14.0.2026.3.18.162920; extra == "drtools"
Requires-Dist: aiohttp<4.0.0,>=3.13.3; extra == "drtools"
Provides-Extra: dragent
Requires-Dist: requests<3.0.0,>=2.32.4; extra == "dragent"
Requires-Dist: datarobot<4.0.0,>=3.10.0; extra == "dragent"
Requires-Dist: datarobot-early-access==3.14.0.2026.3.18.162920; extra == "dragent"
Requires-Dist: datarobot-predict<2.0.0,>=1.13.2; extra == "dragent"
Requires-Dist: openai<3.0.0,>=2.0.0; extra == "dragent"
Requires-Dist: ragas<0.4.0,>=0.3.8; extra == "dragent"
Requires-Dist: pyjwt<3.0.0,>=2.12.0; extra == "dragent"
Requires-Dist: opentelemetry-instrumentation-requests<1.0.0,>=0.43b0; extra == "dragent"
Requires-Dist: opentelemetry-instrumentation-aiohttp-client<1.0.0,>=0.43b0; extra == "dragent"
Requires-Dist: opentelemetry-instrumentation-httpx<1.0.0,>=0.43b0; extra == "dragent"
Requires-Dist: opentelemetry-instrumentation-openai<1.0.0,>=0.40.5; extra == "dragent"
Requires-Dist: opentelemetry-instrumentation-threading<1.0.0,>=0.43b0; extra == "dragent"
Requires-Dist: ag-ui-protocol<0.2.0,>=0.1.14; extra == "dragent"
Requires-Dist: pyarrow==21.0.0; extra == "dragent"
Requires-Dist: litellm<2.0.0,>=1.83.0; extra == "dragent"
Requires-Dist: nvidia-nat==1.6.0; extra == "dragent"
Requires-Dist: nvidia-nat-a2a==1.6.0; extra == "dragent"
Requires-Dist: nvidia-nat-opentelemetry==1.6.0; extra == "dragent"
Requires-Dist: nvidia-nat-langchain==1.6.0; extra == "dragent"
Requires-Dist: nvidia-nat-mcp==1.6.0; extra == "dragent"
Requires-Dist: anyio==4.11.0; extra == "dragent"
Requires-Dist: fastapi<0.133.0; extra == "dragent"
Requires-Dist: starlette<1.0.0; extra == "dragent"
Provides-Extra: memory
Requires-Dist: mem0ai<2.0.0,>=1.0.4; python_version < "3.13" and extra == "memory"
Dynamic: license-file
Dynamic: provides-extra

<p align="center">
  <a href="https://github.com/datarobot-oss/datarobot-genai">
    <img src="docs/img/datarobot_logo.avif" width="600px" alt="DataRobot Logo"/>
  </a>
</p>
<h3 align="center">DataRobot GenAI Library</h3>

<p align="center">
  <a href="https://www.datarobot.com/">Homepage</a>
  ·
  <a href="https://pypi.org/project/datarobot-genai/">PyPI</a>
  ·
  <a href="https://docs.datarobot.com/en/docs/get-started/troubleshooting/general-help.html">Support</a>
</p>

<p align="center">
  <a href="/LICENSE">
    <img src="https://img.shields.io/github/license/datarobot-oss/datarobot-genai" alt="License">
  </a>
  <a href="https://pypi.org/project/datarobot-genai/">
    <img src="https://img.shields.io/pypi/v/datarobot-genai" alt="PyPI version">
  </a>
</p>


## Features

- **AG-UI integration** — Agents expose a standard **AG-UI** event stream (`RunAgentInput` in, lifecycle + text + tool-call events out), so UIs and the DataRobot platform can render runs consistently without bespoke adapters per framework.
- **Multi-agent systems out of the box** — First-class patterns for **planner/writer crews**, **LangGraph** multi-node graphs, and **LlamaIndex** `AgentWorkflow` handoffs; wrap them with one helper and keep the same streaming contract.
- **Unified LLM layer (DataRobot-compatible)** — One **`get_llm()`** entry point per integration (**LangGraph**, **LlamaIndex**, **CrewAI**), all backed by the same **LiteLLM**-based routing to the **DataRobot LLM Gateway**, **LLM deployments**, **NIM**, or external providers—driven by the same environment and `Config`, so every component speaks to DataRobot consistently.
- Utilities for common GenAI workflows.
- **Integrations:** CrewAI, LangGraph, LlamaIndex, NAT, MCP.

User-facing walkthrough: [docs/README.md](docs/README.md).

## Installation
- Requires Python 3.11–3.13.
- Install:
```bash
pip install --upgrade pip
pip install "datarobot-genai"
```
- Optional extras:
```bash
pip install "datarobot-genai[crewai]"
pip install "datarobot-genai[langgraph]"
pip install "datarobot-genai[llamaindex]"
# Multiple extras
pip install "datarobot-genai[crewai,langgraph,llamaindex]"
```
  Available extras include: `crewai`, `langgraph`, `llamaindex`, `nat`, `drmcp`, `pydanticai`.

## Excluded Dependencies

Some transitive dependencies are excluded via `exclude-dependencies` in `pyproject.toml` because they are unused by this project. Do not re-add them.

| Package | Pulled in by | Reason for exclusion |
|---|---|---|
| `uv` | build tooling | Not a runtime dependency |
| `langchain-milvus` | langchain ecosystem | Unused vector store integration |
| `pymilvus` | langchain-milvus | Transitive dep of langchain-milvus |
| `flask` | nvidia-nat-core 1.6.0 | Only used in NAT examples, not core library code ([ref](https://github.com/NVIDIA/NeMo-Agent-Toolkit/blob/main/packages/nvidia_nat_core/pyproject.toml#L66)) |

## Development
Prerequisites: Python 3.11–3.14, uv, Task CLI, pre-commit.
```bash
uv sync --all-extras --dev
pre-commit install
task test
```

### Semantic versioning
Every change requires a patch version change. It also requires an entry to CHANGELOG.md.
Changes breaking backward compatibility requires a minor version change.

### Test pypi
To build and publish a dev version of a package, comment `/build` on a PR.

## Publishing
- PRs (same-repo): comment `/build` to publish dev builds to TestPyPI (`.devN`).
- Merge to `main`: tags `v{version}` and publishes to PyPI automatically.
- Pushing a `v*` tag also triggers PyPI publish.
- Optional: `task release:tag-and-push` creates and pushes `v{version}` locally.

## Links
- Home: https://github.com/datarobot-oss/datarobot-genai
- PyPI: https://pypi.org/project/datarobot-genai/
- TestPyPI: https://test.pypi.org/project/datarobot-genai/

## License
Apache-2.0
