diff --git a/studio/backend/core/inference/llama_cpp.py b/studio/backend/core/inference/llama_cpp.py index b5d5328fb0..a25ed0889a 100644 --- a/studio/backend/core/inference/llama_cpp.py +++ b/studio/backend/core/inference/llama_cpp.py @@ -1042,6 +1042,10 @@ class LlamaCppBackend: @property def supports_tools(self) -> bool: + # DiffusionGemma serves via the visual runner, whose live per-step canvas + # frames are dropped by the agentic tool loop; never route it through tools. + if self._is_diffusion: + return False return self._supports_tools @property @@ -2523,6 +2527,10 @@ class LlamaCppBackend: ] env = child_env_without_native_path_secret() + # `python -m unsloth_zoo.diffusion_studio.shim` imports unsloth_zoo, which + # refuses to load unless UNSLOTH_IS_PRESENT is set (normally by `import + # unsloth`). The shim never imports unsloth, so set it here as unsloth does. + env["UNSLOTH_IS_PRESENT"] = "1" env["DG_VISUAL_BIN"] = visual_bin env["DG_GPU"] = gpu # The file-override shim imports its sibling visual_engine; put its dir on PYTHONPATH. diff --git a/studio/frontend/src/components/assistant-ui/markdown-text.tsx b/studio/frontend/src/components/assistant-ui/markdown-text.tsx index 45a0082a57..61b97e619f 100644 --- a/studio/frontend/src/components/assistant-ui/markdown-text.tsx +++ b/studio/frontend/src/components/assistant-ui/markdown-text.tsx @@ -285,11 +285,14 @@ function CodeBlockActions({ } // DiffusionGemma renders its denoising live in the bubble (see DiffusionCanvas in -// thread.tsx), so it no longer forces HTML into an iframe artifact; it follows the -// same artifact rules as every other model. +// thread.tsx) and has the artifacts canvas on by default, so a full-HTML answer +// (e.g. a playable game) renders as an interactive card without the global toggle. function StreamdownBlock(props: BlockProps) { const shouldCollapseHtmlArtifacts = useChatRuntimeStore( - (state) => state.artifactsEnabled || state.collapseHtmlArtifacts, + (state) => + state.artifactsEnabled || + state.collapseHtmlArtifacts || + state.loadedIsDiffusion, ); const messageHasRenderableRenderHtmlTool = useAuiState(({ message }) => message.parts.some(isRenderableRenderHtmlToolPart),