@commandkit/ai 0.1.0-dev.20250611125312 → 0.1.0-dev.20250611155146
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/dist/augmentation.d.ts +17 -0
- package/dist/augmentation.js +32 -0
- package/dist/configure.d.ts +58 -0
- package/dist/configure.js +83 -0
- package/dist/context.d.ts +16 -0
- package/dist/context.js +5 -1
- package/dist/index.d.ts +13 -0
- package/dist/index.js +28 -1
- package/dist/plugin.d.ts +9 -31
- package/dist/plugin.js +78 -239
- package/dist/system-prompt.d.ts +6 -0
- package/dist/system-prompt.js +34 -0
- package/dist/tools/common/index.d.ts +76 -0
- package/dist/tools/common/index.js +48 -0
- package/dist/tools/get-available-commands.d.ts +14 -0
- package/dist/tools/get-available-commands.js +23 -0
- package/dist/tools/get-channel-by-id.d.ts +12 -0
- package/dist/tools/get-channel-by-id.js +35 -0
- package/dist/tools/get-current-client-info.d.ts +4 -0
- package/dist/tools/get-current-client-info.js +21 -0
- package/dist/tools/get-guild-by-id.d.ts +36 -0
- package/dist/tools/get-guild-by-id.js +41 -0
- package/dist/tools/get-user-by-id.d.ts +12 -0
- package/dist/tools/get-user-by-id.js +30 -0
- package/dist/types.d.ts +11 -6
- package/dist/utils.d.ts +6 -0
- package/dist/utils.js +24 -0
- package/package.json +3 -3
- package/dist/schema.d.ts +0 -205
- package/dist/schema.js +0 -105
package/dist/plugin.js
CHANGED
|
@@ -1,144 +1,54 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AiPlugin = void 0;
|
|
4
|
-
exports.configureAI = configureAI;
|
|
5
4
|
const plugin_1 = require("commandkit/plugin");
|
|
6
5
|
const commandkit_1 = require("commandkit");
|
|
7
6
|
const context_1 = require("./context");
|
|
8
7
|
const discord_js_1 = require("discord.js");
|
|
9
8
|
const ai_1 = require("ai");
|
|
10
|
-
const zod_1 = require("zod");
|
|
11
9
|
const ai_context_worker_1 = require("./ai-context-worker");
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
selectAiModel = config.selectAiModel;
|
|
27
|
-
}
|
|
28
|
-
if (config.systemPrompt) {
|
|
29
|
-
generateSystemPrompt = config.systemPrompt;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
10
|
+
const get_available_commands_1 = require("./tools/get-available-commands");
|
|
11
|
+
const get_channel_by_id_1 = require("./tools/get-channel-by-id");
|
|
12
|
+
const get_current_client_info_1 = require("./tools/get-current-client-info");
|
|
13
|
+
const get_guild_by_id_1 = require("./tools/get-guild-by-id");
|
|
14
|
+
const get_user_by_id_1 = require("./tools/get-user-by-id");
|
|
15
|
+
const configure_1 = require("./configure");
|
|
16
|
+
const augmentation_1 = require("./augmentation");
|
|
17
|
+
const defaultTools = {
|
|
18
|
+
getAvailableCommands: get_available_commands_1.getAvailableCommands,
|
|
19
|
+
getChannelById: get_channel_by_id_1.getChannelById,
|
|
20
|
+
getCurrentClientInfo: get_current_client_info_1.getCurrentClientInfo,
|
|
21
|
+
getGuildById: get_guild_by_id_1.getGuildById,
|
|
22
|
+
getUserById: get_user_by_id_1.getUserById,
|
|
23
|
+
};
|
|
32
24
|
class AiPlugin extends plugin_1.RuntimePlugin {
|
|
33
25
|
constructor(options) {
|
|
34
26
|
super(options);
|
|
35
27
|
this.name = 'AiPlugin';
|
|
36
28
|
this.toolsRecord = {};
|
|
37
|
-
this.defaultTools =
|
|
29
|
+
this.defaultTools = defaultTools;
|
|
38
30
|
this.onMessageFunc = null;
|
|
39
31
|
}
|
|
40
32
|
async activate(ctx) {
|
|
41
|
-
this.onMessageFunc = (message) => this.handleMessage(ctx, message);
|
|
33
|
+
this.onMessageFunc = (message) => this.handleMessage(ctx.commandkit, message);
|
|
42
34
|
ctx.commandkit.client.on(discord_js_1.Events.MessageCreate, this.onMessageFunc);
|
|
43
|
-
|
|
35
|
+
(0, augmentation_1.augmentCommandKit)(true);
|
|
44
36
|
commandkit_1.Logger.info(`Plugin ${this.name} activated`);
|
|
45
37
|
}
|
|
46
|
-
createDefaultTools(ctx) {
|
|
47
|
-
const { commandkit } = ctx;
|
|
48
|
-
const client = commandkit.client;
|
|
49
|
-
this.defaultTools.getUserById = (0, ai_1.tool)({
|
|
50
|
-
description: 'Get user information by ID',
|
|
51
|
-
parameters: zod_1.z.object({
|
|
52
|
-
userId: zod_1.z
|
|
53
|
-
.string()
|
|
54
|
-
.describe('The ID of the user to retrieve. This is a Discord snowflake string.'),
|
|
55
|
-
}),
|
|
56
|
-
execute: async (params) => {
|
|
57
|
-
const user = await client.users.fetch(params.userId, {
|
|
58
|
-
force: false,
|
|
59
|
-
cache: true,
|
|
60
|
-
});
|
|
61
|
-
return user.toJSON();
|
|
62
|
-
},
|
|
63
|
-
});
|
|
64
|
-
this.defaultTools.getChannelById = (0, ai_1.tool)({
|
|
65
|
-
description: 'Get channel information by ID',
|
|
66
|
-
parameters: zod_1.z.object({
|
|
67
|
-
channelId: zod_1.z
|
|
68
|
-
.string()
|
|
69
|
-
.describe('The ID of the channel to retrieve. This is a Discord snowflake string.'),
|
|
70
|
-
}),
|
|
71
|
-
execute: async (params) => {
|
|
72
|
-
const channel = await client.channels.fetch(params.channelId, {
|
|
73
|
-
force: false,
|
|
74
|
-
cache: true,
|
|
75
|
-
});
|
|
76
|
-
if (!channel) {
|
|
77
|
-
throw new Error(`Channel with ID ${params.channelId} not found.`);
|
|
78
|
-
}
|
|
79
|
-
return channel.toJSON();
|
|
80
|
-
},
|
|
81
|
-
});
|
|
82
|
-
this.defaultTools.getGuildById = (0, ai_1.tool)({
|
|
83
|
-
description: 'Get guild information by ID',
|
|
84
|
-
parameters: zod_1.z.object({
|
|
85
|
-
guildId: zod_1.z
|
|
86
|
-
.string()
|
|
87
|
-
.describe('The ID of the guild to retrieve. This is a Discord snowflake string.'),
|
|
88
|
-
}),
|
|
89
|
-
execute: async (params) => {
|
|
90
|
-
const guild = await client.guilds.fetch({
|
|
91
|
-
guild: params.guildId,
|
|
92
|
-
force: false,
|
|
93
|
-
cache: true,
|
|
94
|
-
});
|
|
95
|
-
if (!guild) {
|
|
96
|
-
throw new Error(`Guild with ID ${params.guildId} not found.`);
|
|
97
|
-
}
|
|
98
|
-
return {
|
|
99
|
-
id: guild.id,
|
|
100
|
-
name: guild.name,
|
|
101
|
-
icon: guild.iconURL(),
|
|
102
|
-
memberCount: guild.memberCount,
|
|
103
|
-
};
|
|
104
|
-
},
|
|
105
|
-
});
|
|
106
|
-
this.defaultTools.getCurrentUser = (0, ai_1.tool)({
|
|
107
|
-
description: 'Get information about the current discord bot user',
|
|
108
|
-
parameters: zod_1.z.object({}),
|
|
109
|
-
execute: async () => {
|
|
110
|
-
const user = client.user;
|
|
111
|
-
if (!user) {
|
|
112
|
-
throw new Error('Bot user is not available.');
|
|
113
|
-
}
|
|
114
|
-
return user.toJSON();
|
|
115
|
-
},
|
|
116
|
-
});
|
|
117
|
-
this.defaultTools.getAvailableCommands = (0, ai_1.tool)({
|
|
118
|
-
description: 'Get all available commands',
|
|
119
|
-
parameters: zod_1.z.object({}),
|
|
120
|
-
execute: async () => {
|
|
121
|
-
return ctx.commandkit.commandHandler.getCommandsArray().map((cmd) => ({
|
|
122
|
-
name: cmd.data.command.name,
|
|
123
|
-
description: cmd.data.command.description,
|
|
124
|
-
category: cmd.command.category,
|
|
125
|
-
}));
|
|
126
|
-
},
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
38
|
async deactivate(ctx) {
|
|
130
39
|
this.toolsRecord = {};
|
|
131
40
|
if (this.onMessageFunc) {
|
|
132
41
|
ctx.commandkit.client.off(discord_js_1.Events.MessageCreate, this.onMessageFunc);
|
|
133
42
|
this.onMessageFunc = null;
|
|
134
43
|
}
|
|
44
|
+
(0, augmentation_1.augmentCommandKit)(false);
|
|
135
45
|
commandkit_1.Logger.info(`Plugin ${this.name} deactivated`);
|
|
136
46
|
}
|
|
137
|
-
async handleMessage(
|
|
47
|
+
async handleMessage(commandkit, message) {
|
|
138
48
|
if (message.author.bot || !Object.keys(this.toolsRecord).length)
|
|
139
49
|
return;
|
|
140
|
-
const
|
|
141
|
-
if (!message.content?.length
|
|
50
|
+
const { messageFilter, selectAiModel, prepareSystemPrompt, preparePrompt, onProcessingFinish, onProcessingStart, onResult, onError, disableBuiltInTools, } = (0, configure_1.getAIConfig)();
|
|
51
|
+
if (!message.content?.length)
|
|
142
52
|
return;
|
|
143
53
|
if (!message.channel.isTextBased() || !message.channel.isSendable())
|
|
144
54
|
return;
|
|
@@ -148,152 +58,62 @@ class AiPlugin extends plugin_1.RuntimePlugin {
|
|
|
148
58
|
const ctx = new context_1.AiContext({
|
|
149
59
|
message,
|
|
150
60
|
params: {},
|
|
151
|
-
commandkit:
|
|
61
|
+
commandkit: commandkit,
|
|
152
62
|
});
|
|
153
|
-
const systemPrompt = (await generateSystemPrompt?.(message)) ||
|
|
154
|
-
`You are a helpful AI discord bot. Your name is ${message.client.user.username} and your id is ${message.client.user.id}.
|
|
155
|
-
You are designed to assist users with their questions and tasks. You also have access to various tools that can help you perform tasks.
|
|
156
|
-
Tools are basically like commands that you can execute to perform specific actions based on user input.
|
|
157
|
-
Keep the response short and concise, and only use tools when necessary. Keep the response length under 2000 characters.
|
|
158
|
-
Do not include your own text in the response unless necessary. For text formatting, you can use discord's markdown syntax.
|
|
159
|
-
The current channel is ${'name' in message.channel
|
|
160
|
-
? message.channel.name
|
|
161
|
-
: message.channel.recipient?.displayName || 'DM'} whose id is ${message.channelId}. ${message.channel.isSendable()
|
|
162
|
-
? 'You can send messages in this channel.'
|
|
163
|
-
: 'You cannot send messages in this channel.'}
|
|
164
|
-
${message.inGuild() ? `\nYou are currently in a guild named ${message.guild.name} whose id is ${message.guildId}. While in guild, you can fetch member information if needed.` : '\nYou are currently in a direct message with the user.'}
|
|
165
|
-
If the user asks you to create a poll or embeds, create a text containing the poll or embed information as a markdown instead of json. If structured response is possible, use the structured response format instead.
|
|
166
|
-
If the user asks you to perform a task that requires a tool, use the tool to perform the task and return the result. Reject any requests that are not related to the tools you have access to.
|
|
167
|
-
`;
|
|
168
|
-
const userInfo = `<user>
|
|
169
|
-
<id>${message.author.id}</id>
|
|
170
|
-
<name>${message.author.username}</name>
|
|
171
|
-
<displayName>${message.author.displayName}</displayName>
|
|
172
|
-
<avatar>${message.author.avatarURL()}</avatar>
|
|
173
|
-
</user>`;
|
|
174
63
|
await (0, ai_context_worker_1.runInAiWorkerContext)(ctx, message, async () => {
|
|
175
|
-
const
|
|
176
|
-
const
|
|
64
|
+
const systemPrompt = await prepareSystemPrompt(ctx, message);
|
|
65
|
+
const prompt = await preparePrompt(ctx, message);
|
|
66
|
+
const { model, abortSignal, maxSteps, ...modelOptions } = await selectAiModel(ctx, message);
|
|
67
|
+
await onProcessingStart(ctx, message);
|
|
68
|
+
const tools = disableBuiltInTools
|
|
69
|
+
? this.toolsRecord
|
|
70
|
+
: {
|
|
71
|
+
...this.defaultTools,
|
|
72
|
+
...this.toolsRecord,
|
|
73
|
+
};
|
|
177
74
|
try {
|
|
178
|
-
const
|
|
179
|
-
const originalPrompt = `${userInfo}\nUser: ${message.content}\nAI:`;
|
|
180
|
-
let result;
|
|
181
|
-
const config = {
|
|
75
|
+
const result = await (0, ai_1.generateText)({
|
|
182
76
|
model,
|
|
183
|
-
abortSignal: AbortSignal.timeout(60000),
|
|
184
|
-
prompt
|
|
77
|
+
abortSignal: abortSignal ?? AbortSignal.timeout(60000),
|
|
78
|
+
prompt,
|
|
185
79
|
system: systemPrompt,
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
...
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
else {
|
|
195
|
-
result = await (0, ai_1.generateText)({
|
|
196
|
-
...config,
|
|
197
|
-
tools: { ...this.toolsRecord, ...this.defaultTools },
|
|
198
|
-
maxSteps: 5,
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
stopTyping();
|
|
202
|
-
let structuredResult = null;
|
|
203
|
-
structuredResult = !('text' in result)
|
|
204
|
-
? result.object
|
|
205
|
-
: null;
|
|
206
|
-
if (structuredResult) {
|
|
207
|
-
const { poll, content, embed } = structuredResult;
|
|
208
|
-
if (!poll && !content && !embed) {
|
|
209
|
-
commandkit_1.Logger.warn('AI response did not include any content, embed, or poll.');
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
await message.reply({
|
|
213
|
-
content: content?.substring(0, 2000),
|
|
214
|
-
embeds: embed
|
|
215
|
-
? [
|
|
216
|
-
{
|
|
217
|
-
title: embed.title,
|
|
218
|
-
description: embed.description,
|
|
219
|
-
url: embed.url,
|
|
220
|
-
color: embed.color,
|
|
221
|
-
image: embed.image ? { url: embed.image } : undefined,
|
|
222
|
-
thumbnail: embed.thumbnailImage
|
|
223
|
-
? { url: embed.thumbnailImage }
|
|
224
|
-
: undefined,
|
|
225
|
-
fields: embed.fields?.map((field) => ({
|
|
226
|
-
name: field.name,
|
|
227
|
-
value: field.value,
|
|
228
|
-
inline: field.inline,
|
|
229
|
-
})),
|
|
230
|
-
},
|
|
231
|
-
]
|
|
232
|
-
: [],
|
|
233
|
-
poll: poll
|
|
234
|
-
? {
|
|
235
|
-
allowMultiselect: poll.allow_multiselect,
|
|
236
|
-
answers: poll.answers.map((answer) => ({
|
|
237
|
-
text: answer.text,
|
|
238
|
-
emoji: answer.emoji,
|
|
239
|
-
})),
|
|
240
|
-
duration: poll.duration,
|
|
241
|
-
question: { text: poll.question.text },
|
|
242
|
-
}
|
|
243
|
-
: undefined,
|
|
244
|
-
});
|
|
245
|
-
}
|
|
246
|
-
else if ('text' in result && !!result.text) {
|
|
247
|
-
await message.reply({
|
|
248
|
-
content: result.text.substring(0, 2000),
|
|
249
|
-
allowedMentions: { parse: [] },
|
|
250
|
-
});
|
|
251
|
-
}
|
|
80
|
+
maxSteps: maxSteps ?? 5,
|
|
81
|
+
...modelOptions,
|
|
82
|
+
tools: {
|
|
83
|
+
...tools,
|
|
84
|
+
...modelOptions.tools,
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
await onResult(ctx, message, result);
|
|
252
88
|
}
|
|
253
89
|
catch (e) {
|
|
254
|
-
|
|
255
|
-
const channel = message.channel;
|
|
256
|
-
if (channel.isSendable()) {
|
|
257
|
-
await message
|
|
258
|
-
.reply({
|
|
259
|
-
content: 'An error occurred while processing your request.',
|
|
260
|
-
allowedMentions: { parse: [] },
|
|
261
|
-
})
|
|
262
|
-
.catch((e) => commandkit_1.Logger.error(`Failed to send error message: ${e}`));
|
|
263
|
-
}
|
|
90
|
+
await onError(ctx, message, e);
|
|
264
91
|
}
|
|
265
92
|
finally {
|
|
266
|
-
|
|
93
|
+
await onProcessingFinish(ctx, message);
|
|
267
94
|
}
|
|
268
95
|
});
|
|
269
96
|
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
};
|
|
279
|
-
const typingInterval = setInterval(runner, 3000).unref();
|
|
280
|
-
await runner();
|
|
281
|
-
return () => {
|
|
282
|
-
stopped = true;
|
|
283
|
-
clearInterval(typingInterval);
|
|
284
|
-
};
|
|
97
|
+
/**
|
|
98
|
+
* Executes the AI for a given message.
|
|
99
|
+
* @param message The message to process.
|
|
100
|
+
* @param commandkit The CommandKit instance to use. If not provided, it will be inferred automatically.
|
|
101
|
+
*/
|
|
102
|
+
async executeAI(message, commandkit) {
|
|
103
|
+
commandkit ?? (commandkit = (0, commandkit_1.getCommandKit)(true));
|
|
104
|
+
return this.handleMessage(commandkit, message);
|
|
285
105
|
}
|
|
286
|
-
async onBeforeCommandsLoad(
|
|
106
|
+
async onBeforeCommandsLoad() {
|
|
287
107
|
this.toolsRecord = {};
|
|
288
108
|
}
|
|
289
109
|
async onAfterCommandsLoad(ctx) {
|
|
290
|
-
const
|
|
110
|
+
const { commandkit } = ctx;
|
|
111
|
+
const commands = commandkit.commandHandler
|
|
291
112
|
.getCommandsArray()
|
|
292
113
|
.filter((command) => 'ai' in command.data &&
|
|
293
114
|
typeof command.data.ai === 'function' &&
|
|
294
115
|
'aiConfig' in command.data);
|
|
295
116
|
if (!commands.length) {
|
|
296
|
-
commandkit_1.Logger.warn('No commands with AI functionality found. Ensure commands are properly configured.');
|
|
297
117
|
return;
|
|
298
118
|
}
|
|
299
119
|
const tools = new discord_js_1.Collection();
|
|
@@ -305,12 +125,31 @@ class AiPlugin extends plugin_1.RuntimePlugin {
|
|
|
305
125
|
const description = cmd.data.aiConfig.description || cmd.data.command.description;
|
|
306
126
|
const cmdTool = (0, ai_1.tool)({
|
|
307
127
|
description,
|
|
308
|
-
type: 'function',
|
|
309
128
|
parameters: cmd.data.aiConfig.parameters,
|
|
310
129
|
async execute(params) {
|
|
130
|
+
const config = (0, configure_1.getAIConfig)();
|
|
311
131
|
const ctx = (0, ai_context_worker_1.getAiWorkerContext)();
|
|
312
132
|
ctx.ctx.setParams(params);
|
|
313
|
-
|
|
133
|
+
try {
|
|
134
|
+
const target = await commandkit.commandHandler.prepareCommandRun(ctx.message, cmd.data.command.name);
|
|
135
|
+
if (!target) {
|
|
136
|
+
return {
|
|
137
|
+
error: true,
|
|
138
|
+
message: 'This command is not available.',
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
const res = await commandkit.commandHandler.commandRunner.runCommand(target, ctx.message, {
|
|
142
|
+
handler: 'ai',
|
|
143
|
+
});
|
|
144
|
+
return res === undefined ? { success: true } : res;
|
|
145
|
+
}
|
|
146
|
+
catch (e) {
|
|
147
|
+
await config.onError?.(ctx.ctx, ctx.message, e);
|
|
148
|
+
return {
|
|
149
|
+
error: true,
|
|
150
|
+
message: 'This tool failed with unexpected error.',
|
|
151
|
+
};
|
|
152
|
+
}
|
|
314
153
|
},
|
|
315
154
|
});
|
|
316
155
|
cmd.tool = cmdTool;
|
|
@@ -322,4 +161,4 @@ class AiPlugin extends plugin_1.RuntimePlugin {
|
|
|
322
161
|
}
|
|
323
162
|
}
|
|
324
163
|
exports.AiPlugin = AiPlugin;
|
|
325
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUErREEsa0NBWUM7QUEzRUQsOENBQTJFO0FBRTNFLDJDQUFtRDtBQUNuRCx1Q0FBc0M7QUFDdEMsMkNBQXNFO0FBQ3RFLDJCQUE4RDtBQUM5RCw2QkFBd0I7QUFDeEIsMkRBQStFO0FBQy9FLHFDQUF3RDtBQXdCeEQsSUFBSSxhQUFhLEdBQXlCLElBQUksQ0FBQztBQUMvQyxJQUFJLGFBQWEsR0FBeUIsSUFBSSxDQUFDO0FBQy9DLElBQUksb0JBQXlFLENBQUM7QUF3QjlFOzs7O0dBSUc7QUFDSCxTQUFnQixXQUFXLENBQUMsTUFBbUI7SUFDN0MsSUFBSSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4QixvQkFBb0IsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO0lBQzdDLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBYSxRQUFTLFNBQVEsc0JBQThCO0lBTTFELFlBQW1CLE9BQXdCO1FBQ3pDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQU5ELFNBQUksR0FBRyxVQUFVLENBQUM7UUFDMUIsZ0JBQVcsR0FBeUIsRUFBRSxDQUFDO1FBQ3ZDLGlCQUFZLEdBQXlCLEVBQUUsQ0FBQztRQUN4QyxrQkFBYSxHQUFpRCxJQUFJLENBQUM7SUFJM0UsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBNEI7UUFDaEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFB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
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw4Q0FBMkU7QUFFM0UsMkNBQStEO0FBQy9ELHVDQUFzQztBQUN0QywyQ0FBeUQ7QUFDekQsMkJBQThDO0FBQzlDLDJEQUErRTtBQUMvRSwyRUFBc0U7QUFDdEUsaUVBQTJEO0FBQzNELDZFQUF1RTtBQUN2RSw2REFBdUQ7QUFDdkQsMkRBQXFEO0FBQ3JELDJDQUEwQztBQUMxQyxpREFBbUQ7QUFnQm5ELE1BQU0sWUFBWSxHQUF5QjtJQUN6QyxvQkFBb0IsRUFBcEIsNkNBQW9CO0lBQ3BCLGNBQWMsRUFBZCxrQ0FBYztJQUNkLG9CQUFvQixFQUFwQiw4Q0FBb0I7SUFDcEIsWUFBWSxFQUFaLDhCQUFZO0lBQ1osV0FBVyxFQUFYLDRCQUFXO0NBQ1osQ0FBQztBQUVGLE1BQWEsUUFBUyxTQUFRLHNCQUE4QjtJQU0xRCxZQUFtQixPQUF3QjtRQUN6QyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFORCxTQUFJLEdBQUcsVUFBVSxDQUFDO1FBQzFCLGdCQUFXLEdBQXlCLEVBQUUsQ0FBQztRQUN2QyxpQkFBWSxHQUFHLFlBQVksQ0FBQztRQUM1QixrQkFBYSxHQUFpRCxJQUFJLENBQUM7SUFJM0UsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBNEI7UUFDaEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5QyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsbUJBQU0sQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ25FLElBQUEsZ0NBQWlCLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEIsbUJBQU0sQ0FB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
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Message } from 'discord.js';
|
|
2
|
+
/**
|
|
3
|
+
* Creates the default system prompt for the AI bot based on the provided message context.
|
|
4
|
+
* This prompt includes the bot's role, current channel information, and response guidelines.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createSystemPrompt(message: Message): string;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createSystemPrompt = createSystemPrompt;
|
|
4
|
+
/**
|
|
5
|
+
* Creates the default system prompt for the AI bot based on the provided message context.
|
|
6
|
+
* This prompt includes the bot's role, current channel information, and response guidelines.
|
|
7
|
+
*/
|
|
8
|
+
function createSystemPrompt(message) {
|
|
9
|
+
const channelInfo = 'name' in message.channel
|
|
10
|
+
? message.channel.name
|
|
11
|
+
: message.channel.recipient?.displayName || 'DM';
|
|
12
|
+
const guildInfo = message.inGuild()
|
|
13
|
+
? `You are in the guild "${message.guild.name}" (ID: ${message.guildId}). You can fetch member information when needed.`
|
|
14
|
+
: 'You are in a direct message with the user.';
|
|
15
|
+
return `You are ${message.client.user.username} (ID: ${message.client.user.id}), a helpful AI Discord bot.
|
|
16
|
+
|
|
17
|
+
**Your Role:**
|
|
18
|
+
- Assist users with questions and tasks efficiently
|
|
19
|
+
- Use available tools to perform specific actions when requested
|
|
20
|
+
- Keep responses under 2000 characters and concise
|
|
21
|
+
|
|
22
|
+
**Current Context:**
|
|
23
|
+
- Channel: "${channelInfo}" (ID: ${message.channelId})
|
|
24
|
+
- Permissions: ${message.channel.isSendable() ? 'Can send messages' : 'Cannot send messages'}
|
|
25
|
+
- Location: ${guildInfo}
|
|
26
|
+
|
|
27
|
+
**Response Guidelines:**
|
|
28
|
+
- Use Discord markdown for formatting
|
|
29
|
+
- Only use tools when necessary for the task
|
|
30
|
+
- Reject requests unrelated to your available tools
|
|
31
|
+
|
|
32
|
+
Focus on being helpful while staying within your capabilities.`;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXByb21wdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zeXN0ZW0tcHJvbXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBTUEsZ0RBNEJDO0FBaENEOzs7R0FHRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLE9BQWdCO0lBQ2pELE1BQU0sV0FBVyxHQUNmLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTztRQUN2QixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJO1FBQ3RCLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxXQUFXLElBQUksSUFBSSxDQUFDO0lBRXJELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUU7UUFDakMsQ0FBQyxDQUFDLHlCQUF5QixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksVUFBVSxPQUFPLENBQUMsT0FBTyxrREFBa0Q7UUFDeEgsQ0FBQyxDQUFDLDRDQUE0QyxDQUFDO0lBRWpELE9BQU8sV0FBVyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTs7Ozs7Ozs7Y0FRakUsV0FBVyxVQUFVLE9BQU8sQ0FBQyxTQUFTO2lCQUNuQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsc0JBQXNCO2NBQzlFLFNBQVM7Ozs7Ozs7K0RBT3dDLENBQUM7QUFDaEUsQ0FBQyJ9
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Schema, tool } from 'ai';
|
|
2
|
+
import { AiContext } from '../../context';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
/**
|
|
5
|
+
* Utility type that represents a value that can be either synchronous or asynchronous.
|
|
6
|
+
* @template T - The type of the value
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
type Awaitable<T> = T | Promise<T>;
|
|
10
|
+
/**
|
|
11
|
+
* Type representing the parameters schema for AI tools.
|
|
12
|
+
* Extracted from the first parameter of the `tool` function from the 'ai' library.
|
|
13
|
+
*/
|
|
14
|
+
export type ToolParameterType = Parameters<typeof tool>[0]['parameters'];
|
|
15
|
+
/**
|
|
16
|
+
* Utility type that infers the TypeScript type from a tool parameter schema.
|
|
17
|
+
* Supports both Zod schemas and AI library schemas.
|
|
18
|
+
* @template T - The tool parameter type to infer from
|
|
19
|
+
*/
|
|
20
|
+
export type InferParameters<T extends ToolParameterType> = T extends Schema<any> ? T['_type'] : T extends z.ZodTypeAny ? z.infer<T> : never;
|
|
21
|
+
/**
|
|
22
|
+
* Configuration options for creating an AI tool.
|
|
23
|
+
* @template T - The parameter schema type for the tool
|
|
24
|
+
* @template R - The return type of the tool's execute function
|
|
25
|
+
*/
|
|
26
|
+
export interface CreateToolOptions<T extends ToolParameterType, R = unknown> {
|
|
27
|
+
/** The unique name identifier for the tool */
|
|
28
|
+
name: string;
|
|
29
|
+
/** A human-readable description of what the tool does */
|
|
30
|
+
description: string;
|
|
31
|
+
/** The parameter schema that defines the tool's input structure */
|
|
32
|
+
parameters: T;
|
|
33
|
+
/** The function that executes when the tool is called */
|
|
34
|
+
execute: ToolExecuteFunction<T, R>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Type definition for a tool's execute function.
|
|
38
|
+
* @template T - The parameter schema type
|
|
39
|
+
* @template R - The return type of the function
|
|
40
|
+
* @param ctx - The AI context containing request and response information
|
|
41
|
+
* @param parameters - The validated parameters passed to the tool
|
|
42
|
+
* @returns The result of the tool execution, which can be synchronous or asynchronous
|
|
43
|
+
*/
|
|
44
|
+
export type ToolExecuteFunction<T extends ToolParameterType, R> = (ctx: AiContext, parameters: InferParameters<T>) => Awaitable<R>;
|
|
45
|
+
/**
|
|
46
|
+
* Creates a new AI tool with the specified configuration.
|
|
47
|
+
* This function wraps the underlying AI library's tool creation with additional
|
|
48
|
+
* context management and parameter validation.
|
|
49
|
+
*
|
|
50
|
+
* @template T - The parameter schema type for the tool
|
|
51
|
+
* @template R - The return type of the tool's execute function
|
|
52
|
+
* @param options - The configuration options for the tool
|
|
53
|
+
* @returns A configured AI tool ready for use
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* const myTool = createTool({
|
|
58
|
+
* name: 'calculate',
|
|
59
|
+
* description: 'Performs basic arithmetic calculations',
|
|
60
|
+
* parameters: z.object({
|
|
61
|
+
* operation: z.enum(['add', 'subtract']),
|
|
62
|
+
* a: z.number(),
|
|
63
|
+
* b: z.number(),
|
|
64
|
+
* }),
|
|
65
|
+
* execute: async (ctx, params) => {
|
|
66
|
+
* return params.operation === 'add'
|
|
67
|
+
* ? params.a + params.b
|
|
68
|
+
* : params.a - params.b;
|
|
69
|
+
* },
|
|
70
|
+
* });
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export declare function createTool<T extends ToolParameterType, R = unknown>(options: CreateToolOptions<T, R>): import("ai").Tool<T, R> & {
|
|
74
|
+
execute: (args: T extends Schema<any> ? T["_type"] : T extends z.ZodTypeAny ? z.TypeOf<T> : never, options: import("ai").ToolExecutionOptions) => PromiseLike<R>;
|
|
75
|
+
};
|
|
76
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createTool = createTool;
|
|
4
|
+
const ai_1 = require("ai");
|
|
5
|
+
const ai_context_worker_1 = require("../../ai-context-worker");
|
|
6
|
+
/**
|
|
7
|
+
* Creates a new AI tool with the specified configuration.
|
|
8
|
+
* This function wraps the underlying AI library's tool creation with additional
|
|
9
|
+
* context management and parameter validation.
|
|
10
|
+
*
|
|
11
|
+
* @template T - The parameter schema type for the tool
|
|
12
|
+
* @template R - The return type of the tool's execute function
|
|
13
|
+
* @param options - The configuration options for the tool
|
|
14
|
+
* @returns A configured AI tool ready for use
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const myTool = createTool({
|
|
19
|
+
* name: 'calculate',
|
|
20
|
+
* description: 'Performs basic arithmetic calculations',
|
|
21
|
+
* parameters: z.object({
|
|
22
|
+
* operation: z.enum(['add', 'subtract']),
|
|
23
|
+
* a: z.number(),
|
|
24
|
+
* b: z.number(),
|
|
25
|
+
* }),
|
|
26
|
+
* execute: async (ctx, params) => {
|
|
27
|
+
* return params.operation === 'add'
|
|
28
|
+
* ? params.a + params.b
|
|
29
|
+
* : params.a - params.b;
|
|
30
|
+
* },
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
function createTool(options) {
|
|
35
|
+
// @ts-ignore - Suppressing type checking due to complex generic inference
|
|
36
|
+
const _tool = (0, ai_1.tool)({
|
|
37
|
+
name: options.name,
|
|
38
|
+
description: options.description,
|
|
39
|
+
parameters: options.parameters,
|
|
40
|
+
async execute(params) {
|
|
41
|
+
const { ctx } = (0, ai_context_worker_1.getAiWorkerContext)();
|
|
42
|
+
ctx.setParams(params);
|
|
43
|
+
return options.execute(ctx, params);
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
return _tool;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbHMvY29tbW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBdUZBLGdDQWtCQztBQXpHRCwyQkFBa0M7QUFFbEMsK0RBQTZEO0FBeUQ3RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsU0FBZ0IsVUFBVSxDQUN4QixPQUFnQztJQUVoQywwRUFBMEU7SUFDMUUsTUFBTSxLQUFLLEdBQUcsSUFBQSxTQUFJLEVBQU87UUFDdkIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQ2xCLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztRQUNoQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7UUFDOUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNO1lBQ2xCLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFBLHNDQUFrQixHQUFFLENBQUM7WUFFckMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUV0QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE1BQTRCLENBQUMsQ0FBQztRQUM1RCxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIn0=
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const getAvailableCommands: import("ai").Tool<z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>, {
|
|
3
|
+
name: any;
|
|
4
|
+
description: any;
|
|
5
|
+
category: string | null;
|
|
6
|
+
supportsAI: boolean;
|
|
7
|
+
}[]> & {
|
|
8
|
+
execute: (args: {}, options: import("ai").ToolExecutionOptions) => PromiseLike<{
|
|
9
|
+
name: any;
|
|
10
|
+
description: any;
|
|
11
|
+
category: string | null;
|
|
12
|
+
supportsAI: boolean;
|
|
13
|
+
}[]>;
|
|
14
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getAvailableCommands = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const common_1 = require("./common");
|
|
6
|
+
exports.getAvailableCommands = (0, common_1.createTool)({
|
|
7
|
+
description: 'Get a list of all available commands.',
|
|
8
|
+
name: 'getAvailableCommands',
|
|
9
|
+
parameters: zod_1.z.object({}),
|
|
10
|
+
execute(ctx, params) {
|
|
11
|
+
const { commandkit } = ctx;
|
|
12
|
+
const commands = commandkit.commandHandler
|
|
13
|
+
.getCommandsArray()
|
|
14
|
+
.map((cmd) => ({
|
|
15
|
+
name: cmd.data.command.name,
|
|
16
|
+
description: cmd.data.command.description,
|
|
17
|
+
category: cmd.command.category,
|
|
18
|
+
supportsAI: 'ai' in cmd.data && typeof cmd.data.ai === 'function',
|
|
19
|
+
}));
|
|
20
|
+
return commands;
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWF2YWlsYWJsZS1jb21tYW5kcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29scy9nZXQtYXZhaWxhYmxlLWNvbW1hbmRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUF3QjtBQUN4QixxQ0FBc0M7QUFFekIsUUFBQSxvQkFBb0IsR0FBRyxJQUFBLG1CQUFVLEVBQUM7SUFDN0MsV0FBVyxFQUFFLHVDQUF1QztJQUNwRCxJQUFJLEVBQUUsc0JBQXNCO0lBQzVCLFVBQVUsRUFBRSxPQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUN4QixPQUFPLENBQUMsR0FBRyxFQUFFLE1BQU07UUFDakIsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLEdBQUcsQ0FBQztRQUUzQixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsY0FBYzthQUN2QyxnQkFBZ0IsRUFBRTthQUNsQixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDYixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSTtZQUMzQixXQUFXLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVztZQUN6QyxRQUFRLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRO1lBQzlCLFVBQVUsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFVBQVU7U0FDbEUsQ0FBQyxDQUFDLENBQUM7UUFFTixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0NBQ0YsQ0FBQyxDQUFDIn0=
|