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.
Files changed (40) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/LICENSE +21 -0
  3. package/README.md +191 -0
  4. package/dist/src/clients/anthropic-client.d.ts +16 -0
  5. package/dist/src/clients/anthropic-client.d.ts.map +1 -0
  6. package/dist/src/clients/anthropic-client.js +67 -0
  7. package/dist/src/clients/anthropic-client.js.map +1 -0
  8. package/dist/src/clients/google-client.d.ts +16 -0
  9. package/dist/src/clients/google-client.d.ts.map +1 -0
  10. package/dist/src/clients/google-client.js +59 -0
  11. package/dist/src/clients/google-client.js.map +1 -0
  12. package/dist/src/clients/index.d.ts +10 -0
  13. package/dist/src/clients/index.d.ts.map +1 -0
  14. package/dist/src/clients/index.js +9 -0
  15. package/dist/src/clients/index.js.map +1 -0
  16. package/dist/src/clients/model-interface.d.ts +60 -0
  17. package/dist/src/clients/model-interface.d.ts.map +1 -0
  18. package/dist/src/clients/model-interface.js +109 -0
  19. package/dist/src/clients/model-interface.js.map +1 -0
  20. package/dist/src/clients/openai-client.d.ts +16 -0
  21. package/dist/src/clients/openai-client.d.ts.map +1 -0
  22. package/dist/src/clients/openai-client.js +82 -0
  23. package/dist/src/clients/openai-client.js.map +1 -0
  24. package/dist/src/clients/xai-client.d.ts +16 -0
  25. package/dist/src/clients/xai-client.d.ts.map +1 -0
  26. package/dist/src/clients/xai-client.js +71 -0
  27. package/dist/src/clients/xai-client.js.map +1 -0
  28. package/dist/src/index.d.ts +20 -0
  29. package/dist/src/index.d.ts.map +1 -0
  30. package/dist/src/index.js +20 -0
  31. package/dist/src/index.js.map +1 -0
  32. package/dist/src/multi-model-query.d.ts +97 -0
  33. package/dist/src/multi-model-query.d.ts.map +1 -0
  34. package/dist/src/multi-model-query.js +121 -0
  35. package/dist/src/multi-model-query.js.map +1 -0
  36. package/dist/src/types.d.ts +184 -0
  37. package/dist/src/types.d.ts.map +1 -0
  38. package/dist/src/types.js +5 -0
  39. package/dist/src/types.js.map +1 -0
  40. 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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"}