@ank1015/providers 0.0.1 → 0.0.2
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/LICENSE +21 -0
- package/README.md +93 -383
- package/dist/agent/conversation.d.ts +97 -0
- package/dist/agent/conversation.d.ts.map +1 -0
- package/dist/agent/conversation.js +328 -0
- package/dist/agent/conversation.js.map +1 -0
- package/dist/agent/runner.d.ts +37 -0
- package/dist/agent/runner.d.ts.map +1 -0
- package/dist/agent/runner.js +169 -0
- package/dist/agent/runner.js.map +1 -0
- package/dist/agent/tools/calculate.d.ts +15 -0
- package/dist/agent/tools/calculate.d.ts.map +1 -0
- package/dist/agent/tools/calculate.js +23 -0
- package/dist/agent/tools/calculate.js.map +1 -0
- package/dist/agent/tools/get-current-time.d.ts +15 -0
- package/dist/agent/tools/get-current-time.d.ts.map +1 -0
- package/dist/agent/tools/get-current-time.js +38 -0
- package/dist/agent/tools/get-current-time.js.map +1 -0
- package/dist/agent/tools/index.d.ts +3 -0
- package/dist/agent/tools/index.d.ts.map +1 -0
- package/dist/agent/tools/index.js +3 -0
- package/dist/agent/tools/index.js.map +1 -0
- package/dist/agent/types.d.ts +53 -31
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +1 -2
- package/dist/agent/utils.d.ts +14 -0
- package/dist/agent/utils.d.ts.map +1 -0
- package/dist/agent/utils.js +59 -0
- package/dist/agent/utils.js.map +1 -0
- package/dist/index.d.ts +16 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -28
- package/dist/index.js.map +1 -1
- package/dist/llm.d.ts +15 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +92 -0
- package/dist/llm.js.map +1 -0
- package/dist/models.d.ts +8 -1
- package/dist/models.d.ts.map +1 -1
- package/dist/models.generated.d.ts +25 -112
- package/dist/models.generated.d.ts.map +1 -1
- package/dist/models.generated.js +72 -227
- package/dist/models.generated.js.map +1 -1
- package/dist/models.js +30 -32
- package/dist/models.js.map +1 -1
- package/dist/providers/google/complete.d.ts +3 -0
- package/dist/providers/google/complete.d.ts.map +1 -0
- package/dist/providers/google/complete.js +53 -0
- package/dist/providers/google/complete.js.map +1 -0
- package/dist/providers/google/index.d.ts +6 -0
- package/dist/providers/google/index.d.ts.map +1 -0
- package/dist/providers/google/index.js +6 -0
- package/dist/providers/google/index.js.map +1 -0
- package/dist/providers/google/stream.d.ts +3 -0
- package/dist/providers/google/stream.d.ts.map +1 -0
- package/dist/providers/{google.js → google/stream.js} +67 -231
- package/dist/providers/google/stream.js.map +1 -0
- package/dist/providers/google/types.d.ts +8 -0
- package/dist/providers/google/types.d.ts.map +1 -0
- package/dist/providers/google/types.js +2 -0
- package/dist/providers/google/types.js.map +1 -0
- package/dist/providers/google/utils.d.ts +30 -0
- package/dist/providers/google/utils.d.ts.map +1 -0
- package/dist/providers/google/utils.js +354 -0
- package/dist/providers/google/utils.js.map +1 -0
- package/dist/providers/openai/complete.d.ts +3 -0
- package/dist/providers/openai/complete.d.ts.map +1 -0
- package/dist/providers/openai/complete.js +57 -0
- package/dist/providers/openai/complete.js.map +1 -0
- package/dist/providers/openai/index.d.ts +4 -0
- package/dist/providers/openai/index.d.ts.map +1 -0
- package/dist/providers/openai/index.js +4 -0
- package/dist/providers/openai/index.js.map +1 -0
- package/dist/providers/openai/stream.d.ts +3 -0
- package/dist/providers/openai/stream.d.ts.map +1 -0
- package/dist/providers/{openai.js → openai/stream.js} +74 -152
- package/dist/providers/openai/stream.js.map +1 -0
- package/dist/providers/openai/types.d.ts +8 -0
- package/dist/providers/openai/types.d.ts.map +1 -0
- package/dist/providers/openai/types.js +2 -0
- package/dist/providers/openai/types.js.map +1 -0
- package/dist/providers/openai/utils.d.ts +13 -0
- package/dist/providers/openai/utils.d.ts.map +1 -0
- package/dist/providers/openai/utils.js +285 -0
- package/dist/providers/openai/utils.js.map +1 -0
- package/dist/types.d.ts +95 -87
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -9
- package/dist/types.js.map +1 -1
- package/dist/utils/event-stream.d.ts +2 -2
- package/dist/utils/event-stream.d.ts.map +1 -1
- package/dist/utils/event-stream.js +2 -7
- package/dist/utils/event-stream.js.map +1 -1
- package/dist/utils/json-parse.js +3 -6
- package/dist/utils/json-parse.js.map +1 -1
- package/dist/utils/overflow.d.ts +51 -0
- package/dist/utils/overflow.d.ts.map +1 -0
- package/dist/utils/overflow.js +106 -0
- package/dist/utils/overflow.js.map +1 -0
- package/dist/utils/sanitize-unicode.js +1 -4
- package/dist/utils/sanitize-unicode.js.map +1 -1
- package/dist/utils/uuid.d.ts +6 -0
- package/dist/utils/uuid.d.ts.map +1 -0
- package/dist/utils/uuid.js +9 -0
- package/dist/utils/uuid.js.map +1 -0
- package/dist/utils/validation.d.ts +10 -3
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +20 -12
- package/dist/utils/validation.js.map +1 -1
- package/package.json +45 -8
- package/biome.json +0 -43
- package/dist/agent/agent-loop.d.ts +0 -5
- package/dist/agent/agent-loop.d.ts.map +0 -1
- package/dist/agent/agent-loop.js +0 -219
- package/dist/agent/agent-loop.js.map +0 -1
- package/dist/providers/convert.d.ts +0 -6
- package/dist/providers/convert.d.ts.map +0 -1
- package/dist/providers/convert.js +0 -207
- package/dist/providers/convert.js.map +0 -1
- package/dist/providers/google.d.ts +0 -26
- package/dist/providers/google.d.ts.map +0 -1
- package/dist/providers/google.js.map +0 -1
- package/dist/providers/openai.d.ts +0 -17
- package/dist/providers/openai.d.ts.map +0 -1
- package/dist/providers/openai.js.map +0 -1
- package/dist/stream.d.ts +0 -4
- package/dist/stream.d.ts.map +0 -1
- package/dist/stream.js +0 -40
- package/dist/stream.js.map +0 -1
- package/dist/test-google-agent-loop.d.ts +0 -2
- package/dist/test-google-agent-loop.d.ts.map +0 -1
- package/dist/test-google-agent-loop.js +0 -186
- package/dist/test-google-agent-loop.js.map +0 -1
- package/dist/test-google.d.ts +0 -2
- package/dist/test-google.d.ts.map +0 -1
- package/dist/test-google.js +0 -41
- package/dist/test-google.js.map +0 -1
- package/src/agent/agent-loop.ts +0 -275
- package/src/agent/types.ts +0 -80
- package/src/index.ts +0 -72
- package/src/models.generated.ts +0 -314
- package/src/models.ts +0 -45
- package/src/providers/convert.ts +0 -222
- package/src/providers/google.ts +0 -496
- package/src/providers/openai.ts +0 -437
- package/src/stream.ts +0 -60
- package/src/types.ts +0 -198
- package/src/utils/event-stream.ts +0 -60
- package/src/utils/json-parse.ts +0 -28
- package/src/utils/sanitize-unicode.ts +0 -25
- package/src/utils/validation.ts +0 -69
- package/test/core/agent-loop.test.ts +0 -958
- package/test/core/stream.test.ts +0 -409
- package/test/data/red-circle.png +0 -0
- package/test/data/superintelligentwill.pdf +0 -0
- package/test/edge-cases/general.test.ts +0 -565
- package/test/integration/e2e.test.ts +0 -530
- package/test/models/cost.test.ts +0 -499
- package/test/models/registry.test.ts +0 -298
- package/test/providers/convert.test.ts +0 -846
- package/test/providers/google-schema.test.ts +0 -666
- package/test/providers/google-stream.test.ts +0 -369
- package/test/providers/openai-stream.test.ts +0 -251
- package/test/utils/event-stream.test.ts +0 -289
- package/test/utils/json-parse.test.ts +0 -344
- package/test/utils/sanitize-unicode.test.ts +0 -329
- package/test/utils/validation.test.ts +0 -614
- package/tsconfig.json +0 -21
- package/vitest.config.ts +0 -9
|
@@ -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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"}
|
package/dist/test-google.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-google.d.ts","sourceRoot":"","sources":["../src/test-google.ts"],"names":[],"mappings":""}
|
package/dist/test-google.js
DELETED
|
@@ -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
|
package/dist/test-google.js.map
DELETED
|
@@ -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"}
|
package/src/agent/agent-loop.ts
DELETED
|
@@ -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
|
-
}
|
package/src/agent/types.ts
DELETED
|
@@ -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
|
-
}
|