noumen 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +767 -51
- package/dist/a2a/index.d.ts +148 -0
- package/dist/a2a/index.js +579 -0
- package/dist/a2a/index.js.map +1 -0
- package/dist/acp/index.d.ts +129 -0
- package/dist/acp/index.js +498 -0
- package/dist/acp/index.js.map +1 -0
- package/dist/agent-BrkbZyOT.d.ts +1028 -0
- package/dist/cache-DVqaCX8v.d.ts +38 -0
- package/dist/chunk-2ZTGQLYK.js +356 -0
- package/dist/chunk-2ZTGQLYK.js.map +1 -0
- package/dist/chunk-42PHHZUA.js +132 -0
- package/dist/chunk-42PHHZUA.js.map +1 -0
- package/dist/chunk-4SQA2UCV.js +26 -0
- package/dist/chunk-4SQA2UCV.js.map +1 -0
- package/dist/chunk-5GEX6ZSB.js +179 -0
- package/dist/chunk-5GEX6ZSB.js.map +1 -0
- package/dist/chunk-7ZMN7XJE.js +94 -0
- package/dist/chunk-7ZMN7XJE.js.map +1 -0
- package/dist/chunk-AMYIJSAZ.js +57 -0
- package/dist/chunk-AMYIJSAZ.js.map +1 -0
- package/dist/chunk-BGG2E6JD.js +10 -0
- package/dist/chunk-BGG2E6JD.js.map +1 -0
- package/dist/chunk-BZSFUEWM.js +43 -0
- package/dist/chunk-BZSFUEWM.js.map +1 -0
- package/dist/chunk-CPFHEPW4.js +139 -0
- package/dist/chunk-CPFHEPW4.js.map +1 -0
- package/dist/chunk-D43BWEZA.js +346 -0
- package/dist/chunk-D43BWEZA.js.map +1 -0
- package/dist/chunk-DGUM43GV.js +11 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/chunk-JACGEMTF.js +43 -0
- package/dist/chunk-JACGEMTF.js.map +1 -0
- package/dist/chunk-JX7CLUCV.js +21 -0
- package/dist/chunk-JX7CLUCV.js.map +1 -0
- package/dist/chunk-KXDB56YW.js +39 -0
- package/dist/chunk-KXDB56YW.js.map +1 -0
- package/dist/chunk-KY6ZPWHO.js +112 -0
- package/dist/chunk-KY6ZPWHO.js.map +1 -0
- package/dist/chunk-NBDFQYUZ.js +7992 -0
- package/dist/chunk-NBDFQYUZ.js.map +1 -0
- package/dist/chunk-OGXNFXFA.js +196 -0
- package/dist/chunk-OGXNFXFA.js.map +1 -0
- package/dist/chunk-QTJ7VTJY.js +1994 -0
- package/dist/chunk-QTJ7VTJY.js.map +1 -0
- package/dist/chunk-UVSSQBDY.js +192 -0
- package/dist/chunk-UVSSQBDY.js.map +1 -0
- package/dist/chunk-Y45R3PQL.js +684 -0
- package/dist/chunk-Y45R3PQL.js.map +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +868 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/client/index.d.ts +64 -0
- package/dist/client/index.js +409 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client-CRRO2376.js +10 -0
- package/dist/client-CRRO2376.js.map +1 -0
- package/dist/headless-Q7XHHZIW.js +143 -0
- package/dist/headless-Q7XHHZIW.js.map +1 -0
- package/dist/history-snip-64GYP4ZL.js +12 -0
- package/dist/history-snip-64GYP4ZL.js.map +1 -0
- package/dist/index.d.ts +1305 -418
- package/dist/index.js +384 -1757
- package/dist/index.js.map +1 -1
- package/dist/jsonrpc/index.d.ts +54 -0
- package/dist/jsonrpc/index.js +34 -0
- package/dist/jsonrpc/index.js.map +1 -0
- package/dist/lsp/index.d.ts +36 -0
- package/dist/lsp/index.js +16 -0
- package/dist/lsp/index.js.map +1 -0
- package/dist/lsp-PS3BWIHC.js +8 -0
- package/dist/lsp-PS3BWIHC.js.map +1 -0
- package/dist/manager-DLXK63XC.js +8 -0
- package/dist/manager-DLXK63XC.js.map +1 -0
- package/dist/mcp/index.d.ts +111 -0
- package/dist/mcp/index.js +104 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp-auth-AEI2R4ZC.js +9 -0
- package/dist/mcp-auth-AEI2R4ZC.js.map +1 -0
- package/dist/ollama-YNXAYP3R.js +18 -0
- package/dist/ollama-YNXAYP3R.js.map +1 -0
- package/dist/provider-factory-34MSWJZ3.js +20 -0
- package/dist/provider-factory-34MSWJZ3.js.map +1 -0
- package/dist/providers/anthropic.d.ts +19 -0
- package/dist/providers/anthropic.js +33 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/bedrock.d.ts +39 -0
- package/dist/providers/bedrock.js +54 -0
- package/dist/providers/bedrock.js.map +1 -0
- package/dist/providers/gemini.d.ts +16 -0
- package/dist/providers/gemini.js +224 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/openai.d.ts +18 -0
- package/dist/providers/openai.js +8 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/openrouter.d.ts +16 -0
- package/dist/providers/openrouter.js +23 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/providers/vertex.d.ts +40 -0
- package/dist/providers/vertex.js +64 -0
- package/dist/providers/vertex.js.map +1 -0
- package/dist/render-GRN4ZSSW.js +14 -0
- package/dist/render-GRN4ZSSW.js.map +1 -0
- package/dist/resolve-XM52G7YE.js +14 -0
- package/dist/resolve-XM52G7YE.js.map +1 -0
- package/dist/server/index.d.ts +128 -0
- package/dist/server/index.js +626 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server-Cg1yWGaV.d.ts +96 -0
- package/dist/spinner-OJNR6NFO.js +8 -0
- package/dist/spinner-OJNR6NFO.js.map +1 -0
- package/dist/types-2kTLUCnD.d.ts +107 -0
- package/dist/types-3c88cRKH.d.ts +547 -0
- package/dist/types-CwKKucOF.d.ts +620 -0
- package/dist/types-DwdzmXfs.d.ts +107 -0
- package/dist/types-NIyVwQ4h.d.ts +109 -0
- package/dist/types-QwfylltH.d.ts +71 -0
- package/package.json +134 -6
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FileTokenStorage,
|
|
3
|
+
InMemoryTokenStorage,
|
|
4
|
+
McpClientManager,
|
|
5
|
+
NoumenOAuthProvider,
|
|
6
|
+
OAuthCallbackServer,
|
|
7
|
+
findAvailablePort
|
|
8
|
+
} from "../chunk-Y45R3PQL.js";
|
|
9
|
+
import {
|
|
10
|
+
createMcpAuthTool
|
|
11
|
+
} from "../chunk-BZSFUEWM.js";
|
|
12
|
+
import {
|
|
13
|
+
ToolRegistry
|
|
14
|
+
} from "../chunk-QTJ7VTJY.js";
|
|
15
|
+
import "../chunk-5GEX6ZSB.js";
|
|
16
|
+
import {
|
|
17
|
+
buildMcpToolName,
|
|
18
|
+
getMcpPrefix,
|
|
19
|
+
normalizeNameForMCP,
|
|
20
|
+
parseMcpToolName
|
|
21
|
+
} from "../chunk-4SQA2UCV.js";
|
|
22
|
+
import {
|
|
23
|
+
contentToString
|
|
24
|
+
} from "../chunk-JACGEMTF.js";
|
|
25
|
+
import "../chunk-DGUM43GV.js";
|
|
26
|
+
|
|
27
|
+
// src/mcp/server.ts
|
|
28
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
29
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
30
|
+
import {
|
|
31
|
+
CallToolRequestSchema,
|
|
32
|
+
ListToolsRequestSchema
|
|
33
|
+
} from "@modelcontextprotocol/sdk/types.js";
|
|
34
|
+
async function createMcpServer(opts) {
|
|
35
|
+
const registry = new ToolRegistry(opts.tools);
|
|
36
|
+
const server = new Server(
|
|
37
|
+
{ name: opts.name ?? "noumen", version: opts.version ?? "0.1.0" },
|
|
38
|
+
{ capabilities: { tools: {} } }
|
|
39
|
+
);
|
|
40
|
+
server.setRequestHandler(
|
|
41
|
+
ListToolsRequestSchema,
|
|
42
|
+
async () => {
|
|
43
|
+
const tools = registry.listTools();
|
|
44
|
+
return {
|
|
45
|
+
tools: tools.map(
|
|
46
|
+
(tool) => ({
|
|
47
|
+
name: tool.name,
|
|
48
|
+
description: tool.description,
|
|
49
|
+
inputSchema: {
|
|
50
|
+
type: "object",
|
|
51
|
+
properties: tool.parameters.properties,
|
|
52
|
+
...tool.parameters.required ? { required: tool.parameters.required } : {}
|
|
53
|
+
}
|
|
54
|
+
})
|
|
55
|
+
)
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
server.setRequestHandler(
|
|
60
|
+
CallToolRequestSchema,
|
|
61
|
+
async ({ params: { name, arguments: args } }) => {
|
|
62
|
+
const tool = registry.get(name);
|
|
63
|
+
if (!tool) {
|
|
64
|
+
return {
|
|
65
|
+
isError: true,
|
|
66
|
+
content: [{ type: "text", text: `Unknown tool: ${name}` }]
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const result = await tool.call(
|
|
71
|
+
args ?? {},
|
|
72
|
+
opts.toolContext
|
|
73
|
+
);
|
|
74
|
+
return {
|
|
75
|
+
isError: result.isError,
|
|
76
|
+
content: [{ type: "text", text: contentToString(result.content) }]
|
|
77
|
+
};
|
|
78
|
+
} catch (err) {
|
|
79
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
80
|
+
return {
|
|
81
|
+
isError: true,
|
|
82
|
+
content: [{ type: "text", text: message }]
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
const transport = new StdioServerTransport();
|
|
88
|
+
await server.connect(transport);
|
|
89
|
+
}
|
|
90
|
+
export {
|
|
91
|
+
FileTokenStorage,
|
|
92
|
+
InMemoryTokenStorage,
|
|
93
|
+
McpClientManager,
|
|
94
|
+
NoumenOAuthProvider,
|
|
95
|
+
OAuthCallbackServer,
|
|
96
|
+
buildMcpToolName,
|
|
97
|
+
createMcpAuthTool,
|
|
98
|
+
createMcpServer,
|
|
99
|
+
findAvailablePort,
|
|
100
|
+
getMcpPrefix,
|
|
101
|
+
normalizeNameForMCP,
|
|
102
|
+
parseMcpToolName
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/mcp/server.ts"],"sourcesContent":["import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n type CallToolResult,\n type ListToolsResult,\n type Tool as McpSdkTool,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { Tool, ToolContext } from \"../tools/types.js\";\nimport { ToolRegistry } from \"../tools/registry.js\";\nimport { contentToString } from \"../utils/content.js\";\n\nexport interface McpServerOptions {\n /** Additional tools beyond the 6 built-ins */\n tools?: Tool[];\n /** Context passed to tool.call() for all invocations */\n toolContext: ToolContext;\n /** Server name reported to clients */\n name?: string;\n /** Server version reported to clients */\n version?: string;\n}\n\n/**\n * Start an MCP server over stdio that exposes noumen's tools.\n * This is the entry point for `noumen mcp` or similar CLI integrations.\n */\nexport async function createMcpServer(opts: McpServerOptions): Promise<void> {\n const registry = new ToolRegistry(opts.tools);\n\n const server = new Server(\n { name: opts.name ?? \"noumen\", version: opts.version ?? \"0.1.0\" },\n { capabilities: { tools: {} } },\n );\n\n server.setRequestHandler(\n ListToolsRequestSchema,\n async (): Promise<ListToolsResult> => {\n const tools = registry.listTools();\n return {\n tools: tools.map(\n (tool): McpSdkTool => ({\n name: tool.name,\n description: tool.description,\n inputSchema: {\n type: \"object\" as const,\n properties: tool.parameters.properties as Record<string, object>,\n ...(tool.parameters.required\n ? { required: tool.parameters.required }\n : {}),\n },\n }),\n ),\n };\n },\n );\n\n server.setRequestHandler(\n CallToolRequestSchema,\n async ({ params: { name, arguments: args } }): Promise<CallToolResult> => {\n const tool = registry.get(name);\n if (!tool) {\n return {\n isError: true,\n content: [{ type: \"text\", text: `Unknown tool: ${name}` }],\n };\n }\n\n try {\n const result = await tool.call(\n (args as Record<string, unknown>) ?? {},\n opts.toolContext,\n );\n return {\n isError: result.isError,\n content: [{ type: \"text\", text: contentToString(result.content) }],\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n isError: true,\n content: [{ type: \"text\", text: message }],\n };\n }\n },\n );\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,cAAc;AACvB,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AAoBP,eAAsB,gBAAgB,MAAuC;AAC3E,QAAM,WAAW,IAAI,aAAa,KAAK,KAAK;AAE5C,QAAM,SAAS,IAAI;AAAA,IACjB,EAAE,MAAM,KAAK,QAAQ,UAAU,SAAS,KAAK,WAAW,QAAQ;AAAA,IAChE,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,EAAE;AAAA,EAChC;AAEA,SAAO;AAAA,IACL;AAAA,IACA,YAAsC;AACpC,YAAM,QAAQ,SAAS,UAAU;AACjC,aAAO;AAAA,QACL,OAAO,MAAM;AAAA,UACX,CAAC,UAAsB;AAAA,YACrB,MAAM,KAAK;AAAA,YACX,aAAa,KAAK;AAAA,YAClB,aAAa;AAAA,cACX,MAAM;AAAA,cACN,YAAY,KAAK,WAAW;AAAA,cAC5B,GAAI,KAAK,WAAW,WAChB,EAAE,UAAU,KAAK,WAAW,SAAS,IACrC,CAAC;AAAA,YACP;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,KAAK,EAAE,MAA+B;AACxE,YAAM,OAAO,SAAS,IAAI,IAAI;AAC9B,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,iBAAiB,IAAI,GAAG,CAAC;AAAA,QAC3D;AAAA,MACF;AAEA,UAAI;AACF,cAAM,SAAS,MAAM,KAAK;AAAA,UACvB,QAAoC,CAAC;AAAA,UACtC,KAAK;AAAA,QACP;AACA,eAAO;AAAA,UACL,SAAS,OAAO;AAAA,UAChB,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,gBAAgB,OAAO,OAAO,EAAE,CAAC;AAAA,QACnE;AAAA,MACF,SAAS,KAAK;AACZ,cAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAChC;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import {
|
|
2
|
+
OpenAIProvider
|
|
3
|
+
} from "./chunk-CPFHEPW4.js";
|
|
4
|
+
import "./chunk-DGUM43GV.js";
|
|
5
|
+
|
|
6
|
+
// src/providers/ollama.ts
|
|
7
|
+
var OllamaProvider = class extends OpenAIProvider {
|
|
8
|
+
constructor(opts = {}) {
|
|
9
|
+
super({
|
|
10
|
+
baseURL: opts.baseURL ?? "http://localhost:11434/v1",
|
|
11
|
+
model: opts.model ?? "qwen2.5-coder:32b"
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
export {
|
|
16
|
+
OllamaProvider
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=ollama-YNXAYP3R.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/ollama.ts"],"sourcesContent":["import { OpenAIProvider } from \"./openai.js\";\n\nexport interface OllamaProviderOptions {\n /** Ollama server URL. Defaults to http://localhost:11434/v1. */\n baseURL?: string;\n model?: string;\n}\n\nexport class OllamaProvider extends OpenAIProvider {\n constructor(opts: OllamaProviderOptions = {}) {\n super({\n baseURL: opts.baseURL ?? \"http://localhost:11434/v1\",\n model: opts.model ?? \"qwen2.5-coder:32b\",\n });\n }\n}\n"],"mappings":";;;;;;AAQO,IAAM,iBAAN,cAA6B,eAAe;AAAA,EACjD,YAAY,OAA8B,CAAC,GAAG;AAC5C,UAAM;AAAA,MACJ,SAAS,KAAK,WAAW;AAAA,MACzB,OAAO,KAAK,SAAS;AAAA,IACvB,CAAC;AAAA,EACH;AACF;","names":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isOllamaRunning,
|
|
3
|
+
ollamaBaseURL
|
|
4
|
+
} from "./chunk-JX7CLUCV.js";
|
|
5
|
+
import {
|
|
6
|
+
DEFAULT_MODELS,
|
|
7
|
+
SUPPORTED_PROVIDERS,
|
|
8
|
+
detectProvider,
|
|
9
|
+
resolveProvider
|
|
10
|
+
} from "./chunk-7ZMN7XJE.js";
|
|
11
|
+
import "./chunk-DGUM43GV.js";
|
|
12
|
+
export {
|
|
13
|
+
DEFAULT_MODELS,
|
|
14
|
+
SUPPORTED_PROVIDERS,
|
|
15
|
+
resolveProvider as createProvider,
|
|
16
|
+
detectProvider,
|
|
17
|
+
isOllamaRunning,
|
|
18
|
+
ollamaBaseURL
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=provider-factory-34MSWJZ3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { A as AIProvider, C as ChatParams, a as ChatStreamChunk } from '../types-3c88cRKH.js';
|
|
2
|
+
import { C as CacheControlConfig } from '../cache-DVqaCX8v.js';
|
|
3
|
+
|
|
4
|
+
interface AnthropicProviderOptions {
|
|
5
|
+
apiKey: string;
|
|
6
|
+
baseURL?: string;
|
|
7
|
+
model?: string;
|
|
8
|
+
/** When enabled, injects cache_control markers on system prompt, tools, and messages. */
|
|
9
|
+
cacheControl?: CacheControlConfig;
|
|
10
|
+
}
|
|
11
|
+
declare class AnthropicProvider implements AIProvider {
|
|
12
|
+
private client;
|
|
13
|
+
private defaultModel;
|
|
14
|
+
private cacheConfig;
|
|
15
|
+
constructor(opts: AnthropicProviderOptions);
|
|
16
|
+
chat(params: ChatParams): AsyncIterable<ChatStreamChunk>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { AnthropicProvider, type AnthropicProviderOptions };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import {
|
|
2
|
+
streamAnthropicChat
|
|
3
|
+
} from "../chunk-2ZTGQLYK.js";
|
|
4
|
+
import "../chunk-KY6ZPWHO.js";
|
|
5
|
+
import "../chunk-DGUM43GV.js";
|
|
6
|
+
|
|
7
|
+
// src/providers/anthropic.ts
|
|
8
|
+
import Anthropic from "@anthropic-ai/sdk";
|
|
9
|
+
var AnthropicProvider = class {
|
|
10
|
+
client;
|
|
11
|
+
defaultModel;
|
|
12
|
+
cacheConfig;
|
|
13
|
+
constructor(opts) {
|
|
14
|
+
this.client = new Anthropic({
|
|
15
|
+
apiKey: opts.apiKey,
|
|
16
|
+
baseURL: opts.baseURL
|
|
17
|
+
});
|
|
18
|
+
this.defaultModel = opts.model ?? "claude-opus-4.6";
|
|
19
|
+
this.cacheConfig = opts.cacheControl;
|
|
20
|
+
}
|
|
21
|
+
async *chat(params) {
|
|
22
|
+
yield* streamAnthropicChat(
|
|
23
|
+
this.client,
|
|
24
|
+
params,
|
|
25
|
+
this.defaultModel,
|
|
26
|
+
this.cacheConfig
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
export {
|
|
31
|
+
AnthropicProvider
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=anthropic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/providers/anthropic.ts"],"sourcesContent":["import Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n AIProvider,\n ChatParams,\n ChatStreamChunk,\n} from \"./types.js\";\nimport type { CacheControlConfig } from \"./cache.js\";\nimport { streamAnthropicChat, type AnthropicStreamClient } from \"./anthropic-shared.js\";\n\nexport interface AnthropicProviderOptions {\n apiKey: string;\n baseURL?: string;\n model?: string;\n /** When enabled, injects cache_control markers on system prompt, tools, and messages. */\n cacheControl?: CacheControlConfig;\n}\n\nexport class AnthropicProvider implements AIProvider {\n private client: Anthropic;\n private defaultModel: string;\n private cacheConfig: CacheControlConfig | undefined;\n\n constructor(opts: AnthropicProviderOptions) {\n this.client = new Anthropic({\n apiKey: opts.apiKey,\n baseURL: opts.baseURL,\n });\n this.defaultModel = opts.model ?? \"claude-opus-4.6\";\n this.cacheConfig = opts.cacheControl;\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n yield* streamAnthropicChat(\n this.client as unknown as AnthropicStreamClient,\n params,\n this.defaultModel,\n this.cacheConfig,\n );\n }\n}\n"],"mappings":";;;;;;;AAAA,OAAO,eAAe;AAiBf,IAAM,oBAAN,MAA8C;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,MAAgC;AAC1C,SAAK,SAAS,IAAI,UAAU;AAAA,MAC1B,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,IAChB,CAAC;AACD,SAAK,eAAe,KAAK,SAAS;AAClC,SAAK,cAAc,KAAK;AAAA,EAC1B;AAAA,EAEA,OAAO,KAAK,QAAoD;AAC9D,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { A as AIProvider, C as ChatParams, a as ChatStreamChunk } from '../types-3c88cRKH.js';
|
|
2
|
+
import { C as CacheControlConfig } from '../cache-DVqaCX8v.js';
|
|
3
|
+
|
|
4
|
+
interface BedrockAnthropicProviderOptions {
|
|
5
|
+
/** AWS region (default: us-east-1). */
|
|
6
|
+
region?: string;
|
|
7
|
+
/** Explicit AWS credentials. If omitted, the SDK uses the default credential chain. */
|
|
8
|
+
credentials?: {
|
|
9
|
+
accessKeyId: string;
|
|
10
|
+
secretAccessKey: string;
|
|
11
|
+
sessionToken?: string;
|
|
12
|
+
};
|
|
13
|
+
/** Model ID in Bedrock format (default: us.anthropic.claude-opus-4.6-v1:0). */
|
|
14
|
+
model?: string;
|
|
15
|
+
/** Custom base URL for a Bedrock-compatible endpoint. */
|
|
16
|
+
baseURL?: string;
|
|
17
|
+
/** Cache control config (same as AnthropicProvider). */
|
|
18
|
+
cacheControl?: CacheControlConfig;
|
|
19
|
+
/**
|
|
20
|
+
* Pre-constructed AnthropicBedrock client. When provided, all other
|
|
21
|
+
* connection options are ignored. Useful for testing or advanced setups.
|
|
22
|
+
*/
|
|
23
|
+
client?: unknown;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Anthropic provider routed through AWS Bedrock.
|
|
27
|
+
*
|
|
28
|
+
* Requires `@anthropic-ai/bedrock-sdk` as an optional peer dependency.
|
|
29
|
+
* Install it with: `pnpm add @anthropic-ai/bedrock-sdk`
|
|
30
|
+
*/
|
|
31
|
+
declare class BedrockAnthropicProvider implements AIProvider {
|
|
32
|
+
private client;
|
|
33
|
+
private defaultModel;
|
|
34
|
+
private cacheConfig;
|
|
35
|
+
constructor(opts: BedrockAnthropicProviderOptions);
|
|
36
|
+
chat(params: ChatParams): AsyncIterable<ChatStreamChunk>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { BedrockAnthropicProvider, type BedrockAnthropicProviderOptions };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import {
|
|
2
|
+
streamAnthropicChat
|
|
3
|
+
} from "../chunk-2ZTGQLYK.js";
|
|
4
|
+
import "../chunk-KY6ZPWHO.js";
|
|
5
|
+
import {
|
|
6
|
+
__require
|
|
7
|
+
} from "../chunk-DGUM43GV.js";
|
|
8
|
+
|
|
9
|
+
// src/providers/bedrock.ts
|
|
10
|
+
var BedrockAnthropicProvider = class {
|
|
11
|
+
client;
|
|
12
|
+
defaultModel;
|
|
13
|
+
cacheConfig;
|
|
14
|
+
constructor(opts) {
|
|
15
|
+
if (opts.client) {
|
|
16
|
+
this.client = opts.client;
|
|
17
|
+
} else {
|
|
18
|
+
let AnthropicBedrock;
|
|
19
|
+
try {
|
|
20
|
+
AnthropicBedrock = __require("@anthropic-ai/bedrock-sdk").AnthropicBedrock;
|
|
21
|
+
} catch {
|
|
22
|
+
throw new Error(
|
|
23
|
+
"BedrockAnthropicProvider requires @anthropic-ai/bedrock-sdk. Install it with: pnpm add @anthropic-ai/bedrock-sdk"
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
const args = {
|
|
27
|
+
awsRegion: opts.region ?? "us-east-1"
|
|
28
|
+
};
|
|
29
|
+
if (opts.baseURL) args.baseURL = opts.baseURL;
|
|
30
|
+
if (opts.credentials) {
|
|
31
|
+
args.awsAccessKey = opts.credentials.accessKeyId;
|
|
32
|
+
args.awsSecretKey = opts.credentials.secretAccessKey;
|
|
33
|
+
if (opts.credentials.sessionToken) {
|
|
34
|
+
args.awsSessionToken = opts.credentials.sessionToken;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
this.client = new AnthropicBedrock(args);
|
|
38
|
+
}
|
|
39
|
+
this.defaultModel = opts.model ?? "us.anthropic.claude-opus-4.6-v1:0";
|
|
40
|
+
this.cacheConfig = opts.cacheControl;
|
|
41
|
+
}
|
|
42
|
+
async *chat(params) {
|
|
43
|
+
yield* streamAnthropicChat(
|
|
44
|
+
this.client,
|
|
45
|
+
params,
|
|
46
|
+
this.defaultModel,
|
|
47
|
+
this.cacheConfig
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
export {
|
|
52
|
+
BedrockAnthropicProvider
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=bedrock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/providers/bedrock.ts"],"sourcesContent":["import type {\n AIProvider,\n ChatParams,\n ChatStreamChunk,\n} from \"./types.js\";\nimport type { CacheControlConfig } from \"./cache.js\";\nimport { streamAnthropicChat, type AnthropicStreamClient } from \"./anthropic-shared.js\";\n\nexport interface BedrockAnthropicProviderOptions {\n /** AWS region (default: us-east-1). */\n region?: string;\n /** Explicit AWS credentials. If omitted, the SDK uses the default credential chain. */\n credentials?: {\n accessKeyId: string;\n secretAccessKey: string;\n sessionToken?: string;\n };\n /** Model ID in Bedrock format (default: us.anthropic.claude-opus-4.6-v1:0). */\n model?: string;\n /** Custom base URL for a Bedrock-compatible endpoint. */\n baseURL?: string;\n /** Cache control config (same as AnthropicProvider). */\n cacheControl?: CacheControlConfig;\n /**\n * Pre-constructed AnthropicBedrock client. When provided, all other\n * connection options are ignored. Useful for testing or advanced setups.\n */\n client?: unknown;\n}\n\n/**\n * Anthropic provider routed through AWS Bedrock.\n *\n * Requires `@anthropic-ai/bedrock-sdk` as an optional peer dependency.\n * Install it with: `pnpm add @anthropic-ai/bedrock-sdk`\n */\nexport class BedrockAnthropicProvider implements AIProvider {\n private client: AnthropicStreamClient;\n private defaultModel: string;\n private cacheConfig: CacheControlConfig | undefined;\n\n constructor(opts: BedrockAnthropicProviderOptions) {\n if (opts.client) {\n this.client = opts.client as AnthropicStreamClient;\n } else {\n let AnthropicBedrock: new (args: Record<string, unknown>) => unknown;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n AnthropicBedrock = require(\"@anthropic-ai/bedrock-sdk\").AnthropicBedrock;\n } catch {\n throw new Error(\n \"BedrockAnthropicProvider requires @anthropic-ai/bedrock-sdk. \" +\n \"Install it with: pnpm add @anthropic-ai/bedrock-sdk\",\n );\n }\n\n const args: Record<string, unknown> = {\n awsRegion: opts.region ?? \"us-east-1\",\n };\n if (opts.baseURL) args.baseURL = opts.baseURL;\n if (opts.credentials) {\n args.awsAccessKey = opts.credentials.accessKeyId;\n args.awsSecretKey = opts.credentials.secretAccessKey;\n if (opts.credentials.sessionToken) {\n args.awsSessionToken = opts.credentials.sessionToken;\n }\n }\n\n this.client = new AnthropicBedrock(args) as unknown as AnthropicStreamClient;\n }\n\n this.defaultModel =\n opts.model ?? \"us.anthropic.claude-opus-4.6-v1:0\";\n this.cacheConfig = opts.cacheControl;\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n yield* streamAnthropicChat(\n this.client,\n params,\n this.defaultModel,\n this.cacheConfig,\n );\n }\n}\n"],"mappings":";;;;;;;;;AAoCO,IAAM,2BAAN,MAAqD;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,MAAuC;AACjD,QAAI,KAAK,QAAQ;AACf,WAAK,SAAS,KAAK;AAAA,IACrB,OAAO;AACL,UAAI;AACJ,UAAI;AAEF,2BAAmB,UAAQ,2BAA2B,EAAE;AAAA,MAC1D,QAAQ;AACN,cAAM,IAAI;AAAA,UACR;AAAA,QAEF;AAAA,MACF;AAEA,YAAM,OAAgC;AAAA,QACpC,WAAW,KAAK,UAAU;AAAA,MAC5B;AACA,UAAI,KAAK,QAAS,MAAK,UAAU,KAAK;AACtC,UAAI,KAAK,aAAa;AACpB,aAAK,eAAe,KAAK,YAAY;AACrC,aAAK,eAAe,KAAK,YAAY;AACrC,YAAI,KAAK,YAAY,cAAc;AACjC,eAAK,kBAAkB,KAAK,YAAY;AAAA,QAC1C;AAAA,MACF;AAEA,WAAK,SAAS,IAAI,iBAAiB,IAAI;AAAA,IACzC;AAEA,SAAK,eACH,KAAK,SAAS;AAChB,SAAK,cAAc,KAAK;AAAA,EAC1B;AAAA,EAEA,OAAO,KAAK,QAAoD;AAC9D,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { A as AIProvider, C as ChatParams, a as ChatStreamChunk } from '../types-3c88cRKH.js';
|
|
2
|
+
|
|
3
|
+
interface GeminiProviderOptions {
|
|
4
|
+
apiKey: string;
|
|
5
|
+
model?: string;
|
|
6
|
+
}
|
|
7
|
+
declare class GeminiProvider implements AIProvider {
|
|
8
|
+
private client;
|
|
9
|
+
private defaultModel;
|
|
10
|
+
constructor(opts: GeminiProviderOptions);
|
|
11
|
+
chat(params: ChatParams): AsyncIterable<ChatStreamChunk>;
|
|
12
|
+
private static contentPartsToGemini;
|
|
13
|
+
private convertMessages;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { GeminiProvider, type GeminiProviderOptions };
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import "../chunk-DGUM43GV.js";
|
|
2
|
+
|
|
3
|
+
// src/providers/gemini.ts
|
|
4
|
+
import { GoogleGenAI } from "@google/genai";
|
|
5
|
+
var GeminiProvider = class _GeminiProvider {
|
|
6
|
+
client;
|
|
7
|
+
defaultModel;
|
|
8
|
+
constructor(opts) {
|
|
9
|
+
this.client = new GoogleGenAI({ apiKey: opts.apiKey });
|
|
10
|
+
this.defaultModel = opts.model ?? "gemini-2.5-flash";
|
|
11
|
+
}
|
|
12
|
+
async *chat(params) {
|
|
13
|
+
const { contents, systemInstruction } = this.convertMessages(
|
|
14
|
+
params.system,
|
|
15
|
+
params.messages
|
|
16
|
+
);
|
|
17
|
+
const tools = params.tools?.length ? [
|
|
18
|
+
{
|
|
19
|
+
functionDeclarations: params.tools.map((t) => ({
|
|
20
|
+
name: t.function.name,
|
|
21
|
+
description: t.function.description,
|
|
22
|
+
parameters: t.function.parameters
|
|
23
|
+
}))
|
|
24
|
+
}
|
|
25
|
+
] : void 0;
|
|
26
|
+
const thinkingEnabled = params.thinking?.type === "enabled" && params.thinking.budgetTokens > 0;
|
|
27
|
+
const thinkingBudget = thinkingEnabled ? params.thinking.budgetTokens : 0;
|
|
28
|
+
const config = {
|
|
29
|
+
systemInstruction: systemInstruction || void 0,
|
|
30
|
+
maxOutputTokens: params.max_tokens,
|
|
31
|
+
temperature: params.temperature,
|
|
32
|
+
tools
|
|
33
|
+
};
|
|
34
|
+
if (thinkingEnabled) {
|
|
35
|
+
config.thinkingConfig = { thinkingBudget };
|
|
36
|
+
}
|
|
37
|
+
if (params.outputFormat?.type === "json_schema") {
|
|
38
|
+
config.responseSchema = params.outputFormat.schema;
|
|
39
|
+
config.responseMimeType = "application/json";
|
|
40
|
+
} else if (params.outputFormat?.type === "json_object") {
|
|
41
|
+
config.responseMimeType = "application/json";
|
|
42
|
+
}
|
|
43
|
+
const stream = await this.client.models.generateContentStream({
|
|
44
|
+
model: params.model ?? this.defaultModel,
|
|
45
|
+
contents,
|
|
46
|
+
config
|
|
47
|
+
});
|
|
48
|
+
let chunkIndex = 0;
|
|
49
|
+
let toolCallIndex = 0;
|
|
50
|
+
let lastUsage;
|
|
51
|
+
for await (const chunk of stream) {
|
|
52
|
+
const chunkId = `gemini-${chunkIndex++}`;
|
|
53
|
+
const model = params.model ?? this.defaultModel;
|
|
54
|
+
const meta = chunk.usageMetadata;
|
|
55
|
+
if (meta) {
|
|
56
|
+
const prompt = meta.promptTokenCount ?? 0;
|
|
57
|
+
const completion = meta.candidatesTokenCount ?? 0;
|
|
58
|
+
lastUsage = {
|
|
59
|
+
prompt_tokens: prompt,
|
|
60
|
+
completion_tokens: completion,
|
|
61
|
+
total_tokens: meta.totalTokenCount ?? prompt + completion,
|
|
62
|
+
thinking_tokens: meta.thoughtsTokenCount || void 0
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const candidates = chunk.candidates;
|
|
66
|
+
if (!candidates || candidates.length === 0) continue;
|
|
67
|
+
const parts = candidates[0].content?.parts;
|
|
68
|
+
if (!parts) continue;
|
|
69
|
+
for (const part of parts) {
|
|
70
|
+
if (part.thought && part.text !== void 0 && part.text !== null) {
|
|
71
|
+
yield {
|
|
72
|
+
id: chunkId,
|
|
73
|
+
model,
|
|
74
|
+
choices: [
|
|
75
|
+
{
|
|
76
|
+
index: 0,
|
|
77
|
+
delta: { thinking_content: part.text },
|
|
78
|
+
finish_reason: null
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
};
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (part.text !== void 0 && part.text !== null) {
|
|
85
|
+
yield {
|
|
86
|
+
id: chunkId,
|
|
87
|
+
model,
|
|
88
|
+
choices: [
|
|
89
|
+
{
|
|
90
|
+
index: 0,
|
|
91
|
+
delta: { content: part.text },
|
|
92
|
+
finish_reason: null
|
|
93
|
+
}
|
|
94
|
+
]
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
if (part.functionCall) {
|
|
98
|
+
const fc = part.functionCall;
|
|
99
|
+
const tcId = `gemini-tc-${toolCallIndex}`;
|
|
100
|
+
const idx = toolCallIndex++;
|
|
101
|
+
yield {
|
|
102
|
+
id: chunkId,
|
|
103
|
+
model,
|
|
104
|
+
choices: [
|
|
105
|
+
{
|
|
106
|
+
index: 0,
|
|
107
|
+
delta: {
|
|
108
|
+
tool_calls: [
|
|
109
|
+
{
|
|
110
|
+
index: idx,
|
|
111
|
+
id: tcId,
|
|
112
|
+
type: "function",
|
|
113
|
+
function: {
|
|
114
|
+
name: fc.name,
|
|
115
|
+
arguments: JSON.stringify(fc.args ?? {})
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
]
|
|
119
|
+
},
|
|
120
|
+
finish_reason: null
|
|
121
|
+
}
|
|
122
|
+
]
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const finishReason = candidates[0].finishReason;
|
|
127
|
+
if (finishReason && finishReason !== "FINISH_REASON_UNSPECIFIED") {
|
|
128
|
+
let mapped;
|
|
129
|
+
if (finishReason === "STOP") {
|
|
130
|
+
mapped = toolCallIndex > 0 ? "tool_calls" : "stop";
|
|
131
|
+
} else if (finishReason === "MAX_TOKENS") {
|
|
132
|
+
mapped = "length";
|
|
133
|
+
} else if (finishReason === "SAFETY" || finishReason === "RECITATION") {
|
|
134
|
+
mapped = "content_filter";
|
|
135
|
+
} else {
|
|
136
|
+
mapped = "stop";
|
|
137
|
+
}
|
|
138
|
+
yield {
|
|
139
|
+
id: chunkId,
|
|
140
|
+
model,
|
|
141
|
+
choices: [{ index: 0, delta: {}, finish_reason: mapped }],
|
|
142
|
+
usage: lastUsage
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
static contentPartsToGemini(parts) {
|
|
148
|
+
return parts.map((part) => {
|
|
149
|
+
if (part.type === "text") {
|
|
150
|
+
return { text: part.text };
|
|
151
|
+
}
|
|
152
|
+
if (part.type === "image") {
|
|
153
|
+
return { inlineData: { mimeType: part.media_type, data: part.data } };
|
|
154
|
+
}
|
|
155
|
+
return { text: `[image: ${part.url}]` };
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
convertMessages(systemPrompt, messages) {
|
|
159
|
+
const contents = [];
|
|
160
|
+
const toolCallIdToName = /* @__PURE__ */ new Map();
|
|
161
|
+
for (const msg of messages) {
|
|
162
|
+
if (msg.role === "assistant" && msg.tool_calls) {
|
|
163
|
+
for (const tc of msg.tool_calls) {
|
|
164
|
+
toolCallIdToName.set(tc.id, tc.function.name);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
let pendingFunctionResponses = [];
|
|
169
|
+
for (const msg of messages) {
|
|
170
|
+
if (msg.role === "system") {
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (msg.role === "user") {
|
|
174
|
+
if (pendingFunctionResponses.length > 0) {
|
|
175
|
+
contents.push({ role: "user", parts: pendingFunctionResponses });
|
|
176
|
+
pendingFunctionResponses = [];
|
|
177
|
+
}
|
|
178
|
+
if (Array.isArray(msg.content)) {
|
|
179
|
+
const parts = _GeminiProvider.contentPartsToGemini(msg.content);
|
|
180
|
+
contents.push({ role: "user", parts });
|
|
181
|
+
} else {
|
|
182
|
+
contents.push({ role: "user", parts: [{ text: msg.content }] });
|
|
183
|
+
}
|
|
184
|
+
} else if (msg.role === "assistant") {
|
|
185
|
+
const parts = [];
|
|
186
|
+
if (msg.content) {
|
|
187
|
+
parts.push({ text: msg.content });
|
|
188
|
+
}
|
|
189
|
+
if (msg.tool_calls) {
|
|
190
|
+
for (const tc of msg.tool_calls) {
|
|
191
|
+
let args = {};
|
|
192
|
+
try {
|
|
193
|
+
args = JSON.parse(tc.function.arguments);
|
|
194
|
+
} catch {
|
|
195
|
+
}
|
|
196
|
+
parts.push({
|
|
197
|
+
functionCall: { name: tc.function.name, args }
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (parts.length > 0) {
|
|
202
|
+
contents.push({ role: "model", parts });
|
|
203
|
+
}
|
|
204
|
+
} else if (msg.role === "tool") {
|
|
205
|
+
const fnName = toolCallIdToName.get(msg.tool_call_id) ?? msg.tool_call_id;
|
|
206
|
+
const resultValue = Array.isArray(msg.content) ? msg.content.filter((p) => p.type === "text").map((p) => p.text).join("") : msg.content;
|
|
207
|
+
pendingFunctionResponses.push({
|
|
208
|
+
functionResponse: {
|
|
209
|
+
name: fnName,
|
|
210
|
+
response: { result: resultValue }
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (pendingFunctionResponses.length > 0) {
|
|
216
|
+
contents.push({ role: "user", parts: pendingFunctionResponses });
|
|
217
|
+
}
|
|
218
|
+
return { contents, systemInstruction: systemPrompt };
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
export {
|
|
222
|
+
GeminiProvider
|
|
223
|
+
};
|
|
224
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/providers/gemini.ts"],"sourcesContent":["import { GoogleGenAI } from \"@google/genai\";\nimport type {\n AIProvider,\n ChatParams,\n ChatStreamChunk,\n} from \"./types.js\";\nimport type { ChatMessage, ContentPart } from \"../session/types.js\";\n\nexport interface GeminiProviderOptions {\n apiKey: string;\n model?: string;\n}\n\ninterface GeminiContent {\n role: \"user\" | \"model\";\n parts: GeminiPart[];\n}\n\ninterface GeminiPart {\n text?: string;\n thought?: boolean;\n inlineData?: { mimeType: string; data: string };\n functionCall?: { name: string; args: Record<string, unknown> };\n functionResponse?: {\n name: string;\n response: { result: unknown };\n };\n}\n\nexport class GeminiProvider implements AIProvider {\n private client: GoogleGenAI;\n private defaultModel: string;\n\n constructor(opts: GeminiProviderOptions) {\n this.client = new GoogleGenAI({ apiKey: opts.apiKey });\n this.defaultModel = opts.model ?? \"gemini-2.5-flash\";\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n const { contents, systemInstruction } = this.convertMessages(\n params.system,\n params.messages,\n );\n\n const tools = params.tools?.length\n ? [\n {\n functionDeclarations: params.tools.map((t) => ({\n name: t.function.name,\n description: t.function.description,\n parameters: t.function.parameters as Record<string, unknown>,\n })),\n },\n ]\n : undefined;\n\n const thinkingEnabled =\n params.thinking?.type === \"enabled\" &&\n (params.thinking as { budgetTokens: number }).budgetTokens > 0;\n const thinkingBudget = thinkingEnabled\n ? (params.thinking as { type: \"enabled\"; budgetTokens: number }).budgetTokens\n : 0;\n\n const config: Record<string, unknown> = {\n systemInstruction: systemInstruction || undefined,\n maxOutputTokens: params.max_tokens,\n temperature: params.temperature,\n tools,\n };\n\n if (thinkingEnabled) {\n config.thinkingConfig = { thinkingBudget: thinkingBudget };\n }\n\n if (params.outputFormat?.type === \"json_schema\") {\n config.responseSchema = params.outputFormat.schema;\n config.responseMimeType = \"application/json\";\n } else if (params.outputFormat?.type === \"json_object\") {\n config.responseMimeType = \"application/json\";\n }\n\n const stream = await this.client.models.generateContentStream({\n model: params.model ?? this.defaultModel,\n contents,\n config,\n });\n\n let chunkIndex = 0;\n let toolCallIndex = 0;\n let lastUsage: ChatStreamChunk[\"usage\"] | undefined;\n\n for await (const chunk of stream) {\n const chunkId = `gemini-${chunkIndex++}`;\n const model = params.model ?? this.defaultModel;\n\n const meta = chunk.usageMetadata as\n | { promptTokenCount?: number; candidatesTokenCount?: number; totalTokenCount?: number; thoughtsTokenCount?: number }\n | undefined;\n if (meta) {\n const prompt = meta.promptTokenCount ?? 0;\n const completion = meta.candidatesTokenCount ?? 0;\n lastUsage = {\n prompt_tokens: prompt,\n completion_tokens: completion,\n total_tokens: meta.totalTokenCount ?? (prompt + completion),\n thinking_tokens: meta.thoughtsTokenCount || undefined,\n };\n }\n\n const candidates = chunk.candidates;\n if (!candidates || candidates.length === 0) continue;\n\n const parts = candidates[0].content?.parts as GeminiPart[] | undefined;\n if (!parts) continue;\n\n for (const part of parts) {\n if (part.thought && part.text !== undefined && part.text !== null) {\n yield {\n id: chunkId,\n model,\n choices: [\n {\n index: 0,\n delta: { thinking_content: part.text },\n finish_reason: null,\n },\n ],\n };\n continue;\n }\n\n if (part.text !== undefined && part.text !== null) {\n yield {\n id: chunkId,\n model,\n choices: [\n {\n index: 0,\n delta: { content: part.text },\n finish_reason: null,\n },\n ],\n };\n }\n\n if (part.functionCall) {\n const fc = part.functionCall;\n const tcId = `gemini-tc-${toolCallIndex}`;\n const idx = toolCallIndex++;\n\n yield {\n id: chunkId,\n model,\n choices: [\n {\n index: 0,\n delta: {\n tool_calls: [\n {\n index: idx,\n id: tcId,\n type: \"function\" as const,\n function: {\n name: fc.name,\n arguments: JSON.stringify(fc.args ?? {}),\n },\n },\n ],\n },\n finish_reason: null,\n },\n ],\n };\n }\n }\n\n const finishReason = candidates[0].finishReason;\n if (finishReason && finishReason !== \"FINISH_REASON_UNSPECIFIED\") {\n let mapped: string;\n if (finishReason === \"STOP\") {\n mapped = toolCallIndex > 0 ? \"tool_calls\" : \"stop\";\n } else if (finishReason === \"MAX_TOKENS\") {\n mapped = \"length\";\n } else if (finishReason === \"SAFETY\" || finishReason === \"RECITATION\") {\n mapped = \"content_filter\";\n } else {\n mapped = \"stop\";\n }\n\n yield {\n id: chunkId,\n model,\n choices: [{ index: 0, delta: {}, finish_reason: mapped }],\n usage: lastUsage,\n };\n }\n }\n }\n\n private static contentPartsToGemini(parts: ContentPart[]): GeminiPart[] {\n return parts.map((part) => {\n if (part.type === \"text\") {\n return { text: part.text };\n }\n if (part.type === \"image\") {\n return { inlineData: { mimeType: part.media_type, data: part.data } };\n }\n // image_url — Gemini doesn't natively support URL references as inlineData;\n // pass it as text with the URL. Consumers should prefer base64 ImageContent.\n return { text: `[image: ${part.url}]` };\n });\n }\n\n private convertMessages(\n systemPrompt: string | undefined,\n messages: ChatMessage[],\n ): { contents: GeminiContent[]; systemInstruction: string | undefined } {\n const contents: GeminiContent[] = [];\n\n const toolCallIdToName = new Map<string, string>();\n for (const msg of messages) {\n if (msg.role === \"assistant\" && msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n toolCallIdToName.set(tc.id, tc.function.name);\n }\n }\n }\n\n let pendingFunctionResponses: GeminiPart[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n continue;\n }\n\n if (msg.role === \"user\") {\n if (pendingFunctionResponses.length > 0) {\n contents.push({ role: \"user\", parts: pendingFunctionResponses });\n pendingFunctionResponses = [];\n }\n if (Array.isArray(msg.content)) {\n const parts = GeminiProvider.contentPartsToGemini(msg.content as ContentPart[]);\n contents.push({ role: \"user\", parts });\n } else {\n contents.push({ role: \"user\", parts: [{ text: msg.content as string }] });\n }\n } else if (msg.role === \"assistant\") {\n const parts: GeminiPart[] = [];\n if (msg.content) {\n parts.push({ text: msg.content });\n }\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments);\n } catch {\n // malformed\n }\n parts.push({\n functionCall: { name: tc.function.name, args },\n });\n }\n }\n if (parts.length > 0) {\n contents.push({ role: \"model\", parts });\n }\n } else if (msg.role === \"tool\") {\n const fnName =\n toolCallIdToName.get(msg.tool_call_id) ?? msg.tool_call_id;\n const resultValue = Array.isArray(msg.content)\n ? (msg.content as ContentPart[])\n .filter((p): p is Extract<ContentPart, { type: \"text\" }> => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\")\n : msg.content;\n pendingFunctionResponses.push({\n functionResponse: {\n name: fnName,\n response: { result: resultValue },\n },\n });\n }\n }\n\n if (pendingFunctionResponses.length > 0) {\n contents.push({ role: \"user\", parts: pendingFunctionResponses });\n }\n\n return { contents, systemInstruction: systemPrompt };\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { A as AIProvider, C as ChatParams, a as ChatStreamChunk } from '../types-3c88cRKH.js';
|
|
2
|
+
|
|
3
|
+
interface OpenAIProviderOptions {
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
baseURL?: string;
|
|
6
|
+
model?: string;
|
|
7
|
+
defaultHeaders?: Record<string, string | undefined>;
|
|
8
|
+
}
|
|
9
|
+
declare class OpenAIProvider implements AIProvider {
|
|
10
|
+
private client;
|
|
11
|
+
private defaultModel;
|
|
12
|
+
constructor(opts: OpenAIProviderOptions);
|
|
13
|
+
chat(params: ChatParams): AsyncIterable<ChatStreamChunk>;
|
|
14
|
+
private static contentPartsToOpenAI;
|
|
15
|
+
private buildMessages;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { OpenAIProvider, type OpenAIProviderOptions };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { OpenAIProvider } from './openai.js';
|
|
2
|
+
import '../types-3c88cRKH.js';
|
|
3
|
+
|
|
4
|
+
interface OpenRouterProviderOptions {
|
|
5
|
+
apiKey: string;
|
|
6
|
+
model?: string;
|
|
7
|
+
/** Displayed on openrouter.ai rankings. Sent as the `X-Title` header. */
|
|
8
|
+
appName?: string;
|
|
9
|
+
/** Used for openrouter.ai rankings. Sent as the `HTTP-Referer` header. */
|
|
10
|
+
appUrl?: string;
|
|
11
|
+
}
|
|
12
|
+
declare class OpenRouterProvider extends OpenAIProvider {
|
|
13
|
+
constructor(opts: OpenRouterProviderOptions);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { OpenRouterProvider, type OpenRouterProviderOptions };
|