* feat(health): 支持凭据按模型冷却与统一恢复 * fix(health): 修复模型冷却的错误契约与恢复边界 * fix(web): 修复模型冷却展示与重置反馈 * fix(web): 保持分组健康与恢复反馈一致 * fix(health): 修复停用分组的模型冷却身份展示
34 lines
1.1 KiB
Go
34 lines
1.1 KiB
Go
package requestlog
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"gpt-load/internal/execution"
|
|
"gpt-load/internal/platform/redact"
|
|
"gpt-load/internal/telemetry"
|
|
)
|
|
|
|
func TestModelCooldownAttemptPreservesTargetAndDeadline(t *testing.T) {
|
|
event := testEvent("model-cooldown-attempt")
|
|
deadline := event.CompletedAt.Add(48 * time.Hour).Truncate(time.Millisecond)
|
|
event.Attempts[0].FailureScope = execution.ErrorScopeModel
|
|
event.Attempts[0].Effect = telemetry.EffectCooldownModel
|
|
event.Attempts[0].CooldownUntil = deadline
|
|
row, err := mapEvent(redact.New(), event)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
decoded, err := decodeAttemptRows(row.AttemptRows)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(decoded) != 1 || decoded[0].Effect != telemetry.EffectCooldownModel || decoded[0].UpstreamModel != event.Attempts[0].UpstreamModel || decoded[0].CooldownUntilMS == nil || *decoded[0].CooldownUntilMS != deadline.UnixMilli() {
|
|
t.Fatalf("decoded = %#v", decoded)
|
|
}
|
|
event.Attempts[0].CooldownUntil = time.Time{}
|
|
if _, err := mapEvent(redact.New(), event); err == nil {
|
|
t.Fatal("accepted model cooldown without deadline")
|
|
}
|
|
}
|