{"version":3,"sources":["../../src/models.ts","../../src/exceptions.ts","../../src/client.ts","../../src/tools/types.ts","../../src/tools/generic-tools.ts"],"names":["ALL_VOICES","LANGUAGES"],"mappings":"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","file":"generic-tools.mjs","sourcesContent":["/**\r\n * Data models for LangVoice SDK\r\n */\r\n\r\n// ============================================\r\n// Type Definitions\r\n// ============================================\r\n\r\nexport interface VoiceData {\r\n  id: string;\r\n  name: string;\r\n  gender?: string;\r\n  language?: string;\r\n  description?: string;\r\n}\r\n\r\nexport interface LanguageData {\r\n  id: string;\r\n  name: string;\r\n  voices?: string[];\r\n}\r\n\r\nexport interface GenerateRequestData {\r\n  text: string;\r\n  voice: string;\r\n  language: string;\r\n  speed: number;\r\n}\r\n\r\nexport interface MultiVoiceRequestData {\r\n  text: string;\r\n  language: string;\r\n  speed: number;\r\n}\r\n\r\nexport interface GenerateResponseData {\r\n  audioData: Buffer | ArrayBuffer;\r\n  duration?: number;\r\n  generationTime?: number;\r\n  charactersProcessed?: number;\r\n}\r\n\r\n// ============================================\r\n// Classes\r\n// ============================================\r\n\r\n/**\r\n * Voice model\r\n */\r\nexport class Voice implements VoiceData {\r\n  public readonly id: string;\r\n  public readonly name: string;\r\n  public readonly gender?: string;\r\n  public readonly language?: string;\r\n  public readonly description?: string;\r\n\r\n  constructor(data: VoiceData) {\r\n    this.id = data.id;\r\n    this.name = data.name;\r\n    this.gender = data.gender;\r\n    this.language = data.language;\r\n    this.description = data.description;\r\n  }\r\n\r\n  toJSON(): VoiceData {\r\n    return {\r\n      id: this.id,\r\n      name: this.name,\r\n      gender: this.gender,\r\n      language: this.language,\r\n      description: this.description,\r\n    };\r\n  }\r\n}\r\n\r\n/**\r\n * Language model\r\n */\r\nexport class Language implements LanguageData {\r\n  public readonly id: string;\r\n  public readonly name: string;\r\n  public readonly voices?: string[];\r\n\r\n  constructor(data: LanguageData) {\r\n    this.id = data.id;\r\n    this.name = data.name;\r\n    this.voices = data.voices;\r\n  }\r\n\r\n  toJSON(): LanguageData {\r\n    return {\r\n      id: this.id,\r\n      name: this.name,\r\n      voices: this.voices,\r\n    };\r\n  }\r\n}\r\n\r\n/**\r\n * Generate request model\r\n */\r\nexport class GenerateRequest implements GenerateRequestData {\r\n  public readonly text: string;\r\n  public readonly voice: string;\r\n  public readonly language: string;\r\n  public readonly speed: number;\r\n\r\n  constructor(data: Partial<GenerateRequestData> & { text: string }) {\r\n    if (!data.text || data.text.length === 0) {\r\n      throw new Error('Text is required');\r\n    }\r\n    if (data.text.length > 5000) {\r\n      throw new Error('Text must be 5000 characters or less');\r\n    }\r\n\r\n    this.text = data.text;\r\n    this.voice = data.voice || 'heart';\r\n    this.language = data.language || 'american_english';\r\n    this.speed = data.speed ?? 1.0;\r\n\r\n    if (this.speed < 0.5 || this.speed > 2.0) {\r\n      throw new Error('Speed must be between 0.5 and 2.0');\r\n    }\r\n  }\r\n\r\n  toJSON(): GenerateRequestData {\r\n    return {\r\n      text: this.text,\r\n      voice: this.voice,\r\n      language: this.language,\r\n      speed: this.speed,\r\n    };\r\n  }\r\n}\r\n\r\n/**\r\n * Multi-voice request model\r\n */\r\nexport class MultiVoiceRequest implements MultiVoiceRequestData {\r\n  public readonly text: string;\r\n  public readonly language: string;\r\n  public readonly speed: number;\r\n\r\n  constructor(data: Partial<MultiVoiceRequestData> & { text: string }) {\r\n    if (!data.text || data.text.length === 0) {\r\n      throw new Error('Text is required');\r\n    }\r\n    if (data.text.length > 5000) {\r\n      throw new Error('Text must be 5000 characters or less');\r\n    }\r\n\r\n    this.text = data.text;\r\n    this.language = data.language || 'american_english';\r\n    this.speed = data.speed ?? 1.0;\r\n\r\n    if (this.speed < 0.5 || this.speed > 2.0) {\r\n      throw new Error('Speed must be between 0.5 and 2.0');\r\n    }\r\n  }\r\n\r\n  toJSON(): MultiVoiceRequestData {\r\n    return {\r\n      text: this.text,\r\n      language: this.language,\r\n      speed: this.speed,\r\n    };\r\n  }\r\n}\r\n\r\n/**\r\n * Generate response model\r\n */\r\nexport class GenerateResponse implements GenerateResponseData {\r\n  public readonly audioData: Buffer;\r\n  public readonly duration?: number;\r\n  public readonly generationTime?: number;\r\n  public readonly charactersProcessed?: number;\r\n\r\n  constructor(data: GenerateResponseData) {\r\n    this.audioData = Buffer.isBuffer(data.audioData)\r\n      ? data.audioData\r\n      : Buffer.from(data.audioData);\r\n    this.duration = data.duration;\r\n    this.generationTime = data.generationTime;\r\n    this.charactersProcessed = data.charactersProcessed;\r\n  }\r\n\r\n  /**\r\n   * Get audio as base64 string\r\n   */\r\n  toBase64(): string {\r\n    return this.audioData.toString('base64');\r\n  }\r\n\r\n  /**\r\n   * Get audio as Uint8Array (for browser compatibility)\r\n   */\r\n  toUint8Array(): Uint8Array {\r\n    return new Uint8Array(this.audioData);\r\n  }\r\n\r\n  /**\r\n   * Get audio as ArrayBuffer (for browser compatibility)\r\n   */\r\n  toArrayBuffer(): ArrayBuffer {\r\n    const buffer = this.audioData.buffer.slice(\r\n      this.audioData.byteOffset,\r\n      this.audioData.byteOffset + this.audioData.byteLength\r\n    );\r\n    return buffer as ArrayBuffer;\r\n  }\r\n}\r\n\r\n/**\r\n * Voices response model\r\n */\r\nexport class VoicesResponse {\r\n  public readonly voices: Voice[];\r\n\r\n  constructor(data: { voices: VoiceData[] }) {\r\n    this.voices = data.voices.map((v) => new Voice(v));\r\n  }\r\n}\r\n\r\n/**\r\n * Languages response model\r\n */\r\nexport class LanguagesResponse {\r\n  public readonly languages: Language[];\r\n\r\n  constructor(data: { languages: LanguageData[] }) {\r\n    this.languages = data.languages.map((l) => new Language(l));\r\n  }\r\n}\r\n\r\n// ============================================\r\n// Constants\r\n// ============================================\r\n\r\nexport const AMERICAN_VOICES = [\r\n  'heart',\r\n  'bella',\r\n  'nicole',\r\n  'sarah',\r\n  'nova',\r\n  'sky',\r\n  'jessica',\r\n  'river',\r\n  'michael',\r\n  'fenrir',\r\n  'eric',\r\n  'liam',\r\n  'onyx',\r\n  'adam',\r\n] as const;\r\n\r\nexport const BRITISH_VOICES = [\r\n  'emma',\r\n  'isabella',\r\n  'alice',\r\n  'lily',\r\n  'george',\r\n  'fable',\r\n  'lewis',\r\n  'daniel',\r\n] as const;\r\n\r\nexport const ALL_VOICES = [...AMERICAN_VOICES, ...BRITISH_VOICES] as const;\r\n\r\nexport const LANGUAGES = [\r\n  'american_english',\r\n  'british_english',\r\n  'spanish',\r\n  'french',\r\n  'hindi',\r\n  'italian',\r\n  'japanese',\r\n  'brazilian_portuguese',\r\n  'mandarin_chinese',\r\n] as const;\r\n\r\nexport type VoiceId = (typeof ALL_VOICES)[number];\r\nexport type LanguageId = (typeof LANGUAGES)[number];\r\n","/**\r\n * Custom exceptions for LangVoice SDK\r\n */\r\n\r\n/**\r\n * Base exception for LangVoice SDK\r\n */\r\nexport class LangVoiceError extends Error {\r\n  public readonly statusCode?: number;\r\n\r\n  constructor(message: string, statusCode?: number) {\r\n    super(message);\r\n    this.name = 'LangVoiceError';\r\n    this.statusCode = statusCode;\r\n    Object.setPrototypeOf(this, LangVoiceError.prototype);\r\n  }\r\n}\r\n\r\n/**\r\n * Raised when API key is invalid or missing\r\n */\r\nexport class AuthenticationError extends LangVoiceError {\r\n  constructor(message: string = 'Invalid or missing API key') {\r\n    super(message, 401);\r\n    this.name = 'AuthenticationError';\r\n    Object.setPrototypeOf(this, AuthenticationError.prototype);\r\n  }\r\n}\r\n\r\n/**\r\n * Raised when rate limit is exceeded\r\n */\r\nexport class RateLimitError extends LangVoiceError {\r\n  constructor(message: string = 'Rate limit exceeded') {\r\n    super(message, 429);\r\n    this.name = 'RateLimitError';\r\n    Object.setPrototypeOf(this, RateLimitError.prototype);\r\n  }\r\n}\r\n\r\n/**\r\n * Raised when request validation fails\r\n */\r\nexport class ValidationError extends LangVoiceError {\r\n  constructor(message: string) {\r\n    super(message, 400);\r\n    this.name = 'ValidationError';\r\n    Object.setPrototypeOf(this, ValidationError.prototype);\r\n  }\r\n}\r\n\r\n/**\r\n * Raised when API returns an error\r\n */\r\nexport class APIError extends LangVoiceError {\r\n  constructor(message: string, statusCode?: number) {\r\n    super(message, statusCode);\r\n    this.name = 'APIError';\r\n    Object.setPrototypeOf(this, APIError.prototype);\r\n  }\r\n}\r\n\r\n/**\r\n * Check if an error is a LangVoice error\r\n */\r\nexport function isLangVoiceError(error: unknown): error is LangVoiceError {\r\n  return error instanceof LangVoiceError;\r\n}\r\n\r\n/**\r\n * Check if an error is an authentication error\r\n */\r\nexport function isAuthenticationError(error: unknown): error is AuthenticationError {\r\n  return error instanceof AuthenticationError;\r\n}\r\n\r\n/**\r\n * Check if an error is a rate limit error\r\n */\r\nexport function isRateLimitError(error: unknown): error is RateLimitError {\r\n  return error instanceof RateLimitError;\r\n}\r\n","/**\r\n * Main LangVoice API client\r\n */\r\n\r\nimport {\r\n  Voice,\r\n  Language,\r\n  GenerateRequest,\r\n  MultiVoiceRequest,\r\n  GenerateResponse,\r\n  VoicesResponse,\r\n  LanguagesResponse,\r\n  AMERICAN_VOICES,\r\n  BRITISH_VOICES,\r\n  ALL_VOICES,\r\n  LANGUAGES,\r\n} from './models';\r\n\r\nimport {\r\n  AuthenticationError,\r\n  RateLimitError,\r\n  ValidationError,\r\n  APIError,\r\n} from './exceptions';\r\n\r\n// ============================================\r\n// Types\r\n// ============================================\r\n\r\nexport interface LangVoiceClientOptions {\r\n  /** API key for authentication */\r\n  apiKey?: string;\r\n  /** Base URL for the API */\r\n  baseUrl?: string;\r\n  /** Request timeout in milliseconds */\r\n  timeout?: number;\r\n}\r\n\r\nexport interface GenerateOptions {\r\n  /** Text to convert to speech (max 5000 characters) */\r\n  text: string;\r\n  /** Voice ID (e.g., 'heart', 'michael') */\r\n  voice?: string;\r\n  /** Language code (e.g., 'american_english') */\r\n  language?: string;\r\n  /** Speech speed from 0.5 to 2.0 */\r\n  speed?: number;\r\n}\r\n\r\nexport interface MultiVoiceOptions {\r\n  /** Text with [voice] markers */\r\n  text: string;\r\n  /** Language code for all voices */\r\n  language?: string;\r\n  /** Speech speed from 0.5 to 2.0 */\r\n  speed?: number;\r\n}\r\n\r\n// ============================================\r\n// Client\r\n// ============================================\r\n\r\n/**\r\n * LangVoice API client for text-to-speech generation\r\n *\r\n * @example\r\n * ```typescript\r\n * import { LangVoiceClient } from 'langvoice-sdk';\r\n *\r\n * const client = new LangVoiceClient({ apiKey: 'your-api-key' });\r\n *\r\n * const response = await client.generate({\r\n *   text: 'Hello, world!',\r\n *   voice: 'heart',\r\n * });\r\n *\r\n * // Save to file (Node.js)\r\n * import { writeFileSync } from 'fs';\r\n * writeFileSync('output.mp3', response.audioData);\r\n * ```\r\n */\r\nexport class LangVoiceClient {\r\n  private readonly apiKey: string;\r\n  private readonly baseUrl: string;\r\n  private readonly timeout: number;\r\n\r\n  /** Available American voices */\r\n  static readonly AMERICAN_VOICES = AMERICAN_VOICES;\r\n  /** Available British voices */\r\n  static readonly BRITISH_VOICES = BRITISH_VOICES;\r\n  /** All available voices */\r\n  static readonly ALL_VOICES = ALL_VOICES;\r\n  /** Supported languages */\r\n  static readonly LANGUAGES = LANGUAGES;\r\n\r\n  constructor(options: LangVoiceClientOptions = {}) {\r\n    this.apiKey = options.apiKey || this.getEnvApiKey();\r\n\r\n    if (!this.apiKey) {\r\n      throw new AuthenticationError(\r\n        'API key is required. Pass apiKey in options or set LANGVOICE_API_KEY environment variable.'\r\n      );\r\n    }\r\n\r\n    this.baseUrl = options.baseUrl || 'https://www.langvoice.pro/api';\r\n    this.timeout = options.timeout || 60000;\r\n  }\r\n\r\n  /**\r\n   * Get API key from environment variable\r\n   */\r\n  private getEnvApiKey(): string {\r\n    // Node.js environment\r\n    if (typeof process !== 'undefined' && process.env) {\r\n      return process.env.LANGVOICE_API_KEY || '';\r\n    }\r\n    return '';\r\n  }\r\n\r\n  /**\r\n   * Make HTTP request\r\n   */\r\n  private async request<T>(\r\n    method: 'GET' | 'POST',\r\n    endpoint: string,\r\n    body?: Record<string, unknown>\r\n  ): Promise<{ data: T; headers: Headers }> {\r\n    const url = `${this.baseUrl}${endpoint}`;\r\n\r\n    const controller = new AbortController();\r\n    const timeoutId = setTimeout(() => controller.abort(), this.timeout);\r\n\r\n    try {\r\n      const response = await fetch(url, {\r\n        method,\r\n        headers: {\r\n          'X-API-Key': this.apiKey,\r\n          'Content-Type': 'application/json',\r\n        },\r\n        body: body ? JSON.stringify(body) : undefined,\r\n        signal: controller.signal,\r\n      });\r\n\r\n      clearTimeout(timeoutId);\r\n\r\n      await this.handleResponseErrors(response);\r\n\r\n      return {\r\n        data: (await response.json()) as T,\r\n        headers: response.headers,\r\n      };\r\n    } catch (error) {\r\n      clearTimeout(timeoutId);\r\n\r\n      if (error instanceof Error && error.name === 'AbortError') {\r\n        throw new APIError('Request timeout', 408);\r\n      }\r\n\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Make HTTP request for binary data\r\n   */\r\n  private async requestBinary(\r\n    method: 'POST',\r\n    endpoint: string,\r\n    body: object\r\n  ): Promise<{ data: ArrayBuffer; headers: Headers }> {\r\n    const url = `${this.baseUrl}${endpoint}`;\r\n\r\n    const controller = new AbortController();\r\n    const timeoutId = setTimeout(() => controller.abort(), this.timeout);\r\n\r\n    try {\r\n      const response = await fetch(url, {\r\n        method,\r\n        headers: {\r\n          'X-API-Key': this.apiKey,\r\n          'Content-Type': 'application/json',\r\n        },\r\n        body: JSON.stringify(body),\r\n        signal: controller.signal,\r\n      });\r\n\r\n      clearTimeout(timeoutId);\r\n\r\n      await this.handleResponseErrors(response);\r\n\r\n      return {\r\n        data: await response.arrayBuffer(),\r\n        headers: response.headers,\r\n      };\r\n    } catch (error) {\r\n      clearTimeout(timeoutId);\r\n\r\n      if (error instanceof Error && error.name === 'AbortError') {\r\n        throw new APIError('Request timeout', 408);\r\n      }\r\n\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Handle API response errors\r\n   */\r\n  private async handleResponseErrors(response: Response): Promise<void> {\r\n    if (response.ok) return;\r\n\r\n    let errorMessage: string;\r\n\r\n    try {\r\n      const errorData = (await response.json()) as { error?: string };\r\n      errorMessage = errorData.error || `API error: ${response.status}`;\r\n    } catch {\r\n      errorMessage = response.statusText || `API error: ${response.status}`;\r\n    }\r\n\r\n    switch (response.status) {\r\n      case 401:\r\n        throw new AuthenticationError(errorMessage);\r\n      case 429:\r\n        throw new RateLimitError(errorMessage);\r\n      case 400:\r\n        throw new ValidationError(errorMessage);\r\n      default:\r\n        throw new APIError(errorMessage, response.status);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Parse float header value\r\n   */\r\n  private parseFloatHeader(value: string | null): number | undefined {\r\n    if (!value) return undefined;\r\n    const parsed = parseFloat(value.replace('s', ''));\r\n    return isNaN(parsed) ? undefined : parsed;\r\n  }\r\n\r\n  /**\r\n   * Parse int header value\r\n   */\r\n  private parseIntHeader(value: string | null): number | undefined {\r\n    if (!value) return undefined;\r\n    const parsed = parseInt(value, 10);\r\n    return isNaN(parsed) ? undefined : parsed;\r\n  }\r\n\r\n  /**\r\n   * Generate speech from text\r\n   *\r\n   * @param options - Generation options\r\n   * @returns GenerateResponse with audio data and metadata\r\n   *\r\n   * @example\r\n   * ```typescript\r\n   * const response = await client.generate({\r\n   *   text: 'Hello world!',\r\n   *   voice: 'heart',\r\n   *   language: 'american_english',\r\n   *   speed: 1.0,\r\n   * });\r\n   *\r\n   * console.log(`Duration: ${response.duration}s`);\r\n   * ```\r\n   */\r\n  async generate(options: GenerateOptions): Promise<GenerateResponse> {\r\n    const request = new GenerateRequest({\r\n      text: options.text,\r\n      voice: options.voice,\r\n      language: options.language,\r\n      speed: options.speed,\r\n    });\r\n\r\n    const { data, headers } = await this.requestBinary(\r\n      'POST',\r\n      '/tts/generate',\r\n      request.toJSON()\r\n    );\r\n\r\n    return new GenerateResponse({\r\n      audioData: data,\r\n      duration: this.parseFloatHeader(headers.get('X-Audio-Duration')),\r\n      generationTime: this.parseFloatHeader(headers.get('X-Generation-Time')),\r\n      charactersProcessed: this.parseIntHeader(headers.get('X-Characters-Processed')),\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Generate speech with multiple voices\r\n   *\r\n   * @param options - Multi-voice options\r\n   * @returns GenerateResponse with audio data and metadata\r\n   *\r\n   * @example\r\n   * ```typescript\r\n   * const response = await client.generateMultiVoice({\r\n   *   text: '[heart] Hello! [michael] Hi there!',\r\n   *   language: 'american_english',\r\n   * });\r\n   * ```\r\n   */\r\n  async generateMultiVoice(options: MultiVoiceOptions): Promise<GenerateResponse> {\r\n    const request = new MultiVoiceRequest({\r\n      text: options.text,\r\n      language: options.language,\r\n      speed: options.speed,\r\n    });\r\n\r\n    const { data, headers } = await this.requestBinary(\r\n      'POST',\r\n      '/tts/multi-voice-text',\r\n      request.toJSON()\r\n    );\r\n\r\n    return new GenerateResponse({\r\n      audioData: data,\r\n      duration: this.parseFloatHeader(headers.get('X-Audio-Duration')),\r\n      generationTime: this.parseFloatHeader(headers.get('X-Generation-Time')),\r\n      charactersProcessed: this.parseIntHeader(headers.get('X-Characters-Processed')),\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Get all available voices\r\n   *\r\n   * @returns Array of Voice objects\r\n   *\r\n   * @example\r\n   * ```typescript\r\n   * const voices = await client.listVoices();\r\n   * voices.forEach(v => console.log(`${v.id}: ${v.name}`));\r\n   * ```\r\n   */\r\n  async listVoices(): Promise<Voice[]> {\r\n    const { data } = await this.request<{ voices: Voice[] }>('GET', '/tts/voices');\r\n    return new VoicesResponse(data).voices;\r\n  }\r\n\r\n  /**\r\n   * Get all supported languages\r\n   *\r\n   * @returns Array of Language objects\r\n   *\r\n   * @example\r\n   * ```typescript\r\n   * const languages = await client.listLanguages();\r\n   * languages.forEach(l => console.log(`${l.id}: ${l.name}`));\r\n   * ```\r\n   */\r\n  async listLanguages(): Promise<Language[]> {\r\n    const { data } = await this.request<{ languages: Language[] }>('GET', '/tts/languages');\r\n    return new LanguagesResponse(data).languages;\r\n  }\r\n\r\n  /**\r\n   * Simple method to convert text to speech and return audio buffer\r\n   *\r\n   * @param text - Text to convert\r\n   * @param voice - Voice ID\r\n   * @param language - Language code\r\n   * @param speed - Speech speed\r\n   * @returns Audio data as Buffer\r\n   *\r\n   * @example\r\n   * ```typescript\r\n   * const audioBuffer = await client.textToSpeech('Hello!', 'heart');\r\n   * ```\r\n   */\r\n  async textToSpeech(\r\n    text: string,\r\n    voice: string = 'heart',\r\n    language: string = 'american_english',\r\n    speed: number = 1.0\r\n  ): Promise<Buffer> {\r\n    const response = await this.generate({ text, voice, language, speed });\r\n    return response.audioData;\r\n  }\r\n\r\n  /**\r\n   * Get the API key (useful for passing to tools)\r\n   */\r\n  getApiKey(): string {\r\n    return this.apiKey;\r\n  }\r\n}\r\n","/**\r\n * Shared types for LangVoice tools\r\n */\r\n\r\n// ============================================\r\n// Common Types\r\n// ============================================\r\n\r\n/**\r\n * Base result interface for all tool operations\r\n */\r\nexport interface BaseToolResult {\r\n  success: boolean;\r\n  error?: string;\r\n}\r\n\r\n/**\r\n * Result from TTS generation tools\r\n */\r\nexport interface TTSResult extends BaseToolResult {\r\n  audioBase64?: string;\r\n  audioBuffer?: Buffer;\r\n  duration?: number;\r\n  generationTime?: number;\r\n  charactersProcessed?: number;\r\n}\r\n\r\n/**\r\n * Result from list voices tool\r\n */\r\nexport interface VoicesResult extends BaseToolResult {\r\n  voices?: VoiceInfo[];\r\n}\r\n\r\n/**\r\n * Result from list languages tool\r\n */\r\nexport interface LanguagesResult extends BaseToolResult {\r\n  languages?: LanguageInfo[];\r\n}\r\n\r\n/**\r\n * Voice information\r\n */\r\nexport interface VoiceInfo {\r\n  id: string;\r\n  name: string;\r\n  gender?: string;\r\n  language?: string;\r\n  description?: string;\r\n}\r\n\r\n/**\r\n * Language information\r\n */\r\nexport interface LanguageInfo {\r\n  id: string;\r\n  name: string;\r\n  voices?: string[];\r\n}\r\n\r\n// ============================================\r\n// Tool Input Types\r\n// ============================================\r\n\r\n/**\r\n * Input for text-to-speech generation\r\n */\r\nexport interface TTSInput {\r\n  text: string;\r\n  voice?: string;\r\n  language?: string;\r\n  speed?: number;\r\n}\r\n\r\n/**\r\n * Input for multi-voice generation\r\n */\r\nexport interface MultiVoiceInput {\r\n  text: string;\r\n  language?: string;\r\n  speed?: number;\r\n}\r\n\r\n// ============================================\r\n// Function Schema Types\r\n// ============================================\r\n\r\n/**\r\n * JSON Schema property definition\r\n */\r\nexport interface SchemaProperty {\r\n  type: string;\r\n  description?: string;\r\n  enum?: string[];\r\n  default?: unknown;\r\n  minimum?: number;\r\n  maximum?: number;\r\n}\r\n\r\n/**\r\n * Function parameters schema\r\n */\r\nexport interface FunctionParameters {\r\n  type: 'object';\r\n  properties: Record<string, SchemaProperty>;\r\n  required: string[];\r\n  [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Function schema definition\r\n */\r\nexport interface FunctionSchema {\r\n  name: string;\r\n  description: string;\r\n  parameters: FunctionParameters;\r\n}\r\n\r\n/**\r\n * OpenAI tool definition format\r\n */\r\nexport interface OpenAIToolDefinition {\r\n  type: 'function';\r\n  function: FunctionSchema;\r\n}\r\n\r\n/**\r\n * OpenAI tool call format\r\n */\r\nexport interface OpenAIToolCall {\r\n  id: string;\r\n  type: 'function';\r\n  function: {\r\n    name: string;\r\n    arguments: string;\r\n  };\r\n}\r\n\r\n// ============================================\r\n// AutoGen Types\r\n// ============================================\r\n\r\n/**\r\n * AutoGen function definition\r\n */\r\nexport interface AutoGenFunctionDef {\r\n  name: string;\r\n  description: string;\r\n  parameters: FunctionParameters;\r\n}\r\n\r\n/**\r\n * AutoGen tool configuration\r\n */\r\nexport interface AutoGenToolConfig {\r\n  functions: AutoGenFunctionDef[];\r\n}\r\n\r\n/**\r\n * AutoGen function call\r\n */\r\nexport interface AutoGenFunctionCall {\r\n  name: string;\r\n  arguments: Record<string, unknown> | string;\r\n}\r\n\r\n// ============================================\r\n// LangChain Types\r\n// ============================================\r\n\r\n/**\r\n * LangChain tool input schema\r\n */\r\nexport interface LangChainInputSchema {\r\n  type: 'object';\r\n  properties: Record<string, SchemaProperty>;\r\n  required?: string[];\r\n}\r\n\r\n/**\r\n * LangChain tool metadata\r\n */\r\nexport interface LangChainToolMetadata {\r\n  name: string;\r\n  description: string;\r\n  schema?: LangChainInputSchema;\r\n}\r\n\r\n// ============================================\r\n// Constants\r\n// ============================================\r\n\r\n/**\r\n * Tool name constants\r\n */\r\nexport const TOOL_NAMES = {\r\n  TTS: 'langvoice_text_to_speech',\r\n  MULTI_VOICE: 'langvoice_multi_voice_speech',\r\n  LIST_VOICES: 'langvoice_list_voices',\r\n  LIST_LANGUAGES: 'langvoice_list_languages',\r\n} as const;\r\n\r\nexport type ToolName = (typeof TOOL_NAMES)[keyof typeof TOOL_NAMES];\r\n\r\n/**\r\n * Available voices\r\n */\r\nexport const VOICES = {\r\n  AMERICAN: [\r\n    'heart', 'bella', 'nicole', 'sarah', 'nova', 'sky', 'jessica',\r\n    'river', 'michael', 'fenrir', 'eric', 'liam', 'onyx', 'adam',\r\n  ],\r\n  BRITISH: [\r\n    'emma', 'isabella', 'alice', 'lily', 'george', 'fable', 'lewis', 'daniel',\r\n  ],\r\n} as const;\r\n\r\nexport const ALL_VOICES = [...VOICES.AMERICAN, ...VOICES.BRITISH] as const;\r\n\r\n/**\r\n * Supported languages\r\n */\r\nexport const LANGUAGES = [\r\n  'american_english',\r\n  'british_english',\r\n  'spanish',\r\n  'french',\r\n  'hindi',\r\n  'italian',\r\n  'japanese',\r\n  'brazilian_portuguese',\r\n  'mandarin_chinese',\r\n] as const;\r\n\r\nexport type VoiceId = (typeof ALL_VOICES)[number];\r\nexport type LanguageId = (typeof LANGUAGES)[number];\r\n","/**\r\n * Generic/Universal tools for LangVoice TTS\r\n *\r\n * Works with any AI agent framework that supports function calling.\r\n */\r\n\r\nimport { LangVoiceClient } from '../client';\r\nimport {\r\n  TOOL_NAMES,\r\n  ALL_VOICES,\r\n  LANGUAGES,\r\n  type FunctionSchema,\r\n} from './types';\r\n\r\n// ============================================\r\n// Types (Specific to generic-tools for backwards compatibility)\r\n// ============================================\r\n\r\nexport interface ToolResult {\r\n  success: boolean;\r\n  error?: string;\r\n}\r\n\r\nexport interface TTSToolResult extends ToolResult {\r\n  audioBase64?: string;\r\n  duration?: number;\r\n  charactersProcessed?: number;\r\n}\r\n\r\nexport interface VoicesToolResult extends ToolResult {\r\n  voices?: Array<{ id: string; name: string }>;\r\n}\r\n\r\nexport interface LanguagesToolResult extends ToolResult {\r\n  languages?: Array<{ id: string; name: string }>;\r\n}\r\n\r\n// ============================================\r\n// LangVoiceToolkit Class\r\n// ============================================\r\n\r\n/**\r\n * Universal toolkit for using LangVoice with any AI framework\r\n *\r\n * @example\r\n * ```typescript\r\n * import { LangVoiceToolkit } from 'langvoice-sdk/tools';\r\n *\r\n * const toolkit = new LangVoiceToolkit({ apiKey: 'your-langvoice-key' });\r\n *\r\n * // Direct usage\r\n * const result = await toolkit.textToSpeech({ text: 'Hello world!' });\r\n * await toolkit.saveAudio(result, 'output.mp3');\r\n *\r\n * // Handle tool calls from any LLM\r\n * const result = await toolkit.handleToolCall('langvoice_text_to_speech', { text: 'Hello' });\r\n *\r\n * // Get schemas for any framework\r\n * const schemas = toolkit.getFunctionSchemas();\r\n * ```\r\n */\r\nexport class LangVoiceToolkit {\r\n  private readonly client: LangVoiceClient;\r\n\r\n  /** Tool name constants */\r\n  static readonly TOOL_TTS = TOOL_NAMES.TTS;\r\n  static readonly TOOL_MULTI_VOICE = TOOL_NAMES.MULTI_VOICE;\r\n  static readonly TOOL_LIST_VOICES = TOOL_NAMES.LIST_VOICES;\r\n  static readonly TOOL_LIST_LANGUAGES = TOOL_NAMES.LIST_LANGUAGES;\r\n\r\n  constructor(options: { apiKey?: string } = {}) {\r\n    this.client = new LangVoiceClient(options);\r\n  }\r\n\r\n  /**\r\n   * Get the underlying LangVoice client\r\n   */\r\n  getClient(): LangVoiceClient {\r\n    return this.client;\r\n  }\r\n\r\n  // =========================================\r\n  // CORE TOOL FUNCTIONS\r\n  // =========================================\r\n\r\n  /**\r\n   * Convert text to speech\r\n   */\r\n  async textToSpeech(params: {\r\n    text: string;\r\n    voice?: string;\r\n    language?: string;\r\n    speed?: number;\r\n  }): Promise<TTSToolResult> {\r\n    try {\r\n      const response = await this.client.generate({\r\n        text: params.text,\r\n        voice: params.voice || 'heart',\r\n        language: params.language || 'american_english',\r\n        speed: params.speed || 1.0,\r\n      });\r\n\r\n      return {\r\n        success: true,\r\n        audioBase64: response.toBase64(),\r\n        duration: response.duration,\r\n        charactersProcessed: response.charactersProcessed,\r\n      };\r\n    } catch (error) {\r\n      return {\r\n        success: false,\r\n        error: error instanceof Error ? error.message : 'Unknown error',\r\n      };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Generate speech with multiple voices\r\n   */\r\n  async multiVoiceSpeech(params: {\r\n    text: string;\r\n    language?: string;\r\n    speed?: number;\r\n  }): Promise<TTSToolResult> {\r\n    try {\r\n      const response = await this.client.generateMultiVoice({\r\n        text: params.text,\r\n        language: params.language || 'american_english',\r\n        speed: params.speed || 1.0,\r\n      });\r\n\r\n      return {\r\n        success: true,\r\n        audioBase64: response.toBase64(),\r\n        duration: response.duration,\r\n      };\r\n    } catch (error) {\r\n      return {\r\n        success: false,\r\n        error: error instanceof Error ? error.message : 'Unknown error',\r\n      };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get available voices\r\n   */\r\n  async listVoices(): Promise<VoicesToolResult> {\r\n    try {\r\n      const voices = await this.client.listVoices();\r\n      return {\r\n        success: true,\r\n        voices: voices.map((v) => ({ id: v.id, name: v.name })),\r\n      };\r\n    } catch (error) {\r\n      return {\r\n        success: false,\r\n        error: error instanceof Error ? error.message : 'Unknown error',\r\n      };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get supported languages\r\n   */\r\n  async listLanguages(): Promise<LanguagesToolResult> {\r\n    try {\r\n      const languages = await this.client.listLanguages();\r\n      return {\r\n        success: true,\r\n        languages: languages.map((l) => ({ id: l.id, name: l.name })),\r\n      };\r\n    } catch (error) {\r\n      return {\r\n        success: false,\r\n        error: error instanceof Error ? error.message : 'Unknown error',\r\n      };\r\n    }\r\n  }\r\n\r\n  // =========================================\r\n  // TOOL CALL HANDLER\r\n  // =========================================\r\n\r\n  /**\r\n   * Handle a tool call by name\r\n   */\r\n  async handleToolCall(\r\n    toolName: string,\r\n    args: Record<string, unknown>\r\n  ): Promise<ToolResult | TTSToolResult | VoicesToolResult | LanguagesToolResult> {\r\n    switch (toolName) {\r\n      case TOOL_NAMES.TTS:\r\n        return this.textToSpeech({\r\n          text: args.text as string,\r\n          voice: args.voice as string | undefined,\r\n          language: args.language as string | undefined,\r\n          speed: args.speed as number | undefined,\r\n        });\r\n\r\n      case TOOL_NAMES.MULTI_VOICE:\r\n        return this.multiVoiceSpeech({\r\n          text: args.text as string,\r\n          language: args.language as string | undefined,\r\n          speed: args.speed as number | undefined,\r\n        });\r\n\r\n      case TOOL_NAMES.LIST_VOICES:\r\n        return this.listVoices();\r\n\r\n      case TOOL_NAMES.LIST_LANGUAGES:\r\n        return this.listLanguages();\r\n\r\n      default:\r\n        return { success: false, error: `Unknown tool: ${toolName}` };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Handle tool call and return JSON string result\r\n   */\r\n  async handleToolCallJson(\r\n    toolName: string,\r\n    args: Record<string, unknown>\r\n  ): Promise<string> {\r\n    const result = await this.handleToolCall(toolName, args);\r\n    return JSON.stringify(result);\r\n  }\r\n\r\n  // =========================================\r\n  // FUNCTION SCHEMAS\r\n  // =========================================\r\n\r\n  /**\r\n   * Get OpenAI-compatible function schemas\r\n   */\r\n  getFunctionSchemas(): FunctionSchema[] {\r\n    return [\r\n      {\r\n        name: TOOL_NAMES.TTS,\r\n        description: 'Convert text to natural-sounding speech audio using LangVoice TTS API.',\r\n        parameters: {\r\n          type: 'object',\r\n          properties: {\r\n            text: {\r\n              type: 'string',\r\n              description: 'The text to convert to speech. Maximum 5000 characters.',\r\n            },\r\n            voice: {\r\n              type: 'string',\r\n              description: \"Voice ID (e.g., 'heart', 'michael', 'emma').\",\r\n              enum: [...ALL_VOICES],\r\n              default: 'heart',\r\n            },\r\n            language: {\r\n              type: 'string',\r\n              description: 'Language code.',\r\n              enum: [...LANGUAGES],\r\n              default: 'american_english',\r\n            },\r\n            speed: {\r\n              type: 'number',\r\n              description: 'Speech speed from 0.5 (slow) to 2.0 (fast).',\r\n              minimum: 0.5,\r\n              maximum: 2.0,\r\n              default: 1.0,\r\n            },\r\n          },\r\n          required: ['text'],\r\n        },\r\n      },\r\n      {\r\n        name: TOOL_NAMES.MULTI_VOICE,\r\n        description:\r\n          'Generate speech with multiple voices using bracket notation. Use [voice_name] to switch voices.',\r\n        parameters: {\r\n          type: 'object',\r\n          properties: {\r\n            text: {\r\n              type: 'string',\r\n              description: \"Text with voice markers. Example: '[heart] Hello! [michael] Hi there!'\",\r\n            },\r\n            language: {\r\n              type: 'string',\r\n              description: 'Language code for all voices.',\r\n              enum: [...LANGUAGES],\r\n              default: 'american_english',\r\n            },\r\n            speed: {\r\n              type: 'number',\r\n              description: 'Speech speed from 0.5 to 2.0.',\r\n              minimum: 0.5,\r\n              maximum: 2.0,\r\n              default: 1.0,\r\n            },\r\n          },\r\n          required: ['text'],\r\n        },\r\n      },\r\n      {\r\n        name: TOOL_NAMES.LIST_VOICES,\r\n        description: 'Get a list of all available voices for text-to-speech generation.',\r\n        parameters: {\r\n          type: 'object',\r\n          properties: {},\r\n          required: [],\r\n        },\r\n      },\r\n      {\r\n        name: TOOL_NAMES.LIST_LANGUAGES,\r\n        description: 'Get a list of all supported languages for text-to-speech generation.',\r\n        parameters: {\r\n          type: 'object',\r\n          properties: {},\r\n          required: [],\r\n        },\r\n      },\r\n    ];\r\n  }\r\n\r\n  /**\r\n   * Get tools in OpenAI function calling format\r\n   */\r\n  getOpenAITools(): Array<{ type: 'function'; function: FunctionSchema }> {\r\n    return this.getFunctionSchemas().map((schema) => ({\r\n      type: 'function' as const,\r\n      function: schema,\r\n    }));\r\n  }\r\n\r\n  // =========================================\r\n  // UTILITY METHODS\r\n  // =========================================\r\n\r\n  /**\r\n   * Save audio from result to file (Node.js only)\r\n   */\r\n  async saveAudio(result: TTSToolResult, outputPath: string): Promise<boolean> {\r\n    if (!result.success || !result.audioBase64) {\r\n      return false;\r\n    }\r\n\r\n    try {\r\n      const fs = await import('fs');\r\n      const audioBuffer = Buffer.from(result.audioBase64, 'base64');\r\n      fs.writeFileSync(outputPath, audioBuffer);\r\n      return true;\r\n    } catch {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get audio buffer from result\r\n   */\r\n  getAudioBuffer(result: TTSToolResult): Buffer | null {\r\n    if (!result.success || !result.audioBase64) {\r\n      return null;\r\n    }\r\n    return Buffer.from(result.audioBase64, 'base64');\r\n  }\r\n\r\n  /**\r\n   * Get audio as Uint8Array (for browser compatibility)\r\n   */\r\n  getAudioUint8Array(result: TTSToolResult): Uint8Array | null {\r\n    const buffer = this.getAudioBuffer(result);\r\n    return buffer ? new Uint8Array(buffer) : null;\r\n  }\r\n}\r\n\r\n/**\r\n * Create a LangVoice toolkit instance\r\n */\r\nexport function createLangVoiceToolkit(apiKey?: string): LangVoiceToolkit {\r\n  return new LangVoiceToolkit({ apiKey });\r\n}\r\n"]}