Repository navigation
chore: bump version to 10.1.0 - #1270
Merged
Merged
Conversation
…nager entry Phase 1 of fal.ai audio generation. Adds AudioGenRequest + IAudioProviderAdapter, a FalAudioAdapter fronting the v1 fal audio models (stable-audio-25, cassetteai/*, lyria2), an AudioImportPipeline that branches AudioImporter load type on clip length, AssetGenProviders.Audio + an audio List row, and AssetGenJobManager.StartAudioGeneration. Also threads ModelGenRequest.Model (consumed in Phase 3). Compiles on the 2021.3 floor; adapter/import/e2e tests green. Claude-Session: https://claude.ai/code/session_01GCxmdd4qo7MG6J4M6WcT9Y
…wiring Phases 2-3. Adds a curated AssetGenModelCatalog (image/3D/audio models with price/duration/use-case metadata; defaults reference the adapter constants so the panel default equals what an omitted model resolves to). Adds the generate_audio MCP tool + CLI, threads a per-(kind,provider) selected-model pref so a GUI choice becomes the default generate_* uses when no model is passed, and makes Tripo/Meshy consume req.Model. Per-provider prefs (not per-type) so disjoint model lists never clobber. Compiles on 2021.3 floor; Python + adapter/catalog tests green. Claude-Session: https://claude.ai/code/session_01GCxmdd4qo7MG6J4M6WcT9Y
Phases 4-5. Extends the existing Asset Gen tab (no new window): per-provider 'Model' dropdowns on the image + 3D rows with price/duration/use-case metadata, a fal audio row (no key field — reuses the shared fal key) with a model dropdown and the Stable Audio license caveat, and a Refresh button that re-validates key presence + the curated catalog. Selecting a model writes the per-(kind,provider) pref that generate_* reads as its default. fal has no public list-models API, so Refresh is a curated re-validate (the plan's gated fallback), never a network fetch. Characterization tests assert the new builders + three-phase lifecycle. Claude-Session: https://claude.ai/code/session_01GCxmdd4qo7MG6J4M6WcT9Y
The provider row is a vertical (column) container, so the setting-dropdown-inline class's flex-grow:1 stretched the DropdownField vertically. Wrap the Model dropdown in a horizontal .setting-row with a .setting-label (matching the Format row) and use a label-less DropdownField. Verified live: all 5 model dropdowns now render at 18px inside setting-row containers instead of ~400px boxes. Claude-Session: https://claude.ai/code/session_01GCxmdd4qo7MG6J4M6WcT9Y
Visible tab label only; the internal assetgen-tab id (and all C# wiring) is unchanged. Claude-Session: https://claude.ai/code/session_01GCxmdd4qo7MG6J4M6WcT9Y
Wraps each category (3D Models / 2D Images / Sound) in its own darker rounded panel so they read as distinct blocks, and moves the per-provider key status (saved/not set) up into the header row to the right of the provider name — reclaiming a line per provider. Verified live: 3 panels (bg alpha 0.20), status inline in each header. Claude-Session: https://claude.ai/code/session_01GCxmdd4qo7MG6J4M6WcT9Y
Security (from a dynamic security audit of the branch): - H1: UnityWebRequestTransport disables auto-redirect on auth-bearing requests (redirectLimit=0) so a provider 3xx can't re-send the API key to a redirect host. - H2/P8: per-kind result-extension allowlist in AssetGenJobManager.WriteFile (+ defense-in-depth in the audio/image import pipelines) — a provider can no longer land a .cs/.asmdef/.meta/.asset under Assets/ (Editor RCE). - H3: ProviderHttp.RequireHost pins the submit URL and the provider-supplied response_url to https://queue.fal.run before the fal key is attached (both fal image + audio adapters). Correctness (from code review): - C1: Tripo image->3D now sends model_version. - C2/C3/C6/C10: FalAudioAdapter.BuildBody is catalog-driven — duration- required models (CassetteAI SFX/Music, Stable Audio) send a default duration when the caller passes 0 (fixes the default-input 422), fractional durations floor to >=1, Lyria stays prompt-only and its GUI no longer advertises a duration it ignores, and the clamp ceilings come from the catalog (no more duplicated 190/30/180). - C4: an unmapped fal poll status now fails fast instead of polling to the 600s timeout (both fal adapters). - C5: a stale/invalid selected-model pref is cleared on dropdown fallback. - C7: the audio fal-key status refreshes when the shared 2D fal key changes. Cleanup: extract AssetGenModelCatalog.ResolveModel (dedupes the model- resolution chain across the three generate tools) + DefaultModelId no-alloc. Verified: full EditMode suite 1166 tests, 0 failures (+19 new regression tests); 34 Python asset-gen tests pass. Claude-Session: https://claude.ai/code/session_015KYy51gwBuhDuLZXXoqc98
… docs - McpToolsSection: add the asset_gen -> "Asset Gen" group display name so the tool-group tab no longer falls back to the raw "Asset_gen". - Update the asset_gen group blurb (registry + CLI) to include audio gen. - Regenerate the tool reference docs from the Python registry: add the missing generate_audio.md and refresh the asset_gen landscape/index. Claude-Session: https://claude.ai/code/session_015KYy51gwBuhDuLZXXoqc98
…allowlist
- FalAudioAdapter.BuildBody: floor (not Math.Round) the clamped duration so
it never exceeds the requested value, then enforce >= 1 (banker's rounding
could round 2.5 -> 2 and could exceed the request).
- AssetGenJobManager.AllowedExtensionsFor: fail closed — an unexpected/unknown
job kind now allows nothing instead of falling through to the model
allowlist, so the RCE boundary never opens by default. Explicit cases for
model + marketplace.
- Tests: pin floor semantics (10.9 -> 10) and the fail-closed behavior
(unknown/null/empty kind -> not allowed).
Verified: EditMode 1167 tests / 0 failures + in-editor smoke (BuildBody(10.9)
-> duration=10; IsAllowed("bogus","glb")=false).
Claude-Session: https://claude.ai/code/session_015KYy51gwBuhDuLZXXoqc98
status / cancel / list_providers were near-identical across GenerateAudio,
GenerateImage and GenerateModel (differing only by a kind label + poll
interval), and NormalizeOutputFolder was a verbatim triple copy.
- New AssetGenToolHelpers.{Status,Cancel,ListProviders} — the three tools now
delegate, passing their kind label / poll interval.
- NormalizeOutputFolder moved to AssetGenPaths (it already lived on
TryGetAssetsFolder).
- Behaviour preserved (image `remove_background` arm kept; provider-list
filtering unchanged). Net -120 lines of duplication.
Verified: EditMode 1167 tests / 0 failures + in-editor smoke (audio/image/model
list_providers, status/cancel error paths, image remove_background all intact).
Claude-Session: https://claude.ai/code/session_015KYy51gwBuhDuLZXXoqc98
…9269843170 chore: sync main (v10.0.2) into beta
…panel feat(asset-gen): AI audio generation + shared model panel (hardened)
…283113713 chore: update Unity package to beta version 10.0.3-beta.2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Automated version bump to 10.1.0.