UNPKG

@sema-agent/core

Version:

Stateless, task-oriented AI agent core

104 lines (103 loc) • 3.89 kB
import { isProviderEchoShape, providerEchoReading } from "./errors.js"; import { inspectDegenerate } from "./repetition.js"; import { emitBrainTelemetry } from "./status-sink.js"; import { stampStreamDrops } from "../internal/llm.js"; export const STREAM_TORN_WARNING = "Connection closed mid-response. The response above may be incomplete."; export function echoFoldedWord(raw) { return isProviderEchoShape(raw) ? raw : "?"; } export function createStreamEndLedger() { let ignored; return { note(statement, word) { ignored = ignored === undefined ? { statement, word: echoFoldedWord(word), frames: 1 } : { ...ignored, frames: ignored.frames + 1 }; }, get ignored() { return ignored; }, }; } export function parseStreamedToolArgs(json, closed) { if (!json) return closed ? {} : undefined; let parsed; try { parsed = JSON.parse(json); } catch { return undefined; } if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return undefined; return parsed; } export function nameMissingCause(closed) { return closed ? "unnamed" : "truncated"; } export function placeTurnNotes(message, content, notes) { if (notes.length === 0) return; const at = content.findIndex((block) => block.type === "toolCall"); content.splice(at === -1 ? content.length : at, 0, ...notes.map(({ text }) => ({ type: "text", text }))); stampStreamDrops(message, notes); } export function truncationCauseClause(facts) { const { capStop, outputTokens, capTokens, terminalFrameSeen } = facts; if (capTokens !== undefined && (capStop || (outputTokens !== undefined && outputTokens >= capTokens))) { return `; request output cap in effect: ${capTokens} tokens — a cut mid-arguments commonly means the cap was hit`; } return terminalFrameSeen ? "" : "; the stream ended before its stop frame — the connection closed mid-response"; } const countOf = (v) => (typeof v === "number" && Number.isInteger(v) && v >= 0 ? v : undefined); export function modelOutputInvalidOf(drops, cap) { if (drops.truncated > 0) { const outputTokens = countOf(cap.outputTokens); const capTokens = countOf(cap.capTokens); return { cause: "truncated", outputLimit: { capStop: cap.capStop, ...(outputTokens !== undefined ? { outputTokens } : {}), ...(capTokens !== undefined ? { capTokens } : {}) } }; } return drops.unnamed > 0 ? { cause: "unnamed" } : undefined; } export function createRepetitionPoll() { let repCut; const repSpared = new Map(); return { get cut() { return repCut; }, get spared() { return [...repSpared.values()]; }, poll(text) { const insp = inspectDegenerate(text); for (const s of insp.spared) { const k = `${s.rule} ${s.segment}`; const prev = repSpared.get(k); if (prev === undefined) repSpared.set(k, s); else if (s.reps > prev.reps) prev.reps = s.reps; } if (insp.degenerate) repCut = insp.cut; return insp.degenerate; }, }; } const refusedModelCounted = new WeakSet(); export function noteResponseModel(partial, reported, requestedId) { const reading = providerEchoReading(reported); if (reading === "absent") return; if (reported === requestedId) { delete partial.responseModel; return; } if (reading === "refused") { if (!refusedModelCounted.has(partial)) { refusedModelCounted.add(partial); emitBrainTelemetry({ kind: "echo_dropped", field: "responseModel" }); } return; } partial.responseModel = reported; }