Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions apps/test-bot/src/ai.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,4 @@ configureAI({
model,
};
},
messageFilter: async (message) => {
return (
message.inGuild() && message.mentions.users.has(message.client.user.id)
);
},
});
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ message: 'Hey bot, can you play some music?';
### 2. Message Filtering

```ts
messageFilter: async (message) => {
messageFilter: async (commandkit, message) => {
return message.mentions.users.has(message.client.user.id);
};
```
Expand Down Expand Up @@ -176,7 +176,7 @@ await message.reply('🎵 Now playing music!');
```ts
configureAI({
selectAiModel: async () => ({ model: myModel }),
messageFilter: async (message) =>
messageFilter: async (commandkit, message) =>
message.mentions.users.has(message.client.user.id),
});
```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ configureAI({
},

// Optional: Filter which messages trigger AI processing
messageFilter: async (message) => {
messageFilter: async (commandkit, message) => {
// Only respond when the bot is mentioned
return (
message.inGuild() && message.mentions.users.has(message.client.user.id)
Expand Down Expand Up @@ -89,7 +89,7 @@ selectAiModel: async (ctx, message) => {
Control which messages trigger AI processing:

```ts
messageFilter: async (message) => {
messageFilter: async (commandkit, message) => {
// Only respond to mentions
return message.mentions.users.has(message.client.user.id);

Expand Down Expand Up @@ -236,7 +236,7 @@ configureAI({
};
},

messageFilter: async (message) => {
messageFilter: async (commandkit, message) => {
return message.mentions.users.has(message.client.user.id);
},
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ configureAI({
}),

// Optional: Filter which messages trigger AI processing
messageFilter: async (message) => {
messageFilter: async (commandkit, message) => {
return message.mentions.users.has(message.client.user.id);
},

Expand Down Expand Up @@ -130,7 +130,7 @@ selectAiModel: async (ctx, message) => ({
### Basic Filtering

```ts
messageFilter: async (message) => {
messageFilter: async (commandkit, message) => {
// Only respond to mentions
return message.mentions.users.has(message.client.user.id);
};
Expand All @@ -139,7 +139,7 @@ messageFilter: async (message) => {
### Advanced Filtering

```ts
messageFilter: async (message) => {
messageFilter: async (commandkit, message) => {
// Don't process bot messages
if (message.author.bot) return false;

Expand All @@ -165,7 +165,7 @@ messageFilter: async (message) => {
### Role-based Filtering

```ts
messageFilter: async (message) => {
messageFilter: async (commandkit, message) => {
if (!message.inGuild()) return false;

const member = message.member;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ This guide covers common issues you might encounter when working with CommandKit

```ts
// Check your message filter
messageFilter: async (message) => {
messageFilter: async (commandkit, message) => {
console.log('Filtering message:', message.content);
const shouldProcess = message.mentions.users.has(message.client.user.id);
console.log('Should process:', shouldProcess);
Expand Down Expand Up @@ -153,7 +153,7 @@ This guide covers common issues you might encounter when working with CommandKit
```ts
const userCooldowns = new Map<string, number>();

messageFilter: async (message) => {
messageFilter: async (commandkit, message) => {
const userId = message.author.id;
const now = Date.now();
const cooldown = userCooldowns.get(userId) || 0;
Expand Down Expand Up @@ -368,7 +368,7 @@ export const ai: AiCommand<typeof aiConfig> = async (ctx) => {
### Channel Access Issues

```ts
messageFilter: async (message) => {
messageFilter: async (commandkit, message) => {
// Check if bot can send messages in the channel
if (!message.channel.isSendable()) {
console.log('Cannot send messages in channel:', message.channelId);
Expand Down
17 changes: 15 additions & 2 deletions packages/ai/src/configure.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,21 @@ export interface ConfigureAI {

const AIConfig: Required<ConfigureAI> = {
disableBuiltInTools: false,
messageFilter: async (message) =>
message.mentions.users.has(message.client.user.id),
messageFilter: async (commandkit, message) => {
const prefixOrPrefixes =
await commandkit.config.getMessageCommandPrefix(message);

const prefixes = Array.isArray(prefixOrPrefixes)
? prefixOrPrefixes
: [prefixOrPrefixes];

const possiblyCommand = prefixes.some((p) => message.content.startsWith(p));

// TODO: figure out a workaround for mention prefixes
return (
!possiblyCommand && message.mentions.users.has(message.client.user.id)
);
},
prepareSystemPrompt: async (_ctx, message) => createSystemPrompt(message),
preparePrompt: async (_ctx, message) => {
const recentMessages = await message.channel.messages.fetch({
Expand Down
4 changes: 3 additions & 1 deletion packages/ai/src/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,9 @@ export class AiPlugin extends RuntimePlugin<AiPluginOptions> {

if (!message.channel.isTextBased() || !message.channel.isSendable()) return;

const shouldContinue = messageFilter ? await messageFilter(message) : true;
const shouldContinue = messageFilter
? await messageFilter(commandkit, message)
: true;
if (!shouldContinue) return;

const ctx = new AiContext<any>({
Expand Down
14 changes: 5 additions & 9 deletions packages/ai/src/types.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Tool, type generateText } from 'ai';
import { Message } from 'discord.js';
import { AiContext } from './context';
import { LoadedCommand, MessageCommandContext } from 'commandkit';
import CommandKit, { LoadedCommand, MessageCommandContext } from 'commandkit';
import { AiConfig } from './plugin';
import { InferParameters } from './tools/common';

Expand All @@ -10,19 +10,15 @@ import { InferParameters } from './tools/common';
*/
export type AIGenerateResult = Awaited<ReturnType<typeof generateText>>;

/**
* Function type for filtering commands based on their name.
* @param commandName - The name of the command to filter.
* @returns A boolean indicating whether the command should be included in the filter.
*/
export type CommandFilterFunction = (commandName: string) => boolean;

/**
* Function type for filtering messages before they are processed by the AI.
* @param message - The message to filter.
* @returns A promise that resolves to a boolean indicating whether the message should be processed.
*/
export type MessageFilter = (message: Message) => Promise<boolean>;
export type MessageFilter = (
commandkit: CommandKit,
message: Message,
) => Promise<boolean>;

/**
* Function type for selecting an AI model based on the message.
Expand Down