69 lines
4.7 KiB
Go
69 lines
4.7 KiB
Go
package domain
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"git.cin.su/m/Assistant/contracts/capability"
|
|
)
|
|
|
|
func TestRateCognitiveBindingRequiresSupportedEvidence(t *testing.T) {
|
|
rating := RateCognitiveBinding(capability.ResolvedCognitiveBinding{})
|
|
if rating.Category != capability.ModelRatingUnrated || rating.OverallScoreMillis != 0 {
|
|
t.Fatalf("rating=%+v", rating)
|
|
}
|
|
}
|
|
|
|
func TestRateCognitiveBindingExposesReachabilityWithoutQualityClaim(t *testing.T) {
|
|
rating := RateCognitiveBinding(capability.ResolvedCognitiveBinding{Qualification: &capability.ModelQualificationObservation{
|
|
Status: capability.ModelQualificationReachable, LatencyMillis: 600,
|
|
}})
|
|
if rating.Category != capability.ModelRatingUnrated || rating.OverallScoreMillis != 0 || rating.LatencyScoreMillis != 800 || rating.EvidenceScoreMillis != 750 {
|
|
t.Fatalf("reachability rating made an invalid quality claim: %+v", rating)
|
|
}
|
|
}
|
|
|
|
func TestRateCognitiveBindingUsesEvidenceNotProviderName(t *testing.T) {
|
|
quality, critical, latency := int64(900), int64(0), int64(400_000)
|
|
base := capability.ResolvedCognitiveBinding{
|
|
Provider: capability.ProviderInstance{Kind: "openai-compatible-chat-v1"},
|
|
Evaluation: &capability.EvaluatedCapability{Result: capability.EvaluationSupported, QualityScoreMillis: &quality, CriticalFailureMillis: &critical},
|
|
Performance: &capability.PerformanceEvidence{LatencyMicros: &latency},
|
|
}
|
|
other := base
|
|
other.Provider.Kind = "ollama-v1"
|
|
left, right := RateCognitiveBinding(base), RateCognitiveBinding(other)
|
|
if left != right || left.Category != capability.ModelRatingQuality {
|
|
t.Fatalf("provider changed rating: left=%+v right=%+v", left, right)
|
|
}
|
|
}
|
|
|
|
func TestRateCognitiveBindingClassifiesSlowEvidenceAsBalanced(t *testing.T) {
|
|
quality, critical, latency := int64(800), int64(0), int64(20_000_000)
|
|
rating := RateCognitiveBinding(capability.ResolvedCognitiveBinding{
|
|
Evaluation: &capability.EvaluatedCapability{Result: capability.EvaluationSupported, QualityScoreMillis: &quality, CriticalFailureMillis: &critical},
|
|
Performance: &capability.PerformanceEvidence{LatencyMicros: &latency},
|
|
})
|
|
if rating.Category != capability.ModelRatingBalanced || rating.LatencyScoreMillis != 200 {
|
|
t.Fatalf("rating=%+v", rating)
|
|
}
|
|
}
|
|
|
|
func TestSelectionExcludesFreshUnavailableQualificationButNotStaleEvidence(t *testing.T) {
|
|
quality, critical := int64(900), int64(0)
|
|
base := capability.ResolvedCognitiveBinding{
|
|
Binding: capability.CognitiveBinding{ID: "binding-qualification", Revision: 1, CapabilityID: "creator-advisory", OwnerPrincipalID: "owner", ProviderInstanceID: "provider", ProviderRevision: 1, ModelDescriptorID: "model", ModelRevision: 1, DataPolicy: capability.DataPolicyLocalOnly, Qualification: capability.QualificationValidated, Activation: capability.ActivationActive, Health: capability.HealthAvailable, LimitPolicyRef: "limits"},
|
|
Provider: capability.ProviderInstance{ID: "provider", Revision: 1, Kind: "local", EndpointRef: "endpoint", Enabled: true, Qualification: capability.QualificationValidated, Health: capability.HealthAvailable, ObservedAtUnixMillis: 20},
|
|
Model: capability.ModelDescriptor{ID: "model", Revision: 1, ProviderInstanceID: "provider", ProviderModelID: "model", MaxContextBytes: 1000, Modalities: []capability.ModelModality{capability.ModalityText}, Capabilities: []capability.ModelCapability{capability.CapabilityAdvisory}, Qualification: capability.QualificationValidated, Health: capability.HealthAvailable, ObservedAtUnixMillis: 20},
|
|
Evaluation: &capability.EvaluatedCapability{ID: "evaluation", BindingID: "binding-qualification", BindingRevision: 1, CapabilityID: "creator-advisory", Result: capability.EvaluationSupported, QualityScoreMillis: &quality, CriticalFailureMillis: &critical},
|
|
Qualification: &capability.ModelQualificationObservation{ID: "observation", ProviderInstanceID: "provider", ProviderModelID: "model", Status: capability.ModelQualificationUnavailable, FinishReason: "TIMEOUT", ObservedAtUnixMillis: 20, Category: capability.ModelRatingUnrated},
|
|
}
|
|
requirement := capability.CognitiveRequirement{CapabilityID: "creator-advisory", OwnerPrincipalID: "owner", DataPolicy: capability.DataPolicyLocalOnly, RequiredModalities: []capability.ModelModality{capability.ModalityText}, RequiredCapabilities: []capability.ModelCapability{capability.CapabilityAdvisory}, MaxOutputBytes: 10}
|
|
if _, err := SelectCognitiveBinding(requirement, []capability.ResolvedCognitiveBinding{base}); err == nil {
|
|
t.Fatal("fresh unavailable qualification should exclude candidate")
|
|
}
|
|
base.Qualification.ObservedAtUnixMillis = 19
|
|
if _, err := SelectCognitiveBinding(requirement, []capability.ResolvedCognitiveBinding{base}); err != nil {
|
|
t.Fatalf("stale unavailable qualification should not exclude candidate: %v", err)
|
|
}
|
|
}
|