fix: embedding params escape

main
jialin 7 months ago
parent 9295f9cef3
commit 3e76d7c321

@ -32,24 +32,60 @@ export function escapeDollarNumber(text: string) {
return escapedText;
}
export function escapeBrackets(text: string) {
const pattern =
/(```[\S\s]*?```|`.*?`)|\\\[([\S\s]*?[^\\])\\]|\\\((.*?)\\\)/g;
return text.replaceAll(
pattern,
(match, codeBlock, squareBracket, roundBracket) => {
if (codeBlock) {
return codeBlock;
} else if (squareBracket) {
return `$$${squareBracket}$$`;
} else if (roundBracket) {
return `$${roundBracket}$`;
}
return match;
}
export function escapeBrackets(text: string): string {
const codeRegex = /```[\s\S]*?```|`[^`\n]+`/g;
const codeBlocks: string[] = [];
const placeholder = '%%CODE_BLOCK%%';
// 1. replace code blocks with a placeholder
// and store them in an array
const temp = text.replace(codeRegex, (match) => {
codeBlocks.push(match);
return placeholder;
});
// 2. repace \[...\] with $$...$$and replace \(...\) with $...$
const replaced = temp
.replace(/\\\[([\s\S]*?)\\\]/g, (_, inner) => `$$${inner}$$`)
.replace(/\\\(([\s\S]*?)\\\)/g, (_, inner) => `$${inner}$`);
// 3. restore code blocks from the placeholder
let i = 0;
return replaced.replace(
new RegExp(placeholder, 'g'),
() => codeBlocks[i++] || ''
);
}
export function escapeMhchem(text: string) {
export function escapeMhchem_2(text: string) {
return text.replaceAll('$\\ce{', '$\\\\ce{').replaceAll('$\\pu{', '$\\\\pu{');
}
export function escapeMhchem(text: string): string {
const codeRegex = /```[\s\S]*?```|`[^`\n]+`/g;
const codeBlocks: string[] = [];
const placeholder = '%%CODE_BLOCK%%';
// 1. Replace code blocks with a placeholder
const temp = text.replace(codeRegex, (match) => {
codeBlocks.push(match);
return placeholder;
});
// 2. Only perform \ce{} / \pu{} escaping inside $...$ (to avoid incorrect escaping outside math environments)
const mathRegex = /\$(.+?)\$/gs;
const escaped = temp.replace(mathRegex, (_, content) => {
const fixed = content
.replace(/(?<!\\)\\ce\{/g, '\\\\ce{')
.replace(/(?<!\\)\\pu\{/g, '\\\\pu{');
return `$${fixed}$`;
});
// 3. Restore code blocks
let i = 0;
return escaped.replace(
new RegExp(placeholder, 'g'),
() => codeBlocks[i++] || ''
);
}

@ -276,10 +276,8 @@ const AddModal: FC<AddModalProps> = (props) => {
};
const handleOnSelectModelAfterEvaluate = (item: any) => {
console.log('handleOnSelectModelAfterEvaluate', item);
if (item.isGGUF) {
return;
}
setIsGGUF(item.isGGUF);
setSelectedModel(item);
const modelInfo = onSelectModel(item, props.source);
if (
evaluateStateRef.current.state === EvaluateProccess.model &&

@ -292,7 +292,8 @@ const ModelCard: React.FC<{
);
useEffect(() => {
if (!props.selectedModel) return;
console.log('ModelCard selectedModel changed', props.selectedModel);
if (!props.selectedModel.name) return;
getModelCardData();
setIsGGUFModel(props.selectedModel.isGGUF);

@ -343,7 +343,8 @@ const SearchModel: React.FC<SearchInputProps> = (props) => {
(item) => item.id === currentRef.current
);
if (currentItem) {
// if it is gguf, would trigger a evaluation after select a model file
if (currentItem && !currentItem.isGGUF) {
onSelectModelAfterEvaluate(currentItem);
}
} catch (error) {

@ -305,7 +305,6 @@ const MessageInput: React.FC<MessageInputProps> = forwardRef(
uid: updateUidCount(),
format: audioTypeMap[data.file.type] as AudioFormat,
base64: base64Audio.split(',')[1],
name: audioData.name,
data: _.pick(audioData, ['url', 'name', 'duration'])
}
]
@ -519,8 +518,8 @@ const MessageInput: React.FC<MessageInputProps> = forwardRef(
<AudioWrapper>
<SimpleAudio
url={message.audio?.[0].data?.url}
name={message.audio?.[0].name}
height={44}
name={message.audio?.[0].data?.name}
height={54}
onDelete={handleDeleteAudio}
></SimpleAudio>
</AudioWrapper>

@ -219,7 +219,7 @@ const MessageBody: React.FC<MessageBodyProps> = forwardRef(
url={data.audio?.[0]?.data.url}
name={data.audio?.[0]?.data.name}
actions={[]}
height={44}
height={54}
></SimpleAudio>
</AudioWrapper>
)}
@ -250,7 +250,7 @@ const MessageBody: React.FC<MessageBodyProps> = forwardRef(
url={data.audio?.[0]?.data.url}
name={data.audio?.[0]?.data.name}
onDelete={handleDeleteAudio}
height={44}
height={54}
></SimpleAudio>
</AudioWrapper>
)}

@ -19,7 +19,6 @@ export interface AudioData {
uid: string | number;
base64: string;
format: AudioFormat;
name?: string;
data: {
url: string;
name: string;

@ -1,5 +1,15 @@
import _ from 'lodash';
function toShellSafeMultilineJson(value: any): string {
const json = JSON.stringify(value, null, 2);
const escaped = json.replace(/'/g, `'\\''`);
return `${escaped}`;
}
function toShellSafeJson(value: any): string {
return JSON.stringify(value, null, 2).replace(/'/g, `'\\''`);
}
// curl format
export const formatCurlArgs = (
parameters: Record<string, any>,
@ -9,11 +19,13 @@ export const formatCurlArgs = (
return _.keys(parameters).reduce((acc: string, key: string) => {
const val = parameters[key];
const value =
typeof val === 'object' ? JSON.stringify(val, null, 2) : `${val}`;
typeof val === 'object'
? toShellSafeMultilineJson(val)
: `${toShellSafeJson(val)}`;
return acc + `-F ${key}="${value}" \\\n`;
}, '');
}
return `-d '${JSON.stringify(parameters, null, 2)}'`;
return `-d '${toShellSafeMultilineJson(parameters)}'`;
};
// python format

Loading…
Cancel
Save