openbox-langgraph-sdk-python 0.2.0__tar.gz → 1.0.0__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.
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/.coverage +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/.gitignore +4 -1
- openbox_langgraph_sdk_python-1.0.0/CHANGELOG.md +60 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/CLAUDE.md +4 -2
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/PKG-INFO +10 -7
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/README.md +6 -5
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/coverage.xml +1532 -1155
- openbox_langgraph_sdk_python-1.0.0/demo/demo_04_content_builder_langgraph/.env.example +11 -0
- openbox_langgraph_sdk_python-1.0.0/demo/demo_04_content_builder_langgraph/.gitignore +5 -0
- openbox_langgraph_sdk_python-1.0.0/demo/demo_04_content_builder_langgraph/AGENTS.md +43 -0
- openbox_langgraph_sdk_python-1.0.0/demo/demo_04_content_builder_langgraph/README.md +68 -0
- openbox_langgraph_sdk_python-1.0.0/demo/demo_04_content_builder_langgraph/pyproject.toml +31 -0
- openbox_langgraph_sdk_python-1.0.0/demo/demo_04_content_builder_langgraph/skills/blog-post/SKILL.md +126 -0
- openbox_langgraph_sdk_python-1.0.0/demo/demo_04_content_builder_langgraph/skills/social-media/SKILL.md +177 -0
- openbox_langgraph_sdk_python-1.0.0/demo/demo_04_content_builder_langgraph/src/demo_04_content_builder_langgraph/__init__.py +1 -0
- openbox_langgraph_sdk_python-1.0.0/demo/demo_04_content_builder_langgraph/src/demo_04_content_builder_langgraph/agent.py +74 -0
- openbox_langgraph_sdk_python-1.0.0/demo/demo_04_content_builder_langgraph/src/demo_04_content_builder_langgraph/main.py +101 -0
- openbox_langgraph_sdk_python-1.0.0/demo/demo_04_content_builder_langgraph/src/demo_04_content_builder_langgraph/paths.py +10 -0
- openbox_langgraph_sdk_python-1.0.0/demo/demo_04_content_builder_langgraph/src/demo_04_content_builder_langgraph/prompt.py +77 -0
- openbox_langgraph_sdk_python-1.0.0/demo/demo_04_content_builder_langgraph/src/demo_04_content_builder_langgraph/tools_content.py +84 -0
- openbox_langgraph_sdk_python-1.0.0/demo/demo_04_content_builder_langgraph/src/demo_04_content_builder_langgraph/tools_fs.py +63 -0
- openbox_langgraph_sdk_python-1.0.0/demo/demo_04_content_builder_langgraph/uv.lock +2130 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/openbox_langgraph/__init__.py +3 -0
- openbox_langgraph_sdk_python-1.0.0/openbox_langgraph/activity_context_binding.py +126 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/openbox_langgraph/client.py +170 -47
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/openbox_langgraph/config.py +31 -0
- openbox_langgraph_sdk_python-1.0.0/openbox_langgraph/core_adapter.py +223 -0
- openbox_langgraph_sdk_python-1.0.0/openbox_langgraph/core_events.py +141 -0
- openbox_langgraph_sdk_python-1.0.0/openbox_langgraph/core_runtime.py +169 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/openbox_langgraph/identity.py +37 -27
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/openbox_langgraph/langgraph_handler.py +824 -300
- openbox_langgraph_sdk_python-1.0.0/openbox_langgraph/langgraph_hook_runtime.py +201 -0
- openbox_langgraph_sdk_python-1.0.0/openbox_langgraph/otel_setup.py +36 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/openbox_langgraph/span_processor.py +18 -6
- openbox_langgraph_sdk_python-1.0.0/openbox_langgraph/tool_activity_binding.py +339 -0
- openbox_langgraph_sdk_python-1.0.0/openbox_langgraph/trace_context_registry.py +197 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/openbox_langgraph/tracing.py +7 -127
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/openbox_langgraph/types.py +168 -9
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/pyproject.toml +19 -2
- openbox_langgraph_sdk_python-1.0.0/tests/conftest.py +69 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/README.md +171 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/__init__.py +6 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/capture_harness.py +177 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/chain_completed.normalized.json +60 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/chain_completed.raw.json +60 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/chain_started.handbuilt_serialization_pin.normalized.json +17 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/chain_started.handbuilt_serialization_pin.raw.json +17 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/fake_agent_graphs.py +125 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/generate_fixtures.py +135 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/graph_capture_harness.py +196 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/headers_signed.normalized.json +34 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/headers_signed.raw.json +34 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/headers_unsigned.normalized.json +24 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/headers_unsigned.raw.json +24 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/id_normalization.py +135 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/layer1_handbuilt_pins.py +71 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/llm_completed.normalized.json +29 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/llm_completed.raw.json +29 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/llm_started.normalized.json +18 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/llm_started.raw.json +18 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/ordering_single_llm_turn.json +22 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/ordering_tool_call_turn.json +38 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/ordering_two_llm_calls_turn.json +30 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/real_emitted_event_fixtures.py +136 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/signal_received.normalized.json +16 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/signal_received.raw.json +16 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/subagent_tool_completed.normalized.json +30 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/subagent_tool_completed.raw.json +30 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/subagent_tool_started.normalized.json +31 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/subagent_tool_started.raw.json +31 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/tool_completed.normalized.json +28 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/tool_completed.raw.json +28 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/tool_started.normalized.json +23 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/tool_started.raw.json +23 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/workflow_completed_error_close.normalized.json +14 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/workflow_completed_error_close.raw.json +14 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/workflow_failed.handbuilt_serialization_pin.normalized.json +16 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/workflow_failed.handbuilt_serialization_pin.raw.json +16 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/workflow_started.normalized.json +26 -0
- openbox_langgraph_sdk_python-1.0.0/tests/golden/workflow_started.raw.json +26 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_activity_context_binding.py +688 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_approval_strict_parsing.py +76 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_client_shim_compat.py +99 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/tests/test_config_client_core.py +4 -2
- openbox_langgraph_sdk_python-1.0.0/tests/test_config_resolution_precedence.py +29 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_context_cleanup_on_error.py +341 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_context_fallback_task_and_thread.py +194 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_context_turn_isolation.py +315 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_core_conformance_suite.py +173 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_core_context_binding.py +350 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_core_events_envelopes.py +299 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_core_runtime_config.py +126 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/tests/test_did_client_signing.py +0 -43
- openbox_langgraph_sdk_python-1.0.0/tests/test_fail_open_block_preserved.py +113 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_framework_adapter_translation.py +233 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_gate_error_translation.py +104 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_golden_baseline.py +214 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_governance_changes.py +158 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_halt_run_isolation.py +157 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_hook_approval_retry.py +242 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_hook_context_pinning.py +128 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_hook_family_exclusivity.py +207 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_langchain_callback_dedup.py +522 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_langchain_callback_llm_context.py +531 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_langchain_callback_tool_ordering.py +391 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_lifecycle_golden_parity.py +158 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_loop_liveness_on_sync_approval.py +131 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_public_exports_baseline.py +115 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_recording_client_seam.py +64 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_signed_headers_parity.py +74 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_types_hook_core.py +98 -0
- openbox_langgraph_sdk_python-1.0.0/tests/test_version_static.py +53 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/uv.lock +222 -111
- openbox_langgraph_sdk_python-0.2.0/openbox_langgraph/db_governance_hooks.py +0 -897
- openbox_langgraph_sdk_python-0.2.0/openbox_langgraph/file_governance_hooks.py +0 -419
- openbox_langgraph_sdk_python-0.2.0/openbox_langgraph/hook_governance.py +0 -424
- openbox_langgraph_sdk_python-0.2.0/openbox_langgraph/http_governance_hooks.py +0 -723
- openbox_langgraph_sdk_python-0.2.0/openbox_langgraph/otel_setup.py +0 -477
- openbox_langgraph_sdk_python-0.2.0/plans/260320-0329-remove-span-collector/plan.md +0 -121
- openbox_langgraph_sdk_python-0.2.0/plans/260321-2019-port-deepagent-fixes/phase-01-remove-hitl-gates.md +0 -53
- openbox_langgraph_sdk_python-0.2.0/plans/260321-2019-port-deepagent-fixes/phase-02-sqlalchemy-engine.md +0 -46
- openbox_langgraph_sdk_python-0.2.0/plans/260321-2019-port-deepagent-fixes/phase-03-hook-hitl-retry.md +0 -80
- openbox_langgraph_sdk_python-0.2.0/plans/260321-2019-port-deepagent-fixes/plan.md +0 -42
- openbox_langgraph_sdk_python-0.2.0/plans/reports/Explore-260330-1430-comprehensive-sdk-analysis.md +0 -1753
- openbox_langgraph_sdk_python-0.2.0/plans/reports/Explore-260330-2300-file-reference.md +0 -215
- openbox_langgraph_sdk_python-0.2.0/plans/reports/Explore-260330-2300-integration-guide.md +0 -747
- openbox_langgraph_sdk_python-0.2.0/plans/reports/code-reviewer-260323-1101-code-reuse-otel-hooks.md +0 -206
- openbox_langgraph_sdk_python-0.2.0/plans/reports/code-reviewer-260323-1101-efficiency-review-otel-http-hook-spans.md +0 -193
- openbox_langgraph_sdk_python-0.2.0/plans/reports/code-reviewer-260323-1101-hacky-patterns-review.md +0 -175
- openbox_langgraph_sdk_python-0.2.0/plans/reports/docs-manager-260321-2153-initial-documentation.md +0 -363
- openbox_langgraph_sdk_python-0.2.0/plans/reports/span-flow-visualization.html +0 -456
- openbox_langgraph_sdk_python-0.2.0/tests/test_governance_changes.py +0 -279
- openbox_langgraph_sdk_python-0.2.0/tests/test_telemetry_payload.py +0 -333
- openbox_langgraph_sdk_python-0.2.0/tests/test_types_hook_core.py +0 -214
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/.github/CODEOWNERS +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/.github/workflows/pr-governance.yml +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/.github/workflows/pr-quality.yml +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/.github/workflows/pr-security.yml +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/.github/workflows/publish.yml +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/.gitleaks.toml +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/AGENTS.md +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/CODE_OF_CONDUCT.md +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/LICENSE +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/SECURITY.md +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/docs/code-standards.md +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/docs/codebase-summary.md +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/docs/project-overview-pdr.md +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/docs/project-roadmap.md +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/docs/system-architecture.md +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/openbox_langgraph/errors.py +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/openbox_langgraph/hitl.py +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/openbox_langgraph/verdict_handler.py +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/sonar-project.properties +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/tests/test_agent_identity.py +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/tests/test_contextvars_propagation.py +0 -0
- {openbox_langgraph_sdk_python-0.2.0 → openbox_langgraph_sdk_python-1.0.0}/tests/test_verdict_span_hitl_core.py +0 -0
|
Binary file
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.3.0
|
|
4
|
+
|
|
5
|
+
Migrates the SDK onto the shared `openbox-sdk-python` (`openbox_core`) governance
|
|
6
|
+
core. The public API (classes, functions, `initialize()` signature, DID signing)
|
|
7
|
+
is preserved; the changes below are internal rewiring plus a small, deliberate
|
|
8
|
+
set of wire and semantic changes, each regression-gated by a reproducible
|
|
9
|
+
golden-payload oracle.
|
|
10
|
+
|
|
11
|
+
### Changed — wire protocol (lifecycle events)
|
|
12
|
+
|
|
13
|
+
- Lifecycle events (`SignalReceived`, `WorkflowStarted`/`Completed`,
|
|
14
|
+
`LLMStarted`/`Completed`, `ToolStarted`/`Completed`) now serialize through the
|
|
15
|
+
shared `openbox_core` `EventEnvelope` + strict gate instead of hand-built
|
|
16
|
+
request bodies. The wire body is byte-identical to before **except** three
|
|
17
|
+
compatibility-noise fields the base envelope omits by construction and no
|
|
18
|
+
longer sends for lifecycle events: `hook_trigger: false`, `spans: []`,
|
|
19
|
+
`span_count: 0`. Core treats an absent `hook_trigger` as `false`; this is the
|
|
20
|
+
same envelope format the Temporal SDK already ships to Core.
|
|
21
|
+
- Lifecycle-event requests now carry the base SDK's `User-Agent`; hook-triggered
|
|
22
|
+
requests keep `OpenBox-LangGraph-SDK/<version>`.
|
|
23
|
+
|
|
24
|
+
### Changed — semantics
|
|
25
|
+
|
|
26
|
+
- **Approval parsing is action-first and strict.** When both are present the
|
|
27
|
+
`action` field now wins over `verdict` (was verdict-first). An unknown or
|
|
28
|
+
empty approval response resolves to *pending* (keeps polling) — never an
|
|
29
|
+
implicit approve. The previous lenient "unknown → allow" fallback at the
|
|
30
|
+
human-approval boundary is removed.
|
|
31
|
+
- **Hook-level HITL approval retry now runs governed.** After an approval is
|
|
32
|
+
granted, the pending abort state is cleared on both the base and legacy stores
|
|
33
|
+
before the graph re-invokes. Previously the stale abort flag re-blocked the
|
|
34
|
+
approved retry (`clear_activity_abort` had no caller) — a genuine bug, now
|
|
35
|
+
fixed.
|
|
36
|
+
- **Fail-open is precise.** A governance transport/parse failure surfaces as
|
|
37
|
+
"no verdict" (fail-open, unchanged) only for a genuine client-synthesized
|
|
38
|
+
fallback; a real blocking verdict that happens to carry `fallback_used: true`
|
|
39
|
+
still enforces.
|
|
40
|
+
- Expired-approval-before-allow ordering is unchanged (an expired approval
|
|
41
|
+
raises even when allow-shaped).
|
|
42
|
+
|
|
43
|
+
### Added
|
|
44
|
+
|
|
45
|
+
- **`use_core_instrumentation`** config flag (default `False`). When enabled,
|
|
46
|
+
covered hook families (`http`, `dbapi`, `asyncpg`, `sqlalchemy`, `file`) are
|
|
47
|
+
governed through the shared `openbox_core` hook runtime while uncovered
|
|
48
|
+
families (`urllib`, `urllib3`, `redis`, `mongo`) stay on the legacy hooks —
|
|
49
|
+
each operation governed exactly once. Approval on this path is raise-only and
|
|
50
|
+
never blocks the event loop. Per-family flips (making the core runtime the
|
|
51
|
+
default for a family) remain follow-up work.
|
|
52
|
+
- `openbox_langgraph.__version__`.
|
|
53
|
+
- `multi_agent_session_id` config/handler option (distinct from `session_id`).
|
|
54
|
+
- Dependency on `openbox-sdk-python` (the shared governance core).
|
|
55
|
+
|
|
56
|
+
### Preserved (regression-gated)
|
|
57
|
+
|
|
58
|
+
DID request signing (byte-identical `X-OpenBox-Agent-*` headers), the
|
|
59
|
+
`(activity_id, event_type)` de-dup, transient-failure PII redaction, the
|
|
60
|
+
public `client=` injection seam, and every public class/function signature.
|
|
@@ -37,8 +37,10 @@ cd test-agent && uv run python agent.py
|
|
|
37
37
|
|
|
38
38
|
The SDK has three governance layers that intercept operations at different levels:
|
|
39
39
|
|
|
40
|
-
### Layer 1:
|
|
41
|
-
|
|
40
|
+
### Layer 1: Tool/LLM Lifecycle (Producer-Owned via LangChain-Core Callback)
|
|
41
|
+
Tool and LLM lifecycle emission is **owned by the callback layer** (`openbox-langchain-sdk-python`). The `OpenBoxLangChainCoreAsyncCallbackHandler` / `...SyncCallbackHandler` emit lifecycle events (ActivityStarted, ActivityCompleted, LLMStarted, LLMCompleted) directly to OpenBox Core via the `ActivityBridge` ownership channel. This fixes span ordering/correlation bugs: tool hook spans now nest inside the tool's ActivityStarted activity; LLM provider hook spans map into the LLM activity; completions reuse the start activity_id (no more `-c` suffix).
|
|
42
|
+
|
|
43
|
+
The LangGraph stream-event layer serves as a **fallback for telemetry and span reconstruction** when the callback is not installed (e.g., injected clients or subagent-gated handlers). Completions use stream events for telemetry only — `gate.aevaluate()` polls and continues, never retries the graph. **Sync agents fail-shut on REQUIRE_APPROVAL** (no working sync approval poller).
|
|
42
44
|
|
|
43
45
|
### Layer 2: Hook Governance (http/db/file_governance_hooks.py)
|
|
44
46
|
Intercepts low-level operations using built-in instrumentation:
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openbox-langgraph-sdk-python
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 1.0.0
|
|
4
4
|
Summary: OpenBox governance and observability SDK for LangGraph
|
|
5
5
|
License: MIT
|
|
6
6
|
License-File: LICENSE
|
|
7
7
|
Requires-Python: >=3.11
|
|
8
|
-
Requires-Dist: cryptography>=42.0.0
|
|
9
8
|
Requires-Dist: httpx>=0.27.0
|
|
10
9
|
Requires-Dist: langchain-core>=1.3.3
|
|
11
10
|
Requires-Dist: langgraph>=0.2.0
|
|
11
|
+
Requires-Dist: langsmith>=0.8.18
|
|
12
|
+
Requires-Dist: openbox-langchain-sdk-python>=1.0.0
|
|
13
|
+
Requires-Dist: openbox-sdk-python>=1.0.1
|
|
12
14
|
Requires-Dist: opentelemetry-api>=1.20.0
|
|
13
15
|
Requires-Dist: opentelemetry-instrumentation-asyncpg>=0.41b0
|
|
14
16
|
Requires-Dist: opentelemetry-instrumentation-httpx>=0.41b0
|
|
@@ -84,10 +86,11 @@ Your code SDK (3 layers) OpenBox Co
|
|
|
84
86
|
|
|
85
87
|
governed.ainvoke()
|
|
86
88
|
│
|
|
87
|
-
├─ Layer 1:
|
|
88
|
-
│
|
|
89
|
-
│
|
|
90
|
-
│
|
|
89
|
+
├─ Layer 1: Tool/LLM Lifecycle (openbox-langchain-sdk-python)
|
|
90
|
+
│ Tool lifecycle via LangChain-Core callback ────────────────→ Policy engine
|
|
91
|
+
│ LLM lifecycle via LangChain-Core callback ───────────────→ Guardrails
|
|
92
|
+
│ ActivityBridge deduplicates callback events
|
|
93
|
+
│ Stream events serve as fallback (when callback not installed)
|
|
91
94
|
│ ↑ enforce verdict (allow / block / redact / pause)
|
|
92
95
|
│
|
|
93
96
|
├─ Layer 2: Hook Governance (http/db/file hooks)
|
|
@@ -101,7 +104,7 @@ governed.ainvoke()
|
|
|
101
104
|
Links hook-level operations to the tool call that triggered them
|
|
102
105
|
```
|
|
103
106
|
|
|
104
|
-
**Layer 1**
|
|
107
|
+
**Layer 1** tool and LLM lifecycle is **producer-owned** via the LangChain-Core callback (owned by `openbox-langchain-sdk-python`). It sends governance events (ActivityStarted, LLMStarted, etc.) to OpenBox Core and enforces verdicts. The LangGraph event stream serves as a fallback when the callback is not installed (e.g., injected clients or subagent-gated handlers); completions use stream events for telemetry only via `gate.aevaluate` (poll-and-continue, never retry-the-graph).
|
|
105
108
|
|
|
106
109
|
**Layer 2** uses built-in instrumentation to intercept low-level operations (HTTP requests, DB queries, file I/O) made by your tools. Each operation is evaluated at two stages: `started` (can block) and `completed` (informational).
|
|
107
110
|
|
|
@@ -44,10 +44,11 @@ Your code SDK (3 layers) OpenBox Co
|
|
|
44
44
|
|
|
45
45
|
governed.ainvoke()
|
|
46
46
|
│
|
|
47
|
-
├─ Layer 1:
|
|
48
|
-
│
|
|
49
|
-
│
|
|
50
|
-
│
|
|
47
|
+
├─ Layer 1: Tool/LLM Lifecycle (openbox-langchain-sdk-python)
|
|
48
|
+
│ Tool lifecycle via LangChain-Core callback ────────────────→ Policy engine
|
|
49
|
+
│ LLM lifecycle via LangChain-Core callback ───────────────→ Guardrails
|
|
50
|
+
│ ActivityBridge deduplicates callback events
|
|
51
|
+
│ Stream events serve as fallback (when callback not installed)
|
|
51
52
|
│ ↑ enforce verdict (allow / block / redact / pause)
|
|
52
53
|
│
|
|
53
54
|
├─ Layer 2: Hook Governance (http/db/file hooks)
|
|
@@ -61,7 +62,7 @@ governed.ainvoke()
|
|
|
61
62
|
Links hook-level operations to the tool call that triggered them
|
|
62
63
|
```
|
|
63
64
|
|
|
64
|
-
**Layer 1**
|
|
65
|
+
**Layer 1** tool and LLM lifecycle is **producer-owned** via the LangChain-Core callback (owned by `openbox-langchain-sdk-python`). It sends governance events (ActivityStarted, LLMStarted, etc.) to OpenBox Core and enforces verdicts. The LangGraph event stream serves as a fallback when the callback is not installed (e.g., injected clients or subagent-gated handlers); completions use stream events for telemetry only via `gate.aevaluate` (poll-and-continue, never retry-the-graph).
|
|
65
66
|
|
|
66
67
|
**Layer 2** uses built-in instrumentation to intercept low-level operations (HTTP requests, DB queries, file I/O) made by your tools. Each operation is evaluated at two stages: `started` (can block) and `completed` (informational).
|
|
67
68
|
|