pi-harness-runtime 1.1.153 → 1.1.154
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.
- package/index.ts +83 -3
- package/package.json +1 -1
- package/packages/a2a-adapter/package.json +1 -1
- package/packages/agent-policy/package.json +1 -1
- package/packages/architecture-generator/package.json +1 -1
- package/packages/auth/package.json +1 -1
- package/packages/autonomous-refactor/package.json +1 -1
- package/packages/autonomous-runtime/package.json +1 -1
- package/packages/cache-strategy/package.json +1 -1
- package/packages/capability-registry/package.json +1 -1
- package/packages/checkpoint/package.json +1 -1
- package/packages/cli-plugin-sdk/package.json +1 -1
- package/packages/clipboard/package.json +1 -1
- package/packages/clipboard-plugin/package.json +1 -1
- package/packages/code-generation/package.json +1 -1
- package/packages/code-review/package.json +1 -1
- package/packages/codex-adapter/package.json +1 -1
- package/packages/codex-watcher/package.json +1 -1
- package/packages/config-capture/package.json +1 -1
- package/packages/context-compiler/package.json +1 -1
- package/packages/context-discovery/package.json +1 -1
- package/packages/context-manager/package.json +1 -1
- package/packages/cookie-sanitizer/package.json +1 -1
- package/packages/cost-optimizer/package.json +1 -1
- package/packages/dependency-analyzer/package.json +1 -1
- package/packages/django-plugin/package.json +1 -1
- package/packages/doc-generator/package.json +1 -1
- package/packages/evaluation-engine/package.json +1 -1
- package/packages/evaluation-runner/package.json +1 -1
- package/packages/event-bus/package.json +1 -1
- package/packages/event-store/package.json +1 -1
- package/packages/experience-replay/package.json +1 -1
- package/packages/feedback-collector/package.json +1 -1
- package/packages/file-copy-helper/package.json +1 -1
- package/packages/framework-detector/package.json +1 -1
- package/packages/framework-plugin-sdk/package.json +1 -1
- package/packages/frappe-plugin/package.json +1 -1
- package/packages/generic-web-plugin/package.json +1 -1
- package/packages/health-monitor/package.json +1 -1
- package/packages/intent-analyzer/package.json +1 -1
- package/packages/jev-judge/dist/index.d.ts +14 -3
- package/packages/jev-judge/dist/index.d.ts.map +1 -1
- package/packages/jev-judge/dist/index.js +54 -12
- package/packages/jev-judge/dist/index.js.map +1 -1
- package/packages/jev-judge/dist/typesafe-provider.d.ts +66 -0
- package/packages/jev-judge/dist/typesafe-provider.d.ts.map +1 -0
- package/packages/jev-judge/dist/typesafe-provider.js +220 -0
- package/packages/jev-judge/dist/typesafe-provider.js.map +1 -0
- package/packages/jev-judge/package.json +1 -1
- package/packages/jev-judge/src/index.ts +58 -12
- package/packages/jev-judge/src/typesafe-provider.ts +335 -0
- package/packages/knowledge-graph/package.json +1 -1
- package/packages/knowledge-retrieval/package.json +1 -1
- package/packages/laravel-plugin/package.json +1 -1
- package/packages/learning-engine/package.json +1 -1
- package/packages/mcp-adapter/package.json +1 -1
- package/packages/memory-engine/package.json +1 -1
- package/packages/milestone-manager/package.json +1 -1
- package/packages/model-registry/package.json +1 -1
- package/packages/nextjs-plugin/package.json +1 -1
- package/packages/notification/package.json +1 -1
- package/packages/observability/package.json +1 -1
- package/packages/okf-indexer/package.json +1 -1
- package/packages/paperclip-integration/package.json +1 -1
- package/packages/performance-optimizer/package.json +1 -1
- package/packages/privilege-broker/package.json +1 -1
- package/packages/project-analyzer/package.json +1 -1
- package/packages/project-bootstrap/package.json +1 -1
- package/packages/projection-engine/package.json +1 -1
- package/packages/prompt-compiler/package.json +1 -1
- package/packages/prompt-versioning/package.json +1 -1
- package/packages/provider-adapter-sdk/package.json +1 -1
- package/packages/provider-router/package.json +1 -1
- package/packages/provider-selector/package.json +1 -1
- package/packages/providers/package.json +1 -1
- package/packages/qdrant-skills/package.json +1 -1
- package/packages/quota-manager/package.json +1 -1
- package/packages/rate-limiter/package.json +1 -1
- package/packages/react-vite-plugin/package.json +1 -1
- package/packages/release-manager/package.json +1 -1
- package/packages/requirement-compiler/package.json +1 -1
- package/packages/runtime/package.json +1 -1
- package/packages/scheduler/package.json +1 -1
- package/packages/scheduler-adapter/package.json +1 -1
- package/packages/session/package.json +1 -1
- package/packages/session-api/package.json +1 -1
- package/packages/session-export/package.json +1 -1
- package/packages/shared-context/package.json +1 -1
- package/packages/skill-mcp-client/package.json +1 -1
- package/packages/skill-registry/package.json +1 -1
- package/packages/skills/package.json +1 -1
- package/packages/sprint-planner/package.json +1 -1
- package/packages/subscription-engine/package.json +1 -1
- package/packages/task-compiler/package.json +1 -1
- package/packages/tencentdb-memory/package.json +1 -1
- package/packages/tencentdb-sync/package.json +1 -1
- package/packages/test-data-generator/package.json +1 -1
- package/packages/test-generator/package.json +1 -1
- package/packages/todo-bd-sync/package.json +1 -1
- package/packages/token-estimation/package.json +1 -1
- package/packages/token-optimizer/package.json +1 -1
- package/packages/trajectory/package.json +1 -1
- package/packages/tui/package.json +1 -1
- package/packages/types/package.json +1 -1
- package/packages/workflow-events/package.json +1 -1
- package/packages/workspace-scanner/package.json +1 -1
- package/packages/worktree/package.json +1 -1
- package/packages/write-review/package.json +1 -1
|
@@ -2,13 +2,16 @@
|
|
|
2
2
|
* Jev Judge - Main API
|
|
3
3
|
*
|
|
4
4
|
* Structured decision model for agent routing, E2E testing, and automated decisions.
|
|
5
|
-
* Uses TypeSafe Jev via
|
|
5
|
+
* Uses TypeSafe Jev via:
|
|
6
|
+
* - Primary: TypeSafe direct API (https://api.typesafe.ai/v1/systemone)
|
|
7
|
+
* - Fallback: OpenRouter API (https://openrouter.ai/api/v1)
|
|
6
8
|
*
|
|
7
9
|
* @example
|
|
8
10
|
* ```typescript
|
|
9
11
|
* import { JevJudge } from "@pi-harness/jev-judge";
|
|
10
12
|
*
|
|
11
|
-
*
|
|
13
|
+
* // Auto-detects TypeSafe vs OpenRouter based on API key and baseUrl
|
|
14
|
+
* const judge = new JevJudge({ apiKey: process.env.TYPESAFE_API_KEY! });
|
|
12
15
|
*
|
|
13
16
|
* // Ask multiple questions at once
|
|
14
17
|
* const result = await judge.evaluate(
|
|
@@ -29,6 +32,7 @@
|
|
|
29
32
|
// OpenAI SDK (OpenRouter is OpenAI-compatible)
|
|
30
33
|
// @ts-ignore - openai is installed at workspace root
|
|
31
34
|
import OpenAI from "openai";
|
|
35
|
+
import { TypeSafeJudge } from "./typesafe-provider.js";
|
|
32
36
|
/**
|
|
33
37
|
* Environment variable keys for API keys
|
|
34
38
|
*/
|
|
@@ -88,27 +92,55 @@ export function createJevJudge(config) {
|
|
|
88
92
|
* Default configuration
|
|
89
93
|
*/
|
|
90
94
|
const DEFAULT_CONFIG = {
|
|
91
|
-
baseUrl: "https://
|
|
92
|
-
model: "typesafe/
|
|
95
|
+
baseUrl: "https://api.typesafe.ai", // TypeSafe direct API as default
|
|
96
|
+
model: "typesafe/systemone",
|
|
93
97
|
defaultThreshold: 0.7,
|
|
94
98
|
timeoutMs: 30000,
|
|
95
99
|
};
|
|
100
|
+
/**
|
|
101
|
+
* Detect provider from baseUrl
|
|
102
|
+
*/
|
|
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
|
|
109
|
+
}
|
|
96
110
|
/**
|
|
97
111
|
* JevJudge - Main class for making structured decisions with Jev
|
|
112
|
+
*
|
|
113
|
+
* Supports two providers:
|
|
114
|
+
* - TypeSafe direct API (primary, recommended)
|
|
115
|
+
* - OpenRouter API (fallback for backwards compatibility)
|
|
98
116
|
*/
|
|
99
117
|
export class JevJudge {
|
|
100
|
-
|
|
118
|
+
typesafeJudge;
|
|
119
|
+
openrouterClient;
|
|
101
120
|
config;
|
|
121
|
+
provider;
|
|
102
122
|
constructor(config) {
|
|
103
123
|
this.config = {
|
|
104
124
|
...DEFAULT_CONFIG,
|
|
105
125
|
...config,
|
|
106
126
|
};
|
|
107
|
-
this.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
+
});
|
|
135
|
+
}
|
|
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
|
+
});
|
|
143
|
+
}
|
|
112
144
|
}
|
|
113
145
|
/**
|
|
114
146
|
* Evaluate state against questions
|
|
@@ -118,10 +150,18 @@ export class JevJudge {
|
|
|
118
150
|
* @returns Evaluation result with decisions
|
|
119
151
|
*/
|
|
120
152
|
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) {
|
|
159
|
+
throw new Error("No Jev provider configured");
|
|
160
|
+
}
|
|
121
161
|
const startTime = Date.now();
|
|
122
162
|
// Convert state to string if object
|
|
123
163
|
const stateStr = typeof state === "string" ? state : JSON.stringify(state);
|
|
124
|
-
// Build questions array for API
|
|
164
|
+
// Build questions array for OpenRouter API
|
|
125
165
|
const questionsArray = Object.entries(questions).map(([id, q]) => {
|
|
126
166
|
const questionObj = q;
|
|
127
167
|
const entry = { id };
|
|
@@ -145,7 +185,7 @@ export class JevJudge {
|
|
|
145
185
|
return entry;
|
|
146
186
|
});
|
|
147
187
|
// Call Jev via OpenRouter
|
|
148
|
-
const response = await this.
|
|
188
|
+
const response = await this.openrouterClient.chat.completions.create({
|
|
149
189
|
model: this.config.model,
|
|
150
190
|
messages: [
|
|
151
191
|
{
|
|
@@ -304,4 +344,6 @@ export { AutoContinueJudge, createTaskState } from "./auto-continue.js";
|
|
|
304
344
|
export { checkWrapUp, getTodoSummary } from "./wrap-up-judge.js";
|
|
305
345
|
// Export EnvironmentJudge
|
|
306
346
|
export { EnvironmentJudge } from "./environment-judge.js";
|
|
347
|
+
// Export TypeSafeJudge
|
|
348
|
+
export { TypeSafeJudge, detectProvider } from "./typesafe-provider.js";
|
|
307
349
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeSafe Jev Provider - Direct API integration
|
|
3
|
+
*
|
|
4
|
+
* Uses TypeSafe's /v1/systemone endpoint directly.
|
|
5
|
+
* This is the recommended provider for Jev decisions.
|
|
6
|
+
*
|
|
7
|
+
* API: POST https://api.typesafe.ai/v1/systemone
|
|
8
|
+
* Auth: Bearer token (TYPESAFE_API_KEY)
|
|
9
|
+
*/
|
|
10
|
+
import type { JevQuestions, JevEvaluationResult } from "./types.js";
|
|
11
|
+
/**
|
|
12
|
+
* TypeSafe provider configuration
|
|
13
|
+
*/
|
|
14
|
+
export interface TypeSafeConfig {
|
|
15
|
+
apiKey: string;
|
|
16
|
+
baseUrl?: string;
|
|
17
|
+
timeoutMs?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* TypeSafe Jev Judge - Direct TypeSafe API integration
|
|
21
|
+
*
|
|
22
|
+
* Uses TypeSafe's systemone API for structured decisions.
|
|
23
|
+
* More reliable than OpenRouter proxy and supports full feature set.
|
|
24
|
+
*/
|
|
25
|
+
export declare class TypeSafeJudge {
|
|
26
|
+
private config;
|
|
27
|
+
constructor(config: TypeSafeConfig);
|
|
28
|
+
/**
|
|
29
|
+
* Evaluate state against questions using TypeSafe API
|
|
30
|
+
*/
|
|
31
|
+
evaluate<T extends string>(state: string | object, questions: JevQuestions<T>): Promise<JevEvaluationResult<T>>;
|
|
32
|
+
/**
|
|
33
|
+
* Quick noul (yes/no) evaluation
|
|
34
|
+
*/
|
|
35
|
+
noul(state: string | object, question: string): Promise<{
|
|
36
|
+
noul: number;
|
|
37
|
+
confidence: "high" | "medium" | "low";
|
|
38
|
+
}>;
|
|
39
|
+
/**
|
|
40
|
+
* Quick choice evaluation
|
|
41
|
+
*/
|
|
42
|
+
choice<T extends string>(state: string | object, question: string, options: T[]): Promise<{
|
|
43
|
+
choice: T;
|
|
44
|
+
confidence: number;
|
|
45
|
+
}>;
|
|
46
|
+
/**
|
|
47
|
+
* Quick score evaluation
|
|
48
|
+
*/
|
|
49
|
+
score(state: string | object, question: string, min?: number, max?: number): Promise<{
|
|
50
|
+
score: number;
|
|
51
|
+
confidence: number;
|
|
52
|
+
}>;
|
|
53
|
+
/**
|
|
54
|
+
* Build JevDecision from TypeSafe answer
|
|
55
|
+
*/
|
|
56
|
+
private buildDecision;
|
|
57
|
+
/**
|
|
58
|
+
* Determine confidence level from probability
|
|
59
|
+
*/
|
|
60
|
+
private getConfidence;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Detect which provider to use based on API key or config
|
|
64
|
+
*/
|
|
65
|
+
export declare function detectProvider(apiKey: string, baseUrl?: string): "typesafe" | "openrouter";
|
|
66
|
+
//# sourceMappingURL=typesafe-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typesafe-provider.d.ts","sourceRoot":"","sources":["../src/typesafe-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAEV,YAAY,EAGZ,mBAAmB,EAIpB,MAAM,YAAY,CAAC;AA2CpB;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAA2B;IAEzC,YAAY,MAAM,EAAE,cAAc,EAKjC;IAED;;OAEG;IACG,QAAQ,CAAC,CAAC,SAAS,MAAM,EAC7B,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CA4EjC;IAED;;OAEG;IACG,IAAI,CACR,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAA;KAAE,CAAC,CAWlE;IAED;;OAEG;IACG,MAAM,CAAC,CAAC,SAAS,MAAM,EAC3B,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,EAAE,GACX,OAAO,CAAC;QAAE,MAAM,EAAE,CAAC,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAW5C;IAED;;OAEG;IACG,KAAK,CACT,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,GAAG,SAAI,EACP,GAAG,SAAM,GACR,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAWhD;IAED;;OAEG;IACH,OAAO,CAAC,aAAa;IA0DrB;;OAEG;IACH,OAAO,CAAC,aAAa;CAOtB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,UAAU,GAAG,YAAY,CAgB3B"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeSafe Jev Provider - Direct API integration
|
|
3
|
+
*
|
|
4
|
+
* Uses TypeSafe's /v1/systemone endpoint directly.
|
|
5
|
+
* This is the recommended provider for Jev decisions.
|
|
6
|
+
*
|
|
7
|
+
* API: POST https://api.typesafe.ai/v1/systemone
|
|
8
|
+
* Auth: Bearer token (TYPESAFE_API_KEY)
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Default configuration
|
|
12
|
+
*/
|
|
13
|
+
const DEFAULT_CONFIG = {
|
|
14
|
+
baseUrl: "https://api.typesafe.ai",
|
|
15
|
+
timeoutMs: 30000,
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* TypeSafe Jev Judge - Direct TypeSafe API integration
|
|
19
|
+
*
|
|
20
|
+
* Uses TypeSafe's systemone API for structured decisions.
|
|
21
|
+
* More reliable than OpenRouter proxy and supports full feature set.
|
|
22
|
+
*/
|
|
23
|
+
export class TypeSafeJudge {
|
|
24
|
+
config;
|
|
25
|
+
constructor(config) {
|
|
26
|
+
this.config = {
|
|
27
|
+
...DEFAULT_CONFIG,
|
|
28
|
+
...config,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Evaluate state against questions using TypeSafe API
|
|
33
|
+
*/
|
|
34
|
+
async evaluate(state, questions) {
|
|
35
|
+
const startTime = Date.now();
|
|
36
|
+
// Convert state to string if object
|
|
37
|
+
const stateStr = typeof state === "string" ? state : JSON.stringify(state);
|
|
38
|
+
// Build TypeSafe question format
|
|
39
|
+
const questionsArray = Object.entries(questions).map(([id, q]) => {
|
|
40
|
+
const questionObj = q;
|
|
41
|
+
const question = {
|
|
42
|
+
id,
|
|
43
|
+
type: questionObj.type,
|
|
44
|
+
instructions: questionObj.instructions,
|
|
45
|
+
};
|
|
46
|
+
if (questionObj.type === "choice") {
|
|
47
|
+
question.options = questionObj.options;
|
|
48
|
+
// For choice questions, criteria defines ordered preference levels
|
|
49
|
+
question.criteria = questionObj.options;
|
|
50
|
+
}
|
|
51
|
+
else if (questionObj.type === "score") {
|
|
52
|
+
question.min = questionObj.min ?? 0;
|
|
53
|
+
question.max = questionObj.max ?? 100;
|
|
54
|
+
}
|
|
55
|
+
return question;
|
|
56
|
+
});
|
|
57
|
+
// Call TypeSafe API directly
|
|
58
|
+
const response = await fetch(`${this.config.baseUrl}/v1/systemone`, {
|
|
59
|
+
method: "POST",
|
|
60
|
+
headers: {
|
|
61
|
+
"Content-Type": "application/json",
|
|
62
|
+
Authorization: `Bearer ${this.config.apiKey}`,
|
|
63
|
+
},
|
|
64
|
+
body: JSON.stringify({
|
|
65
|
+
questions: questionsArray,
|
|
66
|
+
state: stateStr,
|
|
67
|
+
}),
|
|
68
|
+
signal: AbortSignal.timeout(this.config.timeoutMs),
|
|
69
|
+
});
|
|
70
|
+
const latencyMs = Date.now() - startTime;
|
|
71
|
+
if (!response.ok) {
|
|
72
|
+
const errorText = await response.text().catch(() => "Unknown error");
|
|
73
|
+
throw new Error(`TypeSafe API error ${response.status}: ${errorText}`);
|
|
74
|
+
}
|
|
75
|
+
const data = await response.json();
|
|
76
|
+
// Build decisions map
|
|
77
|
+
const decisions = {};
|
|
78
|
+
for (const [questionId, question] of Object.entries(questions)) {
|
|
79
|
+
const questionData = question;
|
|
80
|
+
const answer = data.answers?.[questionId];
|
|
81
|
+
if (!answer) {
|
|
82
|
+
// Skip missing answers
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const decision = this.buildDecision(questionId, questionData, answer);
|
|
86
|
+
decisions[questionId] = decision;
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
decisions,
|
|
90
|
+
state: stateStr,
|
|
91
|
+
latencyMs,
|
|
92
|
+
model: data.model ?? "typesafe/systemone",
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Quick noul (yes/no) evaluation
|
|
97
|
+
*/
|
|
98
|
+
async noul(state, question) {
|
|
99
|
+
const result = await this.evaluate(state, {
|
|
100
|
+
answer: { type: "noul", instructions: question },
|
|
101
|
+
});
|
|
102
|
+
const decision = result.decisions.answer;
|
|
103
|
+
const noulResponse = decision.response;
|
|
104
|
+
return {
|
|
105
|
+
noul: noulResponse.noul,
|
|
106
|
+
confidence: decision.confidence,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Quick choice evaluation
|
|
111
|
+
*/
|
|
112
|
+
async choice(state, question, options) {
|
|
113
|
+
const result = await this.evaluate(state, {
|
|
114
|
+
answer: { type: "choice", instructions: question, options },
|
|
115
|
+
});
|
|
116
|
+
const decision = result.decisions.answer;
|
|
117
|
+
const choiceResponse = decision.response;
|
|
118
|
+
return {
|
|
119
|
+
choice: choiceResponse.choice,
|
|
120
|
+
confidence: choiceResponse.confidence,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Quick score evaluation
|
|
125
|
+
*/
|
|
126
|
+
async score(state, question, min = 0, max = 100) {
|
|
127
|
+
const result = await this.evaluate(state, {
|
|
128
|
+
answer: { type: "score", instructions: question, min, max },
|
|
129
|
+
});
|
|
130
|
+
const decision = result.decisions.answer;
|
|
131
|
+
const scoreResponse = decision.response;
|
|
132
|
+
return {
|
|
133
|
+
score: scoreResponse.score,
|
|
134
|
+
confidence: scoreResponse.confidence,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Build JevDecision from TypeSafe answer
|
|
139
|
+
*/
|
|
140
|
+
buildDecision(questionId, question, answer) {
|
|
141
|
+
let response;
|
|
142
|
+
let probability;
|
|
143
|
+
switch (answer.type) {
|
|
144
|
+
case "noul":
|
|
145
|
+
response = {
|
|
146
|
+
type: "noul",
|
|
147
|
+
noul: answer.probability ?? 0.5,
|
|
148
|
+
};
|
|
149
|
+
probability = answer.probability ?? 0.5;
|
|
150
|
+
break;
|
|
151
|
+
case "choice":
|
|
152
|
+
response = {
|
|
153
|
+
type: "choice",
|
|
154
|
+
choice: answer.choice ?? question.type === "choice" ? question.options[0] : "",
|
|
155
|
+
confidence: answer.confidence ?? 0.5,
|
|
156
|
+
};
|
|
157
|
+
probability = answer.confidence ?? 0.5;
|
|
158
|
+
break;
|
|
159
|
+
case "score":
|
|
160
|
+
const min = question.type === "score" ? question.min ?? 0 : 0;
|
|
161
|
+
const max = question.type === "score" ? question.max ?? 100 : 100;
|
|
162
|
+
response = {
|
|
163
|
+
type: "score",
|
|
164
|
+
score: answer.score ?? (min + max) / 2,
|
|
165
|
+
confidence: answer.confidence ?? 0.5,
|
|
166
|
+
};
|
|
167
|
+
// Normalize score to 0-1
|
|
168
|
+
probability = ((answer.score ?? (min + max) / 2) - min) / (max - min);
|
|
169
|
+
break;
|
|
170
|
+
default:
|
|
171
|
+
// Fallback for unknown types
|
|
172
|
+
response = {
|
|
173
|
+
type: "noul",
|
|
174
|
+
noul: 0.5,
|
|
175
|
+
};
|
|
176
|
+
probability = 0.5;
|
|
177
|
+
}
|
|
178
|
+
const confidence = this.getConfidence(answer.confidence ?? probability);
|
|
179
|
+
return {
|
|
180
|
+
questionId,
|
|
181
|
+
question,
|
|
182
|
+
response,
|
|
183
|
+
probability,
|
|
184
|
+
confidence,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Determine confidence level from probability
|
|
189
|
+
*/
|
|
190
|
+
getConfidence(probability) {
|
|
191
|
+
// Confidence is based on distance from 0.5 (uncertain)
|
|
192
|
+
const distance = Math.abs(probability - 0.5);
|
|
193
|
+
if (distance > 0.35)
|
|
194
|
+
return "high";
|
|
195
|
+
if (distance > 0.2)
|
|
196
|
+
return "medium";
|
|
197
|
+
return "low";
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Detect which provider to use based on API key or config
|
|
202
|
+
*/
|
|
203
|
+
export function detectProvider(apiKey, baseUrl) {
|
|
204
|
+
// If baseUrl is explicitly set to TypeSafe, use TypeSafe
|
|
205
|
+
if (baseUrl?.includes("typesafe.ai")) {
|
|
206
|
+
return "typesafe";
|
|
207
|
+
}
|
|
208
|
+
// If using OpenRouter URL, use OpenRouter
|
|
209
|
+
if (baseUrl?.includes("openrouter")) {
|
|
210
|
+
return "openrouter";
|
|
211
|
+
}
|
|
212
|
+
// If key looks like TypeSafe (no specific pattern known), prefer TypeSafe
|
|
213
|
+
// TypeSafe keys are typically longer than OpenAI-compatible keys
|
|
214
|
+
if (apiKey.length > 50) {
|
|
215
|
+
return "typesafe";
|
|
216
|
+
}
|
|
217
|
+
// Default to OpenRouter for short keys (OpenAI-compatible)
|
|
218
|
+
return "openrouter";
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=typesafe-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typesafe-provider.js","sourceRoot":"","sources":["../src/typesafe-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,13 +2,16 @@
|
|
|
2
2
|
* Jev Judge - Main API
|
|
3
3
|
*
|
|
4
4
|
* Structured decision model for agent routing, E2E testing, and automated decisions.
|
|
5
|
-
* Uses TypeSafe Jev via
|
|
5
|
+
* Uses TypeSafe Jev via:
|
|
6
|
+
* - Primary: TypeSafe direct API (https://api.typesafe.ai/v1/systemone)
|
|
7
|
+
* - Fallback: OpenRouter API (https://openrouter.ai/api/v1)
|
|
6
8
|
*
|
|
7
9
|
* @example
|
|
8
10
|
* ```typescript
|
|
9
11
|
* import { JevJudge } from "@pi-harness/jev-judge";
|
|
10
12
|
*
|
|
11
|
-
*
|
|
13
|
+
* // Auto-detects TypeSafe vs OpenRouter based on API key and baseUrl
|
|
14
|
+
* const judge = new JevJudge({ apiKey: process.env.TYPESAFE_API_KEY! });
|
|
12
15
|
*
|
|
13
16
|
* // Ask multiple questions at once
|
|
14
17
|
* const result = await judge.evaluate(
|
|
@@ -44,6 +47,8 @@ import type {
|
|
|
44
47
|
// @ts-ignore - openai is installed at workspace root
|
|
45
48
|
import OpenAI from "openai";
|
|
46
49
|
|
|
50
|
+
import { TypeSafeJudge } from "./typesafe-provider.js";
|
|
51
|
+
|
|
47
52
|
/**
|
|
48
53
|
* Environment variable keys for API keys
|
|
49
54
|
*/
|
|
@@ -111,18 +116,33 @@ export function createJevJudge(config?: Partial<JevJudgeConfig>): JevJudge {
|
|
|
111
116
|
* Default configuration
|
|
112
117
|
*/
|
|
113
118
|
const DEFAULT_CONFIG = {
|
|
114
|
-
baseUrl: "https://
|
|
115
|
-
model: "typesafe/
|
|
119
|
+
baseUrl: "https://api.typesafe.ai", // TypeSafe direct API as default
|
|
120
|
+
model: "typesafe/systemone",
|
|
116
121
|
defaultThreshold: 0.7,
|
|
117
122
|
timeoutMs: 30000,
|
|
118
123
|
};
|
|
119
124
|
|
|
125
|
+
/**
|
|
126
|
+
* Detect provider from baseUrl
|
|
127
|
+
*/
|
|
128
|
+
function detectProvider(baseUrl: string): "typesafe" | "openrouter" {
|
|
129
|
+
if (baseUrl.includes("typesafe.ai")) return "typesafe";
|
|
130
|
+
if (baseUrl.includes("openrouter")) return "openrouter";
|
|
131
|
+
return "openrouter"; // Default to OpenRouter for backwards compatibility
|
|
132
|
+
}
|
|
133
|
+
|
|
120
134
|
/**
|
|
121
135
|
* JevJudge - Main class for making structured decisions with Jev
|
|
136
|
+
*
|
|
137
|
+
* Supports two providers:
|
|
138
|
+
* - TypeSafe direct API (primary, recommended)
|
|
139
|
+
* - OpenRouter API (fallback for backwards compatibility)
|
|
122
140
|
*/
|
|
123
141
|
export class JevJudge {
|
|
124
|
-
private
|
|
142
|
+
private typesafeJudge?: TypeSafeJudge;
|
|
143
|
+
private openrouterClient?: OpenAI;
|
|
125
144
|
private config: Required<JevJudgeConfig>;
|
|
145
|
+
private provider: "typesafe" | "openrouter";
|
|
126
146
|
|
|
127
147
|
constructor(config: JevJudgeConfig) {
|
|
128
148
|
this.config = {
|
|
@@ -130,11 +150,23 @@ export class JevJudge {
|
|
|
130
150
|
...config,
|
|
131
151
|
} as Required<JevJudgeConfig>;
|
|
132
152
|
|
|
133
|
-
this.
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
153
|
+
this.provider = detectProvider(this.config.baseUrl);
|
|
154
|
+
|
|
155
|
+
if (this.provider === "typesafe") {
|
|
156
|
+
// Use TypeSafe direct API
|
|
157
|
+
this.typesafeJudge = new TypeSafeJudge({
|
|
158
|
+
apiKey: this.config.apiKey,
|
|
159
|
+
baseUrl: this.config.baseUrl,
|
|
160
|
+
timeoutMs: this.config.timeoutMs,
|
|
161
|
+
});
|
|
162
|
+
} else {
|
|
163
|
+
// Use OpenRouter
|
|
164
|
+
this.openrouterClient = new OpenAI({
|
|
165
|
+
apiKey: this.config.apiKey,
|
|
166
|
+
baseURL: this.config.baseUrl,
|
|
167
|
+
timeout: this.config.timeoutMs,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
138
170
|
}
|
|
139
171
|
|
|
140
172
|
/**
|
|
@@ -148,12 +180,22 @@ export class JevJudge {
|
|
|
148
180
|
state: string | object,
|
|
149
181
|
questions: JevQuestions<T>
|
|
150
182
|
): Promise<JevEvaluationResult<T>> {
|
|
183
|
+
// Use TypeSafe provider if configured
|
|
184
|
+
if (this.provider === "typesafe" && this.typesafeJudge) {
|
|
185
|
+
return this.typesafeJudge.evaluate(state, questions);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Fall back to OpenRouter
|
|
189
|
+
if (!this.openrouterClient) {
|
|
190
|
+
throw new Error("No Jev provider configured");
|
|
191
|
+
}
|
|
192
|
+
|
|
151
193
|
const startTime = Date.now();
|
|
152
194
|
|
|
153
195
|
// Convert state to string if object
|
|
154
196
|
const stateStr = typeof state === "string" ? state : JSON.stringify(state);
|
|
155
197
|
|
|
156
|
-
// Build questions array for API
|
|
198
|
+
// Build questions array for OpenRouter API
|
|
157
199
|
const questionsArray = Object.entries(questions).map(([id, q]) => {
|
|
158
200
|
const questionObj = q as JevQuestion;
|
|
159
201
|
const entry: Record<string, unknown> = { id };
|
|
@@ -174,7 +216,7 @@ export class JevJudge {
|
|
|
174
216
|
});
|
|
175
217
|
|
|
176
218
|
// Call Jev via OpenRouter
|
|
177
|
-
const response = await this.
|
|
219
|
+
const response = await this.openrouterClient.chat.completions.create({
|
|
178
220
|
model: this.config.model,
|
|
179
221
|
messages: [
|
|
180
222
|
{
|
|
@@ -390,3 +432,7 @@ export type { TodoItem, WrapUpResult } from "./wrap-up-judge.js";
|
|
|
390
432
|
// Export EnvironmentJudge
|
|
391
433
|
export { EnvironmentJudge } from "./environment-judge.js";
|
|
392
434
|
export type { EnvironmentContext, EnvironmentDecision, SafetyCheck, EnvironmentConfig } from "./environment-judge.js";
|
|
435
|
+
|
|
436
|
+
// Export TypeSafeJudge
|
|
437
|
+
export { TypeSafeJudge, detectProvider } from "./typesafe-provider.js";
|
|
438
|
+
export type { TypeSafeConfig } from "./typesafe-provider.js";
|