mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-07-19 21:29:38 +02:00
60 lines
1.5 KiB
Ruby
60 lines
1.5 KiB
Ruby
|
class Provider::Openai::ChatParser
|
||
|
Error = Class.new(StandardError)
|
||
|
|
||
|
def initialize(object)
|
||
|
@object = object
|
||
|
end
|
||
|
|
||
|
def parsed
|
||
|
ChatResponse.new(
|
||
|
id: response_id,
|
||
|
model: response_model,
|
||
|
messages: messages,
|
||
|
function_requests: function_requests
|
||
|
)
|
||
|
end
|
||
|
|
||
|
private
|
||
|
attr_reader :object
|
||
|
|
||
|
ChatResponse = Provider::LlmConcept::ChatResponse
|
||
|
ChatMessage = Provider::LlmConcept::ChatMessage
|
||
|
ChatFunctionRequest = Provider::LlmConcept::ChatFunctionRequest
|
||
|
|
||
|
def response_id
|
||
|
object.dig("id")
|
||
|
end
|
||
|
|
||
|
def response_model
|
||
|
object.dig("model")
|
||
|
end
|
||
|
|
||
|
def messages
|
||
|
message_items = object.dig("output").filter { |item| item.dig("type") == "message" }
|
||
|
|
||
|
message_items.map do |message_item|
|
||
|
ChatMessage.new(
|
||
|
id: message_item.dig("id"),
|
||
|
output_text: message_item.dig("content").map do |content|
|
||
|
text = content.dig("text")
|
||
|
refusal = content.dig("refusal")
|
||
|
text || refusal
|
||
|
end.flatten.join("\n")
|
||
|
)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def function_requests
|
||
|
function_items = object.dig("output").filter { |item| item.dig("type") == "function_call" }
|
||
|
|
||
|
function_items.map do |function_item|
|
||
|
ChatFunctionRequest.new(
|
||
|
id: function_item.dig("id"),
|
||
|
call_id: function_item.dig("call_id"),
|
||
|
function_name: function_item.dig("name"),
|
||
|
function_args: function_item.dig("arguments")
|
||
|
)
|
||
|
end
|
||
|
end
|
||
|
end
|