Skip to content

feat(tts): expose synthesis failure metadata and telemetry - #1204

Merged
murdore merged 1 commit into
juspay:releasefrom
Harshita-Rupani29:feat/tts-error-observability
Jul 30, 2026
Merged

feat(tts): expose synthesis failure metadata and telemetry#1204
murdore merged 1 commit into
juspay:releasefrom
Harshita-Rupani29:feat/tts-error-observability

Conversation

@Harshita-Rupani29

@Harshita-Rupani29 Harshita-Rupani29 commented Jul 17, 2026

Copy link
Copy Markdown

Pull Request

Description

What does this PR do?

This PR exposes structured metadata when Text-to-Speech synthesis succeeds, fails, or is skipped.

Callers can now distinguish between skipped and failed TTS synthesis, inspect structured error information, determine whether an error is retriable, and observe synthesis latency. TTS failures are also recorded through the existing telemetry system with provider and error-code labels.

Related Issues

Does this PR close any issues?

Fixes #702

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change
  • Documentation update
  • Refactoring
  • Performance improvement
  • Test coverage improvement
  • Build/CI configuration
  • Other

Motivation and Context

TTS synthesis errors were previously logged but not exposed to callers. As a result:

  • Callers could not distinguish between skipped and failed synthesis.
  • Retry and fallback logic could not use structured error information.
  • TTS failure rates could not be monitored by provider.
  • Debugging required inspecting application logs.

This change preserves the existing graceful-degradation behavior while making the TTS outcome observable through the returned result and telemetry.

Changes Made

  • Added an optional ttsMetadata field to EnhancedGenerateResult.
  • Added structured TTS error information containing:
    • Error code
    • Error message
    • Optional retriable status
  • Added TTS attempt, success, and latency metadata.
  • Updated Mode 1 direct-input synthesis to populate metadata for successful and failed synthesis.
  • Updated Mode 2 AI-response synthesis to populate metadata for successful, failed, and skipped synthesis.
  • Preserved existing provider-specific NeuroLinkError and TTSError details.
  • Added a stable TTS_SYNTHESIS_FAILED fallback code for unknown errors.
  • Added TelemetryHandler.recordTTSFailure() to record provider-labelled failure counts and latency metrics.
  • Ensured telemetry failures do not affect generation results.

Breaking Changes

  • No breaking changes
  • Yes, breaking changes

ttsMetadata is optional, so existing callers and result handling remain compatible.

Testing

How has this been tested?

  • Unit tests added/updated
  • Integration tests added/updated
  • E2E tests pass
  • Manual testing completed
  • Tested with multiple providers
  • Static validation completed

The following validation commands passed:

pnpm exec tsc --noEmit --pretty false

pnpm exec eslint \
  src/lib/types/generate.ts \
  src/lib/core/baseProvider.ts \
  src/lib/core/modules/TelemetryHandler.ts

pnpm exec prettier --check \
  src/lib/types/generate.ts \
  src/lib/core/baseProvider.ts \
  src/lib/core/modules/TelemetryHandler.ts

git diff --check

Test Coverage

  • All new code is covered by tests
  • Existing tests pass
  • Coverage percentage maintained or improved

No automated test file is included in this PR.

Manual Testing Steps

  1. Configure a generation request with TTS enabled.
  2. Use an unsupported or unconfigured TTS provider.
  3. Run the generation request.
  4. Verify that generation still returns gracefully without audio.
  5. Verify that ttsMetadata.attempted is true.
  6. Verify that ttsMetadata.success is false.
  7. Verify that ttsMetadata.error contains a code, message, and retriable status when available.
  8. Enable telemetry and verify that the TTS failure metric contains provider and error-code labels.
  9. Run Mode 2 with an empty AI response and verify that the result reports attempted: false.

Code Quality

  • Code follows the project's style guidelines (ESLint passes)
  • Code is properly formatted (Prettier applied)
  • Self-review of code completed
  • No console.log statements (using logger instead)
  • No hardcoded API keys or secrets
  • TypeScript strict mode compliance
  • Proper error handling implemented
  • No new TODO/FIXME comments

Documentation

  • JSDoc comments added/updated for public APIs
  • README.md updated (not required)
  • Documentation in /docs updated (not required)
  • Code examples added/updated
  • CHANGELOG.md updated
  • Migration guide provided (not required because this is non-breaking)

