Skip to content

feat: add fish audio plugin#1382

Merged
toubatbrian merged 3 commits intomainfrom
dz/fishaudio
May 7, 2026
Merged

feat: add fish audio plugin#1382
toubatbrian merged 3 commits intomainfrom
dz/fishaudio

Conversation

@davidzhao
Copy link
Copy Markdown
Member

also added support for autoloading .env.local in dev mode

also added support for autoloading .env.local in dev mode
@davidzhao davidzhao requested review from toubatbrian and u9g May 4, 2026 06:34
Copy link
Copy Markdown
Contributor

@devin-ai-integration devin-ai-integration Bot left a comment

Choose a reason for hiding this comment

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

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no potential bugs to report.

View in Devin Review to see 6 additional findings.

Open in Devin Review

Comment thread agents/src/cli.ts Outdated
Comment thread .changeset/cli-envlocal.md Outdated
Comment thread .changeset/fishaudio-plugin.md Outdated
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 6, 2026

🦋 Changeset detected

Latest commit: 701f66d

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 29 packages
Name Type
@livekit/agents-plugin-fishaudio Patch
@livekit/agents Patch
@livekit/agents-plugin-anam Patch
@livekit/agents-plugin-assemblyai Patch
@livekit/agents-plugin-baseten Patch
@livekit/agents-plugin-bey Patch
@livekit/agents-plugin-cartesia Patch
@livekit/agents-plugin-cerebras Patch
@livekit/agents-plugin-deepgram Patch
@livekit/agents-plugin-elevenlabs Patch
@livekit/agents-plugin-google Patch
@livekit/agents-plugin-hedra Patch
@livekit/agents-plugin-inworld Patch
@livekit/agents-plugin-lemonslice Patch
@livekit/agents-plugin-liveavatar Patch
@livekit/agents-plugin-livekit Patch
@livekit/agents-plugin-minimax Patch
@livekit/agents-plugin-mistral Patch
@livekit/agents-plugin-neuphonic Patch
@livekit/agents-plugin-openai Patch
@livekit/agents-plugin-phonic Patch
@livekit/agents-plugin-resemble Patch
@livekit/agents-plugin-rime Patch
@livekit/agents-plugin-runway Patch
@livekit/agents-plugin-sarvam Patch
@livekit/agents-plugin-silero Patch
@livekit/agents-plugin-trugen Patch
@livekit/agents-plugin-xai Patch
@livekit/agents-plugins-test Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

devin-ai-integration[bot]

This comment was marked as resolved.

@toubatbrian
Copy link
Copy Markdown
Contributor

Verified locally

@toubatbrian toubatbrian merged commit 5f5e2ae into main May 7, 2026
8 of 9 checks passed
@toubatbrian toubatbrian deleted the dz/fishaudio branch May 7, 2026 01:37
Copy link
Copy Markdown
Contributor

@devin-ai-integration devin-ai-integration Bot left a comment

Choose a reason for hiding this comment

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

Devin Review found 1 new potential issue.

View 8 additional findings in Devin Review.

Open in Devin Review

Comment on lines +276 to +282
req.on('error', (err) => {
if (err.name === 'AbortError') return;
this.#logger.error({ err }, 'Fish Audio TTS request error');
if (!doneFut.done) doneFut.reject(err);
});
req.write(payload);
req.end();
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.

🔴 Missing req.on('close') handler causes ChunkedStream.run() to hang indefinitely on abort

When the abort signal fires before the HTTP response is received, doneFut is never settled, causing await doneFut.await at line 285 to hang forever. The req.on('error') handler at line 276 silently returns for AbortError without settling doneFut, and the response callback (which contains the res.on('close') that resolves doneFut) is never invoked because no response was received. The Cartesia plugin (plugins/cartesia/src/tts.ts:272-274), which uses the identical node:https request pattern, includes a req.on('close', () => { if (!doneFut.done) doneFut.resolve(); }) handler that settles doneFut in this exact scenario. The Fish Audio plugin is missing this handler.

Suggested change
req.on('error', (err) => {
if (err.name === 'AbortError') return;
this.#logger.error({ err }, 'Fish Audio TTS request error');
if (!doneFut.done) doneFut.reject(err);
});
req.write(payload);
req.end();
req.on('error', (err) => {
if (err.name === 'AbortError') return;
this.#logger.error({ err }, 'Fish Audio TTS request error');
if (!doneFut.done) doneFut.reject(err);
});
req.on('close', () => {
if (!doneFut.done) doneFut.resolve();
});
req.write(payload);
req.end();
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

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.

2 participants