Metadata-Version: 2.4
Name: datarobot-genai
Version: 0.29.72
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.33.0; extra == "core"
Requires-Dist: datarobot[core]<4.0.0,>=3.19.0; extra == "core"
Requires-Dist: datarobot-predict<2.0.0,>=1.13.2; extra == "core"
Requires-Dist: openai<3.0.0,>=2.30.0; extra == "core"
Requires-Dist: pyjwt<3.0.0,>=2.15.0; extra == "core"
Requires-Dist: opentelemetry-instrumentation-requests<1.0.0,>=0.64b0; extra == "core"
Requires-Dist: opentelemetry-instrumentation-aiohttp-client<1.0.0,>=0.64b0; extra == "core"
Requires-Dist: opentelemetry-instrumentation-httpx<1.0.0,>=0.64b0; extra == "core"
Requires-Dist: opentelemetry-instrumentation-openai<1.0.0,>=0.62.1; extra == "core"
Requires-Dist: opentelemetry-instrumentation-threading<1.0.0,>=0.64b0; extra == "core"
Requires-Dist: datarobot-moderations[all]<12.0.0,>=11.3.7; extra == "core"
Requires-Dist: llama-index-llms-bedrock-converse[async]>=0.15.0; extra == "core"
Requires-Dist: ag-ui-protocol==0.1.15; extra == "core"
Requires-Dist: pyarrow<24.0.0,>=23.0.1; extra == "core"
Requires-Dist: colorama<1.0.0,>=0.4.6; extra == "core"
Requires-Dist: httpx-retries>=0.4.0; extra == "core"
Provides-Extra: crewai
Requires-Dist: requests<3.0.0,>=2.33.0; extra == "crewai"
Requires-Dist: datarobot[core]<4.0.0,>=3.19.0; extra == "crewai"
Requires-Dist: datarobot-predict<2.0.0,>=1.13.2; extra == "crewai"
Requires-Dist: openai<3.0.0,>=2.30.0; extra == "crewai"
Requires-Dist: pyjwt<3.0.0,>=2.15.0; extra == "crewai"
Requires-Dist: opentelemetry-instrumentation-requests<1.0.0,>=0.64b0; extra == "crewai"
Requires-Dist: opentelemetry-instrumentation-aiohttp-client<1.0.0,>=0.64b0; extra == "crewai"
Requires-Dist: opentelemetry-instrumentation-httpx<1.0.0,>=0.64b0; extra == "crewai"
Requires-Dist: opentelemetry-instrumentation-openai<1.0.0,>=0.62.1; extra == "crewai"
Requires-Dist: opentelemetry-instrumentation-threading<1.0.0,>=0.64b0; extra == "crewai"
Requires-Dist: datarobot-moderations[all]<12.0.0,>=11.3.7; extra == "crewai"
Requires-Dist: llama-index-llms-bedrock-converse[async]>=0.15.0; extra == "crewai"
Requires-Dist: ag-ui-protocol==0.1.15; extra == "crewai"
Requires-Dist: pyarrow<24.0.0,>=23.0.1; extra == "crewai"
Requires-Dist: colorama<1.0.0,>=0.4.6; extra == "crewai"
Requires-Dist: httpx-retries>=0.4.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]<2.0.0,>=1.15.21; extra == "crewai"
Requires-Dist: litellm<2.0.0,>=1.96.2; extra == "crewai"
Requires-Dist: crewai-tools[mcp]<2.0.0,>=1.15.21; extra == "crewai"
Requires-Dist: mcpadapt>=0.1.9; extra == "crewai"
Requires-Dist: nvidia-nat-crewai==1.7.0; extra == "crewai"
Requires-Dist: opentelemetry-instrumentation-crewai<1.0.0,>=0.62.1; extra == "crewai"
Provides-Extra: langgraph
Requires-Dist: requests<3.0.0,>=2.33.0; extra == "langgraph"
Requires-Dist: datarobot[core]<4.0.0,>=3.19.0; extra == "langgraph"
Requires-Dist: datarobot-predict<2.0.0,>=1.13.2; extra == "langgraph"
Requires-Dist: openai<3.0.0,>=2.30.0; extra == "langgraph"
Requires-Dist: pyjwt<3.0.0,>=2.15.0; extra == "langgraph"
Requires-Dist: opentelemetry-instrumentation-requests<1.0.0,>=0.64b0; extra == "langgraph"
Requires-Dist: opentelemetry-instrumentation-aiohttp-client<1.0.0,>=0.64b0; extra == "langgraph"
Requires-Dist: opentelemetry-instrumentation-httpx<1.0.0,>=0.64b0; extra == "langgraph"
Requires-Dist: opentelemetry-instrumentation-openai<1.0.0,>=0.62.1; extra == "langgraph"
Requires-Dist: opentelemetry-instrumentation-threading<1.0.0,>=0.64b0; extra == "langgraph"
Requires-Dist: datarobot-moderations[all]<12.0.0,>=11.3.7; extra == "langgraph"
Requires-Dist: llama-index-llms-bedrock-converse[async]>=0.15.0; extra == "langgraph"
Requires-Dist: ag-ui-protocol==0.1.15; extra == "langgraph"
Requires-Dist: pyarrow<24.0.0,>=23.0.1; extra == "langgraph"
Requires-Dist: colorama<1.0.0,>=0.4.6; extra == "langgraph"
Requires-Dist: httpx-retries>=0.4.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: litellm<2.0.0,>=1.96.2; extra == "langgraph"
Requires-Dist: nvidia-nat-langchain==1.7.0; extra == "langgraph"
Requires-Dist: opentelemetry-instrumentation-langchain<1.0.0,>=0.62.1; extra == "langgraph"
Provides-Extra: llamaindex
Requires-Dist: requests<3.0.0,>=2.33.0; extra == "llamaindex"
Requires-Dist: datarobot[core]<4.0.0,>=3.19.0; extra == "llamaindex"
Requires-Dist: datarobot-predict<2.0.0,>=1.13.2; extra == "llamaindex"
Requires-Dist: openai<3.0.0,>=2.30.0; extra == "llamaindex"
Requires-Dist: pyjwt<3.0.0,>=2.15.0; extra == "llamaindex"
Requires-Dist: opentelemetry-instrumentation-requests<1.0.0,>=0.64b0; extra == "llamaindex"
Requires-Dist: opentelemetry-instrumentation-aiohttp-client<1.0.0,>=0.64b0; extra == "llamaindex"
Requires-Dist: opentelemetry-instrumentation-httpx<1.0.0,>=0.64b0; extra == "llamaindex"
Requires-Dist: opentelemetry-instrumentation-openai<1.0.0,>=0.62.1; extra == "llamaindex"
Requires-Dist: opentelemetry-instrumentation-threading<1.0.0,>=0.64b0; extra == "llamaindex"
Requires-Dist: datarobot-moderations[all]<12.0.0,>=11.3.7; extra == "llamaindex"
Requires-Dist: llama-index-llms-bedrock-converse[async]>=0.15.0; extra == "llamaindex"
Requires-Dist: ag-ui-protocol==0.1.15; extra == "llamaindex"
Requires-Dist: pyarrow<24.0.0,>=23.0.1; extra == "llamaindex"
Requires-Dist: colorama<1.0.0,>=0.4.6; extra == "llamaindex"
Requires-Dist: httpx-retries>=0.4.0; extra == "llamaindex"
Requires-Dist: llama-index-core<0.15.0,>=0.14.0; extra == "llamaindex"
Requires-Dist: llama-index-llms-langchain<1.0.0,>=0.8.0; extra == "llamaindex"
Requires-Dist: llama-index-llms-litellm<0.7.0,>=0.4.1; extra == "llamaindex"
Requires-Dist: litellm<2.0.0,>=1.96.2; extra == "llamaindex"
Requires-Dist: llama-index-tools-mcp<0.5.0,>=0.1.0; extra == "llamaindex"
Requires-Dist: nvidia-nat-llama-index==1.7.0; extra == "llamaindex"
Requires-Dist: opentelemetry-instrumentation-llamaindex<1.0.0,>=0.62.1; extra == "llamaindex"
Requires-Dist: datarobot-opentelemetry<1.0.0,>=0.4.0; extra == "llamaindex"
Provides-Extra: auth
Requires-Dist: datarobot[auth]<4.0.0,>=3.19.0; extra == "auth"
Requires-Dist: aiohttp<4.0.0,>=3.14.3; extra == "auth"
Requires-Dist: pydantic<3.0.0,>=2.6.1; extra == "auth"
Requires-Dist: httpx<1.0.0,>=0.28.1; extra == "auth"
Requires-Dist: pyjwt[crypto]<3.0.0,>=2.15.0; extra == "auth"
Requires-Dist: okta-client-python<1.0.0,>=0.2.0; extra == "auth"
Requires-Dist: pydantic-settings<3.0.0,>=2.14.2; extra == "auth"
Provides-Extra: eval
Requires-Dist: nemo-evaluator-launcher; extra == "eval"
Requires-Dist: litellm<2.0.0,>=1.96.2; extra == "eval"
Requires-Dist: pyyaml>=6.0; extra == "eval"
Provides-Extra: drmcpbase
Requires-Dist: datarobot[auth]<4.0.0,>=3.19.0; extra == "drmcpbase"
Requires-Dist: aiohttp<4.0.0,>=3.14.3; extra == "drmcpbase"
Requires-Dist: pydantic<3.0.0,>=2.6.1; extra == "drmcpbase"
Requires-Dist: httpx<1.0.0,>=0.28.1; extra == "drmcpbase"
Requires-Dist: pyjwt[crypto]<3.0.0,>=2.15.0; extra == "drmcpbase"
Requires-Dist: okta-client-python<1.0.0,>=0.2.0; extra == "drmcpbase"
Requires-Dist: pydantic-settings<3.0.0,>=2.14.2; extra == "drmcpbase"
Requires-Dist: datarobot[fs]<4.0.0,>=3.19.0; extra == "drmcpbase"
Requires-Dist: starlette>=1.3.1; extra == "drmcpbase"
Requires-Dist: fastmcp<4.0.0,>=3.4.1; extra == "drmcpbase"
Requires-Dist: aiohttp<4.0.0,>=3.14.3; extra == "drmcpbase"
Requires-Dist: aiohttp-retry<3.0.0,>=2.8.3; extra == "drmcpbase"
Requires-Dist: cachetools<8.0.0,>=5.0.0; extra == "drmcpbase"
Requires-Dist: opentelemetry-api<2.0.0,>=1.22.0; extra == "drmcpbase"
Requires-Dist: opentelemetry-sdk<2.0.0,>=1.22.0; extra == "drmcpbase"
Requires-Dist: opentelemetry-exporter-otlp-proto-http<2.0.0,>=1.22.0; extra == "drmcpbase"
Provides-Extra: drmcputils
Requires-Dist: datarobot[auth]<4.0.0,>=3.19.0; extra == "drmcputils"
Requires-Dist: aiohttp<4.0.0,>=3.14.3; extra == "drmcputils"
Requires-Dist: pydantic<3.0.0,>=2.6.1; extra == "drmcputils"
Requires-Dist: httpx<1.0.0,>=0.28.1; extra == "drmcputils"
Requires-Dist: pyjwt[crypto]<3.0.0,>=2.15.0; extra == "drmcputils"
Requires-Dist: okta-client-python<1.0.0,>=0.2.0; extra == "drmcputils"
Requires-Dist: pydantic-settings<3.0.0,>=2.14.2; extra == "drmcputils"
Requires-Dist: datarobot[fs]<4.0.0,>=3.19.0; extra == "drmcputils"
Provides-Extra: drmcp
Requires-Dist: datarobot[auth]<4.0.0,>=3.19.0; extra == "drmcp"
Requires-Dist: aiohttp<4.0.0,>=3.14.3; extra == "drmcp"
Requires-Dist: pydantic<3.0.0,>=2.6.1; extra == "drmcp"
Requires-Dist: httpx<1.0.0,>=0.28.1; extra == "drmcp"
Requires-Dist: pyjwt[crypto]<3.0.0,>=2.15.0; extra == "drmcp"
Requires-Dist: okta-client-python<1.0.0,>=0.2.0; extra == "drmcp"
Requires-Dist: pydantic-settings<3.0.0,>=2.14.2; extra == "drmcp"
Requires-Dist: datarobot[fs]<4.0.0,>=3.19.0; extra == "drmcp"
Requires-Dist: starlette>=1.3.1; extra == "drmcp"
Requires-Dist: fastmcp<4.0.0,>=3.4.1; extra == "drmcp"
Requires-Dist: aiohttp<4.0.0,>=3.14.3; extra == "drmcp"
Requires-Dist: aiohttp-retry<3.0.0,>=2.8.3; extra == "drmcp"
Requires-Dist: cachetools<8.0.0,>=5.0.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-proto-http<2.0.0,>=1.22.0; extra == "drmcp"
Requires-Dist: datarobot[auth]<4.0.0,>=3.19.0; extra == "drmcp"
Requires-Dist: aiohttp<4.0.0,>=3.14.3; extra == "drmcp"
Requires-Dist: pydantic<3.0.0,>=2.6.1; extra == "drmcp"
Requires-Dist: httpx<1.0.0,>=0.28.1; extra == "drmcp"
Requires-Dist: pyjwt[crypto]<3.0.0,>=2.15.0; extra == "drmcp"
Requires-Dist: okta-client-python<1.0.0,>=0.2.0; extra == "drmcp"
Requires-Dist: pydantic-settings<3.0.0,>=2.14.2; extra == "drmcp"
Requires-Dist: datarobot[fs]<4.0.0,>=3.19.0; 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.19.0; extra == "drmcp"
Requires-Dist: polars<2.0.0,>=1.0.0; extra == "drmcp"
Requires-Dist: pyarrow<24.0.0,>=23.0.1; 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: aiohttp<4.0.0,>=3.14.3; 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-proto-http<2.0.0,>=1.22.0; extra == "drmcp"
Requires-Dist: requests<3.0.0,>=2.33.0; extra == "drmcp"
Requires-Dist: openai<3.0.0,>=2.30.0; extra == "drmcp"
Requires-Dist: pyjwt<3.0.0,>=2.15.0; extra == "drmcp"
Requires-Dist: opentelemetry-instrumentation-requests<1.0.0,>=0.64b0; extra == "drmcp"
Requires-Dist: opentelemetry-instrumentation-aiohttp-client<1.0.0,>=0.64b0; extra == "drmcp"
Requires-Dist: opentelemetry-instrumentation-httpx<1.0.0,>=0.64b0; 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: pydantic-settings<3.0.0,>=2.14.2; extra == "drmcp"
Requires-Dist: opentelemetry-api<2.0.0,>=1.43.0; extra == "drmcp"
Requires-Dist: opentelemetry-sdk<2.0.0,>=1.43.0; extra == "drmcp"
Requires-Dist: opentelemetry-exporter-otlp<2.0.0,>=1.43.0; extra == "drmcp"
Requires-Dist: opentelemetry-exporter-otlp-proto-http<2.0.0,>=1.43.0; extra == "drmcp"
Requires-Dist: async-lru>=2.3.0; extra == "drmcp"
Provides-Extra: drtools
Requires-Dist: datarobot[auth]<4.0.0,>=3.19.0; extra == "drtools"
Requires-Dist: aiohttp<4.0.0,>=3.14.3; extra == "drtools"
Requires-Dist: pydantic<3.0.0,>=2.6.1; extra == "drtools"
Requires-Dist: httpx<1.0.0,>=0.28.1; extra == "drtools"
Requires-Dist: pyjwt[crypto]<3.0.0,>=2.15.0; extra == "drtools"
Requires-Dist: okta-client-python<1.0.0,>=0.2.0; extra == "drtools"
Requires-Dist: pydantic-settings<3.0.0,>=2.14.2; extra == "drtools"
Requires-Dist: datarobot[fs]<4.0.0,>=3.19.0; 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.19.0; extra == "drtools"
Requires-Dist: polars<2.0.0,>=1.0.0; extra == "drtools"
Requires-Dist: pyarrow<24.0.0,>=23.0.1; 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: aiohttp<4.0.0,>=3.14.3; extra == "drtools"
Requires-Dist: opentelemetry-api<2.0.0,>=1.22.0; extra == "drtools"
Requires-Dist: opentelemetry-sdk<2.0.0,>=1.22.0; extra == "drtools"
Requires-Dist: opentelemetry-exporter-otlp-proto-http<2.0.0,>=1.22.0; extra == "drtools"
Provides-Extra: dragent
Requires-Dist: requests<3.0.0,>=2.33.0; extra == "dragent"
Requires-Dist: datarobot[core]<4.0.0,>=3.19.0; extra == "dragent"
Requires-Dist: datarobot-predict<2.0.0,>=1.13.2; extra == "dragent"
Requires-Dist: openai<3.0.0,>=2.30.0; extra == "dragent"
Requires-Dist: pyjwt<3.0.0,>=2.15.0; extra == "dragent"
Requires-Dist: opentelemetry-instrumentation-requests<1.0.0,>=0.64b0; extra == "dragent"
Requires-Dist: opentelemetry-instrumentation-aiohttp-client<1.0.0,>=0.64b0; extra == "dragent"
Requires-Dist: opentelemetry-instrumentation-httpx<1.0.0,>=0.64b0; extra == "dragent"
Requires-Dist: opentelemetry-instrumentation-openai<1.0.0,>=0.62.1; extra == "dragent"
Requires-Dist: opentelemetry-instrumentation-threading<1.0.0,>=0.64b0; extra == "dragent"
Requires-Dist: datarobot-moderations[all]<12.0.0,>=11.3.7; extra == "dragent"
Requires-Dist: llama-index-llms-bedrock-converse[async]>=0.15.0; extra == "dragent"
Requires-Dist: ag-ui-protocol==0.1.15; extra == "dragent"
Requires-Dist: pyarrow<24.0.0,>=23.0.1; extra == "dragent"
Requires-Dist: colorama<1.0.0,>=0.4.6; extra == "dragent"
Requires-Dist: httpx-retries>=0.4.0; extra == "dragent"
Requires-Dist: datarobot[application-utils]<4.0.0,>=3.19.0; extra == "dragent"
Requires-Dist: nvidia-nat==1.7.0; extra == "dragent"
Requires-Dist: nvidia-nat-a2a==1.7.0; extra == "dragent"
Requires-Dist: nvidia-nat-opentelemetry==1.7.0; extra == "dragent"
Requires-Dist: nvidia-nat-langchain==1.7.0; extra == "dragent"
Requires-Dist: nvidia-nat-mcp==1.7.0; extra == "dragent"
Requires-Dist: mem0ai<2.0.0,>=1.0.4; extra == "dragent"
Requires-Dist: starlette>=1.3.1; extra == "dragent"
Requires-Dist: opentelemetry-instrumentation-fastapi<1.0.0,>=0.64b0; extra == "dragent"
Requires-Dist: datarobot-opentelemetry<1.0.0,>=0.4.0; extra == "dragent"
Requires-Dist: cachetools<8.0.0,>=5.0.0; extra == "dragent"
Requires-Dist: tensile<1.0.0,>=0.12.0; extra == "dragent"
Dynamic: license-file
Dynamic: provides-extra

