File size: 2,740 Bytes
cd8bd0a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import { wildcardMatch } from "@omniroute/open-sse/services/wildcardRouter.ts";

type JsonRecord = Record<string, unknown>;

interface ConnectionLike {
  providerSpecificData?: unknown;
}

function asRecord(value: unknown): JsonRecord {
  return value && typeof value === "object" && !Array.isArray(value) ? (value as JsonRecord) : {};
}

function normalizePattern(value: unknown): string | null {
  if (typeof value !== "string") return null;
  const normalized = value.trim();
  if (!normalized || normalized === "**") return null;
  return normalized;
}

function toPatternList(value: unknown): string[] {
  if (Array.isArray(value)) {
    return value.map(normalizePattern).filter((pattern): pattern is string => Boolean(pattern));
  }
  if (typeof value === "string") {
    return value
      .split(",")
      .map(normalizePattern)
      .filter((pattern): pattern is string => Boolean(pattern));
  }
  return [];
}

function uniquePatterns(patterns: string[]): string[] {
  return Array.from(new Set(patterns));
}

function getModelMatchCandidates(modelId: string): string[] {
  const normalized = modelId.trim();
  if (!normalized) return [];

  const withoutExtendedContext = normalized.endsWith("[1m]") ? normalized.slice(0, -4) : normalized;
  const lastSlashIndex = withoutExtendedContext.lastIndexOf("/");
  const rawModel =
    lastSlashIndex >= 0 ? withoutExtendedContext.slice(lastSlashIndex + 1) : withoutExtendedContext;

  return Array.from(new Set([normalized, withoutExtendedContext, rawModel].filter(Boolean)));
}

export function normalizeExcludedModelPatterns(value: unknown): string[] {
  return uniquePatterns(toPatternList(value));
}

export function getConnectionExcludedModels(providerSpecificData: unknown): string[] {
  const data = asRecord(providerSpecificData);
  return normalizeExcludedModelPatterns(data.excludedModels ?? data.excluded_models);
}

export function isModelExcludedByConnection(
  modelId: unknown,
  providerSpecificData: unknown
): boolean {
  if (typeof modelId !== "string" || modelId.trim().length === 0) return false;

  const candidates = getModelMatchCandidates(modelId);
  const excludedModels = getConnectionExcludedModels(providerSpecificData);
  if (candidates.length === 0 || excludedModels.length === 0) return false;

  return excludedModels.some((pattern) =>
    candidates.some((candidate) => wildcardMatch(candidate, pattern))
  );
}

export function hasEligibleConnectionForModel(
  connections: ConnectionLike[] | null | undefined,
  modelId: unknown
): boolean {
  if (!Array.isArray(connections) || connections.length === 0) return false;

  return connections.some(
    (connection) => !isModelExcludedByConnection(modelId, connection?.providerSpecificData)
  );
}