Class: SmartPrompt::SiliconFlowAdapter

Overview

Adapter for 硅基流动 (SiliconFlow / SiliconCloud) — one adapter owns the whole provider: every category shares the base URL api.siliconflow.cn/v1 and Bearer auth.

Per-modality behavior lives in capability modules under adapters/siliconflow/ (Text / Embed / Image / Video / Voice / Rerank); cross-provider plumbing (HTTP, multimodal normalization, chat shaping, image saving) comes from the shared concerns. This class wires them together + holds config/credentials.

Provider-specific quirks (all vs docs.siliconflow.cn/cn/api-reference):

chat/vision — POST {base}/chat/completions (reasoning_content, no remap)
embeddings  — POST {base}/embeddings        (dimensions only for Qwen3-Embedding)
rerank      — POST {base}/rerank            (results[].relevance_score)
image/edit  — POST {base}/images/generations (images[].url; image_size/batch_size/guidance_scale)
video       — POST {base}/video/submit -> POST {base}/video/status (async; results.videos[].url)
tts         — POST {base}/audio/speech       (binary audio response)
asr         — POST {base}/audio/transcriptions (multipart, field "file")
voice       — /uploads/audio/voice, /audio/voice/list, /audio/voice/deletions

Constant Summary collapse

DEFAULT_BASE_URL =
"https://api.siliconflow.cn/v1".freeze

Constants included from SmartPrompt::SiliconFlow::Video

SmartPrompt::SiliconFlow::Video::DEFAULT_VIDEO_SIZE, SmartPrompt::SiliconFlow::Video::VALID_VIDEO_SIZES

Constants included from SmartPrompt::SiliconFlow::Image

SmartPrompt::SiliconFlow::Image::DEFAULT_IMAGE_SIZE

Constants included from SmartPrompt::SiliconFlow::Text

SmartPrompt::SiliconFlow::Text::CHAT_OPTIONAL_KEYS

Constants included from MultimodalMessages

MultimodalMessages::SUPPORTED_IMAGE_FORMATS

Instance Attribute Summary

Attributes inherited from LLMAdapter

#last_response

Instance Method Summary collapse

Methods included from SmartPrompt::SiliconFlow::Rerank

#rerank

Methods included from SmartPrompt::SiliconFlow::Voice

#delete_voice, #list_voices, #synthesize_speech, #synthesize_to_file, #transcribe_audio, #upload_voice

Methods included from SmartPrompt::SiliconFlow::Video

#check_video_status, #download_video, #generate_video, #wait_for_video_completion

Methods included from SmartPrompt::SiliconFlow::Image

#edit_image, #generate_image

Methods included from SmartPrompt::SiliconFlow::Embed

#embeddings

Methods included from SmartPrompt::SiliconFlow::Text

#send_request

Methods included from HTTPClient

#http_get_json, #http_post_binary, #http_post_json, #http_post_multipart, #stream_chat

Methods included from MultimodalMessages

#normalize_content_item, #normalize_image_url, #normalize_input_image, #normalize_media_part, #normalize_media_url, #process_multimodal_messages, #stringify_hash

Methods included from OpenAIChatShaping

#build_completion_response, #build_stream_chunk, #extra_top_level_fields, #reasoning_field_name

Methods included from ImagePersistence

#save_image, #save_single_image

Methods inherited from LLMAdapter

#send_request

Constructor Details

#initialize(config) ⇒ SiliconFlowAdapter

Returns a new instance of SiliconFlowAdapter.



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/smart_prompt/siliconflow_adapter.rb', line 62

def initialize(config)
  super
  SmartPrompt.logger.info "Start create the SmartPrompt SiliconFlowAdapter."

  api_key = @config["api_key"]
  if api_key.is_a?(String) && api_key.start_with?("ENV[") && api_key.end_with?("]")
    api_key = eval(api_key)
  end
  # Tolerate a missing key at construction (e.g. when the ENV var isn't set yet)
  # and let the first request fail with a clear auth error.
  SmartPrompt.logger.warn "SiliconFlow api_key is empty — API calls will fail until it is set." if api_key.nil? || api_key.to_s.strip.empty?

  @api_key  = api_key
  @base_url = (@config["url"] || DEFAULT_BASE_URL).to_s.chomp("/")
  # Optional per-method URL overrides (default to the standard paths off @base_url).
  @image_url         = (@config["image_url"]         || "#{@base_url}/images/generations").to_s
  @video_submit_url  = (@config["video_submit_url"]  || "#{@base_url}/video/submit").to_s
  @video_status_url  = (@config["video_status_url"]  || "#{@base_url}/video/status").to_s
  @speech_url        = (@config["speech_url"]        || "#{@base_url}/audio/speech").to_s
  @transcription_url = (@config["transcription_url"] || "#{@base_url}/audio/transcriptions").to_s
  @voice_upload_url  = (@config["voice_upload_url"]  || "#{@base_url}/uploads/audio/voice").to_s
  @voice_list_url    = (@config["voice_list_url"]    || "#{@base_url}/audio/voice/list").to_s
  @voice_delete_url  = (@config["voice_delete_url"]  || "#{@base_url}/audio/voice/deletions").to_s
  SmartPrompt.logger.info "SiliconFlow base_url=#{@base_url}"
rescue => e
  SmartPrompt.logger.error "Failed to initialize SiliconFlow client: #{e.message}"
  raise e.is_a?(SmartPrompt::Error) ? e : LLMAPIError, "Invalid SiliconFlow configuration: #{e.message}"
end

Instance Method Details

#default_image_prefixObject



58
59
60
# File 'lib/smart_prompt/siliconflow_adapter.rb', line 58

def default_image_prefix
  "siliconflow_image"
end

#provider_labelObject

—- hooks for shared concerns ——————————————-



54
55
56
# File 'lib/smart_prompt/siliconflow_adapter.rb', line 54

def provider_label
  "SiliconFlow"
end