diff --git a/adapters/models/openai_compatible_local.go b/adapters/models/openai_compatible_local.go index d75c56a..18944b7 100644 --- a/adapters/models/openai_compatible_local.go +++ b/adapters/models/openai_compatible_local.go @@ -69,8 +69,8 @@ func (a *OpenAICompatibleLocalAdapter) Discover(ctx context.Context) ([]Discover if item.ID == "" { continue } - canonical, _ := json.Marshal(item) - digest := sha256.Sum256(canonical) + stableMetadata := fmt.Sprintf("%s\x00%s\x00%d\x00%d\x00%d\x00%d\x00%s", item.ID, item.OwnedBy, item.Meta.Context, item.Meta.TrainingContext, item.Meta.Parameters, item.Meta.Size, item.Meta.FileType) + digest := sha256.Sum256([]byte(stableMetadata)) contextBytes := item.Meta.Context * 4 models = append(models, DiscoveredModel{ProviderModelID: capability.ProviderModelID(item.ID), Fingerprint: capability.ModelFingerprint(hex.EncodeToString(digest[:])), MaxContextBytes: contextBytes, Modalities: []capability.ModelModality{capability.ModalityText}, Capabilities: []capability.ModelCapability{capability.CapabilityUnknown}, SizeBytes: item.Meta.Size, Runtime: item.OwnedBy, Quantization: item.Meta.FileType}) } diff --git a/tests/cognitive_providers/providers_test.go b/tests/cognitive_providers/providers_test.go index 41a3752..8f01526 100644 --- a/tests/cognitive_providers/providers_test.go +++ b/tests/cognitive_providers/providers_test.go @@ -20,7 +20,7 @@ func TestCPUDiscoveryIsReadOnlyAndCredentialFree(t *testing.T) { if r.Method != http.MethodGet || r.URL.Path != "/v1/models" || r.Header.Get("Authorization") != "" { t.Fatalf("unexpected request %s %s auth=%q", r.Method, r.URL.Path, r.Header.Get("Authorization")) } - _, _ = io.WriteString(w, `{"data":[{"id":"same-name","created":1,"owned_by":"local","meta":{"n_ctx":2048,"n_params":3,"size":10,"ftype":"Q4"}}]}`) + _, _ = io.WriteString(w, `{"data":[{"id":"same-name","created":`+string(rune('0'+requests))+`,"owned_by":"local","meta":{"n_ctx":2048,"n_params":3,"size":10,"ftype":"Q4"}}]}`) })) defer server.Close() adapter, err := models.NewOpenAICompatibleLocalAdapter(server.URL+"/v1", nil) @@ -31,6 +31,10 @@ func TestCPUDiscoveryIsReadOnlyAndCredentialFree(t *testing.T) { if probe.Health != capability.HealthAvailable || len(discovered) != 1 || requests != 1 { t.Fatalf("probe=%+v models=%+v requests=%d", probe, discovered, requests) } + second, probe := adapter.Discover(context.Background()) + if probe.Health != capability.HealthAvailable || len(second) != 1 || second[0].Fingerprint != discovered[0].Fingerprint { + t.Fatalf("volatile created field changed fingerprint: %s != %s", second[0].Fingerprint, discovered[0].Fingerprint) + } } func TestOllamaDiscoveryDoesNotRunInference(t *testing.T) {