{"version":3,"sources":["../../src/models.ts","../../src/exceptions.ts","../../src/client.ts","../../src/tools/types.ts","../../src/tools/openai-tools.ts"],"names":["ALL_VOICES","LANGUAGES"],"mappings":"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","file":"openai-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 * OpenAI function calling tools for LangVoice\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 OpenAIToolDefinition as BaseOpenAIToolDefinition,\r\n  type OpenAIToolCall as BaseOpenAIToolCall,\r\n} from './types';\r\n\r\n// ============================================\r\n// Types (Re-export for backwards compatibility)\r\n// ============================================\r\n\r\nexport type OpenAIToolDefinition = BaseOpenAIToolDefinition;\r\nexport type OpenAIToolCall = BaseOpenAIToolCall;\r\n\r\nexport interface ToolCallResult {\r\n  success: boolean;\r\n  audioBase64?: string;\r\n  duration?: number;\r\n  charactersProcessed?: number;\r\n  voices?: Array<{ id: string; name: string }>;\r\n  languages?: Array<{ id: string; name: string }>;\r\n  error?: string;\r\n}\r\n\r\n// ============================================\r\n// Tool Definitions\r\n// ============================================\r\n\r\nexport const LANGVOICE_TTS_TOOL: OpenAIToolDefinition = {\r\n  type: 'function',\r\n  function: {\r\n    name: TOOL_NAMES.TTS,\r\n    description:\r\n      'Convert text to natural-sounding speech audio using LangVoice TTS API. Returns base64-encoded MP3 audio.',\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 to use for speech generation.',\r\n          enum: [...ALL_VOICES],\r\n          default: 'heart',\r\n        },\r\n        language: {\r\n          type: 'string',\r\n          description: 'Language code for the speech.',\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). Default is 1.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\r\nexport const LANGVOICE_MULTI_VOICE_TOOL: OpenAIToolDefinition = {\r\n  type: 'function',\r\n  function: {\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 in the text.',\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\r\nexport const LANGVOICE_LIST_VOICES_TOOL: OpenAIToolDefinition = {\r\n  type: 'function',\r\n  function: {\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\r\nexport const LANGVOICE_LIST_LANGUAGES_TOOL: OpenAIToolDefinition = {\r\n  type: 'function',\r\n  function: {\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// Functions\r\n// ============================================\r\n\r\n/**\r\n * Get all LangVoice tools formatted for OpenAI function calling\r\n */\r\nexport function getOpenAITools(): OpenAIToolDefinition[] {\r\n  return [\r\n    LANGVOICE_TTS_TOOL,\r\n    LANGVOICE_MULTI_VOICE_TOOL,\r\n    LANGVOICE_LIST_VOICES_TOOL,\r\n    LANGVOICE_LIST_LANGUAGES_TOOL,\r\n  ];\r\n}\r\n\r\n/**\r\n * Handle an OpenAI tool call for LangVoice functions\r\n */\r\nexport async function handleOpenAIToolCall(\r\n  toolName: string,\r\n  args: Record<string, unknown>,\r\n  apiKey?: string\r\n): Promise<string> {\r\n  const client = new LangVoiceClient({ apiKey });\r\n\r\n  try {\r\n    let result: ToolCallResult;\r\n\r\n    switch (toolName) {\r\n      case TOOL_NAMES.TTS: {\r\n        const response = await client.generate({\r\n          text: args.text as string,\r\n          voice: (args.voice as string) || 'heart',\r\n          language: (args.language as string) || 'american_english',\r\n          speed: (args.speed as number) || 1.0,\r\n        });\r\n        result = {\r\n          success: true,\r\n          audioBase64: response.toBase64(),\r\n          duration: response.duration,\r\n          charactersProcessed: response.charactersProcessed,\r\n        };\r\n        break;\r\n      }\r\n\r\n      case TOOL_NAMES.MULTI_VOICE: {\r\n        const response = await client.generateMultiVoice({\r\n          text: args.text as string,\r\n          language: (args.language as string) || 'american_english',\r\n          speed: (args.speed as number) || 1.0,\r\n        });\r\n        result = {\r\n          success: true,\r\n          audioBase64: response.toBase64(),\r\n          duration: response.duration,\r\n        };\r\n        break;\r\n      }\r\n\r\n      case TOOL_NAMES.LIST_VOICES: {\r\n        const voices = await client.listVoices();\r\n        result = {\r\n          success: true,\r\n          voices: voices.map((v) => ({ id: v.id, name: v.name })),\r\n        };\r\n        break;\r\n      }\r\n\r\n      case TOOL_NAMES.LIST_LANGUAGES: {\r\n        const languages = await client.listLanguages();\r\n        result = {\r\n          success: true,\r\n          languages: languages.map((l) => ({ id: l.id, name: l.name })),\r\n        };\r\n        break;\r\n      }\r\n\r\n      default:\r\n        result = { success: false, error: `Unknown tool: ${toolName}` };\r\n    }\r\n\r\n    return JSON.stringify(result);\r\n  } catch (error) {\r\n    return JSON.stringify({\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// LangVoiceOpenAITools Class\r\n// ============================================\r\n\r\n/**\r\n * Helper class for integrating LangVoice with OpenAI function calling\r\n *\r\n * @example\r\n * ```typescript\r\n * import OpenAI from 'openai';\r\n * import { LangVoiceOpenAITools } from 'langvoice-sdk/tools';\r\n *\r\n * const openai = new OpenAI();\r\n * const langvoice = new LangVoiceOpenAITools({ apiKey: 'your-langvoice-key' });\r\n *\r\n * const response = await openai.chat.completions.create({\r\n *   model: 'gpt-4',\r\n *   messages: [{ role: 'user', content: 'Generate speech saying hello' }],\r\n *   tools: langvoice.getTools(),\r\n * });\r\n *\r\n * if (response.choices[0].message.tool_calls) {\r\n *   for (const toolCall of response.choices[0].message.tool_calls) {\r\n *     const result = await langvoice.handleCall(toolCall);\r\n *     console.log(result);\r\n *   }\r\n * }\r\n * ```\r\n */\r\nexport class LangVoiceOpenAITools {\r\n  private readonly client: LangVoiceClient;\r\n\r\n  constructor(options: { apiKey?: string } = {}) {\r\n    this.client = new LangVoiceClient(options);\r\n  }\r\n\r\n  /**\r\n   * Get tool definitions for OpenAI\r\n   */\r\n  getTools(): OpenAIToolDefinition[] {\r\n    return getOpenAITools();\r\n  }\r\n\r\n  /**\r\n   * Handle an OpenAI tool call object\r\n   */\r\n  async handleCall(toolCall: OpenAIToolCall): Promise<ToolCallResult> {\r\n    const args = JSON.parse(toolCall.function.arguments);\r\n    const resultJson = await handleOpenAIToolCall(\r\n      toolCall.function.name,\r\n      args,\r\n      this.client.getApiKey()\r\n    );\r\n    return JSON.parse(resultJson);\r\n  }\r\n\r\n  /**\r\n   * Save audio from a tool call result to a file (Node.js only)\r\n   */\r\n  async saveAudioFromResult(\r\n    result: ToolCallResult,\r\n    outputPath: string\r\n  ): Promise<boolean> {\r\n    if (!result.success || !result.audioBase64) {\r\n      return false;\r\n    }\r\n\r\n    try {\r\n      // Dynamic import for Node.js fs module\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: ToolCallResult): 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"]}