Register cf-voice model via task assignments so Avocet Assignments UI can manage it #28

Open
opened 2026-05-13 10:02:50 -07:00 by pyr0ball · 0 comments
Owner

Background

cf-orch #60 shipped the three-layer task-model assignment system and POST /api/inference/task. The Avocet Assignments UI now lets operators assign models to product tasks cluster-wide.

Spec: circuitforge-plans/circuitforge-orch/superpowers/specs/2026-05-13-task-model-assignments-design.md

Current state

Linnet already integrates with cf-orch for session lifecycle: app/config.py reads CF_ORCH_URL and uses the coordinator to allocate cf-voice sidecars per session. The app/api/audio.py forwards audio chunks to the allocated cf-voice URL for SER (speech emotion recognition) inference.

However, the specific voice model used by cf-voice is not managed through the assignment layer — it is selected by the cf-voice service itself (or by node catalog defaults).

What to do

1. Register linnet.tone_annotation in assignments.yaml

linnet:
  tone_annotation:
    model_id: <wav2vec2-emotion-model-slug>
    description: Real-time speech emotion recognition (SER) for tone annotation
  stt:
    model_id: <whisper-model-slug>
    description: Speech-to-text transcription (if STT is routed through cf-orch)

This lets Avocet operators see which voice model is assigned to Linnet sessions and switch it without editing env vars or restarting containers.

2. Evaluate: should session allocation use the assigned model?

Currently cf-orch allocates a cf-voice sidecar by service type. With task assignments, the coordinator can look up linnet.tone_annotation and prefer a node that has that specific model available. This improves placement accuracy when multiple nodes have different voice models loaded.

If the coordinator session allocation path (POST /api/sessions or equivalent) can accept a task parameter, plumb it through from app/api/sessions.py.

3. Backwards compatibility

The existing cf-orch sidecar allocation flow is not affected if no task parameter is passed. Additions are opt-in.

Acceptance Criteria

  • assignments.yaml has linnet.tone_annotation entry with the correct model slug
  • Avocet Assignments UI shows linnet tasks in the deployment status view
  • (Stretch) Session allocation prefers nodes where the assigned model is present
  • cf-orch #60 (task-model assignment layer)
  • app/config.py (CF_ORCH_URL, CF_VOICE_URL)
  • app/api/audio.py (cf-voice forwarding)
  • app/api/sessions.py (session/sidecar allocation)
  • circuitforge-plans/circuitforge-orch/superpowers/specs/2026-05-13-task-model-assignments-design.md
## Background cf-orch #60 shipped the three-layer task-model assignment system and `POST /api/inference/task`. The Avocet Assignments UI now lets operators assign models to product tasks cluster-wide. Spec: `circuitforge-plans/circuitforge-orch/superpowers/specs/2026-05-13-task-model-assignments-design.md` ## Current state Linnet already integrates with cf-orch for session lifecycle: `app/config.py` reads `CF_ORCH_URL` and uses the coordinator to allocate cf-voice sidecars per session. The `app/api/audio.py` forwards audio chunks to the allocated cf-voice URL for SER (speech emotion recognition) inference. However, the specific voice model used by cf-voice is not managed through the assignment layer — it is selected by the cf-voice service itself (or by node catalog defaults). ## What to do ### 1. Register `linnet.tone_annotation` in `assignments.yaml` ```yaml linnet: tone_annotation: model_id: <wav2vec2-emotion-model-slug> description: Real-time speech emotion recognition (SER) for tone annotation stt: model_id: <whisper-model-slug> description: Speech-to-text transcription (if STT is routed through cf-orch) ``` This lets Avocet operators see which voice model is assigned to Linnet sessions and switch it without editing env vars or restarting containers. ### 2. Evaluate: should session allocation use the assigned model? Currently cf-orch allocates a cf-voice sidecar by service type. With task assignments, the coordinator can look up `linnet.tone_annotation` and prefer a node that has that specific model available. This improves placement accuracy when multiple nodes have different voice models loaded. If the coordinator session allocation path (`POST /api/sessions` or equivalent) can accept a `task` parameter, plumb it through from `app/api/sessions.py`. ### 3. Backwards compatibility The existing cf-orch sidecar allocation flow is not affected if no task parameter is passed. Additions are opt-in. ## Acceptance Criteria - [ ] `assignments.yaml` has `linnet.tone_annotation` entry with the correct model slug - [ ] Avocet Assignments UI shows linnet tasks in the deployment status view - [ ] (Stretch) Session allocation prefers nodes where the assigned model is present ## Related - cf-orch #60 (task-model assignment layer) - `app/config.py` (CF_ORCH_URL, CF_VOICE_URL) - `app/api/audio.py` (cf-voice forwarding) - `app/api/sessions.py` (session/sidecar allocation) - `circuitforge-plans/circuitforge-orch/superpowers/specs/2026-05-13-task-model-assignments-design.md`
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Circuit-Forge/linnet#28
No description provided.