mirror of
https://github.com/discourse/discourse-ai.git
synced 2025-07-05 22:12:12 +00:00
OpenAI ship a new API for completions called "Responses API" Certain models (o3-pro) require this API. Additionally certain features are only made available to the new API. This allow enabling it per LLM. see: https://platform.openai.com/docs/api-reference/responses
85 lines
2.2 KiB
Ruby
85 lines
2.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module DiscourseAi
|
|
module Completions
|
|
module Dialects
|
|
class OpenAiTools
|
|
def initialize(tools, responses_api: false)
|
|
@responses_api = responses_api
|
|
@raw_tools = tools
|
|
end
|
|
|
|
def translated_tools
|
|
if @responses_api
|
|
raw_tools.map do |tool|
|
|
{
|
|
type: "function",
|
|
name: tool.name,
|
|
description: tool.description,
|
|
parameters: tool.parameters_json_schema,
|
|
}
|
|
end
|
|
else
|
|
raw_tools.map do |tool|
|
|
{
|
|
type: "function",
|
|
function: {
|
|
name: tool.name,
|
|
description: tool.description,
|
|
parameters: tool.parameters_json_schema,
|
|
},
|
|
}
|
|
end
|
|
end
|
|
end
|
|
|
|
def instructions
|
|
"" # Noop. Tools are listed separate.
|
|
end
|
|
|
|
def from_raw_tool_call(raw_message)
|
|
call_details = JSON.parse(raw_message[:content], symbolize_names: true)
|
|
call_details[:arguments] = call_details[:arguments].to_json
|
|
call_details[:name] = raw_message[:name]
|
|
|
|
if @responses_api
|
|
{
|
|
type: "function_call",
|
|
call_id: raw_message[:id],
|
|
name: call_details[:name],
|
|
arguments: call_details[:arguments],
|
|
}
|
|
else
|
|
{
|
|
role: "assistant",
|
|
content: nil,
|
|
tool_calls: [{ type: "function", function: call_details, id: raw_message[:id] }],
|
|
}
|
|
end
|
|
end
|
|
|
|
def from_raw_tool(raw_message)
|
|
if @responses_api
|
|
{
|
|
type: "function_call_output",
|
|
call_id: raw_message[:id],
|
|
output: raw_message[:content],
|
|
}
|
|
else
|
|
{
|
|
role: "tool",
|
|
tool_call_id: raw_message[:id],
|
|
content: raw_message[:content],
|
|
name: raw_message[:name],
|
|
}
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
attr_reader :raw_tools
|
|
end
|
|
end
|
|
end
|
|
end
|