spanforge 2.0.0__py3-none-any.whl
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.
- spanforge/__init__.py +695 -0
- spanforge/_batch_exporter.py +322 -0
- spanforge/_cli.py +3081 -0
- spanforge/_hooks.py +340 -0
- spanforge/_server.py +953 -0
- spanforge/_span.py +1015 -0
- spanforge/_store.py +287 -0
- spanforge/_stream.py +654 -0
- spanforge/_trace.py +334 -0
- spanforge/_tracer.py +253 -0
- spanforge/actor.py +141 -0
- spanforge/alerts.py +464 -0
- spanforge/auto.py +181 -0
- spanforge/baseline.py +336 -0
- spanforge/config.py +460 -0
- spanforge/consent.py +227 -0
- spanforge/consumer.py +379 -0
- spanforge/core/__init__.py +5 -0
- spanforge/core/compliance_mapping.py +1060 -0
- spanforge/cost.py +597 -0
- spanforge/debug.py +514 -0
- spanforge/drift.py +488 -0
- spanforge/egress.py +63 -0
- spanforge/eval.py +575 -0
- spanforge/event.py +1052 -0
- spanforge/exceptions.py +246 -0
- spanforge/explain.py +181 -0
- spanforge/export/__init__.py +50 -0
- spanforge/export/append_only.py +342 -0
- spanforge/export/cloud.py +349 -0
- spanforge/export/datadog.py +495 -0
- spanforge/export/grafana.py +331 -0
- spanforge/export/jsonl.py +198 -0
- spanforge/export/otel_bridge.py +291 -0
- spanforge/export/otlp.py +817 -0
- spanforge/export/otlp_bridge.py +231 -0
- spanforge/export/redis_backend.py +282 -0
- spanforge/export/webhook.py +302 -0
- spanforge/exporters/__init__.py +29 -0
- spanforge/exporters/console.py +271 -0
- spanforge/exporters/jsonl.py +144 -0
- spanforge/hitl.py +297 -0
- spanforge/inspect.py +429 -0
- spanforge/integrations/__init__.py +39 -0
- spanforge/integrations/_pricing.py +277 -0
- spanforge/integrations/anthropic.py +388 -0
- spanforge/integrations/bedrock.py +306 -0
- spanforge/integrations/crewai.py +251 -0
- spanforge/integrations/gemini.py +349 -0
- spanforge/integrations/groq.py +444 -0
- spanforge/integrations/langchain.py +349 -0
- spanforge/integrations/llamaindex.py +370 -0
- spanforge/integrations/ollama.py +286 -0
- spanforge/integrations/openai.py +370 -0
- spanforge/integrations/together.py +485 -0
- spanforge/metrics.py +393 -0
- spanforge/metrics_export.py +342 -0
- spanforge/migrate.py +278 -0
- spanforge/model_registry.py +282 -0
- spanforge/models.py +407 -0
- spanforge/namespaces/__init__.py +215 -0
- spanforge/namespaces/audit.py +253 -0
- spanforge/namespaces/cache.py +209 -0
- spanforge/namespaces/chain.py +74 -0
- spanforge/namespaces/confidence.py +69 -0
- spanforge/namespaces/consent.py +85 -0
- spanforge/namespaces/cost.py +175 -0
- spanforge/namespaces/decision.py +135 -0
- spanforge/namespaces/diff.py +146 -0
- spanforge/namespaces/drift.py +79 -0
- spanforge/namespaces/eval_.py +232 -0
- spanforge/namespaces/fence.py +180 -0
- spanforge/namespaces/guard.py +104 -0
- spanforge/namespaces/hitl.py +92 -0
- spanforge/namespaces/latency.py +69 -0
- spanforge/namespaces/prompt.py +185 -0
- spanforge/namespaces/redact.py +172 -0
- spanforge/namespaces/template.py +197 -0
- spanforge/namespaces/tool_call.py +76 -0
- spanforge/namespaces/trace.py +1006 -0
- spanforge/normalizer.py +183 -0
- spanforge/presidio_backend.py +149 -0
- spanforge/processor.py +258 -0
- spanforge/prompt_registry.py +415 -0
- spanforge/py.typed +0 -0
- spanforge/redact.py +780 -0
- spanforge/sampling.py +500 -0
- spanforge/schemas/v1.0/schema.json +170 -0
- spanforge/schemas/v2.0/schema.json +536 -0
- spanforge/signing.py +1152 -0
- spanforge/stream.py +559 -0
- spanforge/testing.py +376 -0
- spanforge/trace.py +199 -0
- spanforge/types.py +696 -0
- spanforge/ulid.py +304 -0
- spanforge/validate.py +383 -0
- spanforge-2.0.0.dist-info/METADATA +1777 -0
- spanforge-2.0.0.dist-info/RECORD +101 -0
- spanforge-2.0.0.dist-info/WHEEL +4 -0
- spanforge-2.0.0.dist-info/entry_points.txt +5 -0
- spanforge-2.0.0.dist-info/licenses/LICENSE +21 -0
spanforge/__init__.py
ADDED
|
@@ -0,0 +1,695 @@
|
|
|
1
|
+
"""SpanForge — AI lifecycle and governance platform (RFC-0001 SPANFORGE v2.0).
|
|
2
|
+
|
|
3
|
+
Every tool in the LLM Developer Toolkit emits events that conform to the
|
|
4
|
+
:class:`~spanforge.event.Event` envelope defined here. The schema is
|
|
5
|
+
OpenTelemetry-compatible, tamper-evident, and enterprise-grade.
|
|
6
|
+
|
|
7
|
+
Quick start
|
|
8
|
+
-----------
|
|
9
|
+
::
|
|
10
|
+
|
|
11
|
+
from spanforge import Event, EventType, Tags
|
|
12
|
+
|
|
13
|
+
event = Event(
|
|
14
|
+
event_type=EventType.TRACE_SPAN_COMPLETED,
|
|
15
|
+
source="my-agent@1.0.0",
|
|
16
|
+
payload={"span_name": "run_agent", "status": "ok"},
|
|
17
|
+
tags=Tags(env="production", model="gpt-4o"),
|
|
18
|
+
)
|
|
19
|
+
event.validate()
|
|
20
|
+
print(event.to_json())
|
|
21
|
+
|
|
22
|
+
Public API
|
|
23
|
+
----------
|
|
24
|
+
Core envelope
|
|
25
|
+
~~~~~~~~~~~~~
|
|
26
|
+
* :class:`~spanforge.event.Event`
|
|
27
|
+
* :class:`~spanforge.event.Tags`
|
|
28
|
+
* :data:`~spanforge.event.SCHEMA_VERSION`
|
|
29
|
+
|
|
30
|
+
Event types
|
|
31
|
+
~~~~~~~~~~~
|
|
32
|
+
* :class:`~spanforge.types.EventType` — RFC Appendix B canonical types
|
|
33
|
+
* :func:`~spanforge.types.is_registered`
|
|
34
|
+
* :func:`~spanforge.types.namespace_of`
|
|
35
|
+
* :func:`~spanforge.types.validate_custom`
|
|
36
|
+
* :func:`~spanforge.types.get_by_value`
|
|
37
|
+
|
|
38
|
+
ULID
|
|
39
|
+
~~~~
|
|
40
|
+
* :func:`~spanforge.ulid.generate`
|
|
41
|
+
* :func:`~spanforge.ulid.validate`
|
|
42
|
+
* :func:`~spanforge.ulid.extract_timestamp_ms`
|
|
43
|
+
|
|
44
|
+
PII redaction (RFC §12)
|
|
45
|
+
~~~~~~~~~~~~~~~~~~~~~~~
|
|
46
|
+
* :class:`~spanforge.redact.Sensitivity`
|
|
47
|
+
* :class:`~spanforge.redact.Redactable`
|
|
48
|
+
* :class:`~spanforge.redact.RedactionPolicy`
|
|
49
|
+
* :class:`~spanforge.redact.RedactionResult`
|
|
50
|
+
* :class:`~spanforge.redact.PIINotRedactedError`
|
|
51
|
+
* :func:`~spanforge.redact.contains_pii`
|
|
52
|
+
* :func:`~spanforge.redact.assert_redacted`
|
|
53
|
+
|
|
54
|
+
HMAC signing & audit chain (RFC §11)
|
|
55
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
56
|
+
* :func:`~spanforge.signing.sign`
|
|
57
|
+
* :func:`~spanforge.signing.verify`
|
|
58
|
+
* :func:`~spanforge.signing.verify_chain`
|
|
59
|
+
* :func:`~spanforge.signing.assert_verified`
|
|
60
|
+
* :class:`~spanforge.signing.ChainVerificationResult`
|
|
61
|
+
* :class:`~spanforge.signing.AuditStream`
|
|
62
|
+
|
|
63
|
+
Export backends (RFC §14)
|
|
64
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
65
|
+
* :class:`~spanforge.export.otlp.OTLPExporter`
|
|
66
|
+
* :class:`~spanforge.export.otlp.ResourceAttributes`
|
|
67
|
+
* :class:`~spanforge.export.webhook.WebhookExporter`
|
|
68
|
+
* :class:`~spanforge.export.jsonl.JSONLExporter`
|
|
69
|
+
|
|
70
|
+
Event routing (RFC §14)
|
|
71
|
+
~~~~~~~~~~~~~~~~~~~~~~~
|
|
72
|
+
* :class:`~spanforge.stream.EventStream`
|
|
73
|
+
* :class:`~spanforge.stream.Exporter`
|
|
74
|
+
* :func:`~spanforge.stream.iter_file`
|
|
75
|
+
* :func:`~spanforge.stream.aiter_file`
|
|
76
|
+
|
|
77
|
+
Observability spans & tracing
|
|
78
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
79
|
+
* :class:`~spanforge._span.SpanEvent`
|
|
80
|
+
* :data:`~spanforge.types.SpanErrorCategory`
|
|
81
|
+
|
|
82
|
+
Debug utilities
|
|
83
|
+
~~~~~~~~~~~~~~~
|
|
84
|
+
* :func:`~spanforge.debug.print_tree`
|
|
85
|
+
* :func:`~spanforge.debug.summary`
|
|
86
|
+
* :func:`~spanforge.debug.visualize`
|
|
87
|
+
|
|
88
|
+
Governance (RFC §13)
|
|
89
|
+
~~~~~~~~~~~~~~~~~~~~~
|
|
90
|
+
* :class:`~spanforge.governance.EventGovernancePolicy`
|
|
91
|
+
* :class:`~spanforge.governance.GovernanceViolationError`
|
|
92
|
+
* :class:`~spanforge.governance.GovernanceWarning`
|
|
93
|
+
|
|
94
|
+
Consumer registration (RFC §16)
|
|
95
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
96
|
+
* :class:`~spanforge.consumer.ConsumerRecord`
|
|
97
|
+
* :class:`~spanforge.consumer.ConsumerRegistry`
|
|
98
|
+
* :class:`~spanforge.consumer.IncompatibleSchemaError`
|
|
99
|
+
* :func:`~spanforge.consumer.register_consumer`
|
|
100
|
+
* :func:`~spanforge.consumer.assert_compatible`
|
|
101
|
+
|
|
102
|
+
Validation
|
|
103
|
+
~~~~~~~~~~
|
|
104
|
+
* :func:`~spanforge.validate.validate_event`
|
|
105
|
+
|
|
106
|
+
Exceptions
|
|
107
|
+
~~~~~~~~~~
|
|
108
|
+
* :class:`~spanforge.exceptions.LLMSchemaError`
|
|
109
|
+
* :class:`~spanforge.exceptions.SchemaValidationError`
|
|
110
|
+
* :class:`~spanforge.exceptions.SchemaVersionError`
|
|
111
|
+
* :class:`~spanforge.exceptions.ULIDError`
|
|
112
|
+
* :class:`~spanforge.exceptions.SerializationError`
|
|
113
|
+
* :class:`~spanforge.exceptions.DeserializationError`
|
|
114
|
+
* :class:`~spanforge.exceptions.EventTypeError`
|
|
115
|
+
* :class:`~spanforge.exceptions.SigningError`
|
|
116
|
+
* :class:`~spanforge.exceptions.VerificationError`
|
|
117
|
+
* :class:`~spanforge.exceptions.ExportError`
|
|
118
|
+
|
|
119
|
+
Version history
|
|
120
|
+
---------------
|
|
121
|
+
v2.0 — RFC-0001 SPANFORGE v2.0 SDK baseline. Canonical 36-type EventType
|
|
122
|
+
registry (Appendix B), v2.0 envelope (SCHEMA_VERSION="2.0"),
|
|
123
|
+
microsecond-precision timestamp mandate, RFC §6.3 ULID first-char
|
|
124
|
+
constraint, source pattern allowing mixed-case, SchemaVersionError,
|
|
125
|
+
11 namespace payload modules (RFC §8–§10), audit chain helpers.
|
|
126
|
+
"""
|
|
127
|
+
|
|
128
|
+
from __future__ import annotations
|
|
129
|
+
|
|
130
|
+
from spanforge.debug import print_tree, summary, visualize
|
|
131
|
+
from spanforge._span import (
|
|
132
|
+
AgentRunContext,
|
|
133
|
+
AgentRunContextManager,
|
|
134
|
+
AgentStepContext,
|
|
135
|
+
AgentStepContextManager,
|
|
136
|
+
Span,
|
|
137
|
+
SpanContextManager,
|
|
138
|
+
copy_context,
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
# ---------------------------------------------------------------------------
|
|
142
|
+
# Phase 1: Trace object and start_trace()
|
|
143
|
+
# ---------------------------------------------------------------------------
|
|
144
|
+
from spanforge._trace import Trace, start_trace
|
|
145
|
+
|
|
146
|
+
# ---------------------------------------------------------------------------
|
|
147
|
+
# Phase 4: Metrics extraction + in-process trace store
|
|
148
|
+
# ---------------------------------------------------------------------------
|
|
149
|
+
import spanforge.metrics as metrics
|
|
150
|
+
from spanforge._store import (
|
|
151
|
+
TraceStore,
|
|
152
|
+
get_last_agent_run,
|
|
153
|
+
get_store,
|
|
154
|
+
get_trace,
|
|
155
|
+
list_llm_calls,
|
|
156
|
+
list_tool_calls,
|
|
157
|
+
trace_store,
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
# ---------------------------------------------------------------------------
|
|
161
|
+
# Phase 5: Hook registry
|
|
162
|
+
# ---------------------------------------------------------------------------
|
|
163
|
+
from spanforge._hooks import AsyncHookFn, HookRegistry, hooks
|
|
164
|
+
|
|
165
|
+
# ---------------------------------------------------------------------------
|
|
166
|
+
# Phase 2: Core tracer + span
|
|
167
|
+
# ---------------------------------------------------------------------------
|
|
168
|
+
from spanforge._tracer import Tracer, tracer
|
|
169
|
+
from spanforge.actor import ActorContext
|
|
170
|
+
|
|
171
|
+
# ---------------------------------------------------------------------------
|
|
172
|
+
# Phase 1: Configuration layer
|
|
173
|
+
# ---------------------------------------------------------------------------
|
|
174
|
+
from spanforge.config import SpanForgeConfig, configure, get_config
|
|
175
|
+
from spanforge.consumer import (
|
|
176
|
+
ConsumerRecord,
|
|
177
|
+
ConsumerRegistry,
|
|
178
|
+
IncompatibleSchemaError,
|
|
179
|
+
assert_compatible,
|
|
180
|
+
register_consumer,
|
|
181
|
+
)
|
|
182
|
+
from spanforge.consumer import (
|
|
183
|
+
get_registry as get_consumer_registry,
|
|
184
|
+
)
|
|
185
|
+
from spanforge.event import SCHEMA_VERSION, Event, Tags
|
|
186
|
+
from spanforge.exceptions import (
|
|
187
|
+
AuditStorageError,
|
|
188
|
+
DeserializationError,
|
|
189
|
+
EgressViolationError,
|
|
190
|
+
EventTypeError,
|
|
191
|
+
ExportError,
|
|
192
|
+
LLMSchemaError,
|
|
193
|
+
SchemaValidationError,
|
|
194
|
+
SchemaVersionError,
|
|
195
|
+
SerializationError,
|
|
196
|
+
SigningError,
|
|
197
|
+
ULIDError,
|
|
198
|
+
VerificationError,
|
|
199
|
+
)
|
|
200
|
+
from spanforge.export import (
|
|
201
|
+
AppendOnlyJSONLExporter,
|
|
202
|
+
JSONLExporter,
|
|
203
|
+
OTLPExporter,
|
|
204
|
+
OTelBridgeExporter,
|
|
205
|
+
ResourceAttributes,
|
|
206
|
+
WORMBackend,
|
|
207
|
+
WORMUploadResult,
|
|
208
|
+
WebhookExporter,
|
|
209
|
+
)
|
|
210
|
+
# ---------------------------------------------------------------------------
|
|
211
|
+
# Namespace payload dataclasses (RFC §8-§10, §11 audit)
|
|
212
|
+
# ---------------------------------------------------------------------------
|
|
213
|
+
from spanforge.namespaces.audit import (
|
|
214
|
+
AuditChainTamperedPayload,
|
|
215
|
+
AuditChainVerifiedPayload,
|
|
216
|
+
AuditKeyRotatedPayload,
|
|
217
|
+
)
|
|
218
|
+
from spanforge.namespaces.cache import (
|
|
219
|
+
CacheEvictedPayload,
|
|
220
|
+
CacheHitPayload,
|
|
221
|
+
CacheMissPayload,
|
|
222
|
+
CacheWrittenPayload,
|
|
223
|
+
)
|
|
224
|
+
from spanforge.namespaces.cost import (
|
|
225
|
+
CostAttributedPayload,
|
|
226
|
+
CostSessionRecordedPayload,
|
|
227
|
+
CostTokenRecordedPayload,
|
|
228
|
+
)
|
|
229
|
+
from spanforge.namespaces.diff import (
|
|
230
|
+
DiffComputedPayload,
|
|
231
|
+
DiffRegressionFlaggedPayload,
|
|
232
|
+
)
|
|
233
|
+
from spanforge.namespaces.eval_ import (
|
|
234
|
+
EvalRegressionDetectedPayload,
|
|
235
|
+
EvalScenarioCompletedPayload,
|
|
236
|
+
EvalScenarioStartedPayload,
|
|
237
|
+
EvalScoreRecordedPayload,
|
|
238
|
+
)
|
|
239
|
+
from spanforge.namespaces.fence import (
|
|
240
|
+
FenceMaxRetriesExceededPayload,
|
|
241
|
+
FenceRetryTriggeredPayload,
|
|
242
|
+
FenceValidatedPayload,
|
|
243
|
+
)
|
|
244
|
+
from spanforge.namespaces.guard import GuardPayload
|
|
245
|
+
from spanforge.namespaces.prompt import (
|
|
246
|
+
PromptRenderedPayload,
|
|
247
|
+
PromptTemplateLoadedPayload,
|
|
248
|
+
PromptVersionChangedPayload,
|
|
249
|
+
)
|
|
250
|
+
from spanforge.namespaces.redact import (
|
|
251
|
+
RedactAppliedPayload,
|
|
252
|
+
RedactPhiDetectedPayload,
|
|
253
|
+
RedactPiiDetectedPayload,
|
|
254
|
+
)
|
|
255
|
+
from spanforge.namespaces.template import (
|
|
256
|
+
TemplateRegisteredPayload,
|
|
257
|
+
TemplateValidationFailedPayload,
|
|
258
|
+
TemplateVariableBoundPayload,
|
|
259
|
+
)
|
|
260
|
+
from spanforge.namespaces.trace import (
|
|
261
|
+
AgentRunPayload,
|
|
262
|
+
AgentStepPayload,
|
|
263
|
+
CostBreakdown,
|
|
264
|
+
DecisionPoint,
|
|
265
|
+
GenAIOperationName,
|
|
266
|
+
GenAISystem,
|
|
267
|
+
ModelInfo,
|
|
268
|
+
PricingTier,
|
|
269
|
+
ReasoningStep,
|
|
270
|
+
SpanEvent,
|
|
271
|
+
SpanKind,
|
|
272
|
+
SpanPayload,
|
|
273
|
+
TokenUsage,
|
|
274
|
+
ToolCall,
|
|
275
|
+
)
|
|
276
|
+
from spanforge.redact import (
|
|
277
|
+
DPDP_PATTERNS,
|
|
278
|
+
PII_TYPES,
|
|
279
|
+
PIINotRedactedError,
|
|
280
|
+
PIIScanResult,
|
|
281
|
+
Redactable,
|
|
282
|
+
RedactionPolicy,
|
|
283
|
+
RedactionResult,
|
|
284
|
+
Sensitivity,
|
|
285
|
+
assert_redacted,
|
|
286
|
+
contains_pii,
|
|
287
|
+
scan_payload,
|
|
288
|
+
)
|
|
289
|
+
from spanforge.signing import (
|
|
290
|
+
AsyncAuditStream,
|
|
291
|
+
AuditStream,
|
|
292
|
+
ChainVerificationResult,
|
|
293
|
+
DictKeyResolver,
|
|
294
|
+
EnvKeyResolver,
|
|
295
|
+
KeyResolver,
|
|
296
|
+
StaticKeyResolver,
|
|
297
|
+
assert_verified,
|
|
298
|
+
check_key_expiry,
|
|
299
|
+
derive_key,
|
|
300
|
+
sign,
|
|
301
|
+
validate_key_strength,
|
|
302
|
+
verify,
|
|
303
|
+
verify_chain,
|
|
304
|
+
)
|
|
305
|
+
from spanforge.stream import EventStream, Exporter, aiter_file, iter_file
|
|
306
|
+
from spanforge.types import (
|
|
307
|
+
EventType,
|
|
308
|
+
SpanErrorCategory,
|
|
309
|
+
get_by_value,
|
|
310
|
+
is_registered,
|
|
311
|
+
namespace_of,
|
|
312
|
+
validate_custom,
|
|
313
|
+
)
|
|
314
|
+
from spanforge.ulid import extract_timestamp_ms
|
|
315
|
+
from spanforge.ulid import generate as generate_ulid
|
|
316
|
+
from spanforge.ulid import validate as validate_ulid
|
|
317
|
+
from spanforge.validate import validate_event
|
|
318
|
+
from spanforge.normalizer import GenericNormalizer, ProviderNormalizer
|
|
319
|
+
from spanforge.trace import trace
|
|
320
|
+
from spanforge.export.otlp_bridge import SpanOTLPBridge, span_to_otlp_dict
|
|
321
|
+
from spanforge.cost import CostTracker, BudgetMonitor, budget_alert, emit_cost_event, emit_cost_attributed, cost_summary, CostRecord
|
|
322
|
+
from spanforge.inspect import InspectorSession, ToolCallRecord, inspect_trace
|
|
323
|
+
from spanforge._stream import flush, shutdown
|
|
324
|
+
from spanforge._span import extract_traceparent, inject_traceparent
|
|
325
|
+
from spanforge.processor import (
|
|
326
|
+
SpanProcessor,
|
|
327
|
+
ProcessorChain,
|
|
328
|
+
NoopSpanProcessor,
|
|
329
|
+
add_processor,
|
|
330
|
+
clear_processors,
|
|
331
|
+
)
|
|
332
|
+
from spanforge._batch_exporter import BatchExporter
|
|
333
|
+
from spanforge.sampling import (
|
|
334
|
+
AlwaysOffSampler,
|
|
335
|
+
AlwaysOnSampler,
|
|
336
|
+
ComplianceSampler,
|
|
337
|
+
ParentBasedSampler,
|
|
338
|
+
RatioSampler,
|
|
339
|
+
RuleBasedSampler,
|
|
340
|
+
Sampler,
|
|
341
|
+
TailBasedSampler,
|
|
342
|
+
bypass_sampling,
|
|
343
|
+
)
|
|
344
|
+
from spanforge.eval import (
|
|
345
|
+
EvalReport,
|
|
346
|
+
EvalRunner,
|
|
347
|
+
EvalScore,
|
|
348
|
+
EvalScorer,
|
|
349
|
+
FaithfulnessScorer,
|
|
350
|
+
PIILeakageScorer,
|
|
351
|
+
RefusalDetectionScorer,
|
|
352
|
+
RegressionDetector,
|
|
353
|
+
record_eval_score,
|
|
354
|
+
)
|
|
355
|
+
from spanforge.prompt_registry import (
|
|
356
|
+
PromptRegistry,
|
|
357
|
+
PromptVersion,
|
|
358
|
+
get_prompt_version,
|
|
359
|
+
register_prompt,
|
|
360
|
+
render_prompt,
|
|
361
|
+
)
|
|
362
|
+
from spanforge.metrics_export import (
|
|
363
|
+
MetricsSummary,
|
|
364
|
+
PrometheusMetricsExporter,
|
|
365
|
+
serve_metrics,
|
|
366
|
+
)
|
|
367
|
+
from spanforge._server import TraceViewerServer
|
|
368
|
+
from spanforge.egress import check_egress
|
|
369
|
+
from spanforge.migrate import MigrationStats, migrate_file, v1_to_v2
|
|
370
|
+
# ---------------------------------------------------------------------------
|
|
371
|
+
# T.R.U.S.T. Framework — Consent, HITL, Model Registry, Explainability
|
|
372
|
+
# ---------------------------------------------------------------------------
|
|
373
|
+
from spanforge.consent import (
|
|
374
|
+
ConsentBoundary,
|
|
375
|
+
ConsentRecord,
|
|
376
|
+
check_consent,
|
|
377
|
+
grant_consent,
|
|
378
|
+
revoke_consent,
|
|
379
|
+
)
|
|
380
|
+
from spanforge.hitl import (
|
|
381
|
+
HITLItem,
|
|
382
|
+
HITLQueue,
|
|
383
|
+
list_pending,
|
|
384
|
+
queue_for_review,
|
|
385
|
+
review_item,
|
|
386
|
+
)
|
|
387
|
+
from spanforge.model_registry import (
|
|
388
|
+
ModelRegistry,
|
|
389
|
+
ModelRegistryEntry,
|
|
390
|
+
deprecate_model,
|
|
391
|
+
get_model,
|
|
392
|
+
list_models,
|
|
393
|
+
register_model,
|
|
394
|
+
retire_model,
|
|
395
|
+
)
|
|
396
|
+
from spanforge.explain import (
|
|
397
|
+
ExplainabilityRecord,
|
|
398
|
+
generate_explanation,
|
|
399
|
+
)
|
|
400
|
+
from spanforge.namespaces.consent import ConsentPayload
|
|
401
|
+
from spanforge.namespaces.hitl import HITLPayload
|
|
402
|
+
__version__: str = "2.0.0"
|
|
403
|
+
#: RFC-0001 SPANFORGE conformance profile label.
|
|
404
|
+
from typing import Final as _Final
|
|
405
|
+
CONFORMANCE_PROFILE: _Final[str] = "SPANFORGE-Enterprise-2.0"
|
|
406
|
+
|
|
407
|
+
# Optional sub-modules — import on demand to keep startup cost zero.
|
|
408
|
+
import spanforge.testing as testing # noqa: E402
|
|
409
|
+
import spanforge.auto as auto # noqa: E402
|
|
410
|
+
|
|
411
|
+
__all__: list[str] = [
|
|
412
|
+
"PII_TYPES",
|
|
413
|
+
"SCHEMA_VERSION",
|
|
414
|
+
# Actor identity context
|
|
415
|
+
"ActorContext",
|
|
416
|
+
"AgentRunContext",
|
|
417
|
+
"AgentRunContextManager",
|
|
418
|
+
"AgentRunPayload",
|
|
419
|
+
"AgentStepContext",
|
|
420
|
+
"AgentStepContextManager",
|
|
421
|
+
"AgentStepPayload",
|
|
422
|
+
"AuditChainTamperedPayload",
|
|
423
|
+
"AuditChainVerifiedPayload",
|
|
424
|
+
# audit
|
|
425
|
+
"AuditKeyRotatedPayload",
|
|
426
|
+
"AuditStream",
|
|
427
|
+
"CacheEvictedPayload",
|
|
428
|
+
# cache
|
|
429
|
+
"CacheHitPayload",
|
|
430
|
+
"CacheMissPayload",
|
|
431
|
+
"CacheWrittenPayload",
|
|
432
|
+
"ChainVerificationResult",
|
|
433
|
+
# Consumer registration (RFC §16)
|
|
434
|
+
"ConsumerRecord",
|
|
435
|
+
"ConsumerRegistry",
|
|
436
|
+
"CostAttributedPayload",
|
|
437
|
+
"CostBreakdown",
|
|
438
|
+
"CostSessionRecordedPayload",
|
|
439
|
+
# cost
|
|
440
|
+
"CostTokenRecordedPayload",
|
|
441
|
+
"DecisionPoint",
|
|
442
|
+
"DeserializationError",
|
|
443
|
+
# diff
|
|
444
|
+
"DiffComputedPayload",
|
|
445
|
+
"DiffRegressionFlaggedPayload",
|
|
446
|
+
"EvalRegressionDetectedPayload",
|
|
447
|
+
"EvalScenarioCompletedPayload",
|
|
448
|
+
"EvalScenarioStartedPayload",
|
|
449
|
+
# eval
|
|
450
|
+
"EvalScoreRecordedPayload",
|
|
451
|
+
# Core envelope
|
|
452
|
+
"Event",
|
|
453
|
+
# Event routing (RFC §14)
|
|
454
|
+
"EventStream",
|
|
455
|
+
# Event types
|
|
456
|
+
"EventType",
|
|
457
|
+
"EventTypeError",
|
|
458
|
+
"ExportError",
|
|
459
|
+
"Exporter",
|
|
460
|
+
"FenceMaxRetriesExceededPayload",
|
|
461
|
+
"FenceRetryTriggeredPayload",
|
|
462
|
+
# fence
|
|
463
|
+
"FenceValidatedPayload",
|
|
464
|
+
"GenAIOperationName",
|
|
465
|
+
# Namespace payload dataclasses (RFC §8-§11)
|
|
466
|
+
# trace — value objects
|
|
467
|
+
"GenAISystem",
|
|
468
|
+
# guard
|
|
469
|
+
"GuardPayload",
|
|
470
|
+
"IncompatibleSchemaError",
|
|
471
|
+
"JSONLExporter",
|
|
472
|
+
# Exceptions
|
|
473
|
+
"LLMSchemaError",
|
|
474
|
+
"ModelInfo",
|
|
475
|
+
# Export backends (RFC §14)
|
|
476
|
+
"OTelBridgeExporter",
|
|
477
|
+
"OTLPExporter",
|
|
478
|
+
"PIINotRedactedError",
|
|
479
|
+
"PricingTier",
|
|
480
|
+
# prompt
|
|
481
|
+
"PromptRenderedPayload",
|
|
482
|
+
"PromptTemplateLoadedPayload",
|
|
483
|
+
"PromptVersionChangedPayload",
|
|
484
|
+
"ReasoningStep",
|
|
485
|
+
"RedactAppliedPayload",
|
|
486
|
+
"RedactPhiDetectedPayload",
|
|
487
|
+
# redact
|
|
488
|
+
"RedactPiiDetectedPayload",
|
|
489
|
+
"Redactable",
|
|
490
|
+
"RedactionPolicy",
|
|
491
|
+
"RedactionResult",
|
|
492
|
+
"ResourceAttributes",
|
|
493
|
+
"SchemaValidationError",
|
|
494
|
+
"SchemaVersionError",
|
|
495
|
+
# PII Redaction (RFC §12)
|
|
496
|
+
"Sensitivity",
|
|
497
|
+
"SerializationError",
|
|
498
|
+
"SigningError",
|
|
499
|
+
"Span",
|
|
500
|
+
"SpanContextManager",
|
|
501
|
+
"SpanErrorCategory",
|
|
502
|
+
"SpanEvent",
|
|
503
|
+
"SpanKind",
|
|
504
|
+
# trace — payloads
|
|
505
|
+
"SpanPayload",
|
|
506
|
+
"Tags",
|
|
507
|
+
# template
|
|
508
|
+
"TemplateRegisteredPayload",
|
|
509
|
+
"TemplateValidationFailedPayload",
|
|
510
|
+
"TemplateVariableBoundPayload",
|
|
511
|
+
"TokenUsage",
|
|
512
|
+
"ToolCall",
|
|
513
|
+
# Phase 3 — Debug utilities
|
|
514
|
+
"print_tree",
|
|
515
|
+
"summary",
|
|
516
|
+
"visualize",
|
|
517
|
+
# Phase 1 — Trace object
|
|
518
|
+
"Trace",
|
|
519
|
+
# Phase 2 — Tracer + Span
|
|
520
|
+
"Tracer",
|
|
521
|
+
# Phase 4 — Metrics + trace store
|
|
522
|
+
"metrics",
|
|
523
|
+
"TraceStore",
|
|
524
|
+
"get_store",
|
|
525
|
+
"get_trace",
|
|
526
|
+
"get_last_agent_run",
|
|
527
|
+
"list_tool_calls",
|
|
528
|
+
"list_llm_calls",
|
|
529
|
+
"trace_store",
|
|
530
|
+
# Phase 5 — Hooks
|
|
531
|
+
"AsyncHookFn",
|
|
532
|
+
"HookRegistry",
|
|
533
|
+
"hooks",
|
|
534
|
+
# Phase 1 — Configuration
|
|
535
|
+
"SpanForgeConfig",
|
|
536
|
+
"ULIDError",
|
|
537
|
+
"VerificationError",
|
|
538
|
+
"WebhookExporter",
|
|
539
|
+
# Metadata
|
|
540
|
+
"__version__",
|
|
541
|
+
"testing",
|
|
542
|
+
"auto",
|
|
543
|
+
"aiter_file",
|
|
544
|
+
"assert_compatible",
|
|
545
|
+
"assert_redacted",
|
|
546
|
+
"assert_verified",
|
|
547
|
+
"configure",
|
|
548
|
+
"contains_pii",
|
|
549
|
+
# Context propagation helper (Phase 1)
|
|
550
|
+
"copy_context",
|
|
551
|
+
"extract_timestamp_ms",
|
|
552
|
+
# ULID
|
|
553
|
+
"generate_ulid",
|
|
554
|
+
"get_by_value",
|
|
555
|
+
"get_config",
|
|
556
|
+
"get_consumer_registry",
|
|
557
|
+
"is_registered",
|
|
558
|
+
"iter_file",
|
|
559
|
+
"namespace_of",
|
|
560
|
+
"register_consumer",
|
|
561
|
+
# HMAC Signing & Audit Chain (RFC §11)
|
|
562
|
+
"sign",
|
|
563
|
+
"start_trace",
|
|
564
|
+
"tracer",
|
|
565
|
+
"validate_custom",
|
|
566
|
+
# Validation
|
|
567
|
+
"validate_event",
|
|
568
|
+
"validate_ulid",
|
|
569
|
+
"verify",
|
|
570
|
+
"verify_chain",
|
|
571
|
+
# Normalizer (RFC-0001 §10.4)
|
|
572
|
+
"ProviderNormalizer",
|
|
573
|
+
"GenericNormalizer",
|
|
574
|
+
# Conformance
|
|
575
|
+
"CONFORMANCE_PROFILE",
|
|
576
|
+
# Tool 1 — @trace() decorator + OTLP bridge
|
|
577
|
+
"trace",
|
|
578
|
+
"SpanOTLPBridge",
|
|
579
|
+
"span_to_otlp_dict",
|
|
580
|
+
# Tool 2 — Cost Calculation Engine
|
|
581
|
+
"BudgetMonitor",
|
|
582
|
+
"CostRecord",
|
|
583
|
+
"CostTracker",
|
|
584
|
+
"budget_alert",
|
|
585
|
+
"cost_summary",
|
|
586
|
+
"emit_cost_attributed",
|
|
587
|
+
"emit_cost_event",
|
|
588
|
+
# Tool 3 — Tool Call Inspector
|
|
589
|
+
"InspectorSession",
|
|
590
|
+
"ToolCallRecord",
|
|
591
|
+
"inspect_trace",
|
|
592
|
+
# Graceful shutdown
|
|
593
|
+
"flush",
|
|
594
|
+
"shutdown",
|
|
595
|
+
# W3C context propagation
|
|
596
|
+
"extract_traceparent",
|
|
597
|
+
"inject_traceparent",
|
|
598
|
+
# Span processor pipeline
|
|
599
|
+
"SpanProcessor",
|
|
600
|
+
"ProcessorChain",
|
|
601
|
+
"NoopSpanProcessor",
|
|
602
|
+
"add_processor",
|
|
603
|
+
"clear_processors",
|
|
604
|
+
# Batch exporter
|
|
605
|
+
"BatchExporter",
|
|
606
|
+
# Sampling
|
|
607
|
+
"AlwaysOffSampler",
|
|
608
|
+
"AlwaysOnSampler",
|
|
609
|
+
"ParentBasedSampler",
|
|
610
|
+
"RatioSampler",
|
|
611
|
+
"RuleBasedSampler",
|
|
612
|
+
"Sampler",
|
|
613
|
+
"TailBasedSampler",
|
|
614
|
+
# Evaluation hooks
|
|
615
|
+
"EvalReport",
|
|
616
|
+
"EvalRunner",
|
|
617
|
+
"EvalScore",
|
|
618
|
+
"EvalScorer",
|
|
619
|
+
"FaithfulnessScorer",
|
|
620
|
+
"PIILeakageScorer",
|
|
621
|
+
"RefusalDetectionScorer",
|
|
622
|
+
"RegressionDetector",
|
|
623
|
+
"record_eval_score",
|
|
624
|
+
# Prompt registry
|
|
625
|
+
"PromptRegistry",
|
|
626
|
+
"PromptVersion",
|
|
627
|
+
"get_prompt_version",
|
|
628
|
+
"register_prompt",
|
|
629
|
+
"render_prompt",
|
|
630
|
+
# Prometheus metrics
|
|
631
|
+
"MetricsSummary",
|
|
632
|
+
"PrometheusMetricsExporter",
|
|
633
|
+
"serve_metrics",
|
|
634
|
+
# Local trace viewer
|
|
635
|
+
"TraceViewerServer",
|
|
636
|
+
# Egress enforcement (SF-14)
|
|
637
|
+
"check_egress",
|
|
638
|
+
# Schema migration (GA-05)
|
|
639
|
+
"MigrationStats",
|
|
640
|
+
"migrate_file",
|
|
641
|
+
"v1_to_v2",
|
|
642
|
+
# PII deep scan (GA-03)
|
|
643
|
+
"PIIScanResult",
|
|
644
|
+
"scan_payload",
|
|
645
|
+
# Async audit stream (GA-06)
|
|
646
|
+
"AsyncAuditStream",
|
|
647
|
+
# Multi-tenant key resolvers (GA-04)
|
|
648
|
+
"KeyResolver",
|
|
649
|
+
"StaticKeyResolver",
|
|
650
|
+
"EnvKeyResolver",
|
|
651
|
+
"DictKeyResolver",
|
|
652
|
+
# Key management (GA-01)
|
|
653
|
+
"check_key_expiry",
|
|
654
|
+
"derive_key",
|
|
655
|
+
"validate_key_strength",
|
|
656
|
+
# Append-only export + WORM (SF-13)
|
|
657
|
+
"AppendOnlyJSONLExporter",
|
|
658
|
+
"WORMBackend",
|
|
659
|
+
"WORMUploadResult",
|
|
660
|
+
# Egress enforcement exceptions (SF-14)
|
|
661
|
+
"EgressViolationError",
|
|
662
|
+
"AuditStorageError",
|
|
663
|
+
# Compliance sampling (SF-16)
|
|
664
|
+
"ComplianceSampler",
|
|
665
|
+
"bypass_sampling",
|
|
666
|
+
# ---------------------------------------------------------------------------
|
|
667
|
+
# T.R.U.S.T. Framework — Consent, HITL, Model Registry, Explainability
|
|
668
|
+
# ---------------------------------------------------------------------------
|
|
669
|
+
# Consent boundary
|
|
670
|
+
"ConsentBoundary",
|
|
671
|
+
"ConsentPayload",
|
|
672
|
+
"ConsentRecord",
|
|
673
|
+
"check_consent",
|
|
674
|
+
"grant_consent",
|
|
675
|
+
"revoke_consent",
|
|
676
|
+
# Human-in-the-loop
|
|
677
|
+
"HITLItem",
|
|
678
|
+
"HITLPayload",
|
|
679
|
+
"HITLQueue",
|
|
680
|
+
"list_pending",
|
|
681
|
+
"queue_for_review",
|
|
682
|
+
"review_item",
|
|
683
|
+
# Model registry
|
|
684
|
+
"ModelRegistry",
|
|
685
|
+
"ModelRegistryEntry",
|
|
686
|
+
"deprecate_model",
|
|
687
|
+
"get_model",
|
|
688
|
+
"list_models",
|
|
689
|
+
"register_model",
|
|
690
|
+
"retire_model",
|
|
691
|
+
# Explainability
|
|
692
|
+
"ExplainabilityRecord",
|
|
693
|
+
"generate_explanation",
|
|
694
|
+
]
|
|
695
|
+
|