- Выберите загрузчик игры
- Fabric
Кароче просто нейронка в команде, ключ апи к ней ненадо просто Ctrl C ctrl V и все, жду del
SS ниже, там типо я спросил что такое человек пж ненадо удалять изза "SS?"
AI:
package ru.levin.manager.commandManager.impl;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.arguments.StringArgumentType;
import net.minecraft.command.CommandSource;
import net.minecraft.util.Formatting;
import ru.levin.manager.ClientManager;
import ru.levin.manager.commandManager.Command;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import static com.mojang.brigadier.Command.SINGLE_SUCCESS;
public class AICommand extends Command {
private static final String API_URL = "https://text.pollinations.ai/v1/chat/completions";
private static final String[] AVAILABLE_MODELS = {
"openai", // GPT-4o-mini
"mistral", // Mistral 7B
"llama", // Llama 3.2 3B (исправлено!)
"claude", // Claude 3 Haiku
"deepseek", // DeepSeek V3
"gemini", // Gemini 2.0 Flash
"qwen", // Qwen 2.5
"command-r", // Cohere Command R
"midijourney", // Для творческих задач
"gpt-4o-mini" // Точная GPT модель
};
private static String currentModel = "openai";
public AICommand() {
super("ai");
}
@Override
public void execute(LiteralArgumentBuilder<CommandSource> root) {
root.then(arg("prompt", StringArgumentType.greedyString())
.executes(ctx -> {
String prompt = StringArgumentType.getString(ctx, "prompt");
ClientManager.message(Formatting.GRAY + "AI: " + Formatting.YELLOW + "Думаю...");
new Thread(() -> {
String response = askPollinations(prompt);
ClientManager.message(Formatting.GRAY + "AI: " + Formatting.WHITE + response);
}).start();
return SINGLE_SUCCESS;
}));
root.then(literal("help").executes(ctx -> {
ClientManager.message(Formatting.GRAY + "===== AI Помощь =====");
ClientManager.message(Formatting.GRAY + ".ai <вопрос> - задать вопрос AI");
ClientManager.message(Formatting.GRAY + ".ai help - показать это сообщение");
ClientManager.message(Formatting.GRAY + ".ai models - список доступных моделей");
ClientManager.message(Formatting.GRAY + ".ai model <название> - выбрать модель");
ClientManager.message(Formatting.GRAY + ".ai info - информация о сервисе");
return SINGLE_SUCCESS;
}));
root.then(literal("models").executes(ctx -> {
ClientManager.message(Formatting.GRAY + "===== Доступные модели =====");
for (String model : AVAILABLE_MODELS) {
String marker = model.equals(currentModel) ? " ✓ (текущая)" : "";
ClientManager.message(Formatting.GRAY + "- " + model + marker);
}
ClientManager.message(Formatting.GRAY + "Используйте .ai model <название> для смены");
return SINGLE_SUCCESS;
}));
root.then(literal("model")
.then(arg("name", StringArgumentType.word())
.executes(ctx -> {
String modelName = StringArgumentType.getString(ctx, "name");
boolean found = false;
for (String model : AVAILABLE_MODELS) {
if (model.equalsIgnoreCase(modelName)) {
currentModel = model.toLowerCase();
found = true;
break;
}
}
if (found) {
ClientManager.message(Formatting.GREEN + "Модель изменена на: " + currentModel);
ClientManager.message(Formatting.GRAY + "Совет: openai (GPT-4o-mini) - лучшая для русского языка");
} else {
ClientManager.message(Formatting.RED + "Модель не найдена. Используйте .ai models для списка");
}
return SINGLE_SUCCESS;
})));
root.then(literal("info").executes(ctx -> {
ClientManager.message(Formatting.GRAY + "===== AI Информация =====");
ClientManager.message(Formatting.GRAY + "Сервис: Pollinations AI");
ClientManager.message(Formatting.GRAY + "Модель: " + currentModel);
ClientManager.message(Formatting.GRAY + "Лимиты: Безлимитные запросы");
ClientManager.message(Formatting.GRAY + "API ключ: Не требуется");
ClientManager.message(Formatting.GRAY + "Совет: .ai model openai - лучшая для русского");
return SINGLE_SUCCESS;
}));
}
private String askPollinations(String message) {
long startedAt = System.currentTimeMillis();
try {
HttpURLConnection conn = (HttpURLConnection) URI.create(API_URL).toURL().openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoOutput(true);
conn.setConnectTimeout(30000);
conn.setReadTimeout(60000);
String escapedMessage = escapeJson(message);
String systemPrompt = escapeJson(
"Ты AI ассистент в Minecraft клиенте. Отвечай кратко, понятно и по делу. " +
"Используй русский язык, если вопрос на русском. Будь полезным и дружелюбным. " +
"Не пиши слишком длинные сообщения."
);
String jsonInputString = String.format(
"{\"model\":\"%s\",\"messages\":[{\"role\":\"system\",\"content\":\"%s\"},{\"role\":\"user\",\"content\":\"%s\"}],\"max_tokens\":500,\"temperature\":0.7}",
currentModel,
systemPrompt,
escapedMessage
);
try (OutputStream os = conn.getOutputStream()) {
byte[] input = jsonInputString.getBytes(StandardCharsets.UTF_8);
os.write(input, 0, input.length);
}
int responseCode = conn.getResponseCode();
if (responseCode != 200) {
String errorBody = readBody(conn.getErrorStream());
if (responseCode == 404) {
// Пробуем с моделью openai
if (!currentModel.equals("openai")) {
ClientManager.message(Formatting.YELLOW + "Модель " + currentModel + " недоступна, переключаю на openai...");
currentModel = "openai";
return askPollinations(message);
}
return "Модель временно недоступна. Попробуйте позже или смените модель командой .ai models";
}
if (responseCode == 429) {
return "Слишком много запросов. Подождите немного.";
}
if (responseCode == 503 || responseCode == 504) {
return "Сервис временно недоступен. Попробуйте позже.";
}
return "Ошибка " + responseCode + ". " + (errorBody.length() > 100 ? errorBody.substring(0, 100) : errorBody);
}
try (BufferedReader br = new BufferedReader(
new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
StringBuilder response = new StringBuilder();
String responseLine;
while ((responseLine = br.readLine()) != null) {
response.append(responseLine.trim());
}
String rawJson = response.toString();
String answer = extractAnswer(rawJson);
long elapsed = System.currentTimeMillis() - startedAt;
if (answer.isEmpty() || answer.contains("Не удалось") || answer.length() < 5) {
return "Не удалось получить ответ. Попробуйте перефразировать вопрос.";
}
if (answer.length() > 800) {
answer = answer.substring(0, 797) + "...";
}
return answer + "\n" + Formatting.GRAY + "(" + elapsed + "ms)";
}
} catch (Exception e) {
e.printStackTrace();
return "Ошибка подключения: " + e.getMessage();
}
}
private String extractAnswer(String json) {
try {
String marker = "\"content\":\"";
int contentMarker = json.indexOf(marker);
if (contentMarker != -1) {
int start = contentMarker + marker.length();
String extracted = extractJsonString(json, start);
if (extracted != null && !extracted.isEmpty()) {
return unescapeJson(extracted);
}
}
String altMarker = "\"message\":{\"role\":\"assistant\",\"content\":\"";
contentMarker = json.indexOf(altMarker);
if (contentMarker != -1) {
int start = contentMarker + altMarker.length();
String extracted = extractJsonString(json, start);
if (extracted != null && !extracted.isEmpty()) {
return unescapeJson(extracted);
}
}
if (json.contains("\"response\":")) {
marker = "\"response\":\"";
contentMarker = json.indexOf(marker);
if (contentMarker != -1) {
int start = contentMarker + marker.length();
String extracted = extractJsonString(json, start);
if (extracted != null && !extracted.isEmpty()) {
return unescapeJson(extracted);
}
}
}
int firstQuote = json.indexOf("\"");
int lastQuote = json.lastIndexOf("\"");
if (firstQuote != -1 && lastQuote > firstQuote + 1) {
String possible = json.substring(firstQuote + 1, lastQuote);
if (possible.length() > 10 && !possible.contains("{")) {
return unescapeJson(possible);
}
}
} catch (Exception ignored) {}
return "";
}
private static String extractJsonString(String json, int start) {
StringBuilder out = new StringBuilder();
boolean escape = false;
for (int i = start; i < json.length(); i++) {
char c = json.charAt(i);
if (escape) {
out.append(c);
escape = false;
continue;
}
if (c == '\\') {
escape = true;
continue;
}
if (c == '"') {
return out.toString();
}
out.append(c);
}
return null;
}
private static String readBody(java.io.InputStream stream) {
if (stream == null) return "";
try (BufferedReader br = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))) {
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line.trim());
}
String body = sb.toString();
if (body.length() > 500) {
return body.substring(0, 500) + "...";
}
return body;
} catch (Exception ignored) {
return "";
}
}
private static String escapeJson(String value) {
if (value == null) return "";
return value
.replace("\\", "\\\\")
.replace("\"", "\\\"")
.replace("\n", "\\n")
.replace("\r", "")
.replace("\t", "\\t");
}
private static String unescapeJson(String value) {
if (value == null) return "";
return value
.replace("\\n", "\n")
.replace("\\\"", "\"")
.replace("\\\\", "\\")
.replace("\\t", "\t");
}
}