@commandkit/ai 0.1.0-dev.20250609135507
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 +5 -0
- package/README.md +19 -0
- package/dist/ai-context-worker.d.ts +7 -0
- package/dist/ai-context-worker.js +17 -0
- package/dist/context.d.ts +15 -0
- package/dist/context.js +16 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +25 -0
- package/dist/plugin.d.ts +27 -0
- package/dist/plugin.js +254 -0
- package/dist/types.d.ts +12 -0
- package/dist/types.js +3 -0
- package/package.json +38 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
Copyright 2025 Avraj Sahota
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so.
|
|
4
|
+
|
|
5
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# `@commandkit/ai`
|
|
2
|
+
|
|
3
|
+
Supercharge your CommandKit project with AI capabilities.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @commandkit/ai
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { ai } from '@commandkit/ai';
|
|
15
|
+
|
|
16
|
+
export default defineConfig({
|
|
17
|
+
plugins: [ai()],
|
|
18
|
+
})
|
|
19
|
+
```
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Message } from 'discord.js';
|
|
2
|
+
import { AiContext } from './context';
|
|
3
|
+
export declare function getAiWorkerContext(): {
|
|
4
|
+
message: Message;
|
|
5
|
+
ctx: AiContext;
|
|
6
|
+
};
|
|
7
|
+
export declare function runInAiWorkerContext<R, F extends (...args: any[]) => R>(ctx: AiContext, message: Message, callback: F): R;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getAiWorkerContext = getAiWorkerContext;
|
|
4
|
+
exports.runInAiWorkerContext = runInAiWorkerContext;
|
|
5
|
+
const node_async_hooks_1 = require("node:async_hooks");
|
|
6
|
+
const worker = new node_async_hooks_1.AsyncLocalStorage();
|
|
7
|
+
function getAiWorkerContext() {
|
|
8
|
+
const ctx = worker.getStore();
|
|
9
|
+
if (!ctx) {
|
|
10
|
+
throw new Error('AI context is not available. Ensure you are using AI in a CommandKit environment.');
|
|
11
|
+
}
|
|
12
|
+
return ctx;
|
|
13
|
+
}
|
|
14
|
+
function runInAiWorkerContext(ctx, message, callback) {
|
|
15
|
+
return worker.run({ message, ctx }, callback);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktY29udGV4dC13b3JrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYWktY29udGV4dC13b3JrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFNQSxnREFVQztBQUVELG9EQU1DO0FBdkJELHVEQUFxRDtBQUdyRCxNQUFNLE1BQU0sR0FBRyxJQUFJLG9DQUFpQixFQUF3QyxDQUFDO0FBRTdFLFNBQWdCLGtCQUFrQjtJQUNoQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7SUFFOUIsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsTUFBTSxJQUFJLEtBQUssQ0FDYixtRkFBbUYsQ0FDcEYsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFnQixvQkFBb0IsQ0FDbEMsR0FBYyxFQUNkLE9BQWdCLEVBQ2hCLFFBQVc7SUFFWCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDaEQsQ0FBQyJ9
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CommandKit } from 'commandkit';
|
|
2
|
+
import { Client, Message } from 'discord.js';
|
|
3
|
+
export interface AiContextOptions<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
4
|
+
message: Message;
|
|
5
|
+
params: T;
|
|
6
|
+
commandkit: CommandKit;
|
|
7
|
+
}
|
|
8
|
+
export declare class AiContext<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
9
|
+
params: T;
|
|
10
|
+
message: Message;
|
|
11
|
+
client: Client;
|
|
12
|
+
commandkit: CommandKit;
|
|
13
|
+
constructor(options: AiContextOptions<T>);
|
|
14
|
+
setParams(params: T): void;
|
|
15
|
+
}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AiContext = void 0;
|
|
4
|
+
class AiContext {
|
|
5
|
+
constructor(options) {
|
|
6
|
+
this.params = options.params;
|
|
7
|
+
this.message = options.message;
|
|
8
|
+
this.commandkit = options.commandkit;
|
|
9
|
+
this.client = options.commandkit.client;
|
|
10
|
+
}
|
|
11
|
+
setParams(params) {
|
|
12
|
+
this.params = params;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.AiContext = AiContext;
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVdBLE1BQWEsU0FBUztJQVFwQixZQUFtQixPQUE0QjtRQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO0lBQzFDLENBQUM7SUFFTSxTQUFTLENBQUMsTUFBUztRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0NBQ0Y7QUFsQkQsOEJBa0JDIn0=
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.ai = ai;
|
|
18
|
+
const plugin_1 = require("./plugin");
|
|
19
|
+
function ai(options) {
|
|
20
|
+
return new plugin_1.AiPlugin(options ?? {});
|
|
21
|
+
}
|
|
22
|
+
__exportStar(require("./types"), exports);
|
|
23
|
+
__exportStar(require("./plugin"), exports);
|
|
24
|
+
__exportStar(require("./context"), exports);
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLGdCQUVDO0FBTEQscUNBQW9DO0FBR3BDLFNBQWdCLEVBQUUsQ0FBQyxPQUF5QjtJQUMxQyxPQUFPLElBQUksaUJBQVEsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELDBDQUF3QjtBQUN4QiwyQ0FBeUI7QUFDekIsNENBQTBCIn0=
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { CommandKitPluginRuntime, RuntimePlugin } from 'commandkit/plugin';
|
|
2
|
+
import { AiPluginOptions, MessageFilter, SelectAiModel } from './types';
|
|
3
|
+
import { Message } from 'discord.js';
|
|
4
|
+
export interface AiConfig {
|
|
5
|
+
description?: string;
|
|
6
|
+
parameters: any;
|
|
7
|
+
}
|
|
8
|
+
export interface ConfigureAI {
|
|
9
|
+
messageFilter?: MessageFilter;
|
|
10
|
+
selectAiModel?: SelectAiModel;
|
|
11
|
+
systemPrompt?: (message: Message) => Promise<string>;
|
|
12
|
+
}
|
|
13
|
+
export declare function configureAI(config: ConfigureAI): void;
|
|
14
|
+
export declare class AiPlugin extends RuntimePlugin<AiPluginOptions> {
|
|
15
|
+
readonly name = "AiPlugin";
|
|
16
|
+
private toolsRecord;
|
|
17
|
+
private defaultTools;
|
|
18
|
+
private onMessageFunc;
|
|
19
|
+
constructor(options: AiPluginOptions);
|
|
20
|
+
activate(ctx: CommandKitPluginRuntime): Promise<void>;
|
|
21
|
+
private createDefaultTools;
|
|
22
|
+
deactivate(ctx: CommandKitPluginRuntime): Promise<void>;
|
|
23
|
+
private handleMessage;
|
|
24
|
+
private startTyping;
|
|
25
|
+
onBeforeCommandsLoad(ctx: CommandKitPluginRuntime): Promise<void>;
|
|
26
|
+
onAfterCommandsLoad(ctx: CommandKitPluginRuntime): Promise<void>;
|
|
27
|
+
}
|
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AiPlugin = void 0;
|
|
4
|
+
exports.configureAI = configureAI;
|
|
5
|
+
const plugin_1 = require("commandkit/plugin");
|
|
6
|
+
const commandkit_1 = require("commandkit");
|
|
7
|
+
const context_1 = require("./context");
|
|
8
|
+
const discord_js_1 = require("discord.js");
|
|
9
|
+
const ai_1 = require("ai");
|
|
10
|
+
const zod_1 = require("zod");
|
|
11
|
+
const ai_context_worker_1 = require("./ai-context-worker");
|
|
12
|
+
let messageFilter = null;
|
|
13
|
+
let selectAiModel = null;
|
|
14
|
+
let generateSystemPrompt;
|
|
15
|
+
function configureAI(config) {
|
|
16
|
+
if (config.messageFilter) {
|
|
17
|
+
messageFilter = config.messageFilter;
|
|
18
|
+
}
|
|
19
|
+
if (config.selectAiModel) {
|
|
20
|
+
selectAiModel = config.selectAiModel;
|
|
21
|
+
}
|
|
22
|
+
if (config.systemPrompt) {
|
|
23
|
+
generateSystemPrompt = config.systemPrompt;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
class AiPlugin extends plugin_1.RuntimePlugin {
|
|
27
|
+
constructor(options) {
|
|
28
|
+
super(options);
|
|
29
|
+
this.name = 'AiPlugin';
|
|
30
|
+
this.toolsRecord = {};
|
|
31
|
+
this.defaultTools = {};
|
|
32
|
+
this.onMessageFunc = null;
|
|
33
|
+
}
|
|
34
|
+
async activate(ctx) {
|
|
35
|
+
this.onMessageFunc = (message) => this.handleMessage(ctx, message);
|
|
36
|
+
ctx.commandkit.client.on(discord_js_1.Events.MessageCreate, this.onMessageFunc);
|
|
37
|
+
this.createDefaultTools(ctx);
|
|
38
|
+
commandkit_1.Logger.info(`Plugin ${this.name} activated`);
|
|
39
|
+
}
|
|
40
|
+
createDefaultTools(ctx) {
|
|
41
|
+
const { commandkit } = ctx;
|
|
42
|
+
const client = commandkit.client;
|
|
43
|
+
this.defaultTools.getUserById = (0, ai_1.tool)({
|
|
44
|
+
description: 'Get user information by ID',
|
|
45
|
+
parameters: zod_1.z.object({
|
|
46
|
+
userId: zod_1.z
|
|
47
|
+
.string()
|
|
48
|
+
.describe('The ID of the user to retrieve. This is a Discord snowflake string.'),
|
|
49
|
+
}),
|
|
50
|
+
execute: async (params) => {
|
|
51
|
+
const user = await client.users.fetch(params.userId, {
|
|
52
|
+
force: false,
|
|
53
|
+
cache: true,
|
|
54
|
+
});
|
|
55
|
+
return user.toJSON();
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
this.defaultTools.getChannelById = (0, ai_1.tool)({
|
|
59
|
+
description: 'Get channel information by ID',
|
|
60
|
+
parameters: zod_1.z.object({
|
|
61
|
+
channelId: zod_1.z
|
|
62
|
+
.string()
|
|
63
|
+
.describe('The ID of the channel to retrieve. This is a Discord snowflake string.'),
|
|
64
|
+
}),
|
|
65
|
+
execute: async (params) => {
|
|
66
|
+
const channel = await client.channels.fetch(params.channelId, {
|
|
67
|
+
force: false,
|
|
68
|
+
cache: true,
|
|
69
|
+
});
|
|
70
|
+
if (!channel) {
|
|
71
|
+
throw new Error(`Channel with ID ${params.channelId} not found.`);
|
|
72
|
+
}
|
|
73
|
+
return channel.toJSON();
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
this.defaultTools.getGuildById = (0, ai_1.tool)({
|
|
77
|
+
description: 'Get guild information by ID',
|
|
78
|
+
parameters: zod_1.z.object({
|
|
79
|
+
guildId: zod_1.z
|
|
80
|
+
.string()
|
|
81
|
+
.describe('The ID of the guild to retrieve. This is a Discord snowflake string.'),
|
|
82
|
+
}),
|
|
83
|
+
execute: async (params) => {
|
|
84
|
+
const guild = await client.guilds.fetch({
|
|
85
|
+
guild: params.guildId,
|
|
86
|
+
force: false,
|
|
87
|
+
cache: true,
|
|
88
|
+
});
|
|
89
|
+
if (!guild) {
|
|
90
|
+
throw new Error(`Guild with ID ${params.guildId} not found.`);
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
id: guild.id,
|
|
94
|
+
name: guild.name,
|
|
95
|
+
icon: guild.iconURL(),
|
|
96
|
+
memberCount: guild.memberCount,
|
|
97
|
+
};
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
this.defaultTools.getCurrentUser = (0, ai_1.tool)({
|
|
101
|
+
description: 'Get information about the current discord bot user',
|
|
102
|
+
parameters: zod_1.z.object({}),
|
|
103
|
+
execute: async () => {
|
|
104
|
+
const user = client.user;
|
|
105
|
+
if (!user) {
|
|
106
|
+
throw new Error('Bot user is not available.');
|
|
107
|
+
}
|
|
108
|
+
return user.toJSON();
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
this.defaultTools.getAvailableCommands = (0, ai_1.tool)({
|
|
112
|
+
description: 'Get all available commands',
|
|
113
|
+
parameters: zod_1.z.object({}),
|
|
114
|
+
execute: async () => {
|
|
115
|
+
return ctx.commandkit.commandHandler.getCommandsArray().map((cmd) => ({
|
|
116
|
+
name: cmd.data.command.name,
|
|
117
|
+
description: cmd.data.command.description,
|
|
118
|
+
category: cmd.command.category,
|
|
119
|
+
}));
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
async deactivate(ctx) {
|
|
124
|
+
this.toolsRecord = {};
|
|
125
|
+
if (this.onMessageFunc) {
|
|
126
|
+
ctx.commandkit.client.off(discord_js_1.Events.MessageCreate, this.onMessageFunc);
|
|
127
|
+
this.onMessageFunc = null;
|
|
128
|
+
}
|
|
129
|
+
commandkit_1.Logger.info(`Plugin ${this.name} deactivated`);
|
|
130
|
+
}
|
|
131
|
+
async handleMessage(pluginContext, message) {
|
|
132
|
+
if (message.author.bot || !Object.keys(this.toolsRecord).length)
|
|
133
|
+
return;
|
|
134
|
+
const aiModelSelector = selectAiModel;
|
|
135
|
+
if (!message.content?.length || !aiModelSelector)
|
|
136
|
+
return;
|
|
137
|
+
if (!message.channel.isTextBased() || !message.channel.isSendable())
|
|
138
|
+
return;
|
|
139
|
+
const shouldContinue = messageFilter ? await messageFilter(message) : true;
|
|
140
|
+
if (!shouldContinue)
|
|
141
|
+
return;
|
|
142
|
+
const ctx = new context_1.AiContext({
|
|
143
|
+
message,
|
|
144
|
+
params: {},
|
|
145
|
+
commandkit: pluginContext.commandkit,
|
|
146
|
+
});
|
|
147
|
+
const systemPrompt = (await generateSystemPrompt?.(message)) ||
|
|
148
|
+
`You are a helpful AI discord bot. Your name is ${message.client.user.username} and your id is ${message.client.user.id}.
|
|
149
|
+
You are designed to assist users with their questions and tasks. You also have access to various tools that can help you perform tasks.
|
|
150
|
+
Tools are basically like commands that you can execute to perform specific actions based on user input.
|
|
151
|
+
Keep the response short and concise, and only use tools when necessary. Keep the response length under 2000 characters.
|
|
152
|
+
Do not include your own text in the response unless necessary. For text formatting, you can use discord's markdown syntax.
|
|
153
|
+
${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.'}`;
|
|
154
|
+
const userInfo = `<user>
|
|
155
|
+
<id>${message.author.id}</id>
|
|
156
|
+
<name>${message.author.username}</name>
|
|
157
|
+
<displayName>${message.author.displayName}</displayName>
|
|
158
|
+
<avatar>${message.author.avatarURL()}</avatar>
|
|
159
|
+
</user>`;
|
|
160
|
+
await (0, ai_context_worker_1.runInAiWorkerContext)(ctx, message, async () => {
|
|
161
|
+
const channel = message.channel;
|
|
162
|
+
const stopTyping = await this.startTyping(channel);
|
|
163
|
+
try {
|
|
164
|
+
const { model, options } = await aiModelSelector(message);
|
|
165
|
+
const result = await (0, ai_1.generateText)({
|
|
166
|
+
abortSignal: AbortSignal.timeout(60000),
|
|
167
|
+
model,
|
|
168
|
+
tools: { ...this.toolsRecord, ...this.defaultTools },
|
|
169
|
+
prompt: `${userInfo}\nUser: ${message.content}\nAI:`,
|
|
170
|
+
system: systemPrompt,
|
|
171
|
+
maxSteps: 5,
|
|
172
|
+
providerOptions: options,
|
|
173
|
+
});
|
|
174
|
+
stopTyping();
|
|
175
|
+
if (!!result.text) {
|
|
176
|
+
await message.reply({
|
|
177
|
+
content: result.text,
|
|
178
|
+
allowedMentions: { parse: [] },
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
catch (e) {
|
|
183
|
+
commandkit_1.Logger.error(`Error processing AI message: ${e}`);
|
|
184
|
+
const channel = message.channel;
|
|
185
|
+
if (channel.isSendable()) {
|
|
186
|
+
await message
|
|
187
|
+
.reply({
|
|
188
|
+
content: 'An error occurred while processing your request.',
|
|
189
|
+
allowedMentions: { parse: [] },
|
|
190
|
+
})
|
|
191
|
+
.catch((e) => commandkit_1.Logger.error(`Failed to send error message: ${e}`));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
finally {
|
|
195
|
+
stopTyping();
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
async startTyping(channel) {
|
|
200
|
+
let stopped = false;
|
|
201
|
+
const runner = async () => {
|
|
202
|
+
if (stopped)
|
|
203
|
+
return clearInterval(typingInterval);
|
|
204
|
+
if (channel.isSendable()) {
|
|
205
|
+
await channel.sendTyping().catch(Object);
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
const typingInterval = setInterval(runner, 3000).unref();
|
|
209
|
+
await runner();
|
|
210
|
+
return () => {
|
|
211
|
+
stopped = true;
|
|
212
|
+
clearInterval(typingInterval);
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
async onBeforeCommandsLoad(ctx) {
|
|
216
|
+
this.toolsRecord = {};
|
|
217
|
+
}
|
|
218
|
+
async onAfterCommandsLoad(ctx) {
|
|
219
|
+
const commands = ctx.commandkit.commandHandler
|
|
220
|
+
.getCommandsArray()
|
|
221
|
+
.filter((command) => 'ai' in command.data &&
|
|
222
|
+
typeof command.data.ai === 'function' &&
|
|
223
|
+
'aiConfig' in command.data);
|
|
224
|
+
if (!commands.length) {
|
|
225
|
+
commandkit_1.Logger.warn('No commands with AI functionality found. Ensure commands are properly configured.');
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
const tools = new discord_js_1.Collection();
|
|
229
|
+
for (const command of commands) {
|
|
230
|
+
const cmd = command;
|
|
231
|
+
if (!cmd.data.ai || !cmd.data.aiConfig) {
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
const description = cmd.data.aiConfig.description || cmd.data.command.description;
|
|
235
|
+
const cmdTool = (0, ai_1.tool)({
|
|
236
|
+
description,
|
|
237
|
+
type: 'function',
|
|
238
|
+
parameters: cmd.data.aiConfig.parameters,
|
|
239
|
+
async execute(params) {
|
|
240
|
+
const ctx = (0, ai_context_worker_1.getAiWorkerContext)();
|
|
241
|
+
ctx.ctx.setParams(params);
|
|
242
|
+
return cmd.data.ai(ctx.ctx);
|
|
243
|
+
},
|
|
244
|
+
});
|
|
245
|
+
cmd.tool = cmdTool;
|
|
246
|
+
tools.set(cmd.command.name, cmd);
|
|
247
|
+
}
|
|
248
|
+
this.toolsRecord = Object.fromEntries(tools.map((toolCmd) => {
|
|
249
|
+
return [toolCmd.command.name, toolCmd.tool];
|
|
250
|
+
}));
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
exports.AiPlugin = AiPlugin;
|
|
254
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFnQ0Esa0NBWUM7QUE1Q0QsOENBQTJFO0FBRTNFLDJDQUFtRDtBQUNuRCx1Q0FBc0M7QUFDdEMsMkNBQXNFO0FBQ3RFLDJCQUE4QztBQUM5Qyw2QkFBd0I7QUFDeEIsMkRBQStFO0FBZS9FLElBQUksYUFBYSxHQUF5QixJQUFJLENBQUM7QUFDL0MsSUFBSSxhQUFhLEdBQXlCLElBQUksQ0FBQztBQUMvQyxJQUFJLG9CQUF5RSxDQUFDO0FBUTlFLFNBQWdCLFdBQVcsQ0FBQyxNQUFtQjtJQUM3QyxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3hCLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7SUFDN0MsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFhLFFBQVMsU0FBUSxzQkFBOEI7SUFNMUQsWUFBbUIsT0FBd0I7UUFDekMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBTkQsU0FBSSxHQUFHLFVBQVUsQ0FBQztRQUMxQixnQkFBVyxHQUF5QixFQUFFLENBQUM7UUFDdkMsaUJBQVksR0FBeUIsRUFBRSxDQUFDO1FBQ3hDLGtCQUFhLEdBQWlELElBQUksQ0FBQztJQUkzRSxDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUE0QjtRQUNoRCxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMs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
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { LanguageModelV1, ProviderMetadata } from 'ai';
|
|
2
|
+
import { Message } from 'discord.js';
|
|
3
|
+
import { AiContext } from './context';
|
|
4
|
+
export type CommandFilterFunction = (commandName: string) => boolean;
|
|
5
|
+
export type MessageFilter = (message: Message) => Promise<boolean>;
|
|
6
|
+
export type SelectAiModel = (message: Message) => Promise<{
|
|
7
|
+
model: LanguageModelV1;
|
|
8
|
+
options?: ProviderMetadata;
|
|
9
|
+
}>;
|
|
10
|
+
export interface AiPluginOptions {
|
|
11
|
+
}
|
|
12
|
+
export type AiCommand<T extends Record<string, unknown>> = (ctx: AiContext<T>) => Promise<unknown> | unknown;
|
package/dist/types.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@commandkit/ai",
|
|
3
|
+
"version": "0.1.0-dev.20250609135507",
|
|
4
|
+
"description": "Supercharge your CommandKit bot with AI capabilities",
|
|
5
|
+
"files": [
|
|
6
|
+
"dist"
|
|
7
|
+
],
|
|
8
|
+
"main": "dist/index.js",
|
|
9
|
+
"types": "dist/index.d.ts",
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git+https://github.com/underctrl-io/commandkit.git"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"commandkit",
|
|
16
|
+
"ai"
|
|
17
|
+
],
|
|
18
|
+
"author": "twilight <hello@twlite.dev>",
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"bugs": {
|
|
21
|
+
"url": "https://github.com/underctrl-io/commandkit/issues"
|
|
22
|
+
},
|
|
23
|
+
"homepage": "https://github.com/underctrl-io/commandkit#readme",
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"discord.js": "^14.19.3",
|
|
26
|
+
"typescript": "^5.7.3",
|
|
27
|
+
"commandkit": "1.0.0-dev.20250609135507",
|
|
28
|
+
"tsconfig": "0.0.0-dev.20250609135507"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"ai": "^4.3.16",
|
|
32
|
+
"zod": "^3.25.48"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"lint": "tsc --noEmit",
|
|
36
|
+
"build": "tsc"
|
|
37
|
+
}
|
|
38
|
+
}
|