Skip to content

Add astral community ability - #361

Open
Jmesmykil wants to merge 412 commits into
openhome-dev:devfrom
Jmesmykil:add-astral
Open

Add astral community ability#361
Jmesmykil wants to merge 412 commits into
openhome-dev:devfrom
Jmesmykil:add-astral

Conversation

@Jmesmykil

Copy link
Copy Markdown

Astral, a deterministic layer for the exact-answer class.

It answers time, date, math, money, and unit conversions on its own, without the LLM. The whole engine is inlined in main.py, pattern and table code, like the official date-and-time base capability but generalized to the full exact-answer class. Works for any agent, no DevKit needed. When a request is not an exact-answer question it returns nothing, so the agent takes the turn and it never blocks.

Category: Skill. Suggested trigger words are in the README. Standard library only, no API keys.

github-actions Bot and others added 30 commits February 20, 2026 05:54
Signed-off-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Signed-off-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Signed-off-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Signed-off-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Co-authored-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Updated the BasicTemplateCapability class to include detailed comments and prompts for user interaction.

Signed-off-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Removed the register_capability method and added a comment tag for capability registration.

Signed-off-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Removed unused import and commented out the capability registration method. Added a tag for register capability.

Signed-off-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Updated the boilerplate note for the register capability method in README.md.

Signed-off-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Signed-off-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Signed-off-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Signed-off-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Enhance path check workflow to provide detailed comments on PR violations and allowed files.

Signed-off-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Signed-off-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Signed-off-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Enhance path-check workflow to validate file changes in PRs, ensuring only files in the 'community/' folder are modified. Provide detailed feedback in PR comments based on the check results.

Signed-off-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Updated regex for register capability tag and improved error message.

Signed-off-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Signed-off-by: abubakar4360 <abubakarabbasi541@gmail.com>
Co-authored-by: markdelta24 <your-actual-github-markdelta@zemuriacom>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Co-authored-by: abubakar4360 <abubakarabbasi541@gmail.com>
Signed-off-by: abubakar4360 <abubakarabbasi541@gmail.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Co-authored-by: abubakar4360 <abubakarabbasi541@gmail.com>
Signed-off-by: Uzair Ullah <uzairullahmail@gmail.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Muhammad Rizwan <awanrizwan615@gmail.com>
Co-authored-by: Uzair Ullah <uzairullahmail@gmail.com>
Signed-off-by: abubakar4360 <abubakarabbasi541@gmail.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Uzair Ullah <uzairullahmail@gmail.com>
Co-authored-by: abubakar4360 <abubakarabbasi541@gmail.com>
Co-authored-by: Muhammad Rizwan <awanrizwan615@gmail.com>
uzair401 and others added 10 commits May 15, 2026 00:05
Added community abilities section with examples and links.

Signed-off-by: Uzair Ullah <uzairullahmail@gmail.com>
Co-authored-by: Uzair Ullah <uzairullahmail@gmail.com>
New Local-category template that controls a Philips Hue bulb directly over
Bluetooth with no Hue Bridge or internet required. Demonstrates a persistent
BLE connection pattern: connect once at session start, run a natural-language
voice loop, and only expose controls the bulb actually supports.

templates/README.md updated to register the new template in the directory
tree, core templates section, and quick reference. Local-category description
clarified to note it cannot be tested in the Live Editor.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Uzair Ullah <uzairullahmail@gmail.com>
Updated README to reflect new features and API usage for Ambient Sounds.

Signed-off-by: Uzair Ullah <uzairullahmail@gmail.com>
Refactor ambient sound player to use Freesound API, implement new routing and streaming logic.

Signed-off-by: Uzair Ullah <uzairullahmail@gmail.com>
@Jmesmykil
Jmesmykil requested review from a team as code owners August 8, 2026 02:57
@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

✅ Community PR Path Check — Passed

All changed files are inside the community/ folder. Looks good!

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

🔀 Branch Merge Check

PR direction: add-astraldev

Passedadd-astraldev is a valid merge direction

