-
Release: update version (#3429)
发布于
2026-06-19 13:12:38 +00:00 Warning
⚠️ Breaking change —
@composio/core@0.11.0(minor bump, pre-1.0)The legacy in-memory custom-tools registry
composio.tools.createCustomTool(...)has been removed (changeset
44e5458). Because@composio/coreis pre-1.0, this ships as a
minor bump per semver convention — but it is breaking: any code
callingcomposio.tools.createCustomTool(...)will fail to compile/run
after upgrading. Consumers pinned to^0.10.0will not auto-upgrade
to0.11.0and must opt in explicitly.Migration: use Tool Router custom tools
Custom tools are now standalone factories bound to a Tool Router
session, instead of being registered into an in-memory registry on the
composio.toolsnamespace.Before (removed):
// ❌ No longer available in 0.11.0 const tool = composio.tools.createCustomTool({ /* ... */ });After — a standalone tool (no auth):
import { Composio, experimental_createTool } from '@composio/core'; import { z } from 'zod'; const composio = new Composio(); const grep = experimental_createTool('GREP', { name: 'Grep Search', description: 'Search for patterns in files', inputParams: z.object({ pattern: z.string(), path: z.string() }), execute: async (input) => ({ matches: [] }), }); // Bind the custom tool(s) to a Tool Router session const session = await composio.create(userId, { experimental: { customTools: [grep] }, });After — a tool that extends a Composio toolkit (inherits that
toolkit's auth):const getImportantEmails = experimental_createTool('GET_IMPORTANT_EMAILS', { name: 'Get Important Emails', description: 'Fetch high-priority emails', extendsToolkit: 'gmail', inputParams: z.object({ limit: z.number().default(10) }), execute: async (input, ctx) => { // ctx.execute() returns the standard { data, error, logId } shape const result = await ctx.execute('GMAIL_SEARCH', { query: 'is:important' }); return { emails: result.data }; }, }); const session = await composio.create(userId, { experimental: { customTools: [getImportantEmails] }, });After — grouping related tools into a custom toolkit:
import { experimental_createToolkit } from '@composio/core'; const devTools = experimental_createToolkit('DEV_TOOLS', { name: 'Dev Tools', description: 'Local developer utilities', tools: [grep], // tools here must NOT set `extendsToolkit` }); const session = await composio.create(userId, { experimental: { customToolkits: [devTools] }, });Notes:
experimental_createTool/experimental_createToolkitare also
available from the dedicated@composio/core/experimentalentry point.- Tool slugs are auto-prefixed with
LOCAL_when exposed to the agent
(e.g.GREP→LOCAL_GREP; inside a toolkit,DEV_TOOLS+GREP→
LOCAL_DEV_TOOLS_GREP). - These APIs are intentionally namespaced
experimental_*— they are
not yet stable and may change.
This PR was opened by the Changesets
release GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to next, this PR will
be updated.Releases
@composio/core@0.11.0
Minor Changes
a94715f: ForwarduserIdwhen creating trigger instances so trigger
2FA flows can verify connected account ownership.44e5458: Remove the legacycomposio.tools.createCustomTool(...)
in-memory registry API. Use Tool Router custom tools via
experimental_createTool,experimental_createToolkit, and
composio.create(..., { experimental: { customTools, customToolkits } })instead.
Patch Changes
22a9171: Defer telemetry batch and error sends so instrumentation does
not wait for telemetry network requests before returning SDK results or
rethrowing SDK errors.93b67e8: Fix automatic file upload/download substitution for file
schemas that accept either a single file or a list of files.
The file modifier now selects composed-schema branches by runtime value
shape, soanyOf(file, array<file>)uploads or downloads each file when
the tool receives a list while preserving existing single-file behavior.-
b69cef1: Tolerate dangling$refpointers in tool schemas the
Composio API ships without a matching$defsentry. Some toolkits (e.g.
GMAIL_FETCH_EMAILS) emitoutputParameterswith"$ref": "#/$defs/FetchEmailsResponse"while never declaring a top-level$defs
block. After the strict resolver shipped with the previous Mastra fix,
this causedcomposio.tools.get(...)to throw
JsonSchemaRefResolutionErrorupfront, making every Gmail / Slack /
Google-Calendar tool unusable throughMastraProvider. The SDK now
degrades the unresolvable branch to a permissive object schema and
surfaces a single observability warning per(toolSlug, ref)pair
instead of crashing. -
dereferenceJsonSchemaaccepts a new optional second argument{ onUnresolved?: 'throw' | 'sentinel'; onReplace?: (ref, reason) => void }. Default behavior is unchanged ('throw') — first-party /
custom-tool schemas with a typo'd$refstill surface as a hard error.
Pass'sentinel'to replace unresolved branches with the cycle-break
sentinel ({ type: 'object', additionalProperties: true }) that the
resolver already uses for$refcycles. The replaced sentinel carries a
defaultdescriptionhint so LLMs consuming the wrapped tool's schema
get an in-band signal that the branch is opaque; a caller-provided
descriptionsibling overrides the default (Draft 2020-12
sibling-keyword merge). Safety caps (MAX_REF_CHAIN_DEPTH,
MAX_NODE_DEPTH) keep throwing in both modes. New
UnresolvedRefStrategy,UnresolvedRefReason, and
DereferenceJsonSchemaOptionstype exports. -
MastraProvider.wrapToolopts bothinputParametersand
outputParametersinto'sentinel'mode and emits onelogger.warn
per(toolSlug, ref)pair via the provider-scoped dedupSet.
User-controlled segments in the warning (tool.slug,toolkit.slug,
ref) areJSON.stringifyd to neutralize embedded newlines / ANSI
escapes / control bytes that could otherwise forge log lines (CWE-117).
A matching one-shot telemetry event
(composio.mastra.wrapTool.danglingRef) fires next to the warn so the
Composio team has aggregate visibility into which toolkits are affected;
the event respectsCOMPOSIO_DISABLE_TELEMETRY=true. -
The
telemetryinstance from@composio/coreis now publicly
re-exported alongsidelogger, so providers can emit aggregate signals
without reaching into the package's internals. -
Resolvable
$defs/definitionscontinue to be inlined exactly as
before — no regression in the type-info preservation contract introduced
by the previous Mastra fix. -
1ba66ca: Fixtools.execute(andtools.get/tools.list) failing
with aZodErrorfor every tool from an MCP-backed toolkit (e.g.
granola_mcp,apify_mcp,tavily_mcp).
MCP toolkits don't declare an output schema, and the Composio API
serializes that asoutput_parameters: {}. The SDK'sParametersSchema
required{ type: 'object', properties: {...} }, so
transformToolCasesrejected the response and
getRawComposioToolBySlug— called byexecuteand the list path —
threw.The SDK now normalizes empty (
{}),null, and missing
input_parameters/output_parameterspayloads toundefinedbefore
validation.outputParameterswas already declared.optional()in the
publicTooltype, so this preserves the contract: "undefined means no
declared schema." Tools that do declare a schema continue to be
validated strictly.No public API change; no toolkit allow-list.
ce4b213: fix(providers): normalize string tool-call arguments across
all providers
Models occasionally emit tool-call arguments as a JSON string instead of
an
object (most visibly withCOMPOSIO_MULTI_EXECUTE_TOOLon the Vercel AI
SDK),
which broke downstream validation with errors like
tool_use.input: Input should be a valid dictionary.@composio/corenow exposes a singlenormalizeToolArgumentshelper,
and every
provider routes model-supplied arguments through it. Object payloads
pass
through unchanged, JSON strings are parsed, empty/nullpayloads become
{},
and anything that cannot resolve to an object throws a typed
ComposioInvalidToolArgumentsErrorinstead of a rawSyntaxErroror a
silently
forwarded malformed string. This replaces the inconsistent per-provider
guards
that previously existed only in vercel, cloudflare and openai-agents.@composio/cli-local-tools@0.0.5
Patch Changes
- Updated dependencies [
22a9171] - Updated dependencies [
93b67e8] - Updated dependencies [
b69cef1] - Updated dependencies [
1ba66ca] - Updated dependencies [
a94715f] - Updated dependencies [
ce4b213] - Updated dependencies [
44e5458]
@composio/anthropic@0.9.3
Patch Changes
ce4b213: fix(providers): normalize string tool-call arguments across
all providers
Models occasionally emit tool-call arguments as a JSON string instead of
an
object (most visibly withCOMPOSIO_MULTI_EXECUTE_TOOLon the Vercel AI
SDK),
which broke downstream validation with errors like
tool_use.input: Input should be a valid dictionary.@composio/corenow exposes a singlenormalizeToolArgumentshelper,
and every
provider routes model-supplied arguments through it. Object payloads
pass
through unchanged, JSON strings are parsed, empty/nullpayloads become
{},
and anything that cannot resolve to an object throws a typed
ComposioInvalidToolArgumentsErrorinstead of a rawSyntaxErroror a
silently
forwarded malformed string. This replaces the inconsistent per-provider
guards
that previously existed only in vercel, cloudflare and openai-agents.@composio/claude-agent-sdk@0.9.3
Patch Changes
ce4b213: fix(providers): normalize string tool-call arguments across
all providers
Models occasionally emit tool-call arguments as a JSON string instead of
an
object (most visibly withCOMPOSIO_MULTI_EXECUTE_TOOLon the Vercel AI
SDK),
which broke downstream validation with errors like
tool_use.input: Input should be a valid dictionary.@composio/corenow exposes a singlenormalizeToolArgumentshelper,
and every
provider routes model-supplied arguments through it. Object payloads
pass
through unchanged, JSON strings are parsed, empty/nullpayloads become
{},
and anything that cannot resolve to an object throws a typed
ComposioInvalidToolArgumentsErrorinstead of a rawSyntaxErroror a
silently
forwarded malformed string. This replaces the inconsistent per-provider
guards
that previously existed only in vercel, cloudflare and openai-agents.@composio/cloudflare@0.9.3
Patch Changes
ce4b213: fix(providers): normalize string tool-call arguments across
all providers
Models occasionally emit tool-call arguments as a JSON string instead of
an
object (most visibly withCOMPOSIO_MULTI_EXECUTE_TOOLon the Vercel AI
SDK),
which broke downstream validation with errors like
tool_use.input: Input should be a valid dictionary.@composio/corenow exposes a singlenormalizeToolArgumentshelper,
and every
provider routes model-supplied arguments through it. Object payloads
pass
through unchanged, JSON strings are parsed, empty/nullpayloads become
{},
and anything that cannot resolve to an object throws a typed
ComposioInvalidToolArgumentsErrorinstead of a rawSyntaxErroror a
silently
forwarded malformed string. This replaces the inconsistent per-provider
guards
that previously existed only in vercel, cloudflare and openai-agents.@composio/google@0.9.3
Patch Changes
ce4b213: fix(providers): normalize string tool-call arguments across
all providers
Models occasionally emit tool-call arguments as a JSON string instead of
an
object (most visibly withCOMPOSIO_MULTI_EXECUTE_TOOLon the Vercel AI
SDK),
which broke downstream validation with errors like
tool_use.input: Input should be a valid dictionary.@composio/corenow exposes a singlenormalizeToolArgumentshelper,
and every
provider routes model-supplied arguments through it. Object payloads
pass
through unchanged, JSON strings are parsed, empty/nullpayloads become
{},
and anything that cannot resolve to an object throws a typed
ComposioInvalidToolArgumentsErrorinstead of a rawSyntaxErroror a
silently
forwarded malformed string. This replaces the inconsistent per-provider
guards
that previously existed only in vercel, cloudflare and openai-agents.@composio/langchain@0.9.3
Patch Changes
ce4b213: fix(providers): normalize string tool-call arguments across
all providers
Models occasionally emit tool-call arguments as a JSON string instead of
an
object (most visibly withCOMPOSIO_MULTI_EXECUTE_TOOLon the Vercel AI
SDK),
which broke downstream validation with errors like
tool_use.input: Input should be a valid dictionary.@composio/corenow exposes a singlenormalizeToolArgumentshelper,
and every
provider routes model-supplied arguments through it. Object payloads
pass
through unchanged, JSON strings are parsed, empty/nullpayloads become
{},
and anything that cannot resolve to an object throws a typed
ComposioInvalidToolArgumentsErrorinstead of a rawSyntaxErroror a
silently
forwarded malformed string. This replaces the inconsistent per-provider
guards
that previously existed only in vercel, cloudflare and openai-agents.@composio/llamaindex@0.9.3
Patch Changes
ce4b213: fix(providers): normalize string tool-call arguments across
all providers
Models occasionally emit tool-call arguments as a JSON string instead of
an
object (most visibly withCOMPOSIO_MULTI_EXECUTE_TOOLon the Vercel AI
SDK),
which broke downstream validation with errors like
tool_use.input: Input should be a valid dictionary.@composio/corenow exposes a singlenormalizeToolArgumentshelper,
and every
provider routes model-supplied arguments through it. Object payloads
pass
through unchanged, JSON strings are parsed, empty/nullpayloads become
{},
and anything that cannot resolve to an object throws a typed
ComposioInvalidToolArgumentsErrorinstead of a rawSyntaxErroror a
silently
forwarded malformed string. This replaces the inconsistent per-provider
guards
that previously existed only in vercel, cloudflare and openai-agents.@composio/mastra@0.9.3
Patch Changes
-
b69cef1: Tolerate dangling$refpointers in tool schemas the
Composio API ships without a matching$defsentry. Some toolkits (e.g.
GMAIL_FETCH_EMAILS) emitoutputParameterswith"$ref": "#/$defs/FetchEmailsResponse"while never declaring a top-level$defs
block. After the strict resolver shipped with the previous Mastra fix,
this causedcomposio.tools.get(...)to throw
JsonSchemaRefResolutionErrorupfront, making every Gmail / Slack /
Google-Calendar tool unusable throughMastraProvider. The SDK now
degrades the unresolvable branch to a permissive object schema and
surfaces a single observability warning per(toolSlug, ref)pair
instead of crashing. -
dereferenceJsonSchemaaccepts a new optional second argument{ onUnresolved?: 'throw' | 'sentinel'; onReplace?: (ref, reason) => void }. Default behavior is unchanged ('throw') — first-party /
custom-tool schemas with a typo'd$refstill surface as a hard error.
Pass'sentinel'to replace unresolved branches with the cycle-break
sentinel ({ type: 'object', additionalProperties: true }) that the
resolver already uses for$refcycles. The replaced sentinel carries a
defaultdescriptionhint so LLMs consuming the wrapped tool's schema
get an in-band signal that the branch is opaque; a caller-provided
descriptionsibling overrides the default (Draft 2020-12
sibling-keyword merge). Safety caps (MAX_REF_CHAIN_DEPTH,
MAX_NODE_DEPTH) keep throwing in both modes. New
UnresolvedRefStrategy,UnresolvedRefReason, and
DereferenceJsonSchemaOptionstype exports. -
MastraProvider.wrapToolopts bothinputParametersand
outputParametersinto'sentinel'mode and emits onelogger.warn
per(toolSlug, ref)pair via the provider-scoped dedupSet.
User-controlled segments in the warning (tool.slug,toolkit.slug,
ref) areJSON.stringifyd to neutralize embedded newlines / ANSI
escapes / control bytes that could otherwise forge log lines (CWE-117).
A matching one-shot telemetry event
(composio.mastra.wrapTool.danglingRef) fires next to the warn so the
Composio team has aggregate visibility into which toolkits are affected;
the event respectsCOMPOSIO_DISABLE_TELEMETRY=true. -
The
telemetryinstance from@composio/coreis now publicly
re-exported alongsidelogger, so providers can emit aggregate signals
without reaching into the package's internals. -
Resolvable
$defs/definitionscontinue to be inlined exactly as
before — no regression in the type-info preservation contract introduced
by the previous Mastra fix. -
ce4b213: fix(providers): normalize string tool-call arguments across
all providers
Models occasionally emit tool-call arguments as a JSON string instead of
an
object (most visibly withCOMPOSIO_MULTI_EXECUTE_TOOLon the Vercel AI
SDK),
which broke downstream validation with errors like
tool_use.input: Input should be a valid dictionary.@composio/corenow exposes a singlenormalizeToolArgumentshelper,
and every
provider routes model-supplied arguments through it. Object payloads
pass
through unchanged, JSON strings are parsed, empty/nullpayloads become
{},
and anything that cannot resolve to an object throws a typed
ComposioInvalidToolArgumentsErrorinstead of a rawSyntaxErroror a
silently
forwarded malformed string. This replaces the inconsistent per-provider
guards
that previously existed only in vercel, cloudflare and openai-agents.@composio/openai@0.9.3
Patch Changes
ce4b213: fix(providers): normalize string tool-call arguments across
all providers
Models occasionally emit tool-call arguments as a JSON string instead of
an
object (most visibly withCOMPOSIO_MULTI_EXECUTE_TOOLon the Vercel AI
SDK),
which broke downstream validation with errors like
tool_use.input: Input should be a valid dictionary.@composio/corenow exposes a singlenormalizeToolArgumentshelper,
and every
provider routes model-supplied arguments through it. Object payloads
pass
through unchanged, JSON strings are parsed, empty/nullpayloads become
{},
and anything that cannot resolve to an object throws a typed
ComposioInvalidToolArgumentsErrorinstead of a rawSyntaxErroror a
silently
forwarded malformed string. This replaces the inconsistent per-provider
guards
that previously existed only in vercel, cloudflare and openai-agents.@composio/openai-agents@0.9.3
Patch Changes
ce4b213: fix(providers): normalize string tool-call arguments across
all providers
Models occasionally emit tool-call arguments as a JSON string instead of
an
object (most visibly withCOMPOSIO_MULTI_EXECUTE_TOOLon the Vercel AI
SDK),
which broke downstream validation with errors like
tool_use.input: Input should be a valid dictionary.@composio/corenow exposes a singlenormalizeToolArgumentshelper,
and every
provider routes model-supplied arguments through it. Object payloads
pass
through unchanged, JSON strings are parsed, empty/nullpayloads become
{},
and anything that cannot resolve to an object throws a typed
ComposioInvalidToolArgumentsErrorinstead of a rawSyntaxErroror a
silently
forwarded malformed string. This replaces the inconsistent per-provider
guards
that previously existed only in vercel, cloudflare and openai-agents.@composio/vercel@0.9.3
Patch Changes
ce4b213: fix(providers): normalize string tool-call arguments across
all providers
Models occasionally emit tool-call arguments as a JSON string instead of
an
object (most visibly withCOMPOSIO_MULTI_EXECUTE_TOOLon the Vercel AI
SDK),
which broke downstream validation with errors like
tool_use.input: Input should be a valid dictionary.@composio/corenow exposes a singlenormalizeToolArgumentshelper,
and every
provider routes model-supplied arguments through it. Object payloads
pass
through unchanged, JSON strings are parsed, empty/nullpayloads become
{},
and anything that cannot resolve to an object throws a typed
ComposioInvalidToolArgumentsErrorinstead of a rawSyntaxErroror a
silently
forwarded malformed string. This replaces the inconsistent per-provider
guards
that previously existed only in vercel, cloudflare and openai-agents.@composio/cli@0.2.32
Patch Changes
- Updated dependencies [
22a9171] - Updated dependencies [
93b67e8] - Updated dependencies [
b69cef1] - Updated dependencies [
1ba66ca] - Updated dependencies [
a94715f] - Updated dependencies [
ce4b213] - Updated dependencies [
44e5458]- @composio/core@0.11.0
- @composio/cli-local-tools@0.0.5
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
下载附件