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
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"""spanforge.namespaces.tool_call \u2014 Tool call namespace payload types (RFC-0001 SPANFORGE).
|
|
2
|
+
|
|
3
|
+
Classes
|
|
4
|
+
-------
|
|
5
|
+
ToolCallPayload tool_call.invoked / tool_call.completed / tool_call.failed
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass, field
|
|
10
|
+
from typing import Any, Literal
|
|
11
|
+
|
|
12
|
+
__all__ = ["ToolCallPayload"]
|
|
13
|
+
|
|
14
|
+
_VALID_STATUSES = frozenset({"success", "failure", "timeout"})
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class ToolCallPayload:
|
|
19
|
+
"""RFC-0001 SPANFORGE \u2014 payload for tool_call.* events.
|
|
20
|
+
|
|
21
|
+
Captures all external tool invocations with inputs, outputs, latency, and
|
|
22
|
+
consent-check status (U \u2014 User Rights).
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
call_id: str
|
|
26
|
+
tool_name: str
|
|
27
|
+
latency_ms: float
|
|
28
|
+
status: Literal["success", "failure", "timeout"]
|
|
29
|
+
consent_checked: bool
|
|
30
|
+
tool_version: str | None = None
|
|
31
|
+
inputs: dict[str, Any] = field(default_factory=dict)
|
|
32
|
+
outputs: dict[str, Any] | None = None
|
|
33
|
+
error_message: str | None = None
|
|
34
|
+
|
|
35
|
+
def __post_init__(self) -> None:
|
|
36
|
+
if not self.call_id:
|
|
37
|
+
raise ValueError("ToolCallPayload.call_id must be non-empty")
|
|
38
|
+
if not self.tool_name:
|
|
39
|
+
raise ValueError("ToolCallPayload.tool_name must be non-empty")
|
|
40
|
+
if self.status not in _VALID_STATUSES:
|
|
41
|
+
raise ValueError(
|
|
42
|
+
f"ToolCallPayload.status must be one of {sorted(_VALID_STATUSES)}"
|
|
43
|
+
)
|
|
44
|
+
if self.latency_ms < 0:
|
|
45
|
+
raise ValueError("ToolCallPayload.latency_ms must be >= 0")
|
|
46
|
+
|
|
47
|
+
def to_dict(self) -> dict[str, Any]:
|
|
48
|
+
d: dict[str, Any] = {
|
|
49
|
+
"call_id": self.call_id,
|
|
50
|
+
"tool_name": self.tool_name,
|
|
51
|
+
"latency_ms": self.latency_ms,
|
|
52
|
+
"status": self.status,
|
|
53
|
+
"consent_checked": self.consent_checked,
|
|
54
|
+
"inputs": self.inputs,
|
|
55
|
+
}
|
|
56
|
+
if self.tool_version is not None:
|
|
57
|
+
d["tool_version"] = self.tool_version
|
|
58
|
+
if self.outputs is not None:
|
|
59
|
+
d["outputs"] = self.outputs
|
|
60
|
+
if self.error_message is not None:
|
|
61
|
+
d["error_message"] = self.error_message
|
|
62
|
+
return d
|
|
63
|
+
|
|
64
|
+
@classmethod
|
|
65
|
+
def from_dict(cls, data: dict[str, Any]) -> ToolCallPayload:
|
|
66
|
+
return cls(
|
|
67
|
+
call_id=data["call_id"],
|
|
68
|
+
tool_name=data["tool_name"],
|
|
69
|
+
latency_ms=float(data["latency_ms"]),
|
|
70
|
+
status=data["status"],
|
|
71
|
+
consent_checked=bool(data["consent_checked"]),
|
|
72
|
+
tool_version=data.get("tool_version"),
|
|
73
|
+
inputs=dict(data.get("inputs", {})),
|
|
74
|
+
outputs=data.get("outputs"),
|
|
75
|
+
error_message=data.get("error_message"),
|
|
76
|
+
)
|