8419ebd761
The last piece: a Dockerised desktop-GPU worker that talks to FC ONLY over HTTP (lease → fetch pixels → detect figures + CCIP-embed → submit), so Redis/Postgres stay private. New top-level agent/ (outside CI scope — verified by running it): - fc_agent/worker.py: the lease/compute/submit loop, concurrency 1, start/pause/ stop (stop frees the card; unprocessed leases expire + re-queue). - fc_agent/models.py: imgutils wrappers — detect_person (figures) + CCIP embed. The two API seams to verify against the installed dghs-imgutils (flagged). - fc_agent/media.py: stills + video frame sampling (ffmpeg) at FC's cadence → per-frame instances (the bag). - fc_agent/crops.py: vendored crop primitive. client.py: the FC HTTP client. - fc_agent/app.py: FastAPI localhost control UI (start/pause/stop + progress + queue depth). Dockerfile (CUDA + onnxruntime-gpu + ffmpeg) + requirements + README (token → build → run --gpus all → Start; CPU-fallback path). This completes the CCIP pipeline end to end: agent produces region CCIP vectors → RegionService stores → matcher suggests characters → rail. Verified by running on the desktop (not CI). README calls out the imgutils API + model-string checks. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ttrj5P7upUTueSfoJcxEqa
27 lines
1.2 KiB
Python
27 lines
1.2 KiB
Python
"""Agent config, all from env (the control container is configured at run)."""
|
|
import os
|
|
from dataclasses import dataclass
|
|
|
|
|
|
@dataclass
|
|
class Config:
|
|
fc_url: str # base URL of the FabledCurator web service
|
|
token: str # the bearer token from Settings → Tagging → GPU agent
|
|
agent_id: str # identifies this agent's leases
|
|
batch_size: int # jobs leased per round (concurrency is still 1)
|
|
ccip_model: str # imgutils CCIP model name ("" → imgutils default)
|
|
detector_level: str # imgutils person-detector level: n|s|m|x
|
|
poll_idle_seconds: float # wait between empty leases
|
|
|
|
@classmethod
|
|
def from_env(cls) -> "Config":
|
|
return cls(
|
|
fc_url=os.environ.get("FC_URL", "http://localhost:8000").rstrip("/"),
|
|
token=os.environ.get("FC_TOKEN", ""),
|
|
agent_id=os.environ.get("AGENT_ID", "desktop-agent"),
|
|
batch_size=int(os.environ.get("BATCH_SIZE", "4")),
|
|
ccip_model=os.environ.get("CCIP_MODEL", ""),
|
|
detector_level=os.environ.get("DETECTOR_LEVEL", "m"),
|
|
poll_idle_seconds=float(os.environ.get("POLL_IDLE_SECONDS", "10")),
|
|
)
|