From ecf22de9029f37fb2a4c4fcb9f42f8458b70d679 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 3 Aug 2026 16:44:01 +0000 Subject: [PATCH 1/2] chore: regenerate examples from updated skills Co-authored-by: tadas --- .../guardrails/example/app/api/agent/route.ts | 2 + .../app/api/conversation-token/route.ts | 42 +++++++++++++------ agents/nextjs/guardrails/example/app/page.tsx | 9 ++-- agents/nextjs/guardrails/example/package.json | 2 +- 4 files changed, 36 insertions(+), 19 deletions(-) diff --git a/agents/nextjs/guardrails/example/app/api/agent/route.ts b/agents/nextjs/guardrails/example/app/api/agent/route.ts index 4b5fad06..649eff81 100644 --- a/agents/nextjs/guardrails/example/app/api/agent/route.ts +++ b/agents/nextjs/guardrails/example/app/api/agent/route.ts @@ -106,6 +106,8 @@ export async function POST() { name: "No investment recommendations", isEnabled: true, executionMode: "blocking", + model: "gemini-2.5-flash-lite", + historyMessageCount: 1, prompt: "Block any response that recommends investments, suggests specific stocks, ETFs, funds, bonds, crypto, or portfolio allocations, or otherwise gives personalized financial or investment advice. If the agent starts giving investment recommendations, end the conversation immediately.", triggerAction: { type: "end_call" }, diff --git a/agents/nextjs/guardrails/example/app/api/conversation-token/route.ts b/agents/nextjs/guardrails/example/app/api/conversation-token/route.ts index b027a0e8..9e783652 100644 --- a/agents/nextjs/guardrails/example/app/api/conversation-token/route.ts +++ b/agents/nextjs/guardrails/example/app/api/conversation-token/route.ts @@ -1,8 +1,23 @@ -import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js"; +import { ElevenLabsClient, ElevenLabsError } from "@elevenlabs/elevenlabs-js"; import { NextResponse } from "next/server"; +function requireApiKey(): string | null { + const key = process.env.ELEVENLABS_API_KEY; + return key?.trim() ? key : null; +} + +function apiErrorMessage(err: unknown): string { + if (err instanceof ElevenLabsError) { + return err.message; + } + if (err instanceof Error) { + return err.message; + } + return "An unexpected error occurred."; +} + export async function GET(request: Request) { - const apiKey = process.env.ELEVENLABS_API_KEY; + const apiKey = requireApiKey(); if (!apiKey) { return NextResponse.json( { error: "Server misconfiguration: ELEVENLABS_API_KEY is not set." }, @@ -18,17 +33,18 @@ export async function GET(request: Request) { ); } - const client = new ElevenLabsClient({ apiKey }); - try { - const { signedUrl } = - await client.conversationalAi.conversations.getSignedUrl({ - agentId, - }); - return NextResponse.json({ signedUrl }); - } catch (e) { - const message = - e instanceof Error ? e.message : "Failed to create signed URL."; - return NextResponse.json({ error: message }, { status: 502 }); + const client = new ElevenLabsClient({ apiKey }); + const res = await client.conversationalAi.conversations.getWebrtcToken({ + agentId, + }); + return NextResponse.json({ token: res.token }); + } catch (err) { + const status = + err instanceof ElevenLabsError && err.statusCode ? err.statusCode : 502; + return NextResponse.json( + { error: apiErrorMessage(err) }, + { status: status >= 400 && status < 600 ? status : 502 } + ); } } diff --git a/agents/nextjs/guardrails/example/app/page.tsx b/agents/nextjs/guardrails/example/app/page.tsx index d2b747b5..b728e874 100644 --- a/agents/nextjs/guardrails/example/app/page.tsx +++ b/agents/nextjs/guardrails/example/app/page.tsx @@ -112,15 +112,14 @@ function GuardrailsPage({ const res = await fetch( `/api/conversation-token?agentId=${encodeURIComponent(trimmedId)}` ); - const data: { signedUrl?: string; error?: string } = await res.json(); - if (!res.ok || !data.signedUrl) { - setSessionError(data.error ?? "Could not get signed URL."); + const data: { token?: string; error?: string } = await res.json(); + if (!res.ok || !data.token) { + setSessionError(data.error ?? "Could not get conversation token."); return; } await startSession({ - connectionType: "websocket", - signedUrl: data.signedUrl, + conversationToken: data.token, }); } catch (error) { const nextMessage = diff --git a/agents/nextjs/guardrails/example/package.json b/agents/nextjs/guardrails/example/package.json index 07b142e4..bc6cb515 100644 --- a/agents/nextjs/guardrails/example/package.json +++ b/agents/nextjs/guardrails/example/package.json @@ -34,7 +34,7 @@ }, "pnpm": { "overrides": { - "livekit-client": "2.19.1" + "livekit-client": "2.16.1" } } } From 23383db801eb1946afcaaf18596e075cd5d050ed Mon Sep 17 00:00:00 2001 From: Tadas Petra <60107328+tadaspetra@users.noreply.github.com> Date: Mon, 3 Aug 2026 13:22:22 -0500 Subject: [PATCH 2/2] fix: align guardrails livekit pin and clear ruff failures Match setup.sh to the WebRTC-safe livekit-client override, and tighten Python lint so CI ruff check passes. Co-authored-by: Cursor --- .../scripts/scaffold_example.py | 4 ++-- agents/nextjs/guardrails/setup.sh | 2 +- music/python/quickstart/example/main.py | 11 +++-------- sound-effects/python/quickstart/example/main.py | 6 +++--- speech-to-text/python/quickstart/example/main.py | 6 +++++- text-to-speech/python/quickstart/example/main.py | 9 ++++++--- 6 files changed, 20 insertions(+), 18 deletions(-) mode change 100644 => 100755 .cursor/skills/scaffold-elevenlabs-example/scripts/scaffold_example.py diff --git a/.cursor/skills/scaffold-elevenlabs-example/scripts/scaffold_example.py b/.cursor/skills/scaffold-elevenlabs-example/scripts/scaffold_example.py old mode 100644 new mode 100755 index 99e848d3..4ed7b585 --- a/.cursor/skills/scaffold-elevenlabs-example/scripts/scaffold_example.py +++ b/.cursor/skills/scaffold-elevenlabs-example/scripts/scaffold_example.py @@ -75,7 +75,7 @@ def pick_reference(paths: list[Path]) -> Path | None: if not paths: return None - return sorted(paths, key=lambda path: (path.name != "quickstart", str(path)))[0] + return min(paths, key=lambda path: (path.name != "quickstart", str(path))) def find_reference( @@ -119,7 +119,7 @@ def write_file(path: Path, content: str) -> None: def main() -> None: args = parse_args() - product, runtime, slug = parse_example_path(args.path) + product, runtime, _slug = parse_example_path(args.path) target_dir = (REPO_ROOT / args.path.strip().strip("/")).resolve() if REPO_ROOT not in target_dir.parents: diff --git a/agents/nextjs/guardrails/setup.sh b/agents/nextjs/guardrails/setup.sh index 786ae1b9..c3c8ea18 100755 --- a/agents/nextjs/guardrails/setup.sh +++ b/agents/nextjs/guardrails/setup.sh @@ -35,7 +35,7 @@ node -e " delete pkg.dependencies['@elevenlabs/client']; pkg.pnpm = pkg.pnpm || {}; pkg.pnpm.overrides = pkg.pnpm.overrides || {}; - pkg.pnpm.overrides['livekit-client'] = '2.19.1'; + pkg.pnpm.overrides['livekit-client'] = '2.16.1'; require('fs').writeFileSync('package.json', JSON.stringify(pkg, null, 2) + '\n'); " diff --git a/music/python/quickstart/example/main.py b/music/python/quickstart/example/main.py index c8f70956..9d59c094 100644 --- a/music/python/quickstart/example/main.py +++ b/music/python/quickstart/example/main.py @@ -4,13 +4,12 @@ import json import os import sys -from typing import Any, Optional +from typing import Any from dotenv import load_dotenv from elevenlabs import ElevenLabs from elevenlabs.core.api_error import ApiError - DEFAULT_PROMPT = "A chill lo-fi beat with jazzy piano chords" OUTPUT_FILE = "output.mp3" @@ -32,7 +31,7 @@ def _body_as_dict(error: ApiError) -> dict[str, Any]: return {} -def _find_prompt_suggestion(obj: Any) -> Optional[str]: +def _find_prompt_suggestion(obj: Any) -> str | None: if isinstance(obj, dict): suggestion = obj.get("prompt_suggestion") if suggestion: @@ -111,8 +110,7 @@ def main() -> None: music_length_ms=10000, ) with open(out_path, "wb") as f: - for chunk in audio: - f.write(chunk) + f.writelines(audio) except ApiError as e: body_dict = _body_as_dict(e) suggestion = _find_prompt_suggestion(body_dict) @@ -126,9 +124,6 @@ def main() -> None: except OSError as e: print(f"Could not write {out_path}: {e}", file=sys.stderr) raise SystemExit(1) from None - except Exception as e: - print(f"Unexpected error: {e}", file=sys.stderr) - raise SystemExit(1) from None print(f"Saved music to {out_path}") diff --git a/sound-effects/python/quickstart/example/main.py b/sound-effects/python/quickstart/example/main.py index 0507932e..346f3b5e 100644 --- a/sound-effects/python/quickstart/example/main.py +++ b/sound-effects/python/quickstart/example/main.py @@ -4,6 +4,7 @@ from dotenv import load_dotenv from elevenlabs import ElevenLabs +from elevenlabs.core.api_error import ApiError load_dotenv() @@ -20,15 +21,14 @@ def main() -> int: audio = client.text_to_sound_effects.convert(text=prompt) with output_path.open("wb") as output_file: - for chunk in audio: - output_file.write(chunk) + output_file.writelines(audio) print(f"Wrote generated sound effect to {output_path}") return 0 except KeyError: print("Missing ELEVENLABS_API_KEY. Add it to .env before running.", file=sys.stderr) return 1 - except Exception as error: + except (ApiError, OSError) as error: print(f"Sound effect generation failed: {error}", file=sys.stderr) return 1 diff --git a/speech-to-text/python/quickstart/example/main.py b/speech-to-text/python/quickstart/example/main.py index cef16cd8..998361ca 100644 --- a/speech-to-text/python/quickstart/example/main.py +++ b/speech-to-text/python/quickstart/example/main.py @@ -3,6 +3,7 @@ from dotenv import load_dotenv from elevenlabs import ElevenLabs +from elevenlabs.core.api_error import ApiError load_dotenv() @@ -25,7 +26,10 @@ def main(): except FileNotFoundError: print(f"Error: Audio file not found: {audio_path}", file=sys.stderr) sys.exit(1) - except Exception as e: + except KeyError: + print("Error: Missing ELEVENLABS_API_KEY", file=sys.stderr) + sys.exit(1) + except ApiError as e: print(f"Error: Transcription failed: {e}", file=sys.stderr) sys.exit(1) diff --git a/text-to-speech/python/quickstart/example/main.py b/text-to-speech/python/quickstart/example/main.py index c58b8cf5..d3949a18 100644 --- a/text-to-speech/python/quickstart/example/main.py +++ b/text-to-speech/python/quickstart/example/main.py @@ -3,6 +3,7 @@ from dotenv import load_dotenv from elevenlabs import ElevenLabs +from elevenlabs.core.api_error import ApiError load_dotenv() @@ -22,12 +23,14 @@ def main(): ) with open("output.mp3", "wb") as f: - for chunk in audio: - f.write(chunk) + f.writelines(audio) print("Success! Audio saved to output.mp3") - except Exception as e: + except KeyError: + print("Error: Missing ELEVENLABS_API_KEY") + sys.exit(1) + except (ApiError, OSError) as e: print(f"Error: {e}") sys.exit(1)