Metadata-Version: 2.5
Name: render-lab-tasks-langsmith
Version: 0.1.0
Summary: langsmith tasks for Render Workflows
Project-URL: Repository, https://github.com/render-lab/render-tasks-python
License-Expression: MIT
License-File: LICENSE
Requires-Python: >=3.12
Requires-Dist: httpx<0.29,>=0.28
Requires-Dist: render-lab-tasks-core<0.2,>=0.1.1
Requires-Dist: render-lab-triggers<0.2,>=0.1.0
Requires-Dist: render==1.0.1
Description-Content-Type: text/markdown

# render-lab-tasks-langsmith

Unreleased Python port: **12 registered tasks** from
[render-lab/render-tasks](https://github.com/render-lab/render-tasks/tree/45f9c2d44bd28e01ae9813e0d2ff56ee6c533816/packages/tasks-langsmith).
Python 3.12+, Render SDK 1.0.1. Requires core 0.1.1 or later.

From the repository root:

```sh
uv sync --all-packages --locked
```

Import `render_lab_tasks_langsmith.tasks` to register tasks. The package root is inert.
Compose the exported `app` with `Workflows.from_workflows`; call tasks through
`ctx.run`. Every operation also exports `*_impl(ctx, input, *, deps=None)` for
injection. `Client(http, env)` accepts a caller-owned HTTPX client, and
`Deps(langsmith=client)` injects it. Default dependencies open and close the HTTP
client per invocation; credentials are read lazily at use. No HTTP retries or
background vendor polling occur; `retry.py` owns the durable retry policies.

## Task surface

| Registered task | Python export |
| --- | --- |
| `langsmith.addFeedback` | `add_feedback` |
| `langsmith.awaitReview` | `await_review` |
| `langsmith.closeExperiment` | `close_experiment` |
| `langsmith.createComparison` | `create_comparison` |
| `langsmith.ensureDataset` | `ensure_dataset` |
| `langsmith.ensureExperiment` | `ensure_experiment` |
| `langsmith.gateExperiment` | `gate_experiment` |
| `langsmith.getExperimentStats` | `get_experiment_stats` |
| `langsmith.listExamples` | `list_examples` |
| `langsmith.logExperimentRuns` | `log_experiment_runs` |
| `langsmith.startReview` | `start_review` |
| `langsmith.upsertExamples` | `upsert_examples` |

Typed JSON inputs and results are in `types.py`. Task names and JSON field names
match the pinned source; Python function names use snake_case.

## Environment

| Variable | Requirement |
| --- | --- |
| `LANGSMITH_API_KEY` | Required at first API call. |
| `LANGSMITH_ENDPOINT` | Optional; https://api.smith.langchain.com by default. |
| `LANGSMITH_WORKSPACE_ID` | Optional workspace ID; forwarded as x-tenant-id for all requests. |

## Behavior and limits

Uses direct HTTP, including the multipart example endpoint described by langsmith 0.8.1. Upsert lookup filters the requested stable IDs, avoiding the source first-page existence bug. list_examples defaults to a bounded 1000-row page and supplies nextOffset. LANGSMITH_WORKSPACE_ID applies to REST and SDK-replacement paths. These deliberate differences are recorded in ADR-0010. The source uses both SDK paths and /api/v1 REST paths; account routing and multipart support remain unverified. Review progress currently consumes one feedback response; vendor pagination and gate counts across different runs need live validation.

## Verification

All registered tasks have hermetic contract fixtures executed independently against
the pinned TS implementation. SDK-backed tasks also have explicit HTTP request
fixtures. See `tests/test_batch3_contracts.py` and `tests/test_batch3_edges.py`.
These are not live vendor results.

Vendor webhooks subpaths and other registration-free TS exports are outside this
batch unless explicitly listed above. Full registered-task coverage does not
imply all supporting exports are ported.

Pending scopes, test resources, replay, and hosted checks are in the
[live-testing backlog](https://github.com/render-lab/render-tasks-python/issues/1)
and [verification tracker](../../docs/verification-tracker.md).

## Webhook adapter

`render_lab_tasks_langsmith.webhooks.langsmith_engine_adapter(on_event, ...)` returns a
registration-free adapter for `render_lab_triggers`. The callback receives the
verified event and returns `{"task": "namespace.task", "args": [event]}` or `None`.
The signing credential `LANGSMITH_ENGINE_WEBHOOK_SECRET` is read inside verification unless
provided explicitly. Importing this module does not register tasks. Signature
checks use the raw body; live delivery remains in the testing backlog.

## Installation

```sh
pip install render-lab-tasks-langsmith==0.1.0
```
