pi-harness-runtime 1.1.385 → 1.1.387

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 (147) hide show
  1. package/index.ts +42 -24
  2. package/package.json +3 -2
  3. package/packages/a2a-adapter/package.json +1 -1
  4. package/packages/agent-policy/package.json +1 -1
  5. package/packages/architecture-generator/package.json +1 -1
  6. package/packages/auth/package.json +1 -1
  7. package/packages/autonomous-refactor/package.json +1 -1
  8. package/packages/autonomous-runtime/package.json +1 -1
  9. package/packages/cache-strategy/package.json +1 -1
  10. package/packages/capability-registry/package.json +1 -1
  11. package/packages/checkpoint/package.json +1 -1
  12. package/packages/cli-plugin-sdk/package.json +1 -1
  13. package/packages/clipboard/package.json +1 -1
  14. package/packages/clipboard-plugin/package.json +1 -1
  15. package/packages/code-generation/package.json +1 -1
  16. package/packages/code-review/package.json +1 -1
  17. package/packages/codex-adapter/package.json +1 -1
  18. package/packages/codex-watcher/package.json +1 -1
  19. package/packages/config-capture/package.json +1 -1
  20. package/packages/connection-runtime/package.json +1 -1
  21. package/packages/context-compiler/package.json +1 -1
  22. package/packages/context-discovery/package.json +1 -1
  23. package/packages/context-manager/package.json +1 -1
  24. package/packages/contracts/package.json +1 -1
  25. package/packages/cookie-sanitizer/package.json +1 -1
  26. package/packages/cost-optimizer/package.json +1 -1
  27. package/packages/dependency-analyzer/package.json +1 -1
  28. package/packages/django-plugin/package.json +1 -1
  29. package/packages/doc-generator/package.json +1 -1
  30. package/packages/durable-review/package.json +1 -1
  31. package/packages/e2e-tester/package.json +1 -1
  32. package/packages/evaluation-engine/package.json +1 -1
  33. package/packages/evaluation-runner/package.json +1 -1
  34. package/packages/event-bus/package.json +1 -1
  35. package/packages/event-sink/package.json +1 -1
  36. package/packages/event-store/package.json +1 -1
  37. package/packages/experience-replay/package.json +1 -1
  38. package/packages/feedback-collector/package.json +1 -1
  39. package/packages/file-copy-helper/package.json +1 -1
  40. package/packages/framework-detector/package.json +1 -1
  41. package/packages/framework-plugin-sdk/package.json +1 -1
  42. package/packages/frappe-plugin/package.json +1 -1
  43. package/packages/generic-web-plugin/package.json +1 -1
  44. package/packages/health-monitor/package.json +1 -1
  45. package/packages/intent-analyzer/package.json +1 -1
  46. package/packages/jev-judge/dist/auto-continue.d.ts.map +1 -1
  47. package/packages/jev-judge/dist/auto-continue.js +26 -0
  48. package/packages/jev-judge/dist/auto-continue.js.map +1 -1
  49. package/packages/jev-judge/dist/environment-judge.d.ts.map +1 -1
  50. package/packages/jev-judge/dist/environment-judge.js +7 -4
  51. package/packages/jev-judge/dist/environment-judge.js.map +1 -1
  52. package/packages/jev-judge/dist/index.d.ts +87 -12
  53. package/packages/jev-judge/dist/index.d.ts.map +1 -1
  54. package/packages/jev-judge/dist/index.js +291 -75
  55. package/packages/jev-judge/dist/index.js.map +1 -1
  56. package/packages/jev-judge/dist/provider-error.d.ts +61 -0
  57. package/packages/jev-judge/dist/provider-error.d.ts.map +1 -0
  58. package/packages/jev-judge/dist/provider-error.js +165 -0
  59. package/packages/jev-judge/dist/provider-error.js.map +1 -0
  60. package/packages/jev-judge/dist/task-intake.d.ts.map +1 -1
  61. package/packages/jev-judge/dist/task-intake.js +3 -2
  62. package/packages/jev-judge/dist/task-intake.js.map +1 -1
  63. package/packages/jev-judge/dist/types.d.ts +56 -2
  64. package/packages/jev-judge/dist/types.d.ts.map +1 -1
  65. package/packages/jev-judge/dist/typesafe-provider.d.ts +26 -1
  66. package/packages/jev-judge/dist/typesafe-provider.d.ts.map +1 -1
  67. package/packages/jev-judge/dist/typesafe-provider.js +153 -62
  68. package/packages/jev-judge/dist/typesafe-provider.js.map +1 -1
  69. package/packages/jev-judge/dist/typesafe-request.d.ts +65 -0
  70. package/packages/jev-judge/dist/typesafe-request.d.ts.map +1 -0
  71. package/packages/jev-judge/dist/typesafe-request.js +138 -0
  72. package/packages/jev-judge/dist/typesafe-request.js.map +1 -0
  73. package/packages/jev-judge/package.json +1 -1
  74. package/packages/jev-judge/src/auto-continue.ts +26 -0
  75. package/packages/jev-judge/src/environment-judge.ts +7 -4
  76. package/packages/jev-judge/src/index.ts +617 -333
  77. package/packages/jev-judge/src/provider-error.ts +190 -0
  78. package/packages/jev-judge/src/task-intake.ts +3 -2
  79. package/packages/jev-judge/src/types.ts +62 -5
  80. package/packages/jev-judge/src/typesafe-provider.ts +452 -318
  81. package/packages/jev-judge/src/typesafe-request.ts +181 -0
  82. package/packages/jev-judge/tests/jev-provider-chain.test.ts +536 -0
  83. package/packages/jev-judge/tests/typesafe-provider.test.ts +504 -44
  84. package/packages/knowledge-graph/package.json +1 -1
  85. package/packages/knowledge-retrieval/package.json +1 -1
  86. package/packages/laravel-plugin/package.json +1 -1
  87. package/packages/learning-engine/package.json +1 -1
  88. package/packages/mcp-adapter/package.json +1 -1
  89. package/packages/memory-engine/package.json +1 -1
  90. package/packages/milestone-manager/package.json +1 -1
  91. package/packages/model-registry/package.json +1 -1
  92. package/packages/nextjs-plugin/package.json +1 -1
  93. package/packages/notification/package.json +1 -1
  94. package/packages/observability/package.json +1 -1
  95. package/packages/okf-indexer/package.json +1 -1
  96. package/packages/paperclip-integration/package.json +1 -1
  97. package/packages/performance-optimizer/package.json +1 -1
  98. package/packages/permission-mode/package.json +1 -1
  99. package/packages/privilege-broker/package.json +1 -1
  100. package/packages/project-analyzer/package.json +1 -1
  101. package/packages/project-bootstrap/package.json +1 -1
  102. package/packages/projection-engine/package.json +1 -1
  103. package/packages/prompt-compiler/package.json +1 -1
  104. package/packages/prompt-versioning/package.json +1 -1
  105. package/packages/provider-adapter-sdk/package.json +1 -1
  106. package/packages/provider-router/package.json +1 -1
  107. package/packages/provider-selector/package.json +1 -1
  108. package/packages/providers/package.json +1 -1
  109. package/packages/qdrant-skills/package.json +1 -1
  110. package/packages/quota-manager/package.json +1 -1
  111. package/packages/rate-limiter/package.json +1 -1
  112. package/packages/react-vite-plugin/package.json +1 -1
  113. package/packages/relay/package.json +1 -1
  114. package/packages/release-manager/package.json +1 -1
  115. package/packages/requirement-compiler/package.json +1 -1
  116. package/packages/runtime/package.json +1 -1
  117. package/packages/scheduler/package.json +1 -1
  118. package/packages/scheduler-adapter/package.json +1 -1
  119. package/packages/session/package.json +1 -1
  120. package/packages/session-api/package.json +1 -1
  121. package/packages/session-export/package.json +1 -1
  122. package/packages/shared-context/package.json +1 -1
  123. package/packages/skill-mcp-client/package.json +1 -1
  124. package/packages/skill-registry/package.json +1 -1
  125. package/packages/skills/package.json +1 -1
  126. package/packages/sprint-planner/package.json +1 -1
  127. package/packages/subscription-engine/package.json +1 -1
  128. package/packages/task-compiler/package.json +1 -1
  129. package/packages/telegram/package.json +1 -1
  130. package/packages/tencentdb-memory/package.json +1 -1
  131. package/packages/tencentdb-sync/package.json +1 -1
  132. package/packages/test-data-generator/package.json +1 -1
  133. package/packages/test-generator/package.json +1 -1
  134. package/packages/todo-bd-sync/package.json +1 -1
  135. package/packages/token-estimation/package.json +1 -1
  136. package/packages/token-optimizer/package.json +1 -1
  137. package/packages/trajectory/package.json +1 -1
  138. package/packages/tui/package.json +1 -1
  139. package/packages/types/package.json +1 -1
  140. package/packages/voice-api/package.json +1 -1
  141. package/packages/webmcp-tester/package.json +1 -1
  142. package/packages/wiki/package.json +1 -1
  143. package/packages/workflow-events/package.json +1 -1
  144. package/packages/workspace-scanner/package.json +1 -1
  145. package/packages/worktree/package.json +1 -1
  146. package/packages/write-review/package.json +1 -1
  147. package/scripts/run-root-tests.mjs +207 -0