Commit Message Format

  • Commit message follows format: type(scope): description
  • Valid type used
  • Scope specified

Commit message:

feat(tts): expose synthesis failure metadata and telemetry

Dependencies

  • No dependency changes
  • Dependencies added
  • Dependencies updated
  • Dependencies removed

Performance Impact

  • No material performance impact
  • Performance improved
  • Performance degraded

The change only records timestamps around TTS synthesis and emits telemetry when synthesis fails.

Security Considerations

  • No security implications
  • Security review needed
  • Security vulnerability fixed

No credentials, request payloads, or sensitive provider data are added to telemetry labels. Error messages remain available in result metadata but are not used as metric labels.

Deployment Notes

  • No special deployment steps
  • Requires environment variable changes
  • Requires database migration
  • Requires Redis schema update
  • Other

Screenshots / Videos

Not applicable.

Reviewer Checklist

For reviewers:

  • Code follows project style and conventions
  • Changes are well-documented
  • Tests provide adequate coverage
  • No obvious performance issues
  • No security vulnerabilities introduced
  • Breaking changes are properly documented
  • Documentation is clear and accurate

Additional Notes

  • The existing graceful-degradation behavior is preserved: TTS failures do not fail the complete generation request.
  • The optional metadata field keeps the public API backward compatible.
  • Error codes and retriability are taken from the existing NeuroLink error model when available.
  • Automated test coverage is not included in the current PR.

Pre-submission Checklist

  • Read and followed the repository guidance in CLAUDE.md
  • Verified all automated pre-commit checks pass
  • Tested changes locally with pnpm test
  • Built the project successfully with pnpm build
  • Run pnpm run validate:all and all checks pass
  • Reviewed the code for obvious issues
  • Ensured commit messages follow semantic format
  • Updated relevant inline documentation
  • Added tests for new functionality
  • Checked that CI/CD pipeline passes

Summary by CodeRabbit

  • New Features

    • Generation results now include ttsMetadata indicating whether TTS was attempted, whether it succeeded, structured error details, and synthesis latency.
  • Bug Fixes

    • Direct and AI-response TTS flows now consistently apply timeouts and return normalized success/failure status, including clearer handling when TTS content or a provider is missing.
  • Monitoring

    • TTS failures and latency are now tracked with dedicated telemetry metrics labeled by provider and error code, including retriable information when available.

@vercel

vercel Bot commented Jul 17, 2026

Copy link
Copy Markdown

Someone is attempting to deploy a commit to the Sachin Sharma's projects Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai

coderabbitai Bot commented Jul 17, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: c89e95ba-328f-4586-903d-8a77f57ccb16

📥 Commits

Reviewing files that changed from the base of the PR and between f446670 and ec2facb.

📒 Files selected for processing (3)
  • src/lib/core/baseProvider.ts
  • src/lib/core/modules/TelemetryHandler.ts
  • src/lib/types/generate.ts

📝 Walkthrough

Walkthrough

TTS synthesis now returns structured attempt, success, latency, and error metadata. Both synthesis paths enforce timeouts, normalize errors, and record failure telemetry.

Changes

TTS Error Observability

Layer / File(s) Summary
TTS metadata contract
src/lib/types/generate.ts
Adds exported TTSMetadata and an optional ttsMetadata field on EnhancedGenerateResult.
TTS failure telemetry
src/lib/core/modules/TelemetryHandler.ts
Adds provider- and error-labeled failure counters and latency histograms for TTS synthesis failures.
Synthesis result handling
src/lib/core/baseProvider.ts
Applies timeouts to both TTS modes, distinguishes skipped synthesis, normalizes errors, populates metadata, and reports failures.

Estimated code review effort: 4 (Complex) | ~45 minutes

Suggested reviewers: murdore, pdogra1299

Sequence Diagram(s)

sequenceDiagram
  participant TTSProcessor
  participant baseProvider
  participant TelemetryHandler
  participant TelemetryService
  TTSProcessor->>baseProvider: Synthesize with timeout
  TTSProcessor-->>baseProvider: Audio or normalized error
  baseProvider->>TelemetryHandler: recordTTSFailure(provider, error, latency)
  TelemetryHandler->>TelemetryService: Record failure counter and latency histogram
  baseProvider-->>TTSProcessor: Return result with ttsMetadata
