@bottensor/framework 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +427 -0
- package/dist/agent.d.ts +58 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +306 -0
- package/dist/agent.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +273 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/memory.d.ts +36 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +166 -0
- package/dist/memory.js.map +1 -0
- package/dist/provider.d.ts +26 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +126 -0
- package/dist/provider.js.map +1 -0
- package/dist/skills.d.ts +53 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +139 -0
- package/dist/skills.js.map +1 -0
- package/dist/types.d.ts +166 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/icon.png +0 -0
- package/package.json +58 -0
- package/skills/code-exec/SKILL.md +34 -0
- package/skills/file-ops/SKILL.md +50 -0
- package/skills/web-search/SKILL.md +31 -0
package/dist/agent.js
ADDED
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import { OpenAIProvider } from "./provider.js";
|
|
2
|
+
import { loadSkill, loadSkillsFromDir, buildSkillSummary, buildSkillContext, collectTools } from "./skills.js";
|
|
3
|
+
import { MarkdownMemory } from "./memory.js";
|
|
4
|
+
const MAX_TOOL_ROUNDS = 10;
|
|
5
|
+
/**
|
|
6
|
+
* The core agent runtime.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { Agent } from "@bottensor/framework";
|
|
11
|
+
*
|
|
12
|
+
* const agent = new Agent({
|
|
13
|
+
* name: "my-agent",
|
|
14
|
+
* systemPrompt: "You are a helpful assistant.",
|
|
15
|
+
* provider: { name: "venice", apiKey: "...", baseUrl: "https://api.venice.ai/api/v1", defaultModel: "qwen3-4b" },
|
|
16
|
+
* skillsDir: "./skills",
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* const result = await agent.chat("Hello!");
|
|
20
|
+
* console.log(result.response);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export class Agent {
|
|
24
|
+
name;
|
|
25
|
+
provider;
|
|
26
|
+
model;
|
|
27
|
+
systemPrompt;
|
|
28
|
+
skills = [];
|
|
29
|
+
toolHandlers = new Map();
|
|
30
|
+
memory;
|
|
31
|
+
history = [];
|
|
32
|
+
config;
|
|
33
|
+
maxReasoningSteps;
|
|
34
|
+
constructor(config) {
|
|
35
|
+
this.config = config;
|
|
36
|
+
this.name = config.name;
|
|
37
|
+
this.systemPrompt = config.systemPrompt;
|
|
38
|
+
this.model = config.model ?? config.provider.defaultModel;
|
|
39
|
+
this.maxReasoningSteps = config.maxReasoningSteps ?? 0;
|
|
40
|
+
// Initialize provider
|
|
41
|
+
this.provider = new OpenAIProvider(config.provider);
|
|
42
|
+
// Initialize memory
|
|
43
|
+
if (config.memory === false) {
|
|
44
|
+
this.memory = null;
|
|
45
|
+
}
|
|
46
|
+
else if (config.memory) {
|
|
47
|
+
this.memory = config.memory;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
this.memory = new MarkdownMemory(config.memoryDir);
|
|
51
|
+
}
|
|
52
|
+
// Load skills
|
|
53
|
+
this.loadSkills();
|
|
54
|
+
// Register tool handlers
|
|
55
|
+
if (config.toolHandlers) {
|
|
56
|
+
for (const [name, handler] of Object.entries(config.toolHandlers)) {
|
|
57
|
+
this.toolHandlers.set(name, handler);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** Use a custom provider instance */
|
|
62
|
+
useProvider(provider) {
|
|
63
|
+
this.provider = provider;
|
|
64
|
+
return this;
|
|
65
|
+
}
|
|
66
|
+
/** Register a tool handler */
|
|
67
|
+
tool(name, handler) {
|
|
68
|
+
this.toolHandlers.set(name, handler);
|
|
69
|
+
return this;
|
|
70
|
+
}
|
|
71
|
+
/** Add a skill at runtime */
|
|
72
|
+
addSkill(skill) {
|
|
73
|
+
this.skills.push(skill);
|
|
74
|
+
return this;
|
|
75
|
+
}
|
|
76
|
+
/** Load a skill from a file path */
|
|
77
|
+
loadSkillFile(path) {
|
|
78
|
+
this.skills.push(loadSkill(path));
|
|
79
|
+
return this;
|
|
80
|
+
}
|
|
81
|
+
/** Get conversation history */
|
|
82
|
+
getHistory() {
|
|
83
|
+
return [...this.history];
|
|
84
|
+
}
|
|
85
|
+
/** Clear conversation history */
|
|
86
|
+
clearHistory() {
|
|
87
|
+
this.history = [];
|
|
88
|
+
}
|
|
89
|
+
/** Get the memory store */
|
|
90
|
+
getMemory() {
|
|
91
|
+
return this.memory;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Send a message to the agent and get a response.
|
|
95
|
+
* Handles tool calling loops, memory retrieval, and skill injection.
|
|
96
|
+
*/
|
|
97
|
+
async chat(message) {
|
|
98
|
+
const startTime = Date.now();
|
|
99
|
+
const allToolCalls = [];
|
|
100
|
+
let totalUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0, llmCalls: 0 };
|
|
101
|
+
// ── Build system prompt with skills + memory ────────
|
|
102
|
+
let fullSystemPrompt = this.systemPrompt;
|
|
103
|
+
// Inject skill summaries
|
|
104
|
+
if (this.skills.length > 0) {
|
|
105
|
+
fullSystemPrompt += buildSkillSummary(this.skills);
|
|
106
|
+
// Inject full skill content for all loaded skills
|
|
107
|
+
for (const skill of this.skills) {
|
|
108
|
+
fullSystemPrompt += buildSkillContext(skill);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Inject memory context
|
|
112
|
+
if (this.memory) {
|
|
113
|
+
try {
|
|
114
|
+
const memories = await this.memory.search(message, 5);
|
|
115
|
+
if (memories.length > 0) {
|
|
116
|
+
fullSystemPrompt += "\n\n<memory>\nRelevant memories from previous conversations:\n";
|
|
117
|
+
for (const m of memories) {
|
|
118
|
+
fullSystemPrompt += `- [${m.type}] ${m.content}\n`;
|
|
119
|
+
}
|
|
120
|
+
fullSystemPrompt += "</memory>\n";
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// Memory retrieval failure is non-fatal
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// ── Build messages ──────────────────────────────────
|
|
128
|
+
const messages = [
|
|
129
|
+
{ role: "system", content: fullSystemPrompt },
|
|
130
|
+
...this.history,
|
|
131
|
+
{ role: "user", content: message },
|
|
132
|
+
];
|
|
133
|
+
// Apply beforeRequest hook
|
|
134
|
+
let processedMessages = messages;
|
|
135
|
+
const tools = this.getAllTools();
|
|
136
|
+
if (this.config.hooks?.beforeRequest) {
|
|
137
|
+
processedMessages = await this.config.hooks.beforeRequest(messages, tools);
|
|
138
|
+
}
|
|
139
|
+
// ── LLM call loop (handles tool calls) ──────────────
|
|
140
|
+
let response;
|
|
141
|
+
let rounds = 0;
|
|
142
|
+
while (true) {
|
|
143
|
+
const request = {
|
|
144
|
+
model: this.model,
|
|
145
|
+
messages: processedMessages,
|
|
146
|
+
temperature: this.config.temperature,
|
|
147
|
+
maxTokens: this.config.maxTokens,
|
|
148
|
+
tools: tools.length > 0 ? tools : undefined,
|
|
149
|
+
};
|
|
150
|
+
response = await this.provider.chat(request);
|
|
151
|
+
totalUsage.promptTokens += response.usage.promptTokens;
|
|
152
|
+
totalUsage.completionTokens += response.usage.completionTokens;
|
|
153
|
+
totalUsage.totalTokens += response.usage.totalTokens;
|
|
154
|
+
totalUsage.llmCalls++;
|
|
155
|
+
// Apply afterResponse hook
|
|
156
|
+
if (this.config.hooks?.afterResponse) {
|
|
157
|
+
response = await this.config.hooks.afterResponse(response);
|
|
158
|
+
}
|
|
159
|
+
// If no tool calls, we're done
|
|
160
|
+
if (!response.toolCalls || response.toolCalls.length === 0) {
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
// Guard against infinite tool loops
|
|
164
|
+
rounds++;
|
|
165
|
+
if (rounds >= MAX_TOOL_ROUNDS) {
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
// Add assistant message with tool calls
|
|
169
|
+
processedMessages.push({
|
|
170
|
+
role: "assistant",
|
|
171
|
+
content: response.content || "",
|
|
172
|
+
});
|
|
173
|
+
// Execute tool calls
|
|
174
|
+
for (const tc of response.toolCalls) {
|
|
175
|
+
let args;
|
|
176
|
+
try {
|
|
177
|
+
args = JSON.parse(tc.function.arguments);
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
args = {};
|
|
181
|
+
}
|
|
182
|
+
// Apply beforeToolCall hook
|
|
183
|
+
if (this.config.hooks?.beforeToolCall) {
|
|
184
|
+
args = await this.config.hooks.beforeToolCall(tc.function.name, args);
|
|
185
|
+
}
|
|
186
|
+
let result;
|
|
187
|
+
const handler = this.toolHandlers.get(tc.function.name);
|
|
188
|
+
if (handler) {
|
|
189
|
+
try {
|
|
190
|
+
const output = await handler(args);
|
|
191
|
+
result = { toolCallId: tc.id, content: output };
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
result = {
|
|
195
|
+
toolCallId: tc.id,
|
|
196
|
+
content: `Error: ${err.message}`,
|
|
197
|
+
isError: true,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
result = {
|
|
203
|
+
toolCallId: tc.id,
|
|
204
|
+
content: `Error: No handler registered for tool "${tc.function.name}"`,
|
|
205
|
+
isError: true,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
// Apply afterToolCall hook
|
|
209
|
+
if (this.config.hooks?.afterToolCall) {
|
|
210
|
+
result = await this.config.hooks.afterToolCall(tc.function.name, result);
|
|
211
|
+
}
|
|
212
|
+
allToolCalls.push({ name: tc.function.name, args, result: result.content });
|
|
213
|
+
processedMessages.push({
|
|
214
|
+
role: "tool",
|
|
215
|
+
content: result.content,
|
|
216
|
+
toolCallId: tc.id,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
const finalResponse = response.content;
|
|
221
|
+
// ── Update history ──────────────────────────────────
|
|
222
|
+
this.history.push({ role: "user", content: message });
|
|
223
|
+
this.history.push({ role: "assistant", content: finalResponse });
|
|
224
|
+
// ── Store memory ────────────────────────────────────
|
|
225
|
+
if (this.memory) {
|
|
226
|
+
try {
|
|
227
|
+
await this.memory.add({
|
|
228
|
+
content: `User: ${message.slice(0, 500)}\nAssistant: ${finalResponse.slice(0, 500)}`,
|
|
229
|
+
type: "conversation",
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
// Non-fatal
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return {
|
|
237
|
+
response: finalResponse,
|
|
238
|
+
messages: processedMessages,
|
|
239
|
+
toolCalls: allToolCalls,
|
|
240
|
+
usage: totalUsage,
|
|
241
|
+
duration: Date.now() - startTime,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Run a one-shot completion (no history, no memory).
|
|
246
|
+
*/
|
|
247
|
+
async run(prompt, systemPrompt) {
|
|
248
|
+
const messages = [
|
|
249
|
+
{ role: "system", content: systemPrompt ?? this.systemPrompt },
|
|
250
|
+
{ role: "user", content: prompt },
|
|
251
|
+
];
|
|
252
|
+
const response = await this.provider.chat({
|
|
253
|
+
model: this.model,
|
|
254
|
+
messages,
|
|
255
|
+
temperature: this.config.temperature,
|
|
256
|
+
maxTokens: this.config.maxTokens,
|
|
257
|
+
});
|
|
258
|
+
return response.content;
|
|
259
|
+
}
|
|
260
|
+
// ── Private helpers ───────────────────────────────────
|
|
261
|
+
loadSkills() {
|
|
262
|
+
// Load from explicit skill list
|
|
263
|
+
if (this.config.skills) {
|
|
264
|
+
for (const s of this.config.skills) {
|
|
265
|
+
if (typeof s === "string") {
|
|
266
|
+
try {
|
|
267
|
+
this.skills.push(loadSkill(s));
|
|
268
|
+
}
|
|
269
|
+
catch (err) {
|
|
270
|
+
console.warn(`[agent] Failed to load skill from ${s}: ${err.message}`);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
this.skills.push(s);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
// Auto-discover from skillsDir
|
|
279
|
+
if (this.config.skillsDir) {
|
|
280
|
+
const discovered = loadSkillsFromDir(this.config.skillsDir);
|
|
281
|
+
this.skills.push(...discovered);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
getAllTools() {
|
|
285
|
+
// Collect tools from skills
|
|
286
|
+
const skillTools = collectTools(this.skills);
|
|
287
|
+
// Collect tools from registered handlers that aren't already defined by skills
|
|
288
|
+
const skillToolNames = new Set(skillTools.map((t) => t.function.name));
|
|
289
|
+
const handlerTools = [];
|
|
290
|
+
for (const [name] of this.toolHandlers) {
|
|
291
|
+
if (!skillToolNames.has(name)) {
|
|
292
|
+
// Auto-generate a minimal tool def for handlers without skill definitions
|
|
293
|
+
handlerTools.push({
|
|
294
|
+
type: "function",
|
|
295
|
+
function: {
|
|
296
|
+
name,
|
|
297
|
+
description: `Execute the ${name} tool`,
|
|
298
|
+
parameters: { type: "object", properties: {} },
|
|
299
|
+
},
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return [...skillTools, ...handlerTools];
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync, existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
|
+
import { createInterface } from "node:readline";
|
|
5
|
+
import { parse as parseYaml } from "yaml";
|
|
6
|
+
import { Agent } from "./agent.js";
|
|
7
|
+
const AGENT_CONFIG_FILE = "agent.yaml";
|
|
8
|
+
const DEFAULT_SKILLS_DIR = "./skills";
|
|
9
|
+
const DEFAULT_MEMORY_DIR = "./.agent/memory";
|
|
10
|
+
function printHelp() {
|
|
11
|
+
console.log(`
|
|
12
|
+
@bottensor/framework — Open Agentic Framework
|
|
13
|
+
|
|
14
|
+
Usage:
|
|
15
|
+
bottensor init Create a new agent project
|
|
16
|
+
bottensor chat Start interactive chat with your agent
|
|
17
|
+
bottensor run <prompt> Run a one-shot prompt
|
|
18
|
+
bottensor skills List loaded skills
|
|
19
|
+
bottensor help Show this help
|
|
20
|
+
|
|
21
|
+
Configuration:
|
|
22
|
+
Create an agent.yaml in your project root:
|
|
23
|
+
|
|
24
|
+
name: my-agent
|
|
25
|
+
systemPrompt: You are a helpful assistant.
|
|
26
|
+
provider:
|
|
27
|
+
name: venice
|
|
28
|
+
apiKey: \${VENICE_API_KEY}
|
|
29
|
+
baseUrl: https://api.venice.ai/api/v1
|
|
30
|
+
defaultModel: qwen3-4b
|
|
31
|
+
skillsDir: ./skills
|
|
32
|
+
memoryDir: ./.agent/memory
|
|
33
|
+
`);
|
|
34
|
+
}
|
|
35
|
+
function loadConfig() {
|
|
36
|
+
const configPath = resolve(AGENT_CONFIG_FILE);
|
|
37
|
+
if (!existsSync(configPath)) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
let raw = readFileSync(configPath, "utf-8");
|
|
41
|
+
// Resolve environment variables: ${VAR_NAME}
|
|
42
|
+
raw = raw.replace(/\$\{(\w+)\}/g, (_, varName) => process.env[varName] ?? "");
|
|
43
|
+
const yaml = parseYaml(raw);
|
|
44
|
+
const provider = yaml.provider;
|
|
45
|
+
if (!provider) {
|
|
46
|
+
console.error("Error: agent.yaml must include a 'provider' section");
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
name: yaml.name ?? "agent",
|
|
51
|
+
systemPrompt: yaml.systemPrompt ?? "You are a helpful AI assistant.",
|
|
52
|
+
provider: {
|
|
53
|
+
name: provider.name ?? "default",
|
|
54
|
+
apiKey: provider.apiKey ?? "",
|
|
55
|
+
baseUrl: provider.baseUrl ?? "",
|
|
56
|
+
defaultModel: provider.defaultModel ?? "gpt-4o-mini",
|
|
57
|
+
headers: provider.headers ?? undefined,
|
|
58
|
+
},
|
|
59
|
+
model: yaml.model,
|
|
60
|
+
skillsDir: yaml.skillsDir ?? DEFAULT_SKILLS_DIR,
|
|
61
|
+
memoryDir: yaml.memoryDir ?? DEFAULT_MEMORY_DIR,
|
|
62
|
+
temperature: yaml.temperature,
|
|
63
|
+
maxTokens: yaml.maxTokens,
|
|
64
|
+
maxReasoningSteps: yaml.maxReasoningSteps,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
async function cmdInit() {
|
|
68
|
+
const configPath = resolve(AGENT_CONFIG_FILE);
|
|
69
|
+
if (existsSync(configPath)) {
|
|
70
|
+
console.log("agent.yaml already exists.");
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const template = `# Bottensor Agent Configuration
|
|
74
|
+
name: my-agent
|
|
75
|
+
systemPrompt: |
|
|
76
|
+
You are a helpful AI assistant powered by Bottensor.
|
|
77
|
+
You are friendly, concise, and knowledgeable.
|
|
78
|
+
|
|
79
|
+
provider:
|
|
80
|
+
name: venice
|
|
81
|
+
apiKey: \${VENICE_API_KEY}
|
|
82
|
+
baseUrl: https://api.venice.ai/api/v1
|
|
83
|
+
defaultModel: qwen3-4b
|
|
84
|
+
|
|
85
|
+
# Uncomment to use Bottensor API:
|
|
86
|
+
# provider:
|
|
87
|
+
# name: bottensor
|
|
88
|
+
# apiKey: \${BOTTENSOR_API_KEY}
|
|
89
|
+
# baseUrl: https://api.bottensor.xyz/v1
|
|
90
|
+
# defaultModel: qwen3-4b
|
|
91
|
+
|
|
92
|
+
# Uncomment to use OpenAI:
|
|
93
|
+
# provider:
|
|
94
|
+
# name: openai
|
|
95
|
+
# apiKey: \${OPENAI_API_KEY}
|
|
96
|
+
# baseUrl: https://api.openai.com/v1
|
|
97
|
+
# defaultModel: gpt-4o-mini
|
|
98
|
+
|
|
99
|
+
# Uncomment to use local Ollama:
|
|
100
|
+
# provider:
|
|
101
|
+
# name: ollama
|
|
102
|
+
# baseUrl: http://localhost:11434/v1
|
|
103
|
+
# defaultModel: llama3.2
|
|
104
|
+
|
|
105
|
+
skillsDir: ./skills
|
|
106
|
+
memoryDir: ./.agent/memory
|
|
107
|
+
temperature: 0.7
|
|
108
|
+
maxTokens: 4096
|
|
109
|
+
`;
|
|
110
|
+
writeFileSync(configPath, template);
|
|
111
|
+
mkdirSync(resolve(DEFAULT_SKILLS_DIR), { recursive: true });
|
|
112
|
+
// Create an example skill
|
|
113
|
+
const exampleSkill = `---
|
|
114
|
+
name: greeting
|
|
115
|
+
description: Knows how to greet users in different languages
|
|
116
|
+
version: "1.0"
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
# Greeting Skill
|
|
120
|
+
|
|
121
|
+
When a user asks for a greeting or says hello, respond warmly.
|
|
122
|
+
You can greet in multiple languages:
|
|
123
|
+
|
|
124
|
+
- English: "Hello! How can I help you today?"
|
|
125
|
+
- Spanish: "¡Hola! ¿En qué puedo ayudarte?"
|
|
126
|
+
- Japanese: "こんにちは!何かお手伝いできますか?"
|
|
127
|
+
- French: "Bonjour ! Comment puis-je vous aider ?"
|
|
128
|
+
|
|
129
|
+
Always match the user's language if they greet you in a specific language.
|
|
130
|
+
`;
|
|
131
|
+
writeFileSync(join(resolve(DEFAULT_SKILLS_DIR), "greeting.md"), exampleSkill);
|
|
132
|
+
console.log(`
|
|
133
|
+
✓ Created agent.yaml
|
|
134
|
+
✓ Created skills/ directory with example skill
|
|
135
|
+
|
|
136
|
+
Next steps:
|
|
137
|
+
1. Set your API key: export VENICE_API_KEY=your-key
|
|
138
|
+
2. Start chatting: bottensor chat
|
|
139
|
+
3. Add skills: create .md files in ./skills/
|
|
140
|
+
`);
|
|
141
|
+
}
|
|
142
|
+
async function cmdChat() {
|
|
143
|
+
const config = loadConfig();
|
|
144
|
+
if (!config) {
|
|
145
|
+
console.error("No agent.yaml found. Run 'bottensor init' first.");
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
const agent = new Agent(config);
|
|
149
|
+
console.log(`\n ${config.name} — powered by Bottensor framework`);
|
|
150
|
+
console.log(` Provider: ${config.provider.name} (${config.provider.defaultModel})`);
|
|
151
|
+
console.log(` Type 'exit' to quit, 'clear' to reset history\n`);
|
|
152
|
+
const rl = createInterface({
|
|
153
|
+
input: process.stdin,
|
|
154
|
+
output: process.stdout,
|
|
155
|
+
});
|
|
156
|
+
const prompt = () => {
|
|
157
|
+
rl.question("you > ", async (input) => {
|
|
158
|
+
const trimmed = input.trim();
|
|
159
|
+
if (!trimmed) {
|
|
160
|
+
prompt();
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (trimmed === "exit" || trimmed === "quit") {
|
|
164
|
+
console.log("\nGoodbye!");
|
|
165
|
+
rl.close();
|
|
166
|
+
process.exit(0);
|
|
167
|
+
}
|
|
168
|
+
if (trimmed === "clear") {
|
|
169
|
+
agent.clearHistory();
|
|
170
|
+
console.log(" (history cleared)\n");
|
|
171
|
+
prompt();
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (trimmed === "skills") {
|
|
175
|
+
const skills = agent.skills;
|
|
176
|
+
if (skills.length === 0) {
|
|
177
|
+
console.log(" No skills loaded.\n");
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
console.log(" Loaded skills:");
|
|
181
|
+
for (const s of skills) {
|
|
182
|
+
console.log(` - ${s.meta.name}: ${s.meta.description}`);
|
|
183
|
+
}
|
|
184
|
+
console.log();
|
|
185
|
+
}
|
|
186
|
+
prompt();
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
try {
|
|
190
|
+
const result = await agent.chat(trimmed);
|
|
191
|
+
console.log(`\n${config.name} > ${result.response}`);
|
|
192
|
+
if (result.toolCalls.length > 0) {
|
|
193
|
+
console.log(` [${result.toolCalls.length} tool call(s), ${result.usage.llmCalls} LLM call(s), ${result.duration}ms]`);
|
|
194
|
+
}
|
|
195
|
+
console.log();
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
console.error(` Error: ${err.message}\n`);
|
|
199
|
+
}
|
|
200
|
+
prompt();
|
|
201
|
+
});
|
|
202
|
+
};
|
|
203
|
+
prompt();
|
|
204
|
+
}
|
|
205
|
+
async function cmdRun(promptText) {
|
|
206
|
+
const config = loadConfig();
|
|
207
|
+
if (!config) {
|
|
208
|
+
console.error("No agent.yaml found. Run 'bottensor init' first.");
|
|
209
|
+
process.exit(1);
|
|
210
|
+
}
|
|
211
|
+
const agent = new Agent(config);
|
|
212
|
+
try {
|
|
213
|
+
const result = await agent.chat(promptText);
|
|
214
|
+
console.log(result.response);
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
console.error(`Error: ${err.message}`);
|
|
218
|
+
process.exit(1);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
async function cmdSkills() {
|
|
222
|
+
const config = loadConfig();
|
|
223
|
+
if (!config) {
|
|
224
|
+
console.error("No agent.yaml found. Run 'bottensor init' first.");
|
|
225
|
+
process.exit(1);
|
|
226
|
+
}
|
|
227
|
+
const agent = new Agent(config);
|
|
228
|
+
const skills = agent.skills;
|
|
229
|
+
if (skills.length === 0) {
|
|
230
|
+
console.log("No skills loaded. Add .md files to your skills directory.");
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
console.log(`\n ${skills.length} skill(s) loaded:\n`);
|
|
234
|
+
for (const s of skills) {
|
|
235
|
+
console.log(` ${s.meta.name} (v${s.meta.version ?? "1.0"})`);
|
|
236
|
+
console.log(` ${s.meta.description}`);
|
|
237
|
+
console.log(` Source: ${s.source}`);
|
|
238
|
+
console.log(` Tools: ${s.tools.length}`);
|
|
239
|
+
console.log();
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// ── Main ────────────────────────────────────────────────
|
|
243
|
+
const args = process.argv.slice(2);
|
|
244
|
+
const command = args[0];
|
|
245
|
+
switch (command) {
|
|
246
|
+
case "init":
|
|
247
|
+
cmdInit();
|
|
248
|
+
break;
|
|
249
|
+
case "chat":
|
|
250
|
+
cmdChat();
|
|
251
|
+
break;
|
|
252
|
+
case "run":
|
|
253
|
+
if (!args[1]) {
|
|
254
|
+
console.error("Usage: bottensor run <prompt>");
|
|
255
|
+
process.exit(1);
|
|
256
|
+
}
|
|
257
|
+
cmdRun(args.slice(1).join(" "));
|
|
258
|
+
break;
|
|
259
|
+
case "skills":
|
|
260
|
+
cmdSkills();
|
|
261
|
+
break;
|
|
262
|
+
case "help":
|
|
263
|
+
case "--help":
|
|
264
|
+
case "-h":
|
|
265
|
+
case undefined:
|
|
266
|
+
printHelp();
|
|
267
|
+
break;
|
|
268
|
+
default:
|
|
269
|
+
console.error(`Unknown command: ${command}`);
|
|
270
|
+
printHelp();
|
|
271
|
+
process.exit(1);
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { Agent } from "./agent.js";
|
|
2
|
+
export { OpenAIProvider, bottensorProvider, agentsEcoProvider, veniceProvider, openaiProvider, groqProvider, ollamaProvider } from "./provider.js";
|
|
3
|
+
export { parseSkill, loadSkill, loadSkillsFromDir, buildSkillSummary, buildSkillContext, collectTools } from "./skills.js";
|
|
4
|
+
export { MarkdownMemory, InMemoryStore } from "./memory.js";
|
|
5
|
+
export type { AgentConfig, AgentHooks, RunResult, Provider, ProviderConfig, LLMRequest, LLMResponse, ChatMessage, ToolDef, ToolCall, ToolResult, ToolHandler, Skill, SkillFrontmatter, SkillToolDef, SkillConfigField, MemoryEntry, MemoryStore, } from "./types.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGnJ,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3H,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5D,YAAY,EAEV,WAAW,EACX,UAAU,EACV,SAAS,EAET,QAAQ,EACR,cAAc,EACd,UAAU,EACV,WAAW,EAEX,WAAW,EAEX,OAAO,EACP,QAAQ,EACR,UAAU,EACV,WAAW,EAEX,KAAK,EACL,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAEhB,WAAW,EACX,WAAW,GACZ,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// ── Core ────────────────────────────────────────────────
|
|
2
|
+
export { Agent } from "./agent.js";
|
|
3
|
+
// ── Providers ───────────────────────────────────────────
|
|
4
|
+
export { OpenAIProvider, bottensorProvider, agentsEcoProvider, veniceProvider, openaiProvider, groqProvider, ollamaProvider } from "./provider.js";
|
|
5
|
+
// ── Skills ──────────────────────────────────────────────
|
|
6
|
+
export { parseSkill, loadSkill, loadSkillsFromDir, buildSkillSummary, buildSkillContext, collectTools } from "./skills.js";
|
|
7
|
+
// ── Memory ──────────────────────────────────────────────
|
|
8
|
+
export { MarkdownMemory, InMemoryStore } from "./memory.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,2DAA2D;AAC3D,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEnJ,2DAA2D;AAC3D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3H,2DAA2D;AAC3D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|