diff --git a/src/main/kotlin/cn/rtast/fancybot/Const.kt b/src/main/kotlin/cn/rtast/fancybot/Const.kt index b236e5a..278d741 100644 --- a/src/main/kotlin/cn/rtast/fancybot/Const.kt +++ b/src/main/kotlin/cn/rtast/fancybot/Const.kt @@ -52,13 +52,16 @@ val DEFAULT_CONFIG = Config( imageType = ImageType.PNG, openAIAPIHost = "https://api.moonshot.cn", openAIAPIKey = "114514", + openAIModel = "moonshot-v1-8k", smtpHost = "127.0.0.1", smtpPort = 25, smtpUser = "114514", smtpPassword = "1919810", smtpFromAddress = "fancybot@repo.rtast.cn", admins = listOf(3458671395L), - enableAntiRevoke = true + enableAntiRevoke = true, + llamaUrl = "http://127.0.0.1", + llamaModel = "llama3.1" ) val configManager = ConfigManager() @@ -96,7 +99,7 @@ val commands = listOf( NiuziBankCommand(), WithdrawCommand(), BankTransferCommand(), CreateBankAccountCommand(), BankBalanceCommand(), DepositCommand(), - DMSearchCommand() + DMSearchCommand(), LlamaCommand() ) val START_UP_TIME = Instant.now().epochSecond \ No newline at end of file diff --git a/src/main/kotlin/cn/rtast/fancybot/commands/lookup/AICommand.kt b/src/main/kotlin/cn/rtast/fancybot/commands/lookup/AICommand.kt index f1ca850..6bb26e7 100644 --- a/src/main/kotlin/cn/rtast/fancybot/commands/lookup/AICommand.kt +++ b/src/main/kotlin/cn/rtast/fancybot/commands/lookup/AICommand.kt @@ -10,24 +10,28 @@ package cn.rtast.fancybot.commands.lookup import cn.rtast.fancybot.configManager import cn.rtast.fancybot.entity.gpt.ChatCompletionsPayload import cn.rtast.fancybot.entity.gpt.ChatCompletionsResponse +import cn.rtast.fancybot.entity.gpt.LlamaResponse import cn.rtast.fancybot.entity.gpt.ModelList import cn.rtast.fancybot.util.Http import cn.rtast.fancybot.util.str.toJson import cn.rtast.rob.entity.GroupMessage import cn.rtast.rob.util.BaseCommand import cn.rtast.rob.util.ob.MessageChain +import cn.rtast.rob.util.ob.NodeMessageChain import cn.rtast.rob.util.ob.OneBotListener class AICommand : BaseCommand() { override val commandNames = listOf("/ai", "问AI") + private val openAIModel = configManager.openAIModel + override suspend fun executeGroup(listener: OneBotListener, message: GroupMessage, args: List) { if (args.isEmpty()) { val msg = MessageChain.Builder() .addAt(message.sender.userId) .addText("发送`/ai [模型] <问题>`即可询问AI哦~") .addNewLine() - .addText("不指定模型默认为`moonshot-v1-8k`") + .addText("不指定模型默认为从配置文件中读取 >>>${openAIModel}") .addNewLine() .addText("发送`/ai list`可以获取可用的模型列表~") .build() @@ -51,18 +55,43 @@ class AICommand : BaseCommand() { return } - val model = if (args.size == 1) "moonshot-v1-8k" else args.first() + val model = if (args.size == 1) openAIModel else args.first() val content = if (args.size == 1) args.joinToString(" ") else args.drop(1).joinToString(" ") val messages = ChatCompletionsPayload(model, listOf(ChatCompletionsPayload.Message(content))) val response = Http.post( - "${configManager.openAIAPIHost}/v1/chat/completions", - messages.toJson(), + "${configManager.openAIAPIHost}/v1/chat/completions", messages.toJson(), mapOf("Authorization" to "Bearer ${configManager.openAIAPIKey}") ) + val nodeMsg = NodeMessageChain.Builder() val msg = MessageChain.Builder() - .addReply(message.messageId) .addText(response.choices.first().message.content) .build() - listener.sendGroupMessage(message.groupId, msg) + nodeMsg.addMessageChain(msg, message.sender.userId) + listener.sendGroupForwardMsg(message.groupId, nodeMsg.build()) + } +} + +class LlamaCommand : BaseCommand() { + override val commandNames = listOf("/llama") + + private val llamaURL = configManager.llamaUrl + private val llamaModel = configManager.llamaModel + + override suspend fun executeGroup(listener: OneBotListener, message: GroupMessage, args: List) { + if (args.isEmpty()) { + message.reply("发送`/llama <问题>`即可使用llama模型来回复") + return + } + val prompt = args.joinToString(" ") + val payload = ChatCompletionsPayload(llamaModel, listOf(ChatCompletionsPayload.Message(prompt))) + val response = Http.post("$llamaURL/api/chat", payload.toJson()) + val nodeMsg = NodeMessageChain.Builder() + val msg = MessageChain.Builder() + .addText("AI回复如下:") + .addNewLine() + .addText(response.message.content) + .build() + nodeMsg.addMessageChain(msg, message.sender.userId) + listener.sendGroupForwardMsg(message.groupId, nodeMsg.build()) } } \ No newline at end of file diff --git a/src/main/kotlin/cn/rtast/fancybot/entity/Config.kt b/src/main/kotlin/cn/rtast/fancybot/entity/Config.kt index 0d7ddaf..887e8e4 100644 --- a/src/main/kotlin/cn/rtast/fancybot/entity/Config.kt +++ b/src/main/kotlin/cn/rtast/fancybot/entity/Config.kt @@ -22,11 +22,14 @@ data class Config( val imageType: ImageType, val openAIAPIHost: String, val openAIAPIKey: String, + val openAIModel: String, val smtpHost: String, val smtpPort: Int, val smtpUser: String, val smtpPassword: String, val smtpFromAddress: String, val admins: List, - val enableAntiRevoke: Boolean + val enableAntiRevoke: Boolean, + val llamaUrl: String, + val llamaModel: String, ) \ No newline at end of file diff --git a/src/main/kotlin/cn/rtast/fancybot/entity/gpt/ChatCompletionsPayload.kt b/src/main/kotlin/cn/rtast/fancybot/entity/gpt/ChatCompletionsPayload.kt index af9403e..12e0e5a 100644 --- a/src/main/kotlin/cn/rtast/fancybot/entity/gpt/ChatCompletionsPayload.kt +++ b/src/main/kotlin/cn/rtast/fancybot/entity/gpt/ChatCompletionsPayload.kt @@ -11,7 +11,8 @@ import cn.rtast.fancybot.entity.enums.GPTUserRole data class ChatCompletionsPayload( val model: String, - val messages: List + val messages: List, + val stream: Boolean = false ) { data class Message( val content: String, diff --git a/src/main/kotlin/cn/rtast/fancybot/entity/gpt/LlamaResponse.kt b/src/main/kotlin/cn/rtast/fancybot/entity/gpt/LlamaResponse.kt new file mode 100644 index 0000000..cfbfb36 --- /dev/null +++ b/src/main/kotlin/cn/rtast/fancybot/entity/gpt/LlamaResponse.kt @@ -0,0 +1,16 @@ +/* + * Copyright © 2024 RTAkland + * Author: RTAkland + * Date: 2024/9/24 + */ + + +package cn.rtast.fancybot.entity.gpt + +data class LlamaResponse( + val message: Message +) { + data class Message( + val content: String, + ) +} \ No newline at end of file diff --git a/src/main/kotlin/cn/rtast/fancybot/util/Resources.kt b/src/main/kotlin/cn/rtast/fancybot/util/Resources.kt index 1642f41..23d840b 100644 --- a/src/main/kotlin/cn/rtast/fancybot/util/Resources.kt +++ b/src/main/kotlin/cn/rtast/fancybot/util/Resources.kt @@ -10,7 +10,7 @@ package cn.rtast.fancybot.util import java.io.InputStream object Resources { - fun loadFromResources(filename: String): InputStream { + fun loadFromResources(filename: String): InputStream? { return this::class.java.classLoader.getResourceAsStream(filename) } diff --git a/src/main/kotlin/cn/rtast/fancybot/util/file/ConfigManager.kt b/src/main/kotlin/cn/rtast/fancybot/util/file/ConfigManager.kt index e2a1d4d..1f19a87 100644 --- a/src/main/kotlin/cn/rtast/fancybot/util/file/ConfigManager.kt +++ b/src/main/kotlin/cn/rtast/fancybot/util/file/ConfigManager.kt @@ -22,6 +22,7 @@ class ConfigManager : JsonFileHandler("config.json") { val imageType get() = this.read().imageType val openAIAPIHost get() = this.read().openAIAPIHost val openAIAPIKey get() = this.read().openAIAPIKey + val openAIModel get() = this.read().openAIModel val smtpHost get() = this.read().smtpHost val smtpPort get() = this.read().smtpPort val smtpUser get() = this.read().smtpUser @@ -29,4 +30,6 @@ class ConfigManager : JsonFileHandler("config.json") { val smtpFromAddress get() = this.read().smtpFromAddress val admins get() = this.read().admins val enableAntiRevoke get() = this.read().enableAntiRevoke + val llamaUrl get() = this.read().llamaUrl + val llamaModel get() = this.read().llamaModel } \ No newline at end of file diff --git a/src/main/resources/config.json b/src/main/resources/config.json index ff0e05b..c5c984f 100644 --- a/src/main/resources/config.json +++ b/src/main/resources/config.json @@ -13,6 +13,7 @@ "imageType": "PNG", "openAIAPIHost": "https://api.moonshot.cn", "openAIAPIKey": "114514", + "openAIModel": "moonshot-v1-8k", "smtpHost": "127.0.0.1", "smtpPort": 25, "smtpUser": "114514", @@ -21,5 +22,7 @@ "admins": [ 3458671395 ], - "enableAntiRevoke": true + "enableAntiRevoke": true, + "llamaUrl": "http://127.0.0.1", + "llamaModel": "llama3.1" } \ No newline at end of file