feat: add llama command

This commit is contained in:
2024-09-24 20:51:20 +08:00
parent 82f4b3c542
commit 7e2d2d7cdb
8 files changed
+70 -12

No files matched your search

+5 -2
View File
@@ -52,13 +52,16 @@ val DEFAULT_CONFIG = Config(
imageType = ImageType.PNG, imageType = ImageType.PNG,
openAIAPIHost = "https://api.moonshot.cn", openAIAPIHost = "https://api.moonshot.cn",
openAIAPIKey = "114514", openAIAPIKey = "114514",
openAIModel = "moonshot-v1-8k",
smtpHost = "127.0.0.1", smtpHost = "127.0.0.1",
smtpPort = 25, smtpPort = 25,
smtpUser = "114514", smtpUser = "114514",
smtpPassword = "1919810", smtpPassword = "1919810",
smtpFromAddress = "fancybot@repo.rtast.cn", smtpFromAddress = "fancybot@repo.rtast.cn",
admins = listOf(3458671395L), admins = listOf(3458671395L),
enableAntiRevoke = true enableAntiRevoke = true,
llamaUrl = "http://127.0.0.1",
llamaModel = "llama3.1"
) )
val configManager = ConfigManager() val configManager = ConfigManager()
@@ -96,7 +99,7 @@ val commands = listOf(
NiuziBankCommand(), WithdrawCommand(), NiuziBankCommand(), WithdrawCommand(),
BankTransferCommand(), CreateBankAccountCommand(), BankTransferCommand(), CreateBankAccountCommand(),
BankBalanceCommand(), DepositCommand(), BankBalanceCommand(), DepositCommand(),
DMSearchCommand() DMSearchCommand(), LlamaCommand()
) )
val START_UP_TIME = Instant.now().epochSecond val START_UP_TIME = Instant.now().epochSecond
@@ -10,24 +10,28 @@ package cn.rtast.fancybot.commands.lookup
import cn.rtast.fancybot.configManager import cn.rtast.fancybot.configManager
import cn.rtast.fancybot.entity.gpt.ChatCompletionsPayload import cn.rtast.fancybot.entity.gpt.ChatCompletionsPayload
import cn.rtast.fancybot.entity.gpt.ChatCompletionsResponse 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.entity.gpt.ModelList
import cn.rtast.fancybot.util.Http import cn.rtast.fancybot.util.Http
import cn.rtast.fancybot.util.str.toJson import cn.rtast.fancybot.util.str.toJson
import cn.rtast.rob.entity.GroupMessage import cn.rtast.rob.entity.GroupMessage
import cn.rtast.rob.util.BaseCommand import cn.rtast.rob.util.BaseCommand
import cn.rtast.rob.util.ob.MessageChain import cn.rtast.rob.util.ob.MessageChain
import cn.rtast.rob.util.ob.NodeMessageChain
import cn.rtast.rob.util.ob.OneBotListener import cn.rtast.rob.util.ob.OneBotListener
class AICommand : BaseCommand() { class AICommand : BaseCommand() {
override val commandNames = listOf("/ai", "问AI") override val commandNames = listOf("/ai", "问AI")
private val openAIModel = configManager.openAIModel
override suspend fun executeGroup(listener: OneBotListener, message: GroupMessage, args: List<String>) { override suspend fun executeGroup(listener: OneBotListener, message: GroupMessage, args: List<String>) {
if (args.isEmpty()) { if (args.isEmpty()) {
val msg = MessageChain.Builder() val msg = MessageChain.Builder()
.addAt(message.sender.userId) .addAt(message.sender.userId)
.addText("发送`/ai [模型] <问题>`即可询问AI哦~") .addText("发送`/ai [模型] <问题>`即可询问AI哦~")
.addNewLine() .addNewLine()
.addText("不指定模型默认为`moonshot-v1-8k`") .addText("不指定模型默认为从配置文件中读取 >>>${openAIModel}")
.addNewLine() .addNewLine()
.addText("发送`/ai list`可以获取可用的模型列表~") .addText("发送`/ai list`可以获取可用的模型列表~")
.build() .build()
@@ -51,18 +55,43 @@ class AICommand : BaseCommand() {
return 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 content = if (args.size == 1) args.joinToString(" ") else args.drop(1).joinToString(" ")
val messages = ChatCompletionsPayload(model, listOf(ChatCompletionsPayload.Message(content))) val messages = ChatCompletionsPayload(model, listOf(ChatCompletionsPayload.Message(content)))
val response = Http.post<ChatCompletionsResponse>( val response = Http.post<ChatCompletionsResponse>(
"${configManager.openAIAPIHost}/v1/chat/completions", "${configManager.openAIAPIHost}/v1/chat/completions", messages.toJson(),
messages.toJson(),
mapOf("Authorization" to "Bearer ${configManager.openAIAPIKey}") mapOf("Authorization" to "Bearer ${configManager.openAIAPIKey}")
) )
val nodeMsg = NodeMessageChain.Builder()
val msg = MessageChain.Builder() val msg = MessageChain.Builder()
.addReply(message.messageId)
.addText(response.choices.first().message.content) .addText(response.choices.first().message.content)
.build() .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<String>) {
if (args.isEmpty()) {
message.reply("发送`/llama <问题>`即可使用llama模型来回复")
return
}
val prompt = args.joinToString(" ")
val payload = ChatCompletionsPayload(llamaModel, listOf(ChatCompletionsPayload.Message(prompt)))
val response = Http.post<LlamaResponse>("$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())
} }
} }
@@ -22,11 +22,14 @@ data class Config(
val imageType: ImageType, val imageType: ImageType,
val openAIAPIHost: String, val openAIAPIHost: String,
val openAIAPIKey: String, val openAIAPIKey: String,
val openAIModel: String,
val smtpHost: String, val smtpHost: String,
val smtpPort: Int, val smtpPort: Int,
val smtpUser: String, val smtpUser: String,
val smtpPassword: String, val smtpPassword: String,
val smtpFromAddress: String, val smtpFromAddress: String,
val admins: List<Long>, val admins: List<Long>,
val enableAntiRevoke: Boolean val enableAntiRevoke: Boolean,
val llamaUrl: String,
val llamaModel: String,
) )
@@ -11,7 +11,8 @@ import cn.rtast.fancybot.entity.enums.GPTUserRole
data class ChatCompletionsPayload( data class ChatCompletionsPayload(
val model: String, val model: String,
val messages: List<Message> val messages: List<Message>,
val stream: Boolean = false
) { ) {
data class Message( data class Message(
val content: String, val content: String,
@@ -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,
)
}
@@ -10,7 +10,7 @@ package cn.rtast.fancybot.util
import java.io.InputStream import java.io.InputStream
object Resources { object Resources {
fun loadFromResources(filename: String): InputStream { fun loadFromResources(filename: String): InputStream? {
return this::class.java.classLoader.getResourceAsStream(filename) return this::class.java.classLoader.getResourceAsStream(filename)
} }
@@ -22,6 +22,7 @@ class ConfigManager : JsonFileHandler<Config>("config.json") {
val imageType get() = this.read<Config>().imageType val imageType get() = this.read<Config>().imageType
val openAIAPIHost get() = this.read<Config>().openAIAPIHost val openAIAPIHost get() = this.read<Config>().openAIAPIHost
val openAIAPIKey get() = this.read<Config>().openAIAPIKey val openAIAPIKey get() = this.read<Config>().openAIAPIKey
val openAIModel get() = this.read<Config>().openAIModel
val smtpHost get() = this.read<Config>().smtpHost val smtpHost get() = this.read<Config>().smtpHost
val smtpPort get() = this.read<Config>().smtpPort val smtpPort get() = this.read<Config>().smtpPort
val smtpUser get() = this.read<Config>().smtpUser val smtpUser get() = this.read<Config>().smtpUser
@@ -29,4 +30,6 @@ class ConfigManager : JsonFileHandler<Config>("config.json") {
val smtpFromAddress get() = this.read<Config>().smtpFromAddress val smtpFromAddress get() = this.read<Config>().smtpFromAddress
val admins get() = this.read<Config>().admins val admins get() = this.read<Config>().admins
val enableAntiRevoke get() = this.read<Config>().enableAntiRevoke val enableAntiRevoke get() = this.read<Config>().enableAntiRevoke
val llamaUrl get() = this.read<Config>().llamaUrl
val llamaModel get() = this.read<Config>().llamaModel
} }
+4 -1
View File
@@ -13,6 +13,7 @@
"imageType": "PNG", "imageType": "PNG",
"openAIAPIHost": "https://api.moonshot.cn", "openAIAPIHost": "https://api.moonshot.cn",
"openAIAPIKey": "114514", "openAIAPIKey": "114514",
"openAIModel": "moonshot-v1-8k",
"smtpHost": "127.0.0.1", "smtpHost": "127.0.0.1",
"smtpPort": 25, "smtpPort": 25,
"smtpUser": "114514", "smtpUser": "114514",
@@ -21,5 +22,7 @@
"admins": [ "admins": [
3458671395 3458671395
], ],
"enableAntiRevoke": true "enableAntiRevoke": true,
"llamaUrl": "http://127.0.0.1",
"llamaModel": "llama3.1"
} }