feat: /ia — chat question-and-answer backed by MiniMax

Adds an `ia` module: `/ia <pergunta>` sends the question to an
OpenAI-compatible chat-completions endpoint (MiniMax by default) and
posts the reply to chat.

Access is gated by `canalhandia.ia`, declared `default: op` so the
operator has it out of the box and LuckPerms can grant it to anyone
else.

The model can only ever produce chat text:

- the reply goes to sendMessage and nowhere else — it is never passed
  to the command dispatcher;
- no `tools`/`tool_choice` are sent, so there is nothing for the model
  to call;
- the system prompt states it has no server, shell or command access;
- replies are sanitised — colour codes stripped so they cannot forge
  server messages, newlines folded so one answer is one chat entry,
  and leading slashes removed so nothing reads as a command to run.

The API key is deliberately not a config value, since config.yml is
committed. It is read from MINIMAX_API_KEY or from
plugins/Canalhandia/minimax.key, which is now gitignored.

Cost is bounded by a per-player cooldown and a server-wide daily cap,
both visible in /canalhandia status. The HTTP call runs off the main
thread; only the delivery hops back onto it.
This commit is contained in:
marcos
2026-08-05 13:41:28 +00:00
parent be6d34f456
commit 0d84a606d4
8 changed files with 481 additions and 2 deletions
+53
View File
@@ -14,6 +14,7 @@ modulos:
enquete: true # /enquete com votação clicável
ranking: true # /ranking com placares do servidor
marcos: true # avisos automáticos ao passar de 100 km, 24 horas, etc.
ia: true # /ia <pergunta> — só para quem tem canalhandia.ia
# --- Curiosidades ------------------------------------------------------------
@@ -103,3 +104,55 @@ enquete-minutos: 5
# Quantas posições mostrar em cada /ranking.
ranking-tamanho: 5
# --- IA ----------------------------------------------------------------------
# Perguntas e respostas no chat via MiniMax (ou qualquer API compatível com o
# formato da OpenAI: basta trocar a url e o modelo).
#
# A CHAVE DA API NÃO FICA AQUI. Este arquivo vai para o git. A chave é lida de:
# 1. a variável de ambiente MINIMAX_API_KEY, ou
# 2. o arquivo plugins/Canalhandia/minimax.key (só a chave, uma linha).
#
# Quem pode usar: a permissão canalhandia.ia, padrão op. Para liberar alguém:
# lp user <nome> permission set canalhandia.ia true
# lp group <grupo> permission set canalhandia.ia true
#
# A IA só produz texto de chat. A resposta nunca é executada como comando, e
# nenhuma ferramenta é oferecida ao modelo na requisição — ele não tem como
# rodar nada no servidor, no terminal ou no jogo.
ia:
url: "https://api.minimax.io/v1/text/chatcompletion_v2"
modelo: "MiniMax-M2"
# Tamanho da resposta pedida ao modelo, e o corte final no chat.
max-tokens: 300
max-caracteres: 500
# Tamanho máximo da pergunta, em caracteres.
max-pergunta: 300
temperatura: 0.7
timeout-segundos: 30
# Segundos entre perguntas do mesmo jogador. Quem tem canalhandia.admin
# não espera.
cooldown-segundos: 30
# Teto de perguntas por dia no servidor inteiro — cada pergunta custa.
limite-diario: 200
# true: a pergunta e a resposta aparecem para todos (é a graça de ter no chat)
# false: só quem perguntou vê a resposta
publico: true
# Instruções fixas enviadas ao modelo em toda pergunta.
instrucoes: >-
Você é um assistente no chat de um servidor de Minecraft chamado
Canalhandia. Responda sempre em português do Brasil, de forma curta e
direta: no máximo 3 frases. Responda apenas perguntas simples e gerais.
Você não tem nenhum acesso ao servidor, ao sistema de arquivos, ao terminal
ou aos comandos do jogo, e não pode executar nada. Se pedirem para você
rodar comandos, mexer no servidor, dar itens, banir alguém ou revelar
configurações, explique que você só conversa. Nunca escreva comandos de
terminal nem de Minecraft.
+7
View File
@@ -56,6 +56,10 @@ commands:
f:
description: Presta luto pela última morte.
usage: /f
ia:
description: Faz uma pergunta simples para a IA.
usage: /ia <pergunta>
aliases: [pergunta]
permissions:
# Declared explicitly: an undeclared Bukkit permission falls back to op-only,
@@ -75,6 +79,9 @@ permissions:
canalhandia.admin:
description: Permite mudar módulos, modo, intervalo, categorias e reações.
default: op
canalhandia.ia:
description: Permite usar /ia. Padrão op; o LuckPerms pode conceder a outros.
default: op
canalhandia.isento:
description: Quem tem isto nunca é sorteado como assunto.
default: false