Module: RubyLLM::Providers::XAI::Speech

Included in:
ChatCompletions, Responses
Defined in:
lib/ruby_llm/providers/xai/speech.rb

Overview

Speech dialect for the xAI Voice API. The /v1/tts endpoint is model-less: it takes text, voice_id, and a required language (defaulted to auto-detection) and returns raw audio bytes.

Class Method Summary collapse

Class Method Details

.parse_speech_response(response, model:, voice:, format:) ⇒ Object



26
27
28
29
30
31
32
33
# File 'lib/ruby_llm/providers/xai/speech.rb', line 26

def parse_speech_response(response, model:, voice:, format:)
  RubyLLM::Speech.new(
    data: response.body,
    model: model,
    voice: voice || 'eve',
    format: (format || 'mp3').to_s
  )
end

.render_speech_payload(input, model:, voice:, format:, provider_options: {}) ⇒ Object

rubocop:disable Lint/UnusedMethodArgument



16
17
18
19
20
21
22
23
24
# File 'lib/ruby_llm/providers/xai/speech.rb', line 16

def render_speech_payload(input, model:, voice:, format:, provider_options: {}) # rubocop:disable Lint/UnusedMethodArgument
  payload = {
    text: input,
    voice_id: voice,
    language: 'auto'
  }.compact
  payload[:output_format] = { codec: format.to_s } if format
  Support::Utils.deep_merge(payload, provider_options)
end

.speech_url(model:) ⇒ Object

rubocop:disable Lint/UnusedMethodArgument



12
13
14
# File 'lib/ruby_llm/providers/xai/speech.rb', line 12

def speech_url(model:) # rubocop:disable Lint/UnusedMethodArgument
  'tts'
end

.stream_speech(payload, model:, voice:, format:) ⇒ Object



35
36
37
38
39
40
41
# File 'lib/ruby_llm/providers/xai/speech.rb', line 35

def stream_speech(payload, model:, voice:, format:, &)
  if payload[:with_timestamps] || payload['with_timestamps']
    raise ArgumentError, 'xAI streaming speech does not accept with_timestamps'
  end

  stream_speech_response(speech_url(model:), payload, model:, voice:, format:, &)
end