GPTMap

openai-python 3.49.0 and openai-node 7.55.0: typed async function tools for the Agents API

The 2026-11-10 SDK pair: python v3.49.0 and node v7.55.0 add typed support for the existing async setting on beta Agents function-tool shapes; python also fixes Microphone WAV encoding. Verified against tag sources.

TL;DR
openai-python v3.49.0 (GitHub 2026-11-10T06:47:04Z) and openai-node v7.55.0 (npm 06:58Z) add typed support for the existing async setting on beta Agents function-tool shapes (#4264/#3140): python gains async_ response fields plus optional async TypedDict keys, node four async interfaces (requests default false); Responses already had async at v3.48.0. python fixes Microphone WAV encoding (#3900).
This batch is openai-python v3.49.0 and openai-node v7.55.0 (GitHub releases within minutes of 2026-11-10T06:47Z): both packages add typed support for the existing async setting on the beta Agents API function-tool shapes (the function variants under the AgentTool / AgentToolParam / PersistedAgentTool / PersistedAgentToolParam namespaces) - an optional boolean on the request side, exposed as the async_ alias on python response models. It types an existing capability rather than shipping a new mechanism: the Responses API function-tool param type already carried an optional async key at the v3.48.0 tag.

openai-python v3.49.0 and openai-node v7.55.0 released within minutes of each other on 2026-11-10 around 06:47Z, with one shared main change: typed support for the existing async setting on the beta Agents API function-tool shapes (python #4264, node #3140 - both titled add typed async function tools). Every fact in this article was checked the same day against the GitHub API (release objects and PR bodies), the PR diffs, and the v3.49.0 / v7.55.0 tag sources; the immediately-previous versions (v3.48.0 / v7.54.0) were pulled as baselines to confirm the fields are genuinely new.

1. Versions and shipping timeline

PackageGitHub releaseRegistryChanges in this batch
openai-python v3.49.02026-11-10T06:47:04ZPyPI latest=3.49.0 (checked this batch)#4264 (feature) + #3900 (fix)
openai-node v7.55.02026-11-10T06:47:51Znpm latest=7.55.0, published 2026-11-10T06:58:16Z (checked this batch)#3140 (feature); the rest are dependency bumps - six dev-only plus one peer-dependency bump (zod 4.6.5 to 4.6.7)

Both release notes carry the same feature line: api: add typed async function tools. python adds one fix on top; node has no functional change beyond the feature.

2. Which shapes changed: the four function variants of beta Agents

The four new fields sit on two request/response pairs of the beta Agents tool types:

NamespaceResponse side (BaseModel / interface)Request side (TypedDict / interface)
AgentToolAgentToolResourceFunctionAgentToolConfigParamFunction
PersistedAgentToolPersistedAgentToolResourceFunctionPersistedAgentToolConfigParamFunction

These shapes serve the three beta Agents resources - agents, sessions, and automations; the node test changes line up, with function-tool fixtures in the agents, automations, and sessions test files all adding async: true. Scope boundary: the diff touches only these four shapes; Responses API function-tool types are not part of it (see section 5).

3. python: the async_ alias field and the reserved-keyword TypedDict

Response model, quoted from the v3.49.0 agent_tool.py (PersistedAgentToolResourceFunction is identical in shape):

class AgentToolResourceFunction(BaseModel):
    """A function defined by the application."""

    defer_loading: bool
    """Whether the function is deferred and discovered through tool search."""

    description: str
    """A description of what the function does."""

    name: str
    """The name of the function."""

    parameters: Dict[str, object]
    """A JSON Schema object describing the function's arguments."""

    type: Literal["function"]
    """The type of the object. Always `function`."""

    async_: Optional[bool] = FieldInfo(alias="async", default=None)
    """Whether the agent continues without waiting for the function result."""

On the request side, async is a Python reserved word while a TypedDict can carry it as a string key, so the generator organizes it through a reserved-keyword mixin (from agent_tool_param.py):

_AgentToolConfigParamFunctionReservedKeywords = TypedDict(
    "_AgentToolConfigParamFunctionReservedKeywords",
    {
        "async": bool,
    },
    total=False,
)


class AgentToolConfigParamFunction(_AgentToolConfigParamFunctionReservedKeywords, total=False):
    """A function defined by the application."""

The PR body adds two serialization facts: callers previously had to read the undeclared extra via getattr(tool, 'async') or tool.model_extra['async'] and can now read tool.async_ directly; and model_dump(by_alias=True, exclude_unset=True) preserves true, false, and omission, while a bare model_dump(by_alias=True) writes async: None for omitted values.

4. node: the async property on four interfaces

In the v7.55.0 agents.ts, each of the four interfaces gains one member (the two request-side docstrings add the Defaults to false sentence; quoting the tail of AgentToolConfigParamFunction):

export interface AgentToolConfigParamFunction {
  /**
   * A description of what the function does.
   */
  description: string;

  /**
   * The name of the function.
   */
  name: string;

  /**
   * A JSON Schema object describing the function's arguments.
   */
  parameters: { [key: string]: unknown };

  /**
   * The type of the object. Always `function`.
   */
  type: 'function';

  /**
   * Whether the agent continues without waiting for the function result. Defaults to
   * `false`.
   */
  async?: boolean;
}

Baseline comparison (the immediately-previous version, as this site's discipline requires): in the v7.54.0 agents.ts, async?: appears only on the two Compaction interfaces (the background-compaction switch) - zero occurrences on function-tool shapes; the v3.48.0 agent_tool.py has zero async_. Both fields are genuinely new in this pair, not pre-existing.

5. Relation to existing async tool calling: typing, not a new mechanism

Three boundaries, each with a same-day reproducible source:

  • The capability itself predates this batch. The node PR body reads: callers have been gaining typed access to the existing async setting. The Responses API function-tool param type (responses/function_tool_param.py) carries the optional "async": bool key at both the v3.48.0 and v3.49.0 tags (same reserved-keyword mixin form), and this batch's diff does not touch it.
  • This batch's types land only on the beta Agents shapes. The beta Responses function_tool.py has no async_ in either tag - do not describe this batch as the Responses API gaining async.
  • The official docs have not caught up here. This batch did not verify any agents-api guide update describing the async field on the AgentTool shapes (the whitelist for this article is the GitHub PRs and tag sources; no documentation claims are made); before production code, trust the actual type files of the version you pin.

6. The python fix in the same release: Microphone.record() PCM WAV encoding

The python release also carries fix #3900 (merged 2026-11-10T02:09:16Z, titled encode microphone recordings as valid PCM WAV; the source change is src/openai/helpers/microphone.py, plus a newly added tests/lib/test_microphone.py). The mechanism per the PR body:

  • Before the fix, Microphone.record() wrote every capture dtype straight into an integer-PCM WAV file - float32 IEEE-float bytes were interpreted as signed integers, and int8 silence (0) was interpreted as the most negative sample because 8-bit WAV PCM is unsigned.
  • After the fix, float32 recordings are converted to 16-bit PCM and int8 recordings are offset to unsigned 8-bit before writing (with the converted sample width in the header); int16, int32, and uint8 encodings are preserved, as is the original dtype/data when return_ndarray=True.
  • The PR body describes regression tests driving the public record() method through a mocked input device across all five supported capture dtypes, stereo metadata, and ndarray returns - with the float32 and int8 WAV cases failing before the fix.

This fix touches only python's local recording helper and has no API-shape relevance; node has no counterpart entry.

7. Common mistakes and troubleshooting

  • Reading the response field: use tool.async_ in python - tool.async is a syntax error, and model_extra is no longer the place to look now that the field is declared.
  • A stray null after serialization: model_dump(by_alias=True) without exclude_unset=True emits async: None; normalize dump arguments before replaying or diffing request bodies.
  • Do not write that the Responses API gained async: this batch's types live on the four beta Agents shapes; the Responses-side request key already existed (verified against the v3.48.0 tag).
  • The docstring asymmetry is not a typo: node request-side docstrings add Defaults to false and response-side ones do not - the tag sources are like that on each side; quote them per side.

Next steps

Key points

  • Versions and registries (checked 2026-11-10 UTC): python v3.49.0 GitHub release at 06:47:04Z, PyPI registry latest=3.49.0; node v7.55.0 GitHub release at 06:47:51Z, npm latest 7.55.0 published at 06:58:16Z
  • python #4264 (merged 2026-11-10T06:34:46Z): response models AgentToolResourceFunction and PersistedAgentToolResourceFunction gain async_ - Optional[bool] = FieldInfo(alias="async", default=None), docstring 'Whether the agent continues without waiting for the function result'; request TypedDicts AgentToolConfigParamFunction and PersistedAgentToolConfigParamFunction now extend a reserved-keywords mixin with an optional "async": bool
  • node #3140 (merged 2026-11-10T06:36:18Z): AgentToolResourceFunction, AgentToolConfigParamFunction, PersistedAgentToolResourceFunction, and PersistedAgentToolConfigParamFunction each gain async?: boolean; the two request-side docstrings add 'Defaults to false'
  • Baseline check: zero occurrences of async_ in the v3.48.0 agent_tool.py; the v7.54.0 agents.ts had no async on function-tool shapes (only two Compaction.async hits) - the annotations are genuinely new in this pair
  • Responses side untouched: responses/function_tool_param.py already carries the optional "async": bool key at both the v3.48.0 and v3.49.0 tags (same reserved-keyword mixin form); the beta Responses function_tool.py has no async_ in either version - this batch did not change Responses API function-tool types
  • python fix in the same release, #3900 (merged 2026-11-10T02:09:16Z): Microphone.record() wrote every capture dtype straight into an integer-PCM WAV - float32 IEEE-float bytes were read as signed integers, and int8 silence (0) landed as the most negative sample because 8-bit WAV PCM is unsigned; the fix converts float32 to 16-bit PCM and offsets int8 to unsigned before writing, leaving int16/int32/uint8 encodings and return_ndarray=True passthrough unchanged

Frequently asked questions

No. The node PR body says callers have been gaining typed access to the existing async setting - this batch adds typing. The Responses API function-tool param type already carried the same optional async key at the previous v3.48.0 tag (verified the same day against both tags). What is new is the typed annotation itself on the four beta Agents function-tool shapes, including the response side graduating from model_extra to a declared field.

Official references

Related articles

Subscribe to GPTMap Weekly

One email every Monday: curated OpenAI updates, deep dives, and best practices. No ads, unsubscribe anytime.

Submitting opens Buttondown in a new tab to confirm your subscription.

GPTMap EditorialPublished 2026-11-11 6 min read
Test environment (EEAT)
Last tested: 2026-11-11
Model used: SDK: openai-python >= 3.49.0 / openai-node >= 7.55.0 (typed async annotations)