Compare commits

...
Sign in to create a new pull request.

2 commits

Author SHA1 Message Date
Daniel Han
1c58c00b54 DiffusionGemma: set UNSLOTH_IS_PRESENT for the shim subprocess
A clean install could not run DiffusionGemma: the runner spawns
python -m unsloth_zoo.diffusion_studio.shim, and unsloth_zoo refuses to
import unless UNSLOTH_IS_PRESENT is set (normally by import unsloth). The
shim never imports unsloth, so the subprocess died with
'Please install Unsloth via pip install unsloth!' and the model load
failed with a 500. Set the flag in the runner child env, as unsloth does
on import.
2026-06-12 14:17:42 +00:00
Daniel Han
361854189a DiffusionGemma: disable tools, enable artifacts canvas by default
DiffusionGemma serves via the visual runner, which streams per-step
canvas frames so the answer resolves live in the bubble. The agentic
tool loop (generate_chat_completion_with_tools) does not forward those
frames, so whenever a tool pill (Search/Code) was on the live canvas
silently vanished while text still streamed. DiffusionGemma is not a
tool-calling target anyway, so report supports_tools=False for it: the
chat always takes the frame-forwarding path, and the Search/Code pills
disable themselves (a local model has no builtin web search either).

Also turn the artifacts canvas on by default for DiffusionGemma so a
full-HTML answer (e.g. a playable game) renders as an interactive
sandboxed card without the user flipping the global artifacts toggle.
2026-06-12 13:54:09 +00:00
2 changed files with 14 additions and 3 deletions

View file

@ -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.

View file

@ -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),