decisionmemos 1.1.0
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/CHANGELOG.md +62 -0
- package/LICENSE +21 -0
- package/README.md +191 -0
- package/dist/src/clients/anthropic-client.d.ts +16 -0
- package/dist/src/clients/anthropic-client.d.ts.map +1 -0
- package/dist/src/clients/anthropic-client.js +67 -0
- package/dist/src/clients/anthropic-client.js.map +1 -0
- package/dist/src/clients/google-client.d.ts +16 -0
- package/dist/src/clients/google-client.d.ts.map +1 -0
- package/dist/src/clients/google-client.js +59 -0
- package/dist/src/clients/google-client.js.map +1 -0
- package/dist/src/clients/index.d.ts +10 -0
- package/dist/src/clients/index.d.ts.map +1 -0
- package/dist/src/clients/index.js +9 -0
- package/dist/src/clients/index.js.map +1 -0
- package/dist/src/clients/model-interface.d.ts +60 -0
- package/dist/src/clients/model-interface.d.ts.map +1 -0
- package/dist/src/clients/model-interface.js +109 -0
- package/dist/src/clients/model-interface.js.map +1 -0
- package/dist/src/clients/openai-client.d.ts +16 -0
- package/dist/src/clients/openai-client.d.ts.map +1 -0
- package/dist/src/clients/openai-client.js +82 -0
- package/dist/src/clients/openai-client.js.map +1 -0
- package/dist/src/clients/xai-client.d.ts +16 -0
- package/dist/src/clients/xai-client.d.ts.map +1 -0
- package/dist/src/clients/xai-client.js +71 -0
- package/dist/src/clients/xai-client.js.map +1 -0
- package/dist/src/index.d.ts +20 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +20 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/multi-model-query.d.ts +97 -0
- package/dist/src/multi-model-query.d.ts.map +1 -0
- package/dist/src/multi-model-query.js +121 -0
- package/dist/src/multi-model-query.js.map +1 -0
- package/dist/src/types.d.ts +184 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +5 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-interface.js","sourceRoot":"","sources":["../../../src/clients/model-interface.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI API Client for ChatGPT
|
|
3
|
+
*/
|
|
4
|
+
import { BaseModelClient } from './model-interface.js';
|
|
5
|
+
import { ModelResponse } from '../types.js';
|
|
6
|
+
export declare class OpenAIClient extends BaseModelClient {
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly provider = "openai";
|
|
9
|
+
private client;
|
|
10
|
+
private model;
|
|
11
|
+
private maxOutputTokens;
|
|
12
|
+
constructor(apiKey: string, model?: string, maxOutputTokens?: number);
|
|
13
|
+
query(prompt: string, systemPrompt?: string): Promise<ModelResponse>;
|
|
14
|
+
testConnection(): Promise<boolean>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=openai-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-client.d.ts","sourceRoot":"","sources":["../../../src/clients/openai-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,qBAAa,YAAa,SAAQ,eAAe;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,YAAY;IAC7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,eAAe,CAAS;gBAG9B,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAkB,EACzB,eAAe,GAAE,MAAkC;IAS/C,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA8DpE,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;CAQzC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI API Client for ChatGPT
|
|
3
|
+
*/
|
|
4
|
+
import OpenAI from 'openai';
|
|
5
|
+
import { BaseModelClient } from './model-interface.js';
|
|
6
|
+
import { DEFAULT_MAX_OUTPUT_TOKENS } from '../constants.js';
|
|
7
|
+
export class OpenAIClient extends BaseModelClient {
|
|
8
|
+
name;
|
|
9
|
+
provider = 'openai';
|
|
10
|
+
client;
|
|
11
|
+
model;
|
|
12
|
+
maxOutputTokens;
|
|
13
|
+
constructor(apiKey, model = 'gpt-5.2', maxOutputTokens = DEFAULT_MAX_OUTPUT_TOKENS) {
|
|
14
|
+
super(apiKey);
|
|
15
|
+
this.client = new OpenAI({ apiKey });
|
|
16
|
+
this.model = model;
|
|
17
|
+
this.name = model;
|
|
18
|
+
this.maxOutputTokens = maxOutputTokens;
|
|
19
|
+
}
|
|
20
|
+
async query(prompt, systemPrompt) {
|
|
21
|
+
if (!this.isConfigured()) {
|
|
22
|
+
return this.createErrorResponse(new Error('OpenAI API key not configured'));
|
|
23
|
+
}
|
|
24
|
+
const startTime = Date.now();
|
|
25
|
+
try {
|
|
26
|
+
const messages = [];
|
|
27
|
+
if (systemPrompt) {
|
|
28
|
+
messages.push({
|
|
29
|
+
role: 'system',
|
|
30
|
+
content: systemPrompt
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
messages.push({
|
|
34
|
+
role: 'user',
|
|
35
|
+
content: prompt
|
|
36
|
+
});
|
|
37
|
+
const completion = await this.withRetry(() => this.client.chat.completions.create({
|
|
38
|
+
model: this.model,
|
|
39
|
+
messages,
|
|
40
|
+
temperature: 0.7,
|
|
41
|
+
max_completion_tokens: this.maxOutputTokens,
|
|
42
|
+
}));
|
|
43
|
+
const latency = Date.now() - startTime;
|
|
44
|
+
// Extract response - handle both standard and reasoning model formats
|
|
45
|
+
const choice = completion.choices[0];
|
|
46
|
+
let responseText = choice?.message?.content || '';
|
|
47
|
+
// If response is empty but tokens were used, check alternative content locations
|
|
48
|
+
if (!responseText && completion.usage?.total_tokens && completion.usage.total_tokens > 0) {
|
|
49
|
+
console.warn(`Warning: GPT response empty despite ${completion.usage.total_tokens} tokens used.`);
|
|
50
|
+
const msg = choice?.message;
|
|
51
|
+
if (msg?.reasoning_content) {
|
|
52
|
+
responseText = msg.reasoning_content;
|
|
53
|
+
}
|
|
54
|
+
else if (msg?.refusal) {
|
|
55
|
+
responseText = `[Refusal] ${msg.refusal}`;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
modelName: this.name,
|
|
60
|
+
provider: this.provider,
|
|
61
|
+
response: responseText,
|
|
62
|
+
timestamp: new Date(),
|
|
63
|
+
tokensUsed: completion.usage?.total_tokens,
|
|
64
|
+
latency
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.error(`OpenAI query error:`, error.message);
|
|
69
|
+
return this.createErrorResponse(error);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async testConnection() {
|
|
73
|
+
try {
|
|
74
|
+
const response = await this.query('Test connection. Respond with: OK');
|
|
75
|
+
return !response.error && response.response.includes('OK');
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=openai-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-client.js","sourceRoot":"","sources":["../../../src/clients/openai-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* xAI API Client for Grok
|
|
3
|
+
*/
|
|
4
|
+
import { BaseModelClient } from './model-interface.js';
|
|
5
|
+
import { ModelResponse } from '../types.js';
|
|
6
|
+
export declare class XAIClient extends BaseModelClient {
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly provider = "xai";
|
|
9
|
+
private client;
|
|
10
|
+
private model;
|
|
11
|
+
private maxOutputTokens;
|
|
12
|
+
constructor(apiKey: string, model?: string, maxOutputTokens?: number);
|
|
13
|
+
query(prompt: string, systemPrompt?: string): Promise<ModelResponse>;
|
|
14
|
+
testConnection(): Promise<boolean>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=xai-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xai-client.d.ts","sourceRoot":"","sources":["../../../src/clients/xai-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,qBAAa,SAAU,SAAQ,eAAe;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,SAAS;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,eAAe,CAAS;gBAG9B,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAkC,EACzC,eAAe,GAAE,MAAkC;IAY/C,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA+CpE,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;CAQzC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* xAI API Client for Grok
|
|
3
|
+
*/
|
|
4
|
+
import OpenAI from 'openai';
|
|
5
|
+
import { BaseModelClient } from './model-interface.js';
|
|
6
|
+
import { DEFAULT_MAX_OUTPUT_TOKENS } from '../constants.js';
|
|
7
|
+
export class XAIClient extends BaseModelClient {
|
|
8
|
+
name;
|
|
9
|
+
provider = 'xai';
|
|
10
|
+
client;
|
|
11
|
+
model;
|
|
12
|
+
maxOutputTokens;
|
|
13
|
+
constructor(apiKey, model = 'grok-4-1-fast-reasoning', maxOutputTokens = DEFAULT_MAX_OUTPUT_TOKENS) {
|
|
14
|
+
super(apiKey);
|
|
15
|
+
this.client = new OpenAI({
|
|
16
|
+
apiKey,
|
|
17
|
+
baseURL: 'https://api.x.ai/v1'
|
|
18
|
+
});
|
|
19
|
+
this.model = model;
|
|
20
|
+
this.name = model;
|
|
21
|
+
this.maxOutputTokens = maxOutputTokens;
|
|
22
|
+
}
|
|
23
|
+
async query(prompt, systemPrompt) {
|
|
24
|
+
if (!this.isConfigured()) {
|
|
25
|
+
return this.createErrorResponse(new Error('xAI API key not configured'));
|
|
26
|
+
}
|
|
27
|
+
const startTime = Date.now();
|
|
28
|
+
try {
|
|
29
|
+
const messages = [];
|
|
30
|
+
if (systemPrompt) {
|
|
31
|
+
messages.push({
|
|
32
|
+
role: 'system',
|
|
33
|
+
content: systemPrompt
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
messages.push({
|
|
37
|
+
role: 'user',
|
|
38
|
+
content: prompt
|
|
39
|
+
});
|
|
40
|
+
const completion = await this.withRetry(() => this.client.chat.completions.create({
|
|
41
|
+
model: this.model,
|
|
42
|
+
messages,
|
|
43
|
+
temperature: 0.7,
|
|
44
|
+
max_tokens: this.maxOutputTokens,
|
|
45
|
+
}));
|
|
46
|
+
const latency = Date.now() - startTime;
|
|
47
|
+
return {
|
|
48
|
+
modelName: this.name,
|
|
49
|
+
provider: this.provider,
|
|
50
|
+
response: completion.choices[0]?.message?.content || '',
|
|
51
|
+
timestamp: new Date(),
|
|
52
|
+
tokensUsed: completion.usage?.total_tokens,
|
|
53
|
+
latency
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
console.error(`xAI query error:`, error.message);
|
|
58
|
+
return this.createErrorResponse(error);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async testConnection() {
|
|
62
|
+
try {
|
|
63
|
+
const response = await this.query('Test connection. Respond with: OK');
|
|
64
|
+
return !response.error && response.response.includes('OK');
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=xai-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xai-client.js","sourceRoot":"","sources":["../../../src/clients/xai-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAE5D,MAAM,OAAO,SAAU,SAAQ,eAAe;IACnC,IAAI,CAAS;IACb,QAAQ,GAAG,KAAK,CAAC;IAClB,MAAM,CAAS;IACf,KAAK,CAAS;IACd,eAAe,CAAS;IAEhC,YACE,MAAc,EACd,QAAgB,yBAAyB,EACzC,kBAA0B,yBAAyB;QAEnD,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC;YACvB,MAAM;YACN,OAAO,EAAE,qBAAqB;SAC/B,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAc,EAAE,YAAqB;QAC/C,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC;YACH,MAAM,QAAQ,GAA6C,EAAE,CAAC;YAE9D,IAAI,YAAY,EAAE,CAAC;gBACjB,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,YAAY;iBACtB,CAAC,CAAC;YACL,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAC3C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBAClC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ;gBACR,WAAW,EAAE,GAAG;gBAChB,UAAU,EAAE,IAAI,CAAC,eAAe;aACjC,CAAC,CACH,CAAC;YAEF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAEvC,OAAO;gBACL,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;gBACvD,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,UAAU,EAAE,UAAU,CAAC,KAAK,EAAE,YAAY;gBAC1C,OAAO;aACR,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACvE,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* decisionmemos — Query multiple AI models in parallel.
|
|
3
|
+
*
|
|
4
|
+
* Free SDK: Query GPT, Claude, Grok, and Gemini with one call.
|
|
5
|
+
* Get typed responses from all models — no boilerplate.
|
|
6
|
+
*
|
|
7
|
+
* For structured verdicts with consensus scoring, advisor personas,
|
|
8
|
+
* synthesis, and Decision Memos → use the hosted API at decisionmemos.com
|
|
9
|
+
*/
|
|
10
|
+
export { MultiModelQuery, createMultiModelQuery, } from './multi-model-query.js';
|
|
11
|
+
export type { MultiModelOptions, MultiModelResult, } from './multi-model-query.js';
|
|
12
|
+
export type { AIModelClient } from './clients/index.js';
|
|
13
|
+
export { BaseModelClient } from './clients/index.js';
|
|
14
|
+
export { OpenAIClient } from './clients/index.js';
|
|
15
|
+
export { XAIClient } from './clients/index.js';
|
|
16
|
+
export { AnthropicClient } from './clients/index.js';
|
|
17
|
+
export { GoogleClient } from './clients/index.js';
|
|
18
|
+
export type { ModelConfig, ModelResponse, } from './types.js';
|
|
19
|
+
export type { DecisionMemo, ConsensusLevel, BriefingQuestion, BriefingAnswers, } from './types.js';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,EACL,eAAe,EACf,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAEhC,YAAY,EACV,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAGhC,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,YAAY,EACV,WAAW,EACX,aAAa,GACd,MAAM,YAAY,CAAC;AAUpB,YAAY,EACV,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* decisionmemos — Query multiple AI models in parallel.
|
|
3
|
+
*
|
|
4
|
+
* Free SDK: Query GPT, Claude, Grok, and Gemini with one call.
|
|
5
|
+
* Get typed responses from all models — no boilerplate.
|
|
6
|
+
*
|
|
7
|
+
* For structured verdicts with consensus scoring, advisor personas,
|
|
8
|
+
* synthesis, and Decision Memos → use the hosted API at decisionmemos.com
|
|
9
|
+
*/
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Free SDK — Multi-model parallel querying
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Main entry point
|
|
14
|
+
export { MultiModelQuery, createMultiModelQuery, } from './multi-model-query.js';
|
|
15
|
+
export { BaseModelClient } from './clients/index.js';
|
|
16
|
+
export { OpenAIClient } from './clients/index.js';
|
|
17
|
+
export { XAIClient } from './clients/index.js';
|
|
18
|
+
export { AnthropicClient } from './clients/index.js';
|
|
19
|
+
export { GoogleClient } from './clients/index.js';
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,8EAA8E;AAC9E,2CAA2C;AAC3C,8EAA8E;AAE9E,mBAAmB;AACnB,OAAO,EACL,eAAe,EACf,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAShC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MultiModelQuery — The free, open-source entry point.
|
|
3
|
+
*
|
|
4
|
+
* Query multiple AI models in parallel and get typed responses back.
|
|
5
|
+
* This is the convenience layer: one call, four models, typed results.
|
|
6
|
+
*
|
|
7
|
+
* For structured verdicts with consensus scoring, synthesis, and
|
|
8
|
+
* Decision Memos, use the hosted API at decisionmemos.com
|
|
9
|
+
*/
|
|
10
|
+
import { ModelResponse } from './types.js';
|
|
11
|
+
import { AIModelClient } from './clients/model-interface.js';
|
|
12
|
+
export interface MultiModelOptions {
|
|
13
|
+
/** Override which model clients to use. Auto-detects from env vars if not provided. */
|
|
14
|
+
clients?: AIModelClient[];
|
|
15
|
+
/** Custom keys (alternative to env vars) */
|
|
16
|
+
keys?: {
|
|
17
|
+
openai?: string;
|
|
18
|
+
anthropic?: string;
|
|
19
|
+
xai?: string;
|
|
20
|
+
google?: string;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export interface MultiModelResult {
|
|
24
|
+
/** The original question */
|
|
25
|
+
question: string;
|
|
26
|
+
/** Individual model responses (one per configured model) */
|
|
27
|
+
responses: ModelResponse[];
|
|
28
|
+
/** How many models responded successfully */
|
|
29
|
+
successCount: number;
|
|
30
|
+
/** How many models failed or were unavailable */
|
|
31
|
+
errorCount: number;
|
|
32
|
+
/** Total wall-clock time for the parallel query (ms) */
|
|
33
|
+
totalLatency: number;
|
|
34
|
+
/** Timestamp of the query */
|
|
35
|
+
timestamp: Date;
|
|
36
|
+
}
|
|
37
|
+
export declare class MultiModelQuery {
|
|
38
|
+
private clients;
|
|
39
|
+
constructor(options?: MultiModelOptions);
|
|
40
|
+
/**
|
|
41
|
+
* Query all configured models in parallel with the same question.
|
|
42
|
+
*
|
|
43
|
+
* @param question - The question or prompt to send to all models
|
|
44
|
+
* @param systemPrompt - Optional system-level instructions sent to every model
|
|
45
|
+
* @returns Typed results from all models
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```ts
|
|
49
|
+
* const query = createMultiModelQuery();
|
|
50
|
+
* const result = await query.ask("Should we use GraphQL or REST?");
|
|
51
|
+
*
|
|
52
|
+
* for (const r of result.responses) {
|
|
53
|
+
* console.log(`${r.modelName}: ${r.response.slice(0, 100)}...`);
|
|
54
|
+
* }
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
ask(question: string, systemPrompt?: string): Promise<MultiModelResult>;
|
|
58
|
+
/**
|
|
59
|
+
* Test connectivity to all configured models.
|
|
60
|
+
*/
|
|
61
|
+
testConnections(): Promise<{
|
|
62
|
+
model: string;
|
|
63
|
+
provider: string;
|
|
64
|
+
ok: boolean;
|
|
65
|
+
}[]>;
|
|
66
|
+
/**
|
|
67
|
+
* Get the number and names of configured models.
|
|
68
|
+
*/
|
|
69
|
+
getStatus(): {
|
|
70
|
+
count: number;
|
|
71
|
+
models: {
|
|
72
|
+
name: string;
|
|
73
|
+
provider: string;
|
|
74
|
+
}[];
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Create a MultiModelQuery instance. Reads API keys from env vars by default.
|
|
79
|
+
*
|
|
80
|
+
* This is the free SDK entry point — query 4 models in parallel, get typed responses.
|
|
81
|
+
* For structured verdicts, consensus scoring, and Decision Memos, use the hosted API.
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```ts
|
|
85
|
+
* import { createMultiModelQuery } from 'decisionmemos';
|
|
86
|
+
*
|
|
87
|
+
* const query = createMultiModelQuery();
|
|
88
|
+
* const result = await query.ask("Should we use Kubernetes?");
|
|
89
|
+
*
|
|
90
|
+
* console.log(`${result.successCount} models responded`);
|
|
91
|
+
* for (const r of result.responses) {
|
|
92
|
+
* console.log(`[${r.modelName}] ${r.response.slice(0, 100)}...`);
|
|
93
|
+
* }
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
export declare function createMultiModelQuery(options?: MultiModelOptions): MultiModelQuery;
|
|
97
|
+
//# sourceMappingURL=multi-model-query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-model-query.d.ts","sourceRoot":"","sources":["../../src/multi-model-query.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAU7D,MAAM,WAAW,iBAAiB;IAChC,uFAAuF;IACvF,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAE1B,4CAA4C;IAC5C,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IAEjB,4DAA4D;IAC5D,SAAS,EAAE,aAAa,EAAE,CAAC;IAE3B,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IAErB,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;IAEnB,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;IAErB,6BAA6B;IAC7B,SAAS,EAAE,IAAI,CAAC;CACjB;AAMD,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAkB;gBAErB,OAAO,GAAE,iBAAsB;IA0B3C;;;;;;;;;;;;;;;;OAgBG;IACG,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA+B7E;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IAcpF;;OAEG;IACH,SAAS,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE;CAM7E;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,iBAAsB,GAAG,eAAe,CAEtF"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MultiModelQuery — The free, open-source entry point.
|
|
3
|
+
*
|
|
4
|
+
* Query multiple AI models in parallel and get typed responses back.
|
|
5
|
+
* This is the convenience layer: one call, four models, typed results.
|
|
6
|
+
*
|
|
7
|
+
* For structured verdicts with consensus scoring, synthesis, and
|
|
8
|
+
* Decision Memos, use the hosted API at decisionmemos.com
|
|
9
|
+
*/
|
|
10
|
+
import { OpenAIClient } from './clients/openai-client.js';
|
|
11
|
+
import { XAIClient } from './clients/xai-client.js';
|
|
12
|
+
import { AnthropicClient } from './clients/anthropic-client.js';
|
|
13
|
+
import { GoogleClient } from './clients/google-client.js';
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// MultiModelQuery
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
export class MultiModelQuery {
|
|
18
|
+
clients;
|
|
19
|
+
constructor(options = {}) {
|
|
20
|
+
if (options.clients) {
|
|
21
|
+
this.clients = options.clients.filter((c) => c.isConfigured());
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
const keys = options.keys || {};
|
|
25
|
+
this.clients = [
|
|
26
|
+
new OpenAIClient(keys.openai || process.env.OPENAI_API_KEY || '', process.env.OPENAI_MODEL || 'gpt-5.2'),
|
|
27
|
+
new XAIClient(keys.xai || process.env.XAI_API_KEY || '', process.env.XAI_MODEL || 'grok-4-1-fast-reasoning'),
|
|
28
|
+
new AnthropicClient(keys.anthropic || process.env.ANTHROPIC_API_KEY || '', process.env.ANTHROPIC_MODEL || 'claude-sonnet-4-6'),
|
|
29
|
+
new GoogleClient(keys.google || process.env.GOOGLE_API_KEY || '', process.env.GOOGLE_MODEL || 'gemini-3-pro-preview'),
|
|
30
|
+
].filter((c) => c.isConfigured());
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Query all configured models in parallel with the same question.
|
|
35
|
+
*
|
|
36
|
+
* @param question - The question or prompt to send to all models
|
|
37
|
+
* @param systemPrompt - Optional system-level instructions sent to every model
|
|
38
|
+
* @returns Typed results from all models
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```ts
|
|
42
|
+
* const query = createMultiModelQuery();
|
|
43
|
+
* const result = await query.ask("Should we use GraphQL or REST?");
|
|
44
|
+
*
|
|
45
|
+
* for (const r of result.responses) {
|
|
46
|
+
* console.log(`${r.modelName}: ${r.response.slice(0, 100)}...`);
|
|
47
|
+
* }
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
async ask(question, systemPrompt) {
|
|
51
|
+
const start = Date.now();
|
|
52
|
+
const responses = await Promise.all(this.clients.map((client) => client.query(question, systemPrompt).catch((err) => ({
|
|
53
|
+
modelName: client.name,
|
|
54
|
+
provider: client.provider,
|
|
55
|
+
response: '',
|
|
56
|
+
timestamp: new Date(),
|
|
57
|
+
latency: 0,
|
|
58
|
+
error: err.message || 'Unknown error',
|
|
59
|
+
}))));
|
|
60
|
+
const totalLatency = Date.now() - start;
|
|
61
|
+
const successCount = responses.filter((r) => !r.error).length;
|
|
62
|
+
return {
|
|
63
|
+
question,
|
|
64
|
+
responses,
|
|
65
|
+
successCount,
|
|
66
|
+
errorCount: responses.length - successCount,
|
|
67
|
+
totalLatency,
|
|
68
|
+
timestamp: new Date(),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Test connectivity to all configured models.
|
|
73
|
+
*/
|
|
74
|
+
async testConnections() {
|
|
75
|
+
const results = await Promise.all(this.clients.map(async (client) => {
|
|
76
|
+
try {
|
|
77
|
+
const ok = await client.testConnection();
|
|
78
|
+
return { model: client.name, provider: client.provider, ok };
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return { model: client.name, provider: client.provider, ok: false };
|
|
82
|
+
}
|
|
83
|
+
}));
|
|
84
|
+
return results;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get the number and names of configured models.
|
|
88
|
+
*/
|
|
89
|
+
getStatus() {
|
|
90
|
+
return {
|
|
91
|
+
count: this.clients.length,
|
|
92
|
+
models: this.clients.map((c) => ({ name: c.name, provider: c.provider })),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
// Factory
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
/**
|
|
100
|
+
* Create a MultiModelQuery instance. Reads API keys from env vars by default.
|
|
101
|
+
*
|
|
102
|
+
* This is the free SDK entry point — query 4 models in parallel, get typed responses.
|
|
103
|
+
* For structured verdicts, consensus scoring, and Decision Memos, use the hosted API.
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```ts
|
|
107
|
+
* import { createMultiModelQuery } from 'decisionmemos';
|
|
108
|
+
*
|
|
109
|
+
* const query = createMultiModelQuery();
|
|
110
|
+
* const result = await query.ask("Should we use Kubernetes?");
|
|
111
|
+
*
|
|
112
|
+
* console.log(`${result.successCount} models responded`);
|
|
113
|
+
* for (const r of result.responses) {
|
|
114
|
+
* console.log(`[${r.modelName}] ${r.response.slice(0, 100)}...`);
|
|
115
|
+
* }
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
export function createMultiModelQuery(options = {}) {
|
|
119
|
+
return new MultiModelQuery(options);
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=multi-model-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-model-query.js","sourceRoot":"","sources":["../../src/multi-model-query.ts"],"names":[],"mappings":"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"}
|