mirror of
https://github.com/ollama/ollama.git
synced 2026-01-29 07:12:03 +03:00
* preserve tool definition and call JSON ordering This is another iteration of <https://github.com/ollama/ollama/pull/12518>, but this time we've simplified things by relaxing the competing requirements of being compatible AND order-preserving with templates (vs. renderers). We maintain backwards compatibility at the cost of not guaranteeing order for templates. We plan on moving more and more models to renderers, which have been updated to use these new data types, and additionally we could add an opt-in way of templates getting an order-preserved list (e.g., via sibling template vars) * orderedmap_test: remove testify
184 lines
5.5 KiB
Go
184 lines
5.5 KiB
Go
package renderers
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/google/go-cmp/cmp"
|
|
|
|
"github.com/ollama/ollama/api"
|
|
)
|
|
|
|
func TestOlmo3ThinkRenderer(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
variant Olmo3ThinkVariant
|
|
msgs []api.Message
|
|
tools []api.Tool
|
|
expected string
|
|
}{
|
|
{
|
|
name: "7b_basic_without_system",
|
|
variant: Olmo31Think,
|
|
msgs: []api.Message{
|
|
{Role: "user", Content: "Hello!"},
|
|
},
|
|
expected: "<|im_start|>system\n" +
|
|
"You are Olmo, a helpful AI assistant built by Ai2. Your date cutoff is December 2024, and your model weights are available at https://huggingface.co/allenai.<|im_end|>\n" +
|
|
"<|im_start|>user\n" +
|
|
"Hello!<|im_end|>\n" +
|
|
"<|im_start|>assistant\n" +
|
|
"<think>",
|
|
},
|
|
{
|
|
name: "7b_with_custom_system",
|
|
variant: Olmo31Think,
|
|
msgs: []api.Message{
|
|
{Role: "system", Content: "You are a helpful assistant."},
|
|
{Role: "user", Content: "Hello!"},
|
|
},
|
|
expected: "<|im_start|>system\n" +
|
|
"You are a helpful assistant. You do not currently have access to any functions. <functions></functions><|im_end|>\n" +
|
|
"<|im_start|>user\n" +
|
|
"Hello!<|im_end|>\n" +
|
|
"<|im_start|>assistant\n" +
|
|
"<think>",
|
|
},
|
|
{
|
|
name: "7b_tools_ignored",
|
|
variant: Olmo31Think,
|
|
msgs: []api.Message{
|
|
{Role: "user", Content: "What is the weather?"},
|
|
},
|
|
tools: []api.Tool{
|
|
{
|
|
Type: "function",
|
|
Function: api.ToolFunction{
|
|
Name: "get_weather",
|
|
Description: "Get the current weather",
|
|
},
|
|
},
|
|
},
|
|
expected: "<|im_start|>system\n" +
|
|
"You are Olmo, a helpful AI assistant built by Ai2. Your date cutoff is December 2024, and your model weights are available at https://huggingface.co/allenai.<|im_end|>\n" +
|
|
"<|im_start|>user\n" +
|
|
"What is the weather?<|im_end|>\n" +
|
|
"<|im_start|>assistant\n" +
|
|
"<think>",
|
|
},
|
|
{
|
|
name: "7b_tool_calls_and_tool_messages_ignored",
|
|
variant: Olmo31Think,
|
|
msgs: []api.Message{
|
|
{Role: "user", Content: "What is the weather in SF?"},
|
|
{
|
|
Role: "assistant",
|
|
Content: "Let me check the weather.",
|
|
ToolCalls: []api.ToolCall{
|
|
{
|
|
ID: "call_1",
|
|
Function: api.ToolCallFunction{
|
|
Name: "get_weather",
|
|
Arguments: testArgs(map[string]any{"location": "San Francisco"}),
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{Role: "tool", Content: `{"temperature": 68}`},
|
|
},
|
|
expected: "<|im_start|>system\n" +
|
|
"You are Olmo, a helpful AI assistant built by Ai2. Your date cutoff is December 2024, and your model weights are available at https://huggingface.co/allenai.<|im_end|>\n" +
|
|
"<|im_start|>user\n" +
|
|
"What is the weather in SF?<|im_end|>\n" +
|
|
"<|im_start|>assistant\n" +
|
|
"Let me check the weather.<|im_end|>\n" +
|
|
"<|im_start|>assistant\n" +
|
|
"<think>",
|
|
},
|
|
{
|
|
name: "7b_multi_turn_conversation",
|
|
variant: Olmo31Think,
|
|
msgs: []api.Message{
|
|
{Role: "user", Content: "Hello"},
|
|
{Role: "assistant", Content: "Hi there!"},
|
|
{Role: "user", Content: "How are you?"},
|
|
},
|
|
expected: "<|im_start|>system\n" +
|
|
"You are Olmo, a helpful AI assistant built by Ai2. Your date cutoff is December 2024, and your model weights are available at https://huggingface.co/allenai.<|im_end|>\n" +
|
|
"<|im_start|>user\n" +
|
|
"Hello<|im_end|>\n" +
|
|
"<|im_start|>assistant\n" +
|
|
"Hi there!<|im_end|>\n" +
|
|
"<|im_start|>user\n" +
|
|
"How are you?<|im_end|>\n" +
|
|
"<|im_start|>assistant\n" +
|
|
"<think>",
|
|
},
|
|
{
|
|
name: "32b_basic_without_system",
|
|
variant: Olmo3Think32B,
|
|
msgs: []api.Message{
|
|
{Role: "user", Content: "Hello!"},
|
|
},
|
|
expected: "<|im_start|>system\n" +
|
|
"You are a helpful AI assistant.<|im_end|>\n" +
|
|
"<|im_start|>user\n" +
|
|
"Hello!<|im_end|>\n" +
|
|
"<|im_start|>assistant\n" +
|
|
"<think>",
|
|
},
|
|
{
|
|
name: "32b_with_custom_system_gets_suffix",
|
|
variant: Olmo3Think32B,
|
|
msgs: []api.Message{
|
|
{Role: "system", Content: "You are a helpful assistant."},
|
|
{Role: "user", Content: "Hello!"},
|
|
},
|
|
expected: "<|im_start|>system\n" +
|
|
"You are a helpful assistant. You do not currently have access to any functions. <functions></functions><|im_end|>\n" +
|
|
"<|im_start|>user\n" +
|
|
"Hello!<|im_end|>\n" +
|
|
"<|im_start|>assistant\n" +
|
|
"<think>",
|
|
},
|
|
{
|
|
name: "31_basic_without_system",
|
|
variant: Olmo31Think,
|
|
msgs: []api.Message{
|
|
{Role: "user", Content: "Hello!"},
|
|
},
|
|
expected: "<|im_start|>system\n" +
|
|
"You are Olmo, a helpful AI assistant built by Ai2. Your date cutoff is December 2024, and your model weights are available at https://huggingface.co/allenai.<|im_end|>\n" +
|
|
"<|im_start|>user\n" +
|
|
"Hello!<|im_end|>\n" +
|
|
"<|im_start|>assistant\n" +
|
|
"<think>",
|
|
},
|
|
{
|
|
name: "31_with_custom_system_gets_suffix",
|
|
variant: Olmo31Think,
|
|
msgs: []api.Message{
|
|
{Role: "system", Content: "You are a helpful assistant."},
|
|
{Role: "user", Content: "Hello!"},
|
|
},
|
|
expected: "<|im_start|>system\n" +
|
|
"You are a helpful assistant. You do not currently have access to any functions. <functions></functions><|im_end|>\n" +
|
|
"<|im_start|>user\n" +
|
|
"Hello!<|im_end|>\n" +
|
|
"<|im_start|>assistant\n" +
|
|
"<think>",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
rendered, err := (&Olmo3ThinkRenderer{Variant: tt.variant}).Render(tt.msgs, tt.tools, nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if diff := cmp.Diff(rendered, tt.expected); diff != "" {
|
|
t.Errorf("mismatch (-got +want):\n%s", diff)
|
|
}
|
|
})
|
|
}
|
|
}
|