@@ -6,12 +6,17 @@
6
6
  * - Primary: TypeSafe direct API (https://api.typesafe.ai/v1/systemone)
7
7
  * - Fallback: OpenRouter API (https://openrouter.ai/api/v1)
8
8
  *
9
+ * Every credential is bound to its own provider: a TypeSafe key is only ever
10
+ * sent to the TypeSafe API and an OpenRouter key only to OpenRouter. The
11
+ * fallback is explicit - the next provider is only used when the previous one
12
+ * failed with a retryable error.
13
+ *
9
14
  * @example
10
15
  * ```typescript
11
- * import { JevJudge } from "@pi-harness/jev-judge";
16
+ * import { JevJudge, resolveJevProviders } from "@pi-harness/jev-judge";
12
17
  *
13
- * // Auto-detects TypeSafe vs OpenRouter based on API key and baseUrl
14
- * const judge = new JevJudge({ apiKey: process.env.TYPESAFE_API_KEY! });
18
+ * // Provider chain built from the environment / key files
19
+ * const judge = new JevJudge({ providers: resolveJevProviders() });
15
20
  *
16
21
  * // Ask multiple questions at once
17
22
  * const result = await judge.evaluate(
@@ -29,10 +34,13 @@
29
34
  * console.log(result.decisions.isUrgent.noul); // 0.92
30
35
  * ```
31
36
  */
37
+ import { existsSync, readFileSync } from "node:fs";
32
38
  // OpenAI SDK (OpenRouter is OpenAI-compatible)
33
39
  // @ts-ignore - openai is installed at workspace root
34
40
  import OpenAI from "openai";
35
- import { TypeSafeJudge } from "./typesafe-provider.js";
41
+ import { TypeSafeJudge, providerForBaseUrl } from "./typesafe-provider.js";
42
+ import { toProviderError, JevProviderError } from "./provider-error.js";
43
+ import { logError } from "./file-logger.js";
36
44
  /**
37
45
  * Environment variable keys for API keys
38
46
  */
@@ -40,72 +48,156 @@ export const ENV_KEYS = {
40
48
  TYPESAFE_API_KEY: "TYPESAFE_API_KEY",
41
49
  OPENROUTER_API_KEY: "OPENROUTER_API_KEY",
42
50
  };
51
+ /** Default TypeSafe endpoint. */
52
+ export const TYPESAFE_BASE_URL = "https://api.typesafe.ai";
53
+ /** Default TypeSafe model (an alias served by the System One models). */
54
+ export const TYPESAFE_DEFAULT_MODEL = "jev-latest";
55
+ /** Default OpenRouter endpoint. */
56
+ export const OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1";
57
+ /**
58
+ * Default OpenRouter model.
59
+ *
60
+ * `typesafe/jev-router` is the only TypeSafe model published on OpenRouter;
61
+ * the previous default ("typesafe/systemone") is not in the catalog.
62
+ */
63
+ export const OPENROUTER_DEFAULT_MODEL = "typesafe/jev-router";
64
+ /**
65
+ * The prefix of an OpenRouter key.
66
+ *
67
+ * Used to bind the LEGACY key file (jev-api-key.txt) to the right provider:
68
+ * that file has historically held both kinds of key, and binding it blindly
69
+ * to TypeSafe would send an OpenRouter key to the TypeSafe API.
70
+ */
71
+ const OPENROUTER_KEY_PREFIX = "sk-or-";
72
+ /**
73
+ * True when the key looks like an OpenRouter key.
74
+ */
75
+ export function looksLikeOpenRouterKey(apiKey) {
76
+ return apiKey.trim().startsWith(OPENROUTER_KEY_PREFIX);
77
+ }
43
78
  /**
44
- * Get API key from environment or keys file
45
- * Priority: TYPESAFE_API_KEY env > OPENROUTER_API_KEY env > keys file
79
+ * Get the API key of the FIRST configured provider.
80
+ *
81
+ * The order is TypeSafe first, then OpenRouter. The returned key is NOT
82
+ * bound to a provider by this function - use `resolveJevProviders()` to get
83
+ * a provider chain where every credential belongs to its own endpoint.
84
+ *
85
+ * @deprecated Prefer `resolveJevProviders()`.
46
86
  */
47
87
  export function getApiKeyFromEnv() {
48
- // First check environment variables
49
- const envKey = process.env[ENV_KEYS.TYPESAFE_API_KEY] ||
50
- process.env[ENV_KEYS.OPENROUTER_API_KEY];
51
- if (envKey)
52
- return envKey;
53
- // Fall back to keys file (e.g., ~/.pi-harness-runtime/keys/jev-api-key.txt)
88
+ const providers = resolveJevProviders();
89
+ return providers[0]?.apiKey;
90
+ }
91
+ /**
92
+ * Resolve the provider chain from the environment and the key files.
93
+ *
94
+ * A provider is only included when its OWN credential is available:
95
+ * - TypeSafe: TYPESAFE_API_KEY, or the key file typesafe-api-key.txt
96
+ * - OpenRouter: OPENROUTER_API_KEY, or the key file openrouter-api-key.txt
97
+ *
98
+ * The legacy key file jev-api-key.txt is bound by the shape of the key it
99
+ * holds: an "sk-or-" key is an OpenRouter key, everything else is treated as
100
+ * a TypeSafe key. It is never sent to the wrong endpoint.
101
+ *
102
+ * The credentials are never crossed: the TypeSafe key is never sent to
103
+ * OpenRouter and the OpenRouter key is never sent to TypeSafe.
104
+ */
105
+ export function resolveJevProviders(options) {
106
+ const env = options?.env ?? process.env;
107
+ const keysDir = options?.keysDir ?? defaultKeysDir();
108
+ const providers = [];
109
+ // The legacy key file holds whichever key the user put there. It is bound
110
+ // by the SHAPE of the key (an "sk-or-" key is an OpenRouter key) and it is
111
+ // only used for a provider that has no credential of its own yet.
112
+ const legacyKey = readKeyFile(keysDir, "jev-api-key.txt");
113
+ const legacyIsOpenRouter = legacyKey ? looksLikeOpenRouterKey(legacyKey) : false;
114
+ const legacyKeyFor = (provider) => {
115
+ if (!legacyKey)
116
+ return undefined;
117
+ const isOpenRouter = provider === "openrouter";
118
+ return legacyIsOpenRouter === isOpenRouter ? legacyKey : undefined;
119
+ };
120
+ const typesafeKey = firstNonEmpty(env[ENV_KEYS.TYPESAFE_API_KEY], readKeyFile(keysDir, "typesafe-api-key.txt"), legacyKeyFor("typesafe"));
121
+ if (typesafeKey) {
122
+ providers.push({
123
+ provider: "typesafe",
124
+ apiKey: typesafeKey,
125
+ baseUrl: env["TYPESAFE_BASE_URL"]?.trim() || TYPESAFE_BASE_URL,
126
+ model: env["TYPESAFE_MODEL"]?.trim() || TYPESAFE_DEFAULT_MODEL,
127
+ });
128
+ }
129
+ const openrouterKey = firstNonEmpty(env[ENV_KEYS.OPENROUTER_API_KEY], readKeyFile(keysDir, "openrouter-api-key.txt"), legacyKeyFor("openrouter"));
130
+ if (openrouterKey) {
131
+ providers.push({
132
+ provider: "openrouter",
133
+ apiKey: openrouterKey,
134
+ baseUrl: env["OPENROUTER_BASE_URL"]?.trim() || OPENROUTER_BASE_URL,
135
+ model: env["OPENROUTER_MODEL"]?.trim() || OPENROUTER_DEFAULT_MODEL,
136
+ });
137
+ }
138
+ return providers;
139
+ }
140
+ function firstNonEmpty(...values) {
141
+ for (const value of values) {
142
+ const trimmed = value?.trim();
143
+ if (trimmed)
144
+ return trimmed;
145
+ }
146
+ return undefined;
147
+ }
148
+ function defaultKeysDir() {
54
149
  const homedir = process.env.HOME || process.env.USERPROFILE || "/home/frappe";
55
- const keysDir = `${homedir}/.pi-harness-runtime/keys`;
56
- const keyFile = `${keysDir}/jev-api-key.txt`;
150
+ return `${homedir}/.pi-harness-runtime/keys`;
151
+ }
152
+ function readKeyFile(keysDir, name) {
57
153
  try {
58
- const { readFileSync, existsSync, mkdirSync } = require("fs");
59
- // Auto-create directory if doesn't exist
60
- if (!existsSync(keysDir)) {
61
- mkdirSync(keysDir, { recursive: true });
62
- }
63
- if (existsSync(keyFile)) {
64
- const key = readFileSync(keyFile, "utf8").trim();
65
- if (key && key.length > 10) {
66
- return key;
67
- }
68
- }
154
+ const path = `${keysDir}/${name}`;
155
+ if (!existsSync(path))
156
+ return undefined;
157
+ const key = readFileSync(path, "utf8").trim();
158
+ return key.length > 10 ? key : undefined;
69
159
  }
70
160
  catch {
71
- // Ignore file/directory errors
161
+ return undefined;
72
162
  }
73
- return undefined;
74
163
  }
75
164
  /**
76
- * Check if Jev API key is available
165
+ * Check if a Jev API key is available
77
166
  */
78
167
  export function hasJevApiKey() {
79
- return !!getApiKeyFromEnv();
168
+ return resolveJevProviders().length > 0;
80
169
  }
81
170
  /**
82
- * Create JevJudge with auto-detected API key from environment
171
+ * Create JevJudge with the provider chain resolved from the environment
83
172
  */
84
173
  export function createJevJudge(config) {
85
- const apiKey = getApiKeyFromEnv();
86
- if (!apiKey) {
87
- throw new Error(`Jev API key not found. Set TYPESAFE_API_KEY run: echo "{api_key}" > ~/.pi-harness-runtime/keys/jev-api-key.txt`);
174
+ const providers = resolveJevProviders();
175
+ if (providers.length === 0) {
176
+ throw new Error(`Jev API key not found. Set TYPESAFE_API_KEY (or OPENROUTER_API_KEY), or write the key to ~/.pi-harness-runtime/keys/typesafe-api-key.txt (or openrouter-api-key.txt)`);
88
177
  }
89
- return new JevJudge({ apiKey, ...config });
178
+ return new JevJudge({ ...config, providers: config?.providers ?? providers });
90
179
  }
91
180
  /**
92
181
  * Default configuration
93
182
  */
94
183
  const DEFAULT_CONFIG = {
95
- baseUrl: "https://api.typesafe.ai", // TypeSafe direct API as default
96
- model: "typesafe/systemone",
97
184
  defaultThreshold: 0.7,
98
185
  timeoutMs: 30000,
99
186
  };
100
187
  /**
101
- * Detect provider from baseUrl
188
+ * The identity of a provider entry.
189
+ *
190
+ * The clients are cached per provider IDENTITY, not per base URL: two
191
+ * entries may share an endpoint but use different credentials, and reusing
192
+ * the first client would send its key to the second entry.
102
193
  */
103
- function detectProvider(baseUrl) {
104
- if (baseUrl.includes("typesafe.ai"))
105
- return "typesafe";
106
- if (baseUrl.includes("openrouter"))
107
- return "openrouter";
108
- return "openrouter"; // Default to OpenRouter for backwards compatibility
194
+ function providerCacheKey(provider) {
195
+ return [
196
+ provider.provider,
197
+ provider.baseUrl,
198
+ provider.model,
199
+ provider.apiKey,
200
+ ].join("|");
109
201
  }
110
202
  /**
111
203
  * JevJudge - Main class for making structured decisions with Jev
@@ -115,49 +207,130 @@ function detectProvider(baseUrl) {
115
207
  * - OpenRouter API (fallback for backwards compatibility)
116
208
  */
117
209
  export class JevJudge {
118
- typesafeJudge;
119
- openrouterClient;
120
210
  config;
121
- provider;
211
+ providers;
212
+ typesafeJudges = new Map();
213
+ openrouterClients = new Map();
122
214
  constructor(config) {
123
215
  this.config = {
124
- ...DEFAULT_CONFIG,
125
- ...config,
216
+ defaultThreshold: config.defaultThreshold ?? DEFAULT_CONFIG.defaultThreshold,
217
+ timeoutMs: config.timeoutMs ?? DEFAULT_CONFIG.timeoutMs,
218
+ baseUrl: config.baseUrl,
219
+ model: config.model,
220
+ apiKey: config.apiKey,
126
221
  };
127
- this.provider = detectProvider(this.config.baseUrl);
128
- if (this.provider === "typesafe") {
129
- // Use TypeSafe direct API
130
- this.typesafeJudge = new TypeSafeJudge({
131
- apiKey: this.config.apiKey,
132
- baseUrl: this.config.baseUrl,
133
- timeoutMs: this.config.timeoutMs,
134
- });
222
+ this.providers = this.resolveProviders(config);
223
+ if (this.providers.length === 0) {
224
+ throw new Error("Jev: no usable provider configured. Every provider needs a non-empty apiKey.");
135
225
  }
136
- else {
137
- // Use OpenRouter
138
- this.openrouterClient = new OpenAI({
139
- apiKey: this.config.apiKey,
140
- baseURL: this.config.baseUrl,
141
- timeout: this.config.timeoutMs,
142
- });
226
+ }
227
+ /**
228
+ * Build the provider chain.
229
+ *
230
+ * An explicit chain is used as-is. Otherwise the legacy single provider
231
+ * configuration is turned into a one element chain; the credential then
232
+ * belongs to the caller, who has to pass the matching baseUrl.
233
+ */
234
+ resolveProviders(config) {
235
+ if (config.providers && config.providers.length > 0) {
236
+ const usable = config.providers.filter((provider) => Boolean(provider.apiKey?.trim()));
237
+ for (const dropped of config.providers) {
238
+ if (!dropped.apiKey?.trim()) {
239
+ logError("[JevJudge]", `Provider ${dropped.provider} has an empty apiKey and was dropped from the chain`);
240
+ }
241
+ }
242
+ return usable;
143
243
  }
244
+ if (!config.apiKey) {
245
+ throw new Error("Jev: no provider configured. Pass `providers` (see resolveJevProviders) or a legacy `apiKey`.");
246
+ }
247
+ // The legacy path cannot ask which endpoint the key belongs to, so an
248
+ // OpenRouter key without an explicit baseUrl is refused instead of
249
+ // being sent to the TypeSafe API.
250
+ if (!config.baseUrl && looksLikeOpenRouterKey(config.apiKey)) {
251
+ throw new Error("Jev: the key looks like an OpenRouter key. Pass `baseUrl: \"https://openrouter.ai/api/v1\"` or a provider chain (resolveJevProviders()) so the credential is not sent to the wrong endpoint.");
252
+ }
253
+ const baseUrl = config.baseUrl ?? TYPESAFE_BASE_URL;
254
+ const provider = providerForBaseUrl(baseUrl);
255
+ return [
256
+ {
257
+ provider,
258
+ apiKey: config.apiKey,
259
+ baseUrl,
260
+ model: config.model ??
261
+ (provider === "typesafe" ? TYPESAFE_DEFAULT_MODEL : OPENROUTER_DEFAULT_MODEL),
262
+ },
263
+ ];
144
264
  }
145
265
  /**
146
266
  * Evaluate state against questions
147
267
  *
268
+ * The provider chain is tried in order. The next provider is only used
269
+ * when the previous one failed with a retryable error (network, timeout,
270
+ * rate limit, auth, 5xx). A request contract error is never retried on
271
+ * another provider: it is a bug that has to stay visible.
272
+ *
148
273
  * @param state - The context/situation to evaluate (text or structured)
149
274
  * @param questions - Map of question_id -> question definition
150
275
  * @returns Evaluation result with decisions
151
276
  */
152
277
  async evaluate(state, questions) {
153
- // Use TypeSafe provider if configured
154
- if (this.provider === "typesafe" && this.typesafeJudge) {
155
- return this.typesafeJudge.evaluate(state, questions);
156
- }
157
- // Fall back to OpenRouter
158
- if (!this.openrouterClient) {
278
+ if (this.providers.length === 0) {
159
279
  throw new Error("No Jev provider configured");
160
280
  }
281
+ let lastError;
282
+ for (let i = 0; i < this.providers.length; i++) {
283
+ const provider = this.providers[i];
284
+ try {
285
+ const result = provider.provider === "typesafe"
286
+ ? await this.evaluateWithTypeSafe(provider, state, questions)
287
+ : await this.evaluateWithOpenRouter(provider, state, questions);
288
+ return { ...result, provider: provider.provider };
289
+ }
290
+ catch (error) {
291
+ const providerError = toProviderError(error, provider.provider);
292
+ lastError = providerError;
293
+ const isLast = i === this.providers.length - 1;
294
+ if (!providerError.retryable || isLast) {
295
+ throw providerError;
296
+ }
297
+ logError("[JevJudge]", `Provider ${provider.provider} failed (${providerError.message}); trying the next provider`);
298
+ }
299
+ }
300
+ throw lastError ?? new Error("No Jev provider configured");
301
+ }
302
+ evaluateWithTypeSafe(provider, state, questions) {
303
+ const cacheKey = providerCacheKey(provider);
304
+ let judge = this.typesafeJudges.get(cacheKey);
305
+ if (!judge) {
306
+ judge = new TypeSafeJudge({
307
+ apiKey: provider.apiKey,
308
+ baseUrl: provider.baseUrl,
309
+ model: provider.model,
310
+ timeoutMs: this.config.timeoutMs,
311
+ });
312
+ this.typesafeJudges.set(cacheKey, judge);
313
+ }
314
+ return judge.evaluate(state, questions);
315
+ }
316
+ /**
317
+ * Evaluate through OpenRouter.
318
+ *
319
+ * OpenRouter is an OpenAI compatible endpoint, so the questions are
320
+ * asked as a prompt and the answer is parsed as JSON. This path has its
321
+ * own contract and does not use the TypeSafe request format.
322
+ */
323
+ async evaluateWithOpenRouter(provider, state, questions) {
324
+ const cacheKey = providerCacheKey(provider);
325
+ let client = this.openrouterClients.get(cacheKey);
326
+ if (!client) {
327
+ client = new OpenAI({
328
+ apiKey: provider.apiKey,
329
+ baseURL: provider.baseUrl,
330
+ timeout: this.config.timeoutMs,
331
+ });
332
+ this.openrouterClients.set(cacheKey, client);
333
+ }
161
334
  const startTime = Date.now();
162
335
  // Convert state to string if object
163
336
  const stateStr = typeof state === "string" ? state : JSON.stringify(state);
@@ -172,7 +345,10 @@ export class JevJudge {
172
345
  else if (questionObj.type === "choice") {
173
346
  entry.type = "choice";
174
347
  entry.instructions = questionObj.instructions;
175
- entry.options = questionObj.options;
348
+ entry.options = choiceNames(questionObj);
349
+ const descriptions = choiceDescriptions(questionObj);
350
+ if (descriptions)
351
+ entry.descriptions = descriptions;
176
352
  }
177
353
  else if (questionObj.type === "score") {
178
354
  entry.type = "score";
@@ -181,12 +357,14 @@ export class JevJudge {
181
357
  entry.min = questionObj.min;
182
358
  if (questionObj.max !== undefined)
183
359
  entry.max = questionObj.max;
360
+ if (questionObj.criteria)
361
+ entry.criteria = questionObj.criteria;
184
362
  }
185
363
  return entry;
186
364
  });
187
365
  // Call Jev via OpenRouter
188
- const response = await this.openrouterClient.chat.completions.create({
189
- model: this.config.model,
366
+ const response = await client.chat.completions.create({
367
+ model: provider.model,
190
368
  messages: [
191
369
  {
192
370
  role: "system",
@@ -227,7 +405,9 @@ Respond with a JSON object mapping each question ID to its answer.`,
227
405
  const questionData = question;
228
406
  const responseData = parsed[questionId];
229
407
  if (!responseData) {
230
- continue;
408
+ // The same policy as the TypeSafe path: a partial answer would
409
+ // silently produce a decision from a subset of the questions.
410
+ throw new JevProviderError(`OpenRouter: missing answer for required question "${questionId}"`, { provider: "openrouter", retryable: false });
231
411
  }
232
412
  const decision = this.buildDecision(questionId, questionData, responseData);
233
413
  decisions[questionId] = decision;
@@ -236,7 +416,7 @@ Respond with a JSON object mapping each question ID to its answer.`,
236
416
  decisions,
237
417
  state: stateStr,
238
418
  latencyMs,
239
- model: this.config.model,
419
+ model: provider.model,
240
420
  };
241
421
  }
242
422
  /**
@@ -295,6 +475,12 @@ Respond with a JSON object mapping each question ID to its answer.`,
295
475
  }
296
476
  return results;
297
477
  }
478
+ /**
479
+ * The provider chain in use.
480
+ */
481
+ getProviders() {
482
+ return [...this.providers];
483
+ }
298
484
  // Private helpers
299
485
  // Note: Response schema removed - using json_object mode without strict schema
300
486
  // This allows Jev to return flexible responses
@@ -333,8 +519,36 @@ Respond with a JSON object mapping each question ID to its answer.`,
333
519
  return "low";
334
520
  }
335
521
  }
522
+ /**
523
+ * The candidate names of a choice question.
524
+ */
525
+ function choiceNames(question) {
526
+ const criteria = question.criteria;
527
+ if (Array.isArray(criteria))
528
+ return [...criteria];
529
+ if (criteria)
530
+ return Object.keys(criteria);
531
+ return [...(question.options ?? [])];
532
+ }
533
+ /**
534
+ * The per option descriptions of a choice question, when there are any.
535
+ */
536
+ function choiceDescriptions(question) {
537
+ const criteria = question.criteria;
538
+ if (criteria && !Array.isArray(criteria)) {
539
+ const entries = Object.entries(criteria);
540
+ if (entries.length === 0)
541
+ return undefined;
542
+ return Object.fromEntries(entries);
543
+ }
544
+ if (question.optionDescriptions)
545
+ return question.optionDescriptions;
546
+ return undefined;
547
+ }
336
548
  // Export types
337
549
  export * from "./types.js";
550
+ // Export provider errors
551
+ export { JevProviderError, isRetryableStatus, toProviderError } from "./provider-error.js";
338
552
  // Export submodules
339
553
  export { E2EJudge } from "./e2e-judge.js";
340
554
  export { FlakyDetector } from "./flaky-detector.js";
@@ -345,7 +559,9 @@ export { checkWrapUp, getTodoSummary } from "./wrap-up-judge.js";
345
559
  // Export EnvironmentJudge
346
560
  export { EnvironmentJudge } from "./environment-judge.js";
347
561
  // Export TypeSafeJudge
348
- export { TypeSafeJudge, detectProvider } from "./typesafe-provider.js";
562
+ export { TypeSafeJudge, detectProvider, providerForBaseUrl } from "./typesafe-provider.js";
563
+ // Export the TypeSafe request contract helpers
564
+ export { buildChoiceCriteria, buildScoreScale, scorePositionToProbability, scorePositionToValue, validateQuestion, MAX_SCORE_LEVELS, } from "./typesafe-request.js";
349
565
  // Export TodoContinuation
350
566
  export { TodoContinuationController, createTodoContinuation } from "./continuation-controller.js";
351
567
  // Export TodoProvider
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAcnD,+CAA+C;AAC/C,qDAAqD;AACrD,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACvB,gBAAgB,EAAE,kBAAkB;IACpC,kBAAkB,EAAE,oBAAoB;CAC/B,CAAC;AAEX,iCAAiC;AACjC,MAAM,CAAC,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AAC3D,yEAAyE;AACzE,MAAM,CAAC,MAAM,sBAAsB,GAAG,YAAY,CAAC;AACnD,mCAAmC;AACnC,MAAM,CAAC,MAAM,mBAAmB,GAAG,8BAA8B,CAAC;AAClE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,qBAAqB,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AAEvC;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACpD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB;IAC/B,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACxC,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAGnC;IACA,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACxC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,CAAC;IACrD,MAAM,SAAS,GAAwB,EAAE,CAAC;IAE1C,0EAA0E;IAC1E,2EAA2E;IAC3E,kEAAkE;IAClE,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IAC1D,MAAM,kBAAkB,GAAG,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACjF,MAAM,YAAY,GAAG,CAAC,QAAmC,EAAsB,EAAE;QAChF,IAAI,CAAC,SAAS;YAAE,OAAO,SAAS,CAAC;QACjC,MAAM,YAAY,GAAG,QAAQ,KAAK,YAAY,CAAC;QAC/C,OAAO,kBAAkB,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,aAAa,CAChC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAC9B,WAAW,CAAC,OAAO,EAAE,sBAAsB,CAAC,EAC5C,YAAY,CAAC,UAAU,CAAC,CACxB,CAAC;IACF,IAAI,WAAW,EAAE,CAAC;QACjB,SAAS,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,WAAW;YACnB,OAAO,EAAE,GAAG,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,IAAI,iBAAiB;YAC9D,KAAK,EAAE,GAAG,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,sBAAsB;SAC9D,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,aAAa,CAClC,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAChC,WAAW,CAAC,OAAO,EAAE,wBAAwB,CAAC,EAC9C,YAAY,CAAC,YAAY,CAAC,CAC1B,CAAC;IACF,IAAI,aAAa,EAAE,CAAC;QACnB,SAAS,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,YAAY;YACtB,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,GAAG,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,IAAI,mBAAmB;YAClE,KAAK,EAAE,GAAG,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,IAAI,wBAAwB;SAClE,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,aAAa,CAAC,GAAG,MAA8B;IACvD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;QAC9B,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;IAC7B,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,cAAc;IACtB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,cAAc,CAAC;IAC9E,OAAO,GAAG,OAAO,2BAA2B,CAAC;AAC9C,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,IAAY;IACjD,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,GAAG,OAAO,IAAI,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,SAAS,CAAC;QACxC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,OAAO,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC3B,OAAO,mBAAmB,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAgC;IAC9D,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACxC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACd,sKAAsK,CACtK,CAAC;IACH,CAAC;IACD,OAAO,IAAI,QAAQ,CAAC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,IAAI,SAAS,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED;;GAEG;AACH,MAAM,cAAc,GAAG;IACtB,gBAAgB,EAAE,GAAG;IACrB,SAAS,EAAE,KAAK;CAChB,CAAC;AAaF;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,QAA2B;IACpD,OAAO;QACN,QAAQ,CAAC,QAAQ;QACjB,QAAQ,CAAC,OAAO;QAChB,QAAQ,CAAC,KAAK;QACd,QAAQ,CAAC,MAAM;KACf,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,OAAO,QAAQ;IACZ,MAAM,CAAsB;IAC5B,SAAS,CAAsB;IAC/B,cAAc,GAAG,IAAI,GAAG,EAAyB,CAAC;IAClD,iBAAiB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEtD,YAAY,MAAsB;QACjC,IAAI,CAAC,MAAM,GAAG;YACb,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,cAAc,CAAC,gBAAgB;YAC5E,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,cAAc,CAAC,SAAS;YACvD,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;SACrB,CAAC;QAEF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAE/C,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CACd,8EAA8E,CAC9E,CAAC;QACH,CAAC;IACF,CAAC;IAED;;;;;;OAMG;IACK,gBAAgB,CAAC,MAAsB;QAC9C,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACvF,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACxC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;oBAC7B,QAAQ,CACP,YAAY,EACZ,YAAY,OAAO,CAAC,QAAQ,qDAAqD,CACjF,CAAC;gBACH,CAAC;YACF,CAAC;YACD,OAAO,MAAM,CAAC;QACf,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACd,+FAA+F,CAC/F,CAAC;QACH,CAAC;QACD,sEAAsE;QACtE,mEAAmE;QACnE,kCAAkC;QAClC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CACd,8LAA8L,CAC9L,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,iBAAiB,CAAC;QACpD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO;YACN;gBACC,QAAQ;gBACR,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,OAAO;gBACP,KAAK,EACJ,MAAM,CAAC,KAAK;oBACZ,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,wBAAwB,CAAC;aAC9E;SACD,CAAC;IACH,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,QAAQ,CACb,KAAsB,EACtB,SAA0B;QAE1B,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,SAAkB,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC;gBACJ,MAAM,MAAM,GACX,QAAQ,CAAC,QAAQ,KAAK,UAAU;oBAC/B,CAAC,CAAC,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC;oBAC7D,CAAC,CAAC,MAAM,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;gBAClE,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACnD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,aAAa,GAAG,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAChE,SAAS,GAAG,aAAa,CAAC;gBAC1B,MAAM,MAAM,GAAG,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC/C,IAAI,CAAC,aAAa,CAAC,SAAS,IAAI,MAAM,EAAE,CAAC;oBACxC,MAAM,aAAa,CAAC;gBACrB,CAAC;gBACD,QAAQ,CACP,YAAY,EACZ,YAAY,QAAQ,CAAC,QAAQ,YAAY,aAAa,CAAC,OAAO,6BAA6B,CAC3F,CAAC;YACH,CAAC;QACF,CAAC;QACD,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC5D,CAAC;IAEO,oBAAoB,CAC3B,QAA2B,EAC3B,KAAsB,EACtB,SAA0B;QAE1B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,KAAK,GAAG,IAAI,aAAa,CAAC;gBACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;aAChC,CAAC,CAAC;YACH,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,sBAAsB,CACnC,QAA2B,EAC3B,KAAsB,EACtB,SAA0B;QAE1B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,GAAG,IAAI,MAAM,CAAC;gBACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;aAC9B,CAAC,CAAC;YACH,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,oCAAoC;QACpC,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAE3E,2CAA2C;QAC3C,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE;YAChE,MAAM,WAAW,GAAG,CAAgB,CAAC;YACrC,MAAM,KAAK,GAA4B,EAAE,EAAE,EAAE,CAAC;YAC9C,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACjC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC;gBACpB,KAAK,CAAC,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC;YAC/C,CAAC;iBAAM,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1C,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC;gBACtB,KAAK,CAAC,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC;gBAC9C,KAAK,CAAC,OAAO,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;gBACzC,MAAM,YAAY,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;gBACrD,IAAI,YAAY;oBAAE,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC;YACrD,CAAC;iBAAM,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACzC,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC;gBACrB,KAAK,CAAC,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC;gBAC9C,IAAI,WAAW,CAAC,GAAG,KAAK,SAAS;oBAAE,KAAK,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC;gBAC/D,IAAI,WAAW,CAAC,GAAG,KAAK,SAAS;oBAAE,KAAK,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC;gBAC/D,IAAI,WAAW,CAAC,QAAQ;oBAAE,KAAK,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;YACjE,CAAC;YACD,OAAO,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,0BAA0B;QAC1B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACrD,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,QAAQ,EAAE;gBACT;oBACC,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE;wDAC0C;iBACnD;gBACD;oBACC,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,UAAU,QAAQ;;;EAG9B,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;;mEAE0B;iBAC9D;aACD;YACD,eAAe,EAAE;gBAChB,IAAI,EAAE,aAAa;aACnB;YACD,WAAW,EAAE,GAAG,EAAE,2CAA2C;SAC7D,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAEzC,iBAAiB;QACjB,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC;QACtD,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,MAA+B,CAAC;QACpC,IAAI,CAAC;YACJ,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACnD,CAAC;QAED,sBAAsB;QACtB,MAAM,SAAS,GAAG,EAA+B,CAAC;QAElD,KAAK,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAChE,MAAM,YAAY,GAAG,QAAuB,CAAC;YAC7C,MAAM,YAAY,GAAI,MAAkC,CAAC,UAAU,CAEvD,CAAC;YAEb,IAAI,CAAC,YAAY,EAAE,CAAC;gBACnB,+DAA+D;gBAC/D,8DAA8D;gBAC9D,MAAM,IAAI,gBAAgB,CACzB,qDAAqD,UAAU,GAAG,EAClE,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,CAC5C,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAClC,UAAU,EACV,YAAY,EACZ,YAAY,CACZ,CAAC;YACD,SAAyC,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC;QACnE,CAAC;QAED,OAAO;YACN,SAAS;YACT,KAAK,EAAE,QAAQ;YACf,SAAS;YACT,KAAK,EAAE,QAAQ,CAAC,KAAK;SACrB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CACT,KAAsB,EACtB,QAAgB;QAEhB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;YACzC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE;SAChD,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,MAA+B,CAAC;QAClE,OAAO;YACN,IAAI,EAAG,QAAQ,CAAC,QAA4B,CAAC,IAAI;YACjD,UAAU,EAAE,QAAQ,CAAC,UAAU;SAC/B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CACX,KAAsB,EACtB,QAAgB,EAChB,OAAY;QAEZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;YACzC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE;SAC3D,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,MAA+B,CAAC;QAClE,OAAO;YACN,MAAM,EAAG,QAAQ,CAAC,QAAiC,CAAC,MAAM;YAC1D,UAAU,EAAG,QAAQ,CAAC,QAA8B,CAAC,UAAU;SAC/D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB,CAChB,WAAmB,EACnB,SAAS,GAAW,IAAI,CAAC,MAAM,CAAC,gBAAgB;QAEhD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAE9D,OAAO;YACN,SAAS,EAAE,WAAW,IAAI,SAAS;YACnC,WAAW;YACX,UAAU;YACV,MAAM,EAAE,WAAW,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO;SAChF,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAClB,MAA2B,EAC3B,SAA0B,EAC1B,OAAO,GAA6B,EAAE;QAEtC,MAAM,EAAE,WAAW,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;QAEpC,MAAM,OAAO,GAA6B,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAwB,EAAE,CAAC;QAExC,qBAAqB;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;QACnD,CAAC;QAED,kBAAkB;QAClB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,YAAY;QACX,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC;IAED,kBAAkB;IAElB,+EAA+E;IAC/E,+CAA+C;IAEvC,aAAa,CACpB,UAAa,EACb,QAAqB,EACrB,QAAqB;QAErB,IAAI,WAAmB,CAAC;QACxB,IAAI,UAAqC,CAAC;QAE1C,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;YACvB,KAAK,MAAM;gBACV,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC;gBAC5B,MAAM;YACP,KAAK,QAAQ;gBACZ,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC;gBAClC,MAAM;YACP,KAAK,OAAO;gBACX,yBAAyB;gBACzB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBACpE,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChE,WAAW,GAAG,CAAC,QAAQ,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;gBACnD,MAAM;QACR,CAAC;QAED,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAE3E,OAAO;YACN,UAAU;YACV,QAAQ;YACR,QAAQ;YACR,WAAW;YACX,UAAU;SACV,CAAC;IACH,CAAC;IAEO,aAAa,CACpB,WAAmB,EACnB,SAAiB;QAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;QACnD,IAAI,QAAQ,GAAG,GAAG;YAAE,OAAO,MAAM,CAAC;QAClC,IAAI,QAAQ,GAAG,IAAI;YAAE,OAAO,QAAQ,CAAC;QACrC,OAAO,KAAK,CAAC;IACd,CAAC;CACD;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,QAAkD;IACtE,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACnC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;IAClD,IAAI,QAAQ;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAC1B,QAAkD;IAElD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACnC,IAAI,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC3C,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,QAAQ,CAAC,kBAAkB;QAAE,OAAO,QAAQ,CAAC,kBAAkB,CAAC;IACpE,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,eAAe;AACf,cAAc,YAAY,CAAC;AAE3B,yBAAyB;AACzB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3F,oBAAoB;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGxE,qBAAqB;AACrB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGjE,0BAA0B;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,uBAAuB;AACvB,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG3F,+CAA+C;AAC/C,OAAO,EACN,mBAAmB,EACnB,eAAe,EACf,0BAA0B,EAC1B,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,GAChB,MAAM,uBAAuB,CAAC;AAG/B,0BAA0B;AAC1B,OAAO,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAGlG,sBAAsB;AACtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGxD,qBAAqB;AACrB,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Provider errors for the Jev judge.
3
+ *
4
+ * The judge can talk to more than one provider (TypeSafe direct API first,
5
+ * OpenRouter as a fallback). A failure therefore carries the information the
6
+ * fallback logic needs: which provider failed, whether the failure was an
7
+ * HTTP error, and whether ANOTHER provider could still serve the request.
8
+ */
9
+ import type { JevProviderName } from "./types.js";
10
+ export interface JevProviderErrorOptions {
11
+ provider: JevProviderName;
12
+ /** HTTP status, when the failure came from an HTTP response. */
13
+ status?: number;
14
+ /**
15
+ * True when another provider could still serve the request.
16
+ *
17
+ * Retryable: network failures, timeouts, rate limits, auth failures and
18
+ * 5xx. NOT retryable: 400/422 - those are contract errors in the request
19
+ * we build, and falling back would hide the bug.
20
+ */
21
+ retryable: boolean;
22
+ cause?: unknown;
23
+ }
24
+ /**
25
+ * Error raised by a single Jev provider call.
26
+ */
27
+ export declare class JevProviderError extends Error {
28
+ readonly provider: JevProviderName;
29
+ readonly status?: number;
30
+ readonly retryable: boolean;
31
+ constructor(message: string, options: JevProviderErrorOptions);
32
+ }
33
+ /**
34
+ * HTTP statuses where another provider (or a later attempt) can still help.
35
+ */
36
+ export declare function isRetryableStatus(status: number): boolean;
37
+ /**
38
+ * Extract an HTTP status from an unknown error value.
39
+ */
40
+ export declare function extractStatus(error: unknown): number | undefined;
41
+ /**
42
+ * True when the error is a known transport failure (network, timeout, abort).
43
+ *
44
+ * Only these are retryable without an HTTP status: they never reached a
45
+ * server that could have rejected the request. Everything else without a
46
+ * status (a bug in our own code, a malformed response, a parse error) is NOT
47
+ * retryable - a contract bug must stay visible instead of being hidden behind
48
+ * a fallback to another provider.
49
+ */
50
+ export declare function isTransportError(error: unknown): boolean;
51
+ /**
52
+ * Wrap any thrown value into a JevProviderError.
53
+ *
54
+ * A failure with an HTTP status is retryable when the status says so (see
55
+ * `isRetryableStatus`). A failure WITHOUT a status is only retryable when it
56
+ * is a known transport failure (network, timeout, abort) - an unknown error
57
+ * is most likely a bug in our own code and must not disappear behind a
58
+ * fallback to another provider.
59
+ */
60
+ export declare function toProviderError(error: unknown, provider: JevProviderName): JevProviderError;
61
+ //# sourceMappingURL=provider-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-error.d.ts","sourceRoot":"","sources":["../src/provider-error.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,uBAAuB;IACvC,QAAQ,EAAE,eAAe,CAAC;IAC1B,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;OAMG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAM5D;CACD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAKzD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAIhE;AAmED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAwBxD;AAUD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,GAAG,gBAAgB,CAU3F"}