RunnerContextBuilder called ModelManager.get_model_by_uuid(model_uuid)
without the required tenant context. The TypeError was swallowed at debug
level, so runtime.metadata.model_context_window_tokens was always missing.
Thread the run's ExecutionContext through build_context_from_event.
Co-authored-by: Claude Opus 5.5 <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* feat(speech): implement TTS and STT model layer and pipeline stages (LANG-251)
Co-authored-by: multica-agent <[email protected]>
* fix(speech): fix invoke signatures and provider lookup in speech stages and model testing
Co-authored-by: multica-agent <[email protected]>
* feat(speech): rename STT to ASR, improve TTS voice parameter handling and failure recovery
Co-authored-by: multica-agent <[email protected]>
* fix(persistence, lint, web): fix migration revision id, legacy table check, ruff duplicates, and frontend types
Co-authored-by: multica-agent <[email protected]>
* fix(speech): restore migration and CI contracts
Co-authored-by: multica-agent <[email protected]>
* fix(pipeline,ui): fix select dropdown width gap, add speech to guided tour, and configure show_if for speech options
Co-authored-by: multica-agent <[email protected]>
* feat(speech,openclaw): support silk audio transcoding, graceful fallback, duration estimation, and multi-lang deploy docs
Co-authored-by: multica-agent <[email protected]>
* fix(audio): enhance ffmpeg executable detection via venv and imageio_ffmpeg
Co-authored-by: multica-agent <[email protected]>
* fix(provider): improve LiteLLM error classification and avoid falling back to Unknown error
Co-authored-by: multica-agent <[email protected]>
* fix(openclaw): serialize voice_item attributes and improve transcoding fallback logging
Co-authored-by: multica-agent <[email protected]>
* fix(audio,openclaw): handle transient TMPDIR deletion and add size attribute to voice_item
Co-authored-by: multica-agent <[email protected]>
* fix(openclaw): download and convert inbound voice messages and align voice sending protocol
Co-authored-by: multica-agent <[email protected]>
* fix(models): redesign add model popover tabs layout and include ASR/TTS models in provider counts and scanning
Co-authored-by: multica-agent <[email protected]>
* fix(audio): decrypt and transcode wecombot voice to mp3, align openclaw weixin voice delivery
Co-authored-by: multica-agent <[email protected]>
* fix(wecombot): transcode outbound voice to silk and support voice_delivery mode
Co-authored-by: multica-agent <[email protected]>
* fix(discord,web): map audio attachments to voice for ASR, prefer base64 voice in webui
Co-authored-by: multica-agent <[email protected]>
* fix(telegram): deliver voice replies in streaming and non-streaming modes with quote origin
Co-authored-by: multica-agent <[email protected]>
* feat(dingtalk): route voice messages through pipeline ASR and send TTS replies as voice
Inbound DingTalk audio now arrives as a Voice component with its duration,
so the pipeline speech recognition switch decides how it is transcribed.
DingTalk's own recognition text is used only when the audio cannot be
downloaded.
Outbound Voice components are transcoded to ogg/opus, uploaded as voice
media and sent as native sampleAudio messages in both the omni and legacy
adapters. Audio over 60 seconds, or audio that cannot be transcoded or is
rejected as a voice message, is sent as a file instead. Voice parts no longer
leak into the reply text as "[Voice]".
Also estimate ogg durations from the granule position and ignore non-audio
MIME hints when extracting voice bytes, so ffmpeg can probe the input.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* fix(ci): include speech model counts in provider responses and fix lint/image build
- Copy every count returned by get_provider_model_counts into the provider
payload instead of indexing asr_count/tts_count, and update the test fakes
to return the speech model counts.
- Install libc6-dev in the runtime image so the pilk audio extra can compile.
- Apply ruff and prettier formatting required by the lint jobs.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* test(e2e): expect the speech step in the pipeline setup guide
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: multica-agent <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
Every branch push published a permanent rockchin/langbot:sha-<sha> tag plus a
branch-name tag, leaving 678 live Docker Hub tags across 265 branches. Restrict
push triggers to master; other branches stay buildable via workflow_dispatch.
Co-authored-by: multica-agent <[email protected]>
Ten links in dev-docs/agent-runner-pluginization/ pointed to the non-existent ./RUNNER_QA_GUIDE.md; point them to AGENT_RUNNER_QA_GUIDE.md. Rebased onto the docs/ -> dev-docs/ move.
Co-authored-by: RockChinQ <[email protected]>
* feat(line): EBA LINE adapter skeleton (WO-LINE-01-SKELETON-1018)
- pkg/platform/adapters/line/ 9 files (LineAdapter hybrid inheritance +
Capability + event namespace + config env load, zero hardcoded secrets)
- LINE SDK calls all stub (NotImplementedError) pending WO-LINE-00/02/03
- Verified: compileall 7/7 + ruff 0 + import chain green against
v4.11.0-hotfixed SDK (container-extracted, read-only)
- Source: handoff box WO-LINE-01-SKELETON-1018 (sha256 9/9 matched)
Co-authored-by: multica-agent <[email protected]>
* feat(line): implement WO-LINE-02 message.received loop and converter
Co-authored-by: multica-agent <[email protected]>
* feat(line): implement WO-LINE-03 streaming and send API
Co-authored-by: multica-agent <[email protected]>
* feat(line): implement WO-LINE-04 group and user event extensions
Co-authored-by: multica-agent <[email protected]>
* feat(line): implement WO-LINE-05 group and user event extensions
Co-authored-by: multica-agent <[email protected]>
* docs(line): add EBA LINE adapter architecture guide and documentation
Co-authored-by: multica-agent <[email protected]>
* feat(line): resolve Ruff warnings and manifest spec update
Co-authored-by: multica-agent <[email protected]>
* feat(line): add webhook_url config and help_links to PR_DESCRIPTION.md
Co-authored-by: multica-agent <[email protected]>
* feat(line): add webhook_url config and help_links for PR #2736
Co-authored-by: multica-agent <[email protected]>
* fix(line): ruff format, update help_links, remove nested duplicate dir
Co-authored-by: multica-agent <[email protected]>
* fix(line): resolve 12 test failures, align types, and move architecture docs to dev-docs
Co-authored-by: multica-agent <[email protected]>
* fix(line): resolve ruff lint and formatting issues for CI
Co-authored-by: multica-agent <[email protected]>
* docs(line): sanitize internal orchestration notes and standardize documentation
Co-authored-by: multica-agent <[email protected]>
* clean(line): remove internal tracking ticket references from source code
Co-authored-by: multica-agent <[email protected]>
* fix(line): resolve MessageReceivedEvent and Friend entity mapping for 100% test pass
Co-authored-by: multica-agent <[email protected]>
* fix(line): resolve E402 import order in event_converter.py
Co-authored-by: multica-agent <[email protected]>
* feat(line): implement the LINE Omni adapter on the legacy messaging flow
Replace the placeholder skeleton with a working unified-webhook adapter:
- verify X-Line-Signature with WebhookParser and acknowledge before dispatch
- build real LINE messaging clients from channel_access_token and drop
the adapter's own messages using the account id from get_bot_info
- map message/image/voice events to message.received, unsend to
message.deleted, membership changes to group/bot events, and the
remaining LINE event types to platform.specific with chat identity
- send and reply through MessagingApi with LINE's five-message budget,
a reply-token to push fallback, and honest NotSupportedError paths
- expose get_user_info, get_group_info, leave_group and the get_bot_info,
get_profile, get_group_summary pass-through actions
- keep the legacy FriendMessage/GroupMessage listeners working
- move tests to tests/unit_tests/platform, add the adapter doc, and
register line in OMNI_ADAPTER_NAMES
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: multica-agent <[email protected]>
Co-authored-by: RockChinQ <[email protected]>
Fixes#2814
After a session reset, keep the reset generation marker out of provider-facing external conversation state so Runner plugins start a new remote conversation.
LocalAgent declared langbot-plugin>=0.7.18, and the published 0.2.2 artifact
pinned langbot-plugin==0.7.16. The plugin runtime rejects any SDK requirement
its own SDK version does not satisfy, so both directions were dead ends: 4.11.4
(SDK 0.7.19) could not install the published build, and a 0.7.18 floor would
have locked out 4.11.2/4.11.3 (SDK 0.7.16) from the next one.
Use a bounded range from the 4.11.2 baseline instead, matching every other
official Runner and KnowledgeEngine plugin. Verified on SDK 0.7.16 and 0.7.19:
327 tests pass on both, including the runtime dependency admission contract.
Co-authored-by: multica-agent <[email protected]>
The packaging job pinned langbot-plugin 0.7.18 while Core runs 0.7.19, so it
would validate archives with a CLI that no longer matches the SDK contracts the
plugins are shipped against. Follow the Core pin.
Co-authored-by: multica-agent <[email protected]>
0041_resource_urls could not be rolled back through the supported entry point
(`python -m langbot.pkg.persistence.alembic_runner downgrade`):
- SQLite failed with `no such function: langbot_expand_resource_urls`. The UDF
is registered by an Engine `connect` hook that only runs when the application
installs the catalog, so a standalone migration process held a connection
without it.
- Both backends failed with `AttributeError: 'Engine' object has no attribute
'_langbot_resource_aliases'`, because `uninstall()` assumed `install()` had
already run on that engine.
Register the expansion UDF on the migration connection for SQLite, and let
`uninstall()` skip the alias cache when the engine never installed it. The
downgrade still rewrites retained payloads back to literal URLs and drops the
catalog; only the missing hooks were at fault.
Co-authored-by: multica-agent <[email protected]>
- webhook handler: run listener in a tracked background task so the
HTTP ACK is not coupled to the Agent run lifetime (prevents in-flight
cancellation when the request scope ends); exceptions are logged
- send_message: implement LINE Push API path (text + image) instead of
the empty stub, separated from the reply-token path
Verified in production on a self-hosted v4.11.0 deployment (LangBot
community edition, rootless Docker).
Co-authored-by: leonoxo <[email protected]>