atmem 2.2.6b2__tar.gz → 2.2.6b3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {atmem-2.2.6b2/atmem.egg-info → atmem-2.2.6b3}/PKG-INFO +41 -13
- {atmem-2.2.6b2 → atmem-2.2.6b3}/README.md +33 -12
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/cli.py +121 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/mcp/server.py +1 -1
- atmem-2.2.6b3/atmem/provider_adapters/__init__.py +12 -0
- atmem-2.2.6b3/atmem/provider_adapters/langgraph.py +43 -0
- atmem-2.2.6b3/atmem/provider_adapters/lifecycle.py +268 -0
- atmem-2.2.6b3/atmem/provider_adapters/loading.py +23 -0
- atmem-2.2.6b3/atmem/provider_adapters/mem0.py +75 -0
- atmem-2.2.6b3/atmem/provider_adapters/models.py +132 -0
- atmem-2.2.6b3/atmem/provider_adapters/pydantic_ai.py +76 -0
- atmem-2.2.6b3/atmem/provider_adapters/runtime.py +142 -0
- atmem-2.2.6b3/atmem/provider_adapters/server.py +77 -0
- atmem-2.2.6b3/atmem/provider_adapters/signing.py +125 -0
- atmem-2.2.6b3/atmem/provider_adapters/worker.py +20 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3/atmem.egg-info}/PKG-INFO +41 -13
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem.egg-info/SOURCES.txt +22 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem.egg-info/requires.txt +10 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/capabilities.json +9 -2
- atmem-2.2.6b3/docs/context-provider-adapters.md +118 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/current-status.md +9 -4
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/delegated-context-provider.md +13 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/openclaw-setup.md +2 -2
- atmem-2.2.6b3/docs/releases/v2.2.6b3.md +44 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/README.md +1 -1
- {atmem-2.2.6b2 → atmem-2.2.6b3}/pyproject.toml +11 -1
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_documentation.py +2 -2
- atmem-2.2.6b3/tests/test_langgraph_provider.py +37 -0
- atmem-2.2.6b3/tests/test_mem0_provider.py +37 -0
- atmem-2.2.6b3/tests/test_provider_cli.py +56 -0
- atmem-2.2.6b3/tests/test_provider_integration.py +60 -0
- atmem-2.2.6b3/tests/test_provider_packaging.py +15 -0
- atmem-2.2.6b3/tests/test_provider_performance.py +32 -0
- atmem-2.2.6b3/tests/test_provider_runtime.py +79 -0
- atmem-2.2.6b3/tests/test_provider_server.py +85 -0
- atmem-2.2.6b3/tests/test_pydantic_provider.py +32 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tools/smoke_installed_package.py +1 -1
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tools/smoke_upgrade_from_2_1.py +3 -3
- {atmem-2.2.6b2 → atmem-2.2.6b3}/LICENSE +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/MANIFEST.in +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/__init__.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/adapters/__init__.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/adapters/base.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/adapters/langgraph.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/adapters/pydantic_ai.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/benchmark/__init__.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/benchmark/contracts.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/benchmark/data/deterministic-v1.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/benchmark/data/mem0-oss-v1.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/benchmark/data/thresholds-v1.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/benchmark/external.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/benchmark/profiles.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/benchmark/runner.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/contracts/__init__.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/contracts/models.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/contracts/versions.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/__init__.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/assets/app.css +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/assets/app.html +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/assets/app.js +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/assets/atmem.jpg +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/atbot_companion.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/atbot_service.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/blackbox.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/compat.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/evidence.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/hosts.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/manager.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/models.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/openclaw_native.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/openclaw_topology.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/server.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/state.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/store.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/topology.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/ui.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/verify.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/web.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/core/__init__.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/core/canonical.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/core/fact_keys.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/core/keys.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/core/policy.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/core/storage.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/dashboard_daemon.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/delegated/__init__.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/delegated/canonical.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/delegated/client.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/delegated/config.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/delegated/contracts.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/delegated/service.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/delegated/validation.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/extract/__init__.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/extract/rules.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/graph.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/investigate.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/maintenance.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/mcp/__init__.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/media.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/memory.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/openclaw_install.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/retrieve/__init__.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/retrieve/rank.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/retrieve/support.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/schemas/__init__.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/schemas/v1/benchmark-cases.schema.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/schemas/v1/benchmark-report.schema.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/schemas/v1/capabilities.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/schemas/v1/context-package.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/schemas/v1/memory-proposal.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/schemas/v1/recall-request.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/schemas/v1/scope.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/schemas/v1/source-capture.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/semantic/__init__.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/semantic/index.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/semantic/providers.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/store/__init__.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/store/sqlite.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem.egg-info/dependency_links.txt +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem.egg-info/entry_points.txt +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem.egg-info/top_level.txt +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/agent-blackbox.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/atbot-release.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/audit-log-spec.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/audit-search.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/auditing-guide.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/benchmarks.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/contracts/delegated-context-provider-v1/inject.next-turn-same-nonce.valid.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/contracts/delegated-context-provider-v1/inject.valid.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/contracts/delegated-context-provider-v1/test-vectors.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/contracts/delegated-context-provider-v1/trust.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/contracts/delegated-context-provider-v1/withhold.valid.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/contracts/delegated-context-provider-v1.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/contracts/delegated-context-provider-v1.schema.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/contracts/delegated-context-request-v1.schema.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/control-plane.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/dashboard-design-language.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/data-storage-and-backup.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/examples/benchmark-deterministic-v1.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/examples/longmemeval-s-retrieval-12-v1.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/examples/longmemeval-s-support-ranking-2026-09-02.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/framework-adapters.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/generic-adapter.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/integration-guide.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/multimodal-observations.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v1.0.0.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.0.0.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.0.1.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.1.0.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.2.0.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.2.1.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.2.2.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.2.3.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.2.4.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.2.5.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.2.6b1.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.2.6b2.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/saas-integration.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/semantic-search.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/spec-kit.md +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/index.ts +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/openclaw.plugin.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/package-lock.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/package.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/src/rpc-client.ts +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/src/setup.ts +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/src/types.ts +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/test/delegated-context-contract.mjs +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/test/hooks.mjs +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/test/setup.mjs +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/test/smoke.mjs +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/tsconfig.json +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/setup.cfg +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_atbot_companion.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_atbot_service.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_auditability.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_benchmark_cli.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_benchmark_contracts.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_benchmark_external.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_benchmark_runner.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_blackbox.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_cli.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_cli_guidance.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_contracts_v1.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_control_evidence.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_control_plane.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_control_verify.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_dashboard_daemon.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_delegated_context.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_delegated_control.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_encryption.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_extract.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_framework_adapters.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_generic_control.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_graph.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_host_adapter.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_layers.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_maintenance.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_mcp.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_media_observations.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_memory.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_openclaw_control.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_openclaw_install.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_openclaw_topology.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_policy.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_recall_evidence.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_restore_receipt.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_retrieve.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_semantic_search.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_store_transactions.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_supporting_evidence.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tools/run_longmemeval_retrieval.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tools/smoke_delegated_package.py +0 -0
- {atmem-2.2.6b2 → atmem-2.2.6b3}/tools/verify_audit.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atmem
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.6b3
|
|
4
4
|
Summary: Host-neutral Agent Black Box and reversible memory control plane.
|
|
5
5
|
Author-email: aetna000 <aetna000@gmail.com>
|
|
6
6
|
Maintainer-email: aetna000 <aetna000@gmail.com>
|
|
@@ -31,6 +31,13 @@ Requires-Dist: pytest>=8.0.0; extra == "dev"
|
|
|
31
31
|
Requires-Dist: tomli>=2.0; python_version < "3.11" and extra == "dev"
|
|
32
32
|
Provides-Extra: semantic
|
|
33
33
|
Requires-Dist: sentence-transformers<6.0.0,>=5.0.0; extra == "semantic"
|
|
34
|
+
Provides-Extra: mem0
|
|
35
|
+
Requires-Dist: mem0ai<2,>=1; extra == "mem0"
|
|
36
|
+
Provides-Extra: langgraph-provider
|
|
37
|
+
Requires-Dist: langgraph<2,>=1.1.5; extra == "langgraph-provider"
|
|
38
|
+
Provides-Extra: pydantic-provider
|
|
39
|
+
Requires-Dist: pydantic-ai-slim<3,>=2.0; extra == "pydantic-provider"
|
|
40
|
+
Requires-Dist: pydantic<3,>=2.0; extra == "pydantic-provider"
|
|
34
41
|
Provides-Extra: atbot
|
|
35
42
|
Provides-Extra: pydantic-ai
|
|
36
43
|
Requires-Dist: pydantic-ai-slim<3,>=2.0; extra == "pydantic-ai"
|
|
@@ -45,7 +52,7 @@ Dynamic: license-file
|
|
|
45
52
|
|
|
46
53
|
# AtMem
|
|
47
54
|
|
|
48
|
-
[](./docs/releases/v2.2.6b3.md)
|
|
49
56
|
[](https://github.com/aetna000/atmem/actions/workflows/ci.yml)
|
|
50
57
|
|
|
51
58
|
**AtMem is a host-neutral Agent Black Box and reversible memory control plane.**
|
|
@@ -60,7 +67,7 @@ authorizes, stores, scopes, injects, corrects, and deletes memory.
|
|
|
60
67
|
### 1. Install AtMem and choose memory intelligence
|
|
61
68
|
|
|
62
69
|
```bash
|
|
63
|
-
python -m pip install --pre --upgrade atmem==2.2.
|
|
70
|
+
python -m pip install --pre --upgrade atmem==2.2.6b3
|
|
64
71
|
atmem atbot setup
|
|
65
72
|
atmem atbot doctor
|
|
66
73
|
atmem dashboard
|
|
@@ -88,7 +95,7 @@ connection. Do not install the npm package yourself.
|
|
|
88
95
|
Already using AtMem 2.1 with OpenClaw? Upgrade in place:
|
|
89
96
|
|
|
90
97
|
```bash
|
|
91
|
-
python -m pip install --pre --upgrade atmem==2.2.
|
|
98
|
+
python -m pip install --pre --upgrade atmem==2.2.6b3
|
|
92
99
|
atmem openclaw upgrade
|
|
93
100
|
atmem control verify
|
|
94
101
|
```
|
|
@@ -111,7 +118,7 @@ selected by `python`, rather than an unrelated `pip` executable on `PATH`.
|
|
|
111
118
|
#### Pydantic AI — native capability
|
|
112
119
|
|
|
113
120
|
```bash
|
|
114
|
-
python -m pip install --pre 'atmem[pydantic-ai]==2.2.
|
|
121
|
+
python -m pip install --pre 'atmem[pydantic-ai]==2.2.6b3'
|
|
115
122
|
atmem control shadow --host generic --memory-db ~/.atmem/memories.db
|
|
116
123
|
```
|
|
117
124
|
|
|
@@ -135,7 +142,7 @@ agent = Agent("openai:gpt-5-mini", capabilities=[memory])
|
|
|
135
142
|
#### LangChain/LangGraph — native middleware
|
|
136
143
|
|
|
137
144
|
```bash
|
|
138
|
-
python -m pip install --pre 'atmem[langgraph]==2.2.
|
|
145
|
+
python -m pip install --pre 'atmem[langgraph]==2.2.6b3'
|
|
139
146
|
atmem control shadow --host generic --memory-db ~/.atmem/memories.db
|
|
140
147
|
```
|
|
141
148
|
|
|
@@ -192,7 +199,7 @@ If AtBot or its selected model is unavailable, AtMem continues with safe local
|
|
|
192
199
|
capture and hybrid ranking. Memory authority and agent operation do not depend
|
|
193
200
|
on a hosted model.
|
|
194
201
|
|
|
195
|
-
> **Release status:** this repository describes **AtMem 2.2.
|
|
202
|
+
> **Release status:** this repository describes **AtMem 2.2.6b3**. AtBot is a
|
|
196
203
|
> separately packaged, headless component installed and managed by AtMem; it is
|
|
197
204
|
> not an independent agent or a second memory authority.
|
|
198
205
|
|
|
@@ -217,6 +224,27 @@ run native retrieval after an accepted delegated decision. Provider failure
|
|
|
217
224
|
withholds context unless the operator explicitly registered native fallback.
|
|
218
225
|
See the [delegated context-provider guide](docs/delegated-context-provider.md).
|
|
219
226
|
|
|
227
|
+
AtMem also ships provider-side adapters, each as an independent optional extra:
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
# Mem0 chooses context; AtMem verifies and records delivery
|
|
231
|
+
python -m pip install 'atmem[mem0]'
|
|
232
|
+
atmem provider init mem0-local --kind mem0 --mode oss --port 8788
|
|
233
|
+
|
|
234
|
+
# Or use an application-owned LangGraph / Pydantic AI factory
|
|
235
|
+
python -m pip install 'atmem[langgraph-provider]'
|
|
236
|
+
atmem provider init graph-context --kind langgraph \
|
|
237
|
+
--factory myapp.memory_graph:build_graph --port 8789
|
|
238
|
+
|
|
239
|
+
python -m pip install 'atmem[pydantic-provider]'
|
|
240
|
+
atmem provider init ai-context --kind pydantic-ai \
|
|
241
|
+
--factory myapp.memory_agent:build_agent --port 8790
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
`atmem provider init` creates private signing material and prints the exact
|
|
245
|
+
registration command; it does not enable delegated authority. See the
|
|
246
|
+
[context-provider adapter quick starts](docs/context-provider-adapters.md).
|
|
247
|
+
|
|
220
248
|
It gives agent runtimes one governed memory source and one tamper-evident record
|
|
221
249
|
of what the host observed: memory considered and injected, model boundaries,
|
|
222
250
|
tool requests and completions, turn termination, and linked external outcome
|
|
@@ -232,7 +260,7 @@ and restores it exactly.
|
|
|
232
260
|
## Installation details
|
|
233
261
|
|
|
234
262
|
```bash
|
|
235
|
-
python -m pip install --pre atmem==2.2.
|
|
263
|
+
python -m pip install --pre atmem==2.2.6b3
|
|
236
264
|
atmem --version
|
|
237
265
|
```
|
|
238
266
|
|
|
@@ -240,7 +268,7 @@ AtMem requires Python 3.10 or newer. It always creates a dependency-free local
|
|
|
240
268
|
vector sidecar; the semantic extra adds an optional local embedding upgrade:
|
|
241
269
|
|
|
242
270
|
```bash
|
|
243
|
-
python -m pip install --pre 'atmem[semantic]==2.2.
|
|
271
|
+
python -m pip install --pre 'atmem[semantic]==2.2.6b3'
|
|
244
272
|
```
|
|
245
273
|
|
|
246
274
|
For repository development, install both workspace packages:
|
|
@@ -420,7 +448,7 @@ atmem control restore
|
|
|
420
448
|
Existing 2.1 installations upgrade without starting a new migration:
|
|
421
449
|
|
|
422
450
|
```bash
|
|
423
|
-
python -m pip install --pre --upgrade atmem==2.2.
|
|
451
|
+
python -m pip install --pre --upgrade atmem==2.2.6b3
|
|
424
452
|
atmem openclaw upgrade
|
|
425
453
|
atmem control verify
|
|
426
454
|
```
|
|
@@ -572,9 +600,9 @@ npm test
|
|
|
572
600
|
npm run smoke
|
|
573
601
|
```
|
|
574
602
|
|
|
575
|
-
Current repository metadata is version **2.2.
|
|
576
|
-
|
|
577
|
-
|
|
603
|
+
Current repository metadata is version **2.2.6b3**. The installer pins the
|
|
604
|
+
compatible OpenClaw bridge independently; provider-only Python releases do not
|
|
605
|
+
force an unnecessary npm publication.
|
|
578
606
|
|
|
579
607
|
## License
|
|
580
608
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# AtMem
|
|
2
2
|
|
|
3
|
-
[](./docs/releases/v2.2.6b3.md)
|
|
4
4
|
[](https://github.com/aetna000/atmem/actions/workflows/ci.yml)
|
|
5
5
|
|
|
6
6
|
**AtMem is a host-neutral Agent Black Box and reversible memory control plane.**
|
|
@@ -15,7 +15,7 @@ authorizes, stores, scopes, injects, corrects, and deletes memory.
|
|
|
15
15
|
### 1. Install AtMem and choose memory intelligence
|
|
16
16
|
|
|
17
17
|
```bash
|
|
18
|
-
python -m pip install --pre --upgrade atmem==2.2.
|
|
18
|
+
python -m pip install --pre --upgrade atmem==2.2.6b3
|
|
19
19
|
atmem atbot setup
|
|
20
20
|
atmem atbot doctor
|
|
21
21
|
atmem dashboard
|
|
@@ -43,7 +43,7 @@ connection. Do not install the npm package yourself.
|
|
|
43
43
|
Already using AtMem 2.1 with OpenClaw? Upgrade in place:
|
|
44
44
|
|
|
45
45
|
```bash
|
|
46
|
-
python -m pip install --pre --upgrade atmem==2.2.
|
|
46
|
+
python -m pip install --pre --upgrade atmem==2.2.6b3
|
|
47
47
|
atmem openclaw upgrade
|
|
48
48
|
atmem control verify
|
|
49
49
|
```
|
|
@@ -66,7 +66,7 @@ selected by `python`, rather than an unrelated `pip` executable on `PATH`.
|
|
|
66
66
|
#### Pydantic AI — native capability
|
|
67
67
|
|
|
68
68
|
```bash
|
|
69
|
-
python -m pip install --pre 'atmem[pydantic-ai]==2.2.
|
|
69
|
+
python -m pip install --pre 'atmem[pydantic-ai]==2.2.6b3'
|
|
70
70
|
atmem control shadow --host generic --memory-db ~/.atmem/memories.db
|
|
71
71
|
```
|
|
72
72
|
|
|
@@ -90,7 +90,7 @@ agent = Agent("openai:gpt-5-mini", capabilities=[memory])
|
|
|
90
90
|
#### LangChain/LangGraph — native middleware
|
|
91
91
|
|
|
92
92
|
```bash
|
|
93
|
-
python -m pip install --pre 'atmem[langgraph]==2.2.
|
|
93
|
+
python -m pip install --pre 'atmem[langgraph]==2.2.6b3'
|
|
94
94
|
atmem control shadow --host generic --memory-db ~/.atmem/memories.db
|
|
95
95
|
```
|
|
96
96
|
|
|
@@ -147,7 +147,7 @@ If AtBot or its selected model is unavailable, AtMem continues with safe local
|
|
|
147
147
|
capture and hybrid ranking. Memory authority and agent operation do not depend
|
|
148
148
|
on a hosted model.
|
|
149
149
|
|
|
150
|
-
> **Release status:** this repository describes **AtMem 2.2.
|
|
150
|
+
> **Release status:** this repository describes **AtMem 2.2.6b3**. AtBot is a
|
|
151
151
|
> separately packaged, headless component installed and managed by AtMem; it is
|
|
152
152
|
> not an independent agent or a second memory authority.
|
|
153
153
|
|
|
@@ -172,6 +172,27 @@ run native retrieval after an accepted delegated decision. Provider failure
|
|
|
172
172
|
withholds context unless the operator explicitly registered native fallback.
|
|
173
173
|
See the [delegated context-provider guide](docs/delegated-context-provider.md).
|
|
174
174
|
|
|
175
|
+
AtMem also ships provider-side adapters, each as an independent optional extra:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# Mem0 chooses context; AtMem verifies and records delivery
|
|
179
|
+
python -m pip install 'atmem[mem0]'
|
|
180
|
+
atmem provider init mem0-local --kind mem0 --mode oss --port 8788
|
|
181
|
+
|
|
182
|
+
# Or use an application-owned LangGraph / Pydantic AI factory
|
|
183
|
+
python -m pip install 'atmem[langgraph-provider]'
|
|
184
|
+
atmem provider init graph-context --kind langgraph \
|
|
185
|
+
--factory myapp.memory_graph:build_graph --port 8789
|
|
186
|
+
|
|
187
|
+
python -m pip install 'atmem[pydantic-provider]'
|
|
188
|
+
atmem provider init ai-context --kind pydantic-ai \
|
|
189
|
+
--factory myapp.memory_agent:build_agent --port 8790
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
`atmem provider init` creates private signing material and prints the exact
|
|
193
|
+
registration command; it does not enable delegated authority. See the
|
|
194
|
+
[context-provider adapter quick starts](docs/context-provider-adapters.md).
|
|
195
|
+
|
|
175
196
|
It gives agent runtimes one governed memory source and one tamper-evident record
|
|
176
197
|
of what the host observed: memory considered and injected, model boundaries,
|
|
177
198
|
tool requests and completions, turn termination, and linked external outcome
|
|
@@ -187,7 +208,7 @@ and restores it exactly.
|
|
|
187
208
|
## Installation details
|
|
188
209
|
|
|
189
210
|
```bash
|
|
190
|
-
python -m pip install --pre atmem==2.2.
|
|
211
|
+
python -m pip install --pre atmem==2.2.6b3
|
|
191
212
|
atmem --version
|
|
192
213
|
```
|
|
193
214
|
|
|
@@ -195,7 +216,7 @@ AtMem requires Python 3.10 or newer. It always creates a dependency-free local
|
|
|
195
216
|
vector sidecar; the semantic extra adds an optional local embedding upgrade:
|
|
196
217
|
|
|
197
218
|
```bash
|
|
198
|
-
python -m pip install --pre 'atmem[semantic]==2.2.
|
|
219
|
+
python -m pip install --pre 'atmem[semantic]==2.2.6b3'
|
|
199
220
|
```
|
|
200
221
|
|
|
201
222
|
For repository development, install both workspace packages:
|
|
@@ -375,7 +396,7 @@ atmem control restore
|
|
|
375
396
|
Existing 2.1 installations upgrade without starting a new migration:
|
|
376
397
|
|
|
377
398
|
```bash
|
|
378
|
-
python -m pip install --pre --upgrade atmem==2.2.
|
|
399
|
+
python -m pip install --pre --upgrade atmem==2.2.6b3
|
|
379
400
|
atmem openclaw upgrade
|
|
380
401
|
atmem control verify
|
|
381
402
|
```
|
|
@@ -527,9 +548,9 @@ npm test
|
|
|
527
548
|
npm run smoke
|
|
528
549
|
```
|
|
529
550
|
|
|
530
|
-
Current repository metadata is version **2.2.
|
|
531
|
-
|
|
532
|
-
|
|
551
|
+
Current repository metadata is version **2.2.6b3**. The installer pins the
|
|
552
|
+
compatible OpenClaw bridge independently; provider-only Python releases do not
|
|
553
|
+
force an unnecessary npm publication.
|
|
533
554
|
|
|
534
555
|
## License
|
|
535
556
|
|
|
@@ -256,6 +256,59 @@ wants AtMem to resume native context preparation when the provider fails.""",
|
|
|
256
256
|
command_parser = delegated_commands.add_parser(name, help=help_text)
|
|
257
257
|
command_parser.add_argument("--json", action="store_true")
|
|
258
258
|
|
|
259
|
+
provider_parser = subparsers.add_parser(
|
|
260
|
+
"provider",
|
|
261
|
+
help="Run an optional Mem0, LangGraph, or Pydantic AI context authority",
|
|
262
|
+
description=(
|
|
263
|
+
"Create a signed local context-provider service. Initialization and startup "
|
|
264
|
+
"do not change AtMem authority; registration and enablement remain explicit."
|
|
265
|
+
),
|
|
266
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
267
|
+
epilog="""Examples:
|
|
268
|
+
python -m pip install 'atmem[mem0]'
|
|
269
|
+
atmem provider init memory-provider --kind mem0 --mode oss --port 8788
|
|
270
|
+
atmem provider start memory-provider
|
|
271
|
+
atmem provider doctor memory-provider
|
|
272
|
+
|
|
273
|
+
python -m pip install 'atmem[langgraph-provider]'
|
|
274
|
+
atmem provider init graph-provider --kind langgraph \
|
|
275
|
+
--factory myapp.context:build_graph --port 8789
|
|
276
|
+
|
|
277
|
+
python -m pip install 'atmem[pydantic-provider]'
|
|
278
|
+
atmem provider init ai-provider --kind pydantic-ai \
|
|
279
|
+
--factory myapp.context:build_agent --egress hosted --port 8790
|
|
280
|
+
|
|
281
|
+
The init result prints the separate `atmem delegated register` command. Run its
|
|
282
|
+
matching `atmem delegated enable` command only after reviewing the exact scopes.""",
|
|
283
|
+
)
|
|
284
|
+
provider_commands = provider_parser.add_subparsers(dest="provider_command")
|
|
285
|
+
provider_init = provider_commands.add_parser("init", help="Create private keys and secret-free configuration")
|
|
286
|
+
provider_init.add_argument("instance")
|
|
287
|
+
provider_init.add_argument("--kind", required=True, choices=("mem0", "langgraph", "pydantic-ai"))
|
|
288
|
+
provider_init.add_argument("--port", type=int, default=8788)
|
|
289
|
+
provider_init.add_argument("--factory", default=None, help="Operator factory in module:attribute form")
|
|
290
|
+
provider_init.add_argument("--mode", choices=("oss", "platform"), default=None, help="Mem0 client mode")
|
|
291
|
+
provider_init.add_argument("--provider-id", default=None)
|
|
292
|
+
provider_init.add_argument("--provider-version", default="1.0")
|
|
293
|
+
provider_init.add_argument("--egress", choices=("local", "hosted"), default="local")
|
|
294
|
+
provider_init.add_argument("--json", action="store_true")
|
|
295
|
+
for name, help_text in (
|
|
296
|
+
("serve", "Run one provider in the foreground"),
|
|
297
|
+
("start", "Start one private background provider process"),
|
|
298
|
+
("stop", "Stop only the PID owned by this provider instance"),
|
|
299
|
+
("doctor", "Check dependencies, files, service health, and next trust step"),
|
|
300
|
+
):
|
|
301
|
+
command_parser = provider_commands.add_parser(name, help=help_text)
|
|
302
|
+
command_parser.add_argument("instance")
|
|
303
|
+
command_parser.add_argument("--json", action="store_true")
|
|
304
|
+
provider_status = provider_commands.add_parser("status", help="Show redacted provider state")
|
|
305
|
+
provider_status.add_argument("instance", nargs="?")
|
|
306
|
+
provider_status.add_argument("--json", action="store_true")
|
|
307
|
+
provider_remove = provider_commands.add_parser("remove", help="Remove a stopped provider; AtMem evidence is retained")
|
|
308
|
+
provider_remove.add_argument("instance")
|
|
309
|
+
provider_remove.add_argument("--yes", action="store_true")
|
|
310
|
+
provider_remove.add_argument("--json", action="store_true")
|
|
311
|
+
|
|
259
312
|
benchmark_parser = subparsers.add_parser(
|
|
260
313
|
"benchmark",
|
|
261
314
|
help="Run reproducible memory-quality gates and compare external results",
|
|
@@ -885,6 +938,13 @@ External evaluation:
|
|
|
885
938
|
_run_delegated(args)
|
|
886
939
|
return
|
|
887
940
|
|
|
941
|
+
if args.command == "provider":
|
|
942
|
+
if args.provider_command is None:
|
|
943
|
+
provider_parser.print_help()
|
|
944
|
+
return
|
|
945
|
+
_run_provider(args)
|
|
946
|
+
return
|
|
947
|
+
|
|
888
948
|
if args.command == "benchmark":
|
|
889
949
|
if args.benchmark_command is None:
|
|
890
950
|
benchmark_parser.print_help()
|
|
@@ -2040,6 +2100,67 @@ def _run_delegated(args: argparse.Namespace) -> None:
|
|
|
2040
2100
|
print(f"Removed {result['registration_id']}")
|
|
2041
2101
|
else:
|
|
2042
2102
|
print(json.dumps(result, indent=2, sort_keys=True, default=str))
|
|
2103
|
+
|
|
2104
|
+
|
|
2105
|
+
def _run_provider(args: argparse.Namespace) -> None:
|
|
2106
|
+
from atmem.provider_adapters import lifecycle
|
|
2107
|
+
|
|
2108
|
+
command = args.provider_command
|
|
2109
|
+
try:
|
|
2110
|
+
if command == "init":
|
|
2111
|
+
result = lifecycle.initialize(
|
|
2112
|
+
instance=args.instance, kind=args.kind, port=args.port,
|
|
2113
|
+
factory=args.factory, mode=args.mode, provider_id=args.provider_id,
|
|
2114
|
+
provider_version=args.provider_version, egress=args.egress,
|
|
2115
|
+
)
|
|
2116
|
+
elif command == "serve":
|
|
2117
|
+
from atmem.provider_adapters.server import serve
|
|
2118
|
+
|
|
2119
|
+
_, config = lifecycle.load_config(args.instance)
|
|
2120
|
+
serve(lifecycle.build_runtime(args.instance), config["host"], config["port"])
|
|
2121
|
+
return
|
|
2122
|
+
elif command == "start":
|
|
2123
|
+
result = lifecycle.start(args.instance)
|
|
2124
|
+
elif command == "stop":
|
|
2125
|
+
result = lifecycle.stop(args.instance)
|
|
2126
|
+
elif command == "doctor":
|
|
2127
|
+
result = lifecycle.doctor(args.instance)
|
|
2128
|
+
elif command == "status":
|
|
2129
|
+
if args.instance:
|
|
2130
|
+
result = lifecycle.status(args.instance)
|
|
2131
|
+
else:
|
|
2132
|
+
root = lifecycle.provider_root()
|
|
2133
|
+
result = {
|
|
2134
|
+
"format": "atmem-provider-status-list-v1",
|
|
2135
|
+
"providers": [
|
|
2136
|
+
lifecycle.status(path.name)
|
|
2137
|
+
for path in sorted(root.iterdir())
|
|
2138
|
+
if path.is_dir() and not path.is_symlink()
|
|
2139
|
+
] if root.is_dir() else [],
|
|
2140
|
+
}
|
|
2141
|
+
elif command == "remove":
|
|
2142
|
+
if not args.yes:
|
|
2143
|
+
raise ValueError("provider removal requires --yes")
|
|
2144
|
+
result = lifecycle.remove(args.instance)
|
|
2145
|
+
else: # pragma: no cover
|
|
2146
|
+
raise ValueError(f"unknown provider command: {command}")
|
|
2147
|
+
except (ImportError, OSError, RuntimeError, ValueError) as exc:
|
|
2148
|
+
print(f"error: {exc}", file=sys.stderr)
|
|
2149
|
+
raise SystemExit(2) from exc
|
|
2150
|
+
if getattr(args, "json", False):
|
|
2151
|
+
print(json.dumps(result, indent=2, sort_keys=True, default=str))
|
|
2152
|
+
return
|
|
2153
|
+
if command == "init":
|
|
2154
|
+
print(f"Created provider {result['instance']} (authority remains native AtMem).")
|
|
2155
|
+
print("Start it:")
|
|
2156
|
+
print(f" atmem provider start {result['instance']}")
|
|
2157
|
+
print("Register exact trust scopes (still disabled):")
|
|
2158
|
+
print(f" {result['registration_command']}")
|
|
2159
|
+
print(f"Then review and enable: atmem delegated enable {result['provider_id']}:{result['instance']}")
|
|
2160
|
+
else:
|
|
2161
|
+
print(json.dumps(result, indent=2, sort_keys=True, default=str))
|
|
2162
|
+
|
|
2163
|
+
|
|
2043
2164
|
def _interactive_atbot_setup(manager: Any) -> dict[str, Any]:
|
|
2044
2165
|
from atmem.control.atbot_service import PROVIDER_PROFILES
|
|
2045
2166
|
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""Optional context-provider adapters for AtMem's delegated v1 contract."""
|
|
2
|
+
|
|
3
|
+
from .models import ContextItem, ProviderProposal, ProviderRequest, ProviderRuntimeIdentity
|
|
4
|
+
from .runtime import ProviderRuntime
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
"ContextItem",
|
|
8
|
+
"ProviderProposal",
|
|
9
|
+
"ProviderRequest",
|
|
10
|
+
"ProviderRuntime",
|
|
11
|
+
"ProviderRuntimeIdentity",
|
|
12
|
+
]
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""LangGraph-backed delegated context provider."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import inspect
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from .models import ProviderProposal, ProviderRequest
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class LangGraphContextProvider:
|
|
12
|
+
def __init__(self, graph: Any):
|
|
13
|
+
self.graph = graph
|
|
14
|
+
self.attribution = {"adapter": "langgraph"}
|
|
15
|
+
|
|
16
|
+
async def decide(self, request: ProviderRequest) -> ProviderProposal:
|
|
17
|
+
graph_input = {"delegated_request": {
|
|
18
|
+
"query": request.query,
|
|
19
|
+
"query_sha256": request.query_sha256,
|
|
20
|
+
"binding": request.binding.to_dict(),
|
|
21
|
+
"max_context_bytes": request.max_context_bytes,
|
|
22
|
+
"deadline": request.deadline,
|
|
23
|
+
}}
|
|
24
|
+
config = {"configurable": {"thread_id": f"{request.binding.session_id}:{request.binding.turn_id}"}}
|
|
25
|
+
if hasattr(self.graph, "ainvoke"):
|
|
26
|
+
output = await self.graph.ainvoke(graph_input, config=dict(config))
|
|
27
|
+
elif hasattr(self.graph, "invoke"):
|
|
28
|
+
output = self.graph.invoke(graph_input, config=dict(config))
|
|
29
|
+
if inspect.isawaitable(output):
|
|
30
|
+
output = await output
|
|
31
|
+
elif callable(self.graph):
|
|
32
|
+
output = self.graph(graph_input, dict(config))
|
|
33
|
+
if inspect.isawaitable(output):
|
|
34
|
+
output = await output
|
|
35
|
+
else:
|
|
36
|
+
raise ValueError("LangGraph provider requires an invokable graph or callable")
|
|
37
|
+
interrupts = getattr(output, "interrupts", ())
|
|
38
|
+
if interrupts:
|
|
39
|
+
raise ValueError("LangGraph interrupted before a context decision")
|
|
40
|
+
value = getattr(output, "value", output)
|
|
41
|
+
if not isinstance(value, dict) or set(value) != {"context_decision"}:
|
|
42
|
+
raise ValueError("LangGraph output must contain only context_decision")
|
|
43
|
+
return ProviderProposal.from_dict(value["context_decision"])
|