Skip to content

Conversation

zaidqureshi2
Copy link

Description

Added a TTS client for Uplift AI TTS, which uses websockets do provide streaming inference. Also added an example agent using it.

Changes Made

  • Added upliftai plugin (new, recently added on in python side too)
  • Non related Added .claude to gitignore

Pre-Review Checklist

  • Build passes: All builds (lint, typecheck, tests) pass locally
  • AI-generated code reviewed: Removed unnecessary comments and ensured code quality
  • Changes explained: All changes are properly documented and justified above
  • Scope appropriate: All changes relate to the PR title, or explanations provided for why they're included

Testing

  • Automated tests added/updated (if applicable)
  • All tests pass
  • Make sure both restaurant_agent.ts and realtime_agent.ts work properly (for major changes)

Additional Notes


Note to reviewers: Please ensure the pre-review checklist is completed before starting your review.

Copy link

changeset-bot bot commented Sep 19, 2025

⚠️ No Changeset found

Latest commit: 018f365

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

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

Comment on lines +65 to +71
#apiKey: string;
#baseURL: string;
#voiceSettings: VoiceSettings;
#tokenizer: tokenize.WordTokenizer | tokenize.SentenceTokenizer;
#client: WebSocketClient | null = null;
#logger = log();
#chunkTimeout: number;
Copy link
Contributor

Choose a reason for hiding this comment

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

I'd suggest using private instead of #. cc @Shubhrakanti let me know your thoughts

Copy link
Contributor

Choose a reason for hiding this comment

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

yeah lets use private

Copy link
Author

Choose a reason for hiding this comment

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

I can definitely remove them, but was following the convention on all the other tts.ts stt.ts files for other providers, they seem to be using # for all the private variables. Please let me know if I should still remove and replace with private.

Copy link
Contributor

Choose a reason for hiding this comment

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

yeah that's out dated let's use private

Comment on lines +442 to +449
#apiKey: string;
#baseURL: string;
#voiceSettings: VoiceSettings;
#tokenizer: tokenize.WordTokenizer | tokenize.SentenceTokenizer;
#client: WebSocketClient | null = null;
#logger = log();
#chunkTimeout: number;
label = 'upliftai.SynthesizeStream';
Copy link
Contributor

Choose a reason for hiding this comment

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

^

Copy link
Contributor

@toubatbrian toubatbrian left a comment

Choose a reason for hiding this comment

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

Added a few small comments, otherwise LGTM!

Copy link
Contributor

@Shubhrakanti Shubhrakanti left a comment

Choose a reason for hiding this comment

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

Have you tested this manually with interrupts?

examples/src/test_*.ts
examples/src/test_*.ts

.claude
Copy link
Contributor

Choose a reason for hiding this comment

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

new line

"GOOGLE_CLOUD_LOCATION"
"GOOGLE_CLOUD_LOCATION",
"UPLIFTAI_API_KEY",
"UPLIFTAI_BASE_URL"
Copy link
Contributor

Choose a reason for hiding this comment

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

why does this need to be parameterized as an env variable? This can just be defined in code with a default in the class constructor?

Copy link
Author

Choose a reason for hiding this comment

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

will remove, its in the constructor as well.

Comment on lines +65 to +71
#apiKey: string;
#baseURL: string;
#voiceSettings: VoiceSettings;
#tokenizer: tokenize.WordTokenizer | tokenize.SentenceTokenizer;
#client: WebSocketClient | null = null;
#logger = log();
#chunkTimeout: number;
Copy link
Contributor

Choose a reason for hiding this comment

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

yeah lets use private

@zaidqureshi2
Copy link
Author

Have you tested this manually with interrupts?

@Shubhrakanti created a quick loom to show interrupts https://www.loom.com/share/b57500b58a994fd386134240705cdbc2

@zaidqureshi2
Copy link
Author

@Shubhrakanti & @toubatbrian lmk what your thoughts are on my comments before I push next revision

@toubatbrian
Copy link
Contributor

Hey @zaidqureshi2 sorry for the late reply, the loom seems not working. Could you please make a new link? Thanks

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.

3 participants