mirror of
https://github.com/ollama/ollama.git
synced 2026-09-21 13:38:14 -05:00
Several pieces outlived the code that used them. The root tokenizer package implemented the GGUF-side vocabularies for the Go engine and the safetensors-to-GGUF converter; nothing has imported it since the converter went. ml/backend.go held the Go engine's Backend, Context and Tensor interfaces, with fs.Config existing only to be returned from them, and a single CUDA template instance under ml/backend/ggml survived the engine removal along with the gitattributes entries for that tree and the CI change-filter globs for it and for the long-gone llama/llama.cpp. From the image generation engine, an integration test group that no test registers, its build tag, and the StepBar progress widget remained. DeviceInfo.IsBetter has no caller at all. All of it goes. Tidying the module file drops the regexp2 dependency and leaves protobuf as an indirect requirement. The llama3.2 tokenizer fixtures stay: the MLX runner's tokenizer uses them for its GGML parity test.
143 lines
2.4 KiB
Go
143 lines
2.4 KiB
Go
//go:build integration && (fast || release || library)
|
|
|
|
package integration
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func runIntegrationGroup(t *testing.T, cases ...string) {
|
|
t.Helper()
|
|
selected := map[string]struct{}{}
|
|
for _, c := range cases {
|
|
selected[c] = struct{}{}
|
|
}
|
|
var ran bool
|
|
for _, c := range integrationCases {
|
|
if _, ok := selected[c.Case]; !ok {
|
|
continue
|
|
}
|
|
ran = true
|
|
c := c
|
|
name := c.Case
|
|
if c.Model != "" {
|
|
name += "/" + testName(c.Model)
|
|
}
|
|
t.Run(name, c.Run)
|
|
}
|
|
if !ran {
|
|
t.Skip("no integration cases selected")
|
|
}
|
|
}
|
|
|
|
func TestAPI(t *testing.T) {
|
|
runIntegrationGroup(t,
|
|
"api-generate",
|
|
"api-chat",
|
|
"api-list-models",
|
|
"api-show-model",
|
|
"generate-logprobs",
|
|
"chat-logprobs",
|
|
)
|
|
}
|
|
|
|
func TestBasic(t *testing.T) {
|
|
runIntegrationGroup(t,
|
|
"blue-sky",
|
|
"unicode-input",
|
|
"unicode-output",
|
|
"unicode-model-dir",
|
|
"num-predict",
|
|
"thinking-enabled",
|
|
"thinking-suppressed",
|
|
)
|
|
}
|
|
|
|
func TestChat(t *testing.T) {
|
|
runIntegrationGroup(t,
|
|
"chat",
|
|
"chat-history",
|
|
)
|
|
}
|
|
|
|
func TestEmbedding(t *testing.T) {
|
|
runIntegrationGroup(t,
|
|
"embed",
|
|
"embed-correlation",
|
|
"embedding-api",
|
|
"embed-api",
|
|
"embed-api-batch",
|
|
"embed-api-truncate",
|
|
"embed-truncation",
|
|
"embed-large-input",
|
|
"embed-status-code",
|
|
)
|
|
}
|
|
|
|
func TestVision(t *testing.T) {
|
|
runIntegrationGroup(t,
|
|
"vision-multiturn",
|
|
"vision-count",
|
|
"vision-scene",
|
|
"vision-spatial",
|
|
"vision-detail",
|
|
"vision-multi-image",
|
|
"vision-description",
|
|
"vision-ocr-document",
|
|
"vision-split-batch",
|
|
"vision-text",
|
|
)
|
|
}
|
|
|
|
func TestAudio(t *testing.T) {
|
|
runIntegrationGroup(t,
|
|
"audio-transcription",
|
|
"audio-response",
|
|
"openai-audio-transcription",
|
|
"openai-chat-audio",
|
|
)
|
|
}
|
|
|
|
func TestContext(t *testing.T) {
|
|
runIntegrationGroup(t,
|
|
"context-long-input",
|
|
"context-exhaustion",
|
|
"generate-history",
|
|
"parallel-generate-history",
|
|
"parallel-chat-history",
|
|
)
|
|
}
|
|
|
|
func TestConcurrency(t *testing.T) {
|
|
runIntegrationGroup(t,
|
|
"concurrent-chat",
|
|
"scheduler-multimodel",
|
|
"scheduler-max-queue",
|
|
)
|
|
}
|
|
|
|
func TestTools(t *testing.T) {
|
|
runIntegrationGroup(t,
|
|
"tools",
|
|
"tools-routes",
|
|
"tools-stress",
|
|
)
|
|
}
|
|
|
|
func TestCreate(t *testing.T) {
|
|
runIntegrationGroup(t,
|
|
"create-safetensors",
|
|
"create-gguf",
|
|
"create-gguf-blob-transfer",
|
|
)
|
|
}
|
|
|
|
func TestQuantization(t *testing.T) {
|
|
runIntegrationGroup(t, "quantization")
|
|
}
|
|
|
|
func testName(s string) string {
|
|
return strings.NewReplacer("/", "~", " ", "_").Replace(s)
|
|
}
|