diff --git a/web/src/components/model-picker.tsx b/web/src/components/model-picker.tsx index a2f7d73e5..dbcfcd40a 100644 --- a/web/src/components/model-picker.tsx +++ b/web/src/components/model-picker.tsx @@ -226,7 +226,7 @@ export function ModelPicker({ theme={theme} creationVariant={creationVariant} showConfiguredModelName={showConfiguredModelName} - showPrice={creditsEnabled} + showPrice={showSelectedPrice && creditsEnabled} disabledReason={disabledReason} /> {selected ? : null} diff --git a/web/src/pages/create/creation-assets.ts b/web/src/pages/create/creation-assets.ts index eae9a4914..f32212106 100644 --- a/web/src/pages/create/creation-assets.ts +++ b/web/src/pages/create/creation-assets.ts @@ -1,6 +1,7 @@ import type { UploadedFile } from "@/services/file-storage"; import type { UploadedImage } from "@/services/image-storage"; import { canvasVideoAssetPreviewUrl } from "@/lib/canvas/canvas-media-preview"; +import { resolveResourceUrl } from "@/services/api/resources"; import type { ExternalAssetPickerReference } from "@/lib/plugins/plugin-types"; import type { Asset, AudioAsset, ImageAsset, NewAsset } from "@/stores/use-asset-store"; import type { ReferenceImage } from "@/types/image"; @@ -151,7 +152,7 @@ export function creationAttachmentFromDocument(file: File, uploaded: UploadedFil } export function creationAttachmentFromAsset(asset: ImageAsset): CreationAttachment { - const url = asset.data.dataUrl || asset.coverUrl; + const url = resolveResourceUrl(asset.data.storageKey, asset.data.dataUrl || asset.coverUrl); return { id: `asset:${asset.id}`, name: asset.title || "素材图片", diff --git a/web/src/pages/create/index.tsx b/web/src/pages/create/index.tsx index 8a79f351c..7041868cb 100644 --- a/web/src/pages/create/index.tsx +++ b/web/src/pages/create/index.tsx @@ -1,13 +1,14 @@ import { useCallback, useEffect, useMemo, useRef, useState, type ChangeEvent, type CSSProperties, type PointerEvent, type ReactNode, type RefObject } from "react"; import { App, Button, Drawer, Modal, Popover, Spin, Tooltip } from "antd"; import { Reorder } from "motion/react"; -import { ArrowDown, ArrowUp, Check, ChevronDown, ChevronLeft, ChevronRight, Clapperboard, Clock3, Copy, Download, FileText, Film, FolderOpen, History, Image as ImageIcon, LoaderCircle, Maximize2, MessageSquareText, Minimize2, Music2, Paperclip, Plus, RefreshCw, Search, SlidersHorizontal, Sparkles, Trash2, WandSparkles, X } from "lucide-react"; +import { ArrowDown, ArrowUp, Check, ChevronDown, ChevronLeft, ChevronRight, Clapperboard, Clock3, Copy, Download, FileText, Film, History, Image as ImageIcon, LoaderCircle, Maximize2, MessageSquareText, Minimize2, Music2, Paperclip, Plus, RefreshCw, Search, SlidersHorizontal, Sparkles, Trash2, WandSparkles, X } from "lucide-react"; import { Link } from "react-router"; import { AIMessageMarkdown } from "@/components/ai/ai-message-markdown"; import { GenerationToolCard, type GenerationToolStatus } from "@/components/ai/generation-tool-card"; import { MessageReasoning } from "@/components/ai/message-reasoning"; import { AssetLibraryPickerModal, type AssetLibraryPickerItem } from "@/components/assets/asset-library-picker-modal"; +import { CachedResourceImage } from "@/components/cached-resource-image"; import { CanvasResourceMentionTextarea } from "@/components/canvas/canvas-resource-mention-textarea"; import { CanvasPromptOptimizerDrawer } from "@/components/canvas/canvas-prompt-optimizer-drawer"; import { VoiceRecordingButton } from "@/components/conversation/voice-recording-button"; @@ -29,6 +30,7 @@ import { isGenerationTaskCancelled, runBackendGenerationTask, runBackendGenerati import { listAddedSkills, type Skill } from "@/services/api/skills"; import { subscribeGenerationTasks, type GenerationTask } from "@/services/api/task-center"; import { isLocalDreaminaWaitStopped, localDreaminaCancellationMessage } from "@/services/local-dreamina-task-projection"; +import { resolveResourceUrl } from "@/services/api/resources"; import { uploadMediaFile } from "@/services/file-storage"; import { uploadImage } from "@/services/image-storage"; import { consumeGenerationTaskMessage, generationTaskMaterializedUrls, materializeGenerationTaskAssets, projectGenerationTaskResult } from "@/services/project-asset-sync"; @@ -1086,7 +1088,9 @@ function CreationUserMessage({ item }: { item: CreationMessage }) { const kind = creationAttachmentKind(attachment); const previewable = kind === "image" || kind === "video"; const url = attachment.previewUrl || ("dataUrl" in attachment ? attachment.dataUrl : attachment.url) || ""; - return ; + const imageUrl = kind === "image" ? resolveResourceUrl(attachment.storageKey, url) : ""; + const previewUrl = kind === "image" ? imageUrl : url; + return ; })} : null} setPreviewUrl("")} /> ; @@ -1117,7 +1121,8 @@ function CreationMediaPending({ mode, ratio }: { mode: CreationMode; ratio?: str function CreationMessageReferences({ references }: { references: CreationReference[] }) { return
{references.map((reference) => { const Icon = reference.kind === "skill" ? Sparkles : reference.kind === "image" ? ImageIcon : reference.kind === "video" ? Film : reference.kind === "audio" ? Music2 : FileText; - return {reference.previewUrl && reference.kind === "video" ? ; + const imageUrl = reference.kind === "image" ? resolveResourceUrl(reference.storageKey, reference.previewUrl) : reference.previewUrl; + return {imageUrl && reference.kind === "video" ? ; })}
; } @@ -1133,9 +1138,11 @@ function CreationAttachmentThumbnail({ item, onPreview, onRemove }: { const kind = creationAttachmentKind(item); const previewable = kind === "image" || kind === "video"; const url = (kind === "video" ? item.url : item.previewUrl) || ""; - const content = kind === "video" ?