memory: distinguish a failed extraction from an empty one
Probing the extraction path with a real model call showed it returning a
zero-candidate outcome — indistinguishable from "the conversation had
nothing worth keeping". It was actually an auth failure delivered as a JSON
error body rather than a thrown error, which coerceText turned into an empty
string, which parseCandidates turned into an empty array.
extract() now reports `error` and a `rawText` preview instead of collapsing
every failure mode into `{candidates: []}`. An auth error arriving as a
return value rather than a throw is the common case, not the exotic one.
memory_inspect prints the error and the raw response, so this class of
failure now shows up instead of looking like a healthy extractor that
rarely fires.
Verified: thrown error, error object, empty string, and null each produce a
specific message; valid JSON and fenced JSON still parse.
This commit is contained in:
+11
-2
@@ -529,6 +529,7 @@ export default Plugin.define({
|
||||
const when = new Date(Number(extraction.at)).toISOString().slice(0, 19).replace("T", " ")
|
||||
lines.push(` 抽取:${when} → ${String(extraction.outcome)}`)
|
||||
if (extraction.reason) lines.push(` 原因:${String(extraction.reason)}`)
|
||||
if (extraction.reasonDetail) lines.push(` 细节:${String(extraction.reasonDetail)}`)
|
||||
if (extraction.model) lines.push(` 模型:${String(extraction.model)}`)
|
||||
} else {
|
||||
lines.push(
|
||||
@@ -537,6 +538,10 @@ export default Plugin.define({
|
||||
: " 抽取:已关闭(autoExtract: false)",
|
||||
)
|
||||
}
|
||||
if (extraction && extraction.error) {
|
||||
lines.push(` ⚠ 模型调用异常:${String(extraction.error)}`)
|
||||
if (extraction.rawText) lines.push(` 原始返回:${String(extraction.rawText).slice(0, 160)}`)
|
||||
}
|
||||
|
||||
return { content: lines.join("\n") }
|
||||
},
|
||||
@@ -755,10 +760,14 @@ async function runExtraction(
|
||||
}
|
||||
await noteDiag(ctx, "lastExtraction", {
|
||||
at: Date.now(),
|
||||
outcome: "no-candidates",
|
||||
reason: outcome.rejected.length ? "候选全部被去重或密钥拦截" : "抽取器认为没有值得记的东西",
|
||||
outcome: outcome.error ? "failed" : "no-candidates",
|
||||
...(outcome.error ? { reason: outcome.error } : {}),
|
||||
reasonDetail: outcome.rejected.length
|
||||
? "候选全部被去重或密钥拦截"
|
||||
: "抽取器认为没有值得记的东西",
|
||||
rejected: outcome.rejected.length,
|
||||
model: `${model.providerID}/${model.id}`,
|
||||
...(outcome.rawText ? { rawText: outcome.rawText } : {}),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user