Skip to content

feat(ai): support Chat and Responses audio input - #58884

Open
rekram1-node wants to merge 2 commits into
devfrom
audio-protocols
Open

rekram1-node wants to merge 2 commits into
devfrom
audio-protocols

Conversation

@rekram1-node

@rekram1-node rekram1-node commented Oct 25, 2026 •

Copy link
Copy Markdown
Collaborator

Issue for this PR

None.

Type of change

  • New feature

What does this PR do?

Chat rejects audio, while Meta and Alibaba Responses send it as ordinary files. I added audio input for user messages and tool results using each API's native representation.

API Audio representation
Chat Raw base64 plus format
Alibaba Chat Data URI or URL plus format
Meta Responses Nested audio block
Alibaba Responses Flat audio block

MIME aliases normalize to format names, such as audio/mpeg to mp3. Provider-specific handling stays in the adapters, including moving tool audio to user input where required. Existing xAI file handling stays unchanged.

Core forwarding and audio output are out of scope.

How did you verify your code works?

  • bun run check and AI-package bun run typecheck:tsc pass.
  • AI-package tests pass: 1,891 passed, 28 skipped. Focused Responses tests passed ten repetitions.
  • Live package calls correctly identified spoken content in user and real tool-result audio on OpenAI, Meta and Alibaba. Existing xAI audio also passed.

Screenshots / recordings

Not a UI change.

Checklist

  • I have tested my changes locally
  • I have not included unrelated changes in this PR

Added by the opencode bot (AI-generated).

Related: #54600, #54491

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Audio lowering looks right. I compiled requests for Meta Responses, Alibaba Responses and Alibaba Chat with user audio, tool-result audio and URL audio. Each produced the request format described, and tool audio moved into a following user message where needed. The packages/ai tests and typecheck:tsc pass. I couldn't make live provider calls.

Public API: no change to the SDK, server, plugin or config. Inside packages/ai, OpenResponses.ProviderAdapter.lowerMedia now returns an Effect, and all adapters in this repo are updated.

One behaviour change to be aware of: every route that builds requests through OpenAIChat.fromRequest (OpenRouter, Groq, DigitalOcean, Venice, OpenAI-compatible) now sends input_audio to the provider instead of rejecting audio locally. Providers without audio support will now return their own error instead of our clear local one.

The new Meta and Alibaba Responses request formats, and Alibaba's tool-audio move, have no tests; only the Chat test was updated. Could you add one small Responses test that checks user and tool audio for Alibaba (and Meta's nested format)? That would protect the code that is new in this PR. See also the inline comment about the copied loop.

Related: #54600, #54491

from: Effect.fn("AlibabaResponses.fromRequest")(function* (req) {
const opts = yield* ProviderShared.validateWith(Schema.decodeUnknownEffect(Options))(req.providerOptions ?? {})
const body = yield* OpenResponses.fromRequestWithAdapter(req, adapter)
// Model Studio accepts audio only in user messages, not function outputs.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This loop is the same as the one in meta-responses.ts; only the moved part types and the placeholder text differ. Could it become one helper in OpenResponses, for example hoistToolMedia(input, predicate, placeholder), that both adapters call? Otherwise the two copies will drift apart, for example if one gets a fix for how placeholders handle mixed text and media.

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new test covers user and tool-result audio for Meta and Alibaba Responses, as I asked in my earlier review. It is small and easy to follow. openai-responses.test.ts (157 tests) and typecheck:tsc pass. The public API is unchanged. Nothing outside the tests changed, so the inline thread about the copied loop is still open.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant