mirror of
https://github.com/openclaw/openclaw.git
synced 2026-10-03 09:39:25 +00:00
4 commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
41aec3ca92
|
feat(deepgram): support Flux voice-note transcription (#141836)
Closes #129452. Replaces #129442 and preserves Safzan Pirani's original Flux contribution. ## Problem and fix Selecting `flux-general-en` or `flux-general-multi` sends voice-note audio to Deepgram's prerecorded HTTP `/v1/listen` endpoint, which rejects Flux. This change routes those models through the streaming `/v2/listen` protocol. Operators use their existing media model settings; Nova remains the default. Flux requires `ffmpeg`. The Deepgram plugin owns bounded audio conversion, frame pacing, protocol parsing, and transcript assembly. The shared WebSocket connector applies resolved authentication, private-network policy, proxy routing, and TLS settings. One connection deadline covers DNS preparation, proxy CONNECT, and the opening handshake; Flux keeps its original transcription-attempt deadline after preparation. Cancellation and socket closure release pending connections. Proxy connections use the existing shared Node agent backed by `@openclaw/proxyline@0.3.12`. [Proxyline #34](https://github.com/openclaw/proxyline/pull/34), now merged, adds prepared proxy DNS/TLS connection options while preserving its existing pending-socket ownership. OpenClaw passes these through `createNodeProxyAgent(...)`; it does not retain a separate proxy-agent implementation or add `https-proxy-agent` as a direct dependency. Proxy TLS and target TLS remain separate. Configured proxies retain resolved target-address checks before connection. Applicable managed and ambient HTTP(S) proxies retain their existing DNS delegation. `NO_PROXY` bypasses and `ALL_PROXY` alone do not disable address checks. HTTP and WebSocket paths share the managed-proxy predicate. The query builder combines saved language and explicit query inputs before applying [Deepgram's model contract](https://developers.deepgram.com/reference/speech-to-text/listen-flux). Only `flux-general-multi` receives `language_hint`; explicit query values keep their precedence. The English-only model ignores both language inputs without requiring changes to saved settings. The documentation follows main's split-page structure: request policy is documented on [Custom providers](https://docs.openclaw.ai/gateway/config-tools/custom-providers), and connection ownership on [Provider voice capabilities](https://docs.openclaw.ai/plugins/sdk-provider-plugins/voice-and-audio). The Deepgram manifest keeps main's categories and the Flux description. No configuration keys or storage changes are added. ## Canonical transport evidence These results cover the retained compiled candidate with the canonical Proxyline implementation. They are not claims about a newly installed or rebuilt merge head. - Independent public CLI acceptance saved and read back all four combinations of the two Flux models with either top-level `language: "en"` or `providerOptions.deepgram.language_hint: "en"`. Each ran `openclaw infer audio transcribe --file sample.wav --json` without model or language overrides, returned the expected “Life moves pretty fast” transcript, and exited 0. The original model configuration was restored and verified. - A saved Nova configuration and a post-fault Flux control returned the expected transcript and exited 0. - A configured proxy with private-network access explicitly denied produced a visible target-address rejection and exit 1, with no CONNECT admissions, no target connections or bytes, and no remaining proxy connections. - A stalled CONNECT produced a visible transcription timeout and exit 1 without forced termination. Both admitted connections closed before the CLI exited; zero connections remained. This records two attempts, not a one-second deadline for the whole CLI invocation. - A successful real-provider transcription through an HTTPS proxy recorded certificate verification enabled, the explicit server name, an authorized client certificate, CONNECT to the intended provider, 570,755 bytes forwarded upstream and 47,863 downstream, and complete peer cleanup. Verification mode was observed from the operator configuration; this public acceptance did not independently inject an invalid server certificate. - Focused canonical tests passed: 136 WebSocket/HTTP address-policy tests, 3 shared Node-agent tests, and 37 Deepgram tests. Proxyline's 11 connection-control tests passed, including prepared lookup/TLS settings and Node certificate-verification defaults. The retained runtime build, formatting, lint, and documentation checks also passed. - Proxyline's upstream review and Linux/macOS/Windows, package, and CodeQL checks passed before merge. Its published `0.3.12` package has been inspected: `src` and `dist` are byte-identical to the tested package. Registry metadata identifies release commit `46a8aa2e3c4b8fbed5fc3ccc16a4631cb7ca3d24` and includes package provenance. ## Regression evidence retained - On baseline ` |
||
|
|
633b84f222
|
docs(plugins): mark generated reference pages and fix their shared template (#140254)
* docs(plugins): mark generated reference pages and fix their shared template Two generator files change; the other 153 files are their regenerated output from `pnpm plugins:inventory:gen`. - Emit a "generated, do not edit" banner naming the regeneration command and the manual-block markers. None of the 151 reference pages said they were generated, so a contributor edit was silently overwritten. - Give generated reference titles a `reference` suffix. Eight of them collided with a hand-written guide title (beam, geolocation, google-meet, logbook, teams-meetings, webhooks, workboard, zoom-meetings). Duplicate frontmatter titles across docs/ now total 0. - Render the surface list as a list instead of a semicolon-joined sentence, and use plain conjunctions for install routes. Strict STE hard violations across docs/plugins/reference/ drop from 178 to 20. - Drop the body H1, which duplicated the frontmatter title Mintlify already renders. - Fix a generator bug found while testing: the marker-less fallback in `extractManualReferenceSections` matched only the first line under `## Surface`, so a second `--write` run captured later bullets into a fabricated manual block. `--write` is now idempotent and `--check` passes across repeated runs. All 12 hand-written manual blocks are preserved. * test(scripts): follow resolvePluginSurface to its list contract resolvePluginSurface now returns one string per surface item instead of a semicolon-joined sentence, so the generator can render a list. The four assertions move from toBe(<joined string>) to toEqual(<array>) and pick up the capitalised labels. The "generic fallback" case changes meaning rather than disappearing. The empty manifest now yields [], and renderSurface() prints "This plugin declares no channels, providers, commands, or contracts." for an empty list, which tells a reader more than the old "plugin". The test is renamed to say what it now checks, with a comment pointing at the new home of the fallback. No generated page has an empty Surface section, so no page changes because of this. |
||
|
|
ce078367e4
|
fix(docs): preserve plugin surface identifiers | ||
|
|
2244ba87b3
|
docs: add generated plugin reference pages |