Skip to content

Commit e26dbe8

Browse files
committed
Release oída 0.6.0: grounded reasoning and model routing
Add evidence-grounded conversation, provider and model-role routing, local re-listening, host/cloud adapters, and RAM-aware settings. Harden persistence, transport, native capture, validation, CI, and Python distribution publishing.
1 parent 36ba6eb commit e26dbe8

96 files changed

Lines changed: 16612 additions & 400 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,68 @@ jobs:
1111
name: Python, Web, and macOS checks
1212
runs-on: macos-latest
1313
timeout-minutes: 20
14+
defaults:
15+
run:
16+
working-directory: oida
1417
steps:
15-
- name: Checkout
18+
- name: Checkout Oída
1619
uses: actions/checkout@v4
20+
with:
21+
path: oida
22+
23+
- name: Checkout Earworm
24+
uses: actions/checkout@v4
25+
with:
26+
repository: sonicfieldlabs/earworm
27+
path: earworm
28+
29+
- name: Checkout AKOÚŌ contract
30+
uses: actions/checkout@v4
31+
with:
32+
repository: sonicfieldlabs/akouo
33+
path: akouo
34+
35+
- name: Checkout Akousmata
36+
uses: actions/checkout@v4
37+
with:
38+
repository: sonicfieldlabs/akousmata
39+
path: akousmata
1740

1841
- name: Install uv
1942
uses: astral-sh/setup-uv@v5
2043

21-
# NOTE: the `akousma` dependency is an editable uv path source pointing at
22-
# ../earworm/packages/py-akousma. On a bare checkout this sync fails unless
23-
# the earworm repo is checked out as a sibling directory first.
2444
- name: Install Python dependencies
2545
run: uv sync --extra dev
2646

2747
# pytest collects the unittest.TestCase suite too; one runner is enough.
2848
- name: Run Python tests
29-
run: uv run pytest -q
49+
run: uv run pytest -q -W error::starlette.exceptions.StarletteDeprecationWarning
3050

3151
- name: Compile Python modules
3252
run: uv run python -m compileall -q oida harness bench_adapter scripts tests
3353

3454
- name: Check dashboard JavaScript
3555
run: node --check oida/static/app.js
3656