<p align="center">
  <a href="https://github.com/datarobot-oss/datarobot-genai">
    <img src="https://raw.githubusercontent.com/datarobot-oss/datarobot-genai/main/docs/src/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="https://github.com/datarobot-oss/datarobot-genai/blob/main/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>

A toolkit for building agents on DataRobot.

- **Unified LLM layer (DataRobot-compatible)**&mdash;one **`get_llm()`** entry point per integration (**LangGraph**, **LlamaIndex**, **CrewAI**, **NAT**), all backed by the same **LiteLLM**-based routing to the **DataRobot LLM Gateway**, **LLM deployments**, **NIM**, or external providers.
- **Library of agentic tools and DataRobot-compatible MCP server**&mdash;use `drtools` and `drmcp` to give agents first-class capabilities to interact with the world.
- **AG-UI integration**&mdash;agents expose a standard **AG-UI** event stream (`RunAgentInput` in, lifecycle + text + tool-call events out), so UIs and the DataRobot platform render runs consistently without bespoke adapters per framework.
- **Multi-agent systems out of the box**&mdash;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.
- **Orchestration**&mdash;build agents from universal pieces in the low-code `workflow.yaml` interface. Combine and reuse LLMs, tools, agents, and evaluators. The design stays compatible with and draws inspiration from [NeMo Agentic Toolkit](https://github.com/NVIDIA/NeMo-Agent-Toolkit).
- **Serving and evaluating with DRAgent**&mdash;run a front-end server to plug an agent into a real-world application. DRAgent supports distributed tracing, generation and evaluation endpoints, and async generations.

# Table of contents

- [Use](#use)
  - [Prerequisites](#prerequisites)
  - [Installation](#installation)
  - [Credentials](#credentials)
  - [Standalone end-to-end examples](#standalone-end-to-end-examples)
  - [In-depth documentation](#in-depth-documentation)
- [Develop](#develop)
  - [Semantic versioning](#semantic-versioning)
  - [TestPyPI](#testpypi)
  - [Excluded upstream dependencies](#excluded-upstream-dependencies)
- [Troubleshooting](#troubleshooting)
- [Next steps](#next-steps)
- [Publishing](#publishing)
- [Contributing and support](#contributing-and-support)
- [Links](#links)
- [License](#license)

# Use

## Prerequisites

The following requirements apply before installing or running samples:

| Requirement | Notes |
|---|---|
| Python 3.11–3.13 | Required for all installs |
| DataRobot account | Required for gateway, deployments, MCP, and platform features |
| Agent framework extra | One of `crewai`, `langgraph`, or `llamaindex`; use `dragent` for NAT/DRAgent |

For local development, also install [`uv`](https://docs.astral.sh/uv/), [Task](https://taskfile.dev/), and [pre-commit](https://pre-commit.com/).

## Installation

Requires Python 3.11–3.13. Install the extra that matches the target framework:
```bash
pip install "datarobot-genai[crewai]"
pip install "datarobot-genai[langgraph]"
pip install "datarobot-genai[llamaindex]"
pip install "datarobot-genai[dragent]"
```

Optional extras:

* `datarobot-genai[dragent]`&mdash;serve and orchestrate agents with `DRAgent`.
* `datarobot-genai[drtools]`&mdash;use the standard library of agentic tools DataRobot provides.
* `datarobot-genai[drmcpbase]`&mdash;Base class to derive FastMCP servers.
* `datarobot-genai[drmcputils]`&mdash;shared MCP utilities consumed by `drmcpbase` and `drtools`.
* `datarobot-genai[drmcp]`&mdash;host a custom MCP server in DataRobot (includes `drmcpbase`, `drtools`, and template-server dependencies).
* `datarobot-genai[eval]`&mdash;agent evaluation utilities built on the NeMo Evaluator launcher.

## Credentials

A DataRobot account is required for DataRobot-backed features. Export these environment variables:

```bash
# Set the DataRobot API token (replace the placeholder).
export DATAROBOT_API_TOKEN=YOUR_DATAROBOT_API_TOKEN
export DATAROBOT_ENDPOINT=https://app.datarobot.com/api/v2
```

## Standalone end-to-end examples

Follow [quickstart.ipynb](https://github.com/datarobot-oss/datarobot-genai/blob/main/e2e-tests/examples/quickstart.ipynb) to walk through setting up a LangGraph agent with DataRobot:

* LLM Gateway
* `drtools`
* Prompt Management
* Conversion to DataRobot agent format
* Running the agent with an AG-UI interface.

## In-depth documentation

See [docs/README.md](https://github.com/datarobot-oss/datarobot-genai/blob/main/docs/README.md) for in-repo guides on every framework and feature in `datarobot-genai`. The published site is at [genai.datarobot.com](https://genai.datarobot.com/).

# Develop

Requires Python 3.11–3.13, uv, Task CLI, and pre-commit.
```bash
uv sync --all-extras --dev
pre-commit install
task test
```

## Semantic versioning

Bump the patch version and add an entry to `CHANGELOG.md` for each library change.
Bump the minor version for backward-incompatible changes.

## TestPyPI

Comment `/build` on a PR to build and publish a dev version of the package to TestPyPI.

## Excluded upstream dependencies

Several transitive dependencies pulled in by upstream packages are not used by this library at runtime.
These are explicitly excluded via `[tool.uv] exclude-dependencies` in `pyproject.toml` to reduce install size and CVE surface area.

| Package | Pulled in by | Reason excluded |
|---------|-------------|-----------------|
| `build` | `crewai` | Python build system; runtime unnecessary |
| `flask` | `nvidia-nat 1.6.0` | Web framework; not used |
| `kubernetes` | `crewai-tools` | K8s client; not used |
| `lancedb` | `crewai` | Optional vector DB backend; not used |
| `langchain-milvus` | `nvidia-nat-langchain` | Milvus vector DB adapter; not used |
| `leptonai` | `nemo-evaluator-launcher` | Lepton AI cloud backend; not used, pins `httpx==0.27.2` which conflicts with the `auth` extra |
| `llama-index-cli` | `llama-index` | CLI tool; not needed at runtime |
| `openpyxl` | `crewai-tools` | Excel parser; not used |
| `pymilvus` | `langchain-milvus` | Milvus client; not used |
| `python-docx` | `crewai-tools` | Word doc parser; not used |
| `pytube` | `crewai-tools` | YouTube downloader; not used |
| `stagehand` | `crewai-tools` | Playwright web automation; not used |
| `uv` | `crewai` | Package manager bundled as a runtime dep; not needed |
| `youtube-transcript-api` | `crewai-tools` | YouTube transcripts; not used |

# Troubleshooting

Common setup and runtime issues and where to find answers:

| Symptom | Where to look |
|---|---|
| LLM auth or routing errors | [docs/src/llm.md](https://github.com/datarobot-oss/datarobot-genai/blob/main/docs/src/llm.md) — verify `DATAROBOT_API_TOKEN` and gateway flags |
| MCP tools missing at runtime | Framework MCP guides under [docs/README.md](https://github.com/datarobot-oss/datarobot-genai/blob/main/docs/README.md) — merge injected tools with local tools |
| DRAgent tracing empty | [docs/src/dragent/tracing.md](https://github.com/datarobot-oss/datarobot-genai/blob/main/docs/src/dragent/tracing.md) — OTLP env vars and `instrument()` in `register.py` |
| E2E test failures locally | [e2e-tests/README.md](https://github.com/datarobot-oss/datarobot-genai/blob/main/e2e-tests/README.md) |

# Next steps

After installation, continue with these resources:

- Pick a framework guide from [docs/README.md](https://github.com/datarobot-oss/datarobot-genai/blob/main/docs/README.md) and start from the matching sample under `e2e-tests/dragent/`.
- Read [DRAgent CLI](https://github.com/datarobot-oss/datarobot-genai/blob/main/docs/src/dragent/README.md) for `serve`, `run`, and `query`.
- Browse the [API reference](https://genai.datarobot.com/api/) on the published docs site.

# Publishing

Release and distribution options for the package.

- **Same-repo PRs**&mdash;comment `/build` on a PR to publish dev builds to TestPyPI (`.devN`).
- **Merge to `main`**&mdash;the release flow creates tag `v{version}` and publishes to PyPI automatically.
- **Version tags**&mdash;pushing a `v*` tag also triggers PyPI publish.
- **Local release**&mdash;optionally run `task release:tag-and-push` to create and push `v{version}` locally.

# Contributing and support

See [CONTRIBUTING.md](https://github.com/datarobot-oss/datarobot-genai/blob/main/CONTRIBUTING.md) for issue guidelines, changelog expectations, and versioning. Report bugs via [GitHub Issues](https://github.com/datarobot-oss/datarobot-genai/issues). For security issues, email oss-community-management@datarobot.com.

# Links

External references for the package and source repository:

- [Repository](https://github.com/datarobot-oss/datarobot-genai)&mdash;source and issues.
- [PyPI](https://pypi.org/project/datarobot-genai/)&mdash;released packages.
- [TestPyPI](https://test.pypi.org/project/datarobot-genai/)&mdash;dev builds.

# License

Apache-2.0&mdash;see [LICENSE](https://github.com/datarobot-oss/datarobot-genai/blob/main/LICENSE).
