openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
120 lines (119 loc) • 4.65 kB
JavaScript
import { c as normalizeOptionalString } from "./string-coerce-mnp54Vah.js";
import { _ as parseStrictFiniteNumber, j as resolveTimerTimeoutMs } from "./number-coercion-CJQ8TR--.js";
import "./number-coercion-Z7n6tXLk.js";
import "./gateway-startup-plugin-ids-3X_G47Qt.js";
import { i as buildModelAliasIndex, y as resolveModelRefFromString } from "./model-selection-shared-b32cUYts.js";
import { c as resolveDefaultModelForAgent } from "./model-selection-CA_65iXi.js";
import { o as requireApiKey } from "./model-auth-runtime-shared-ZF0jyHxm.js";
import { n as completeSimple } from "./stream-4H1GSjKe.js";
import "./model-auth-DVfmdW0b.js";
import "./provider-http-errors-DqaqQLLZ.js";
import { n as prepareSimpleCompletionModel } from "./simple-completion-runtime-BBvPbT7Q.js";
import "./directives-BaSUaNZN.js";
//#region src/tts/tts-core.ts
function resolveDefaultSummarizeTextDeps() {
return {
completeSimple,
prepareSimpleCompletionModel,
requireApiKey
};
}
function resolveSummaryModelRef(cfg, config) {
const defaultRef = resolveDefaultModelForAgent({ cfg });
const override = normalizeOptionalString(config.summaryModel);
if (!override) return {
ref: defaultRef,
source: "default"
};
const aliasIndex = buildModelAliasIndex({
cfg,
defaultProvider: defaultRef.provider
});
const resolved = resolveModelRefFromString({
raw: override,
defaultProvider: defaultRef.provider,
aliasIndex
});
if (!resolved) return {
ref: defaultRef,
source: "default"
};
return {
ref: resolved.ref,
source: "summaryModel"
};
}
function isTextContentBlock(block) {
return block.type === "text";
}
/** Summarize long text before synthesis using the configured summary model. */
async function summarizeText(params, deps = resolveDefaultSummarizeTextDeps()) {
const { text, targetLength, cfg, config, timeoutMs } = params;
if (targetLength < 100 || targetLength > 1e4) throw new Error(`Invalid targetLength: ${targetLength}`);
const startTime = Date.now();
const { ref } = resolveSummaryModelRef(cfg, config);
const prepared = await deps.prepareSimpleCompletionModel({
cfg,
provider: ref.provider,
modelId: ref.model,
useAsyncModelResolution: true
});
if ("error" in prepared) throw new Error(prepared.error);
const completionModel = prepared.model;
const apiKey = deps.requireApiKey(prepared.auth, ref.provider);
try {
const controller = new AbortController();
const resolvedTimeoutMs = resolveTimerTimeoutMs(timeoutMs, 1);
const timeout = setTimeout(() => controller.abort(), resolvedTimeoutMs);
try {
const summary = (await deps.completeSimple(completionModel, { messages: [{
role: "user",
content: `You are an assistant that summarizes texts concisely while keeping the most important information. Summarize the text to approximately ${targetLength} characters. Maintain the original tone and style. Reply only with the summary, without additional explanations.\n\n<text_to_summarize>\n${text}\n</text_to_summarize>`,
timestamp: Date.now()
}] }, {
apiKey,
maxTokens: Math.ceil(targetLength / 2),
temperature: .3,
signal: controller.signal
})).content.filter(isTextContentBlock).map((block) => block.text.trim()).filter(Boolean).join(" ").trim();
if (!summary) throw new Error("No summary returned");
return {
summary,
latencyMs: Date.now() - startTime,
inputLength: text.length,
outputLength: summary.length
};
} finally {
clearTimeout(timeout);
}
} catch (err) {
if (err.name === "AbortError") throw new Error("Summarization timed out", { cause: err });
throw err;
}
}
//#endregion
//#region src/tts/directive-number.ts
function isInDirectiveNumberRange(value, range) {
if (range.min !== void 0 && (range.minExclusive ? value <= range.min : value < range.min)) return false;
if (range.max !== void 0 && (range.maxExclusive ? value >= range.max : value > range.max)) return false;
return true;
}
/** Parse a numeric speech directive token and return provider overrides when policy allows it. */
function parseSpeechDirectiveNumberOverride(params) {
if (!params.ctx.policy.allowVoiceSettings) return { handled: true };
const value = parseStrictFiniteNumber(params.ctx.value);
if (value === void 0 || !isInDirectiveNumberRange(value, params.range)) return {
handled: true,
warnings: [params.warning(params.ctx.value)]
};
const nextOverride = { [params.overrideKey]: value };
return {
handled: true,
overrides: params.mergeCurrentOverrides ? {
...params.ctx.currentOverrides,
...nextOverride
} : nextOverride
};
}
//#endregion
export { summarizeText as n, parseSpeechDirectiveNumberOverride as t };