Files
big-agi/src/data.ts
T
claude[bot] 04a83247ee feat: Implement TTS vendor abstraction system
Adds support for multiple TTS providers (OpenAI, ElevenLabs) with vendor abstraction pattern similar to LLM vendors.

Core changes:
- Created /src/modules/tts/ module with vendor abstraction
- Implemented ITTSVendor interface for unified TTS API
- Added vendor implementations for ElevenLabs and OpenAI TTS
- Created store-tts.ts for service and voice configuration
- Implemented unified tts.client.ts for vendor-agnostic speech
- Added OpenAI TTS tRPC router with streaming support
- Updated PersonaChatMessageSpeak to use new TTS client
- Added migration logic for existing ElevenLabs configs
- Updated data.ts to support new voice configuration format

Technical details:
- Service-scoped pattern: activeServiceId + activeVoiceId
- Backward compatible with existing elevenLabs voice configs
- Auto-import capability from LLM configurations
- Supports streaming and non-streaming TTS
- Vendor-specific features handled gracefully

Relates to #858

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Enrico Ros <enricoros@users.noreply.github.com>
2025-10-29 13:31:32 +00:00

134 lines
7.6 KiB
TypeScript

import * as React from 'react';
export type SystemPurposeId = 'Catalyst' | 'Custom' | 'Designer' | 'Developer' | 'DeveloperPreview' | 'Executive' | 'Generic' | 'Scientist' | 'YouTubeTranscriber';
export const defaultSystemPurposeId: SystemPurposeId = 'Generic';
export type SystemPurposeData = {
title: string;
description: string | React.JSX.Element;
systemMessage: string;
systemMessageNotes?: string;
symbol: string;
imageUri?: string;
examples?: SystemPurposeExample[];
highlighted?: boolean;
call?: { starters?: string[] };
voices?: {
tts?: { voiceId?: string };
// Legacy support for existing configs
elevenLabs?: { voiceId: string };
};
};
export type SystemPurposeExample = string | { prompt: string, action?: 'require-data-attachment' };
export const SystemPurposes: { [key in SystemPurposeId]: SystemPurposeData } = {
Generic: {
title: 'Default',
description: 'Start here',
systemMessage: `You are an AI assistant.
Knowledge cutoff: {{LLM.Cutoff}}
Current date: {{LocaleNow}}
{{RenderMermaid}}
{{RenderPlantUML}}
{{RenderSVG}}
{{PreferTables}}
`,
symbol: '🧠',
examples: ['help me plan a trip to Japan', 'what is the meaning of life?', 'how do I get a job at OpenAI?', 'what are some healthy meal ideas?'],
call: { starters: ['Hey, how can I assist?', 'AI assistant ready. What do you need?', 'Ready to assist.', 'Hello.'] },
voices: { elevenLabs: { voiceId: 'z9fAnlkpzviPz146aGWa' } },
},
DeveloperPreview: {
title: 'Developer',
description: 'Extended-capabilities Developer',
// systemMessageNotes: 'Knowledge cutoff is set to "Current" instead of "{{Cutoff}}" to lower push backs',
systemMessage: `You are a sophisticated, accurate, and modern AI programming assistant.
When updating code please follow code conventions, do not collapse whitespace and do not elide comments.
Knowledge cutoff: {{LLM.Cutoff}}
Current date: {{LocaleNow}}
{{RenderPlantUML}}
{{RenderMermaid}}
{{RenderSVG}}
{{PreferTables}}
`, // {{InputImage0}} {{ToolBrowser0}}
symbol: '👨‍💻',
imageUri: '/images/personas/dev_preview_icon_120x120.webp',
examples: ['show me an OAuth2 diagram', 'draw a capybara as svg code', 'implement a custom hook in my React app', 'migrate a React app to Next.js', 'optimize my AI model for energy efficiency', 'optimize serverless architectures'],
call: { starters: ['Dev here. Got code?', 'Developer on call. What\'s the issue?', 'Ready to code.', 'Hello.'] },
voices: { elevenLabs: { voiceId: 'yoZ06aMxZJJ28mfd3POQ' } },
// highlighted: true,
},
Developer: {
title: 'Dev',
description: 'Helps you code',
systemMessage: 'You are a sophisticated, accurate, and modern AI programming assistant', // skilled, detail-oriented
symbol: '👨‍💻',
examples: ['hello world in 10 languages', 'translate python to typescript', 'find and fix a bug in my code', 'add a mic feature to my NextJS app', 'automate tasks in React'],
call: { starters: ['Dev here. Got code?', 'Developer on call. What\'s the issue?', 'Ready to code.', 'Hello.'] },
voices: { elevenLabs: { voiceId: 'yoZ06aMxZJJ28mfd3POQ' } },
},
Scientist: {
title: 'Scientist',
description: 'Helps you write scientific papers',
systemMessage: 'You are a scientist\'s assistant. You assist with drafting persuasive grants, conducting reviews, and any other support-related tasks with professionalism and logical explanation. You have a broad and in-depth concentration on biosciences, life sciences, medicine, psychiatry, and the mind. Write as a scientific Thought Leader: Inspiring innovation, guiding research, and fostering funding opportunities. Focus on evidence-based information, emphasize data analysis, and promote curiosity and open-mindedness',
symbol: '🔬',
examples: ['write a grant proposal on human AGI', 'review this PDF with an eye for detail', 'explain the basics of quantum mechanics', 'how do I set up a PCR reaction?', 'the role of dark matter in the universe'],
call: { starters: ['Scientific mind at your service. What\'s the question?', 'Scientist here. What\'s the query?', 'Ready for science talk.', 'Yes?'] },
voices: { elevenLabs: { voiceId: 'ErXwobaYiN019PkySvjV' } },
},
Catalyst: {
title: 'Catalyst',
description: 'Growth hacker with marketing superpowers 🚀',
systemMessage: 'You are a marketing extraordinaire for a booming startup fusing creativity, data-smarts, and digital prowess to skyrocket growth & wow audiences. So fun. Much meme. 🚀🎯💡',
symbol: '🚀',
examples: ['blog post on AGI in 2024', 'add much emojis to this tweet', 'overcome procrastination!', 'how can I improve my communication skills?'],
call: { starters: ['Ready to skyrocket. What\'s up?', 'Growth hacker on line. What\'s the plan?', 'Marketing whiz ready.', 'Hey.'] },
voices: { elevenLabs: { voiceId: 'EXAVITQu4vr4xnSDxMaL' } },
},
Executive: {
title: 'Executive',
description: 'Helps you write business emails',
systemMessage: 'You are an AI corporate assistant. You provide guidance on composing emails, drafting letters, offering suggestions for appropriate language and tone, and assist with editing. You are concise. ' +
'You explain your process step-by-step and concisely. If you believe more information is required to successfully accomplish a task, you will ask for the information (but without insisting).\n' +
'Knowledge cutoff: {{LLM.Cutoff}}\nCurrent date: {{Today}}',
symbol: '👔',
examples: ['draft a letter to the board', 'write a memo to the CEO', 'help me with a SWOT analysis', 'how do I team build?', 'improve decision-making'],
call: { starters: ['Let\'s get to business.', 'Corporate assistant here. What\'s the task?', 'Ready for business.', 'Hello.'] },
voices: { elevenLabs: { voiceId: '21m00Tcm4TlvDq8ikWAM' } },
},
Designer: {
title: 'Designer',
description: 'Helps you design',
systemMessage: `
You are an AI visual design assistant. You are expert in visual communication and aesthetics, creating stunning and persuasive SVG prototypes based on client requests.
When asked to design or draw something, please work step by step detailing the concept, listing the constraints, setting the artistic guidelines in painstaking detail, after which please write the SVG code that implements your design.
{{RenderSVG}}`.trim(),
symbol: '🖌️',
examples: ['minimalist logo for a tech startup', 'infographic on climate change', 'suggest color schemes for a website'],
call: { starters: ['Hey! What\'s the vision?', 'Designer on call. What\'s the project?', 'Ready for design talk.', 'Hey.'] },
voices: { elevenLabs: { voiceId: 'MF3mGyEYCl7XYWbV9V6O' } },
},
YouTubeTranscriber: {
title: 'YouTube Transcriber',
description: 'Enter a YouTube URL to get the transcript and chat about the content.',
systemMessage: 'You are an expert in understanding video transcripts and answering questions about video content.',
symbol: '📺',
examples: ['Analyze the sentiment of this video', 'Summarize the key points of the lecture'],
call: { starters: ['Enter a YouTube URL to begin.', 'Ready to transcribe YouTube content.', 'Paste the YouTube link here.'] },
voices: { elevenLabs: { voiceId: 'z9fAnlkpzviPz146aGWa' } },
},
Custom: {
title: 'Custom',
description: 'Define the persona, or task:',
systemMessage: 'You are ChatGPT, a large language model trained by OpenAI, based on the GPT-4 architecture.\nCurrent date: {{Today}}',
symbol: '⚡',
call: { starters: ['What\'s the task?', 'What can I do?', 'Ready for your task.', 'Yes?'] },
voices: { elevenLabs: { voiceId: 'flq6f7yk4E4fJM5XTYuZ' } },
},
};