Release 0.0.2a8 - #25
Open
github-actions[bot] wants to merge 24 commits into
Open
Conversation
Update requirements.txt
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* test: add full-pipeline persona e2e via ovoscope Adds test/test_e2e_persona_pipeline.py: drives an utterance through MiniCroft with ovos-persona-pipeline-plugin backed by AIMLSolver (bundled AIML brain, no network), asserts speak output and per-session memory recording (USER + ASSISTANT turns). Also modernises CI workflows to OpenVoiceOS/gh-automations@dev and adds pyproject.toml with [test] extras. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(packaging): dynamic version from version.py so pyproject build resolves * fix(packaging): move dependencies under [project] (was nested in project.urls) * fix: drop legacy setup.py/requirements.txt, pin ovos-persona@dev, modernize workflows - Remove setup.py (pyproject.toml covers everything); fixes sdist build failure caused by missing requirements.txt inside the isolated build env - Remove requirements.txt (deps declared in pyproject.toml [project.dependencies]) - MANIFEST.in: fix recursive-include syntax; drop requirements.txt line - pyproject.toml: bump build-system requires to setuptools>=61.0; pin test extra ovos-persona to git+https://github.com/OpenVoiceOS/ovos-persona@dev so CI gets the version that exposes Persona.memory (not released 0.7.1) - conventional-label.yml: replace hand-rolled bcoe action with OpenVoiceOS/gh-automations reusable workflow @dev - license_tests.yml: replace copy-pasted full-OVOS-core workflow with OpenVoiceOS/gh-automations license-check.yml @dev Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * test: pin ovos-persona>=0.9.0a1 from PyPI instead of git+@dev * ci: drop non-canonical license workflow (not in OVOS plugin CI set) * ci: add license-check (canonical invocation) * refactor!: migrate from deprecated QuestionSolver to ChatEngine QuestionSolver is deprecated and its base eagerly builds a LanguageTranslator (enable_tx=True) that hard-fails when no translate plugin is installed, dropping the persona in clean environments. ChatEngine loads no translator. Implements continue_chat() over the AIML brain; entry point moves to opm.agents.chat. BREAKING CHANGE: registers under opm.agents.chat (was neon.plugin.solver); class renamed AIMLSolver -> AIMLChatEngine. * feat: opt-in brain-file translation for non-English langs (enable_tx, default off) When enable_tx=True and a non-English lang has no local AIML brain, the bundled en-us brain files are translated via a lazy-loaded translate plugin (default: ovos-translate-plugin-server) and cached in the XDG per-lang dir. Only human-readable text in <pattern> and <template> nodes is translated; structural tags, wildcards, <srai>/<star>/<bot> and all attributes are left untouched. Falls back gracefully to en-us on any failure. Default path unchanged. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: brain<->locale converter helper scripts scripts/brain_to_locale.py bootstraps OVOS locale/ (.intent/.dialog) from the aiml brain; scripts/locale_to_brain.py compiles a brain back from locale/ — so contributors write/translate in standard OVOS notation and the brain is regenerated. {query} slot <-> engine wildcard; partial (skips unmappable constructs). * feat: make locale/ the source of truth for the AIML brain - Bootstrap locale/en-us/ from the bundled AIML brain (24175 intents, ~42% of categories; unmappable constructs left in legacy aiml_data/) - Add .github/workflows/regenerate-brain.yml: pushes to dev regenerate aiml_data/<lang>/generated.aiml from locale/ and commit back; idempotent (no-diff second run exits 0); cannot trigger release (that fires on PR closed, not push) - Add docs/locale.md: locale format, {query} slots, how to add/translate intents, CI flow, supported vs skipped AIML constructs - Add docs/converters.md: usage of both converter scripts, round-trip, conversion-rate caveat - Update README with "Contributing intents" section linking to docs Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: query-level translation, drop locale source-of-truth Non-English support mirrors the Wolfram pattern: translate the user query into the brain language (English), answer, translate back. enable_tx defaults off; a remote translate service is recommended. The bundled aiml_data brain is the source of truth. Drop the locale/ tree and the regenerate-brain workflow; keep brain<->locale as optional standalone helper scripts whose exports never emit residual <…> markup. Bump ovos-plugin-manager floor to >=2.6.1a1 (ChatEngine + pydantic in core). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test: run persona e2e via ovoscope and wire shared CI workflows - move persona pipeline e2e test into test/end2end/ for the ovoscope job - add coverage, lint and ovoscope reusable workflows (gh-automations @dev) - align build-tests workflow and require fixed ovos-persona (locale data shipped) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * test: require ovoscope and ovos-persona so the e2e test always runs Replace pytest.importorskip guards with hard imports and an assert on pipeline availability so missing test dependencies surface as failures instead of silent skips. Pin pytest<9. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Adds a Dockerfile that builds an ovos-persona-server image serving one persona, AimlBot, backed by this plugin's AIMLChatEngine. AIML pattern matching runs offline against the bundled aiml_data, so no credentials or network access are needed. Follows the same structure as OpenVoiceOS/ovos-plugin-linguonnx: install from PyPI, pin ovos-persona-server[mcp] and pass --mcp, publish to ghcr.io on push to master/dev and on tags via the same docker workflow. Pinned to ovos-solver-aiml-plugin>=0.0.2a6: the latest stable release on PyPI, 0.0.1, predates AIMLChatEngine and does not register the opm.agents.chat entry point at all. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
) * fix: e2e test asserts the current speak topic, not the legacy one test_e2e_persona_pipeline.py checked msg.msg_type == "speak", but the stack now emits "ovos.utterance.speak" (see ovos_spec_tools.messages.SpecMessage.SPEAK). This fails identically on unmodified dev - reproduced by running the class before this change - so it is a pre-existing defect, not something introduced by other work in this repo. It blocks CI on every PR that touches this test file, since the two tests in TestAimlPersonaSpeaksThroughPipeline never find a "speak" message and fail on "Expected at least one 'speak' message". * fix: bot identity reflects the A.L.I.C.E./AIML lineage, not Mycroft setBotPredicate calls hardcoded "Mycroft" for name and genus, and age was computed from mycroft-core's creation year. A prior version of this fix replaced those with generic "OVOS" branding, but AIML is a historical chatbot language with its own lineage worth preserving: it was authored by Dr. Richard S. Wallace as the pattern-matching engine behind A.L.I.C.E. (Artificial Linguistic Internet Computer Entity), an ELIZA successor that won the Loebner Prize three times. The defaults now name that lineage instead - name/genus/family describe A.L.I.C.E. and AIML, and age derives from ALICE_BIRTH_YEAR (1995, when A.L.I.C.E. "came to life" per https://en.wikipedia.org/wiki/Artificial_Linguistic_Internet_Computer_Entity) instead of an arbitrary org creation date. No unsourced biographical detail about Wallace (e.g. a hometown) was invented. Deployed and probed live with real questions, which caught two problems the predicate-value assertions alone couldn't see because the bug is in how a value renders inside the corpus's sentence frames, not in the value itself: "botmaster" is a role word the corpus interpolates a name into (e.g. "My <bot botmaster> is <bot master>.", "WHO IS YOUR BOTMASTER" -> "My <botmaster> is <master>."), not a name slot. Setting it to "Dr. Richard S. Wallace" produced "My Dr. Richard S. Wallace is Dr. Richard S. Wallace." - grammatical nonsense. botmaster now stays "master" (the original role word) and the person goes in "master" instead, rendering "My master is Dr. Richard S. Wallace." birthplace/location/city were never set at all, so "WHERE ARE YOU FROM" rendered "I am originally from . Now I live in . Where are you?" with empty holes, and similarly for "I am presently domiciled at <location>." Grepped every <bot name="..."/> reference across the bundled corpus (101 distinct predicates) against what this plugin actually sets; birthplace/ location/city/birthday/phylum were reachable but unset, so they now default to values describing the bot itself (it runs on the internet; phylum "software" completes the kingdom/phylum/class/order/family/genus/species taxonomy chain already partly set) rather than a guess about Wallace's whereabouts, since no source gives him a hometown or birthday. 87 of the 101 corpus predicates remain unset by design (secondary details like favorite foods/movies/hobbies, not core identity, out of scope for this fix) - see the PR description for the full list. All predicates remain overridable via config, the int() guard around the birth year still can't crash construction, and every value is still coerced with str(). Regression tests assert both the predicate values and (new) the actual rendered answer text via continue_chat, so a correct-value-wrong-slot regression like the botmaster one fails the suite even when the underlying predicate value looks right in isolation. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Human review requested!