Loading
🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning The TTS metadata and telemetry work is implemented, but the issue also requires unit tests for error scenarios, which are absent. Add unit tests covering TTS failure, skipped, and success paths, plus telemetry and error-metadata assertions.
Out of Scope Changes check ⚠️ Warning BaseProvider includes unrelated tool-gating, lifecycle, and usage-tracking refactors beyond the TTS observability scope. Move the non-TTS refactors into separate PRs or drop them from this change.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: exposing TTS synthesis failure metadata and telemetry.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/lib/core/baseProvider.ts`:
- Around line 1349-1353: Wrap both asynchronous TTSProcessor.synthesize calls in
src/lib/core/baseProvider.ts at lines 1349-1353 and 1590-1594 with the existing
withTimeout utility, preserving their current arguments, result assignments, and
timeout configuration conventions.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: ece850ff-e9f7-4074-8bbc-b2460227adf9

📥 Commits

Reviewing files that changed from the base of the PR and between ad5e9f8 and abb41ed.

📒 Files selected for processing (3)
  • src/lib/core/baseProvider.ts
  • src/lib/core/modules/TelemetryHandler.ts
  • src/lib/types/generate.ts

Comment thread src/lib/core/baseProvider.ts Outdated
@Harshita-Rupani29
Harshita-Rupani29 force-pushed the feat/tts-error-observability branch from abb41ed to 31c4d7e Compare July 17, 2026 17:54

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
src/lib/core/baseProvider.ts (1)

1344-1374: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add focused tests for the new TTS outcome branches.

Cover Mode 1 and Mode 2 success, skipped synthesis, timeout, NeuroLinkError, generic errors, metadata latency, and telemetry failure isolation. The linked objective explicitly requires unit tests for error scenarios.

#!/bin/bash
rg -n -C3 \
  'handleDirectTTSSynthesis|synthesizeAIResponseIfNeeded|getTTSErrorDetails|ttsMetadata|recordTTSFailure' \
  --glob '*.{test,spec}.{ts,tsx}' .

Also applies to: 1586-1655

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/core/baseProvider.ts` around lines 1344 - 1374, Add focused unit
tests for the TTS outcome branches exercised by handleDirectTTSSynthesis and
synthesizeAIResponseIfNeeded: Mode 1 and Mode 2 success, skipped synthesis,
timeout, NeuroLinkError, generic errors, metadata latency, and telemetry failure
isolation. Mock TTSProcessor.synthesize, withTimeoutFn, getTTSErrorDetails, and
recordTTSFailure as needed, and assert audio plus ttsMetadata fields and failure
behavior without changing production logic.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@src/lib/core/baseProvider.ts`:
- Around line 1344-1374: Add focused unit tests for the TTS outcome branches
exercised by handleDirectTTSSynthesis and synthesizeAIResponseIfNeeded: Mode 1
and Mode 2 success, skipped synthesis, timeout, NeuroLinkError, generic errors,
metadata latency, and telemetry failure isolation. Mock TTSProcessor.synthesize,
withTimeoutFn, getTTSErrorDetails, and recordTTSFailure as needed, and assert
audio plus ttsMetadata fields and failure behavior without changing production
logic.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: a6343214-5673-4f8e-b977-b541f9257914

📥 Commits

Reviewing files that changed from the base of the PR and between abb41ed and 31c4d7e.

📒 Files selected for processing (3)
  • src/lib/core/baseProvider.ts
  • src/lib/core/modules/TelemetryHandler.ts
  • src/lib/types/generate.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/lib/core/modules/TelemetryHandler.ts
  • src/lib/types/generate.ts

@murdore

murdore commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

@Harshita-Rupani29 can you resolve the conflicts?

@Harshita-Rupani29
Harshita-Rupani29 force-pushed the feat/tts-error-observability branch from 31c4d7e to f446670 Compare July 30, 2026 09:45

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/lib/core/baseProvider.ts (1)

1430-1480: 📐 Maintainability & Code Quality | 🔵 Trivial | 🏗️ Heavy lift

Missing unit tests for the new TTS failure/skip scenarios.

Issue #702 explicitly calls for unit tests covering TTS error scenarios, but the PR summary states no automated tests are included. These two paths (handleDirectTTSSynthesis, synthesizeAIResponseIfNeeded) are new critical-path failure handling (timeout, provider error, skip) that would benefit from coverage — especially the getTTSErrorDetails branching (timeout vs NeuroLinkError vs generic) and the skip-metadata case.

Want me to draft unit tests for these scenarios (timeout, NeuroLinkError, generic error, and the missing-aiResponse/provider skip case)?

Also applies to: 1666-1736

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/core/baseProvider.ts` around lines 1430 - 1480, Add unit tests for
handleDirectTTSSynthesis and synthesizeAIResponseIfNeeded covering TTS timeout
errors, NeuroLinkError failures, generic errors, and the
missing-aiResponse/provider skip path. Assert getTTSErrorDetails-derived
metadata, failed/successful status, telemetry or error handling, and the
expected skip metadata without invoking synthesis when prerequisites are absent.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/lib/core/baseProvider.ts`:
- Around line 1738-1761: The getTTSErrorDetails method returns unsanitized error
messages in every branch. Wrap the messages from AsyncTimeoutError,
NeuroLinkError, and the fallback Error/String conversion with
redactUrlForError() before assigning them to the returned error metadata, while
preserving the existing codes and retriable values.

---

Nitpick comments:
In `@src/lib/core/baseProvider.ts`:
- Around line 1430-1480: Add unit tests for handleDirectTTSSynthesis and
synthesizeAIResponseIfNeeded covering TTS timeout errors, NeuroLinkError
failures, generic errors, and the missing-aiResponse/provider skip path. Assert
getTTSErrorDetails-derived metadata, failed/successful status, telemetry or
error handling, and the expected skip metadata without invoking synthesis when
prerequisites are absent.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 2f298430-3ce6-4de4-826c-937c14271a51

📥 Commits

Reviewing files that changed from the base of the PR and between 31c4d7e and f446670.

📒 Files selected for processing (3)
  • src/lib/core/baseProvider.ts
  • src/lib/core/modules/TelemetryHandler.ts
  • src/lib/types/generate.ts

Comment on lines +1738 to +1761
private getTTSErrorDetails(
error: unknown,
): NonNullable<TTSMetadata["error"]> {
if (error instanceof AsyncTimeoutError) {
return {
code: TTS_ERROR_CODES.SYNTHESIS_FAILED,
message: error.message,
retriable: true,
};
}

if (error instanceof NeuroLinkError) {
return {
code: error.code,
message: error.message,
retriable: error.retriable,
};
}

return {
code: TTS_ERROR_CODES.SYNTHESIS_FAILED,
message: error instanceof Error ? error.message : String(error),
};
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== locate relevant files =="
git ls-files | rg '(^|/)baseProvider\.ts$|utils/logSanitize|TTSError|TTS|redactUrlForError' || true

echo
echo "== inspect baseProvider relevant outline/imports =="
ast-grep outline src/lib/core/baseProvider.ts --view compact || true

echo
echo "== read relevant baseProvider sections =="
wc -l src/lib/core/baseProvider.ts
sed -n '1,120p' src/lib/core/baseProvider.ts
sed -n '1680,1790p' src/lib/core/baseProvider.ts

echo
echo "== search error propagation/usages =="
rg -n "getTTSErrorDetails|TTSError|error.message|NeuroLinkError|AsyncTimeoutError|generateWithTTS|EnhancedGenerateResult|TTS_ERROR_CODES" src/lib/core src/lib -g '*.ts' | head -200

Repository: juspay/neurolink

Length of output: 30199


🌐 Web query:

CodeRabbit TTS provider error messages raw URLs redactUrlForError NeuroLinkError AsyncTimeoutError BaseProvider

💡 Result:

The terms and identifiers listed appear to relate to general software architecture for AI agents, TTS (Text-to-Speech) systems, and error handling patterns rather than being unique, proprietary error messages exclusive to the CodeRabbit service. Technical context for these terms: - TTS provider / BaseProvider: In architectures like CoderClaw (often discussed alongside AI agent tooling), BaseProvider is a common abstract class or interface used to standardize interaction with various external TTS engines (such as OpenAI, ElevenLabs, or Edge TTS) [1][2]. BaseProvider typically enforces a contract for methods like conversion, while TtsProviderAttempt tracks the outcome of these calls, including success or failure reasons [1]. - Error Handling (NeuroLinkError, AsyncTimeoutError, redactUrlForError): These are idiomatic patterns for handling asynchronous operations and logging in TypeScript/Node.js applications [1]. - AsyncTimeoutError is a standard exception for operations exceeding a specified time limit [1]. - redactUrlForError (or similar functions like redactSensitiveText) is a common security practice implemented in logging utilities to prevent sensitive information—such as API keys or private URLs—from being exposed in error logs [1][3]. - NeuroLinkError appears to be a specific custom error class associated with projects or documentation (such as the NeuroLink blog) that discuss the "Five-Stage Message Flow" for AI agents [4][5][6]. It is not a standard error message used by the CodeRabbit platform itself [7][8]. CodeRabbit, which provides AI-powered code reviews, maintains its own documentation on configuration and troubleshooting [7][8], but does not publicly list the specific identifiers you mentioned as native error codes for its platform. If you are encountering these errors, they likely originate from a custom integration, a specific SDK (like those used in the open-source projects referenced), or an underlying service provider's infrastructure [9][1].

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== TTS processor outline =="
wc -l src/lib/utils/ttsProcessor.ts
ast-grep outline src/lib/utils/ttsProcessor.ts --view expanded || true
sed -n '1,280p' src/lib/utils/ttsProcessor.ts

echo
echo "== TTS handler outlines and imports =="
for f in src/lib/adapters/tts/googleTTSHandler.ts src/lib/voice/providers/*.ts src/lib/utils/ttsProcessor.ts src/lib/utils/logSanitize.ts; do
  echo "---- $f ----"
  wc -l "$f"
  ast-grep outline "$f" --view expanded | sed -n '1,180p' || true
done

echo
echo "== all new lines mentioning URLs/requests/errors in TTS files =="
rg -n "fetch\\(|axios|response\\.url|url|URL|error\\.|message|NeuroLinkError|redactUrlForError|presign|token|auth|Authorization|error.message|throw new" src/lib/adapters/tts src/lib/voice/providers src/lib/utils/ttsProcessor.ts

echo
echo "== inspect TTS providers/handler error paths =="
sed -n '1,260p' src/lib/adapters/tts/googleTTSHandler.ts
sed -n '1,260p' src/lib/voice/providers/OpenAITTS.ts
sed -n '1,220p' src/lib/voice/providers/ElevenLabsTTS.ts
sed -n '1,220p' src/lib/voice/providers/AzureTTS.ts
sed -n '1,220p' src/lib/voice/providers/CartesiaTTS.ts

Repository: juspay/neurolink

Length of output: 50374


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== inspect TTS processor implementation and tests for throw sources =="
rg -n "throw|rejection|response|fetch\\(|generate\\(|synthesiz|synthesize|NeuroLinkError|redactUrlForError" . -g '*test*' -g '*.test.ts' -g '*.spec.ts' -g '*example*' -g '*fixture*' 2>/dev/null | rg -i "tts|voice|audio|generate\\(" || true

echo
echo "== source-only throw/error construction in src lib tts/voice =="
python3 - <<'PY'
from pathlib import Path
for p in [Path('src/lib/utils/ttsProcessor.ts'), Path('src/lib/adapters/tts/googleTTSHandler.ts')]:
    print(f'--- {p} ---')
    txt=p.read_text()
    for i,line in enumerate(txt.splitlines(),1):
        if 'throw' in line or 'new NeuroLinkError' in line or 'rejection' in line or "reject" in line:
            print(f'{i:4}: {line[:240]}')
PY

Repository: juspay/neurolink

Length of output: 50372


Sanitize TTS error messages before returning them in ttsMetadata.error.message.

getTTSErrorDetails forwards raw error.message values into EnhancedGenerateResult.ttsMetadata.error, including AsyncTimeoutError, NeuroLinkError, and the fallback. Wrap these messages with redactUrlForError() before returning them.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/core/baseProvider.ts` around lines 1738 - 1761, The
getTTSErrorDetails method returns unsanitized error messages in every branch.
Wrap the messages from AsyncTimeoutError, NeuroLinkError, and the fallback
Error/String conversion with redactUrlForError() before assigning them to the
returned error metadata, while preserving the existing codes and retriable
values.

Source: Learnings

@murdore
murdore force-pushed the feat/tts-error-observability branch from f446670 to ec2facb Compare July 30, 2026 15:46
@murdore
murdore merged commit 2ee39c2 into juspay:release Jul 30, 2026
7 of 8 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 10.8.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(tts): Add TTS error observability with structured metadata

2 participants