class Lammy::Claude
Use the Claude API’s Ruby library
def chat(user_message, system_message = nil, stream = nil)
def chat(user_message, system_message = nil, stream = nil) response = client.messages( parameters: { system: system_message, model: settings[:model] || Lammy.configuration.model, max_tokens: settings[:max_tokens] || 4096, stream: stream ? ->(chunk) { stream.call(stream_content(chunk)) } : nil, messages: user_message.is_a?(Array) ? user_message : [vision(L.user(user_message))] }.compact ) stream || response.dig('content', 0, 'text') end
def client
def client return settings[:client] if settings[:client] return Lammy.configuration.client if Lammy.configuration.client @client ||= ::Anthropic::Client.new( access_token: ENV.fetch('ANTHROPIC_API_KEY') ) end
def initialize(settings)
def initialize(settings) @settings = settings end
def stream_content(chunk)
def stream_content(chunk) chunk.dig('delta', 'text') end
def vision(message)
def vision(message) image = message[:_image] base = message.except(:_image) return base unless image messages = [ { 'type' => 'image', 'source' => { 'type' => 'base64', 'media_type' => 'image/jpeg', 'data' => Base64.strict_encode64(image) } }, { 'type' => 'text', 'text' => message[:content] } ] base.merge(content: messages) end