Skip to content

Commit b30a90b

Browse files
stainless-app[bot]declan-scalevkalmathscaleNiteshDhanpalclaude
authored
chore: release main (#424)
Co-authored-by: Declan Brady <declan.brady@scale.com> Co-authored-by: Vijay Kalmath <158184866+vkalmathscale@users.noreply.github.com> Co-authored-by: stainless-app[bot] <142633134+stainless-app[bot]@users.noreply.github.com> Co-authored-by: Nitesh Dhanpal <NiteshDhanpal@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: Daniel Miller <daniel.miller@scale.com>
1 parent 4d6f4cf commit b30a90b

261 files changed

Lines changed: 20799 additions & 3889 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/agentex-tutorials-test.yml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,29 @@ jobs:
4949
curl -LsSf https://astral.sh/uv/install.sh | sh
5050
echo "$HOME/.local/bin" >> $GITHUB_PATH
5151
52+
# Subprocess-CLI harnesses: install the relevant CLI only for the
53+
# claude-code / codex tutorials (no-op for every other tutorial). npm is
54+
# preinstalled on ubuntu runners. Versions mirror the golden agent's
55+
# sandbox image (teams/sgp/agents/golden_agent/sandbox/Dockerfile): claude-code
56+
# is pinned to the same CLAUDE_CODE_VERSION; codex is left unpinned there,
57+
# so it is left unpinned here too. Bump CLAUDE_CODE_VERSION in lockstep
58+
# with the sandbox Dockerfile.
59+
- name: Install harness CLI (claude-code / codex only)
60+
if: ${{ contains(matrix.tutorial, 'claude_code') || contains(matrix.tutorial, 'codex') }}
61+
env:
62+
CLAUDE_CODE_VERSION: "2.1.142"
63+
run: |
64+
if [[ "${{ matrix.tutorial }}" == *claude_code* ]]; then
65+
echo "📦 Installing Claude Code CLI (v${CLAUDE_CODE_VERSION})..."
66+
npm install -g "@anthropic-ai/claude-code@${CLAUDE_CODE_VERSION}"
67+
claude --version || true
68+
fi
69+
if [[ "${{ matrix.tutorial }}" == *codex* ]]; then
70+
echo "📦 Installing Codex CLI..."
71+
npm install -g @openai/codex
72+
codex --version || true
73+
fi
74+
5275
- name: Pull latest AgentEx image
5376
run: |
5477
echo "🐳 Pulling latest Scale AgentEx Docker image..."
@@ -136,6 +159,11 @@ jobs:
136159
working-directory: ./examples/tutorials
137160
env:
138161
OPENAI_API_KEY: ${{ secrets.TUTORIAL_OPENAI_API_KEY }}
162+
ANTHROPIC_API_KEY: ${{ secrets.TUTORIAL_ANTHROPIC_API_KEY }}
163+
# Enable the gated live tests only for the matching subprocess-CLI
164+
# harness tutorial (the CLI is installed for it in the step above).
165+
CLAUDE_LIVE_TESTS: ${{ contains(matrix.tutorial, 'claude_code') && '1' || '' }}
166+
CODEX_LIVE_TESTS: ${{ contains(matrix.tutorial, 'codex') && '1' || '' }}
139167
HEALTH_CHECK_PORT: 8080 # Use non-privileged port for temporal worker health checks
140168
run: |
141169
echo "Testing tutorial: ${{ matrix.tutorial }}"
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
name: Harness Integration
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
paths:
8+
- "src/agentex/lib/core/harness/**"
9+
- "src/agentex/lib/adk/_modules/**"
10+
- "tests/lib/core/harness/test_harness_pydantic_ai_*.py"
11+
- "tests/lib/core/harness/test_harness_langgraph_*.py"
12+
- ".github/workflows/harness-integration.yml"
13+
14+
jobs:
15+
conformance:
16+
runs-on: ubuntu-latest
17+
steps:
18+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
19+
20+
- name: Install uv
21+
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
22+
with:
23+
version: '0.10.2'
24+
25+
- name: Bootstrap
26+
run: ./scripts/bootstrap
27+
28+
# Defer to scripts/test so the harness suite runs under the exact same
29+
# invocation as the main CI test job: DEFER_PYDANTIC_BUILD=false and
30+
# `uv run --isolated --all-packages --all-extras pytest`, across the
31+
# min/max supported Python versions. Running `uv run pytest` directly
32+
# would risk an all-extras-only dep passing locally but failing in CI.
33+
- name: Conformance suite
34+
run: ./scripts/test tests/lib/core/harness/ -v
35+
36+
# Offline harness integration tests (sync / async / temporal channels) for each
37+
# migrated harness. These use fake streams / TestModel + fake streaming/tracing
38+
# and require no live infrastructure. Future harness migration PRs (6-8) add
39+
# their harness to the matrix below and their test paths to the triggers above.
40+
live-matrix:
41+
runs-on: ubuntu-latest
42+
strategy:
43+
matrix:
44+
harness: [pydantic_ai, langgraph]
45+
channel: [sync, async, temporal]
46+
fail-fast: false
47+
name: ${{ matrix.harness }}-${{ matrix.channel }}
48+
steps:
49+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
50+
51+
- name: Install uv
52+
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
53+
with:
54+
version: '0.10.2'
55+
56+
- name: Bootstrap
57+
run: ./scripts/bootstrap
58+
59+
- name: ${{ matrix.harness }} ${{ matrix.channel }} integration tests (offline)
60+
run: |
61+
./scripts/test tests/lib/core/harness/test_harness_${{ matrix.harness }}_${{ matrix.channel }}.py -v

.release-please-manifest.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
2-
".": "0.14.0",
3-
"adk": "0.13.2"
2+
".": "0.15.0",
3+
"adk": "0.14.0"
44
}

