@virtualkitchenco/multiverse-sdk 0.0.1
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/dist/adapters/langchain.d.ts +65 -0
- package/dist/adapters/langchain.d.ts.map +1 -0
- package/dist/adapters/langchain.js +80 -0
- package/dist/adapters/langchain.js.map +1 -0
- package/dist/ci.d.ts +31 -0
- package/dist/ci.d.ts.map +1 -0
- package/dist/ci.js +105 -0
- package/dist/ci.js.map +1 -0
- package/dist/client.d.ts +136 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +92 -0
- package/dist/client.js.map +1 -0
- package/dist/github.d.ts +35 -0
- package/dist/github.d.ts.map +1 -0
- package/dist/github.js +113 -0
- package/dist/github.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/anthropic.d.ts +18 -0
- package/dist/llm/anthropic.d.ts.map +1 -0
- package/dist/llm/anthropic.js +91 -0
- package/dist/llm/anthropic.js.map +1 -0
- package/dist/llm/google.d.ts +18 -0
- package/dist/llm/google.d.ts.map +1 -0
- package/dist/llm/google.js +97 -0
- package/dist/llm/google.js.map +1 -0
- package/dist/llm/index.d.ts +14 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +29 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/openai.d.ts +18 -0
- package/dist/llm/openai.d.ts.map +1 -0
- package/dist/llm/openai.js +78 -0
- package/dist/llm/openai.js.map +1 -0
- package/dist/llm/provider.d.ts +42 -0
- package/dist/llm/provider.d.ts.map +1 -0
- package/dist/llm/provider.js +7 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/multiverse.d.ts +105 -0
- package/dist/multiverse.d.ts.map +1 -0
- package/dist/multiverse.js +449 -0
- package/dist/multiverse.js.map +1 -0
- package/dist/report.d.ts +30 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +128 -0
- package/dist/report.js.map +1 -0
- package/dist/simulate.d.ts +49 -0
- package/dist/simulate.d.ts.map +1 -0
- package/dist/simulate.js +476 -0
- package/dist/simulate.js.map +1 -0
- package/package.json +68 -0
package/dist/github.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub PR Integration
|
|
3
|
+
*
|
|
4
|
+
* Posts report cards to GitHub PRs via the GitHub API.
|
|
5
|
+
*/
|
|
6
|
+
const COMMENT_MARKER = '<!-- multiverse-report -->';
|
|
7
|
+
/**
|
|
8
|
+
* Post or update a comment on a GitHub PR
|
|
9
|
+
*
|
|
10
|
+
* Uses a marker comment to find and update existing comments
|
|
11
|
+
* instead of creating duplicates on each run.
|
|
12
|
+
*/
|
|
13
|
+
export async function postToPR(markdown, options) {
|
|
14
|
+
const { token, owner, repo, prNumber } = options;
|
|
15
|
+
const apiBase = 'https://api.github.com';
|
|
16
|
+
// Add marker to identify our comments
|
|
17
|
+
const body = `${COMMENT_MARKER}\n${markdown}`;
|
|
18
|
+
// Check for existing comment
|
|
19
|
+
const existingId = await findExistingComment(token, owner, repo, prNumber);
|
|
20
|
+
if (existingId) {
|
|
21
|
+
// Update existing comment
|
|
22
|
+
const response = await fetch(`${apiBase}/repos/${owner}/${repo}/issues/comments/${existingId}`, {
|
|
23
|
+
method: 'PATCH',
|
|
24
|
+
headers: {
|
|
25
|
+
'Authorization': `Bearer ${token}`,
|
|
26
|
+
'Accept': 'application/vnd.github.v3+json',
|
|
27
|
+
'Content-Type': 'application/json',
|
|
28
|
+
},
|
|
29
|
+
body: JSON.stringify({ body }),
|
|
30
|
+
});
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
const error = await response.text();
|
|
33
|
+
throw new Error(`Failed to update PR comment: ${response.status} ${error}`);
|
|
34
|
+
}
|
|
35
|
+
const data = await response.json();
|
|
36
|
+
return { commentId: existingId, url: data.html_url };
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
// Create new comment
|
|
40
|
+
const response = await fetch(`${apiBase}/repos/${owner}/${repo}/issues/${prNumber}/comments`, {
|
|
41
|
+
method: 'POST',
|
|
42
|
+
headers: {
|
|
43
|
+
'Authorization': `Bearer ${token}`,
|
|
44
|
+
'Accept': 'application/vnd.github.v3+json',
|
|
45
|
+
'Content-Type': 'application/json',
|
|
46
|
+
},
|
|
47
|
+
body: JSON.stringify({ body }),
|
|
48
|
+
});
|
|
49
|
+
if (!response.ok) {
|
|
50
|
+
const error = await response.text();
|
|
51
|
+
throw new Error(`Failed to create PR comment: ${response.status} ${error}`);
|
|
52
|
+
}
|
|
53
|
+
const data = await response.json();
|
|
54
|
+
return { commentId: data.id, url: data.html_url };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Find existing Multiverse comment on a PR
|
|
59
|
+
*/
|
|
60
|
+
async function findExistingComment(token, owner, repo, prNumber) {
|
|
61
|
+
const apiBase = 'https://api.github.com';
|
|
62
|
+
const response = await fetch(`${apiBase}/repos/${owner}/${repo}/issues/${prNumber}/comments`, {
|
|
63
|
+
headers: {
|
|
64
|
+
'Authorization': `Bearer ${token}`,
|
|
65
|
+
'Accept': 'application/vnd.github.v3+json',
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
if (!response.ok) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
const comments = await response.json();
|
|
72
|
+
for (const comment of comments) {
|
|
73
|
+
if (comment.body.includes(COMMENT_MARKER)) {
|
|
74
|
+
return comment.id;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Build GitHub options from CI context
|
|
81
|
+
*/
|
|
82
|
+
export function buildGitHubOptions(ci, token) {
|
|
83
|
+
if (!ci.isPR || !ci.prNumber || !ci.repo) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
token,
|
|
88
|
+
owner: ci.repo.owner,
|
|
89
|
+
repo: ci.repo.name,
|
|
90
|
+
prNumber: ci.prNumber,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Post report to PR if running in CI with appropriate context
|
|
95
|
+
*/
|
|
96
|
+
export async function postReportToPR(markdown, ci) {
|
|
97
|
+
const token = process.env.GITHUB_TOKEN;
|
|
98
|
+
if (!token) {
|
|
99
|
+
return { posted: false, error: 'GITHUB_TOKEN not set' };
|
|
100
|
+
}
|
|
101
|
+
const options = buildGitHubOptions(ci, token);
|
|
102
|
+
if (!options) {
|
|
103
|
+
return { posted: false, error: 'Not in a PR context' };
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const result = await postToPR(markdown, options);
|
|
107
|
+
return { posted: true, url: result.url };
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
return { posted: false, error: String(err) };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multiverse SDK - Thin Client
|
|
3
|
+
*
|
|
4
|
+
* All simulation runs on the server. This SDK wraps tools,
|
|
5
|
+
* orchestrates tests via API, and runs your agent locally.
|
|
6
|
+
*/
|
|
7
|
+
export { multiverse } from './multiverse.js';
|
|
8
|
+
export { MultiverseClient } from './client.js';
|
|
9
|
+
export type { APIClientConfig, SimulateRequest, SimulateResponse } from './client.js';
|
|
10
|
+
export type { Scenario, Persona, PersonaStyle, PlannedFailure, FailureType, ExpectedBehavior, Trace, TraceEntry, QualityResult, TestResults, RunResult, CoverageStats, ToolConfig, LLMConfig, LLMProvider, SuccessFn, WorldStateAccessor, Effect, EffectsFn, Invariant, InvariantCondition, Entity, } from '@virtualkitchenco/multiverse-types';
|
|
11
|
+
export { wrap, toolConfigRegistry } from './adapters/langchain.js';
|
|
12
|
+
export type { WrapConfig } from './adapters/langchain.js';
|
|
13
|
+
export { detectCI, hasGitHubToken, getGitHubToken } from './ci.js';
|
|
14
|
+
export type { CIContext } from './ci.js';
|
|
15
|
+
export { generateReportCard, generateSummary, generateBadgeUrl, calculateTier } from './report.js';
|
|
16
|
+
export type { ReportOptions } from './report.js';
|
|
17
|
+
export { postToPR, postReportToPR, buildGitHubOptions } from './github.js';
|
|
18
|
+
export type { GitHubOptions } from './github.js';
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGtF,YAAY,EACV,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,KAAK,EACL,UAAU,EACV,aAAa,EACb,WAAW,EACX,SAAS,EACT,aAAa,EACb,UAAU,EACV,SAAS,EACT,WAAW,EACX,SAAS,EACT,kBAAkB,EAClB,MAAM,EACN,SAAS,EACT,SAAS,EACT,kBAAkB,EAClB,MAAM,GACP,MAAM,oCAAoC,CAAC;AAG5C,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACnE,YAAY,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAG1D,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACnE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGzC,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACnG,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC3E,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multiverse SDK - Thin Client
|
|
3
|
+
*
|
|
4
|
+
* All simulation runs on the server. This SDK wraps tools,
|
|
5
|
+
* orchestrates tests via API, and runs your agent locally.
|
|
6
|
+
*/
|
|
7
|
+
// Main API
|
|
8
|
+
export { multiverse } from './multiverse.js';
|
|
9
|
+
// API Client (for direct use if needed)
|
|
10
|
+
export { MultiverseClient } from './client.js';
|
|
11
|
+
// LangChain adapter
|
|
12
|
+
export { wrap, toolConfigRegistry } from './adapters/langchain.js';
|
|
13
|
+
// CI Integration
|
|
14
|
+
export { detectCI, hasGitHubToken, getGitHubToken } from './ci.js';
|
|
15
|
+
// Report Generation
|
|
16
|
+
export { generateReportCard, generateSummary, generateBadgeUrl, calculateTier } from './report.js';
|
|
17
|
+
// GitHub Integration
|
|
18
|
+
export { postToPR, postReportToPR, buildGitHubOptions } from './github.js';
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,WAAW;AACX,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,wCAAwC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA6B/C,oBAAoB;AACpB,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAGnE,iBAAiB;AACjB,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGnE,oBAAoB;AACpB,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGnG,qBAAqB;AACrB,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic Provider
|
|
3
|
+
*/
|
|
4
|
+
import type { ChatMessage, LLMResponse } from '@multiverse/core';
|
|
5
|
+
import type { LLMProvider, ToolDefinition, ProviderConfig } from './provider.js';
|
|
6
|
+
export declare class AnthropicProvider implements LLMProvider {
|
|
7
|
+
name: string;
|
|
8
|
+
private apiKey;
|
|
9
|
+
private model;
|
|
10
|
+
private baseUrl;
|
|
11
|
+
constructor(config: ProviderConfig);
|
|
12
|
+
chat(messages: ChatMessage[], tools?: ToolDefinition[]): Promise<LLMResponse>;
|
|
13
|
+
generate(prompt: string): Promise<string>;
|
|
14
|
+
private convertMessage;
|
|
15
|
+
private parseResponse;
|
|
16
|
+
}
|
|
17
|
+
export declare function createAnthropicProvider(config: ProviderConfig): LLMProvider;
|
|
18
|
+
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/llm/anthropic.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAIjF,qBAAa,iBAAkB,YAAW,WAAW;IACnD,IAAI,SAAe;IACnB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,cAAc;IAM5B,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAmD7E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/C,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,aAAa;CA2BtB;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,cAAc,GAAG,WAAW,CAE3E"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic Provider
|
|
3
|
+
*/
|
|
4
|
+
const DEFAULT_MODEL = 'claude-sonnet-4-20250514';
|
|
5
|
+
export class AnthropicProvider {
|
|
6
|
+
name = 'anthropic';
|
|
7
|
+
apiKey;
|
|
8
|
+
model;
|
|
9
|
+
baseUrl;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.apiKey = config.apiKey;
|
|
12
|
+
this.model = config.model || DEFAULT_MODEL;
|
|
13
|
+
this.baseUrl = config.baseUrl || 'https://api.anthropic.com';
|
|
14
|
+
}
|
|
15
|
+
async chat(messages, tools) {
|
|
16
|
+
// Separate system message from the rest
|
|
17
|
+
const systemMessage = messages.find(m => m.role === 'system');
|
|
18
|
+
const otherMessages = messages.filter(m => m.role !== 'system');
|
|
19
|
+
const body = {
|
|
20
|
+
model: this.model,
|
|
21
|
+
max_tokens: 4096,
|
|
22
|
+
messages: otherMessages.map(m => this.convertMessage(m)),
|
|
23
|
+
};
|
|
24
|
+
if (systemMessage) {
|
|
25
|
+
body.system = systemMessage.content;
|
|
26
|
+
}
|
|
27
|
+
if (tools && tools.length > 0) {
|
|
28
|
+
body.tools = tools.map(t => ({
|
|
29
|
+
name: t.name,
|
|
30
|
+
description: t.description,
|
|
31
|
+
input_schema: t.parameters,
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
34
|
+
const response = await fetch(`${this.baseUrl}/v1/messages`, {
|
|
35
|
+
method: 'POST',
|
|
36
|
+
headers: {
|
|
37
|
+
'Content-Type': 'application/json',
|
|
38
|
+
'x-api-key': this.apiKey,
|
|
39
|
+
'anthropic-version': '2023-06-01',
|
|
40
|
+
},
|
|
41
|
+
body: JSON.stringify(body),
|
|
42
|
+
});
|
|
43
|
+
if (!response.ok) {
|
|
44
|
+
const error = await response.text();
|
|
45
|
+
throw new Error(`Anthropic API error: ${response.status} ${error}`);
|
|
46
|
+
}
|
|
47
|
+
const data = await response.json();
|
|
48
|
+
return this.parseResponse(data);
|
|
49
|
+
}
|
|
50
|
+
async generate(prompt) {
|
|
51
|
+
const response = await this.chat([{ role: 'user', content: prompt }]);
|
|
52
|
+
return response.content;
|
|
53
|
+
}
|
|
54
|
+
convertMessage(message) {
|
|
55
|
+
if (message.role === 'tool') {
|
|
56
|
+
return {
|
|
57
|
+
role: 'user',
|
|
58
|
+
content: [{
|
|
59
|
+
type: 'tool_result',
|
|
60
|
+
tool_use_id: message.tool_call_id,
|
|
61
|
+
content: message.content,
|
|
62
|
+
}],
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
role: message.role === 'assistant' ? 'assistant' : 'user',
|
|
67
|
+
content: message.content,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
parseResponse(data) {
|
|
71
|
+
const textContent = data.content
|
|
72
|
+
.filter(c => c.type === 'text')
|
|
73
|
+
.map(c => c.text)
|
|
74
|
+
.join('');
|
|
75
|
+
const toolCalls = data.content
|
|
76
|
+
.filter(c => c.type === 'tool_use')
|
|
77
|
+
.map(c => ({
|
|
78
|
+
id: c.id,
|
|
79
|
+
name: c.name,
|
|
80
|
+
arguments: c.input || {},
|
|
81
|
+
}));
|
|
82
|
+
return {
|
|
83
|
+
content: textContent,
|
|
84
|
+
toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export function createAnthropicProvider(config) {
|
|
89
|
+
return new AnthropicProvider(config);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=anthropic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/llm/anthropic.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,aAAa,GAAG,0BAA0B,CAAC;AAEjD,MAAM,OAAO,iBAAiB;IAC5B,IAAI,GAAG,WAAW,CAAC;IACX,MAAM,CAAS;IACf,KAAK,CAAS;IACd,OAAO,CAAS;IAExB,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,aAAa,CAAC;QAC3C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,2BAA2B,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAuB,EAAE,KAAwB;QAC1D,wCAAwC;QACxC,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAC9D,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAEhE,MAAM,IAAI,GAA4B;YACpC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;SACzD,CAAC;QAEF,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC;QACtC,CAAC;QAED,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC3B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,YAAY,EAAE,CAAC,CAAC,UAAU;aAC3B,CAAC,CAAC,CAAC;QACN,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,cAAc,EAAE;YAC1D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,IAAI,CAAC,MAAM;gBACxB,mBAAmB,EAAE,YAAY;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAQ/B,CAAC;QAEF,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACtE,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC;IAEO,cAAc,CAAC,OAAoB;QACzC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5B,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,aAAa;wBACnB,WAAW,EAAE,OAAO,CAAC,YAAY;wBACjC,OAAO,EAAE,OAAO,CAAC,OAAO;qBACzB,CAAC;aACH,CAAC;QACJ,CAAC;QAED,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;YACzD,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;IACJ,CAAC;IAEO,aAAa,CAAC,IAQrB;QACC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO;aAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAChB,IAAI,CAAC,EAAE,CAAC,CAAC;QAEZ,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO;aAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;aAClC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACT,EAAE,EAAE,CAAC,CAAC,EAAG;YACT,IAAI,EAAE,CAAC,CAAC,IAAK;YACb,SAAS,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;SACzB,CAAC,CAAC,CAAC;QAEN,OAAO;YACL,OAAO,EAAE,WAAW;YACpB,SAAS,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;SACxD,CAAC;IACJ,CAAC;CACF;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAsB;IAC5D,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google/Gemini Provider
|
|
3
|
+
*/
|
|
4
|
+
import type { ChatMessage, LLMResponse } from '@multiverse/core';
|
|
5
|
+
import type { LLMProvider, ToolDefinition, ProviderConfig } from './provider.js';
|
|
6
|
+
export declare class GoogleProvider implements LLMProvider {
|
|
7
|
+
name: string;
|
|
8
|
+
private apiKey;
|
|
9
|
+
private model;
|
|
10
|
+
private baseUrl;
|
|
11
|
+
constructor(config: ProviderConfig);
|
|
12
|
+
chat(messages: ChatMessage[], tools?: ToolDefinition[]): Promise<LLMResponse>;
|
|
13
|
+
generate(prompt: string): Promise<string>;
|
|
14
|
+
private convertMessages;
|
|
15
|
+
private parseResponse;
|
|
16
|
+
}
|
|
17
|
+
export declare function createGoogleProvider(config: ProviderConfig): LLMProvider;
|
|
18
|
+
//# sourceMappingURL=google.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/llm/google.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAIjF,qBAAa,cAAe,YAAW,WAAW;IAChD,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,cAAc;IAM5B,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAsD7E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/C,OAAO,CAAC,eAAe;IA4BvB,OAAO,CAAC,aAAa;CAqCtB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,WAAW,CAExE"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google/Gemini Provider
|
|
3
|
+
*/
|
|
4
|
+
const DEFAULT_MODEL = 'gemini-2.0-flash';
|
|
5
|
+
export class GoogleProvider {
|
|
6
|
+
name = 'google';
|
|
7
|
+
apiKey;
|
|
8
|
+
model;
|
|
9
|
+
baseUrl;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.apiKey = config.apiKey;
|
|
12
|
+
this.model = config.model || DEFAULT_MODEL;
|
|
13
|
+
this.baseUrl = config.baseUrl || 'https://generativelanguage.googleapis.com/v1beta';
|
|
14
|
+
}
|
|
15
|
+
async chat(messages, tools) {
|
|
16
|
+
// Convert messages to Gemini format
|
|
17
|
+
const contents = this.convertMessages(messages);
|
|
18
|
+
const body = {
|
|
19
|
+
contents,
|
|
20
|
+
generationConfig: {
|
|
21
|
+
maxOutputTokens: 4096,
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
if (tools && tools.length > 0) {
|
|
25
|
+
body.tools = [{
|
|
26
|
+
functionDeclarations: tools.map(t => ({
|
|
27
|
+
name: t.name,
|
|
28
|
+
description: t.description,
|
|
29
|
+
parameters: t.parameters,
|
|
30
|
+
})),
|
|
31
|
+
}];
|
|
32
|
+
}
|
|
33
|
+
const response = await fetch(`${this.baseUrl}/models/${this.model}:generateContent?key=${this.apiKey}`, {
|
|
34
|
+
method: 'POST',
|
|
35
|
+
headers: {
|
|
36
|
+
'Content-Type': 'application/json',
|
|
37
|
+
},
|
|
38
|
+
body: JSON.stringify(body),
|
|
39
|
+
});
|
|
40
|
+
if (!response.ok) {
|
|
41
|
+
const error = await response.text();
|
|
42
|
+
throw new Error(`Google API error: ${response.status} ${error}`);
|
|
43
|
+
}
|
|
44
|
+
const data = await response.json();
|
|
45
|
+
return this.parseResponse(data);
|
|
46
|
+
}
|
|
47
|
+
async generate(prompt) {
|
|
48
|
+
const response = await this.chat([{ role: 'user', content: prompt }]);
|
|
49
|
+
return response.content;
|
|
50
|
+
}
|
|
51
|
+
convertMessages(messages) {
|
|
52
|
+
const contents = [];
|
|
53
|
+
for (const message of messages) {
|
|
54
|
+
if (message.role === 'system') {
|
|
55
|
+
// Gemini doesn't have system role, prepend to first user message
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const role = message.role === 'assistant' ? 'model' : 'user';
|
|
59
|
+
contents.push({
|
|
60
|
+
role,
|
|
61
|
+
parts: [{ text: message.content }],
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
// Add system message to the start if present
|
|
65
|
+
const systemMessage = messages.find(m => m.role === 'system');
|
|
66
|
+
if (systemMessage && contents.length > 0 && contents[0].role === 'user') {
|
|
67
|
+
contents[0].parts[0].text = `${systemMessage.content}\n\n${contents[0].parts[0].text}`;
|
|
68
|
+
}
|
|
69
|
+
return contents;
|
|
70
|
+
}
|
|
71
|
+
parseResponse(data) {
|
|
72
|
+
const candidate = data.candidates[0];
|
|
73
|
+
if (!candidate) {
|
|
74
|
+
return { content: '' };
|
|
75
|
+
}
|
|
76
|
+
const parts = candidate.content.parts;
|
|
77
|
+
const textContent = parts
|
|
78
|
+
.filter(p => p.text)
|
|
79
|
+
.map(p => p.text)
|
|
80
|
+
.join('');
|
|
81
|
+
const toolCalls = parts
|
|
82
|
+
.filter(p => p.functionCall)
|
|
83
|
+
.map((p, i) => ({
|
|
84
|
+
id: `call_${i}`,
|
|
85
|
+
name: p.functionCall.name,
|
|
86
|
+
arguments: p.functionCall.args,
|
|
87
|
+
}));
|
|
88
|
+
return {
|
|
89
|
+
content: textContent,
|
|
90
|
+
toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export function createGoogleProvider(config) {
|
|
95
|
+
return new GoogleProvider(config);
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=google.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google.js","sourceRoot":"","sources":["../../src/llm/google.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Providers
|
|
3
|
+
*/
|
|
4
|
+
export type { LLMProvider, ToolDefinition, ProviderConfig } from './provider.js';
|
|
5
|
+
export { createAnthropicProvider, AnthropicProvider } from './anthropic.js';
|
|
6
|
+
export { createOpenAIProvider, OpenAIProvider } from './openai.js';
|
|
7
|
+
export { createGoogleProvider, GoogleProvider } from './google.js';
|
|
8
|
+
import type { LLMConfig } from '@multiverse/core';
|
|
9
|
+
import type { LLMProvider } from './provider.js';
|
|
10
|
+
/**
|
|
11
|
+
* Create an LLM provider based on config
|
|
12
|
+
*/
|
|
13
|
+
export declare function createProvider(config: LLMConfig): LLMProvider;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,eAAe,CAAC;AAKjE;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW,CAgB7D"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Providers
|
|
3
|
+
*/
|
|
4
|
+
export { createAnthropicProvider, AnthropicProvider } from './anthropic.js';
|
|
5
|
+
export { createOpenAIProvider, OpenAIProvider } from './openai.js';
|
|
6
|
+
export { createGoogleProvider, GoogleProvider } from './google.js';
|
|
7
|
+
import { createAnthropicProvider } from './anthropic.js';
|
|
8
|
+
import { createOpenAIProvider } from './openai.js';
|
|
9
|
+
import { createGoogleProvider } from './google.js';
|
|
10
|
+
/**
|
|
11
|
+
* Create an LLM provider based on config
|
|
12
|
+
*/
|
|
13
|
+
export function createProvider(config) {
|
|
14
|
+
const providerConfig = {
|
|
15
|
+
apiKey: config.apiKey,
|
|
16
|
+
model: config.model,
|
|
17
|
+
};
|
|
18
|
+
switch (config.provider) {
|
|
19
|
+
case 'anthropic':
|
|
20
|
+
return createAnthropicProvider(providerConfig);
|
|
21
|
+
case 'openai':
|
|
22
|
+
return createOpenAIProvider(providerConfig);
|
|
23
|
+
case 'google':
|
|
24
|
+
return createGoogleProvider(providerConfig);
|
|
25
|
+
default:
|
|
26
|
+
throw new Error(`Unknown provider: ${config.provider}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAInE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAiB;IAC9C,MAAM,cAAc,GAAmB;QACrC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC;IAEF,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,WAAW;YACd,OAAO,uBAAuB,CAAC,cAAc,CAAC,CAAC;QACjD,KAAK,QAAQ;YACX,OAAO,oBAAoB,CAAC,cAAc,CAAC,CAAC;QAC9C,KAAK,QAAQ;YACX,OAAO,oBAAoB,CAAC,cAAc,CAAC,CAAC;QAC9C;YACE,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Provider
|
|
3
|
+
*/
|
|
4
|
+
import type { ChatMessage, LLMResponse } from '@multiverse/core';
|
|
5
|
+
import type { LLMProvider, ToolDefinition, ProviderConfig } from './provider.js';
|
|
6
|
+
export declare class OpenAIProvider implements LLMProvider {
|
|
7
|
+
name: string;
|
|
8
|
+
private apiKey;
|
|
9
|
+
private model;
|
|
10
|
+
private baseUrl;
|
|
11
|
+
constructor(config: ProviderConfig);
|
|
12
|
+
chat(messages: ChatMessage[], tools?: ToolDefinition[]): Promise<LLMResponse>;
|
|
13
|
+
generate(prompt: string): Promise<string>;
|
|
14
|
+
private convertMessage;
|
|
15
|
+
private parseResponse;
|
|
16
|
+
}
|
|
17
|
+
export declare function createOpenAIProvider(config: ProviderConfig): LLMProvider;
|
|
18
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/llm/openai.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAIjF,qBAAa,cAAe,YAAW,WAAW;IAChD,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,cAAc;IAM5B,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAiD7E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/C,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,aAAa;CA2BtB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,WAAW,CAExE"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Provider
|
|
3
|
+
*/
|
|
4
|
+
const DEFAULT_MODEL = 'gpt-4o';
|
|
5
|
+
export class OpenAIProvider {
|
|
6
|
+
name = 'openai';
|
|
7
|
+
apiKey;
|
|
8
|
+
model;
|
|
9
|
+
baseUrl;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.apiKey = config.apiKey;
|
|
12
|
+
this.model = config.model || DEFAULT_MODEL;
|
|
13
|
+
this.baseUrl = config.baseUrl || 'https://api.openai.com';
|
|
14
|
+
}
|
|
15
|
+
async chat(messages, tools) {
|
|
16
|
+
const body = {
|
|
17
|
+
model: this.model,
|
|
18
|
+
messages: messages.map(m => this.convertMessage(m)),
|
|
19
|
+
};
|
|
20
|
+
if (tools && tools.length > 0) {
|
|
21
|
+
body.tools = tools.map(t => ({
|
|
22
|
+
type: 'function',
|
|
23
|
+
function: {
|
|
24
|
+
name: t.name,
|
|
25
|
+
description: t.description,
|
|
26
|
+
parameters: t.parameters,
|
|
27
|
+
},
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {
|
|
31
|
+
method: 'POST',
|
|
32
|
+
headers: {
|
|
33
|
+
'Content-Type': 'application/json',
|
|
34
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
35
|
+
},
|
|
36
|
+
body: JSON.stringify(body),
|
|
37
|
+
});
|
|
38
|
+
if (!response.ok) {
|
|
39
|
+
const error = await response.text();
|
|
40
|
+
throw new Error(`OpenAI API error: ${response.status} ${error}`);
|
|
41
|
+
}
|
|
42
|
+
const data = await response.json();
|
|
43
|
+
return this.parseResponse(data);
|
|
44
|
+
}
|
|
45
|
+
async generate(prompt) {
|
|
46
|
+
const response = await this.chat([{ role: 'user', content: prompt }]);
|
|
47
|
+
return response.content;
|
|
48
|
+
}
|
|
49
|
+
convertMessage(message) {
|
|
50
|
+
if (message.role === 'tool') {
|
|
51
|
+
return {
|
|
52
|
+
role: 'tool',
|
|
53
|
+
tool_call_id: message.tool_call_id,
|
|
54
|
+
content: message.content,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
role: message.role,
|
|
59
|
+
content: message.content,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
parseResponse(data) {
|
|
63
|
+
const message = data.choices[0]?.message;
|
|
64
|
+
const toolCalls = message?.tool_calls?.map(tc => ({
|
|
65
|
+
id: tc.id,
|
|
66
|
+
name: tc.function.name,
|
|
67
|
+
arguments: JSON.parse(tc.function.arguments),
|
|
68
|
+
}));
|
|
69
|
+
return {
|
|
70
|
+
content: message?.content || '',
|
|
71
|
+
toolCalls: toolCalls && toolCalls.length > 0 ? toolCalls : undefined,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export function createOpenAIProvider(config) {
|
|
76
|
+
return new OpenAIProvider(config);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/llm/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Provider Interface
|
|
3
|
+
*
|
|
4
|
+
* Abstract interface for different LLM providers (Anthropic, OpenAI, Google).
|
|
5
|
+
*/
|
|
6
|
+
import type { ChatMessage, LLMResponse } from '@multiverse/core';
|
|
7
|
+
/**
|
|
8
|
+
* LLM Provider interface
|
|
9
|
+
*/
|
|
10
|
+
export interface LLMProvider {
|
|
11
|
+
/** Provider name */
|
|
12
|
+
name: string;
|
|
13
|
+
/** Generate a response from messages */
|
|
14
|
+
chat(messages: ChatMessage[], tools?: ToolDefinition[]): Promise<LLMResponse>;
|
|
15
|
+
/** Generate a simple text completion */
|
|
16
|
+
generate(prompt: string): Promise<string>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Tool definition for function calling
|
|
20
|
+
*/
|
|
21
|
+
export interface ToolDefinition {
|
|
22
|
+
name: string;
|
|
23
|
+
description: string;
|
|
24
|
+
parameters: {
|
|
25
|
+
type: 'object';
|
|
26
|
+
properties: Record<string, {
|
|
27
|
+
type: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
enum?: string[];
|
|
30
|
+
}>;
|
|
31
|
+
required?: string[];
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Provider configuration
|
|
36
|
+
*/
|
|
37
|
+
export interface ProviderConfig {
|
|
38
|
+
apiKey: string;
|
|
39
|
+
model?: string;
|
|
40
|
+
baseUrl?: string;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/llm/provider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IAEb,wCAAwC;IACxC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAE9E,wCAAwC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;YACzB,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;SACjB,CAAC,CAAC;QACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/llm/provider.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|