spanforge 2.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.
Files changed (319) hide show
  1. spanforge-2.0.0/.gitattributes +2 -0
  2. spanforge-2.0.0/.github/CODEOWNERS +29 -0
  3. spanforge-2.0.0/.github/ISSUE_TEMPLATE/bug_report.yml +62 -0
  4. spanforge-2.0.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
  5. spanforge-2.0.0/.github/ISSUE_TEMPLATE/feature_request.yml +42 -0
  6. spanforge-2.0.0/.github/ISSUE_TEMPLATE/rfc.yml +56 -0
  7. spanforge-2.0.0/.github/pull_request_template.md +25 -0
  8. spanforge-2.0.0/.github/workflows/ci.yml +63 -0
  9. spanforge-2.0.0/.github/workflows/release.yml +135 -0
  10. spanforge-2.0.0/.gitignore +181 -0
  11. spanforge-2.0.0/CNAME +1 -0
  12. spanforge-2.0.0/CODE_OF_CONDUCT.md +58 -0
  13. spanforge-2.0.0/CONFORMANCE.md +115 -0
  14. spanforge-2.0.0/LICENSE +21 -0
  15. spanforge-2.0.0/MAINTAINERS.md +34 -0
  16. spanforge-2.0.0/PKG-INFO +1777 -0
  17. spanforge-2.0.0/PRICING.md +115 -0
  18. spanforge-2.0.0/README.md +1679 -0
  19. spanforge-2.0.0/README.md.bak +938 -0
  20. spanforge-2.0.0/RELEASE.md +107 -0
  21. spanforge-2.0.0/SECURITY.md +78 -0
  22. spanforge-2.0.0/docs/Makefile +16 -0
  23. spanforge-2.0.0/docs/_static/.gitkeep +2 -0
  24. spanforge-2.0.0/docs/api/auto.md +117 -0
  25. spanforge-2.0.0/docs/api/cache.md +269 -0
  26. spanforge-2.0.0/docs/api/compliance.md +259 -0
  27. spanforge-2.0.0/docs/api/consumer.md +226 -0
  28. spanforge-2.0.0/docs/api/debug.md +102 -0
  29. spanforge-2.0.0/docs/api/deprecations.md +196 -0
  30. spanforge-2.0.0/docs/api/event.md +261 -0
  31. spanforge-2.0.0/docs/api/exceptions.md +304 -0
  32. spanforge-2.0.0/docs/api/export.md +667 -0
  33. spanforge-2.0.0/docs/api/governance.md +159 -0
  34. spanforge-2.0.0/docs/api/hooks.md +125 -0
  35. spanforge-2.0.0/docs/api/index.md +68 -0
  36. spanforge-2.0.0/docs/api/integrations.md +462 -0
  37. spanforge-2.0.0/docs/api/lint.md +317 -0
  38. spanforge-2.0.0/docs/api/metrics.md +115 -0
  39. spanforge-2.0.0/docs/api/migrate.md +219 -0
  40. spanforge-2.0.0/docs/api/models.md +137 -0
  41. spanforge-2.0.0/docs/api/normalizer.md +151 -0
  42. spanforge-2.0.0/docs/api/redact.md +313 -0
  43. spanforge-2.0.0/docs/api/signing.md +493 -0
  44. spanforge-2.0.0/docs/api/store.md +98 -0
  45. spanforge-2.0.0/docs/api/stream.md +317 -0
  46. spanforge-2.0.0/docs/api/testing.md +145 -0
  47. spanforge-2.0.0/docs/api/trace.md +137 -0
  48. spanforge-2.0.0/docs/api/types.md +245 -0
  49. spanforge-2.0.0/docs/api/ulid.md +111 -0
  50. spanforge-2.0.0/docs/api/validate.md +109 -0
  51. spanforge-2.0.0/docs/changelog.md +1051 -0
  52. spanforge-2.0.0/docs/cli.md +1066 -0
  53. spanforge-2.0.0/docs/conf.py +128 -0
  54. spanforge-2.0.0/docs/configuration.md +173 -0
  55. spanforge-2.0.0/docs/contributing.md +130 -0
  56. spanforge-2.0.0/docs/deployment/air-gapped.md +101 -0
  57. spanforge-2.0.0/docs/deployment/kubernetes.md +260 -0
  58. spanforge-2.0.0/docs/index.md +104 -0
  59. spanforge-2.0.0/docs/installation.md +71 -0
  60. spanforge-2.0.0/docs/integrations/crewai.md +147 -0
  61. spanforge-2.0.0/docs/make.bat +35 -0
  62. spanforge-2.0.0/docs/migrations/from-langfuse.md +145 -0
  63. spanforge-2.0.0/docs/migrations/from-langsmith.md +147 -0
  64. spanforge-2.0.0/docs/migrations/from-openllmetry.md +158 -0
  65. spanforge-2.0.0/docs/namespaces/audit.md +138 -0
  66. spanforge-2.0.0/docs/namespaces/cache.md +88 -0
  67. spanforge-2.0.0/docs/namespaces/consent.md +69 -0
  68. spanforge-2.0.0/docs/namespaces/cost.md +126 -0
  69. spanforge-2.0.0/docs/namespaces/diff.md +56 -0
  70. spanforge-2.0.0/docs/namespaces/eval.md +58 -0
  71. spanforge-2.0.0/docs/namespaces/explanation.md +79 -0
  72. spanforge-2.0.0/docs/namespaces/fence.md +52 -0
  73. spanforge-2.0.0/docs/namespaces/guard.md +37 -0
  74. spanforge-2.0.0/docs/namespaces/hitl.md +77 -0
  75. spanforge-2.0.0/docs/namespaces/index.md +73 -0
  76. spanforge-2.0.0/docs/namespaces/model_registry.md +85 -0
  77. spanforge-2.0.0/docs/namespaces/prompt.md +60 -0
  78. spanforge-2.0.0/docs/namespaces/redact_ns.md +56 -0
  79. spanforge-2.0.0/docs/namespaces/template.md +63 -0
  80. spanforge-2.0.0/docs/namespaces/trace.md +107 -0
  81. spanforge-2.0.0/docs/quickstart.md +324 -0
  82. spanforge-2.0.0/docs/rfc/rfc-0001.md +140 -0
  83. spanforge-2.0.0/docs/runbook.md +367 -0
  84. spanforge-2.0.0/docs/schema/README.md +321 -0
  85. spanforge-2.0.0/docs/schema/envelope.schema.json +182 -0
  86. spanforge-2.0.0/docs/schema/payloads/agent-run.schema.json +145 -0
  87. spanforge-2.0.0/docs/schema/payloads/agent-step.schema.json +198 -0
  88. spanforge-2.0.0/docs/schema/payloads/audit.schema.json +171 -0
  89. spanforge-2.0.0/docs/schema/payloads/cache.schema.json +193 -0
  90. spanforge-2.0.0/docs/schema/payloads/consent.schema.json +70 -0
  91. spanforge-2.0.0/docs/schema/payloads/cost.schema.json +138 -0
  92. spanforge-2.0.0/docs/schema/payloads/diff.schema.json +150 -0
  93. spanforge-2.0.0/docs/schema/payloads/eval.schema.json +251 -0
  94. spanforge-2.0.0/docs/schema/payloads/explanation.schema.json +96 -0
  95. spanforge-2.0.0/docs/schema/payloads/fence.schema.json +181 -0
  96. spanforge-2.0.0/docs/schema/payloads/guard.schema.json +125 -0
  97. spanforge-2.0.0/docs/schema/payloads/hitl.schema.json +80 -0
  98. spanforge-2.0.0/docs/schema/payloads/model-registry.schema.json +74 -0
  99. spanforge-2.0.0/docs/schema/payloads/prompt.schema.json +181 -0
  100. spanforge-2.0.0/docs/schema/payloads/redact.schema.json +189 -0
  101. spanforge-2.0.0/docs/schema/payloads/span.schema.json +195 -0
  102. spanforge-2.0.0/docs/schema/payloads/template.schema.json +192 -0
  103. spanforge-2.0.0/docs/schema/types/common.schema.json +512 -0
  104. spanforge-2.0.0/docs/schema-versioning.md +98 -0
  105. spanforge-2.0.0/docs/user_guide/cache.md +233 -0
  106. spanforge-2.0.0/docs/user_guide/compliance.md +231 -0
  107. spanforge-2.0.0/docs/user_guide/custom_exporters.md +203 -0
  108. spanforge-2.0.0/docs/user_guide/debugging.md +160 -0
  109. spanforge-2.0.0/docs/user_guide/events.md +121 -0
  110. spanforge-2.0.0/docs/user_guide/export.md +330 -0
  111. spanforge-2.0.0/docs/user_guide/governance.md +227 -0
  112. spanforge-2.0.0/docs/user_guide/index.md +20 -0
  113. spanforge-2.0.0/docs/user_guide/linting.md +233 -0
  114. spanforge-2.0.0/docs/user_guide/metrics.md +122 -0
  115. spanforge-2.0.0/docs/user_guide/migration.md +241 -0
  116. spanforge-2.0.0/docs/user_guide/redaction.md +120 -0
  117. spanforge-2.0.0/docs/user_guide/signing.md +285 -0
  118. spanforge-2.0.0/docs/user_guide/tracing.md +278 -0
  119. spanforge-2.0.0/examples/agent_workflow.py +55 -0
  120. spanforge-2.0.0/examples/budget_alert.py +114 -0
  121. spanforge-2.0.0/examples/docker/Dockerfile +51 -0
  122. spanforge-2.0.0/examples/docker/docker-compose.yml +59 -0
  123. spanforge-2.0.0/examples/docker/otel-config.yaml +31 -0
  124. spanforge-2.0.0/examples/langchain_chain.py +46 -0
  125. spanforge-2.0.0/examples/multi_agent_rag.py +122 -0
  126. spanforge-2.0.0/examples/multi_tenant.py +138 -0
  127. spanforge-2.0.0/examples/openai_chat.py +48 -0
  128. spanforge-2.0.0/examples/otlp_grafana.py +82 -0
  129. spanforge-2.0.0/examples/production_multi_agent.py +178 -0
  130. spanforge-2.0.0/examples/secure_pipeline.py +54 -0
  131. spanforge-2.0.0/examples/streaming_response.py +108 -0
  132. spanforge-2.0.0/pyproject.toml +238 -0
  133. spanforge-2.0.0/sonar-project.properties +17 -0
  134. spanforge-2.0.0/src/spanforge/__init__.py +695 -0
  135. spanforge-2.0.0/src/spanforge/_batch_exporter.py +322 -0
  136. spanforge-2.0.0/src/spanforge/_cli.py +3081 -0
  137. spanforge-2.0.0/src/spanforge/_hooks.py +340 -0
  138. spanforge-2.0.0/src/spanforge/_server.py +953 -0
  139. spanforge-2.0.0/src/spanforge/_span.py +1015 -0
  140. spanforge-2.0.0/src/spanforge/_store.py +287 -0
  141. spanforge-2.0.0/src/spanforge/_stream.py +654 -0
  142. spanforge-2.0.0/src/spanforge/_trace.py +334 -0
  143. spanforge-2.0.0/src/spanforge/_tracer.py +253 -0
  144. spanforge-2.0.0/src/spanforge/actor.py +141 -0
  145. spanforge-2.0.0/src/spanforge/alerts.py +464 -0
  146. spanforge-2.0.0/src/spanforge/auto.py +181 -0
  147. spanforge-2.0.0/src/spanforge/baseline.py +336 -0
  148. spanforge-2.0.0/src/spanforge/config.py +460 -0
  149. spanforge-2.0.0/src/spanforge/consent.py +227 -0
  150. spanforge-2.0.0/src/spanforge/consumer.py +379 -0
  151. spanforge-2.0.0/src/spanforge/core/__init__.py +5 -0
  152. spanforge-2.0.0/src/spanforge/core/compliance_mapping.py +1060 -0
  153. spanforge-2.0.0/src/spanforge/cost.py +597 -0
  154. spanforge-2.0.0/src/spanforge/debug.py +514 -0
  155. spanforge-2.0.0/src/spanforge/drift.py +488 -0
  156. spanforge-2.0.0/src/spanforge/egress.py +63 -0
  157. spanforge-2.0.0/src/spanforge/eval.py +575 -0
  158. spanforge-2.0.0/src/spanforge/event.py +1052 -0
  159. spanforge-2.0.0/src/spanforge/exceptions.py +246 -0
  160. spanforge-2.0.0/src/spanforge/explain.py +181 -0
  161. spanforge-2.0.0/src/spanforge/export/__init__.py +50 -0
  162. spanforge-2.0.0/src/spanforge/export/append_only.py +342 -0
  163. spanforge-2.0.0/src/spanforge/export/cloud.py +349 -0
  164. spanforge-2.0.0/src/spanforge/export/datadog.py +495 -0
  165. spanforge-2.0.0/src/spanforge/export/grafana.py +331 -0
  166. spanforge-2.0.0/src/spanforge/export/jsonl.py +198 -0
  167. spanforge-2.0.0/src/spanforge/export/otel_bridge.py +291 -0
  168. spanforge-2.0.0/src/spanforge/export/otlp.py +817 -0
  169. spanforge-2.0.0/src/spanforge/export/otlp_bridge.py +231 -0
  170. spanforge-2.0.0/src/spanforge/export/redis_backend.py +282 -0
  171. spanforge-2.0.0/src/spanforge/export/webhook.py +302 -0
  172. spanforge-2.0.0/src/spanforge/exporters/__init__.py +29 -0
  173. spanforge-2.0.0/src/spanforge/exporters/console.py +271 -0
  174. spanforge-2.0.0/src/spanforge/exporters/jsonl.py +144 -0
  175. spanforge-2.0.0/src/spanforge/hitl.py +297 -0
  176. spanforge-2.0.0/src/spanforge/inspect.py +429 -0
  177. spanforge-2.0.0/src/spanforge/integrations/__init__.py +39 -0
  178. spanforge-2.0.0/src/spanforge/integrations/_pricing.py +277 -0
  179. spanforge-2.0.0/src/spanforge/integrations/anthropic.py +388 -0
  180. spanforge-2.0.0/src/spanforge/integrations/bedrock.py +306 -0
  181. spanforge-2.0.0/src/spanforge/integrations/crewai.py +251 -0
  182. spanforge-2.0.0/src/spanforge/integrations/gemini.py +349 -0
  183. spanforge-2.0.0/src/spanforge/integrations/groq.py +444 -0
  184. spanforge-2.0.0/src/spanforge/integrations/langchain.py +349 -0
  185. spanforge-2.0.0/src/spanforge/integrations/llamaindex.py +370 -0
  186. spanforge-2.0.0/src/spanforge/integrations/ollama.py +286 -0
  187. spanforge-2.0.0/src/spanforge/integrations/openai.py +370 -0
  188. spanforge-2.0.0/src/spanforge/integrations/together.py +485 -0
  189. spanforge-2.0.0/src/spanforge/metrics.py +393 -0
  190. spanforge-2.0.0/src/spanforge/metrics_export.py +342 -0
  191. spanforge-2.0.0/src/spanforge/migrate.py +278 -0
  192. spanforge-2.0.0/src/spanforge/model_registry.py +282 -0
  193. spanforge-2.0.0/src/spanforge/models.py +407 -0
  194. spanforge-2.0.0/src/spanforge/namespaces/__init__.py +215 -0
  195. spanforge-2.0.0/src/spanforge/namespaces/audit.py +253 -0
  196. spanforge-2.0.0/src/spanforge/namespaces/cache.py +209 -0
  197. spanforge-2.0.0/src/spanforge/namespaces/chain.py +74 -0
  198. spanforge-2.0.0/src/spanforge/namespaces/confidence.py +69 -0
  199. spanforge-2.0.0/src/spanforge/namespaces/consent.py +85 -0
  200. spanforge-2.0.0/src/spanforge/namespaces/cost.py +175 -0
  201. spanforge-2.0.0/src/spanforge/namespaces/decision.py +135 -0
  202. spanforge-2.0.0/src/spanforge/namespaces/diff.py +146 -0
  203. spanforge-2.0.0/src/spanforge/namespaces/drift.py +79 -0
  204. spanforge-2.0.0/src/spanforge/namespaces/eval_.py +232 -0
  205. spanforge-2.0.0/src/spanforge/namespaces/fence.py +180 -0
  206. spanforge-2.0.0/src/spanforge/namespaces/guard.py +104 -0
  207. spanforge-2.0.0/src/spanforge/namespaces/hitl.py +92 -0
  208. spanforge-2.0.0/src/spanforge/namespaces/latency.py +69 -0
  209. spanforge-2.0.0/src/spanforge/namespaces/prompt.py +185 -0
  210. spanforge-2.0.0/src/spanforge/namespaces/redact.py +172 -0
  211. spanforge-2.0.0/src/spanforge/namespaces/template.py +197 -0
  212. spanforge-2.0.0/src/spanforge/namespaces/tool_call.py +76 -0
  213. spanforge-2.0.0/src/spanforge/namespaces/trace.py +1006 -0
  214. spanforge-2.0.0/src/spanforge/normalizer.py +183 -0
  215. spanforge-2.0.0/src/spanforge/presidio_backend.py +149 -0
  216. spanforge-2.0.0/src/spanforge/processor.py +258 -0
  217. spanforge-2.0.0/src/spanforge/prompt_registry.py +415 -0
  218. spanforge-2.0.0/src/spanforge/py.typed +0 -0
  219. spanforge-2.0.0/src/spanforge/redact.py +780 -0
  220. spanforge-2.0.0/src/spanforge/sampling.py +500 -0
  221. spanforge-2.0.0/src/spanforge/schemas/v1.0/schema.json +170 -0
  222. spanforge-2.0.0/src/spanforge/schemas/v2.0/schema.json +536 -0
  223. spanforge-2.0.0/src/spanforge/signing.py +1152 -0
  224. spanforge-2.0.0/src/spanforge/stream.py +559 -0
  225. spanforge-2.0.0/src/spanforge/testing.py +376 -0
  226. spanforge-2.0.0/src/spanforge/trace.py +199 -0
  227. spanforge-2.0.0/src/spanforge/types.py +696 -0
  228. spanforge-2.0.0/src/spanforge/ulid.py +304 -0
  229. spanforge-2.0.0/src/spanforge/validate.py +383 -0
  230. spanforge-2.0.0/test_agent.jsonl +2 -0
  231. spanforge-2.0.0/test_events.jsonl +1 -0
  232. spanforge-2.0.0/tests/__init__.py +0 -0
  233. spanforge-2.0.0/tests/conformance/__init__.py +0 -0
  234. spanforge-2.0.0/tests/conformance/fixtures/chain.json +46 -0
  235. spanforge-2.0.0/tests/conformance/fixtures/compliance.json +29 -0
  236. spanforge-2.0.0/tests/conformance/fixtures/key_security.json +42 -0
  237. spanforge-2.0.0/tests/conformance/fixtures/migration.json +59 -0
  238. spanforge-2.0.0/tests/conformance/fixtures/pii.json +55 -0
  239. spanforge-2.0.0/tests/conformance/fixtures/signing.json +51 -0
  240. spanforge-2.0.0/tests/conformance/fixtures.json +155 -0
  241. spanforge-2.0.0/tests/conformance/run_conformance.py +361 -0
  242. spanforge-2.0.0/tests/conformance/test_conformance.py +421 -0
  243. spanforge-2.0.0/tests/conftest.py +167 -0
  244. spanforge-2.0.0/tests/test_actor.py +155 -0
  245. spanforge-2.0.0/tests/test_alerts.py +483 -0
  246. spanforge-2.0.0/tests/test_auto.py +328 -0
  247. spanforge-2.0.0/tests/test_baseline.py +536 -0
  248. spanforge-2.0.0/tests/test_benchmarks.py +185 -0
  249. spanforge-2.0.0/tests/test_budget_alert.py +203 -0
  250. spanforge-2.0.0/tests/test_cli.py +342 -0
  251. spanforge-2.0.0/tests/test_compliance_mapping.py +955 -0
  252. spanforge-2.0.0/tests/test_consent.py +174 -0
  253. spanforge-2.0.0/tests/test_consumer.py +242 -0
  254. spanforge-2.0.0/tests/test_cost_event_emission.py +383 -0
  255. spanforge-2.0.0/tests/test_cost_tracker.py +361 -0
  256. spanforge-2.0.0/tests/test_costguard_gaps.py +422 -0
  257. spanforge-2.0.0/tests/test_drift.py +654 -0
  258. spanforge-2.0.0/tests/test_event.py +896 -0
  259. spanforge-2.0.0/tests/test_exceptions.py +134 -0
  260. spanforge-2.0.0/tests/test_explain.py +220 -0
  261. spanforge-2.0.0/tests/test_export_cloud.py +414 -0
  262. spanforge-2.0.0/tests/test_export_datadog.py +393 -0
  263. spanforge-2.0.0/tests/test_export_grafana.py +288 -0
  264. spanforge-2.0.0/tests/test_export_jsonl.py +379 -0
  265. spanforge-2.0.0/tests/test_export_otel_bridge.py +399 -0
  266. spanforge-2.0.0/tests/test_export_otlp.py +1082 -0
  267. spanforge-2.0.0/tests/test_export_redis_backend.py +508 -0
  268. spanforge-2.0.0/tests/test_export_webhook.py +505 -0
  269. spanforge-2.0.0/tests/test_hitl.py +255 -0
  270. spanforge-2.0.0/tests/test_inspect.py +950 -0
  271. spanforge-2.0.0/tests/test_integration.py +132 -0
  272. spanforge-2.0.0/tests/test_integrations.py +502 -0
  273. spanforge-2.0.0/tests/test_migrate.py +352 -0
  274. spanforge-2.0.0/tests/test_model_registry.py +272 -0
  275. spanforge-2.0.0/tests/test_models.py +481 -0
  276. spanforge-2.0.0/tests/test_namespaces.py +951 -0
  277. spanforge-2.0.0/tests/test_otlp_bridge.py +300 -0
  278. spanforge-2.0.0/tests/test_phase10_features.py +652 -0
  279. spanforge-2.0.0/tests/test_phase11_security.py +255 -0
  280. spanforge-2.0.0/tests/test_phase1_context_trace.py +1306 -0
  281. spanforge-2.0.0/tests/test_phase2_observability.py +888 -0
  282. spanforge-2.0.0/tests/test_phase3_debug_sampling.py +1074 -0
  283. spanforge-2.0.0/tests/test_phase4_agent_instrumentation.py +1009 -0
  284. spanforge-2.0.0/tests/test_phase4_metrics_store.py +638 -0
  285. spanforge-2.0.0/tests/test_phase5_console_exporter.py +725 -0
  286. spanforge-2.0.0/tests/test_phase5_coverage.py +859 -0
  287. spanforge-2.0.0/tests/test_phase5_hooks_crewai.py +517 -0
  288. spanforge-2.0.0/tests/test_phase6_openai_integration.py +928 -0
  289. spanforge-2.0.0/tests/test_processor_coverage.py +237 -0
  290. spanforge-2.0.0/tests/test_properties.py +178 -0
  291. spanforge-2.0.0/tests/test_redact.py +821 -0
  292. spanforge-2.0.0/tests/test_rfc_namespaces.py +461 -0
  293. spanforge-2.0.0/tests/test_sampling_coverage.py +378 -0
  294. spanforge-2.0.0/tests/test_sdk_config.py +372 -0
  295. spanforge-2.0.0/tests/test_sdk_coverage_boost.py +1032 -0
  296. spanforge-2.0.0/tests/test_sdk_exporters.py +465 -0
  297. spanforge-2.0.0/tests/test_sdk_final_coverage.py +847 -0
  298. spanforge-2.0.0/tests/test_sdk_gap_filler.py +367 -0
  299. spanforge-2.0.0/tests/test_sdk_openai_integration.py +753 -0
  300. spanforge-2.0.0/tests/test_sdk_phase7_integrations.py +1022 -0
  301. spanforge-2.0.0/tests/test_sdk_precision_coverage.py +182 -0
  302. spanforge-2.0.0/tests/test_sdk_span.py +473 -0
  303. spanforge-2.0.0/tests/test_sdk_stream.py +393 -0
  304. spanforge-2.0.0/tests/test_sdk_tracer.py +217 -0
  305. spanforge-2.0.0/tests/test_sdk_validation_coverage.py +930 -0
  306. spanforge-2.0.0/tests/test_server.py +273 -0
  307. spanforge-2.0.0/tests/test_sf11.py +136 -0
  308. spanforge-2.0.0/tests/test_sf12.py +98 -0
  309. spanforge-2.0.0/tests/test_sf13.py +145 -0
  310. spanforge-2.0.0/tests/test_sf14.py +95 -0
  311. spanforge-2.0.0/tests/test_sf15.py +141 -0
  312. spanforge-2.0.0/tests/test_sf16.py +127 -0
  313. spanforge-2.0.0/tests/test_signing.py +1219 -0
  314. spanforge-2.0.0/tests/test_stream.py +575 -0
  315. spanforge-2.0.0/tests/test_trace_decorator.py +447 -0
  316. spanforge-2.0.0/tests/test_trace_pytest_fixtures.py +177 -0
  317. spanforge-2.0.0/tests/test_types.py +341 -0
  318. spanforge-2.0.0/tests/test_ulid.py +370 -0
  319. spanforge-2.0.0/tests/test_validate.py +408 -0
