feat: add runner failover rules and cache affinity
This commit is contained in:
@@ -107,6 +107,7 @@ func simulationProfile(request Request) string {
|
||||
}
|
||||
|
||||
func simulatedResult(request Request) map[string]any {
|
||||
usage := simulatedUsage(request)
|
||||
switch request.Kind {
|
||||
case "chat.completions":
|
||||
return map[string]any{
|
||||
@@ -122,7 +123,7 @@ func simulatedResult(request Request) map[string]any {
|
||||
"content": fmt.Sprintf("simulation response from %s", request.Candidate.Provider),
|
||||
},
|
||||
}},
|
||||
"usage": map[string]any{"prompt_tokens": 12, "completion_tokens": 8, "total_tokens": 20},
|
||||
"usage": simulatedOpenAIUsageMap(usage),
|
||||
}
|
||||
case "responses":
|
||||
return map[string]any{
|
||||
@@ -131,7 +132,7 @@ func simulatedResult(request Request) map[string]any {
|
||||
"created_at": nowUnix(),
|
||||
"model": request.Model,
|
||||
"output_text": fmt.Sprintf("simulation response from %s", request.Candidate.Provider),
|
||||
"usage": map[string]any{"input_tokens": 12, "output_tokens": 8, "total_tokens": 20},
|
||||
"usage": simulatedResponseUsageMap(usage),
|
||||
}
|
||||
case "embeddings":
|
||||
return simulatedEmbeddingResult(request)
|
||||
@@ -373,6 +374,9 @@ func simulatedAudioData(request Request, fallbackPrompt string) []any {
|
||||
}
|
||||
|
||||
func simulatedUsage(request Request) Usage {
|
||||
if usage, ok := simulationUsageOverride(request); ok {
|
||||
return usage
|
||||
}
|
||||
if request.ModelType == "chat" || request.ModelType == "text_generate" || request.Kind == "responses" {
|
||||
return Usage{InputTokens: 12, OutputTokens: 8, TotalTokens: 20}
|
||||
}
|
||||
@@ -382,6 +386,56 @@ func simulatedUsage(request Request) Usage {
|
||||
return Usage{}
|
||||
}
|
||||
|
||||
func simulationUsageOverride(request Request) (Usage, bool) {
|
||||
raw, _ := request.Body["simulationUsage"].(map[string]any)
|
||||
if len(raw) == 0 {
|
||||
raw, _ = request.Body["testUsage"].(map[string]any)
|
||||
}
|
||||
if len(raw) == 0 {
|
||||
return Usage{}, false
|
||||
}
|
||||
usage := Usage{
|
||||
InputTokens: intFromAny(firstPresent(raw["inputTokens"], raw["input_tokens"], raw["promptTokens"], raw["prompt_tokens"])),
|
||||
OutputTokens: intFromAny(firstPresent(raw["outputTokens"], raw["output_tokens"], raw["completionTokens"], raw["completion_tokens"])),
|
||||
CachedInputTokens: intFromAny(firstPresent(raw["cachedInputTokens"], raw["cached_input_tokens"], raw["cachedPromptTokens"], raw["cached_tokens"])),
|
||||
TotalTokens: intFromAny(firstPresent(raw["totalTokens"], raw["total_tokens"])),
|
||||
}
|
||||
if _, ok := firstPresentValue(raw["cachedInputTokens"], raw["cached_input_tokens"], raw["cachedPromptTokens"], raw["cached_tokens"]); ok {
|
||||
usage.CachedInputTokensKnown = true
|
||||
}
|
||||
if usage.TotalTokens == 0 {
|
||||
usage.TotalTokens = usage.InputTokens + usage.OutputTokens
|
||||
}
|
||||
if usage.CachedInputTokens > usage.InputTokens && usage.InputTokens > 0 {
|
||||
usage.CachedInputTokens = usage.InputTokens
|
||||
}
|
||||
return usage, true
|
||||
}
|
||||
|
||||
func simulatedOpenAIUsageMap(usage Usage) map[string]any {
|
||||
out := map[string]any{
|
||||
"prompt_tokens": usage.InputTokens,
|
||||
"completion_tokens": usage.OutputTokens,
|
||||
"total_tokens": usage.TotalTokens,
|
||||
}
|
||||
if usage.CachedInputTokensKnown {
|
||||
out["prompt_tokens_details"] = map[string]any{"cached_tokens": usage.CachedInputTokens}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
func simulatedResponseUsageMap(usage Usage) map[string]any {
|
||||
out := map[string]any{
|
||||
"input_tokens": usage.InputTokens,
|
||||
"output_tokens": usage.OutputTokens,
|
||||
"total_tokens": usage.TotalTokens,
|
||||
}
|
||||
if usage.CachedInputTokensKnown {
|
||||
out["input_tokens_details"] = map[string]any{"cached_tokens": usage.CachedInputTokens}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
func simulatedProgress(request Request) []Progress {
|
||||
provider := request.Candidate.Provider
|
||||
if provider == "" {
|
||||
|
||||
Reference in New Issue
Block a user