109 lines
2.9 KiB
Go
109 lines
2.9 KiB
Go
|
|
package strategy
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"context"
|
|||
|
|
"testing"
|
|||
|
|
|
|||
|
|
"github.com/stretchr/testify/assert"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// TestCostAwareStrategy_Balance 测试成本感知策略的平衡选择
|
|||
|
|
func TestCostAwareStrategy_Balance(t *testing.T) {
|
|||
|
|
template := NewCostAwareTemplate("CostAware", CostAwareParams{
|
|||
|
|
MaxCostPer1KTokens: 1.0,
|
|||
|
|
MaxLatencyMs: 500,
|
|||
|
|
MinQualityScore: 0.7,
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// 注册多个providers
|
|||
|
|
// ProviderA: 低成本, 低质量
|
|||
|
|
template.providers["ProviderA"] = &MockProvider{
|
|||
|
|
name: "ProviderA",
|
|||
|
|
costPer1KTokens: 0.2,
|
|||
|
|
available: true,
|
|||
|
|
models: []string{"gpt-4"},
|
|||
|
|
qualityScore: 0.6, // 质量不达标
|
|||
|
|
latencyMs: 100,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ProviderB: 中成本, 高质量, 低延迟
|
|||
|
|
template.providers["ProviderB"] = &MockProvider{
|
|||
|
|
name: "ProviderB",
|
|||
|
|
costPer1KTokens: 0.5,
|
|||
|
|
available: true,
|
|||
|
|
models: []string{"gpt-4"},
|
|||
|
|
qualityScore: 0.9,
|
|||
|
|
latencyMs: 150,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ProviderC: 高成本, 高质量, 高延迟
|
|||
|
|
template.providers["ProviderC"] = &MockProvider{
|
|||
|
|
name: "ProviderC",
|
|||
|
|
costPer1KTokens: 0.9,
|
|||
|
|
available: true,
|
|||
|
|
models: []string{"gpt-4"},
|
|||
|
|
qualityScore: 0.95,
|
|||
|
|
latencyMs: 400,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
req := &RoutingRequest{
|
|||
|
|
Model: "gpt-4",
|
|||
|
|
UserID: "user123",
|
|||
|
|
MaxCost: 1.0,
|
|||
|
|
MaxLatency: 500,
|
|||
|
|
MinQuality: 0.7,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
decision, err := template.SelectProvider(context.Background(), req)
|
|||
|
|
|
|||
|
|
// 验证选择逻辑
|
|||
|
|
assert.NoError(t, err)
|
|||
|
|
assert.NotNil(t, decision)
|
|||
|
|
|
|||
|
|
// ProviderA因质量不达标应被排除
|
|||
|
|
// ProviderB应在成本/质量/延迟权衡中胜出
|
|||
|
|
assert.Equal(t, "ProviderB", decision.Provider, "Should select balanced provider")
|
|||
|
|
assert.GreaterOrEqual(t, decision.QualityScore, 0.7, "Quality should meet minimum")
|
|||
|
|
assert.LessOrEqual(t, decision.CostPer1KTokens, 1.0, "Cost should be within budget")
|
|||
|
|
assert.LessOrEqual(t, decision.EstimatedLatency, int64(500), "Latency should be within limit")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestCostAwareStrategy_QualityThreshold 测试质量阈值过滤
|
|||
|
|
func TestCostAwareStrategy_QualityThreshold(t *testing.T) {
|
|||
|
|
template := NewCostAwareTemplate("CostAware", CostAwareParams{
|
|||
|
|
MaxCostPer1KTokens: 1.0,
|
|||
|
|
MaxLatencyMs: 1000,
|
|||
|
|
MinQualityScore: 0.9, // 高质量要求
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// 所有provider质量都不达标
|
|||
|
|
template.providers["ProviderA"] = &MockProvider{
|
|||
|
|
name: "ProviderA",
|
|||
|
|
costPer1KTokens: 0.3,
|
|||
|
|
available: true,
|
|||
|
|
models: []string{"gpt-4"},
|
|||
|
|
qualityScore: 0.7,
|
|||
|
|
latencyMs: 100,
|
|||
|
|
}
|
|||
|
|
template.providers["ProviderB"] = &MockProvider{
|
|||
|
|
name: "ProviderB",
|
|||
|
|
costPer1KTokens: 0.4,
|
|||
|
|
available: true,
|
|||
|
|
models: []string{"gpt-4"},
|
|||
|
|
qualityScore: 0.8,
|
|||
|
|
latencyMs: 150,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
req := &RoutingRequest{
|
|||
|
|
Model: "gpt-4",
|
|||
|
|
UserID: "user123",
|
|||
|
|
MinQuality: 0.9,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
decision, err := template.SelectProvider(context.Background(), req)
|
|||
|
|
|
|||
|
|
// 应该返回错误,因为没有满足质量要求的provider
|
|||
|
|
assert.Error(t, err)
|
|||
|
|
assert.Nil(t, decision)
|
|||
|
|
}
|