@ank1015/providers 0.0.1 → 0.0.3

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 (169) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -383
  3. package/dist/agent/conversation.d.ts +97 -0
  4. package/dist/agent/conversation.d.ts.map +1 -0
  5. package/dist/agent/conversation.js +328 -0
  6. package/dist/agent/conversation.js.map +1 -0
  7. package/dist/agent/runner.d.ts +37 -0
  8. package/dist/agent/runner.d.ts.map +1 -0
  9. package/dist/agent/runner.js +169 -0
  10. package/dist/agent/runner.js.map +1 -0
  11. package/dist/agent/tools/calculate.d.ts +15 -0
  12. package/dist/agent/tools/calculate.d.ts.map +1 -0
  13. package/dist/agent/tools/calculate.js +23 -0
  14. package/dist/agent/tools/calculate.js.map +1 -0
  15. package/dist/agent/tools/get-current-time.d.ts +15 -0
  16. package/dist/agent/tools/get-current-time.d.ts.map +1 -0
  17. package/dist/agent/tools/get-current-time.js +38 -0
  18. package/dist/agent/tools/get-current-time.js.map +1 -0
  19. package/dist/agent/tools/index.d.ts +3 -0
  20. package/dist/agent/tools/index.d.ts.map +1 -0
  21. package/dist/agent/tools/index.js +3 -0
  22. package/dist/agent/tools/index.js.map +1 -0
  23. package/dist/agent/types.d.ts +53 -31
  24. package/dist/agent/types.d.ts.map +1 -1
  25. package/dist/agent/types.js +1 -2
  26. package/dist/agent/utils.d.ts +14 -0
  27. package/dist/agent/utils.d.ts.map +1 -0
  28. package/dist/agent/utils.js +59 -0
  29. package/dist/agent/utils.js.map +1 -0
  30. package/dist/index.d.ts +16 -9
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +16 -28
  33. package/dist/index.js.map +1 -1
  34. package/dist/llm.d.ts +15 -0
  35. package/dist/llm.d.ts.map +1 -0
  36. package/dist/llm.js +92 -0
  37. package/dist/llm.js.map +1 -0
  38. package/dist/models.d.ts +8 -1
  39. package/dist/models.d.ts.map +1 -1
  40. package/dist/models.generated.d.ts +25 -112
  41. package/dist/models.generated.d.ts.map +1 -1
  42. package/dist/models.generated.js +72 -227
  43. package/dist/models.generated.js.map +1 -1
  44. package/dist/models.js +30 -32
  45. package/dist/models.js.map +1 -1
  46. package/dist/providers/google/complete.d.ts +3 -0
  47. package/dist/providers/google/complete.d.ts.map +1 -0
  48. package/dist/providers/google/complete.js +53 -0
  49. package/dist/providers/google/complete.js.map +1 -0
  50. package/dist/providers/google/index.d.ts +6 -0
  51. package/dist/providers/google/index.d.ts.map +1 -0
  52. package/dist/providers/google/index.js +6 -0
  53. package/dist/providers/google/index.js.map +1 -0
  54. package/dist/providers/google/stream.d.ts +3 -0
  55. package/dist/providers/google/stream.d.ts.map +1 -0
  56. package/dist/providers/{google.js → google/stream.js} +67 -231
  57. package/dist/providers/google/stream.js.map +1 -0
  58. package/dist/providers/google/types.d.ts +8 -0
  59. package/dist/providers/google/types.d.ts.map +1 -0
  60. package/dist/providers/google/types.js +2 -0
  61. package/dist/providers/google/types.js.map +1 -0
  62. package/dist/providers/google/utils.d.ts +30 -0
  63. package/dist/providers/google/utils.d.ts.map +1 -0
  64. package/dist/providers/google/utils.js +354 -0
  65. package/dist/providers/google/utils.js.map +1 -0
  66. package/dist/providers/openai/complete.d.ts +3 -0
  67. package/dist/providers/openai/complete.d.ts.map +1 -0
  68. package/dist/providers/openai/complete.js +57 -0
  69. package/dist/providers/openai/complete.js.map +1 -0
  70. package/dist/providers/openai/index.d.ts +4 -0
  71. package/dist/providers/openai/index.d.ts.map +1 -0
  72. package/dist/providers/openai/index.js +4 -0
  73. package/dist/providers/openai/index.js.map +1 -0
  74. package/dist/providers/openai/stream.d.ts +3 -0
  75. package/dist/providers/openai/stream.d.ts.map +1 -0
  76. package/dist/providers/{openai.js → openai/stream.js} +74 -152
  77. package/dist/providers/openai/stream.js.map +1 -0
  78. package/dist/providers/openai/types.d.ts +8 -0
  79. package/dist/providers/openai/types.d.ts.map +1 -0
  80. package/dist/providers/openai/types.js +2 -0
  81. package/dist/providers/openai/types.js.map +1 -0
  82. package/dist/providers/openai/utils.d.ts +13 -0
  83. package/dist/providers/openai/utils.d.ts.map +1 -0
  84. package/dist/providers/openai/utils.js +285 -0
  85. package/dist/providers/openai/utils.js.map +1 -0
  86. package/dist/types.d.ts +95 -87
  87. package/dist/types.d.ts.map +1 -1
  88. package/dist/types.js +1 -9
  89. package/dist/types.js.map +1 -1
  90. package/dist/utils/event-stream.d.ts +2 -2
  91. package/dist/utils/event-stream.d.ts.map +1 -1
  92. package/dist/utils/event-stream.js +2 -7
  93. package/dist/utils/event-stream.js.map +1 -1
  94. package/dist/utils/json-parse.js +3 -6
  95. package/dist/utils/json-parse.js.map +1 -1
  96. package/dist/utils/overflow.d.ts +51 -0
  97. package/dist/utils/overflow.d.ts.map +1 -0
  98. package/dist/utils/overflow.js +106 -0
  99. package/dist/utils/overflow.js.map +1 -0
  100. package/dist/utils/sanitize-unicode.js +1 -4
  101. package/dist/utils/sanitize-unicode.js.map +1 -1
  102. package/dist/utils/uuid.d.ts +6 -0
  103. package/dist/utils/uuid.d.ts.map +1 -0
  104. package/dist/utils/uuid.js +9 -0
  105. package/dist/utils/uuid.js.map +1 -0
  106. package/dist/utils/validation.d.ts +10 -3
  107. package/dist/utils/validation.d.ts.map +1 -1
  108. package/dist/utils/validation.js +20 -12
  109. package/dist/utils/validation.js.map +1 -1
  110. package/package.json +47 -8
  111. package/biome.json +0 -43
  112. package/dist/agent/agent-loop.d.ts +0 -5
  113. package/dist/agent/agent-loop.d.ts.map +0 -1
  114. package/dist/agent/agent-loop.js +0 -219
  115. package/dist/agent/agent-loop.js.map +0 -1
  116. package/dist/providers/convert.d.ts +0 -6
  117. package/dist/providers/convert.d.ts.map +0 -1
  118. package/dist/providers/convert.js +0 -207
  119. package/dist/providers/convert.js.map +0 -1
  120. package/dist/providers/google.d.ts +0 -26
  121. package/dist/providers/google.d.ts.map +0 -1
  122. package/dist/providers/google.js.map +0 -1
  123. package/dist/providers/openai.d.ts +0 -17
  124. package/dist/providers/openai.d.ts.map +0 -1
  125. package/dist/providers/openai.js.map +0 -1
  126. package/dist/stream.d.ts +0 -4
  127. package/dist/stream.d.ts.map +0 -1
  128. package/dist/stream.js +0 -40
  129. package/dist/stream.js.map +0 -1
  130. package/dist/test-google-agent-loop.d.ts +0 -2
  131. package/dist/test-google-agent-loop.d.ts.map +0 -1
  132. package/dist/test-google-agent-loop.js +0 -186
  133. package/dist/test-google-agent-loop.js.map +0 -1
  134. package/dist/test-google.d.ts +0 -2
  135. package/dist/test-google.d.ts.map +0 -1
  136. package/dist/test-google.js +0 -41
  137. package/dist/test-google.js.map +0 -1
  138. package/src/agent/agent-loop.ts +0 -275
  139. package/src/agent/types.ts +0 -80
  140. package/src/index.ts +0 -72
  141. package/src/models.generated.ts +0 -314
  142. package/src/models.ts +0 -45
  143. package/src/providers/convert.ts +0 -222
  144. package/src/providers/google.ts +0 -496
  145. package/src/providers/openai.ts +0 -437
  146. package/src/stream.ts +0 -60
  147. package/src/types.ts +0 -198
  148. package/src/utils/event-stream.ts +0 -60
  149. package/src/utils/json-parse.ts +0 -28
  150. package/src/utils/sanitize-unicode.ts +0 -25
  151. package/src/utils/validation.ts +0 -69
  152. package/test/core/agent-loop.test.ts +0 -958
  153. package/test/core/stream.test.ts +0 -409
  154. package/test/data/red-circle.png +0 -0
  155. package/test/data/superintelligentwill.pdf +0 -0
  156. package/test/edge-cases/general.test.ts +0 -565
  157. package/test/integration/e2e.test.ts +0 -530
  158. package/test/models/cost.test.ts +0 -499
  159. package/test/models/registry.test.ts +0 -298
  160. package/test/providers/convert.test.ts +0 -846
  161. package/test/providers/google-schema.test.ts +0 -666
  162. package/test/providers/google-stream.test.ts +0 -369
  163. package/test/providers/openai-stream.test.ts +0 -251
  164. package/test/utils/event-stream.test.ts +0 -289
  165. package/test/utils/json-parse.test.ts +0 -344
  166. package/test/utils/sanitize-unicode.test.ts +0 -329
  167. package/test/utils/validation.test.ts +0 -614
  168. package/tsconfig.json +0 -21
  169. package/vitest.config.ts +0 -9
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=test-google-agent-loop.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-google-agent-loop.d.ts","sourceRoot":"","sources":["../src/test-google-agent-loop.ts"],"names":[],"mappings":""}
@@ -1,186 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const agent_loop_1 = require("./agent/agent-loop");
4
- const models_generated_1 = require("./models.generated");
5
- const typebox_1 = require("@sinclair/typebox");
6
- const fs_1 = require("fs");
7
- const path_1 = require("path");
8
- const genai_1 = require("@google/genai");
9
- // Create logs directory
10
- const logsDir = (0, path_1.join)(process.cwd(), "logs");
11
- try {
12
- (0, fs_1.mkdirSync)(logsDir, { recursive: true });
13
- }
14
- catch (e) {
15
- // Directory might already exist
16
- }
17
- const eventsFile = (0, path_1.join)(logsDir, "agent-events.txt");
18
- const resultFile = (0, path_1.join)(logsDir, "agent-result.json");
19
- // Clear previous logs
20
- (0, fs_1.writeFileSync)(eventsFile, "=== Agent Loop Events Log ===\n", "utf-8");
21
- (0, fs_1.writeFileSync)(resultFile, "", "utf-8");
22
- console.log("🧪 Testing Agent Loop...\n");
23
- // Define calculator parameter schema
24
- const CalculatorParams = typebox_1.Type.Object({
25
- operation: typebox_1.Type.Union([
26
- typebox_1.Type.Literal("addition"),
27
- typebox_1.Type.Literal("add"),
28
- typebox_1.Type.Literal("divide"),
29
- typebox_1.Type.Literal("multiply"),
30
- typebox_1.Type.Literal("subtraction"),
31
- typebox_1.Type.Literal("multiplication"),
32
- typebox_1.Type.Literal("division"),
33
- ]),
34
- a: typebox_1.Type.Number({ description: "First number" }),
35
- b: typebox_1.Type.Number({ description: "Second number" }),
36
- });
37
- // Define a calculator tool with execution logic
38
- const calculatorTool = {
39
- name: "calculator",
40
- label: "Calculator",
41
- description: "Performs basic arithmetic operations",
42
- parameters: CalculatorParams,
43
- async execute(toolCallId, params, signal) {
44
- // Simulate some work
45
- await new Promise(resolve => setTimeout(resolve, 100));
46
- let result;
47
- switch (params.operation) {
48
- case "addition":
49
- result = params.a + params.b;
50
- break;
51
- case "add":
52
- result = params.a + params.b;
53
- break;
54
- case "subtraction":
55
- result = params.a - params.b;
56
- break;
57
- case "multiplication":
58
- result = params.a * params.b;
59
- break;
60
- case "multiply":
61
- result = params.a * params.b;
62
- break;
63
- case "division":
64
- if (params.b === 0) {
65
- throw new Error("Division by zero is not allowed");
66
- }
67
- result = params.a / params.b;
68
- break;
69
- case "divide":
70
- if (params.b === 0) {
71
- throw new Error("Division by zero is not allowed");
72
- }
73
- result = params.a / params.b;
74
- break;
75
- }
76
- return {
77
- content: [
78
- {
79
- type: "text",
80
- content: `The result of ${params.operation} of ${params.a} and ${params.b} is ${result}`,
81
- },
82
- ],
83
- details: {
84
- operation: params.operation,
85
- operands: [params.a, params.b],
86
- result,
87
- },
88
- };
89
- },
90
- };
91
- // Create a user message
92
- const userMessage = {
93
- role: "user",
94
- timestamp: Date.now(),
95
- content: [
96
- {
97
- type: "text",
98
- content: "Can you calculate 1005 + 27032 for me? Then multiply the result by 2.",
99
- },
100
- ],
101
- };
102
- // Create agent context
103
- const agentContext = {
104
- systemPrompt: "You are a helpful assistant with access to a calculator tool. Always use the calculator tool for math operations.",
105
- messages: [],
106
- tools: [calculatorTool],
107
- };
108
- // Get a model
109
- const model = models_generated_1.MODELS.google["gemini-3-pro-preview"];
110
- // Create config
111
- const config = {
112
- model,
113
- providerOptions: {
114
- thinkingConfig: {
115
- thinkingLevel: genai_1.ThinkingLevel.LOW
116
- }
117
- },
118
- };
119
- console.log(`📦 Model: ${model.name}`);
120
- console.log(`🔧 Tools: ${calculatorTool.name}`);
121
- const firstContent = userMessage.content[0];
122
- const messageText = firstContent.type === "text" ? firstContent.content : `[${firstContent.type}]`;
123
- console.log(`💬 User: ${messageText}\n`);
124
- console.log("📝 Streaming events to:", eventsFile);
125
- console.log("💾 Final result to:", resultFile);
126
- console.log("\n--- Starting Agent Loop ---\n");
127
- // Helper to log events
128
- function logEvent(event) {
129
- const timestamp = new Date().toISOString();
130
- const eventLog = `[${timestamp}] ${event.type}\n${JSON.stringify(event, null, 2)}\n${"=".repeat(80)}\n`;
131
- (0, fs_1.appendFileSync)(eventsFile, eventLog, "utf-8");
132
- console.log(`📨 Event: ${event.type}`);
133
- }
134
- // Run the agent loop
135
- (async () => {
136
- try {
137
- const eventStream = (0, agent_loop_1.agentLoop)(userMessage, agentContext, config);
138
- // Iterate through events
139
- for await (const event of eventStream) {
140
- logEvent(event);
141
- // Show some key events in console
142
- if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
143
- process.stdout.write(event.assistantMessageEvent.delta);
144
- }
145
- else if (event.type === "tool_execution_start") {
146
- console.log(`\n🔧 Executing tool: ${event.toolName}(${JSON.stringify(event.args)})`);
147
- }
148
- else if (event.type === "tool_execution_end") {
149
- if (event.isError) {
150
- console.log(`❌ Tool failed: ${typeof event.result === "string" ? event.result : "See details"}`);
151
- }
152
- else {
153
- console.log(`✅ Tool succeeded`);
154
- }
155
- }
156
- else if (event.type === "turn_end") {
157
- console.log(`\n--- Turn Complete (${event.toolResults.length} tool results) ---\n`);
158
- }
159
- else if (event.type === "agent_end") {
160
- console.log(`\n🏁 Agent completed with status: ${event.status}\n`);
161
- }
162
- }
163
- // Get the final result
164
- console.log("\n--- Agent Loop Complete ---\n");
165
- console.log("⏳ Getting final messages...");
166
- const finalMessages = await eventStream.result();
167
- console.log(`✅ Received ${finalMessages.length} messages!`);
168
- // Save final result
169
- const resultData = {
170
- timestamp: new Date().toISOString(),
171
- messageCount: finalMessages.length,
172
- messages: finalMessages,
173
- };
174
- (0, fs_1.writeFileSync)(resultFile, JSON.stringify(resultData, null, 2), "utf-8");
175
- console.log("\n✨ Test complete!");
176
- console.log(`📝 Events logged to: ${eventsFile}`);
177
- console.log(`💾 Final result saved to: ${resultFile}`);
178
- console.log(`📊 Total messages: ${finalMessages.length}`);
179
- }
180
- catch (error) {
181
- console.error("\n❌ Error during agent loop:", error);
182
- (0, fs_1.appendFileSync)(eventsFile, `\n\nERROR: ${error}\n`, "utf-8");
183
- process.exit(1);
184
- }
185
- })();
186
- //# sourceMappingURL=test-google-agent-loop.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-google-agent-loop.js","sourceRoot":"","sources":["../src/test-google-agent-loop.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=test-google.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-google.d.ts","sourceRoot":"","sources":["../src/test-google.ts"],"names":[],"mappings":""}
@@ -1,41 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const google_1 = require("./providers/google");
4
- const models_generated_1 = require("./models.generated");
5
- const genai_1 = require("@google/genai");
6
- const fs_1 = require("fs");
7
- const typebox_1 = require("@sinclair/typebox");
8
- const schema = typebox_1.Type.Object({
9
- sign: typebox_1.Type.String({ description: "An astrological sign like Taurus or Aquarius" }),
10
- });
11
- const getHoroscope = {
12
- name: "get_horoscope",
13
- description: "Get today's horoscope for an astrological sign.",
14
- parameters: schema
15
- };
16
- const main = async () => {
17
- const context = {
18
- systemPrompt: 'Be a helpful assistant',
19
- messages: [{
20
- role: 'user',
21
- content: [{
22
- type: 'text',
23
- content: 'What is my horoscope? I am an Aquarius. Use the tool'
24
- }],
25
- timestamp: 0
26
- }],
27
- tools: [getHoroscope]
28
- };
29
- const stream = (0, google_1.streamGoogle)(models_generated_1.MODELS.google["gemini-3-pro-preview"], context, {
30
- thinkingConfig: {
31
- thinkingLevel: genai_1.ThinkingLevel.LOW
32
- }
33
- });
34
- for await (const chunk of stream) {
35
- (0, fs_1.appendFileSync)('/Users/notacoder/Desktop/frontier-agents/providers/assistant.txt', JSON.stringify(chunk, null, 2) + '\n');
36
- }
37
- const finalResp = await stream.result();
38
- (0, fs_1.appendFileSync)('/Users/notacoder/Desktop/frontier-agents/providers/finalResp.txt', JSON.stringify(finalResp, null, 2) + '\n');
39
- };
40
- main();
41
- //# sourceMappingURL=test-google.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-google.js","sourceRoot":"","sources":["../src/test-google.ts"],"names":[],"mappings":";;AAAA,+CAAkD;AAClD,yDAA0C;AAE1C,yCAA8C;AAC9C,2BAAoC;AACpC,+CAAyC;AAEzC,MAAM,MAAM,GAAG,cAAI,CAAC,MAAM,CAAC;IAC1B,IAAI,EAAE,cAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,8CAA8C,EAAE,CAAC;CAClF,CAAC,CAAC;AAEH,MAAM,YAAY,GAAS;IACvB,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,iDAAiD;IAC9D,UAAU,EAAE,MAAM;CACrB,CAAA;AAED,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;IAEpB,MAAM,OAAO,GAAY;QACrB,YAAY,EAAE,wBAAwB;QACtC,QAAQ,EAAE,CAAC;gBACP,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,CAAC;wBACN,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,sDAAsD;qBAClE,CAAC;gBACF,SAAS,EAAE,CAAC;aACf,CAAC;QACF,KAAK,EAAE,CAAC,YAAY,CAAC;KACxB,CAAA;IAED,MAAM,MAAM,GAAG,IAAA,qBAAY,EACvB,yBAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,EACrC,OAAO,EACP;QACI,cAAc,EAAE;YACZ,aAAa,EAAE,qBAAa,CAAC,GAAG;SACnC;KACJ,CACJ,CAAA;IAED,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAC,CAAC;QAC9B,IAAA,mBAAc,EAAC,kEAAkE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9H,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;IACxC,IAAA,mBAAc,EAAC,kEAAkE,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAClI,CAAC,CAAA;AAED,IAAI,EAAE,CAAA"}
@@ -1,275 +0,0 @@
1
- import { EventStream } from "../utils/event-stream";
2
- import { UserMessage, Api, NativeAssistantMessage, Context, AssistantMessage, ToolResultMessage } from "../types";
3
- import { AgentContext, AgentEvent, AgentLoopConfig, AgentTool, AgentToolResult, QueuedMessage } from "./types";
4
- import { stream as streamLLM } from "../stream";
5
- import { validateToolArguments } from "../utils/validation";
6
-
7
- // Main prompt function - returns a stream of events
8
- export function agentLoop<TApi extends Api>(
9
- prompt: UserMessage,
10
- context: AgentContext,
11
- config: AgentLoopConfig<TApi>,
12
- signal?: AbortSignal,
13
- ): EventStream<AgentEvent, AgentContext["messages"]> {
14
-
15
- // Convert AgentContext to Context for stream
16
- // Use a copy of messages to avoid mutating the original context
17
- const stream = new EventStream<AgentEvent, AgentContext["messages"]>();
18
-
19
- // Run the prompt async
20
- (async () => {
21
- // Track new messages generated during this prompt
22
- const newMessages: AgentContext["messages"] = [];
23
- // Create user message for the prompt
24
- const messages = [...context.messages, prompt];
25
- newMessages.push(prompt);
26
-
27
- stream.push({ type: "agent_start" });
28
- stream.push({ type: "turn_start" });
29
- stream.push({ type: "message_start", message: prompt });
30
- stream.push({ type: "message_end", message: prompt });
31
-
32
- // Update context with new messages
33
- const currentContext: AgentContext = {
34
- ...context,
35
- messages,
36
- };
37
-
38
- // Keep looping while we have tool calls or queued messages
39
- let hasMoreToolCalls = true;
40
- let firstTurn = true;
41
- let queuedMessages: QueuedMessage<any>[] = [];
42
-
43
- // Safely get queued messages, handling any errors
44
- try {
45
- queuedMessages = (await config.getQueuedMessages?.()) || [];
46
- } catch (error) {
47
- console.warn("Error getting queued messages:", error instanceof Error ? error.message : String(error));
48
- // Continue with empty queued messages
49
- }
50
-
51
- while (hasMoreToolCalls || queuedMessages.length > 0) {
52
- if (!firstTurn) {
53
- stream.push({ type: "turn_start" });
54
- } else {
55
- firstTurn = false;
56
- }
57
-
58
- // Process queued messages first (inject before next assistant response)
59
- if (queuedMessages.length > 0) {
60
- for (const { original, llm } of queuedMessages) {
61
- stream.push({ type: "message_start", message: original });
62
- stream.push({ type: "message_end", message: original });
63
- if (llm) {
64
- currentContext.messages.push(llm);
65
- newMessages.push(llm);
66
- }
67
- }
68
- queuedMessages = [];
69
- }
70
-
71
- // Stream assistant response
72
- const {finalAssistantMessage, finalMessage} = await streamAssistantResponse(currentContext, config, signal, stream);
73
- newMessages.push(finalMessage);
74
- currentContext.messages.push(finalMessage); // ✅ Add to context so LLM sees its previous responses!
75
-
76
- // Check if assistant message is valid
77
- if (!finalAssistantMessage) {
78
- // This should never happen, but handle it gracefully
79
- stream.push({ type: "agent_end", messages: newMessages, status: "error" });
80
- stream.end(newMessages);
81
- return;
82
- }
83
-
84
- if(finalAssistantMessage.stopReason === 'aborted' || finalAssistantMessage.stopReason === "error"){
85
- stream.push({ type: "turn_end", message:finalAssistantMessage, toolResults: [] });
86
- stream.push({
87
- type: "agent_end",
88
- messages: newMessages,
89
- status: finalAssistantMessage.stopReason === 'aborted' ? "aborted" : "error"
90
- });
91
- stream.end(newMessages);
92
- return;
93
- }
94
-
95
- // Check for tool calls
96
- const toolCalls = finalAssistantMessage.content.filter((c) => c.type === "toolCall");
97
- hasMoreToolCalls = toolCalls.length > 0;
98
-
99
- const toolResults: ToolResultMessage[] = [];
100
- if (hasMoreToolCalls) {
101
- // Execute tool calls
102
- toolResults.push(...(await executeToolCalls(currentContext.tools, finalAssistantMessage, signal, stream)));
103
- currentContext.messages.push(...toolResults);
104
- newMessages.push(...toolResults);
105
- }
106
- stream.push({ type: "turn_end", message: finalAssistantMessage, toolResults: toolResults });
107
-
108
- // Get queued messages after turn completes
109
- try {
110
- queuedMessages = (await config.getQueuedMessages?.()) || [];
111
- } catch (error) {
112
- console.warn("Error getting queued messages:", error instanceof Error ? error.message : String(error));
113
- queuedMessages = [];
114
- }
115
- }
116
- stream.push({ type: "agent_end", messages: newMessages, status: "completed" });
117
- stream.end(newMessages);
118
- })()
119
-
120
- return stream;
121
- }
122
-
123
- interface StreamAssistantResult {
124
- finalMessage: NativeAssistantMessage,
125
- finalAssistantMessage: AssistantMessage
126
- }
127
-
128
- // Helper functions
129
- async function streamAssistantResponse<TApi extends Api>(
130
- context: AgentContext,
131
- config: AgentLoopConfig<TApi>,
132
- signal: AbortSignal | undefined,
133
- stream: EventStream<AgentEvent, AgentContext["messages"]>,
134
- ): Promise<StreamAssistantResult> {
135
-
136
- // Convert AgentContext to Context for stream
137
- // Use a copy of messages to avoid mutating the original context
138
-
139
- const processedMessages = config.preprocessor
140
- ? await config.preprocessor(context.messages, signal)
141
- : [...context.messages];
142
-
143
- const processedContext: Context = {
144
- systemPrompt: context.systemPrompt,
145
- messages: [...processedMessages],
146
- tools: context.tools
147
- }
148
-
149
- const response = streamLLM(config.model, processedContext, {...config.providerOptions , signal});
150
-
151
- let partialMessage: AssistantMessage | null = null;
152
- let addedPartial = false;
153
-
154
- for await (const event of response) {
155
- switch (event.type) {
156
- case "start":
157
- partialMessage = event.partial;
158
- // context.messages.push(partialMessage);
159
- addedPartial = true;
160
- stream.push({ type: "message_start", message: { ...partialMessage } });
161
- break;
162
-
163
- case "text_start":
164
- case "text_delta":
165
- case "text_end":
166
- case "thinking_start":
167
- case "thinking_delta":
168
- case "thinking_end":
169
- case "toolcall_start":
170
- case "toolcall_delta":
171
- case "toolcall_end":
172
- if (partialMessage) {
173
- partialMessage = event.partial;
174
- // context.messages[context.messages.length - 1] = partialMessage;
175
- stream.push({ type: "message_update", assistantMessageEvent: event, message: { ...partialMessage } });
176
- }
177
- break;
178
-
179
- case "done":
180
- case "error": {
181
- const finalAssistantMessage = event.type === 'error' ? event.error : event.message
182
- if (!addedPartial) {
183
- stream.push({ type: "message_start", message: { ...finalAssistantMessage } });
184
- }
185
- stream.push({ type: "message_end", message: finalAssistantMessage });
186
-
187
- const finalMessage = await response.result();
188
- return {finalMessage, finalAssistantMessage}
189
- }
190
- }
191
- }
192
- const finalMessage = await response.result();
193
- return {finalAssistantMessage: partialMessage!, finalMessage}
194
- }
195
-
196
- async function executeToolCalls<T>(
197
- tools: readonly AgentTool<any, T>[] | undefined,
198
- assistantMessage: AssistantMessage,
199
- signal: AbortSignal | undefined,
200
- stream: EventStream<AgentEvent, AgentContext["messages"]>,
201
- ): Promise<ToolResultMessage<T>[]> {
202
-
203
- const toolCalls = assistantMessage.content.filter((c) => c.type === "toolCall");
204
- const results: ToolResultMessage<any>[] = [];
205
-
206
- for (const toolCall of toolCalls) {
207
- const tool = tools?.find((t) => t.name === toolCall.name);
208
-
209
- stream.push({
210
- type: "tool_execution_start",
211
- toolCallId: toolCall.id!,
212
- toolName: toolCall.name,
213
- args: toolCall.arguments,
214
- });
215
- let resultOrError: AgentToolResult<T> | string;
216
- let isError = false;
217
-
218
- let errorDetails: ToolResultMessage["error"] | undefined;
219
-
220
- try {
221
- if (!tool) {
222
- const availableTools = tools?.map((t) => t.name).join(", ") || "none";
223
- throw new Error(
224
- `Tool "${toolCall.name}" not found. Available tools: ${availableTools}`
225
- );
226
- }
227
-
228
- // Validate arguments using shared validation function
229
- const validatedArgs = validateToolArguments(tool, toolCall);
230
-
231
- // Execute with validated, typed arguments
232
- resultOrError = await tool.execute(toolCall.id!, validatedArgs, signal);
233
- } catch (e) {
234
- resultOrError = e instanceof Error ? e.message : String(e);
235
- isError = true;
236
- // Preserve full error details for debugging
237
- if (e instanceof Error) {
238
- errorDetails = {
239
- message: e.message,
240
- name: e.name,
241
- stack: e.stack,
242
- };
243
- }
244
- }
245
-
246
- stream.push({
247
- type: "tool_execution_end",
248
- toolCallId: toolCall.id!,
249
- toolName: toolCall.name,
250
- result: resultOrError,
251
- isError,
252
- });
253
-
254
- // Convert result to content blocks
255
- const content: ToolResultMessage<T>["content"] =
256
- typeof resultOrError === "string" ? [{ type: "text", content: resultOrError }] : resultOrError.content;
257
-
258
- const toolResultMessage: ToolResultMessage<T> = {
259
- role: "toolResult",
260
- toolCallId: toolCall.id,
261
- toolName: toolCall.name,
262
- content,
263
- details: typeof resultOrError === "string" ? ({} as T) : resultOrError.details,
264
- isError,
265
- error: errorDetails,
266
- timestamp: Date.now(),
267
- };
268
-
269
- results.push(toolResultMessage);
270
- stream.push({ type: "message_start", message: toolResultMessage });
271
- stream.push({ type: "message_end", message: toolResultMessage });
272
- }
273
-
274
- return results;
275
- }
@@ -1,80 +0,0 @@
1
- import { Message, Tool, UserTextContent, UserImageContent, UserFileContent, ToolResultMessage, AssistantMessageEvent, AssistantMessage, Model, OptionsForApi, Api, UserMessage } from "../types";
2
- import type { Static, TSchema } from "@sinclair/typebox";
3
-
4
-
5
- export interface AgentToolResult<T> {
6
- // Content blocks supporting text and images
7
- content: (UserTextContent | UserImageContent | UserFileContent)[];
8
- // Details to be displayed in a UI or logged
9
- details: T;
10
- }
11
-
12
- // AgentTool extends Tool but adds the execute function
13
- export interface AgentTool<TParameters extends TSchema = TSchema, TDetails = any> extends Tool<TParameters> {
14
- // A human-readable label for the tool to be displayed in UI
15
- label: string;
16
- execute: (
17
- toolCallId: string,
18
- params: Static<TParameters>,
19
- signal?: AbortSignal,
20
- ) => Promise<AgentToolResult<TDetails>>;
21
- }
22
-
23
- // AgentContext is like Context but uses AgentTool
24
- export interface AgentContext {
25
- systemPrompt?: string;
26
- messages: Message[];
27
- tools?: readonly AgentTool<any>[];
28
- }
29
-
30
-
31
- // Event types
32
- export type AgentEvent =
33
- // Emitted when the agent starts. An agent can emit multiple turns
34
- | { type: "agent_start" }
35
- // Emitted when a turn starts. A turn can emit an optional user message (initial prompt), an assistant message (response) and multiple tool result messages
36
- | { type: "turn_start" }
37
- // Emitted when a user, assistant or tool result message starts
38
- | { type: "message_start"; message: AssistantMessage | UserMessage | ToolResultMessage }
39
- // Emitted when an asssitant messages is updated due to streaming
40
- | { type: "message_update"; assistantMessageEvent: AssistantMessageEvent; message: AssistantMessage }
41
- // Emitted when a user, assistant or tool result message is complete
42
- | { type: "message_end"; message: AssistantMessage | UserMessage | ToolResultMessage }
43
- // Emitted when a tool execution starts
44
- | { type: "tool_execution_start"; toolCallId: string; toolName: string; args: any }
45
- // Emitted when a tool execution completes
46
- | {
47
- type: "tool_execution_end";
48
- toolCallId: string;
49
- toolName: string;
50
- result: AgentToolResult<any> | string;
51
- isError: boolean;
52
- }
53
- // Emitted when a full turn completes
54
- | { type: "turn_end"; message: AssistantMessage; toolResults: ToolResultMessage[] }
55
- // Emitted when the agent has completed all its turns. All messages from every turn are
56
- // contained in messages, which can be appended to the context
57
- | { type: "agent_end"; messages: AgentContext["messages"]; status: "completed" | "aborted" | "error" };
58
-
59
- // Queued message with optional LLM representation
60
- export interface QueuedMessage<TApp = Message> {
61
- original: TApp; // Original message for UI events
62
- llm?: Message; // Optional transformed message for loop context (undefined if filtered)
63
- }
64
-
65
- export type ReasoningEffort = "minimal" | "low" | "medium" | "high";
66
-
67
- export interface SimpleProviderOptions {
68
- reasoning?: ReasoningEffort;
69
- signal?: AbortSignal;
70
- apiKey?: string;
71
- maxTokens?: number;
72
- }
73
-
74
- // Configuration for agent loop execution
75
- export interface AgentLoopConfig<TApi extends Api> {
76
- model: Model<TApi>;
77
- preprocessor?: (messages: AgentContext["messages"], signal?: AbortSignal) => Promise<AgentContext["messages"]>;
78
- providerOptions: OptionsForApi<TApi>,
79
- getQueuedMessages?: <T>() => Promise<QueuedMessage<T>[]>;
80
- }