@pfoundation/ocadvisor 26.9.1 → 26.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +444 -46
  2. package/dist/artificialAnalysis.d.ts +4 -0
  3. package/dist/artificialAnalysis.d.ts.map +1 -0
  4. package/dist/artificialAnalysis.js +77 -0
  5. package/dist/artificialAnalysis.js.map +1 -0
  6. package/dist/benchmarkConfig.d.ts +21 -0
  7. package/dist/benchmarkConfig.d.ts.map +1 -0
  8. package/dist/benchmarkConfig.js +59 -0
  9. package/dist/benchmarkConfig.js.map +1 -0
  10. package/dist/benchmarkEvidence.d.ts +37 -0
  11. package/dist/benchmarkEvidence.d.ts.map +1 -0
  12. package/dist/benchmarkEvidence.js +81 -0
  13. package/dist/benchmarkEvidence.js.map +1 -0
  14. package/dist/benchmarkMatch.d.ts +58 -0
  15. package/dist/benchmarkMatch.d.ts.map +1 -0
  16. package/dist/benchmarkMatch.js +259 -0
  17. package/dist/benchmarkMatch.js.map +1 -0
  18. package/dist/benchmarkStore.d.ts +45 -0
  19. package/dist/benchmarkStore.d.ts.map +1 -0
  20. package/dist/benchmarkStore.js +309 -0
  21. package/dist/benchmarkStore.js.map +1 -0
  22. package/dist/benchmarkTypes.d.ts +48 -0
  23. package/dist/benchmarkTypes.d.ts.map +1 -0
  24. package/dist/benchmarkTypes.js +298 -0
  25. package/dist/benchmarkTypes.js.map +1 -0
  26. package/dist/benchmarkUpdate.d.ts +33 -0
  27. package/dist/benchmarkUpdate.d.ts.map +1 -0
  28. package/dist/benchmarkUpdate.js +327 -0
  29. package/dist/benchmarkUpdate.js.map +1 -0
  30. package/dist/cli.d.ts +13 -0
  31. package/dist/cli.d.ts.map +1 -0
  32. package/dist/cli.js +397 -0
  33. package/dist/cli.js.map +1 -0
  34. package/dist/data/artificialAnalysis.mappings.json +229 -0
  35. package/dist/data/artificialAnalysis.snapshot.json +17684 -0
  36. package/dist/modelProfiles.d.ts +45 -0
  37. package/dist/modelProfiles.d.ts.map +1 -0
  38. package/dist/modelProfiles.js +141 -0
  39. package/dist/modelProfiles.js.map +1 -0
  40. package/dist/ocAdvisor.d.ts +105 -5
  41. package/dist/ocAdvisor.d.ts.map +1 -1
  42. package/dist/ocAdvisor.js +534 -45
  43. package/dist/ocAdvisor.js.map +1 -1
  44. package/dist/typesafeGate.d.ts +96 -0
  45. package/dist/typesafeGate.d.ts.map +1 -0
  46. package/dist/typesafeGate.js +475 -0
  47. package/dist/typesafeGate.js.map +1 -0
  48. package/dist/typesafeState.d.ts +94 -0
  49. package/dist/typesafeState.d.ts.map +1 -0
  50. package/dist/typesafeState.js +301 -0
  51. package/dist/typesafeState.js.map +1 -0
  52. package/package.json +8 -2
