[IMP] viin_ai_base, viin_ai_agent: bidirectional data-driven message adapter (close #64 #62 #63)
Symmetric follow-up to the outgoing adapter (#59): make the INCOMING response
normalizer data-driven via viin.ai.message.adapter, add a per-vendor empty-content
knob, and route the streaming path through the adapter with a contract guard.
- #64: viin.ai.message.adapter gains a `direction` discriminator (outgoing|incoming)
+ incoming response-map knobs; viin.ai.provider._normalize_completion_response is
rewired to dispatch data-driven incoming primitives (output byte-stable for the 3
seeded protocols). An admin can hotfix a vendor response-key rename with no release.
- #62: per-vendor `empty_content_repr` knob (empty_string|null|omit), default
empty_string (byte-identical to prior behaviour) for strict gateways (Azure OpenAI).
- #63: viin_ai_agent._do_llm_stream redacts-then-adapts before transport + a contract
guard test that fails if a future streaming multi-turn path bypasses the adapter
(also patches a latent streaming PII-redaction gap).
- Hardening (post code-review): incoming rows must declare all leaf-key paths
(finish/usage/text/tool); incoming rows for an unsupported protocol are rejected at
write time (no silent mis-parse); clearer parse-error diagnostics; tightened
guard tests (per-location PII, value-switch data-driven proof, assertRaises).
- ADR-018 (bidirectional data-driven message adapter); docs/roadmap/module-map
reconcile (32 modules, PR #57/#59/#60 history, ADR ledger, adr-015/016 status sync).
Tests: Odoo native, no-API-key; 302 non-tour tests green (normalize/wire byte-stable
non-regression + incoming data-driven proof + #62 matrix + #63 guard + multiturn loop
+ new validation guards). Pre-existing HttpCase browser tours need a live http server
and fail identically on base 17.0 under --no-http (not part of this change).
Claude-Session: https://claude.ai/code/session_01MpghN1mdjfEzHd1yuSqdut
| Subbuilds | Name | State | Detail |
|---|---|---|---|
| Build 386745 | Check the quality with Pylint: from test_lint to test_pylint 14m | Failed | Log |
| Build 386746 | At install tests: from account to website_twitter 189m | Succeed | Log |
| Build 386747 | Post install tests: step install all modules 108m | Succeed | Log |
| Build 386748 | Post install tests: from account to payment_bidv_viin 159m | Succeed | Log |
| Build 386749 | Post install tests: from payment_buckaroo to to_account_asset 174m | Succeed | Log |
| Build 386750 | Post install tests: from to_account_asset_purchase to viin_account 84m | Succeed | Log |
| Build 386751 | Post install tests: from viin_account_auto_transfer to viin_estimate 89m | Succeed | Log |
| Build 386752 | Post install tests: from viin_estimate_approval to viin_project 39m | Succeed | Log |
| Build 386753 | Post install tests: from viin_project_access_timesheet to website_twitter 64m | Succeed | Log |
| Build 386754 | Test install all modules without demo data: from account to website_twitter 74m | Succeed | Log |
| Create Date | Level | Message |
|---|---|---|
| 06/21/2026 13:55:04 | INFO |
Updated repository Viindoo-odoo
|
| 06/21/2026 13:55:04 | INFO |
Updated repository Viindoo-tvtmaaddons
|
| 06/21/2026 13:55:04 | INFO |
Updated repository Viindoo-erponline-enterprise
|
| 06/21/2026 13:55:04 | INFO |
Updated repository Viindoo-branding
|
| 06/21/2026 13:55:04 | INFO |
Cloned repository Viindoo-ai
|
| 06/21/2026 14:10:33 | ERROR |
Subbuild # 386745:
odoo.addons.test_pylint.tests.test_flake8: FAIL: TestFlake8.test_flake8
Traceback (most recent call last):
File "/data/build/Viindoo-tvtmaaddons-17.0/test_pylint/tests/test_flake8.py", line 91, in test_flake8
self.fail("flake8 test failed:\n" + (b"\n" + out + b"\n" + err).decode('utf-8').strip())
AssertionError: flake8 test failed:
/data/build/rb-41e5e91-222302/viin_ai_agent/tests/test_streaming_adapter_guard.py:22:1: F401 'odoo.addons.viin_ai_base.tests.common.make_stream_chunks' imported but unused
/data/build/rb-41e5e91-222302/viin_ai_base/tests/test_message_adapter_empty_content_knob.py:25:1: F401 'unittest.mock.patch' imported but unused
/data/build/rb-41e5e91-222302/viin_ai_base/tests/test_message_adapter_empty_content_knob.py:29:1: F401 '.fake_response.FakeResponse' imported but unused
/data/build/rb-41e5e91-222302/viin_ai_base/tests/test_message_adapter_incoming.py:53:1: E402 module level import not at top of file
|
| 06/21/2026 14:10:33 | ERROR |
Subbuild # 386745:
odoo.modules.loading: Module test_pylint: 1 failures, 0 errors of 7 tests
|
| 06/21/2026 14:10:33 | ERROR |
Subbuild # 386745:
odoo.modules.loading: At least one test failed when loading the modules.
|
| 06/21/2026 14:10:33 | ERROR |
Subbuild # 386745:
odoo.tests.result: 1 failed, 0 error(s) of 24 tests when loading database 'rb-41e5e91-222302-386745'
|