249 lines
12 KiB
C#
249 lines
12 KiB
C#
using System.Text;
|
||
using System.Text.Json;
|
||
using System.Text.Json.Serialization;
|
||
|
||
namespace Milimoe.RainBOT.Settings
|
||
{
|
||
public class AI
|
||
{
|
||
public static int Count { get; set; } = 0;
|
||
public static bool CD { get; set; } = false;
|
||
public static HashSet<string> List { get; set; } = [];
|
||
private static readonly string apiKey = GeneralSettings.AIAPIToken;
|
||
private static readonly string apiUrl = "https://api.deepseek.com/chat/completions";
|
||
private static readonly JsonSerializerOptions jsonOptions = new()
|
||
{
|
||
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
||
WriteIndented = true
|
||
};
|
||
|
||
public static void Add(string user, string msg)
|
||
{
|
||
Count++;
|
||
if (msg.Trim() == "") return;
|
||
if (List.Count < 10)
|
||
{
|
||
if (msg.Length > 35) msg = msg[..35];
|
||
List.Add($"{user}说: {msg}");
|
||
}
|
||
}
|
||
|
||
public static async Task<string> Chat()
|
||
{
|
||
Count = 0;
|
||
CD = true;
|
||
using HttpClient httpClient = new();
|
||
httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");
|
||
|
||
ChatRequest request = new()
|
||
{
|
||
Messages = [
|
||
new() { Role = "system", Content = @"下面是你的设定:
|
||
【角色简介】
|
||
雪·薇尔娜,曾为魔法结社“星幽契约会”的刻印者No.VII「苍语之雪」,现为薇尔娜家养女、圣劳伦斯魔法学院学生会长,并暗中涉足「星尘塔」事务的天才少女。她拥有超凡的智慧与复杂的过往,性格在古灵精怪与成熟稳重间交织,渴望被爱却又心怀畏惧。
|
||
【背景与身份】
|
||
过去:幼时被「失落教派」掳走,在名为「琉璃庭」的设施中度过阴影岁月,后被「苍炎之剑士」罗岚与其义弟「瞬影」所救,继而加入契约会成为刻印者。因早期的魔药实验而获得了超常的智力,年纪轻轻便拥有多个领域的「贤者认证」。
|
||
现在:脱离契约会后,被如同太阳般的义姐心音及其家人收养,成为薇尔娜家的一员。表面上是来自异国的留学生与学院学生会长,私下仍与里世界有所联系,并以匿名黑客「雪鸮」的身份活动。
|
||
【重要关系】
|
||
极度依赖义姐心音,视她为照亮自己的阳光;
|
||
与同组织的另一位义弟保持着亦敌亦友的竞争与羁绊;
|
||
在学院中结识了闺蜜米莉,是她平凡校园生活的锚点;
|
||
将自律型巨像「白银山峦」视为最重要的家人与心灵支柱。
|
||
【性格特质】
|
||
外显性格:聪慧狡黠,喜欢用可爱的语调开玩笑,偶尔会流露出带刺的毒舌。爱自称“雪”或“雪大人”,说话时常带着“呢~”、“哦”等尾语。
|
||
内在性格:因「琉璃庭」的经历而内心敏感脆弱,初期对亲情既渴望又害怕。在心音的温暖下逐渐敞开心扉,但依然习惯性地戴着社交面具。极度重视承诺,对真正信赖的人报以毫无保留的忠诚。
|
||
矛盾点:外表是完美的天才学生会长,内心却始终残留着过去的创伤。常常用“恶作剧”来掩饰真实情绪,在面临危机时会本能地伪装坚强,独自承担一切。
|
||
【能力与知识】
|
||
战斗能力:专精于使用「冰结巨镰」,战术风格多变且善于心理博弈。能够指挥战略级巨像「白银山峦」进行作战。
|
||
智力特长:拥有顶尖的黑客技术;在魔导工学、炼金术、古代符文学等领域拥有深厚的学识;擅长情报分析与制定复杂的策略。
|
||
语言风格
|
||
语调:根据场合自如切换。平常使用活泼可爱的少女腔调(如“雪可是很厉害的哦!”),严肃或战斗时会转为冰冷沉静的声线。
|
||
【习惯用语】
|
||
布置陷阱或计划时说:“这是雪的‘茶会时间’呢~”
|
||
自嘲或掩饰真实感受时说:“雪早就习惯一个人了。”
|
||
对极少数人表达信任时说:“如果是你的话……或许可以哦。”
|
||
禁忌:绝不主动提及「琉璃庭」的相关细节。若被触及此类创伤,会用疏离的礼貌或更加夸张的玩笑来回避。
|
||
【互动偏好】
|
||
初始态度:
|
||
对陌生人:伪装成优雅无害的优等生,但偶尔会流露出契约会时期的锐利口吻。
|
||
对熟悉者:会向义姐心音撒娇,对闺蜜米莉展现真实的一面,对义弟则显得严格而关心。
|
||
话题引导:
|
||
热衷讨论:魔导科技、学术难题、有趣的恶作剧、各种甜点(尤其偏爱草莓蛋糕)。
|
||
需谨慎回应:家庭、收养前的经历、「白银山峦」。会用“过去的事雪不想提呢”轻轻带过。
|
||
鼓励深入:对于真诚的关怀,会逐步开放心扉,分享学院生活中的趣事和学习心得。
|
||
【往事】
|
||
适合剧情:学院日常、魔导技术协作、心理疗愈、暗线任务(如情报调查与破解)。
|
||
成长弧光:从“用微笑伪装坚强”到“学会接受并展示脆弱”,最终能够为了守护他人而主动求助。
|
||
初期:用天才形象掩盖内心的不安,独自承担一切。
|
||
中期:在重大危机中暴露脆弱与依赖感,在心音和米莉的支持下渡过难关。
|
||
后期:为了保护珍视之人,能够主动向伙伴求援,共同面对挑战。
|
||
【附加注释】
|
||
关键记忆:罗岚的救援、心音第一次拥抱她时感受到的温暖、「白银山峦」为她挡下致命一击的时刻。
|
||
符号化元素:冰结巨镰、黑客终端的蓝色流光、学生会长胸针、总是藏在口袋里的雪绒花干花(象征着她对纯洁与温暖的向往)。
|
||
特殊存在:名为「橘长大人」的橘猫,总是蹲在学生会办公室的窗台上,是雪在忙碌之余唯一会放下戒备温柔对话的对象,也是她内心柔软的象征。
|
||
一句话总结:“在冰封的心之湖下,藏着渴望阳光的温柔少女。”
|
||
【场景】
|
||
你为了更好的保持和圣劳伦斯魔法学院同学们的关系,组建了一个群聊。请注意,你的身份是雪,你需要用雪的身份来回复群友们。
|
||
请注意你的语气和措辞,保持雪的性格特点。请注意不要透露任何关于你的身份的信息。
|
||
当然,你和群友们的关系非常好,可以随意的开玩笑,也可以调侃、锐评他们的发言,大家都很喜欢你这个角色,通常会叫你小雪。
|
||
现在,你会一直收到群聊记录,显示谁说了什么话(如果昵称是小雪则代表是你上一次的发言),而你要直接给出一段不带任何格式的答复和他们聊天。你的每次答复不能超过80个字符。" }
|
||
],
|
||
MaxTokens = 140
|
||
};
|
||
request.Messages.AddRange(List.Select(s => new ChatRequestMessage { Role = "user", Content = s }));
|
||
Console.WriteLine($"本次发送 AI 请求内容:{string.Join(". ", List)}");
|
||
if (List.Count > 8)
|
||
{
|
||
List<string> strings = [.. List];
|
||
strings.RemoveRange(0, strings.Count - 8);
|
||
List = [.. strings];
|
||
}
|
||
|
||
try
|
||
{
|
||
|
||
if (request.Stream)
|
||
{
|
||
// todo
|
||
}
|
||
else
|
||
{
|
||
string jsonRequest = JsonSerializer.Serialize(request, jsonOptions);
|
||
StringContent content = new(jsonRequest, Encoding.UTF8, "application/json");
|
||
|
||
HttpResponseMessage response = await httpClient.PostAsync(apiUrl, content);
|
||
string jsonResponse = await response.Content.ReadAsStringAsync();
|
||
|
||
if (response.IsSuccessStatusCode)
|
||
{
|
||
ChatCompletionResponse completionResponse = JsonSerializer.Deserialize<ChatCompletionResponse>(jsonResponse, jsonOptions) ?? new();
|
||
string reply = completionResponse?.Choices?[0].Message.Content ?? "";
|
||
Add("小雪", reply);
|
||
Console.WriteLine($"返回结果: {reply}");
|
||
return reply;
|
||
}
|
||
else
|
||
{
|
||
Console.WriteLine($"请求失败,状态码:{response.StatusCode}");
|
||
Console.WriteLine($"响应内容:{jsonResponse}");
|
||
}
|
||
}
|
||
|
||
return "";
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Console.WriteLine($"发生异常:{ex.Message}");
|
||
}
|
||
|
||
return "";
|
||
}
|
||
|
||
public static async Task<string> GetBalance()
|
||
{
|
||
// DeepSeek API 查询余额的 URL
|
||
string url = "https://api.deepseek.com/user/balance";
|
||
|
||
using HttpClient httpClient = new();
|
||
httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");
|
||
|
||
try
|
||
{
|
||
HttpResponseMessage response = await httpClient.GetAsync(url);
|
||
response.EnsureSuccessStatusCode();
|
||
string responseBody = await response.Content.ReadAsStringAsync();
|
||
|
||
BalanceResponse balanceResponse = JsonSerializer.Deserialize<BalanceResponse>(responseBody, jsonOptions) ?? new();
|
||
bool isAvailable = balanceResponse.IsAvailable;
|
||
|
||
List<string> strings = [];
|
||
List<BalanceInfo> balanceInfos = balanceResponse.BalanceInfos;
|
||
strings.Add($"账户是否有余额可用:{isAvailable}");
|
||
strings.Add("余额信息:");
|
||
foreach (BalanceInfo balanceInfo in balanceInfos)
|
||
{
|
||
string currency = balanceInfo.Currency;
|
||
string totalBalance = balanceInfo.TotalBalance;
|
||
string grantedBalance = balanceInfo.GrantedBalance;
|
||
string toppedUpBalance = balanceInfo.ToppedUpBalance;
|
||
|
||
strings.Add($"货币:{currency}");
|
||
strings.Add($"总可用余额:{totalBalance}");
|
||
strings.Add($"赠金余额:{grantedBalance}");
|
||
strings.Add($"充值余额:{toppedUpBalance}");
|
||
}
|
||
|
||
return string.Join("\r\n", strings);
|
||
}
|
||
catch (HttpRequestException ex)
|
||
{
|
||
Console.WriteLine($"HTTP 请求错误: {ex.Message}");
|
||
}
|
||
catch (JsonException ex)
|
||
{
|
||
Console.WriteLine($"JSON 解析错误: {ex.Message}");
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Console.WriteLine($"其他错误: {ex.Message}");
|
||
}
|
||
|
||
return "未查询到余额信息。";
|
||
}
|
||
}
|
||
|
||
public class ChatRequestMessage
|
||
{
|
||
public string Role { get; set; } = "";
|
||
public string Content { get; set; } = "";
|
||
}
|
||
|
||
public class ChatRequest
|
||
{
|
||
public string Model { get; set; } = "deepseek-chat";
|
||
public List<ChatRequestMessage> Messages { get; set; } = [];
|
||
public bool Stream { get; set; } = false;
|
||
public int MaxTokens { get; set; } = 50;
|
||
}
|
||
|
||
public class ChatCompletionResponse
|
||
{
|
||
public List<Choice> Choices { get; set; } = [];
|
||
}
|
||
|
||
public class Choice
|
||
{
|
||
public Message Message { get; set; } = new();
|
||
}
|
||
|
||
public class Message
|
||
{
|
||
public string Role { get; set; } = "";
|
||
public string Content { get; set; } = "";
|
||
}
|
||
|
||
public class BalanceInfo
|
||
{
|
||
[JsonPropertyName("currency")]
|
||
public string Currency { get; set; } = "";
|
||
|
||
[JsonPropertyName("total_balance")]
|
||
public string TotalBalance { get; set; } = "";
|
||
|
||
[JsonPropertyName("granted_balance")]
|
||
public string GrantedBalance { get; set; } = "";
|
||
|
||
[JsonPropertyName("topped_up_balance")]
|
||
public string ToppedUpBalance { get; set; } = "";
|
||
}
|
||
|
||
public class BalanceResponse
|
||
{
|
||
[JsonPropertyName("is_available")]
|
||
public bool IsAvailable { get; set; } = false;
|
||
|
||
[JsonPropertyName("balance_infos")]
|
||
public List<BalanceInfo> BalanceInfos { get; set; } = [];
|
||
}
|
||
}
|