// SDK 无关的适配层支持类型。
//
// 具体 SDK 的适配代码在 workspace 成员里(adapters/llm_mb、adapters/mizchi_llm、
// adapters/moonllm),它们各自只依赖对应的 SDK,因此不会把任何 SDK 依赖带进主库。
///|
/// 一个工具调用在本次 SDK 事件中产生的更新。
///
/// `key` 让消费者把事件路由到正确的预览树;`result` 只在该调用已经根据
/// SDK 的终止原因完成收尾时出现。
pub(all) struct CallUpdate {
key : @session.CallKey
events : Array[@moonstream.Event]
result : @moonstream.FinishResult?
/// 本次收尾失败的原始错误;失败时 result 为 None。
failure : @session.SessionError?
} derive(Eq, ToJson, Debug)
///|
/// 构造仍在进行中的调用更新。
pub fn CallUpdate::delta(
key : @session.CallKey,
events : Array[@moonstream.Event],
) -> CallUpdate {
{ key, events, result: None, failure: None }
}
///|
/// 构造已经结束的调用更新,保留 `finish` 产生的收尾事件。
pub fn CallUpdate::finished(
key : @session.CallKey,
events : Array[@moonstream.Event],
result : @moonstream.FinishResult,
) -> CallUpdate {
{ key, events, result: Some(result), failure: None }
}
///|
/// 逐调用收尾;一个调用的错误不会阻止后续调用完成。
pub fn finish_open(
session : @session.Session,
reason : @moonstream.EndReason,
) -> Array[CallUpdate] {
let updates = []
for key in session.open_calls() {
try session.finish(key, reason~) catch {
error =>
updates.push({ key, events: [], result: None, failure: Some(error) })
} noraise {
(events, result) =>
updates.push(CallUpdate::finished(key, events, result))
}
}
updates
}
///|
/// 适配层处理一个 SDK 事件后的结果。
pub(all) enum AdapterOutcome {
/// 该事件没有产生工具参数状态变化。
Ignored
/// 一个 SDK 事件可能同时更新或结束多个工具调用。
Updates(updates~ : Array[CallUpdate])
} derive(Eq, ToJson, Debug)
///|
/// 本次产生的、带调用身份的更新(`Ignored` 时为空)。
pub fn AdapterOutcome::updates(self : AdapterOutcome) -> Array[CallUpdate] {
match self {
Ignored => []
Updates(updates~) => updates
}
}