80b0d5fd34
feat: v0.9.0 — cf-text, pipeline crystallization engine, multimodal pipeline, a11y preferences
...
CI / test (push) Waiting to run
Mirror / mirror (push) Has been cancelled
Release — PyPI / release (push) Has been cancelled
Closes #33 , #37 , #38 , #41 , #42 .
## cf-text (closes #41 )
- New module: `circuitforge_core.text` — direct local inference bypassing ollama/vllm
- Backends: llama.cpp (GGUF), transformers (HF), mock
- Auto-detects backend from file extension; CF_TEXT_BACKEND env override
- Optional 4-bit/8-bit quantisation via bitsandbytes (CF_TEXT_4BIT / CF_TEXT_8BIT)
- process-level singleton + per-request `make_backend()` path
## Pipeline crystallization engine (closes #33 , #37 )
- FPGA→ASIC model: LLM-discovered paths → deterministic workflows after N approvals
- `models.py`: PipelineRun (incl. review_duration_ms + output_modified per #37 ),
CrystallizedWorkflow, Step, hash_input()
- `recorder.py`: append-only JSON run log under ~/.config/circuitforge/pipeline/
- `crystallizer.py`: threshold check, majority/most-recent step strategy,
rubber-stamp warning (review_duration_ms < 5s triggers warnings.warn)
- `registry.py`: exact + fuzzy match, deactivate-without-delete, colon-safe filenames
- `executor.py`: deterministic steps with transparent LLM fallback
## Multimodal chunked pipeline (closes #42 )
- `pipeline/multimodal.py`: cf-docuvision pages → cf-text streaming
- `run()` yields PageResult per page (progressive, no full-doc buffer)
- `stream()` yields (page_idx, token) tuples for token-level UI rendering
- `vram_serialise` flag + `swap_fn` hook for 8GB GPU VRAM management
- `prompt_fn` callback for product-specific prompt construction
## Accessibility preferences (closes #38 )
- `preferences/accessibility.py`: PREF_REDUCED_MOTION, PREF_HIGH_CONTRAST,
PREF_FONT_SIZE, PREF_SCREEN_READER with get/set helpers
- Exported from preferences package __init__
## LLM router fix
- cf-orch backends: skip reachability pre-check; allocation starts the service
- Static backends: reachability check remains in place
2026-04-08 23:17:18 -07:00
3075e5d3da
feat(tts): add cf-tts module with ChatterboxTurbo backend and FastAPI service
...
CI / test (push) Waiting to run
Mirror / mirror (push) Waiting to run
- TTSBackend Protocol + TTSResult dataclass (audio_bytes, sample_rate, duration_s, format)
- MockTTSBackend: silent WAV clip, no GPU required, Protocol assert at import
- ChatterboxTurboBackend: ResembleAI chatterbox-turbo via chatterbox-tts package
- from_local() loads model from snapshot dir
- audio_prompt voice cloning via temp file
- _encode_audio helper: OGG (default), WAV, MP3 via torchaudio
- circuitforge_core.tts module-level synthesize() singleton (CF_TTS_MODEL / CF_TTS_MOCK)
- FastAPI app: GET /health, POST /synthesize (multipart form, returns audio bytes)
- default format: ogg (smaller than WAV, no patents)
- X-Duration-S / X-Model / X-Sample-Rate response headers
- CLI: --model --port --host --gpu-id --mock
- pyproject.toml: tts-chatterbox + tts-service extras
- Sample rate: 24000 Hz (S3GEN_SR from chatterbox internals)
2026-04-08 23:15:05 -07:00
67493048e2
feat(stt): add cf-stt module — FasterWhisperBackend + managed FastAPI app
...
CI / test (push) Waiting to run
Mirror / mirror (push) Waiting to run
- STTBackend Protocol + STTResult/STTSegment frozen dataclasses (base.py)
- MockSTTBackend for CI/tests (no GPU needed, CF_STT_MOCK=1)
- FasterWhisperBackend: loads model once, thread-safe, VRAM estimate by model size
- app.py: FastAPI service runnable as managed process by cf-orch
POST /transcribe (multipart audio) → STTTranscribeResponse-compatible JSON
GET /health → {status, model, vram_mb}
- __init__.py: process-level singleton + transcribe() convenience fn
- pyproject.toml: stt-faster-whisper + stt-service optional dep groups
2026-04-08 22:14:46 -07:00
378d125ba6
ci: add Forgejo Actions workflows — CI, PyPI release, mirrors, cliff.toml ( closes #27 )
2026-04-05 20:51:18 -07:00
0a15ad9522
feat: add circuitforge_core.api.feedback — shared feedback router factory ( closes #23 )
...
Adds make_feedback_router(repo, product, demo_mode_fn) which returns a
FastAPI APIRouter with GET /status and POST / endpoints. Handles Forgejo
label creation/reuse, issue body assembly (including repro steps for bugs),
demo mode gating, and FORGEJO_API_TOKEN presence checks. 12 tests covering
all status/submit paths, mock Forgejo interaction, and body content assertions.
Also adds fastapi>=0.110 and httpx>=0.27 to [dev] optional deps.
2026-04-05 17:31:02 -07:00
c244260d1c
feat!: strip resources/ from MIT core — moves to circuitforge-orch (v0.8.0)
...
BREAKING CHANGE: circuitforge_core.resources is no longer available.
Import CFOrchClient from circuitforge_orch.client instead.
cf-orch CLI entry point is now in the circuitforge-orch package.
2026-04-04 22:34:27 -07:00
d16bc569cf
chore: bump version to 0.7.0 — affiliates + preferences modules
2026-04-04 18:28:52 -07:00
cb51ba72bc
feat: cf-orch Docker image + Forgejo CI pipeline
...
Dockerfile.orch — multi-mode image (coordinator | agent):
- coordinator: runs cf-orch coordinator on $CF_ORCH_PORT (default 7700)
- agent: connects to $CF_COORDINATOR_URL, serves $CF_AGENT_GPU_IDS
.forgejo/workflows/docker.yml — publishes on every vN.N.N tag:
- ghcr.io/circuit-forge/cf-orch:latest
- ghcr.io/circuit-forge/cf-orch:vX.Y.Z
- Layer cache via GHA cache backend
Closes #19 . Bumps to v0.6.0.
2026-04-03 09:10:29 -07:00
8d87ed4c9f
feat: manage.py cross-platform product manager ( closes #6 )
...
- circuitforge_core.manage module — replaces bash-only manage.sh
- config.py: ManageConfig from manage.toml (TOML via tomllib/tomli)
app name, default_url, docker compose_file/project, native services
Falls back to directory name when no manage.toml present
- docker_mode.py: DockerManager wrapping 'docker compose' (v2 plugin)
or 'docker-compose' (v1 fallback); docker_available() probe
Commands: start, stop, restart, status, logs, build
- native_mode.py: NativeManager with PID file process management
platformdirs for platform-appropriate PID/log paths
Windows-compatible log tailing (polling, no tail -f)
Cross-platform kill: SIGTERM→SIGKILL on Unix, taskkill /F on Windows
- cli.py: typer CLI — start/stop/restart/status/logs/build/open/install-shims
Mode auto-detection: Docker available + compose file → docker; else native
--mode docker|native|auto override
- templates/manage.sh: bash shim (conda, venv, python3 detection)
- templates/manage.ps1: PowerShell shim (same detection, Windows)
- templates/manage.toml.example: annotated config template
- __main__.py: python -m circuitforge_core.manage entry point
- pyproject.toml: manage extras group (platformdirs, typer)
cf-manage console script; version bumped to 0.5.0
- 36 tests: config (6), docker_mode (9), native_mode (21)
2026-04-02 23:04:35 -07:00
5801928f8e
feat(tasks): add shared VRAM-aware LLM task scheduler
...
Extract generic batch scheduler into circuitforge_core.tasks.scheduler
so any CircuitForge product can use it. Includes VRAM detection via
cf-orch coordinator (cooperative free-VRAM), preflight fallback, and
unlimited fallback; singleton API; full test coverage (12 tests).
2026-03-30 23:12:23 -07:00
db4e3047fd
fix(resources): address code review findings from final review
...
- eviction_engine: replace deprecated asyncio.get_event_loop() with
get_running_loop() (Python 3.12 compatibility)
- eviction_engine: remove unused httpx import
- coordinator app: return 422 for unknown node_id instead of silently
falling back to hardcoded localhost URL
- eviction_executor: guard against pid <= 0 to prevent accidental
SIGTERM to process group
- pyproject.toml: move pytest-asyncio to [dev] extras, not [orch]
- profile_registry: document CPU profile exclusion from list_public()
2026-03-30 22:46:07 -07:00
1f296c0cdb
feat(resources): add [orch] package extras, cf-orch entry point, Docker compose
2026-03-30 22:34:40 -07:00
d60503f059
feat(resources): add LeaseManager with VRAM tracking and eviction candidate selection
2026-03-30 20:38:51 -07:00
c4c9b78b91
feat: scaffold circuitforge-core package
2026-03-25 11:02:26 -07:00