57+
- name: Build Python distributions and canonical dependency wheels
58+
run: |
59+
uv build
60+
mkdir -p "$RUNNER_TEMP/oida-wheels"
61+
uv build --wheel --out-dir "$RUNNER_TEMP/oida-wheels" ../akouo
62+
uv build --wheel --out-dir "$RUNNER_TEMP/oida-wheels" ../earworm/packages/py-akousma
63+
uv build --wheel --out-dir "$RUNNER_TEMP/oida-wheels" ../akousmata
64+
65+
- name: Smoke isolated Python wheel
66+
working-directory: ${{ runner.temp }}
67+
env:
68+
UV_FIND_LINKS: ${{ runner.temp }}/oida-wheels
69+
run: >-
70+
uv run --isolated --no-project
71+
--with "$GITHUB_WORKSPACE"/oida/dist/sonicfield_oida-*.whl
72+
python -c 'import importlib.resources as r; import oida, oida.reasoning.audio_router, oida.server; assert r.files("oida").joinpath("integration_assets", "codex", "README.md").is_file(); print(oida.__version__)'
73+
3774
- name: Build macOS shell
38-
working-directory: apps/macos
75+
working-directory: oida/apps/macos
3976
run: |
4077
swift build
4178
swift build -Xswiftc -strict-concurrency=complete
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
name: Publish Python stack
2+
3+
on:
4+
push:
5+
tags:
6+
- "v*"
7+
8+
permissions:
9+
contents: read
10+
11+
jobs:
12+
build:
13+
name: Build and verify distributions
14+
runs-on: ubuntu-latest
15+
steps:
16+
- name: Checkout Oída
17+
uses: actions/checkout@v4
18+
with:
19+
path: oida
20+
21+
- name: Checkout AKOÚŌ contract
22+
uses: actions/checkout@v4
23+
with:
24+
repository: sonicfieldlabs/akouo
25+
ref: v0.7.0
26+
path: akouo
27+
28+
- name: Checkout Earworm
29+
uses: actions/checkout@v4
30+
with:
31+
repository: sonicfieldlabs/earworm
32+
ref: v0.4.0
33+
path: earworm
34+
35+
- name: Checkout Akousmata
36+
uses: actions/checkout@v4
37+
with:
38+
repository: sonicfieldlabs/akousmata
39+
ref: v0.4.0
40+
path: akousmata
41+
42+
- name: Install uv
43+
uses: astral-sh/setup-uv@v5
44+
with:
45+
python-version: "3.12"
46+
47+
- name: Verify release tag and project version
48+
working-directory: oida
49+
run: |
50+
release_version="${GITHUB_REF_NAME#v}"
51+
project_version="$(uv version --short)"
52+
test "$release_version" = "$project_version"
53+
54+
- name: Build all canonical distributions
55+
run: |
56+
mkdir -p release/akouo release/akousma release/akousmata release/oida
57+
uv build --out-dir "$GITHUB_WORKSPACE/release/akouo" akouo
58+
uv build --out-dir "$GITHUB_WORKSPACE/release/akousma" earworm/packages/py-akousma
59+
uv build --out-dir "$GITHUB_WORKSPACE/release/akousmata" akousmata
60+
uv build --out-dir "$GITHUB_WORKSPACE/release/oida" oida
61+
62+
- name: Verify Oída wheel in an isolated environment
63+
run: |
64+
cd "$RUNNER_TEMP"
65+
uv run --isolated --no-project \
66+
--find-links "$GITHUB_WORKSPACE/release/akouo" \
67+
--find-links "$GITHUB_WORKSPACE/release/akousma" \
68+
--find-links "$GITHUB_WORKSPACE/release/akousmata" \
69+
--with "$GITHUB_WORKSPACE"/release/oida/sonicfield_oida-*.whl \
70+
python -c 'import oida, oida.server; print(oida.__version__)'
71+
72+
- name: Upload verified distributions
73+
uses: actions/upload-artifact@v4
74+
with:
75+
name: python-distributions
76+
path: release
77+
if-no-files-found: error
78+
retention-days: 7
79+
80+
publish:
81+
name: Publish verified stack to PyPI
82+
needs: build
83+
runs-on: ubuntu-latest
84+
environment: pypi
85+
permissions:
86+
contents: read
87+
id-token: write
88+
steps:
89+
- name: Download verified distributions
90+
uses: actions/download-artifact@v4
91+
with:
92+
name: python-distributions
93+
path: release
94+
95+
- name: Publish AKOÚŌ contract
96+
uses: pypa/gh-action-pypi-publish@release/v1
97+
with:
98+
packages-dir: release/akouo
99+
skip-existing: true
100+
101+
- name: Publish Akousma
102+
uses: pypa/gh-action-pypi-publish@release/v1
103+
with:
104+
packages-dir: release/akousma
105+
skip-existing: true
106+
107+
- name: Publish Akousmata
108+
uses: pypa/gh-action-pypi-publish@release/v1
109+
with:
110+
packages-dir: release/akousmata
111+
skip-existing: true
112+
113+
- name: Publish Oída
114+
uses: pypa/gh-action-pypi-publish@release/v1
115+
with:
116+
packages-dir: release/oida
117+
skip-existing: true

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
__pycache__/
66
*.py[cod]
77
.pytest_cache/
8+
.coverage
9+
.coverage.*
10+
coverage.xml
11+
htmlcov/
812
.ruff_cache/
913
.mypy_cache/
1014
*.egg-info/

CHANGELOG.md

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,72 @@
11
# Changelog
22

