mirror of
https://github.com/discourse/discourse-ai.git
synced 2025-07-05 14:02:13 +00:00
* DEV: use a proper object for tool definition This moves away from using a loose hash to define tools, which is error prone. Instead given a proper object we will also be able to coerce the return values to match tool definition correctly * fix xml tools * fix anthropic tools * fix specs... a few more to go * specs are passing * FIX: coerce values for XML tool calls * Update spec/lib/completions/tool_definition_spec.rb Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
110 lines
3.7 KiB
Ruby
110 lines
3.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require_relative "dialect_context"
|
|
|
|
RSpec.describe DiscourseAi::Completions::Dialects::Ollama do
|
|
fab!(:model) { Fabricate(:ollama_model) }
|
|
let(:context) { DialectContext.new(described_class, model) }
|
|
let(:dialect_class) { DiscourseAi::Completions::Dialects::Dialect.dialect_for(model) }
|
|
|
|
describe "#translate" do
|
|
context "when native tool support is enabled" do
|
|
it "translates a prompt written in our generic format to the Ollama format" do
|
|
ollama_version = [
|
|
{ role: "system", content: context.system_insts },
|
|
{ role: "user", content: context.simple_user_input },
|
|
]
|
|
|
|
translated = context.system_user_scenario
|
|
|
|
expect(translated).to eq(ollama_version)
|
|
end
|
|
end
|
|
|
|
context "when native tool support is disabled - XML tools" do
|
|
it "includes the instructions in the system message" do
|
|
allow(model).to receive(:lookup_custom_param).with("enable_native_tool").and_return(false)
|
|
|
|
DiscourseAi::Completions::Dialects::XmlTools
|
|
.any_instance
|
|
.stubs(:instructions)
|
|
.returns("Instructions")
|
|
|
|
ollama_version = [
|
|
{ role: "system", content: "#{context.system_insts}\n\nInstructions" },
|
|
{ role: "user", content: context.simple_user_input },
|
|
]
|
|
|
|
translated = context.system_user_scenario
|
|
|
|
expect(translated).to eq(ollama_version)
|
|
end
|
|
end
|
|
|
|
it "trims content if it's getting too long" do
|
|
model.max_prompt_tokens = 5000
|
|
translated = context.long_user_input_scenario
|
|
|
|
expect(translated.last[:role]).to eq("user")
|
|
expect(translated.last[:content].length).to be < context.long_message_text.length
|
|
end
|
|
end
|
|
|
|
describe "#max_prompt_tokens" do
|
|
it "returns the max_prompt_tokens from the llm_model" do
|
|
model.max_prompt_tokens = 10_000
|
|
expect(context.dialect(nil).max_prompt_tokens).to eq(10_000)
|
|
end
|
|
end
|
|
|
|
describe "#tools" do
|
|
context "when native tools are enabled" do
|
|
it "returns the translated tools from the OllamaTools class" do
|
|
model.update!(provider_params: { enable_native_tool: true })
|
|
|
|
tool = { name: "noop", description: "do nothing" }
|
|
messages = [
|
|
{ type: :user, content: "echo away" },
|
|
{ type: :tool_call, content: "{}", name: "noop" },
|
|
{ type: :tool, content: "{}", name: "noop" },
|
|
]
|
|
prompt = DiscourseAi::Completions::Prompt.new("a bot", tools: [tool], messages: messages)
|
|
dialect = dialect_class.new(prompt, model)
|
|
|
|
expected = [
|
|
{ role: "system", content: "a bot" },
|
|
{ role: "user", content: "echo away" },
|
|
{
|
|
role: "assistant",
|
|
content: nil,
|
|
tool_calls: [{ type: "function", function: { name: "noop" } }],
|
|
},
|
|
{ role: "tool", content: "{}", name: "noop" },
|
|
]
|
|
expect(dialect.translate).to eq(expected)
|
|
end
|
|
end
|
|
|
|
context "when native tools are disabled" do
|
|
it "returns the translated tools from the XmlTools class" do
|
|
model.update!(provider_params: { enable_native_tool: false })
|
|
|
|
tool = { name: "noop", description: "do nothing" }
|
|
messages = [
|
|
{ type: :user, content: "echo away" },
|
|
{ type: :tool_call, content: "{}", name: "noop" },
|
|
{ type: :tool, content: "{}", name: "noop" },
|
|
]
|
|
prompt = DiscourseAi::Completions::Prompt.new("a bot", tools: [tool], messages: messages)
|
|
dialect = dialect_class.new(prompt, model)
|
|
|
|
expected = %w[system user assistant user]
|
|
roles = dialect.translate.map { |x| x[:role] }
|
|
|
|
# notice, no tool role
|
|
expect(roles).to eq(expected)
|
|
end
|
|
end
|
|
end
|
|
end
|