feat: improve mindspace asset handling and local runtime paths
This commit is contained in:
+41
-5
@@ -4,10 +4,31 @@ import { stripUserAddressPrefix } from './userAddress';
|
||||
|
||||
const IMAGE_URL_LINE_RE = /^\[图片\d+]: (.+)$/;
|
||||
|
||||
function normalizeImageUrl(url: string): string {
|
||||
const value = String(url ?? '').trim();
|
||||
if (!value) return '';
|
||||
if (!/\/api\/mindspace\/v1\/assets\/[^/]+\/download\b/.test(value)) return value;
|
||||
|
||||
try {
|
||||
const parsed = value.startsWith('http://') || value.startsWith('https://')
|
||||
? new URL(value)
|
||||
: new URL(value, window.location.origin);
|
||||
if (parsed.searchParams.get('inline') === '1' && !parsed.searchParams.has('viewer')) {
|
||||
parsed.searchParams.set('viewer', '0');
|
||||
}
|
||||
return parsed.origin === window.location.origin
|
||||
? `${parsed.pathname}${parsed.search}${parsed.hash}`
|
||||
: parsed.toString();
|
||||
} catch {
|
||||
const separator = value.includes('?') ? '&' : '?';
|
||||
return /(?:\?|&)viewer=/.test(value) ? value : `${value}${separator}viewer=0`;
|
||||
}
|
||||
}
|
||||
|
||||
function formatImageUrlsForAgentText(urls: string[]): string {
|
||||
return urls
|
||||
.filter((url) => typeof url === 'string' && url.trim())
|
||||
.map((url, index) => `[图片${index + 1}]: ${url.trim()}`)
|
||||
.map((url, index) => `[图片${index + 1}]: ${normalizeImageUrl(url)}`)
|
||||
.join('\n');
|
||||
}
|
||||
|
||||
@@ -85,10 +106,13 @@ export function normalizeUserMessageForApi(message: Message): Message {
|
||||
|
||||
export function buildUserMessage(
|
||||
text: string,
|
||||
options?: { agentText?: string; displayText?: string; imageUrls?: string[] },
|
||||
options?: { agentText?: string; displayText?: string; imageUrls?: string[]; previewImageUrls?: string[] },
|
||||
): Message {
|
||||
const displayText = options?.displayText ?? text;
|
||||
const imageUrls = (options?.imageUrls ?? []).filter((value) => typeof value === 'string' && value.trim());
|
||||
const previewImageUrls = (options?.previewImageUrls ?? []).filter(
|
||||
(value) => typeof value === 'string' && value.trim(),
|
||||
);
|
||||
const baseAgentText = options?.agentText ?? text;
|
||||
const imageText = formatImageUrlsForAgentText(imageUrls);
|
||||
const agentText = [baseAgentText.trim(), imageText].filter(Boolean).join('\n\n');
|
||||
@@ -103,6 +127,7 @@ export function buildUserMessage(
|
||||
agentVisible: true,
|
||||
displayText,
|
||||
...(imageUrls.length ? { imageUrls } : {}),
|
||||
...(previewImageUrls.length ? { previewImageUrls } : {}),
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -169,16 +194,27 @@ export function getImageUrls(message: Message): string[] {
|
||||
const fromMetadata = message.metadata.imageUrls?.filter(
|
||||
(url) => typeof url === 'string' && url.trim(),
|
||||
);
|
||||
if (fromMetadata?.length) return fromMetadata;
|
||||
if (fromMetadata?.length) return fromMetadata.map(normalizeImageUrl);
|
||||
|
||||
const fromContent = readLegacyImageUrls(message.content);
|
||||
if (fromContent.length) return fromContent;
|
||||
if (fromContent.length) return fromContent.map(normalizeImageUrl);
|
||||
|
||||
const text = message.content
|
||||
.filter((item): item is Extract<MessageContent, { type: 'text' }> => item.type === 'text')
|
||||
.map((item) => item.text)
|
||||
.join('\n');
|
||||
return parseImageUrlsFromText(text);
|
||||
return parseImageUrlsFromText(text).map(normalizeImageUrl);
|
||||
}
|
||||
|
||||
export function getRenderableImageUrls(message: Message): Array<{ src: string; href: string }> {
|
||||
const imageUrls = getImageUrls(message);
|
||||
const previewImageUrls = message.metadata.previewImageUrls?.filter(
|
||||
(url) => typeof url === 'string' && url.trim(),
|
||||
) ?? [];
|
||||
return imageUrls.map((href, index) => ({
|
||||
href,
|
||||
src: previewImageUrls[index] || href,
|
||||
}));
|
||||
}
|
||||
|
||||
export function getSystemNotificationText(message: Message): string | null {
|
||||
|
||||
@@ -58,7 +58,7 @@ export function isImageAsset(asset: MindSpaceAsset) {
|
||||
|
||||
export function buildAssetImageUrl(asset: Pick<MindSpaceAsset, 'id' | 'updatedAt' | 'publicUrl'>) {
|
||||
if (asset.publicUrl) return asset.publicUrl;
|
||||
return `/api/mindspace/v1/assets/${asset.id}/download?inline=1&v=${asset.updatedAt}`;
|
||||
return `/api/mindspace/v1/assets/${asset.id}/download?inline=1&viewer=0&v=${asset.updatedAt}`;
|
||||
}
|
||||
|
||||
export function buildAbsoluteAssetImageUrl(
|
||||
|
||||
Reference in New Issue
Block a user