using System; using System.Collections.Generic; using System.Text.Json; namespace AI.Workflow { /// /// 工作流状态,在整个流程中唯一,我们使用它来负责节点之间传递数据,避免每个节点添加输入输出接口 /// public class WorkflowState : ICloneable { private readonly Dictionary _slots = new(); /// /// 关联的工作流 ID /// public string? WorkflowId { get; set; } /// /// 当前执行的节点 ID /// public string? CurrentNodeId { get; set; } /// /// 状态创建时间 /// public DateTime CreatedAt { get; set; } = DateTime.Now; /// /// 获取指定键的值 /// /// 值类型 /// 键名 /// /// 当键不存在时抛出 public T Get(string key) where T : class { if (!_slots.TryGetValue(key, out var value)) { throw new KeyNotFoundException($"Key '{key}' not found in workflow state"); } return (T)value; } /// /// 尝试获取指定键的值 /// /// 值类型 /// 键名 /// 输出值 /// 如果键存在返回 true,否则返回 false public bool TryGet(string key, out T? value) where T : class { if (_slots.TryGetValue(key, out var obj) && obj is T typedValue) { value = typedValue; return true; } value = null; return false; } /// /// 设置指定键的值 /// /// 值类型 /// 键名 /// 值 /// 当键或值为空时抛出 public void Set(string key, T value) where T : class { if (string.IsNullOrWhiteSpace(key)) { throw new ArgumentNullException(nameof(key), "Key cannot be null or whitespace"); } if (value == null) { throw new ArgumentNullException(nameof(value), "Value cannot be null"); } _slots[key] = value; } /// /// 检查指定键是否存在 /// /// 键名 /// 如果键存在返回 true public bool ContainsKey(string key) { return _slots.ContainsKey(key); } /// /// 移除指定键 /// /// 键名 /// 如果成功移除返回 true public bool Remove(string key) { return _slots.Remove(key); } /// /// 清空所有数据 /// public void Clear() { _slots.Clear(); } /// /// 获取所有键 /// /// 键集合 public IEnumerable GetKeys() { return _slots.Keys; } /// /// 克隆工作流状态 /// /// 新的工作流状态副本 public object Clone() { var json = JsonSerializer.Serialize(_slots); var copySlots = JsonSerializer.Deserialize>(json); var copy = new WorkflowState { WorkflowId = WorkflowId, CurrentNodeId = CurrentNodeId, CreatedAt = CreatedAt }; if (copySlots != null) { foreach (var kvp in copySlots) { copy._slots[kvp.Key] = kvp.Value; } } return copy; } } }