@@ -0,0 +1,77 @@
1
+ // Artificial Analysis response normalization: maps the documented LLM
2
+ // models payload onto the versioned benchmark snapshot. The response
3
+ // carries no structured effort, evaluation date, or methodology version,
4
+ // so those fields stay null rather than guessed.
5
+ import { BENCHMARK_SCHEMA_VERSION, BENCHMARK_SOURCE, BENCHMARK_SOURCE_URL, RECOGNIZED_METRICS, computeSnapshotHash, parseBenchmarkModel, } from "./benchmarkTypes.js";
6
+ export const AA_LLM_MODELS_ENDPOINT = "https://artificialanalysis.ai/api/v2/data/llms/models";
7
+ function isRecord(value) {
8
+ return typeof value === "object" && value !== null && !Array.isArray(value);
9
+ }
10
+ export function normalizeAAResponse(body, fetchedAt) {
11
+ if (!isRecord(body)) {
12
+ return { error: "artificial analysis response must be an object" };
13
+ }
14
+ if (typeof fetchedAt !== "string" ||
15
+ !Number.isFinite(Date.parse(fetchedAt))) {
16
+ return {
17
+ error: "artificial analysis refresh needs a valid fetchedAt timestamp",
18
+ };
19
+ }
20
+ if (!Array.isArray(body.data) || body.data.length === 0) {
21
+ return { error: "artificial analysis response has an empty data array" };
22
+ }
23
+ const seen = new Set();
24
+ const models = [];
25
+ for (let index = 0; index < body.data.length; index++) {
26
+ const entry = body.data[index];
27
+ const label = `entry ${index}`;
28
+ if (!isRecord(entry))
29
+ return { error: `${label} must be an object` };
30
+ const creator = isRecord(entry.model_creator) ? entry.model_creator : null;
31
+ const creatorID = creator && typeof creator.id === "string" ? creator.id.trim() : "";
32
+ if (!creatorID) {
33
+ return { error: `${label} is missing a model creator id` };
34
+ }
35
+ const parsed = parseBenchmarkModel({
36
+ id: entry.id,
37
+ creatorID,
38
+ name: entry.name,
39
+ slug: entry.slug,
40
+ evaluatedEffort: null,
41
+ evaluatedAt: null,
42
+ evaluations: entry.evaluations ?? {},
43
+ }, label);
44
+ if ("error" in parsed)
45
+ return parsed;
46
+ if (seen.has(parsed.id)) {
47
+ return { error: `duplicate benchmark model id ${parsed.id}` };
48
+ }
49
+ seen.add(parsed.id);
50
+ models.push(parsed);
51
+ }
52
+ const usable = models.some((model) => RECOGNIZED_METRICS.some((metric) => typeof model.evaluations[metric.key] === "number"));
53
+ if (!usable) {
54
+ return {
55
+ error: "artificial analysis response has no usable benchmark scores",
56
+ };
57
+ }
58
+ const snapshot = {
59
+ schemaVersion: BENCHMARK_SCHEMA_VERSION,
60
+ source: BENCHMARK_SOURCE,
61
+ sourceURL: BENCHMARK_SOURCE_URL,
62
+ endpoint: AA_LLM_MODELS_ENDPOINT,
63
+ fetchedAt,
64
+ contentHash: "",
65
+ methodologyVersion: null,
66
+ metricDefinitions: [...RECOGNIZED_METRICS],
67
+ models,
68
+ };
69
+ snapshot.contentHash = computeSnapshotHash({
70
+ source: snapshot.source,
71
+ endpoint: snapshot.endpoint,
72
+ methodologyVersion: snapshot.methodologyVersion,
73
+ models: snapshot.models,
74
+ });
75
+ return snapshot;
76
+ }
77
+ //# sourceMappingURL=artificialAnalysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artificialAnalysis.js","sourceRoot":"","sources":["../src/artificialAnalysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { BenchmarkValidationError } from "./benchmarkTypes.js";
2
+ export declare const BENCHMARKS_PATH_ENV = "OCADVISOR_BENCHMARKS_PATH";
3
+ export declare const BENCHMARK_MAPPINGS_PATH_ENV = "OCADVISOR_BENCHMARK_MAPPINGS_PATH";
4
+ export declare const BENCHMARK_MATCH_ANY_PROVIDER_ENV = "OCADVISOR_BENCHMARKS_MATCH_ANY_PROVIDER";
5
+ export declare const DEFAULT_SNAPSHOT_FILENAME = "artificial-analysis.json";
6
+ export declare const DEFAULT_MAPPINGS_FILENAME = "model-mappings.json";
7
+ export interface BenchmarkPathOptions {
8
+ path?: string;
9
+ mappingsPath?: string;
10
+ matchAnyProvider?: boolean;
11
+ }
12
+ export interface ResolvedBenchmarkPaths {
13
+ snapshotPath: string;
14
+ mappingsPath: string;
15
+ }
16
+ export declare function defaultBenchmarkSnapshotPath(env?: Record<string, string | undefined>, homeDir?: string): string;
17
+ export declare function resolveBenchmarkPaths(explicit: {
18
+ path?: unknown;
19
+ mappingsPath?: unknown;
20
+ } | null | undefined, env?: Record<string, string | undefined>, homeDir?: string): ResolvedBenchmarkPaths | BenchmarkValidationError;
21
+ //# sourceMappingURL=benchmarkConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmarkConfig.d.ts","sourceRoot":"","sources":["../src/benchmarkConfig.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAEpE,eAAO,MAAM,mBAAmB,8BAA8B,CAAC;AAC/D,eAAO,MAAM,2BAA2B,sCAAsC,CAAC;AAC/E,eAAO,MAAM,gCAAgC,4CACF,CAAC;AAC5C,eAAO,MAAM,yBAAyB,6BAA6B,CAAC;AACpE,eAAO,MAAM,yBAAyB,wBAAwB,CAAC;AAE/D,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,4BAA4B,CAC1C,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,EACrD,OAAO,GAAE,MAAkB,GAC1B,MAAM,CAUR;AAqBD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,EACvE,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,EACrD,OAAO,GAAE,MAAkB,GAC1B,sBAAsB,GAAG,wBAAwB,CAoBnD"}
@@ -0,0 +1,59 @@
1
+ // Shared benchmark file locations for the plugin and the CLI. Explicit
2
+ // values win per field, then environment, then the data-directory default.
3
+ // Explicit paths must be absolute so refreshes never depend on the process
4
+ // working directory.
5
+ import { homedir } from "node:os";
6
+ import { dirname, isAbsolute, join } from "node:path";
7
+ export const BENCHMARKS_PATH_ENV = "OCADVISOR_BENCHMARKS_PATH";
8
+ export const BENCHMARK_MAPPINGS_PATH_ENV = "OCADVISOR_BENCHMARK_MAPPINGS_PATH";
9
+ export const BENCHMARK_MATCH_ANY_PROVIDER_ENV = "OCADVISOR_BENCHMARKS_MATCH_ANY_PROVIDER";
10
+ export const DEFAULT_SNAPSHOT_FILENAME = "artificial-analysis.json";
11
+ export const DEFAULT_MAPPINGS_FILENAME = "model-mappings.json";
12
+ export function defaultBenchmarkSnapshotPath(env = process.env, homeDir = homedir()) {
13
+ const xdg = env.XDG_DATA_HOME?.trim();
14
+ if (xdg && isAbsolute(xdg)) {
15
+ return join(xdg, "opencode/ocadvisor", DEFAULT_SNAPSHOT_FILENAME);
16
+ }
17
+ return join(homeDir, ".local/share/opencode/ocadvisor", DEFAULT_SNAPSHOT_FILENAME);
18
+ }
19
+ function selectAbsolutePath(field, candidates) {
20
+ for (const candidate of candidates) {
21
+ if (candidate === undefined || candidate === null)
22
+ continue;
23
+ if (typeof candidate !== "string") {
24
+ return { error: `${field} must be an absolute path` };
25
+ }
26
+ const trimmed = candidate.trim();
27
+ if (!trimmed)
28
+ continue;
29
+ if (!isAbsolute(trimmed)) {
30
+ return { error: `${field} must be an absolute path` };
31
+ }
32
+ return trimmed;
33
+ }
34
+ return { error: `${field} has no usable value` };
35
+ }
36
+ export function resolveBenchmarkPaths(explicit, env = process.env, homeDir = homedir()) {
37
+ if (explicit !== undefined && explicit !== null) {
38
+ if (typeof explicit !== "object" || Array.isArray(explicit)) {
39
+ return { error: "benchmarks must be an object with path options" };
40
+ }
41
+ }
42
+ const wanted = explicit ?? {};
43
+ const snapshotPath = selectAbsolutePath("benchmarks.path", [
44
+ wanted.path,
45
+ env[BENCHMARKS_PATH_ENV],
46
+ defaultBenchmarkSnapshotPath(env, homeDir),
47
+ ]);
48
+ if (typeof snapshotPath !== "string")
49
+ return snapshotPath;
50
+ const mappingsPath = selectAbsolutePath("benchmarks.mappingsPath", [
51
+ wanted.mappingsPath,
52
+ env[BENCHMARK_MAPPINGS_PATH_ENV],
53
+ join(dirname(snapshotPath), DEFAULT_MAPPINGS_FILENAME),
54
+ ]);
55
+ if (typeof mappingsPath !== "string")
56
+ return mappingsPath;
57
+ return { snapshotPath, mappingsPath };
58
+ }
59
+ //# sourceMappingURL=benchmarkConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmarkConfig.js","sourceRoot":"","sources":["../src/benchmarkConfig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { type MatchSource, type MatchStatus, type MetricComparison } from "./benchmarkMatch.js";
2
+ import type { BenchmarkView } from "./benchmarkStore.js";
3
+ import type { AdvisorProfile, RequesterProfile } from "./modelProfiles.js";
4
+ export interface CompactMatch {
5
+ status: MatchStatus;
6
+ source: MatchSource | null;
7
+ aaModelID: string | null;
8
+ evaluatedEffort: string | null;
9
+ }
10
+ export interface EvidenceModels {
11
+ requester: RequesterProfile;
12
+ advisor: AdvisorProfile;
13
+ }
14
+ export interface EvidenceBenchmarks {
15
+ source: "user" | "seed" | "unavailable";
16
+ fetchedAt: string | null;
17
+ ageDays: number | null;
18
+ contentHash: string | null;
19
+ hashVerified: boolean;
20
+ requesterMatch: CompactMatch;
21
+ advisorDefaultMatch: CompactMatch;
22
+ advisorCandidates: Array<{
23
+ effort: string | null;
24
+ } & CompactMatch>;
25
+ comparisons: MetricComparison[];
26
+ omitted: boolean;
27
+ }
28
+ export declare function buildBenchmarkEvidence(input: {
29
+ requester: RequesterProfile;
30
+ advisor: AdvisorProfile;
31
+ view: BenchmarkView;
32
+ nowMs?: number;
33
+ }): {
34
+ models: EvidenceModels;
35
+ benchmarks: EvidenceBenchmarks;
36
+ };
37
+ //# sourceMappingURL=benchmarkEvidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmarkEvidence.d.ts","sourceRoot":"","sources":["../src/benchmarkEvidence.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAI3E,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,OAAO,EAAE,cAAc,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC;IACxC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,YAAY,CAAC;IAC7B,mBAAmB,EAAE,YAAY,CAAC;IAClC,iBAAiB,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,YAAY,CAAC,CAAC;IACnE,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAEhC,OAAO,EAAE,OAAO,CAAC;CAClB;AAiCD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,SAAS,EAAE,gBAAgB,CAAC;IAC5B,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,UAAU,EAAE,kBAAkB,CAAA;CAAE,CAgD7D"}
@@ -0,0 +1,81 @@
1
+ // Gate evidence assembly: resolves both participants against one
2
+ // benchmark view and selects the shared comparison set. Comparisons always
3
+ // reflect the advisor's default effort (pinned, fallback, or fixed); every
4
+ // relevant candidate effort additionally reports its own match coverage so
5
+ // effort selection can weigh it. Scores stay attached to their evaluated
6
+ // effort and comparability reason — the gate judges, never recomputes.
7
+ import { compareBenchmarks, selectGateMetrics, } from "./benchmarkMatch.js";
8
+ const DAY_MS = 24 * 60 * 60 * 1000;
9
+ function compact(match) {
10
+ return {
11
+ status: match.status,
12
+ source: match.source,
13
+ aaModelID: match.aaModelID,
14
+ evaluatedEffort: match.evaluatedEffort,
15
+ };
16
+ }
17
+ function relevantEfforts(advisor) {
18
+ switch (advisor.policy.kind) {
19
+ case "pinned":
20
+ return [advisor.policy.effort];
21
+ case "candidates":
22
+ return [...advisor.policy.candidates];
23
+ case "fixed":
24
+ return [advisor.policy.effort];
25
+ }
26
+ }
27
+ function defaultEffort(advisor) {
28
+ switch (advisor.policy.kind) {
29
+ case "pinned":
30
+ return advisor.policy.effort;
31
+ case "candidates":
32
+ return advisor.policy.fallback;
33
+ case "fixed":
34
+ return advisor.policy.effort;
35
+ }
36
+ }
37
+ export function buildBenchmarkEvidence(input) {
38
+ const { requester, advisor, view } = input;
39
+ const requesterMatch = view.matcher.match({
40
+ providerID: requester.providerID ?? "",
41
+ modelID: requester.modelID ?? "",
42
+ variant: requester.variant,
43
+ });
44
+ const efforts = relevantEfforts(advisor);
45
+ const candidates = efforts.map((effort) => ({
46
+ effort,
47
+ ...compact(view.matcher.match({
48
+ providerID: advisor.providerID,
49
+ modelID: advisor.modelID,
50
+ variant: effort,
51
+ })),
52
+ }));
53
+ const fallback = defaultEffort(advisor);
54
+ const defaultMatch = view.matcher.match({
55
+ providerID: advisor.providerID,
56
+ modelID: advisor.modelID,
57
+ variant: fallback,
58
+ });
59
+ const snapshot = view.snapshot;
60
+ const fetchedAt = snapshot?.fetchedAt ?? null;
61
+ const nowMs = input.nowMs ?? Date.now();
62
+ const ageDays = fetchedAt === null || !Number.isFinite(Date.parse(fetchedAt))
63
+ ? null
64
+ : Math.max(0, Math.floor((nowMs - Date.parse(fetchedAt)) / DAY_MS));
65
+ return {
66
+ models: { requester, advisor },
67
+ benchmarks: {
68
+ source: view.snapshotSource,
69
+ fetchedAt,
70
+ ageDays,
71
+ contentHash: snapshot?.contentHash ?? null,
72
+ hashVerified: snapshot ? view.snapshotHashVerified : false,
73
+ requesterMatch: compact(requesterMatch),
74
+ advisorDefaultMatch: compact(defaultMatch),
75
+ advisorCandidates: candidates,
76
+ comparisons: selectGateMetrics(compareBenchmarks(requesterMatch, defaultMatch)),
77
+ omitted: false,
78
+ },
79
+ };
80
+ }
81
+ //# sourceMappingURL=benchmarkEvidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmarkEvidence.js","sourceRoot":"","sources":["../src/benchmarkEvidence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { type BenchmarkModel, type BenchmarkSnapshot, type BenchmarkValidationError, type MetricUnit } from "./benchmarkTypes.js";
2
+ export declare const BENCHMARK_MAPPINGS_SCHEMA_VERSION = 1;
3
+ export interface ModelBinding {
4
+ providerID: string;
5
+ modelID: string;
6
+ variant: string | null;
7
+ aaModelID: string;
8
+ evaluatedEffort: string | null;
9
+ evidenceURL: string;
10
+ }
11
+ export interface ModelMappings {
12
+ schemaVersion: 1;
13
+ bindings: ModelBinding[];
14
+ }
15
+ export interface ModelRef {
16
+ providerID: string;
17
+ modelID: string;
18
+ variant?: string | null;
19
+ }
20
+ export type MatchSource = "bundled" | "local";
21
+ export type MatchStatus = "matched" | "unmapped" | "missing_record" | "effort_unknown" | "unavailable";
22
+ export interface BenchmarkMatch {
23
+ status: MatchStatus;
24
+ source: MatchSource | null;
25
+ aaModelID: string | null;
26
+ record: BenchmarkModel | null;
27
+ evaluatedEffort: string | null;
28
+ }
29
+ export type ComparisonReason = "missing_requester" | "missing_advisor" | "effort_unknown" | "effort_mismatch" | null;
30
+ export interface MetricComparison {
31
+ key: string;
32
+ label: string;
33
+ unit: MetricUnit;
34
+ requester: number | null;
35
+ advisor: number | null;
36
+ advisorMinusRequester: number | null;
37
+ comparable: boolean;
38
+ reason: ComparisonReason;
39
+ }
40
+ export interface MergedBinding {
41
+ binding: ModelBinding;
42
+ source: MatchSource;
43
+ }
44
+ export declare function parseModelMappings(value: unknown): ModelMappings | BenchmarkValidationError;
45
+ export declare function compareBenchmarks(requester: BenchmarkMatch, advisor: BenchmarkMatch): MetricComparison[];
46
+ export declare function selectGateMetrics(comparisons: MetricComparison[]): MetricComparison[];
47
+ export interface BenchmarkMatcher {
48
+ match: (ref: ModelRef) => BenchmarkMatch;
49
+ compare: (requester: ModelRef, advisor: ModelRef) => MetricComparison[];
50
+ bindings: () => MergedBinding[];
51
+ }
52
+ export declare function createBenchmarkMatcher(input: {
53
+ snapshot: BenchmarkSnapshot | null;
54
+ bundled: ModelMappings;
55
+ local: ModelMappings | null;
56
+ matchAnyProvider?: boolean;
57
+ }): BenchmarkMatcher;
58
+ //# sourceMappingURL=benchmarkMatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmarkMatch.d.ts","sourceRoot":"","sources":["../src/benchmarkMatch.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,UAAU,EAChB,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,iCAAiC,IAAI,CAAC;AAOnD,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAEhB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAGlB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,CAAC,CAAC;IACjB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;AAC9C,MAAM,MAAM,WAAW,GACrB,SAAS,GAAG,UAAU,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,aAAa,CAAC;AAE/E,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,MAAM,gBAAgB,GACxB,mBAAmB,GACnB,iBAAiB,GACjB,gBAAgB,GAChB,iBAAiB,GACjB,IAAI,CAAC;AAET,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,WAAW,CAAC;CACrB;AA0CD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,GACb,aAAa,GAAG,wBAAwB,CAwD1C;AAWD,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,cAAc,GACtB,gBAAgB,EAAE,CA2CpB;AAKD,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,gBAAgB,EAAE,GAC9B,gBAAgB,EAAE,CAmBpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,cAAc,CAAC;IACzC,OAAO,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,KAAK,gBAAgB,EAAE,CAAC;IACxE,QAAQ,EAAE,MAAM,aAAa,EAAE,CAAC;CACjC;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnC,OAAO,EAAE,aAAa,CAAC;IACvB,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IAK5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GAAG,gBAAgB,CAgGnB"}
@@ -0,0 +1,259 @@
1
+ // Exact model-to-benchmark mapping and capability comparison. OpenCode
2
+ // model references map to stable Artificial Analysis IDs through explicit
3
+ // curated bindings only: no fuzzy names, no prefix stripping, no sibling
4
+ // substitution, and no assumed effort equivalence. Local bindings override
5
+ // bundled ones per tuple; comparisons carry oriented deltas plus an
6
+ // explicit reason whenever scores cannot be strictly compared.
7
+ import { GATE_METRIC_ORDER, RECOGNIZED_METRICS, } from "./benchmarkTypes.js";
8
+ export const BENCHMARK_MAPPINGS_SCHEMA_VERSION = 1;
9
+ const CODING_INDEX_KEY = "artificial_analysis_coding_index";
10
+ const INTELLIGENCE_INDEX_KEY = "artificial_analysis_intelligence_index";
11
+ // Both indexes plus at most two reasoning/math metrics with data.
12
+ const GATE_METRIC_LIMIT = 4;
13
+ function isRecord(value) {
14
+ return typeof value === "object" && value !== null && !Array.isArray(value);
15
+ }
16
+ function requiredId(value, field) {
17
+ const text = typeof value === "string" ? value.trim() : "";
18
+ if (!text)
19
+ return { error: `binding ${field} must be a non-empty string` };
20
+ return text;
21
+ }
22
+ function optionalId(value, field) {
23
+ if (value === undefined || value === null)
24
+ return null;
25
+ if (typeof value !== "string" || !value.trim()) {
26
+ return { error: `binding ${field} must be a non-empty string or null` };
27
+ }
28
+ return value.trim();
29
+ }
30
+ function bindingKey(parts) {
31
+ return JSON.stringify([parts.providerID, parts.modelID, parts.variant]);
32
+ }
33
+ function modelVariantKey(parts) {
34
+ return JSON.stringify([parts.modelID, parts.variant]);
35
+ }
36
+ export function parseModelMappings(value) {
37
+ if (!isRecord(value)) {
38
+ return { error: "model mappings must be an object" };
39
+ }
40
+ if (value.schemaVersion !== BENCHMARK_MAPPINGS_SCHEMA_VERSION) {
41
+ return {
42
+ error: `unsupported model mappings schema version ${String(value.schemaVersion)} (expected ${BENCHMARK_MAPPINGS_SCHEMA_VERSION})`,
43
+ };
44
+ }
45
+ if (!Array.isArray(value.bindings)) {
46
+ return { error: "model mappings bindings must be an array" };
47
+ }
48
+ const seen = new Set();
49
+ const bindings = [];
50
+ for (let index = 0; index < value.bindings.length; index++) {
51
+ const entry = value.bindings[index];
52
+ const label = `binding ${index}`;
53
+ if (!isRecord(entry))
54
+ return { error: `${label} must be an object` };
55
+ const providerID = requiredId(entry.providerID, "providerID");
56
+ if (typeof providerID !== "string")
57
+ return providerID;
58
+ const modelID = requiredId(entry.modelID, "modelID");
59
+ if (typeof modelID !== "string")
60
+ return modelID;
61
+ const variant = optionalId(entry.variant, "variant");
62
+ if (typeof variant !== "string" && variant !== null)
63
+ return variant;
64
+ const aaModelID = requiredId(entry.aaModelID, "aaModelID");
65
+ if (typeof aaModelID !== "string")
66
+ return aaModelID;
67
+ const evaluatedEffort = optionalId(entry.evaluatedEffort, "evaluatedEffort");
68
+ if (typeof evaluatedEffort !== "string" && evaluatedEffort !== null) {
69
+ return evaluatedEffort;
70
+ }
71
+ const evidenceURL = typeof entry.evidenceURL === "string" ? entry.evidenceURL.trim() : "";
72
+ if (!/^https?:\/\/.+/.test(evidenceURL)) {
73
+ return { error: `${label} needs an http(s) evidenceURL` };
74
+ }
75
+ const binding = {
76
+ providerID,
77
+ modelID,
78
+ variant,
79
+ aaModelID,
80
+ evaluatedEffort,
81
+ evidenceURL,
82
+ };
83
+ const key = bindingKey(binding);
84
+ if (seen.has(key)) {
85
+ return {
86
+ error: `duplicate binding for ${providerID}/${modelID}#${variant ?? "(unset)"}`,
87
+ };
88
+ }
89
+ seen.add(key);
90
+ bindings.push(binding);
91
+ }
92
+ return { schemaVersion: BENCHMARK_MAPPINGS_SCHEMA_VERSION, bindings };
93
+ }
94
+ function finiteOrNull(value) {
95
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
96
+ }
97
+ function metricDefinition(key) {
98
+ const found = RECOGNIZED_METRICS.find((metric) => metric.key === key);
99
+ return { label: found?.label ?? key, unit: found?.unit ?? "index_points" };
100
+ }
101
+ export function compareBenchmarks(requester, advisor) {
102
+ // Pair-level verdict first: without both records, or without compatible
103
+ // evaluated efforts, no metric can be strictly compared. Per-metric
104
+ // reasons below only refine the comparable case.
105
+ let pairReason = null;
106
+ if (!requester.record) {
107
+ pairReason = "missing_requester";
108
+ }
109
+ else if (!advisor.record) {
110
+ pairReason = "missing_advisor";
111
+ }
112
+ else if (requester.status === "effort_unknown" ||
113
+ advisor.status === "effort_unknown") {
114
+ pairReason = "effort_unknown";
115
+ }
116
+ else if (requester.evaluatedEffort !== advisor.evaluatedEffort) {
117
+ pairReason = "effort_mismatch";
118
+ }
119
+ return GATE_METRIC_ORDER.map((key) => {
120
+ const requesterScore = finiteOrNull(requester.record?.evaluations[key]);
121
+ const advisorScore = finiteOrNull(advisor.record?.evaluations[key]);
122
+ let reason = pairReason;
123
+ if (reason === null) {
124
+ if (requesterScore === null) {
125
+ reason = "missing_requester";
126
+ }
127
+ else if (advisorScore === null) {
128
+ reason = "missing_advisor";
129
+ }
130
+ }
131
+ // All recognized v1 metrics are higher-is-better, so a positive delta
132
+ // always favors the advisor. Revisit if a lower-is-better metric lands.
133
+ const definition = metricDefinition(key);
134
+ return {
135
+ key,
136
+ label: definition.label,
137
+ unit: definition.unit,
138
+ requester: requesterScore,
139
+ advisor: advisorScore,
140
+ advisorMinusRequester: reason === null ? advisorScore - requesterScore : null,
141
+ comparable: reason === null,
142
+ reason,
143
+ };
144
+ });
145
+ }
146
+ // Shared payload selection: both indexes always (nulls mark missing
147
+ // coverage), plus the first two reasoning/math metrics with any data, in
148
+ // deterministic gate order.
149
+ export function selectGateMetrics(comparisons) {
150
+ const byKey = new Map(comparisons.map((entry) => [entry.key, entry]));
151
+ const selected = [];
152
+ for (const key of [CODING_INDEX_KEY, INTELLIGENCE_INDEX_KEY]) {
153
+ const entry = byKey.get(key);
154
+ if (entry)
155
+ selected.push(entry);
156
+ }
157
+ for (const key of GATE_METRIC_ORDER) {
158
+ if (selected.length >= GATE_METRIC_LIMIT)
159
+ break;
160
+ if (key === CODING_INDEX_KEY || key === INTELLIGENCE_INDEX_KEY)
161
+ continue;
162
+ const entry = byKey.get(key);
163
+ if (entry &&
164
+ (typeof entry.requester === "number" || typeof entry.advisor === "number")) {
165
+ selected.push(entry);
166
+ }
167
+ }
168
+ return selected;
169
+ }
170
+ export function createBenchmarkMatcher(input) {
171
+ const merged = new Map();
172
+ for (const binding of input.bundled.bindings) {
173
+ merged.set(bindingKey(binding), { binding, source: "bundled" });
174
+ }
175
+ for (const binding of input.local?.bindings ?? []) {
176
+ merged.set(bindingKey(binding), { binding, source: "local" });
177
+ }
178
+ // Secondary index keyed by model id + variant. Merged insertion order is
179
+ // bundled then local, so a local binding already replaces the bundled one
180
+ // for the same tuple; across providers the local entry still wins when
181
+ // walked in this order.
182
+ const byModel = new Map();
183
+ for (const entry of merged.values()) {
184
+ const key = modelVariantKey(entry.binding);
185
+ const current = byModel.get(key);
186
+ if (!current || (current.source === "bundled" && entry.source === "local")) {
187
+ byModel.set(key, entry);
188
+ }
189
+ }
190
+ const records = new Map();
191
+ for (const model of input.snapshot?.models ?? []) {
192
+ records.set(model.id, model);
193
+ }
194
+ const match = (ref) => {
195
+ const exact = merged.get(bindingKey({
196
+ providerID: ref.providerID,
197
+ modelID: ref.modelID,
198
+ variant: ref.variant ?? null,
199
+ }));
200
+ const found = exact ??
201
+ (input.matchAnyProvider
202
+ ? byModel.get(modelVariantKey({
203
+ providerID: ref.providerID,
204
+ modelID: ref.modelID,
205
+ variant: ref.variant ?? null,
206
+ }))
207
+ : undefined);
208
+ if (!found) {
209
+ return {
210
+ status: "unmapped",
211
+ source: null,
212
+ aaModelID: null,
213
+ record: null,
214
+ evaluatedEffort: null,
215
+ };
216
+ }
217
+ if (!input.snapshot) {
218
+ return {
219
+ status: "unavailable",
220
+ source: found.source,
221
+ aaModelID: found.binding.aaModelID,
222
+ record: null,
223
+ evaluatedEffort: found.binding.evaluatedEffort,
224
+ };
225
+ }
226
+ const record = records.get(found.binding.aaModelID) ?? null;
227
+ if (!record) {
228
+ return {
229
+ status: "missing_record",
230
+ source: found.source,
231
+ aaModelID: found.binding.aaModelID,
232
+ record: null,
233
+ evaluatedEffort: found.binding.evaluatedEffort,
234
+ };
235
+ }
236
+ if (found.binding.evaluatedEffort === null) {
237
+ return {
238
+ status: "effort_unknown",
239
+ source: found.source,
240
+ aaModelID: found.binding.aaModelID,
241
+ record,
242
+ evaluatedEffort: null,
243
+ };
244
+ }
245
+ return {
246
+ status: "matched",
247
+ source: found.source,
248
+ aaModelID: found.binding.aaModelID,
249
+ record,
250
+ evaluatedEffort: found.binding.evaluatedEffort,
251
+ };
252
+ };
253
+ return {
254
+ match,
255
+ compare: (requester, advisor) => compareBenchmarks(match(requester), match(advisor)),
256
+ bindings: () => [...merged.values()],
257
+ };
258
+ }
259
+ //# sourceMappingURL=benchmarkMatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmarkMatch.js","sourceRoot":"","sources":["../src/benchmarkMatch.ts"],"names":[],"mappings":"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"}