mirror of
https://github.com/DayuanJiang/next-ai-draw-io.git
synced 2026-01-02 14:22:28 +08:00
refactor: extract system prompts and add extended prompt for Opus/Haiku 4.5 (#71)
- Extract system prompts to dedicated lib/system-prompts.ts module - Add extended system prompt (~4000 tokens) for models with higher cache minimums (Opus 4.5, Haiku 4.5) - Clean up debug logs while preserving informational and cache-related logs - Improve code formatting and organization in chat route
This commit is contained in:
53
lib/utils.ts
53
lib/utils.ts
@@ -176,6 +176,37 @@ export function replaceNodes(currentXML: string, nodes: string): string {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a character count dictionary from a string
|
||||
* Used for attribute-order agnostic comparison
|
||||
*/
|
||||
function charCountDict(str: string): Map<string, number> {
|
||||
const dict = new Map<string, number>();
|
||||
for (const char of str) {
|
||||
dict.set(char, (dict.get(char) || 0) + 1);
|
||||
}
|
||||
return dict;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compare two strings by character frequency (order-agnostic)
|
||||
*/
|
||||
function sameCharFrequency(a: string, b: string): boolean {
|
||||
const trimmedA = a.trim();
|
||||
const trimmedB = b.trim();
|
||||
if (trimmedA.length !== trimmedB.length) return false;
|
||||
|
||||
const dictA = charCountDict(trimmedA);
|
||||
const dictB = charCountDict(trimmedB);
|
||||
|
||||
if (dictA.size !== dictB.size) return false;
|
||||
|
||||
for (const [char, count] of dictA) {
|
||||
if (dictB.get(char) !== count) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace specific parts of XML content using search and replace pairs
|
||||
* @param xmlContent - The original XML string
|
||||
@@ -275,6 +306,28 @@ export function replaceXMLParts(
|
||||
}
|
||||
}
|
||||
|
||||
// Fourth try: character frequency match (attribute-order agnostic)
|
||||
// This handles cases where the model generates XML with different attribute order
|
||||
if (!matchFound) {
|
||||
for (let i = startLineNum; i <= resultLines.length - searchLines.length; i++) {
|
||||
let matches = true;
|
||||
|
||||
for (let j = 0; j < searchLines.length; j++) {
|
||||
if (!sameCharFrequency(resultLines[i + j], searchLines[j])) {
|
||||
matches = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (matches) {
|
||||
matchStartLine = i;
|
||||
matchEndLine = i + searchLines.length;
|
||||
matchFound = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!matchFound) {
|
||||
throw new Error(`Search pattern not found in the diagram. The pattern may not exist in the current structure.`);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user