mirror of
https://github.com/ComposioHQ/composio.git
synced 2026-09-22 11:46:35 +08:00
d787107dfa
Follow-up to the live-sweep findings in #4135. Independent of it — this targets `next` directly. ## Python entries could never resolve their provider imports `harness/run.mjs` runs each Python entry as `uv run --project python [--with <dep>]... python <file>`. The base environment is the `python` project only, so the provider packages are present just when an entry names them in `pyWith`. Six entries import a provider and declared none, and have failed with `ModuleNotFoundError` every time the sweep has run since it landed on 2026-08-14: | entry | imports | had | | --- | --- | --- | | `py/tool_router/files` | `composio_openai` | no `pyWith` | | `py/tool_router/preload` | `composio_openai_agents` | `openai-agents>=0.19` only | | `py/tool_router/direct_tools_preset` | `composio_openai_agents` | `openai-agents>=0.19` only | | `py/tool_router/tools` | `composio_openai_agents` | `openai-agents>=0.19` only | | `py/tool_router/tool_router_mcp` | `composio_openai_agents` | `openai-agents>=0.19` only | | `py/custom_tools_agent_test` | `composio_openai_agents` | `openai-agents>=0.19` only | Those entries declared the upstream `openai-agents` SDK but not the Composio provider built on it. ### Why local paths, not package names A bare `--with composio-openai-agents` resolves from **PyPI**, so the sweep would exercise the published provider rather than this repo's — and it drags the published `composio` in with it. Declaring `./python/providers/<name>` plus `./python` keeps both local. Verified in the resulting overlay: ``` composio : file:///…/composio2/python composio-openai : file:///…/composio2/python/providers/openai ``` `py/tool_router/claude_agent` already had `./python` but named its provider, so it was testing the **published** `composio-claude-agent-sdk` against the repo's `composio` (confirmed: that dist has no `direct_url.json`). Pointed at the local path too, so every entry now tests repo code under one convention. ## Deleting `ts/connected-accounts/magic-flow-demo` - Not substantively touched since **2025-06-20** — ~14 months. The only later commits are a model-version bump and its same-day revert, which net to zero. - It calls an endpoint the backend has retired. The sweep gets `400`: *"Creating connections on this endpoint for Composio-managed OAuth auth configs is no longer supported. Use POST /api/v3/connected_accounts/link instead."* - It could not pass unattended even if that were fixed: `waitForConnection()` blocks until a human completes a browser OAuth grant. Removed the source, its manifest entry, and its README bullet. Rewriting it onto `/connected_accounts/link` would be a genuinely new example rather than a repair, so it seemed better to drop it than to carry a broken one. ## Verified against the live staging backend Not just locally — these entries were **executed** against `staging-backend.composio.dev` (`llm=mock`, zero model spend): ``` provisioned state: complete sweep 20260823224239-lk9413-baseline-mock: 5 entries ✓ py/tool_router/toolkits (5.8s) ✓ py/tool_router/preload (11.1s) ✓ py/tool_router/direct_tools_preset (11.2s) ✓ py/tool_router/files (12.3s) ✓ py/auth_configs (3.9s) sweep: 5 green / 0 red / 0 skipped ``` All three previously-broken entries now pass end to end; `toolkits` and `auth_configs` ran as unchanged controls. As far as I can tell from the workflow history, this is the first time any of these examples has completed green — the nightly has failed at `Verify provisioned project state` on every run since it was introduced. The run needed a branch carrying both these fixes and #4135's scoped provisioning, since `next`'s provisioning tries to create a `googledrive` auth config and dies before sweeping anything. That branch was throwaway and is deleted. Other checks: `node harness/run.mjs selftest` passes, `pnpm run test:examples` validates 20 packages, the connected-accounts package typechecks, and all 92 remaining manifest entries point at files that exist. ### Still unproven The other three entries fixed here — `tools`, `tool_router_mcp`, `custom_tools_agent_test` — need github/gmail connected accounts, which staging does not yet have. They get past their imports but cannot be run end to end until those grants exist. `py/modifiers` is `tier=X`, excluded by design. ## Related `py/tool_router/tool_router_mcp` also exits **0** when `COMPOSIO_API_KEY` is unset, so the harness would score it green while it did nothing. Fixed separately in #4222.
1297 lines
30 KiB
JSON
1297 lines
30 KiB
JSON
{
|
|
"$comment": "Inventory of runnable example entrypoints, consumed by harness/run.mjs. Tiers: 1=unattended, 2=needs provisioned state (scripts/examples-provision.mjs), 3=bounded (pass at readiness match, then terminate), X=excluded. Readiness regexes must anchor on a labeled output line the example prints on success (e.g. 'Visit this URL to authorize: https?://'), never a bare 'https?://' — a URL inside an error message must not count as ready. llmMock:false marks entries whose LLM traffic cannot run against the mock server (live canary only).",
|
|
"entries": [
|
|
{
|
|
"id": "ts/anthropic/index",
|
|
"lang": "ts",
|
|
"pkg": "anthropic-example",
|
|
"file": "ts/examples/anthropic/src/index.ts",
|
|
"tier": "1",
|
|
"env": [
|
|
"ANTHROPIC_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/anthropic/streaming",
|
|
"lang": "ts",
|
|
"pkg": "anthropic-example",
|
|
"file": "ts/examples/anthropic/src/streaming.ts",
|
|
"tier": "1",
|
|
"env": [
|
|
"ANTHROPIC_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/anthropic/mcp",
|
|
"lang": "ts",
|
|
"pkg": "anthropic-example",
|
|
"file": "ts/examples/anthropic/src/mcp.ts",
|
|
"tier": "2",
|
|
"env": [
|
|
"ANTHROPIC_API_KEY"
|
|
],
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_USER_ID"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/anthropic/experimental.mcp",
|
|
"lang": "ts",
|
|
"pkg": "anthropic-example",
|
|
"file": "ts/examples/anthropic/src/experimental.mcp.ts",
|
|
"tier": "2",
|
|
"env": [
|
|
"ANTHROPIC_API_KEY"
|
|
],
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_USER_ID"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/anthropic/claude-agents-sdk",
|
|
"lang": "ts",
|
|
"pkg": "anthropic-example",
|
|
"file": "ts/examples/anthropic/src/claude-agents-sdk.ts",
|
|
"tier": "2",
|
|
"env": [
|
|
"ANTHROPIC_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 300,
|
|
"notes": "needs @anthropic-ai/claude-code CLI on PATH"
|
|
},
|
|
{
|
|
"id": "ts/cloudflare-wrangler/dev",
|
|
"lang": "ts",
|
|
"pkg": "cloudflare-wrangler-example",
|
|
"file": "ts/examples/cloudflare-wrangler/src/index.ts",
|
|
"tier": "3",
|
|
"script": "dev",
|
|
"readiness": "Ready on|Listening",
|
|
"toolkits": [
|
|
"googledrive"
|
|
],
|
|
"timeoutSec": 120,
|
|
"notes": "wrangler dev; env must reach .dev.vars"
|
|
},
|
|
{
|
|
"id": "ts/connected-accounts/index",
|
|
"lang": "ts",
|
|
"pkg": "connected-accounts-example",
|
|
"file": "ts/examples/connected-accounts/src/index.ts",
|
|
"tier": "3",
|
|
"readiness": "authorize the user: https?://",
|
|
"toolkits": [
|
|
"github"
|
|
],
|
|
"timeoutSec": 90
|
|
},
|
|
{
|
|
"id": "ts/connected-accounts/api-key",
|
|
"lang": "ts",
|
|
"pkg": "connected-accounts-example",
|
|
"file": "ts/examples/connected-accounts/src/api-key.ts",
|
|
"tier": "2",
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_APIKEY_AUTH_CONFIG_ID",
|
|
"COMPOSIO_EXAMPLES_APIKEY_PLACEHOLDER",
|
|
"COMPOSIO_EXAMPLES_USER_ID"
|
|
],
|
|
"toolkits": [],
|
|
"timeoutSec": 90
|
|
},
|
|
{
|
|
"id": "ts/connected-accounts/multiple-connected-accounts",
|
|
"lang": "ts",
|
|
"pkg": "connected-accounts-example",
|
|
"file": "ts/examples/connected-accounts/src/multiple-connected-accounts.ts",
|
|
"tier": "2",
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_GMAIL_AUTH_CONFIG_ID"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 90
|
|
},
|
|
{
|
|
"id": "ts/connected-accounts/scopes",
|
|
"lang": "ts",
|
|
"pkg": "connected-accounts-example",
|
|
"file": "ts/examples/connected-accounts/src/scopes.ts",
|
|
"tier": "2",
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_GMAIL_AUTH_CONFIG_ID"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 90
|
|
},
|
|
{
|
|
"id": "ts/connected-accounts/toolkit-authorize",
|
|
"lang": "ts",
|
|
"pkg": "connected-accounts-example",
|
|
"file": "ts/examples/connected-accounts/src/toolkit-authorize.ts",
|
|
"tier": "3",
|
|
"readiness": "authorize the toolkit: https?://",
|
|
"toolkits": [
|
|
"github"
|
|
],
|
|
"timeoutSec": 90
|
|
},
|
|
{
|
|
"id": "ts/error-handling-demo/index",
|
|
"lang": "ts",
|
|
"pkg": "error-handling-example",
|
|
"file": "ts/examples/error-handling-demo/src/index.ts",
|
|
"tier": "1",
|
|
"backend": false,
|
|
"timeoutSec": 60
|
|
},
|
|
{
|
|
"id": "ts/file-handling/index",
|
|
"lang": "ts",
|
|
"pkg": "file-handling-example",
|
|
"file": "ts/examples/file-handling/src/index.ts",
|
|
"tier": "X",
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"notes": "sends real email by design; excluded until a non-send variant is decided by the human",
|
|
"reason": "outbound-email"
|
|
},
|
|
{
|
|
"id": "ts/file-handling/url",
|
|
"lang": "ts",
|
|
"pkg": "file-handling-example",
|
|
"file": "ts/examples/file-handling/src/url.ts",
|
|
"tier": "X",
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"reason": "outbound-email",
|
|
"notes": "sends real email by design; excluded until a non-send variant is decided by the human"
|
|
},
|
|
{
|
|
"id": "ts/google/index",
|
|
"lang": "ts",
|
|
"pkg": "google-example",
|
|
"file": "ts/examples/google/src/index.ts",
|
|
"tier": "X",
|
|
"env": [
|
|
"GEMINI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"reason": "dropped-provider",
|
|
"notes": "gemini/notion are out of scope for this goal by decision (2026-08-10)"
|
|
},
|
|
{
|
|
"id": "ts/google/experimental.mcp",
|
|
"lang": "ts",
|
|
"pkg": "google-example",
|
|
"file": "ts/examples/google/src/experimental.mcp.ts",
|
|
"tier": "X",
|
|
"env": [
|
|
"GEMINI_API_KEY"
|
|
],
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_GMAIL_AUTH_CONFIG_ID",
|
|
"COMPOSIO_EXAMPLES_USER_ID"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"reason": "dropped-provider",
|
|
"notes": "gemini/notion are out of scope for this goal by decision (2026-08-10)"
|
|
},
|
|
{
|
|
"id": "ts/json-schema-to-zod/index",
|
|
"lang": "ts",
|
|
"pkg": "json-schema-to-zod-example",
|
|
"file": "ts/examples/json-schema-to-zod/src/index.ts",
|
|
"tier": "1",
|
|
"timeoutSec": 90
|
|
},
|
|
{
|
|
"id": "ts/langchain/index",
|
|
"lang": "ts",
|
|
"pkg": "langchain-example",
|
|
"file": "ts/examples/langchain/src/index.ts",
|
|
"tier": "1",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/langchain/openai",
|
|
"lang": "ts",
|
|
"pkg": "langchain-example",
|
|
"file": "ts/examples/langchain/src/openai.ts",
|
|
"tier": "2",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_USER_ID"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 300
|
|
},
|
|
{
|
|
"id": "ts/llamaindex/index",
|
|
"lang": "ts",
|
|
"pkg": "llamaindex-example",
|
|
"file": "ts/examples/llamaindex/src/index.ts",
|
|
"tier": "1",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/mastra/index",
|
|
"lang": "ts",
|
|
"pkg": "mastra-example",
|
|
"file": "ts/examples/mastra/src/index.ts",
|
|
"tier": "1",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/mastra/tool-router",
|
|
"lang": "ts",
|
|
"pkg": "mastra-example",
|
|
"file": "ts/examples/mastra/src/tool-router.ts",
|
|
"tier": "1",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/mastra/smoke",
|
|
"lang": "ts",
|
|
"pkg": "mastra-example",
|
|
"file": "ts/examples/mastra/src/smoke.ts",
|
|
"tier": "1",
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 90
|
|
},
|
|
{
|
|
"id": "ts/mastra/cloudflare",
|
|
"lang": "ts",
|
|
"pkg": "mastra-example",
|
|
"file": "ts/examples/mastra/src/cloudflare.ts",
|
|
"tier": "X",
|
|
"reason": "worker-module",
|
|
"notes": "covered by cf:dry-run in ts.examples.yml"
|
|
},
|
|
{
|
|
"id": "ts/mcp/index",
|
|
"lang": "ts",
|
|
"pkg": "mcp-example",
|
|
"file": "ts/examples/mcp/src/index.ts",
|
|
"tier": "2",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_GMAIL_AUTH_CONFIG_ID",
|
|
"COMPOSIO_EXAMPLES_USER_ID"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/modifiers/index",
|
|
"lang": "ts",
|
|
"pkg": "modifiers-example",
|
|
"file": "ts/examples/modifiers/src/index.ts",
|
|
"tier": "1",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/openai/index",
|
|
"lang": "ts",
|
|
"pkg": "openai-example",
|
|
"file": "ts/examples/openai/src/index.ts",
|
|
"tier": "1",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/openai/tool-router",
|
|
"lang": "ts",
|
|
"pkg": "openai-example",
|
|
"file": "ts/examples/openai/src/tool-router.ts",
|
|
"tier": "1",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/openai/smoke",
|
|
"lang": "ts",
|
|
"pkg": "openai-example",
|
|
"file": "ts/examples/openai/src/smoke.ts",
|
|
"tier": "1",
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 90
|
|
},
|
|
{
|
|
"id": "ts/openai/chat-completions",
|
|
"lang": "ts",
|
|
"pkg": "openai-example",
|
|
"file": "ts/examples/openai/src/chat-completions.ts",
|
|
"tier": "1",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/openai/tools",
|
|
"lang": "ts",
|
|
"pkg": "openai-example",
|
|
"file": "ts/examples/openai/src/tools.ts",
|
|
"tier": "2",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"googledrive"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/openai/cloudflare",
|
|
"lang": "ts",
|
|
"pkg": "openai-example",
|
|
"file": "ts/examples/openai/src/cloudflare.ts",
|
|
"tier": "X",
|
|
"reason": "worker-module",
|
|
"notes": "covered by cf:dry-run in ts.examples.yml"
|
|
},
|
|
{
|
|
"id": "ts/openai/agents-api",
|
|
"lang": "ts",
|
|
"pkg": "openai-example",
|
|
"file": "ts/examples/openai/src/agents-api/index.ts",
|
|
"tier": "1",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 180,
|
|
"llmMock": false,
|
|
"notes": "@openai/agents rejects aimock responses-api output; live canary only."
|
|
},
|
|
{
|
|
"id": "ts/openai/agents-api-mcp",
|
|
"lang": "ts",
|
|
"pkg": "openai-example",
|
|
"file": "ts/examples/openai/src/agents-api/experiment.mcp.ts",
|
|
"tier": "2",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_GMAIL_AUTH_CONFIG_ID",
|
|
"COMPOSIO_EXAMPLES_USER_ID"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/openai/agents-api-tool-router",
|
|
"lang": "ts",
|
|
"pkg": "openai-example",
|
|
"file": "ts/examples/openai/src/agents-api/experiment.tool-router.ts",
|
|
"tier": "1",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 180,
|
|
"llmMock": false,
|
|
"notes": "@openai/agents rejects aimock responses-api output; live canary only."
|
|
},
|
|
{
|
|
"id": "ts/openai/responses-api",
|
|
"lang": "ts",
|
|
"pkg": "openai-example",
|
|
"file": "ts/examples/openai/src/responses-api/index.ts",
|
|
"tier": "1",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/openai/responses-api-mcp",
|
|
"lang": "ts",
|
|
"pkg": "openai-example",
|
|
"file": "ts/examples/openai/src/responses-api/experiment.mcp.ts",
|
|
"tier": "2",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_GMAIL_AUTH_CONFIG_ID",
|
|
"COMPOSIO_EXAMPLES_USER_ID"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/session-management/index",
|
|
"lang": "ts",
|
|
"pkg": "session-management-example",
|
|
"file": "ts/examples/session-management/src/index.ts",
|
|
"tier": "1",
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 120
|
|
},
|
|
{
|
|
"id": "ts/tool-router/index",
|
|
"lang": "ts",
|
|
"pkg": "tool-router-example",
|
|
"file": "ts/examples/tool-router/src/index.ts",
|
|
"tier": "2",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/tool-router/authorize",
|
|
"lang": "ts",
|
|
"pkg": "tool-router-example",
|
|
"file": "ts/examples/tool-router/src/authorize.ts",
|
|
"tier": "3",
|
|
"readiness": "Visit this URL to authorize: https?://",
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 90
|
|
},
|
|
{
|
|
"id": "ts/tool-router/claude-agent-sdk",
|
|
"lang": "ts",
|
|
"pkg": "tool-router-example",
|
|
"file": "ts/examples/tool-router/src/claude-agent-sdk.ts",
|
|
"tier": "2",
|
|
"env": [
|
|
"ANTHROPIC_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 300,
|
|
"notes": "needs @anthropic-ai/claude-code CLI on PATH"
|
|
},
|
|
{
|
|
"id": "ts/tool-router/custom-tools",
|
|
"lang": "ts",
|
|
"pkg": "tool-router-example",
|
|
"file": "ts/examples/tool-router/src/custom-tools.ts",
|
|
"tier": "2",
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 120
|
|
},
|
|
{
|
|
"id": "ts/tool-router/custom-tools-agent",
|
|
"lang": "ts",
|
|
"pkg": "tool-router-example",
|
|
"file": "ts/examples/tool-router/src/custom-tools-agent.ts",
|
|
"tier": "2",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/tool-router/custom-tools-e2e",
|
|
"lang": "ts",
|
|
"pkg": "tool-router-example",
|
|
"file": "ts/examples/tool-router/src/custom-tools-e2e.ts",
|
|
"tier": "2",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"weathermap",
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 240
|
|
},
|
|
{
|
|
"id": "ts/tool-router/direct-tools-preset",
|
|
"lang": "ts",
|
|
"pkg": "tool-router-example",
|
|
"file": "ts/examples/tool-router/src/direct-tools-preset.ts",
|
|
"tier": "1",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/tool-router/langchain",
|
|
"lang": "ts",
|
|
"pkg": "tool-router-example",
|
|
"file": "ts/examples/tool-router/src/langchain.ts",
|
|
"tier": "2",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 180,
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_USER_ID"
|
|
]
|
|
},
|
|
{
|
|
"id": "ts/tool-router/mcp",
|
|
"lang": "ts",
|
|
"pkg": "tool-router-example",
|
|
"file": "ts/examples/tool-router/src/mcp.ts",
|
|
"tier": "2",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/tool-router/multi-account",
|
|
"lang": "ts",
|
|
"pkg": "tool-router-example",
|
|
"file": "ts/examples/tool-router/src/multi-account.ts",
|
|
"tier": "3",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"readiness": "Visit this URL to authorize: https?://",
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 120,
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_USER_ID"
|
|
]
|
|
},
|
|
{
|
|
"id": "ts/tool-router/openai-agents",
|
|
"lang": "ts",
|
|
"pkg": "tool-router-example",
|
|
"file": "ts/examples/tool-router/src/openai-agents.ts",
|
|
"tier": "X",
|
|
"reason": "stdin-repl"
|
|
},
|
|
{
|
|
"id": "ts/tool-router/preload",
|
|
"lang": "ts",
|
|
"pkg": "tool-router-example",
|
|
"file": "ts/examples/tool-router/src/preload.ts",
|
|
"tier": "1",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/tool-router/session-update",
|
|
"lang": "ts",
|
|
"pkg": "tool-router-example",
|
|
"file": "ts/examples/tool-router/src/session-update.ts",
|
|
"tier": "1",
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 120
|
|
},
|
|
{
|
|
"id": "ts/tool-router/toolkits",
|
|
"lang": "ts",
|
|
"pkg": "tool-router-example",
|
|
"file": "ts/examples/tool-router/src/toolkits.ts",
|
|
"tier": "1",
|
|
"toolkits": [],
|
|
"timeoutSec": 120
|
|
},
|
|
{
|
|
"id": "ts/toolkits/index",
|
|
"lang": "ts",
|
|
"pkg": "toolkits-example",
|
|
"file": "ts/examples/toolkits/src/index.ts",
|
|
"tier": "3",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"readiness": "authorize the toolkit: https?://",
|
|
"toolkits": [
|
|
"github"
|
|
],
|
|
"timeoutSec": 120
|
|
},
|
|
{
|
|
"id": "ts/toolkits/toolkits",
|
|
"lang": "ts",
|
|
"pkg": "toolkits-example",
|
|
"file": "ts/examples/toolkits/src/toolkits.ts",
|
|
"tier": "1",
|
|
"toolkits": [],
|
|
"timeoutSec": 120
|
|
},
|
|
{
|
|
"id": "ts/toolkits/auth-fields",
|
|
"lang": "ts",
|
|
"pkg": "toolkits-example",
|
|
"file": "ts/examples/toolkits/src/auth-fields.ts",
|
|
"tier": "1",
|
|
"toolkits": [],
|
|
"timeoutSec": 120
|
|
},
|
|
{
|
|
"id": "ts/tools/index",
|
|
"lang": "ts",
|
|
"pkg": "tools-example",
|
|
"file": "ts/examples/tools/src/index.ts",
|
|
"tier": "2",
|
|
"toolkits": [
|
|
"googledrive"
|
|
],
|
|
"timeoutSec": 180,
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_USER_ID"
|
|
]
|
|
},
|
|
{
|
|
"id": "ts/tools/ai",
|
|
"lang": "ts",
|
|
"pkg": "tools-example",
|
|
"file": "ts/examples/tools/src/ai.ts",
|
|
"tier": "2",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"googledrive"
|
|
],
|
|
"timeoutSec": 180,
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_USER_ID"
|
|
]
|
|
},
|
|
{
|
|
"id": "ts/tools/tool-conversion",
|
|
"lang": "ts",
|
|
"pkg": "tools-example",
|
|
"file": "ts/examples/tools/src/tool-conversion.ts",
|
|
"tier": "1",
|
|
"toolkits": [],
|
|
"timeoutSec": 120
|
|
},
|
|
{
|
|
"id": "ts/triggers/index",
|
|
"lang": "ts",
|
|
"pkg": "triggers-example",
|
|
"file": "ts/examples/triggers/src/index.ts",
|
|
"tier": "3",
|
|
"readiness": "Subscribed to trigger events",
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 120
|
|
},
|
|
{
|
|
"id": "ts/triggers/create",
|
|
"lang": "ts",
|
|
"pkg": "triggers-example",
|
|
"file": "ts/examples/triggers/src/create.ts",
|
|
"tier": "2",
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_GMAIL_CONNECTED_ACCOUNT_ID",
|
|
"COMPOSIO_EXAMPLES_USER_ID"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"serial": true,
|
|
"timeoutSec": 120
|
|
},
|
|
{
|
|
"id": "ts/triggers/subscribe",
|
|
"lang": "ts",
|
|
"pkg": "triggers-example",
|
|
"file": "ts/examples/triggers/src/subscribe.ts",
|
|
"tier": "3",
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_GMAIL_CONNECTED_ACCOUNT_ID",
|
|
"COMPOSIO_EXAMPLES_USER_ID"
|
|
],
|
|
"readiness": "Subscribed to triggers",
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 120
|
|
},
|
|
{
|
|
"id": "ts/triggers/test",
|
|
"lang": "ts",
|
|
"pkg": "triggers-example",
|
|
"file": "ts/examples/triggers/src/test.ts",
|
|
"tier": "2",
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 120,
|
|
"notes": "triage: entry not yet characterized"
|
|
},
|
|
{
|
|
"id": "ts/triggers/trigger-types",
|
|
"lang": "ts",
|
|
"pkg": "triggers-example",
|
|
"file": "ts/examples/triggers/src/trigger-types.ts",
|
|
"tier": "1",
|
|
"toolkits": [],
|
|
"timeoutSec": 120
|
|
},
|
|
{
|
|
"id": "ts/triggers/webhook-server",
|
|
"lang": "ts",
|
|
"pkg": "triggers-example",
|
|
"file": "ts/examples/triggers/src/webhook-server.ts",
|
|
"tier": "X",
|
|
"reason": "external-tunnel"
|
|
},
|
|
{
|
|
"id": "ts/vercel/ai",
|
|
"lang": "ts",
|
|
"pkg": "vercel-example",
|
|
"file": "ts/examples/vercel/src/ai.ts",
|
|
"tier": "1",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/vercel/stream",
|
|
"lang": "ts",
|
|
"pkg": "vercel-example",
|
|
"file": "ts/examples/vercel/src/stream.ts",
|
|
"tier": "1",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/vercel/tool-loop-agent",
|
|
"lang": "ts",
|
|
"pkg": "vercel-example",
|
|
"file": "ts/examples/vercel/src/tool-loop-agent.ts",
|
|
"tier": "1",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 240
|
|
},
|
|
{
|
|
"id": "ts/vercel/tool-router-ai",
|
|
"lang": "ts",
|
|
"pkg": "vercel-example",
|
|
"file": "ts/examples/vercel/src/tool-router-ai.ts",
|
|
"tier": "2",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 180
|
|
},
|
|
{
|
|
"id": "ts/versioning/index",
|
|
"lang": "ts",
|
|
"pkg": "versioning-example",
|
|
"file": "ts/examples/versioning/src/index.ts",
|
|
"tier": "1",
|
|
"toolkits": [
|
|
"gmail",
|
|
"googlecalendar"
|
|
],
|
|
"timeoutSec": 120
|
|
},
|
|
{
|
|
"id": "py/tools",
|
|
"lang": "py",
|
|
"file": "python/examples/tools.py",
|
|
"tier": "2",
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_GITHUB_CONNECTED_ACCOUNT_ID"
|
|
],
|
|
"toolkits": [
|
|
"github"
|
|
],
|
|
"timeoutSec": 120
|
|
},
|
|
{
|
|
"id": "py/toolkits",
|
|
"lang": "py",
|
|
"file": "python/examples/toolkits.py",
|
|
"tier": "2",
|
|
"toolkits": [
|
|
"github"
|
|
],
|
|
"serial": true,
|
|
"timeoutSec": 120,
|
|
"notes": "authorize() initiates OAuth state"
|
|
},
|
|
{
|
|
"id": "py/auth_configs",
|
|
"lang": "py",
|
|
"file": "python/examples/auth_configs.py",
|
|
"tier": "2",
|
|
"toolkits": [],
|
|
"serial": true,
|
|
"timeoutSec": 120,
|
|
"notes": "creates/updates/deletes org auth configs"
|
|
},
|
|
{
|
|
"id": "py/connected_accounts",
|
|
"lang": "py",
|
|
"file": "python/examples/connected_accounts.py",
|
|
"tier": "3",
|
|
"readiness": "Visit this URL to authorize: https?://",
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_GMAIL_AUTH_CONFIG_ID",
|
|
"COMPOSIO_EXAMPLES_APIKEY_AUTH_CONFIG_ID",
|
|
"COMPOSIO_EXAMPLES_APIKEY_PLACEHOLDER",
|
|
"COMPOSIO_EXAMPLES_USER_ID"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 90
|
|
},
|
|
{
|
|
"id": "py/triggers",
|
|
"lang": "py",
|
|
"file": "python/examples/triggers.py",
|
|
"tier": "3",
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_GMAIL_CONNECTED_ACCOUNT_ID",
|
|
"COMPOSIO_EXAMPLES_USER_ID"
|
|
],
|
|
"readiness": "Subscribed|[Ll]istening for events",
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 300
|
|
},
|
|
{
|
|
"id": "py/modifiers",
|
|
"lang": "py",
|
|
"file": "python/examples/modifiers.py",
|
|
"tier": "X",
|
|
"env": [
|
|
"NOTION_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews",
|
|
"notion"
|
|
],
|
|
"reason": "dropped-provider",
|
|
"notes": "gemini/notion are out of scope for this goal by decision (2026-08-10)"
|
|
},
|
|
{
|
|
"id": "py/mcp",
|
|
"lang": "py",
|
|
"file": "python/examples/mcp_example.py",
|
|
"tier": "2",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_SLACK_AUTH_CONFIG_ID",
|
|
"COMPOSIO_EXAMPLES_USER_ID"
|
|
],
|
|
"toolkits": [
|
|
"slack"
|
|
],
|
|
"timeoutSec": 180,
|
|
"pyWith": [
|
|
"langchain-mcp-adapters",
|
|
"langgraph",
|
|
"langchain",
|
|
"langchain-openai"
|
|
]
|
|
},
|
|
{
|
|
"id": "py/fastapi_app",
|
|
"lang": "py",
|
|
"file": "python/examples/fastapi_app.py",
|
|
"tier": "3",
|
|
"readiness": "Uvicorn running|Application startup",
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_GMAIL_AUTH_CONFIG_ID",
|
|
"COMPOSIO_EXAMPLES_USER_ID"
|
|
],
|
|
"pyWith": [
|
|
"fastapi",
|
|
"uvicorn"
|
|
],
|
|
"timeoutSec": 120
|
|
},
|
|
{
|
|
"id": "py/custom_tools_agent_test",
|
|
"lang": "py",
|
|
"file": "python/examples/custom_tools_agent_test.py",
|
|
"tier": "2",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 240,
|
|
"pyWith": [
|
|
"openai-agents>=0.19",
|
|
"./python/providers/openai_agents",
|
|
"./python"
|
|
]
|
|
},
|
|
{
|
|
"id": "py/experimental_tool_router",
|
|
"lang": "py",
|
|
"file": "python/examples/experimental_tool_router_example.py",
|
|
"tier": "3",
|
|
"readiness": "Redirect URL: https?://",
|
|
"toolkits": [
|
|
"github"
|
|
],
|
|
"timeoutSec": 120
|
|
},
|
|
{
|
|
"id": "py/experimental_tool_router_advanced",
|
|
"lang": "py",
|
|
"file": "python/examples/experimental_tool_router_advanced_example.py",
|
|
"tier": "1",
|
|
"toolkits": [
|
|
"github",
|
|
"slack",
|
|
"linear",
|
|
"jira"
|
|
],
|
|
"timeoutSec": 120,
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_USER_ID",
|
|
"COMPOSIO_EXAMPLES_GITHUB_AUTH_CONFIG_ID",
|
|
"COMPOSIO_EXAMPLES_SLACK_AUTH_CONFIG_ID",
|
|
"COMPOSIO_EXAMPLES_GITHUB_CONNECTED_ACCOUNT_ID",
|
|
"COMPOSIO_EXAMPLES_SLACK_CONNECTED_ACCOUNT_ID"
|
|
]
|
|
},
|
|
{
|
|
"id": "py/tool_router/authorize",
|
|
"lang": "py",
|
|
"file": "python/examples/tool_router/authorize.py",
|
|
"tier": "3",
|
|
"readiness": "Redirect URL: https?://",
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 90
|
|
},
|
|
{
|
|
"id": "py/tool_router/claude_agent",
|
|
"lang": "py",
|
|
"file": "python/examples/tool_router/claude_agent.py",
|
|
"tier": "2",
|
|
"env": [
|
|
"ANTHROPIC_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"pyWith": [
|
|
"claude-agent-sdk",
|
|
"./python/providers/claude_agent_sdk",
|
|
"./python"
|
|
],
|
|
"timeoutSec": 300,
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_USER_ID"
|
|
]
|
|
},
|
|
{
|
|
"id": "py/tool_router/crewai_agent",
|
|
"lang": "py",
|
|
"file": "python/examples/tool_router/crewai_agent.py",
|
|
"tier": "2",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"pyWith": [
|
|
"crewai>=1.15"
|
|
],
|
|
"timeoutSec": 300,
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_USER_ID"
|
|
]
|
|
},
|
|
{
|
|
"id": "py/tool_router/direct_tools_preset",
|
|
"lang": "py",
|
|
"file": "python/examples/tool_router/direct_tools_preset.py",
|
|
"tier": "1",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 180,
|
|
"pyWith": [
|
|
"openai-agents>=0.19",
|
|
"./python/providers/openai_agents",
|
|
"./python"
|
|
]
|
|
},
|
|
{
|
|
"id": "py/tool_router/preload",
|
|
"lang": "py",
|
|
"file": "python/examples/tool_router/preload.py",
|
|
"tier": "1",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"hackernews"
|
|
],
|
|
"timeoutSec": 180,
|
|
"pyWith": [
|
|
"openai-agents>=0.19",
|
|
"./python/providers/openai_agents",
|
|
"./python"
|
|
]
|
|
},
|
|
{
|
|
"id": "py/tool_router/files",
|
|
"lang": "py",
|
|
"file": "python/examples/tool_router/files.py",
|
|
"tier": "1",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [],
|
|
"timeoutSec": 180,
|
|
"pyWith": [
|
|
"./python/providers/openai",
|
|
"./python"
|
|
]
|
|
},
|
|
{
|
|
"id": "py/tool_router/langchain_agent",
|
|
"lang": "py",
|
|
"file": "python/examples/tool_router/langchain_agent.py",
|
|
"tier": "2",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"pyWith": [
|
|
"langchain",
|
|
"langchain-openai",
|
|
"langchain-mcp-adapters"
|
|
],
|
|
"timeoutSec": 240,
|
|
"ids": [
|
|
"COMPOSIO_EXAMPLES_USER_ID"
|
|
]
|
|
},
|
|
{
|
|
"id": "py/tool_router/openai_agents",
|
|
"lang": "py",
|
|
"file": "python/examples/tool_router/openai_agents.py",
|
|
"tier": "2",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"pyWith": [
|
|
"openai-agents>=0.19"
|
|
],
|
|
"timeoutSec": 240
|
|
},
|
|
{
|
|
"id": "py/tool_router/tool_router_mcp",
|
|
"lang": "py",
|
|
"file": "python/examples/tool_router/tool_router_mcp.py",
|
|
"tier": "2",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"github",
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 240,
|
|
"pyWith": [
|
|
"openai-agents>=0.19",
|
|
"./python/providers/openai_agents",
|
|
"./python"
|
|
]
|
|
},
|
|
{
|
|
"id": "py/tool_router/session_update",
|
|
"lang": "py",
|
|
"file": "python/examples/tool_router/session_update.py",
|
|
"tier": "1",
|
|
"toolkits": [
|
|
"gmail",
|
|
"github"
|
|
],
|
|
"timeoutSec": 120
|
|
},
|
|
{
|
|
"id": "py/tool_router/toolkits",
|
|
"lang": "py",
|
|
"file": "python/examples/tool_router/toolkits.py",
|
|
"tier": "1",
|
|
"toolkits": [],
|
|
"timeoutSec": 120
|
|
},
|
|
{
|
|
"id": "py/tool_router/tools",
|
|
"lang": "py",
|
|
"file": "python/examples/tool_router/tools.py",
|
|
"tier": "2",
|
|
"env": [
|
|
"OPENAI_API_KEY"
|
|
],
|
|
"toolkits": [
|
|
"gmail"
|
|
],
|
|
"timeoutSec": 180,
|
|
"pyWith": [
|
|
"openai-agents>=0.19",
|
|
"./python/providers/openai_agents",
|
|
"./python"
|
|
]
|
|
}
|
|
]
|
|
}
|