discourse-ai/spec/lib/completions/dialects/ollama_tools_spec.rb

113 lines
3.4 KiB
Ruby

# frozen_string_literal: true
require_relative "dialect_context"
RSpec.describe DiscourseAi::Completions::Dialects::OllamaTools do
describe "#translated_tools" do
it "translates a tool from our generic format to the Ollama format" do
tools = [
{
name: "github_file_content",
description: "Retrieves the content of specified GitHub files",
parameters: [
{
name: "repo_name",
description: "The name of the GitHub repository (e.g., 'discourse/discourse')",
type: "string",
required: true,
},
{
name: "file_paths",
description: "The paths of the files to retrieve within the repository",
type: "array",
item_type: "string",
required: true,
},
{
name: "branch",
description: "The branch or commit SHA to retrieve the files from (default: 'main')",
type: "string",
required: false,
},
],
},
]
ollama_tools = described_class.new(tools)
translated_tools = ollama_tools.translated_tools
expect(translated_tools).to eq(
[
{
type: "function",
function: {
name: "github_file_content",
description: "Retrieves the content of specified GitHub files",
parameters: {
type: "object",
properties: {
"repo_name" => {
description: "The name of the GitHub repository (e.g., 'discourse/discourse')",
type: "string",
},
"file_paths" => {
description: "The paths of the files to retrieve within the repository",
type: "array",
},
"branch" => {
description:
"The branch or commit SHA to retrieve the files from (default: 'main')",
type: "string",
},
},
required: %w[repo_name file_paths],
},
},
},
],
)
end
end
describe "#from_raw_tool_call" do
it "converts a raw tool call to the Ollama tool format" do
raw_message = {
content: '{"repo_name":"discourse/discourse","file_paths":["README.md"],"branch":"main"}',
}
ollama_tools = described_class.new([])
tool_call = ollama_tools.from_raw_tool_call(raw_message)
expect(tool_call).to eq(
{
role: "assistant",
content: nil,
tool_calls: [
{
type: "function",
function: {
repo_name: "discourse/discourse",
file_paths: ["README.md"],
branch: "main",
name: nil,
},
},
],
},
)
end
end
describe "#from_raw_tool" do
it "converts a raw tool to the Ollama tool format" do
raw_message = { content: "Hello, world!", name: "github_file_content" }
ollama_tools = described_class.new([])
tool = ollama_tools.from_raw_tool(raw_message)
expect(tool).to eq({ role: "tool", content: "Hello, world!", name: "github_file_content" })
end
end
end