@@ -0,0 +1,2 @@
1
+ # Auto detect text files and perform LF normalization
2
+ * text=auto
@@ -0,0 +1,29 @@
1
+ # Owners for core SDK modules
2
+ src/spanforge/signing.py @veerarag1973
3
+ src/spanforge/redact.py @veerarag1973
4
+ src/spanforge/event.py @veerarag1973
5
+ src/spanforge/validate.py @veerarag1973
6
+
7
+ # Export backends
8
+ src/spanforge/export/ @veerarag1973
9
+
10
+ # Integrations
11
+ src/spanforge/integrations/ @veerarag1973
12
+
13
+ # Namespaces (schema changes need RFC review)
14
+ src/spanforge/namespaces/ @veerarag1973
15
+
16
+ # CLI
17
+ src/spanforge/_cli.py @veerarag1973
18
+
19
+ # CI/CD
20
+ .github/ @veerarag1973
21
+
22
+ # Docs
23
+ docs/ @veerarag1973
24
+ README.md @veerarag1973
25
+
26
+ # Security-sensitive: require explicit approval
27
+ SECURITY.md @veerarag1973
28
+ src/spanforge/signing.py @veerarag1973
29
+ src/spanforge/redact.py @veerarag1973
@@ -0,0 +1,62 @@
1
+ # Bug Report
2
+ name: Bug Report
3
+ description: Report a reproducible bug in spanforge
4
+ labels: ["bug", "needs-triage"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thank you for reporting a bug! Please fill out the sections below so we can reproduce and fix it quickly.
10
+
11
+ - type: input
12
+ id: version
13
+ attributes:
14
+ label: spanforge version
15
+ placeholder: "e.g. 2.0.0"
16
+ validations:
17
+ required: true
18
+
19
+ - type: input
20
+ id: python
21
+ attributes:
22
+ label: Python version
23
+ placeholder: "e.g. 3.11.8"
24
+ validations:
25
+ required: true
26
+
27
+ - type: textarea
28
+ id: description
29
+ attributes:
30
+ label: Describe the bug
31
+ description: A clear and concise description of what the bug is.
32
+ validations:
33
+ required: true
34
+
35
+ - type: textarea
36
+ id: repro
37
+ attributes:
38
+ label: Steps to reproduce
39
+ description: Minimal code to reproduce the issue.
40
+ render: python
41
+ validations:
42
+ required: true
43
+
44
+ - type: textarea
45
+ id: expected
46
+ attributes:
47
+ label: Expected behavior
48
+ validations:
49
+ required: true
50
+
51
+ - type: textarea
52
+ id: actual
53
+ attributes:
54
+ label: Actual behavior (include full traceback)
55
+ validations:
56
+ required: true
57
+
58
+ - type: textarea
59
+ id: context
60
+ attributes:
61
+ label: Additional context
62
+ description: e.g. OS, exporter used, integrations installed
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Ask a question
4
+ url: https://github.com/veerarag1973/spanforge/discussions
5
+ about: Use GitHub Discussions for questions and community support
6
+ - name: Security vulnerability
7
+ url: https://github.com/veerarag1973/spanforge/blob/main/SECURITY.md
8
+ about: Please read SECURITY.md before reporting security issues
@@ -0,0 +1,42 @@
1
+ name: Feature Request
2
+ description: Suggest a new feature or improvement
3
+ labels: ["enhancement", "needs-triage"]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Thanks for taking the time to suggest an improvement. Search existing issues first to avoid duplicates.
9
+
10
+ - type: textarea
11
+ id: problem
12
+ attributes:
13
+ label: What problem are you trying to solve?
14
+ description: A clear description of the use case or pain point.
15
+ validations:
16
+ required: true
17
+
18
+ - type: textarea
19
+ id: solution
20
+ attributes:
21
+ label: Proposed solution
22
+ description: What would the API or behaviour look like?
23
+ validations:
24
+ required: true
25
+
26
+ - type: textarea
27
+ id: alternatives
28
+ attributes:
29
+ label: Alternatives considered
30
+ description: Any other approaches you have tried or considered.
31
+
32
+ - type: dropdown
33
+ id: segment
34
+ attributes:
35
+ label: Who does this help most?
36
+ options:
37
+ - Open-source / hobby projects
38
+ - Startups / SMBs
39
+ - Enterprise teams
40
+ - All users
41
+ validations:
42
+ required: true
@@ -0,0 +1,56 @@
1
+ name: RFC Proposal
2
+ description: Propose a new event namespace, schema change, or architectural decision
3
+ labels: ["rfc", "needs-discussion"]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Use this template for any change that affects the public schema, event namespaces, or SDK public API.
9
+ Small bug fixes and internal refactors do not need an RFC.
10
+
11
+ - type: input
12
+ id: title
13
+ attributes:
14
+ label: RFC title
15
+ placeholder: "RFC-NNNN: Add llm.memory.* namespace for agent working memory"
16
+ validations:
17
+ required: true
18
+
19
+ - type: textarea
20
+ id: motivation
21
+ attributes:
22
+ label: Motivation
23
+ description: Why is this change needed? What problem does it solve?
24
+ validations:
25
+ required: true
26
+
27
+ - type: textarea
28
+ id: design
29
+ attributes:
30
+ label: Detailed design
31
+ description: |
32
+ Describe the proposed change in detail. Include:
33
+ - New fields or event types
34
+ - Sample JSON payloads
35
+ - API changes (new functions, parameters, classes)
36
+ validations:
37
+ required: true
38
+
39
+ - type: textarea
40
+ id: compat
41
+ attributes:
42
+ label: Backwards compatibility
43
+ description: Does this break existing events or consumers? How will migration work?
44
+ validations:
45
+ required: true
46
+
47
+ - type: textarea
48
+ id: alternatives
49
+ attributes:
50
+ label: Alternatives considered
51
+
52
+ - type: textarea
53
+ id: unresolved
54
+ attributes:
55
+ label: Unresolved questions
56
+ description: What aspects of the design are still open?
@@ -0,0 +1,25 @@
1
+ ## Summary
2
+
3
+ <!-- One sentence describing the change. -->
4
+
5
+ ## Type of change
6
+
7
+ - [ ] Bug fix (non-breaking)
8
+ - [ ] New feature (non-breaking)
9
+ - [ ] Breaking change (schema, public API, or CLI)
10
+ - [ ] Documentation only
11
+ - [ ] Refactor / internal improvement
12
+
13
+ ## Related issue
14
+
15
+ Closes #<!-- issue number -->
16
+
17
+ ## Checklist
18
+
19
+ - [ ] Tests added or updated and all pass (`pytest`)
20
+ - [ ] Coverage ≥ 90% (`pytest --cov-fail-under=90`)
21
+ - [ ] Lint passes (`ruff check . && ruff format --check .`)
22
+ - [ ] Type check passes (`mypy src/spanforge tests`)
23
+ - [ ] CHANGELOG.md updated
24
+ - [ ] Docs updated (if public API changed)
25
+ - [ ] No secrets or credentials in this diff
@@ -0,0 +1,63 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ lint:
14
+ name: Lint & Type-check
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+
19
+ - name: Set up Python
20
+ uses: actions/setup-python@v5
21
+ with:
22
+ python-version: "3.12"
23
+
24
+ - name: Install dependencies
25
+ run: pip install -e ".[dev]"
26
+
27
+ - name: Ruff lint
28
+ run: ruff check src/spanforge tests
29
+
30
+ - name: Ruff format check
31
+ run: ruff format --check src/spanforge tests
32
+
33
+ - name: Mypy
34
+ run: mypy --package spanforge
35
+
36
+ test:
37
+ name: Test (Python ${{ matrix.python-version }}, ${{ matrix.os }})
38
+ runs-on: ${{ matrix.os }}
39
+ strategy:
40
+ fail-fast: false
41
+ matrix:
42
+ os: [ubuntu-latest, windows-latest]
43
+ python-version: ["3.9", "3.10", "3.11", "3.12"]
44
+ steps:
45
+ - uses: actions/checkout@v4
46
+
47
+ - name: Set up Python ${{ matrix.python-version }}
48
+ uses: actions/setup-python@v5
49
+ with:
50
+ python-version: ${{ matrix.python-version }}
51
+
52
+ - name: Install dependencies
53
+ run: pip install -e ".[dev]"
54
+
55
+ - name: Run tests with coverage
56
+ run: pytest --cov=spanforge --cov-report=term-missing --cov-report=xml:coverage.xml
57
+
58
+ - name: Upload coverage artifact
59
+ if: matrix.python-version == '3.12' && matrix.os == 'ubuntu-latest'
60
+ uses: actions/upload-artifact@v4
61
+ with:
62
+ name: coverage-report
63
+ path: coverage.xml
@@ -0,0 +1,135 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*.*.*"
7
+
8
+ permissions:
9
+ contents: write # create GitHub Release
10
+ id-token: write # OIDC for trusted publishing + Sigstore keyless signing
11
+
12
+ jobs:
13
+ build:
14
+ name: Build distribution
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+ with:
19
+ fetch-depth: 0
20
+
21
+ - name: Set up Python
22
+ uses: actions/setup-python@v5
23
+ with:
24
+ python-version: "3.12"
25
+
26
+ - name: Install build tools
27
+ run: pip install --upgrade build
28
+
29
+ - name: Build sdist and wheel
30
+ run: python -m build
31
+
32
+ - name: Verify wheel contents
33
+ run: |
34
+ pip install twine
35
+ twine check dist/*
36
+
37
+ - name: Upload build artifacts
38
+ uses: actions/upload-artifact@v4
39
+ with:
40
+ name: dist
41
+ path: dist/
42
+
43
+ publish-pypi:
44
+ name: Publish to PyPI
45
+ needs: build
46
+ runs-on: ubuntu-latest
47
+ environment:
48
+ name: pypi
49
+ url: https://pypi.org/project/spanforge/
50
+ steps:
51
+ - name: Download build artifacts
52
+ uses: actions/download-artifact@v4
53
+ with:
54
+ name: dist
55
+ path: dist/
56
+
57
+ - name: Publish to PyPI (trusted publishing)
58
+ uses: pypa/gh-action-pypi-publish@release/v1
59
+ # Uses OIDC trusted publishing — no API token secret needed.
60
+ # Configure the trusted publisher at:
61
+ # https://pypi.org/manage/project/spanforge/settings/publishing/
62
+
63
+ github-release:
64
+ name: Create GitHub Release
65
+ needs: publish-pypi
66
+ runs-on: ubuntu-latest
67
+ steps:
68
+ - uses: actions/checkout@v4
69
+ with:
70
+ fetch-depth: 0
71
+
72
+ - name: Download build artifacts
73
+ uses: actions/download-artifact@v4
74
+ with:
75
+ name: dist
76
+ path: dist/
77
+
78
+ - name: Generate changelog from tag message
79
+ id: changelog
80
+ run: |
81
+ # Extract annotated tag message as release notes
82
+ git tag -l --format='%(contents)' "${{ github.ref_name }}" > release_notes.txt
83
+ echo "notes_file=release_notes.txt" >> "$GITHUB_OUTPUT"
84
+
85
+ - name: Create GitHub Release
86
+ uses: softprops/action-gh-release@v2
87
+ with:
88
+ body_path: ${{ steps.changelog.outputs.notes_file }}
89
+ files: dist/*
90
+ draft: false
91
+ prerelease: ${{ contains(github.ref_name, 'rc') || contains(github.ref_name, 'alpha') || contains(github.ref_name, 'beta') }}
92
+
93
+ sbom-and-sign:
94
+ name: Generate SBOM and Sigstore signing
95
+ needs: github-release
96
+ runs-on: ubuntu-latest
97
+ steps:
98
+ - uses: actions/checkout@v4
99
+
100
+ - name: Download build artifacts
101
+ uses: actions/download-artifact@v4
102
+ with:
103
+ name: dist
104
+ path: dist/
105
+
106
+ # ── SBOM ────────────────────────────────────────────────────────────────
107
+ - name: Generate CycloneDX SBOM
108
+ uses: anchore/sbom-action@v0
109
+ with:
110
+ path: dist/
111
+ format: cyclonedx-json
112
+ output-file: sbom.cyclonedx.json
113
+ upload-artifact: false # we attach it manually to the release below
114
+
115
+ # ── Keyless signing with Sigstore / cosign ───────────────────────────────
116
+ - name: Install cosign
117
+ uses: sigstore/cosign-installer@v3
118
+
119
+ - name: Sign distribution files
120
+ # --yes suppresses the interactive prompt in CI
121
+ run: |
122
+ for f in dist/*.whl dist/*.tar.gz; do
123
+ cosign sign-blob --yes "$f" \
124
+ --output-signature "${f}.sig" \
125
+ --output-certificate "${f}.pem"
126
+ done
127
+
128
+ # ── Attach artefacts to the GitHub Release ───────────────────────────────
129
+ - name: Attach SBOM and signatures to Release
130
+ uses: softprops/action-gh-release@v2
131
+ with:
132
+ files: |
133
+ sbom.cyclonedx.json
134
+ dist/*.sig
135
+ dist/*.pem
@@ -0,0 +1,181 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py,cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ #Pipfile.lock
96
+
97
+ # UV
98
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ #uv.lock
102
+
103
+ # poetry
104
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
105
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
106
+ # commonly ignored for libraries.
107
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
108
+ #poetry.lock
109
+
110
+ # pdm
111
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
112
+ #pdm.lock
113
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
114
+ # in version control.
115
+ # https://pdm.fming.dev/latest/usage/project/#working-with-version-control
116
+ .pdm.toml
117
+ .pdm-python
118
+ .pdm-build/
119
+
120
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
121
+ __pypackages__/
122
+
123
+ # Celery stuff
124
+ celerybeat-schedule
125
+ celerybeat.pid
126
+
127
+ # SageMath parsed files
128
+ *.sage.py
129
+
130
+ # Environments
131
+ .env
132
+ .venv
133
+ env/
134
+ venv/
135
+ ENV/
136
+ env.bak/
137
+ venv.bak/
138
+
139
+ # Spyder project settings
140
+ .spyderproject
141
+ .spyproject
142
+
143
+ # Rope project settings
144
+ .ropeproject
145
+
146
+ # mkdocs documentation
147
+ /site
148
+
149
+ # mypy
150
+ .mypy_cache/
151
+ .dmypy.json
152
+ dmypy.json
153
+
154
+ # Pyre type checker
155
+ .pyre/
156
+
157
+ # pytype static type analyzer
158
+ .pytype/
159
+
160
+ # Cython debug symbols
161
+ cython_debug/
162
+
163
+ # PyCharm
164
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
165
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
166
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
167
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
168
+ #.idea/
169
+
170
+ # Ruff stuff:
171
+ .ruff_cache/
172
+
173
+ # PyPI configuration file
174
+ .pypirc
175
+
176
+ # Cursor
177
+ # Cursor is an AI-powered code editor.`.cursorignore` specifies files/directories to
178
+ # exclude from AI features like autocomplete and code analysis. Recommended for sensitive data
179
+ # refer to https://docs.cursor.com/context/ignore-files
180
+ .cursorignore
181
+ .cursorindexingignore
spanforge-2.0.0/CNAME ADDED
@@ -0,0 +1 @@
1
+ llmtoolkitschema.getspanforege.com
@@ -0,0 +1,58 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ We as members, contributors, and leaders pledge to make participation in the
6
+ spanforge community a harassment-free experience for everyone, regardless of age,
7
+ body size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+ identity and expression, level of experience, education, socio-economic status,
9
+ nationality, personal appearance, race, caste, color, religion, or sexual
10
+ identity and orientation.
11
+
12
+ We pledge to act and interact in ways that contribute to an open, welcoming,
13
+ diverse, inclusive, and healthy community.
14
+
15
+ ## Our Standards
16
+
17
+ Examples of behavior that contributes to a positive environment:
18
+
19
+ * Demonstrating empathy and kindness toward other people
20
+ * Being respectful of differing opinions, viewpoints, and experiences
21
+ * Giving and gracefully accepting constructive feedback
22
+ * Accepting responsibility for our mistakes, apologizing to those affected, and learning from the experience
23
+ * Focusing on what is best not just for us as individuals, but for the overall community
24
+
25
+ Examples of unacceptable behavior:
26
+
27
+ * The use of sexualized language or imagery, and sexual attention or advances of any kind
28
+ * Trolling, insulting or derogatory comments, and personal or political attacks
29
+ * Public or private harassment
30
+ * Publishing others' private information without their explicit permission
31
+ * Other conduct which could reasonably be considered inappropriate in a professional setting
32
+
33
+ ## Enforcement Responsibilities
34
+
35
+ Community leaders are responsible for clarifying and enforcing our standards of
36
+ acceptable behavior and will take appropriate and fair corrective action in
37
+ response to any behavior that they deem inappropriate, threatening, offensive,
38
+ or harmful.
39
+
40
+ ## Scope
41
+
42
+ This Code of Conduct applies within all community spaces, and also applies when
43
+ an individual is officially representing the community in public spaces.
44
+
45
+ ## Enforcement
46
+
47
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
48
+ reported to the community leaders responsible for enforcement at
49
+ **conduct@getspanforge.com**.
50
+
51
+ All complaints will be reviewed and investigated promptly and fairly.
52
+ All community leaders are obligated to respect the privacy and security of the
53
+ reporter of any incident.
54
+
55
+ ## Attribution
56
+
57
+ This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org),
58
+ version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.