import { splitTrailingAuthProfile } from "../agents/model-ref-profile.js" ;
import { escapeRegExp } from "../utils.js" ;
export function extractModelDirective(
body?: string,
options?: { aliases?: string[] },
): {
cleaned: string;
rawModel?: string;
rawProfile?: string;
rawRuntime?: string;
hasDirective: boolean ;
} {
if (!body) {
return { cleaned: "" , hasDirective: false };
}
const modelMatch = body.match(
/(?:^|\s)\/model(?=$|\s|:)\s*:?\s*([A-Za-z0-9 _.:@-]+(?:\/[A-Za-z0-9 _.:@-]+)*)?(?:\s+(?:--runtime|runtime=|harness=)\s*([A-Za-z0-9 _.:-]+))?/i,
);
const aliases = (options?.aliases ?? []).map((alias) => alias.trim()).filter(Boolean );
const aliasMatch =
modelMatch || aliases.length === 0
? null
: body.match(
new RegExp(
`(?:^|\\s)\\/(${aliases.map(escapeRegExp).join("|" )})(?=$|\\s|:)(?:\\s*:\\s*)?`,
"i" ,
),
);
const match = modelMatch ?? aliasMatch;
const raw = modelMatch ? modelMatch?.[1 ]?.trim() : aliasMatch?.[1 ]?.trim();
const rawRuntime = modelMatch?.[2 ]?.trim();
let rawModel = raw;
let rawProfile: string | undefined;
if (raw) {
const split = splitTrailingAuthProfile(raw);
rawModel = split.model;
rawProfile = split.profile;
}
const cleaned = match ? body.replace(match[0 ], " " ).replace(/\s+/g, " " ).trim() : body.trim();
return {
cleaned,
rawModel,
rawProfile,
rawRuntime,
hasDirective: !!match,
};
}
Messung V0.5 in Prozent C=99 H=99 G=98
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-06-10)
¤
*© Formatika GbR, Deutschland