mirror of
https://github.com/ollama/ollama.git
synced 2026-05-21 13:11:39 -05:00
* mlx: add laguna model support * convert: support fp8 safetensors import Decode HF F8_E4M3 safetensors with block scale companions into GGUF-supported tensor types, and record which output tensors came from FP8 source weights. Use that source-precision metadata during create quantization: default FP8-sourced GGUFs to Q8_0, keep non-FP8 tensors at their original precision for Q8_0, and promote non-FP8 quantizable tensors to Q8_0 for Q4_K requests. * ggml: add laguna model support * server: preserve generate logprobs with builtin parsers Generate requests were dropping logprob-only chunks whenever a builtin parser buffered visible content. Chat already handled this case, but generate only forwarded chunks with visible response, thinking, or tool-call output. Keep generate chunks that carry logprobs even when the builtin parser has not flushed visible content yet, and add a regression test that exercises the behavior with a generic thinking parser. * review comments - perf improvements * ggml: implement nemotron 3 nano omni * add poolside integration * update poolside doc * adapt to new cache setup * fix test * fix test --------- Co-authored-by: Eva Ho <hoyyeva@gmail.com>
96 lines
2.1 KiB
Go
96 lines
2.1 KiB
Go
package launch
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestEditorRunsDoNotRewriteConfig(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
binary string
|
|
runner Runner
|
|
checkPath func(home string) string
|
|
}{
|
|
{
|
|
name: "droid",
|
|
binary: "droid",
|
|
runner: &Droid{},
|
|
checkPath: func(home string) string {
|
|
return filepath.Join(home, ".factory", "settings.json")
|
|
},
|
|
},
|
|
{
|
|
name: "opencode",
|
|
binary: "opencode",
|
|
runner: &OpenCode{},
|
|
checkPath: func(home string) string {
|
|
return filepath.Join(home, ".local", "state", "opencode", "model.json")
|
|
},
|
|
},
|
|
{
|
|
name: "cline",
|
|
binary: "cline",
|
|
runner: &Cline{},
|
|
checkPath: func(home string) string {
|
|
return filepath.Join(home, ".cline", "data", "globalState.json")
|
|
},
|
|
},
|
|
{
|
|
name: "pi",
|
|
binary: "pi",
|
|
runner: &Pi{},
|
|
checkPath: func(home string) string {
|
|
return filepath.Join(home, ".pi", "agent", "models.json")
|
|
},
|
|
},
|
|
{
|
|
name: "pool",
|
|
binary: "pool",
|
|
runner: &Poolside{},
|
|
checkPath: func(home string) string {
|
|
return filepath.Join(home, ".poolside", "config")
|
|
},
|
|
},
|
|
{
|
|
name: "kimi",
|
|
binary: "kimi",
|
|
runner: &Kimi{},
|
|
checkPath: func(home string) string {
|
|
return filepath.Join(home, ".kimi", "config.toml")
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
if tt.name == "pool" && poolsideGOOS == "windows" {
|
|
t.Skip("Poolside is intentionally unsupported on Windows")
|
|
}
|
|
|
|
home := t.TempDir()
|
|
setTestHome(t, home)
|
|
|
|
binDir := t.TempDir()
|
|
writeFakeBinary(t, binDir, tt.binary)
|
|
if tt.name == "pi" {
|
|
writeFakeBinary(t, binDir, "npm")
|
|
}
|
|
if tt.name == "kimi" {
|
|
writeFakeBinary(t, binDir, "curl")
|
|
writeFakeBinary(t, binDir, "bash")
|
|
}
|
|
t.Setenv("PATH", binDir)
|
|
|
|
configPath := tt.checkPath(home)
|
|
if err := tt.runner.Run("llama3.2", nil); err != nil {
|
|
t.Fatalf("Run returned error: %v", err)
|
|
}
|
|
if _, err := os.Stat(configPath); !os.IsNotExist(err) {
|
|
t.Fatalf("expected Run to leave %s untouched, got err=%v", configPath, err)
|
|
}
|
|
})
|
|
}
|
|
}
|