UNPKG

@sema-agent/core

Version:

Stateless, task-oriented AI agent core

78 lines (77 loc) • 2.81 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 parseStreamedToolArgs(json) { if (!json) return {}; 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 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"; } 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; }