74 lines
2.6 KiB
Go
74 lines
2.6 KiB
Go
package store
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
)
|
|
|
|
type CacheAffinityObservationInput struct {
|
|
CacheAffinityKey string
|
|
CacheAffinityPolicy map[string]any
|
|
PlatformID string
|
|
PlatformModelID string
|
|
ClientID string
|
|
ModelType string
|
|
InputTokens int
|
|
CachedInputTokens int
|
|
CachedInputTokensKnown bool
|
|
}
|
|
|
|
func (s *Store) RecordCacheAffinityObservation(ctx context.Context, input CacheAffinityObservationInput) error {
|
|
input.CacheAffinityKey = strings.TrimSpace(input.CacheAffinityKey)
|
|
input.ClientID = strings.TrimSpace(input.ClientID)
|
|
input.ModelType = strings.TrimSpace(input.ModelType)
|
|
if input.CacheAffinityKey == "" || input.ClientID == "" || input.ModelType == "" {
|
|
return nil
|
|
}
|
|
if !input.CachedInputTokensKnown || !cacheAffinityPolicyEnabled(input.CacheAffinityPolicy, input.ModelType) {
|
|
return nil
|
|
}
|
|
minInputTokens := cacheAffinityMinInputTokens(input.CacheAffinityPolicy)
|
|
if input.InputTokens < minInputTokens || input.InputTokens <= 0 {
|
|
return nil
|
|
}
|
|
if input.CachedInputTokens < 0 {
|
|
input.CachedInputTokens = 0
|
|
}
|
|
if input.CachedInputTokens > input.InputTokens {
|
|
input.CachedInputTokens = input.InputTokens
|
|
}
|
|
alpha := cacheAffinityEMAAlpha(input.CacheAffinityPolicy)
|
|
hitRatio := float64(input.CachedInputTokens) / float64(input.InputTokens)
|
|
_, err := s.pool.Exec(ctx, `
|
|
INSERT INTO gateway_cache_affinity_stats (
|
|
client_id, cache_affinity_key, platform_id, platform_model_id, model_type,
|
|
request_count, input_tokens, cached_input_tokens, ema_hit_ratio, last_hit_ratio, last_observed_at
|
|
)
|
|
VALUES (
|
|
$1, $2, NULLIF($3::text, '')::uuid, NULLIF($4::text, '')::uuid, $5,
|
|
1, $6, $7, $8, $8, now()
|
|
)
|
|
ON CONFLICT (client_id, cache_affinity_key) DO UPDATE
|
|
SET platform_id = COALESCE(EXCLUDED.platform_id, gateway_cache_affinity_stats.platform_id),
|
|
platform_model_id = COALESCE(EXCLUDED.platform_model_id, gateway_cache_affinity_stats.platform_model_id),
|
|
model_type = EXCLUDED.model_type,
|
|
request_count = gateway_cache_affinity_stats.request_count + 1,
|
|
input_tokens = gateway_cache_affinity_stats.input_tokens + EXCLUDED.input_tokens,
|
|
cached_input_tokens = gateway_cache_affinity_stats.cached_input_tokens + EXCLUDED.cached_input_tokens,
|
|
ema_hit_ratio = ($9::float8 * EXCLUDED.last_hit_ratio) + ((1 - $9::float8) * gateway_cache_affinity_stats.ema_hit_ratio),
|
|
last_hit_ratio = EXCLUDED.last_hit_ratio,
|
|
last_observed_at = now(),
|
|
updated_at = now()`,
|
|
input.ClientID,
|
|
input.CacheAffinityKey,
|
|
input.PlatformID,
|
|
input.PlatformModelID,
|
|
input.ModelType,
|
|
input.InputTokens,
|
|
input.CachedInputTokens,
|
|
hitRatio,
|
|
alpha,
|
|
)
|
|
return err
|
|
}
|