Metadata-Version: 2.5
Name: datagoat-decide
Version: 0.2.0
Summary: Let Datagoat answer a decision step in your agent, with your AI as the fallback.
Project-URL: Homepage, https://datagoat.io
Project-URL: Repository, https://github.com/dmilstein-match/datagoat-gde
License-Expression: MIT
Keywords: agent,datagoat,decision,fallback,langgraph
Requires-Python: >=3.10
Requires-Dist: httpx>=0.27
Provides-Extra: langgraph
Requires-Dist: langgraph>=0.4; extra == 'langgraph'
Requires-Dist: pydantic>=2; extra == 'langgraph'
Description-Content-Type: text/markdown

# datagoat-decide (Python)

```bash
pip install datagoat-decide     # or: uv add datagoat-decide
export DATAGOAT_API_KEY=dg_live_...
```

## Wrap a LangGraph node

```python
from datagoat_decide import Datagoat
dg = Datagoat()  # reads DATAGOAT_API_KEY and DATAGOAT_BASE_URL (your data1 deployment URL)

graph.add_node("qualify", dg.wrap("sdr.qualify", qualify_lead,
    input_key="lead", output_key="qualification", case_id="lead_id"))
```

* **Valid answer** → Datagoat's answer goes into `state["qualification"]`, your node does not run.
* **No valid answer** → your fallback (set in the dashboard): your node runs as before, or the case
  goes to a person, or no decision (`None`).
* **Datagoat unreachable or slow** → your node runs. The SDK never blocks your agent past its
  budget (`timeout`, default 2.5 s). Every call carries an idempotency key, so a call that timed
  out after Datagoat logged it is replayed off your agent's path and still graded.

## Any function

```python
@dg.point("cs.risk_tier", case_id=lambda acct: acct["account_id"])
def risk_tier(acct: dict) -> dict: ...
```

## Outcomes

```python
dg.outcomes("sdr.qualify", [{"case_id": "L-20419", "value": 1}])
```

## Map your agent

```bash
datagoat-decide map my_agent.graph:graph --name "SDR agent"
```
