b74da996341dbbe21231fb9a3a9cb1e39354a3c2
5
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
95f24573e4 |
catalog: status: down for the 6 unreachable services; StatusT extended
Per althing thread 01KRCNSF0V5NDCKB34H663MXHS — the catalog declared
14 services but 6 of them aren't running on irv-ml1 (chatterbox,
index-tts, qwen3-tts, cosyvoice, voxtral, kyutai-tts; missing from
docker ps entirely). Without action, the asset-engine UI would
declare them as available and consumers would hit unreachable
endpoints.
asset-engine consumer chose option (1) of three I sketched: extend
StatusT with `down` and treat it identically to `catalog-deferred`
in the picker (greyed, non-clickable). Lightweight, declarative, no
runtime health-check machinery, easy to revert when services
return.
Changes:
- StatusT enum (in asset_engine/catalog.py — committed there
separately) extended from
Literal["ready", "catalog-deferred", "experimental"]
to
Literal["ready", "catalog-deferred", "experimental", "down"]
- 6 services flipped to status: down.
- CATALOG-CONTRACT.md: replaced the bare-enum status row with a
four-row sub-table that names each value's meaning AND its picker
behavior. `down` and `catalog-deferred` get the same UI treatment
but the tooltip text differentiates ("Catalog-deferred" vs
"Service down — temporarily unreachable on irv-ml1") so the
semantic distinction (design state vs fleet-ops state) is
preserved.
- CATALOG-CONTRACT.md versioning policy table: new row codifying
"extending an existing enum (StatusT, FieldTypeT, ResponseTypeT,
CategoryT) with a non-conflicting value, with the consumer
updated in the same coordinated change" → no catalog_version
bump. Explicit rule for future enum extensions.
- JSON Schema regenerated.
catalog_version stays at 1.
Operational note (not catalog-side): the down services likely got
reaped 13+ days ago per the docker timestamps when other unrelated
work was done on irv-ml1. Bringing them back is a deploy task
outside this commit's scope. Flip status: down → ready in this file
once each one's confirmed running.
|
||
|
|
f020049769 |
catalog: ace-step v5 — defaults audit against upstream Gradio UI
asset_engine consumer audited the entire ace-step entry's defaults and slider ranges against acestep/ui/components.py (althing thread 01KRCN0SHP9YJGQD58EE95DC5P). The catalog had been authored from documentation rather than from source; ten defaults were wrong and several slider ranges were either too narrow or impractically wide. Defaults changed (catalog -> upstream-authoritative): infer_step 20 -> 60 guidance_scale 7.5 -> 15.0 cfg_type cfg -> apg omega_scale 0.5 -> 10.0 guidance_interval 0.0 -> 0.5 guidance_interval_decay 1.0 -> 0.0 min_guidance_scale 1.0 -> 3.0 use_erg_tag false -> true use_erg_diffusion false -> true actual_seeds [42] -> [] (random per call) Slider ranges adopted from upstream where reasonable; bounded locally where upstream's range is so wide it's unusable as a UI slider: guidance_scale [1.0, 15.0] -> [0.0, 30.0] (upstream) guidance_scale_text [0.0, 15.0] -> [0.0, 10.0] (upstream) guidance_scale_lyric [0.0, 15.0] -> [0.0, 10.0] (upstream) lora_weight [0.0, 2.0] -> [-3.0, 3.0] (upstream) audio_duration [5.0, 600.0] -> [5.0, 240.0] (upstream max) omega_scale [0.0, 1.0] -> [-10.0, 30.0] (UI bound; upstream is [-100, 100]) min_guidance_scale [0.0, 10.0] -> [0.0, 20.0] (UI bound; upstream is [0, 200]) Verified empty-string actual_seeds path against the live pipeline source: pipeline_ace_step.py:set_seeds() falls through to torch.randint when manual_seeds is "" (string, no comma, not all digits). Smoked end-to-end: HTTP 200 in 11s, real WAV bytes back. Reproducibility gap honestly documented in the entry's reproducibility.notes and the actual_seeds field description: with the new default `actual_seeds: []`, the wrapper rolls a random seed inside the pipeline but doesn't capture or surface the chosen seed back through the response. Default-defaulted assets cannot be regenerated bit-exact; users requiring reproducibility must set actual_seeds explicitly. Wrapper enhancement to surface the chosen seed via X-Actual-Seeds header + a CatalogResponse.header_accessories schema field is the planned fix. ace-step bumped version 4 -> 5. catalog_version stays at 1 (no schema changes). Also added a "source-of-truth precedence" subsection to CATALOG-CONTRACT.md's service-authoring notes, codifying the read-order (Pydantic model > handler/pipeline code > Gradio UI > README). Three ace-step bugs in three rounds (missing field, wrong enums, stranded bytes, wrong defaults — really four) all share the same root cause: catalog authored from doc surfaces that lie by omission. |
||
|
|
52803d87f8 |
catalog-contract: section_groups + Field.section for progressive disclosure; ace-step v2
asset_engine consumer (althing thread 01KRCJF7NGMXYE9F62Q1A6KFD4)
needed structure for ace-step's 27-field form. Two additive Pydantic
changes — backward-compatible, no catalog_version bump per the
policy table:
- CatalogField.section: str | None = None
- CatalogService.section_groups: list[CatalogSectionGroup] = []
- new CatalogSectionGroup model: {id, label, hint?}
Validator: every Field.section value must reference a declared
section_groups[].id within the same service; section_groups[].id
values are unique. CATALOG-CONTRACT.md updated with both the new
service-fields row and a versioning-policy row covering
"add optional Field/Service keys -> no bump."
ace-step entry rewritten to use the new schema:
- bumped version 1 -> 2
- declared 6 section groups (basic / generation / conditioning /
a2a / lora / output) with hints
- tagged every field with a section
- added previously-missing checkpoint_path (required: true,
default: "/app/checkpoints" — the container's mount path).
Wrapper-side cleanup (default in infer-api.py) queued as
follow-up.
- changed lyrics from optional: true -> required: true with
default "" to match upstream's `lyrics: str` shape (empty
string satisfies it).
JSON Schema regenerated.
Pydantic-model side of this change lives in asset_engine at
src/asset_engine/catalog.py — committed there separately.
|
||
|
|
d3faeb0314 |
catalog-contract: add response-decomposition fields (audio_field, timestamps_field, audio_format_field)
asset_engine consumer needed to render kokoro-captioned, whose wire
shape is a JSON envelope carrying base64-encoded audio plus a
structured timestamps array. Modeling it as response.type=json
would force either a per-service-id renderer (forbidden by
brief §1.7) or extending the closed response-type vocabulary
(forbidden by brief §2.2 without a coordinated bump).
Resolution (per althing thread 01KRCF4W66X3): keep response.type
closed at the existing six values and decompose at the response
*field* level instead — the same flexibility seam already used by
mime / mime_from_field / output_field. Adds three optional keys:
- audio_field: JSON key holding base64-encoded audio bytes
- audio_format_field: JSON key holding the decoded audio MIME
- timestamps_field: JSON key holding a structured timestamps array
(independent of type, declared by any service emitting time-
aligned markers)
Validators in CatalogResponse enforce sane combinations:
- audio_field requires response.type=audio
- audio_field forbids mime_from_field
- audio_format_field requires audio_field
This is additive and backward-compatible — no catalog_version bump,
existing services parse unchanged. CATALOG-CONTRACT.md updated with
the new rows in the response-field table and a versioning-policy
row codifying that adding optional keys to response: doesn't bump.
kokoro-captioned re-shaped to use the new schema:
response:
type: audio
audio_field: audio
audio_format_field: audio_format
timestamps_field: timestamps
And marked status: experimental until the asset_engine consumer's
audio-with-timestamps renderer ships.
JSON Schema regenerated to reflect the new Pydantic shape.
Pydantic-model side of this change lives in the asset_engine repo
at src/asset_engine/catalog.py — committed there separately.
|
||
|
|
0157066d6e |
docs/asset-engine: promote services.yaml to first-class contract
Adds the supporting infra around the service catalog now that it has external consumers (the asset_engine UI being the first; CLIs, monitoring, other services may follow): - CATALOG-CONTRACT.md: the consumer-facing contract. Defines versioning policy (catalog_version vs per-service version), closed field-type and response-type vocabularies, recommended vendor+drift-check sync workflow, known-consumers list, service authoring notes. - services.schema.json: JSON Schema (draft 2020-12) for the catalog. Generated from the Pydantic model in ~/development/asset_engine/src/asset_engine/catalog.py via `uv run scripts/dump_schema.py --publish`. Lets non-Python consumers validate against the same shape. - services.yaml: adds catalog_version: 1 at the root and reframes the file's header to call out its first-class-contract status. Quotes a vibevoice label that contained an unescaped colon (caught by the asset_engine's strict YAML parser on first sync). |