.stats.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
configured_endpoints: 64
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sgp/agentex-sdk-ae2571b5ac5d337ba5ced527cec0ff6e3088296fa67c3c836ed5a06544b25cb8.yml
3-
openapi_spec_hash: 962a2f20444c7823fd3a34f95365146e
4-
config_hash: 138b7c0b394e7393133c8ff16a6d0eb3
1+
configured_endpoints: 65
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sgp/agentex-sdk-cd43ba4b554ca024dd7ee7b74e4f4700a743282c17def704a0967e6ff251c09b.yml
3+
openapi_spec_hash: 9369ccc9c0289e9d6f641a526d244d1c
4+
config_hash: 1ae003838971335aac550f3ad5872f54

CHANGELOG.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,38 @@
66

77
* **tracing:** emit OTel metrics for async span queue depth, batch drain, and SGP export success/failure (HTTP status labels). Disable SDK-side recording with ``AGENTEX_TRACING_METRICS=0``.
88

9+
## 0.15.0 (2026-06-23)
10+
11+
Full Changelog: [agentex-client-v0.14.0...agentex-client-v0.15.0](https://github.com/scaleapi/scale-agentex-python/compare/agentex-client-v0.14.0...agentex-client-v0.15.0)
12+
13+
### Features
14+
15+
* **api:** add webhook endpoint ([37c7d9d](https://github.com/scaleapi/scale-agentex-python/commit/37c7d9d465943184ab84922ba1079b939516d534))
16+
* **claude-code:** stream-json parser tap for the unified harness surface ([#420](https://github.com/scaleapi/scale-agentex-python/issues/420)) ([904339c](https://github.com/scaleapi/scale-agentex-python/commit/904339c21b8cd641a02d903c03d4a8730b4d7e84))
17+
* **codex:** event-stream parser tap for the unified harness surface ([#421](https://github.com/scaleapi/scale-agentex-python/issues/421)) ([9b2b031](https://github.com/scaleapi/scale-agentex-python/commit/9b2b03144cc67bb497e0a301686207aba2629758))
18+
* **harness:** public adk facade + docs for the unified harness surface (PR 9) ([#423](https://github.com/scaleapi/scale-agentex-python/issues/423)) ([fa60632](https://github.com/scaleapi/scale-agentex-python/commit/fa60632f9be84315a3fdc627745ae5b605994bd8))
19+
* **harness:** unified harness surface — foundation (span derivation, delivery adapters, emitter) ([#412](https://github.com/scaleapi/scale-agentex-python/issues/412)) ([a9cacf4](https://github.com/scaleapi/scale-agentex-python/commit/a9cacf4eb71697351ee658a570636f04bbf31ad5))
20+
* **langgraph:** migrate LangGraph harness onto unified surface ([#417](https://github.com/scaleapi/scale-agentex-python/issues/417)) ([d344228](https://github.com/scaleapi/scale-agentex-python/commit/d34422845de4b80ed69d2dccfdb0c680ef2fbca3))
21+
* **openai-agents:** migrate onto the unified harness surface ([#416](https://github.com/scaleapi/scale-agentex-python/issues/416)) ([d10e151](https://github.com/scaleapi/scale-agentex-python/commit/d10e1510bd5da44ad5acc5cac638750122083fce))
22+
* **pydantic-ai:** migrate onto unified harness surface (PR4) ([#415](https://github.com/scaleapi/scale-agentex-python/issues/415)) ([5ec62c2](https://github.com/scaleapi/scale-agentex-python/commit/5ec62c20781d24fc3e0b92734fcd444b1e791d70))
23+
* **sdk:** add webhook helper for forward-route handlers ([#419](https://github.com/scaleapi/scale-agentex-python/issues/419)) ([514075d](https://github.com/scaleapi/scale-agentex-python/commit/514075de2189f33be4ade0ac84368019e55ed7ea))
24+
* **streaming:** stream tool call argument deltas in TemporalStreamingModel ([#355](https://github.com/scaleapi/scale-agentex-python/issues/355)) ([c8de1d4](https://github.com/scaleapi/scale-agentex-python/commit/c8de1d4c9c3b5b3c16ad4aaf9644c1ba0d618757))
25+
* **tracing:** skip Agentex span-start write by default (end-only ingest) ([#438](https://github.com/scaleapi/scale-agentex-python/issues/438)) ([10d22a2](https://github.com/scaleapi/scale-agentex-python/commit/10d22a27091c9c410ae808dab9cfce5dab3816a8))
26+
27+
28+
### Bug Fixes
29+
30+
* **harness:** assert cross-channel (yield vs auto-send) conformance equivalence [AGX1-373] ([#414](https://github.com/scaleapi/scale-agentex-python/issues/414)) ([694960f](https://github.com/scaleapi/scale-agentex-python/commit/694960f913b8ba521d9236e876e5e00f57a3a3ff))
31+
* **harness:** correct codex & openai reasoning stream envelopes ([#441](https://github.com/scaleapi/scale-agentex-python/issues/441)) ([1d86e8a](https://github.com/scaleapi/scale-agentex-python/commit/1d86e8a47a369814540b6e853cd20240c6098f27))
32+
* **tests:** use relative import for assert_matches_type in webhooks test ([#440](https://github.com/scaleapi/scale-agentex-python/issues/440)) ([5954a9f](https://github.com/scaleapi/scale-agentex-python/commit/5954a9fc8c7961ef5ceb41abf3ca32e6e78590c5))
33+
* **tracing:** fail open temporal span activities ([#437](https://github.com/scaleapi/scale-agentex-python/issues/437)) ([2d63eef](https://github.com/scaleapi/scale-agentex-python/commit/2d63eef53bdb919bb6568e04708e3b7abcb8075b))
34+
35+
36+
### Refactors
37+
38+
* **cli:** migrate existing langgraph/pydantic-ai templates to unified surface ([#429](https://github.com/scaleapi/scale-agentex-python/issues/429)) ([ee41408](https://github.com/scaleapi/scale-agentex-python/commit/ee41408c420eba5c6b8fe8719c8ebd445dcd220c))
39+
* **tutorials:** migrate to the unified harness surface + renumber ([#428](https://github.com/scaleapi/scale-agentex-python/issues/428)) ([ebaf617](https://github.com/scaleapi/scale-agentex-python/commit/ebaf617256c7971dde12fd7e25f02b05f2f42fca))
40+
941
## 0.14.0 (2026-06-22)
1042

1143
Full Changelog: [agentex-client-v0.13.1...agentex-client-v0.14.0](https://github.com/scaleapi/scale-agentex-python/compare/agentex-client-v0.13.1...agentex-client-v0.14.0)

adk/CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Changelog
22

3+
## 0.14.0 (2026-06-23)
4+
5+
Full Changelog: [agentex-sdk-v0.13.2...agentex-sdk-v0.14.0](https://github.com/scaleapi/scale-agentex-python/compare/agentex-sdk-v0.13.2...agentex-sdk-v0.14.0)
6+
7+
### Features
8+
9+
* **harness:** public adk facade + docs for the unified harness surface (PR 9) ([#423](https://github.com/scaleapi/scale-agentex-python/issues/423)) ([fa60632](https://github.com/scaleapi/scale-agentex-python/commit/fa60632f9be84315a3fdc627745ae5b605994bd8))
10+
311
## 0.13.2 (2026-06-22)
412

513
Full Changelog: [agentex-sdk-v0.13.1...agentex-sdk-v0.13.2](https://github.com/scaleapi/scale-agentex-python/compare/agentex-sdk-v0.13.1...agentex-sdk-v0.13.2)

adk/docs/harness.md

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
# Unified Harness Surface
2+
3+
The unified harness surface gives every agent harness (pydantic-ai, LangGraph, OpenAI Agents, and future parsers) a single, shared path to streaming, message persistence, and tracing. The Agentex `StreamTaskMessage*` event stream is the canonical wire format. A harness tap produces that stream once; the shared machinery delivers it and derives spans from it.
4+
5+
All public names are re-exported from `agentex.lib.adk`:
6+
7+
```python
8+
from agentex.lib.adk import (
9+
UnifiedEmitter,
10+
SpanTracer,
11+
TurnUsage,
12+
TurnResult,
13+
HarnessTurn,
14+
StreamTaskMessage,
15+
OpenSpan,
16+
CloseSpan,
17+
SpanSignal,
18+
)
19+
```
20+
21+
The implementation lives at `src/agentex/lib/core/harness/`.
22+
23+
---
24+
25+
## The canonical stream: `StreamTaskMessage`
26+
27+
`StreamTaskMessage` is a union of the four wire-protocol update types:
28+
29+
```
30+
StreamTaskMessageStart - opens a content slot (text, reasoning, tool request, ...)
31+
StreamTaskMessageDelta - appends a token/fragment to an open slot
32+
StreamTaskMessageFull - posts a complete message in one shot (tool response, ...)
33+
StreamTaskMessageDone - closes an open slot
34+
```
35+
36+
Every harness tap produces a sequence of these. Everything downstream (delivery, tracing) reads the same sequence.
37+
38+
---
39+
40+
## Per-harness taps: `convert_<harness>_to_agentex_events`
41+
42+
A tap is an async generator that translates the harness's native event stream into `StreamTaskMessage*` events. The currently shipped taps are:
43+
44+
| Harness | Tap function | Exported from |
45+
|---|---|---|
46+
| pydantic-ai | `convert_pydantic_ai_to_agentex_events` | `agentex.lib.adk` |
47+
| LangGraph | `convert_langgraph_to_agentex_events` | `agentex.lib.adk` |
48+
49+
Taps for claude-code and codex will be added in subsequent PRs (AGX1-420, AGX1-421) and exported from `agentex.lib.adk` in the same way.
50+
51+
---
52+
53+
## `HarnessTurn` protocol
54+
55+
`HarnessTurn` is the interface a harness turn object must satisfy to plug into `UnifiedEmitter`:
56+
57+
```python
58+
@runtime_checkable
59+
class HarnessTurn(Protocol):
60+
@property
61+
def events(self) -> AsyncIterator[StreamTaskMessage]: ...
62+
63+
def usage(self) -> TurnUsage: ...
64+
```
65+
66+
`events` is the canonical stream for this turn. `usage()` is valid only after `events` is exhausted (async generators cannot cleanly return a value to the consumer, so usage travels out-of-band).
67+
68+
---
69+
70+
## `TurnUsage`
71+
72+
Token counts and cost for one turn, harness-independent:
73+
74+
```python
75+
class TurnUsage(BaseModel):
76+
model: str | None = None
77+
input_tokens: int | None = None
78+
output_tokens: int | None = None
79+
cached_input_tokens: int | None = None
80+
reasoning_tokens: int | None = None
81+
total_tokens: int | None = None
82+
cost_usd: float | None = None
83+
duration_ms: int | None = None
84+
num_llm_calls: int = 0
85+
num_tool_calls: int = 0
86+
num_reasoning_blocks: int = 0
87+
```
88+
89+
Field names align with `agentex.lib.core.observability.llm_metrics` for easy conversion.
90+
91+
---
92+
93+
## `UnifiedEmitter`
94+
95+
`UnifiedEmitter` ties a turn's canonical stream, tracing context, and delivery mode together. Construct one per turn with the task/trace context from the request:
96+
97+
```python
98+
emitter = UnifiedEmitter(
99+
task_id=params.task.id,
100+
trace_id=params.task.id, # or None to disable tracing
101+
parent_span_id=turn_span.id if turn_span else None,
102+
)
103+
```
104+
105+
**Tracing is on by default** when `trace_id` is provided. To disable it explicitly, pass `tracer=False`. To inject a custom `SpanTracer` (e.g. in tests), pass it as `tracer=<instance>`.
106+
107+
### Delivery mode 1: `yield_turn` (sync HTTP ACP)
108+
109+
For sync ACP agents that return events directly over the HTTP response:
110+
111+
```python
112+
@acp.on_message_send
113+
async def handle(params):
114+
turn = MyHarnessTurn(params) # implements HarnessTurn
115+
async for event in emitter.yield_turn(turn):
116+
yield event
117+
```
118+
119+
`yield_turn` forwards each event to the caller and traces spans as a side effect. It is a passthrough when `tracer` is `None`.
120+
121+
### Delivery mode 2: `auto_send_turn` (async/Temporal)
122+
123+
For async or Temporal agents that push to the task stream via Redis:
124+
125+
```python
126+
result: TurnResult = await emitter.auto_send_turn(turn, created_at=workflow.now())
127+
```
128+
129+
`auto_send_turn` drives `adk.streaming` contexts for every message in the stream, derives and records spans, and returns a `TurnResult` with the final text and usage. Pass `created_at` under Temporal to back-date message timestamps deterministically.
130+
131+
---
132+
133+
## `TurnResult`
134+
135+
```python
136+
class TurnResult(BaseModel):
137+
final_text: str = ""
138+
usage: TurnUsage = TurnUsage()
139+
```
140+
141+
Returned by `auto_send_turn`. `final_text` is the last text segment of the turn (multi-step runs return only the final segment, matching `stream_langgraph_events` / `stream_pydantic_ai_events` semantics).
142+
143+
---
144+
145+
## Tracing: span derivation
146+
147+
Spans are derived from the canonical stream by `SpanDeriver` (pure, no `adk` dependency) and dispatched to `adk.tracing` by `SpanTracer`. The mapping:
148+
149+
- `StreamTaskMessageStart(ToolRequestContent)` + `StreamTaskMessageDone` on that index -> tool span open (keyed by `tool_call_id`)
150+
- `StreamTaskMessageFull(ToolResponseContent)` whose `tool_call_id` was opened -> tool span close
151+
- `StreamTaskMessageFull(ToolRequestContent)` (harnesses that emit tool calls as Full) -> opens a tool span; matching `Full(ToolResponseContent)` closes it
152+
- `StreamTaskMessageStart(ReasoningContent)` + `StreamTaskMessageDone` -> reasoning span
153+
154+
`SpanTracer` is `SpanDeriver`'s consumer. You can inject a custom `SpanTracer` via `UnifiedEmitter(tracer=<instance>)` for advanced use or testing.
155+
156+
---
157+
158+
## Usage examples by channel
159+
160+
### Sync ACP (pydantic-ai tap)
161+
162+
```python
163+
import agentex.lib.adk as adk
164+
from agentex.lib.adk import UnifiedEmitter, convert_pydantic_ai_to_agentex_events
165+
166+
@acp.on_message_send
167+
async def handle(params):
168+
task_id = params.task.id
169+
async with adk.tracing.span(trace_id=task_id, name="message", ...) as turn_span:
170+
emitter = UnifiedEmitter(
171+
task_id=task_id,
172+
trace_id=task_id,
173+
parent_span_id=turn_span.id if turn_span else None,
174+
)
175+
tap = convert_pydantic_ai_to_agentex_events(pydantic_stream)
176+
# wrap tap in a HarnessTurn then yield_turn, or yield directly:
177+
async for event in tap:
178+
yield event
179+
```
180+
181+
For the pre-unified sync path the tap is still yielded directly; `UnifiedEmitter.yield_turn` is the forward-looking integration point when a `HarnessTurn` wrapper is available.
182+
183+
### Async Temporal (auto-send)
184+
185+
```python
186+
from agentex.lib.adk import UnifiedEmitter
187+
188+
emitter = UnifiedEmitter(
189+
task_id=task_id,
190+
trace_id=task_id,
191+
parent_span_id=parent_span_id,
192+
)
193+
result = await emitter.auto_send_turn(turn, created_at=workflow.now())
194+
# result.final_text — last text segment
195+
# result.usage — TurnUsage (tokens, cost, ...)
196+
```

adk/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# (agentex/{__init__.py, _*.py, types/, resources/}) ships from the slim
55
# sibling package `agentex-client` which is pinned as a runtime dep.
66
name = "agentex-sdk"
7-
version = "0.13.2"
7+
version = "0.14.0"
88
description = "Agent Development Kit (ADK) overlay for the Agentex API — FastACP server, Temporal workflows, LLM provider integrations, observability"
99
license = "Apache-2.0"
1010
authors = [

api.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,3 +245,15 @@ Methods:
245245
- <code title="post /checkpoints/get-tuple">client.checkpoints.<a href="./src/agentex/resources/checkpoints.py">get_tuple</a>(\*\*<a href="src/agentex/types/checkpoint_get_tuple_params.py">params</a>) -> <a href="./src/agentex/types/checkpoint_get_tuple_response.py">Optional[CheckpointGetTupleResponse]</a></code>
246246
- <code title="post /checkpoints/put">client.checkpoints.<a href="./src/agentex/resources/checkpoints.py">put</a>(\*\*<a href="src/agentex/types/checkpoint_put_params.py">params</a>) -> <a href="./src/agentex/types/checkpoint_put_response.py">CheckpointPutResponse</a></code>
247247
- <code title="post /checkpoints/put-writes">client.checkpoints.<a href="./src/agentex/resources/checkpoints.py">put_writes</a>(\*\*<a href="src/agentex/types/checkpoint_put_writes_params.py">params</a>) -> None</code>
248+
249+
# Webhooks
250+
251+
Types:
252+
253+
```python
254+
from agentex.types import WebhookCreateWebhookTriggerResponse
255+
```
256+
257+
Methods:
258+
259+
- <code title="post /agent_api_keys/webhook-trigger">client.webhooks.<a href="./src/agentex/resources/webhooks.py">create_webhook_trigger</a>(\*\*<a href="src/agentex/types/webhook_create_webhook_trigger_params.py">params</a>) -> <a href="./src/agentex/types/webhook_create_webhook_trigger_response.py">WebhookCreateWebhookTriggerResponse</a></code>

0 commit comments

Comments
 (0)