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 }