@github-actions github-actions Bot added ci-cd CI/CD and automation community-ability Community-contributed ability official-ability Official ability maintained by OpenHome documentation Documentation improvements templates Starter templates labels Aug 8, 2026
@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

🔍 Lint Results

__init__.py — Empty as expected

Files linted: community/astral/main.py

✅ Flake8 — Passed

✅ All checks passed!

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

✅ Ability Validation Passed

📋 Validating: community/astral
  ✅ All checks passed!

…ng answers

The ability answered time, date, math, money and unit conversions. The same
argument covers more ground: any question with one right answer and a formula
that produces it should not go to a model. Adds grades, chemistry, physics,
statistics and number tools behind one router, with plain arithmetic last.

Four answers in the version already on this branch were wrong and are fixed:

- An article before a digit added one, so "a 15 percent tip on 60 dollars"
  answered 16 percent.
- The number formatter truncated instead of rounding at the integer boundary,
  so a value landing a hair below an integer was spoken one lower.
- Surface gravity used volumetric mean radii, so Jupiter gave 25.92 against a
  published 24.79. Equatorial radii now agree with published surface gravity
  and escape velocity for eight bodies to better than half a percent.
- A multi-word unit containing a shorter unit of the same dimension matched
  twice at overlapping positions and the shorter one could win, so "how many
  kilometers in a nautical mile" answered "1 mile is 1.61 kilometers".

Unit factors are the exact defined values now; a truncated mile answered "a
mile is 5279.99 feet".

Molar masses are computed by parsing the formula against the element table
rather than stored per compound, so a typo cannot become a confident answer.
Anything resting on a convention says so: a letter grade names the 90/80/70
scale, a standard deviation says sample or population.

Still one self-contained main.py, standard library only, and it still speaks
nothing and returns the turn when it has no exact answer.

120 answers are asserted byte-exact upstream, with a suite that fuzzes four
thousand utterances and rechecks every result a second independent way.
@Jmesmykil

Copy link
Copy Markdown
Author

Updated this branch. Two reasons.

The first is that four answers in the version you were looking at were wrong, and I would rather not have them merged. An article before a digit added one, so "a 15 percent tip on 60 dollars" answered 16 percent. The number formatter truncated instead of rounding at the integer boundary. Surface gravity used volumetric mean radii, so Jupiter gave 25.92 against a published 24.79. And a multi-word unit containing a shorter unit of the same dimension could lose the match to the shorter one, so "how many kilometers in a nautical mile" answered "1 mile is 1.61 kilometers". All four are fixed and each has a byte-exact test pinning it.

The second is scope. The ability answered time, date, math, money and unit conversions, and the argument for those covers more ground than I first shipped: any question with one right answer and a formula that produces it should not go to a model. It now also does grades, chemistry, physics, statistics and number tools, behind one router with plain arithmetic last.

Still one self-contained main.py, standard library only, no network, no model. It still speaks nothing and returns the turn when it has no exact answer.

Happy to split this into a smaller PR if you would rather review it that way, or to drop the new domains and land only the four fixes.

The near-integer check was also true of any number smaller than its tolerance,
so a tiny value printed as 0. Pinned byte-exact along with six other answer
paths that had never been exercised.
The time and date patterns matched bare 'the time', 'the date', 'what year' and
'what month', so 'what year did the war end' answered 'It's 2026' and 'what's the
time zone in tokyo' answered the local time. That layer runs first, so nothing
downstream could correct it. Patterns now name the whole question, and a tense
marker or a second subject declines outright.
…ation once

The capability's normalizer lowercased the transcript and stripped every symbol,
which turns Ca(OH)2 into 'ca oh 2' — every chemistry formula was broken here.
Normalization now happens once inside the engine and only touches what
speech-to-text substitutes for words, so '20%' and a trailing '?' stop breaking
the number patterns while capitals and parentheses survive.

Found by speaking the phrases at a DevKit instead of typing them.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci-cd CI/CD and automation community-ability Community-contributed ability documentation Documentation improvements official-ability Official ability maintained by OpenHome templates Starter templates

Projects

None yet

Development

Successfully merging this pull request may close these issues.