3+
## 0.6.0 - 2026-07-14
4+
5+
- **Installable Python release chain**: the public distribution is now
6+
`sonicfield-oida` because the shorter PyPI name belongs to an unrelated
7+
project; imports and CLIs remain `oida`. A tag-gated Trusted Publishing
8+
workflow builds, isolates, and publishes the canonical `akouo-contract`,
9+
`akousma`, `akousmata`, and Oída distributions without repository tokens.
10+
11+
- **Oída-owned reasoning layer**: event conversation now has a fixed prompt
12+
hierarchy, a whitelist-built evidence packet, and a strict response contract.
13+
Listening results remain immutable; answer blocks and hypotheses cite stable
14+
evidence refs, uncertainty stays explicit, and chain-of-thought is never part
15+
of the contract or stored audit data. Conversation records move to v0.2 with
16+
read compatibility for v0.1, one primary event anchor, and up to three
17+
explicitly selected comparison events.
18+
- **Choose what each model does**: Reasoning settings assign fast perception,
19+
deep perception, transcription, music analysis, conversation, and targeted
20+
re-listening independently. The
21+
shared dashboard manages provider/model selection and conversation profiles
22+
for tone, depth, initiative, focus, language, and bounded custom instructions.
23+
Profile text cannot override evidence, covenant, privacy, or output rules.
24+
- **Capability-aware audio model catalog**: embedded/local-host presets cover
25+
MOSS-Audio 8B, MOSS-Music 8B, MOSS Transcribe + Diarize, MiDashengLM,
26+
MiMo-Audio, Qwen3-Omni, Gemma 3n, and experimental Mellow. API presets cover
27+
Gemini 3.5 Flash, Alibaba Qwen Omni, NVIDIA Nemotron, and the OpenRouter free
28+
Nemotron route. Large Qwen/Nemotron targets are configuration-only and were
29+
not executed on this machine.
30+
- **RAM-aware routing**: settings report physical RAM, estimated peak local
31+
model memory, residency mode, platform requirements, gated/experimental
32+
status, and explicit warnings when a selection exceeds the machine. Models
33+
are not downloaded or loaded to calculate this assessment.
34+
- **Separate external-audio consent**: conversation packets still never contain
35+
audio. Cloud perception receives audio bytes only when its provider/model is
36+
assigned and enabled and the new default-off permission is on; incognito and
37+
raw-audio covenant rules still block it. Requests never expose a local path;
38+
larger NVIDIA inputs use a temporary NVCF asset deleted after the call.
39+
Targeted re-listening remains local.
40+
- **Local, host, and explicit cloud providers**: deterministic local reasoning
41+
remains the no-model fallback; existing Ollama and OpenAI-compatible endpoints
42+
can be added without model downloads. Codex, Claude, Hermes, OpenClaw, and
43+
OpenCode can reason through their existing host authentication, while
44+
OpenRouter supports BYOK and a localhost PKCE flow. All host and network
45+
providers are disabled until the operator enables them.
46+
- **Evidence stays smaller than the event**: reasoning packets contain only
47+
covenant-filtered derived evidence. Raw audio, local paths, source URIs,
48+
credentials, and arbitrary event fields are excluded. Transcript and memory
49+
content have separate, default-off permissions. Incognito forces local-only
50+
reasoning and prevents conversation persistence.
51+
- **One disclosed local re-listen**: a model may request at most one focused
52+
covenant-compliant MOSS/audio pass per turn. Its observation is added as new
53+
derived evidence before one final reasoning pass; it never modifies the
54+
original listening event. Oída never downloads or pulls a local model to
55+
satisfy the request.
56+
- **Predictable failure behavior**: malformed provider output gets one repair
57+
attempt with the same provider. A failure then returns a visible deterministic
58+
local answer; Oída does not silently send the packet to a different external
59+
service.
60+
- **Host turn handoff**: `/conversation/prepare` and
61+
`/conversation/commit`, mirrored as `oida_prepare_turn` and
62+
`oida_commit_turn`, let an active host run the supplied system prompt and
63+
schema without recursively invoking its own CLI. `oida_ask` remains the
64+
daemon-managed path. OpenCode and OpenClaw join `oida integrate` and doctor.
65+
- **Credential boundary**: provider secrets use the macOS Keychain or an
66+
available cross-platform keyring; an environment-only store is the fallback
67+
when secure persistence is unavailable. Secrets are excluded from settings,
68+
logs, URLs, and process arguments.
69+
370
## 0.5.0 - 2026-07-13
471

572
- **Listening sessions**: one listening session now holds many results, and

CITATION.cff

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ message: "If you use oida in research, please cite the software and the Listenin
44
type: software
55
authors:
66
- name: "Sonic Field Labs"
7-
version: 0.5.0
8-
date-released: 2026-07-13
7+
version: 0.6.0
8+
date-released: 2026-07-14
99
license: Apache-2.0
1010
repository-code: "https://github.com/sonicfieldlabs/oida"
1111
preferred-citation:

0 commit comments

Comments
 (0)