using System.Collections;
using XFEExtension.NetCore.Exceptions;
using XFEExtension.NetCore.XFEChatGPT.ChatGPTInnerClass.DefaultClass;
namespace XFEExtension.NetCore.XFEChatGPT.ChatGPTInnerClass.HelperClass;
///
/// GPT对话记录
///
public abstract class XFEGPTMemoryDialog : IEnumerable
{
private readonly Dictionary _gPTMessageWithId;
internal XFEGPTMemoryDialog()
{
_gPTMessageWithId = [];
}
#region 操作部分
///
/// 通过对话ID操作对话
///
/// 对话的ID
///
public XFEGPTMessageCollection this[string dialogId]
{
get
{
try
{
return _gPTMessageWithId[dialogId];
}
catch (Exception ex)
{
throw new XFEChatGPTException("查找指定ID的对话时出错!", ex);
}
}
set
{
try
{
_gPTMessageWithId[dialogId] = value;
}
catch (Exception ex)
{
throw new XFEChatGPTException("设置指定ID的对话时出错!", ex);
}
}
}
///
/// 添加一个对话记录
///
/// 对话ID
/// XFEGPT的对话
public void Add(string dialogId, XFEGPTMessageCollection xFEGPTMessages)
{
_gPTMessageWithId.Add(dialogId, xFEGPTMessages);
}
///
/// 添加多个对话记录
///
/// ID和XFEGPT的对话的键值对
public void AddRange(KeyValuePair[] messages)
{
foreach (var item in messages)
{
_gPTMessageWithId.Add(item.Key, item.Value);
}
}
///
/// 移除一个对话记录
///
/// 对话ID
public void Remove(string dialogId)
{
_gPTMessageWithId.Remove(dialogId);
}
///
/// 移除多个对话记录
///
/// 对话ID的数组
public void RemoveRange(string[] ids)
{
foreach (var item in ids)
{
_gPTMessageWithId.Remove(item);
}
}
///
/// 清空所有对话的对话记录
///
public void Clear()
{
_gPTMessageWithId.Clear();
}
///
/// 更新指定对话ID的对话记录
///
/// 对话ID
/// XFEGPT的对话
public void Update(string dialogId, XFEGPTMessageCollection messages)
{
_gPTMessageWithId[dialogId] = messages;
}
///
/// 实时更新对话记录
///
///
///
///
///
public void InstanceUpdate(string dialogId, string messageId, string nowMessage, bool clear)
{
var xFEGPTMessages = _gPTMessageWithId[dialogId];
if (xFEGPTMessages.GetXFEGPTMessageByMessageId(messageId) is null)
{
xFEGPTMessages.Add(new XFEGPTMessage(messageId, new GPTMessage("assistant", nowMessage)));
}
else
{
if (xFEGPTMessages.GetLastRole() == "system")
{
throw new XFEChatGPTException("系统消息无法更改");
}
if (clear)
{
xFEGPTMessages.GetXFEGPTMessageByMessageId(messageId)!.GPTMessage.Content = nowMessage;
}
else
{
xFEGPTMessages.GetXFEGPTMessageByMessageId(messageId)!.GPTMessage.Content += nowMessage;
}
}
}
#endregion
#region 获取部分
///
/// 判断是否包含某个对话
///
/// 对话ID
/// 是否含有该对话
public bool Contains(string dialogId)
{
return _gPTMessageWithId.ContainsKey(dialogId);
}
///
/// 获取对话记录
///
/// 对话ID
///
public XFEGPTMessageCollection GetXFEGPTMessages(string dialogId)
{
return _gPTMessageWithId[dialogId];
}
///
/// 获取迭代器
///
///
public IEnumerator GetEnumerator()
{
foreach (var item in _gPTMessageWithId)
{
foreach (var item2 in item.Value)
{
yield return item2;
}
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
#endregion
}