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.
Files changed (118) hide show
  1. package/README.md +767 -51
  2. package/dist/a2a/index.d.ts +148 -0
  3. package/dist/a2a/index.js +579 -0
  4. package/dist/a2a/index.js.map +1 -0
  5. package/dist/acp/index.d.ts +129 -0
  6. package/dist/acp/index.js +498 -0
  7. package/dist/acp/index.js.map +1 -0
  8. package/dist/agent-BrkbZyOT.d.ts +1028 -0
  9. package/dist/cache-DVqaCX8v.d.ts +38 -0
  10. package/dist/chunk-2ZTGQLYK.js +356 -0
  11. package/dist/chunk-2ZTGQLYK.js.map +1 -0
  12. package/dist/chunk-42PHHZUA.js +132 -0
  13. package/dist/chunk-42PHHZUA.js.map +1 -0
  14. package/dist/chunk-4SQA2UCV.js +26 -0
  15. package/dist/chunk-4SQA2UCV.js.map +1 -0
  16. package/dist/chunk-5GEX6ZSB.js +179 -0
  17. package/dist/chunk-5GEX6ZSB.js.map +1 -0
  18. package/dist/chunk-7ZMN7XJE.js +94 -0
  19. package/dist/chunk-7ZMN7XJE.js.map +1 -0
  20. package/dist/chunk-AMYIJSAZ.js +57 -0
  21. package/dist/chunk-AMYIJSAZ.js.map +1 -0
  22. package/dist/chunk-BGG2E6JD.js +10 -0
  23. package/dist/chunk-BGG2E6JD.js.map +1 -0
  24. package/dist/chunk-BZSFUEWM.js +43 -0
  25. package/dist/chunk-BZSFUEWM.js.map +1 -0
  26. package/dist/chunk-CPFHEPW4.js +139 -0
  27. package/dist/chunk-CPFHEPW4.js.map +1 -0
  28. package/dist/chunk-D43BWEZA.js +346 -0
  29. package/dist/chunk-D43BWEZA.js.map +1 -0
  30. package/dist/chunk-DGUM43GV.js +11 -0
  31. package/dist/chunk-DGUM43GV.js.map +1 -0
  32. package/dist/chunk-JACGEMTF.js +43 -0
  33. package/dist/chunk-JACGEMTF.js.map +1 -0
  34. package/dist/chunk-JX7CLUCV.js +21 -0
  35. package/dist/chunk-JX7CLUCV.js.map +1 -0
  36. package/dist/chunk-KXDB56YW.js +39 -0
  37. package/dist/chunk-KXDB56YW.js.map +1 -0
  38. package/dist/chunk-KY6ZPWHO.js +112 -0
  39. package/dist/chunk-KY6ZPWHO.js.map +1 -0
  40. package/dist/chunk-NBDFQYUZ.js +7992 -0
  41. package/dist/chunk-NBDFQYUZ.js.map +1 -0
  42. package/dist/chunk-OGXNFXFA.js +196 -0
  43. package/dist/chunk-OGXNFXFA.js.map +1 -0
  44. package/dist/chunk-QTJ7VTJY.js +1994 -0
  45. package/dist/chunk-QTJ7VTJY.js.map +1 -0
  46. package/dist/chunk-UVSSQBDY.js +192 -0
  47. package/dist/chunk-UVSSQBDY.js.map +1 -0
  48. package/dist/chunk-Y45R3PQL.js +684 -0
  49. package/dist/chunk-Y45R3PQL.js.map +1 -0
  50. package/dist/cli/index.d.ts +1 -0
  51. package/dist/cli/index.js +868 -0
  52. package/dist/cli/index.js.map +1 -0
  53. package/dist/client/index.d.ts +64 -0
  54. package/dist/client/index.js +409 -0
  55. package/dist/client/index.js.map +1 -0
  56. package/dist/client-CRRO2376.js +10 -0
  57. package/dist/client-CRRO2376.js.map +1 -0
  58. package/dist/headless-Q7XHHZIW.js +143 -0
  59. package/dist/headless-Q7XHHZIW.js.map +1 -0
  60. package/dist/history-snip-64GYP4ZL.js +12 -0
  61. package/dist/history-snip-64GYP4ZL.js.map +1 -0
  62. package/dist/index.d.ts +1305 -418
  63. package/dist/index.js +384 -1757
  64. package/dist/index.js.map +1 -1
  65. package/dist/jsonrpc/index.d.ts +54 -0
  66. package/dist/jsonrpc/index.js +34 -0
  67. package/dist/jsonrpc/index.js.map +1 -0
  68. package/dist/lsp/index.d.ts +36 -0
  69. package/dist/lsp/index.js +16 -0
  70. package/dist/lsp/index.js.map +1 -0
  71. package/dist/lsp-PS3BWIHC.js +8 -0
  72. package/dist/lsp-PS3BWIHC.js.map +1 -0
  73. package/dist/manager-DLXK63XC.js +8 -0
  74. package/dist/manager-DLXK63XC.js.map +1 -0
  75. package/dist/mcp/index.d.ts +111 -0
  76. package/dist/mcp/index.js +104 -0
  77. package/dist/mcp/index.js.map +1 -0
  78. package/dist/mcp-auth-AEI2R4ZC.js +9 -0
  79. package/dist/mcp-auth-AEI2R4ZC.js.map +1 -0
  80. package/dist/ollama-YNXAYP3R.js +18 -0
  81. package/dist/ollama-YNXAYP3R.js.map +1 -0
  82. package/dist/provider-factory-34MSWJZ3.js +20 -0
  83. package/dist/provider-factory-34MSWJZ3.js.map +1 -0
  84. package/dist/providers/anthropic.d.ts +19 -0
  85. package/dist/providers/anthropic.js +33 -0
  86. package/dist/providers/anthropic.js.map +1 -0
  87. package/dist/providers/bedrock.d.ts +39 -0
  88. package/dist/providers/bedrock.js +54 -0
  89. package/dist/providers/bedrock.js.map +1 -0
  90. package/dist/providers/gemini.d.ts +16 -0
  91. package/dist/providers/gemini.js +224 -0
  92. package/dist/providers/gemini.js.map +1 -0
  93. package/dist/providers/openai.d.ts +18 -0
  94. package/dist/providers/openai.js +8 -0
  95. package/dist/providers/openai.js.map +1 -0
  96. package/dist/providers/openrouter.d.ts +16 -0
  97. package/dist/providers/openrouter.js +23 -0
  98. package/dist/providers/openrouter.js.map +1 -0
  99. package/dist/providers/vertex.d.ts +40 -0
  100. package/dist/providers/vertex.js +64 -0
  101. package/dist/providers/vertex.js.map +1 -0
  102. package/dist/render-GRN4ZSSW.js +14 -0
  103. package/dist/render-GRN4ZSSW.js.map +1 -0
  104. package/dist/resolve-XM52G7YE.js +14 -0
  105. package/dist/resolve-XM52G7YE.js.map +1 -0
  106. package/dist/server/index.d.ts +128 -0
  107. package/dist/server/index.js +626 -0
  108. package/dist/server/index.js.map +1 -0
  109. package/dist/server-Cg1yWGaV.d.ts +96 -0
  110. package/dist/spinner-OJNR6NFO.js +8 -0
  111. package/dist/spinner-OJNR6NFO.js.map +1 -0
  112. package/dist/types-2kTLUCnD.d.ts +107 -0
  113. package/dist/types-3c88cRKH.d.ts +547 -0
  114. package/dist/types-CwKKucOF.d.ts +620 -0
  115. package/dist/types-DwdzmXfs.d.ts +107 -0
  116. package/dist/types-NIyVwQ4h.d.ts +109 -0
  117. package/dist/types-QwfylltH.d.ts +71 -0
  118. 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,9 @@
1
+ import {
2
+ createMcpAuthTool
3
+ } from "./chunk-BZSFUEWM.js";
4
+ import "./chunk-4SQA2UCV.js";
5
+ import "./chunk-DGUM43GV.js";
6
+ export {
7
+ createMcpAuthTool
8
+ };
9
+ //# sourceMappingURL=mcp-auth-AEI2R4ZC.js.map
@@ -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,8 @@
1
+ import {
2
+ OpenAIProvider
3
+ } from "../chunk-CPFHEPW4.js";
4
+ import "../chunk-DGUM43GV.js";
5
+ export {
6
+ OpenAIProvider
7
+ };
8
+ //# sourceMappingURL=openai.js.map
@@ -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 };