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;
}
}
}