@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.
Files changed (53) hide show
  1. package/dist/adapters/langchain.d.ts +65 -0
  2. package/dist/adapters/langchain.d.ts.map +1 -0
  3. package/dist/adapters/langchain.js +80 -0
  4. package/dist/adapters/langchain.js.map +1 -0
  5. package/dist/ci.d.ts +31 -0
  6. package/dist/ci.d.ts.map +1 -0
  7. package/dist/ci.js +105 -0
  8. package/dist/ci.js.map +1 -0
  9. package/dist/client.d.ts +136 -0
  10. package/dist/client.d.ts.map +1 -0
  11. package/dist/client.js +92 -0
  12. package/dist/client.js.map +1 -0
  13. package/dist/github.d.ts +35 -0
  14. package/dist/github.d.ts.map +1 -0
  15. package/dist/github.js +113 -0
  16. package/dist/github.js.map +1 -0
  17. package/dist/index.d.ts +19 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +19 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/llm/anthropic.d.ts +18 -0
  22. package/dist/llm/anthropic.d.ts.map +1 -0
  23. package/dist/llm/anthropic.js +91 -0
  24. package/dist/llm/anthropic.js.map +1 -0
  25. package/dist/llm/google.d.ts +18 -0
  26. package/dist/llm/google.d.ts.map +1 -0
  27. package/dist/llm/google.js +97 -0
  28. package/dist/llm/google.js.map +1 -0
  29. package/dist/llm/index.d.ts +14 -0
  30. package/dist/llm/index.d.ts.map +1 -0
  31. package/dist/llm/index.js +29 -0
  32. package/dist/llm/index.js.map +1 -0
  33. package/dist/llm/openai.d.ts +18 -0
  34. package/dist/llm/openai.d.ts.map +1 -0
  35. package/dist/llm/openai.js +78 -0
  36. package/dist/llm/openai.js.map +1 -0
  37. package/dist/llm/provider.d.ts +42 -0
  38. package/dist/llm/provider.d.ts.map +1 -0
  39. package/dist/llm/provider.js +7 -0
  40. package/dist/llm/provider.js.map +1 -0
  41. package/dist/multiverse.d.ts +105 -0
  42. package/dist/multiverse.d.ts.map +1 -0
  43. package/dist/multiverse.js +449 -0
  44. package/dist/multiverse.js.map +1 -0
  45. package/dist/report.d.ts +30 -0
  46. package/dist/report.d.ts.map +1 -0
  47. package/dist/report.js +128 -0
  48. package/dist/report.js.map +1 -0
  49. package/dist/simulate.d.ts +49 -0
  50. package/dist/simulate.d.ts.map +1 -0
  51. package/dist/simulate.js +476 -0
  52. package/dist/simulate.js.map +1 -0
  53. 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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"}
@@ -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":"AAAA;;GAEG;AAKH,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAEzC,MAAM,OAAO,cAAc;IACzB,IAAI,GAAG,QAAQ,CAAC;IACR,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,kDAAkD,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAuB,EAAE,KAAwB;QAC1D,oCAAoC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAEhD,MAAM,IAAI,GAA4B;YACpC,QAAQ;YACR,gBAAgB,EAAE;gBAChB,eAAe,EAAE,IAAI;aACtB;SACF,CAAC;QAEF,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,GAAG,CAAC;oBACZ,oBAAoB,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBACpC,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;wBAC1B,UAAU,EAAE,CAAC,CAAC,UAAU;qBACzB,CAAC,CAAC;iBACJ,CAAC,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,IAAI,CAAC,OAAO,WAAW,IAAI,CAAC,KAAK,wBAAwB,IAAI,CAAC,MAAM,EAAE,EACzE;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CACF,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAY/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,eAAe,CAAC,QAAuB;QAI7C,MAAM,QAAQ,GAA4D,EAAE,CAAC;QAE7E,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC9B,iEAAiE;gBACjE,SAAS;YACX,CAAC;YAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;YAC7D,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI;gBACJ,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;aACnC,CAAC,CAAC;QACL,CAAC;QAED,6CAA6C;QAC7C,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAC9D,IAAI,aAAa,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACxE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,aAAa,CAAC,OAAO,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzF,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,aAAa,CAAC,IAYrB;QACC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;QACtC,MAAM,WAAW,GAAG,KAAK;aACtB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aACnB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAChB,IAAI,CAAC,EAAE,CAAC,CAAC;QAEZ,MAAM,SAAS,GAAG,KAAK;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;aAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACd,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,IAAI,EAAE,CAAC,CAAC,YAAa,CAAC,IAAI;YAC1B,SAAS,EAAE,CAAC,CAAC,YAAa,CAAC,IAAI;SAChC,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,oBAAoB,CAAC,MAAsB;IACzD,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
@@ -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,7 @@
1
+ /**
2
+ * LLM Provider Interface
3
+ *
4
+ * Abstract interface for different LLM providers (Anthropic, OpenAI, Google).
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/llm/provider.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}