mseep-agentops 0.4.18__tar.gz → 0.4.23__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 (219) hide show
  1. mseep_agentops-0.4.23/.gitattributes +1 -0
  2. mseep_agentops-0.4.23/.gitignore +183 -0
  3. mseep_agentops-0.4.23/.pre-commit-config.yaml +9 -0
  4. mseep_agentops-0.4.23/CONTRIBUTING.md +390 -0
  5. {mseep_agentops-0.4.18/mseep_agentops.egg-info → mseep_agentops-0.4.23}/PKG-INFO +30 -40
  6. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/README.md +14 -7
  7. mseep_agentops-0.4.23/TOS.md +5 -0
  8. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/client/api/base.py +28 -30
  9. mseep_agentops-0.4.23/agentops/client/api/versions/v3.py +69 -0
  10. mseep_agentops-0.4.23/agentops/client/api/versions/v4.py +145 -0
  11. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/client/client.py +98 -29
  12. mseep_agentops-0.4.23/agentops/client/http/README.md +87 -0
  13. mseep_agentops-0.4.23/agentops/client/http/http_client.py +169 -0
  14. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/config.py +8 -2
  15. mseep_agentops-0.4.23/agentops/instrumentation/OpenTelemetry.md +133 -0
  16. mseep_agentops-0.4.23/agentops/instrumentation/README.md +167 -0
  17. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/instrumentation/__init__.py +13 -1
  18. mseep_agentops-0.4.23/agentops/instrumentation/agentic/ag2/__init__.py +18 -0
  19. mseep_agentops-0.4.23/agentops/instrumentation/agentic/ag2/instrumentor.py +922 -0
  20. mseep_agentops-0.4.23/agentops/instrumentation/agentic/agno/__init__.py +19 -0
  21. mseep_agentops-0.4.23/agentops/instrumentation/agentic/agno/attributes/__init__.py +20 -0
  22. mseep_agentops-0.4.23/agentops/instrumentation/agentic/agno/attributes/agent.py +250 -0
  23. mseep_agentops-0.4.23/agentops/instrumentation/agentic/agno/attributes/metrics.py +214 -0
  24. mseep_agentops-0.4.23/agentops/instrumentation/agentic/agno/attributes/storage.py +158 -0
  25. mseep_agentops-0.4.23/agentops/instrumentation/agentic/agno/attributes/team.py +195 -0
  26. mseep_agentops-0.4.23/agentops/instrumentation/agentic/agno/attributes/tool.py +210 -0
  27. mseep_agentops-0.4.23/agentops/instrumentation/agentic/agno/attributes/workflow.py +254 -0
  28. mseep_agentops-0.4.23/agentops/instrumentation/agentic/agno/instrumentor.py +1313 -0
  29. mseep_agentops-0.4.23/agentops/instrumentation/agentic/crewai/LICENSE +201 -0
  30. mseep_agentops-0.4.23/agentops/instrumentation/agentic/crewai/NOTICE.md +10 -0
  31. mseep_agentops-0.4.23/agentops/instrumentation/agentic/crewai/__init__.py +6 -0
  32. mseep_agentops-0.4.23/agentops/instrumentation/agentic/crewai/crewai_span_attributes.py +335 -0
  33. mseep_agentops-0.4.23/agentops/instrumentation/agentic/crewai/instrumentation.py +535 -0
  34. mseep_agentops-0.4.23/agentops/instrumentation/agentic/crewai/version.py +1 -0
  35. mseep_agentops-0.4.23/agentops/instrumentation/agentic/google_adk/__init__.py +19 -0
  36. mseep_agentops-0.4.23/agentops/instrumentation/agentic/google_adk/instrumentor.py +68 -0
  37. mseep_agentops-0.4.23/agentops/instrumentation/agentic/google_adk/patch.py +767 -0
  38. mseep_agentops-0.4.23/agentops/instrumentation/agentic/haystack/__init__.py +1 -0
  39. mseep_agentops-0.4.23/agentops/instrumentation/agentic/haystack/instrumentor.py +186 -0
  40. mseep_agentops-0.4.23/agentops/instrumentation/agentic/langgraph/__init__.py +3 -0
  41. mseep_agentops-0.4.23/agentops/instrumentation/agentic/langgraph/attributes.py +54 -0
  42. mseep_agentops-0.4.23/agentops/instrumentation/agentic/langgraph/instrumentation.py +598 -0
  43. mseep_agentops-0.4.23/agentops/instrumentation/agentic/langgraph/version.py +1 -0
  44. mseep_agentops-0.4.23/agentops/instrumentation/agentic/openai_agents/README.md +156 -0
  45. mseep_agentops-0.4.23/agentops/instrumentation/agentic/openai_agents/SPANS.md +145 -0
  46. mseep_agentops-0.4.23/agentops/instrumentation/agentic/openai_agents/TRACING_API.md +144 -0
  47. mseep_agentops-0.4.23/agentops/instrumentation/agentic/openai_agents/__init__.py +30 -0
  48. mseep_agentops-0.4.23/agentops/instrumentation/agentic/openai_agents/attributes/common.py +549 -0
  49. mseep_agentops-0.4.23/agentops/instrumentation/agentic/openai_agents/attributes/completion.py +172 -0
  50. mseep_agentops-0.4.23/agentops/instrumentation/agentic/openai_agents/attributes/model.py +58 -0
  51. mseep_agentops-0.4.23/agentops/instrumentation/agentic/openai_agents/attributes/tokens.py +275 -0
  52. mseep_agentops-0.4.23/agentops/instrumentation/agentic/openai_agents/exporter.py +469 -0
  53. mseep_agentops-0.4.23/agentops/instrumentation/agentic/openai_agents/instrumentor.py +107 -0
  54. mseep_agentops-0.4.23/agentops/instrumentation/agentic/openai_agents/processor.py +58 -0
  55. mseep_agentops-0.4.23/agentops/instrumentation/agentic/smolagents/README.md +88 -0
  56. mseep_agentops-0.4.23/agentops/instrumentation/agentic/smolagents/__init__.py +12 -0
  57. mseep_agentops-0.4.23/agentops/instrumentation/agentic/smolagents/attributes/agent.py +354 -0
  58. mseep_agentops-0.4.23/agentops/instrumentation/agentic/smolagents/attributes/model.py +205 -0
  59. mseep_agentops-0.4.23/agentops/instrumentation/agentic/smolagents/instrumentor.py +286 -0
  60. mseep_agentops-0.4.23/agentops/instrumentation/agentic/smolagents/stream_wrapper.py +258 -0
  61. mseep_agentops-0.4.23/agentops/instrumentation/agentic/xpander/__init__.py +15 -0
  62. mseep_agentops-0.4.23/agentops/instrumentation/agentic/xpander/context.py +112 -0
  63. mseep_agentops-0.4.23/agentops/instrumentation/agentic/xpander/instrumentor.py +877 -0
  64. mseep_agentops-0.4.23/agentops/instrumentation/agentic/xpander/trace_probe.py +86 -0
  65. mseep_agentops-0.4.23/agentops/instrumentation/agentic/xpander/version.py +3 -0
  66. mseep_agentops-0.4.23/agentops/instrumentation/common/README.md +65 -0
  67. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/instrumentation/common/attributes.py +1 -2
  68. mseep_agentops-0.4.23/agentops/instrumentation/providers/anthropic/__init__.py +24 -0
  69. mseep_agentops-0.4.23/agentops/instrumentation/providers/anthropic/attributes/__init__.py +23 -0
  70. mseep_agentops-0.4.23/agentops/instrumentation/providers/anthropic/attributes/common.py +64 -0
  71. mseep_agentops-0.4.23/agentops/instrumentation/providers/anthropic/attributes/message.py +541 -0
  72. mseep_agentops-0.4.23/agentops/instrumentation/providers/anthropic/attributes/tools.py +231 -0
  73. mseep_agentops-0.4.23/agentops/instrumentation/providers/anthropic/event_handler_wrapper.py +90 -0
  74. mseep_agentops-0.4.23/agentops/instrumentation/providers/anthropic/instrumentor.py +146 -0
  75. mseep_agentops-0.4.23/agentops/instrumentation/providers/anthropic/stream_wrapper.py +436 -0
  76. mseep_agentops-0.4.23/agentops/instrumentation/providers/google_genai/README.md +33 -0
  77. mseep_agentops-0.4.23/agentops/instrumentation/providers/google_genai/__init__.py +24 -0
  78. mseep_agentops-0.4.23/agentops/instrumentation/providers/google_genai/attributes/__init__.py +25 -0
  79. mseep_agentops-0.4.23/agentops/instrumentation/providers/google_genai/attributes/chat.py +125 -0
  80. mseep_agentops-0.4.23/agentops/instrumentation/providers/google_genai/attributes/common.py +88 -0
  81. mseep_agentops-0.4.23/agentops/instrumentation/providers/google_genai/attributes/model.py +284 -0
  82. mseep_agentops-0.4.23/agentops/instrumentation/providers/google_genai/instrumentor.py +170 -0
  83. mseep_agentops-0.4.23/agentops/instrumentation/providers/google_genai/stream_wrapper.py +238 -0
  84. mseep_agentops-0.4.23/agentops/instrumentation/providers/ibm_watsonx_ai/__init__.py +28 -0
  85. mseep_agentops-0.4.23/agentops/instrumentation/providers/ibm_watsonx_ai/attributes/__init__.py +27 -0
  86. mseep_agentops-0.4.23/agentops/instrumentation/providers/ibm_watsonx_ai/attributes/attributes.py +277 -0
  87. mseep_agentops-0.4.23/agentops/instrumentation/providers/ibm_watsonx_ai/attributes/common.py +104 -0
  88. mseep_agentops-0.4.23/agentops/instrumentation/providers/ibm_watsonx_ai/instrumentor.py +162 -0
  89. mseep_agentops-0.4.23/agentops/instrumentation/providers/ibm_watsonx_ai/stream_wrapper.py +302 -0
  90. mseep_agentops-0.4.23/agentops/instrumentation/providers/mem0/__init__.py +45 -0
  91. mseep_agentops-0.4.23/agentops/instrumentation/providers/mem0/common.py +377 -0
  92. mseep_agentops-0.4.23/agentops/instrumentation/providers/mem0/instrumentor.py +270 -0
  93. mseep_agentops-0.4.23/agentops/instrumentation/providers/mem0/memory.py +430 -0
  94. mseep_agentops-0.4.23/agentops/instrumentation/providers/openai/__init__.py +21 -0
  95. mseep_agentops-0.4.23/agentops/instrumentation/providers/openai/attributes/__init__.py +7 -0
  96. mseep_agentops-0.4.23/agentops/instrumentation/providers/openai/attributes/common.py +55 -0
  97. mseep_agentops-0.4.23/agentops/instrumentation/providers/openai/attributes/response.py +607 -0
  98. mseep_agentops-0.4.23/agentops/instrumentation/providers/openai/config.py +36 -0
  99. mseep_agentops-0.4.23/agentops/instrumentation/providers/openai/instrumentor.py +312 -0
  100. mseep_agentops-0.4.23/agentops/instrumentation/providers/openai/stream_wrapper.py +941 -0
  101. mseep_agentops-0.4.23/agentops/instrumentation/providers/openai/utils.py +44 -0
  102. mseep_agentops-0.4.23/agentops/instrumentation/providers/openai/v0.py +176 -0
  103. mseep_agentops-0.4.23/agentops/instrumentation/providers/openai/v0_wrappers.py +483 -0
  104. mseep_agentops-0.4.23/agentops/instrumentation/providers/openai/wrappers/__init__.py +30 -0
  105. mseep_agentops-0.4.23/agentops/instrumentation/providers/openai/wrappers/assistant.py +277 -0
  106. mseep_agentops-0.4.23/agentops/instrumentation/providers/openai/wrappers/chat.py +259 -0
  107. mseep_agentops-0.4.23/agentops/instrumentation/providers/openai/wrappers/completion.py +109 -0
  108. mseep_agentops-0.4.23/agentops/instrumentation/providers/openai/wrappers/embeddings.py +94 -0
  109. mseep_agentops-0.4.23/agentops/instrumentation/providers/openai/wrappers/image_gen.py +75 -0
  110. mseep_agentops-0.4.23/agentops/instrumentation/providers/openai/wrappers/responses.py +191 -0
  111. mseep_agentops-0.4.23/agentops/instrumentation/providers/openai/wrappers/shared.py +81 -0
  112. mseep_agentops-0.4.23/agentops/instrumentation/utilities/concurrent_futures/__init__.py +10 -0
  113. mseep_agentops-0.4.23/agentops/instrumentation/utilities/concurrent_futures/instrumentation.py +206 -0
  114. mseep_agentops-0.4.23/agentops/integration/callbacks/dspy/__init__.py +11 -0
  115. mseep_agentops-0.4.23/agentops/integration/callbacks/dspy/callback.py +471 -0
  116. mseep_agentops-0.4.23/agentops/integration/callbacks/langchain/README.md +59 -0
  117. mseep_agentops-0.4.23/agentops/integration/callbacks/langchain/__init__.py +15 -0
  118. mseep_agentops-0.4.23/agentops/integration/callbacks/langchain/callback.py +791 -0
  119. mseep_agentops-0.4.23/agentops/integration/callbacks/langchain/utils.py +54 -0
  120. mseep_agentops-0.4.23/agentops/legacy/crewai.md +121 -0
  121. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/logging/instrument_logging.py +4 -0
  122. mseep_agentops-0.4.23/agentops/sdk/README.md +220 -0
  123. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/sdk/core.py +75 -32
  124. mseep_agentops-0.4.23/agentops/sdk/descriptors/classproperty.py +28 -0
  125. mseep_agentops-0.4.23/agentops/sdk/exporters.py +206 -0
  126. mseep_agentops-0.4.23/agentops/semconv/README.md +125 -0
  127. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/semconv/span_kinds.py +0 -2
  128. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/validation.py +102 -63
  129. mseep_agentops-0.4.23/llms.txt +4092 -0
  130. mseep_agentops-0.4.23/pyproject.toml +180 -0
  131. mseep_agentops-0.4.23/uv.lock +2990 -0
  132. mseep_agentops-0.4.18/PKG-INFO +0 -49
  133. mseep_agentops-0.4.18/agentops/client/api/versions/v3.py +0 -65
  134. mseep_agentops-0.4.18/agentops/client/api/versions/v4.py +0 -104
  135. mseep_agentops-0.4.18/agentops/client/http/http_client.py +0 -215
  136. mseep_agentops-0.4.18/agentops/sdk/exporters.py +0 -87
  137. mseep_agentops-0.4.18/mseep_agentops.egg-info/SOURCES.txt +0 -97
  138. mseep_agentops-0.4.18/mseep_agentops.egg-info/dependency_links.txt +0 -1
  139. mseep_agentops-0.4.18/mseep_agentops.egg-info/requires.txt +0 -22
  140. mseep_agentops-0.4.18/mseep_agentops.egg-info/top_level.txt +0 -2
  141. mseep_agentops-0.4.18/setup.cfg +0 -4
  142. mseep_agentops-0.4.18/setup.py +0 -23
  143. mseep_agentops-0.4.18/tests/conftest.py +0 -10
  144. mseep_agentops-0.4.18/tests/unit/client/__init__.py +0 -1
  145. mseep_agentops-0.4.18/tests/unit/client/test_http_adapter.py +0 -221
  146. mseep_agentops-0.4.18/tests/unit/client/test_http_client.py +0 -206
  147. mseep_agentops-0.4.18/tests/unit/conftest.py +0 -54
  148. mseep_agentops-0.4.18/tests/unit/sdk/__init__.py +0 -1
  149. mseep_agentops-0.4.18/tests/unit/sdk/instrumentation_tester.py +0 -207
  150. mseep_agentops-0.4.18/tests/unit/sdk/test_attributes.py +0 -392
  151. mseep_agentops-0.4.18/tests/unit/sdk/test_concurrent_instrumentation.py +0 -468
  152. mseep_agentops-0.4.18/tests/unit/sdk/test_decorators.py +0 -763
  153. mseep_agentops-0.4.18/tests/unit/sdk/test_exporters.py +0 -241
  154. mseep_agentops-0.4.18/tests/unit/sdk/test_factory.py +0 -1188
  155. mseep_agentops-0.4.18/tests/unit/sdk/test_internal_span_processor.py +0 -397
  156. mseep_agentops-0.4.18/tests/unit/sdk/test_resource_attributes.py +0 -35
  157. mseep_agentops-0.4.18/tests/unit/test_config.py +0 -82
  158. mseep_agentops-0.4.18/tests/unit/test_context_manager.py +0 -777
  159. mseep_agentops-0.4.18/tests/unit/test_events.py +0 -27
  160. mseep_agentops-0.4.18/tests/unit/test_host_env.py +0 -54
  161. mseep_agentops-0.4.18/tests/unit/test_init_py.py +0 -501
  162. mseep_agentops-0.4.18/tests/unit/test_serialization.py +0 -433
  163. mseep_agentops-0.4.18/tests/unit/test_session.py +0 -676
  164. mseep_agentops-0.4.18/tests/unit/test_user_agent.py +0 -34
  165. mseep_agentops-0.4.18/tests/unit/test_validation.py +0 -405
  166. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/LICENSE +0 -0
  167. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/__init__.py +0 -0
  168. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/client/__init__.py +0 -0
  169. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/client/api/__init__.py +0 -0
  170. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/client/api/types.py +0 -0
  171. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/client/api/versions/__init__.py +0 -0
  172. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/client/http/__init__.py +0 -0
  173. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/client/http/http_adapter.py +0 -0
  174. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/enums.py +0 -0
  175. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/exceptions.py +0 -0
  176. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/helpers/__init__.py +0 -0
  177. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/helpers/dashboard.py +0 -0
  178. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/helpers/deprecation.py +0 -0
  179. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/helpers/env.py +0 -0
  180. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/helpers/serialization.py +0 -0
  181. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/helpers/system.py +0 -0
  182. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/helpers/time.py +0 -0
  183. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/helpers/version.py +0 -0
  184. {mseep_agentops-0.4.18/tests → mseep_agentops-0.4.23/agentops/instrumentation/agentic/openai_agents/attributes}/__init__.py +0 -0
  185. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/instrumentation/common/__init__.py +0 -0
  186. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/instrumentation/common/instrumentor.py +0 -0
  187. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/instrumentation/common/metrics.py +0 -0
  188. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/instrumentation/common/objects.py +0 -0
  189. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/instrumentation/common/span_management.py +0 -0
  190. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/instrumentation/common/streaming.py +0 -0
  191. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/instrumentation/common/token_counting.py +0 -0
  192. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/instrumentation/common/version.py +0 -0
  193. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/instrumentation/common/wrappers.py +0 -0
  194. /mseep_agentops-0.4.18/tests/unit/__init__.py → /mseep_agentops-0.4.23/agentops/instrumentation/providers/openai/attributes/tools.py +0 -0
  195. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/legacy/__init__.py +0 -0
  196. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/legacy/event.py +0 -0
  197. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/logging/__init__.py +0 -0
  198. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/logging/config.py +0 -0
  199. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/logging/formatters.py +0 -0
  200. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/sdk/__init__.py +0 -0
  201. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/sdk/attributes.py +0 -0
  202. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/sdk/decorators/__init__.py +0 -0
  203. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/sdk/decorators/factory.py +0 -0
  204. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/sdk/decorators/utility.py +0 -0
  205. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/sdk/processors.py +0 -0
  206. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/sdk/types.py +0 -0
  207. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/semconv/__init__.py +0 -0
  208. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/semconv/agent.py +0 -0
  209. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/semconv/core.py +0 -0
  210. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/semconv/enum.py +0 -0
  211. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/semconv/instrumentation.py +0 -0
  212. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/semconv/langchain.py +0 -0
  213. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/semconv/message.py +0 -0
  214. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/semconv/meters.py +0 -0
  215. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/semconv/resource.py +0 -0
  216. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/semconv/span_attributes.py +0 -0
  217. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/semconv/status.py +0 -0
  218. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/semconv/tool.py +0 -0
  219. {mseep_agentops-0.4.18 → mseep_agentops-0.4.23}/agentops/semconv/workflow.py +0 -0
@@ -0,0 +1 @@
1
+ uv.lock binary
@@ -0,0 +1,183 @@
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
+ !app/dashboard/lib/
19
+ lib64/
20
+ parts/
21
+ sdist/
22
+ var/
23
+ wheels/
24
+ share/python-wheels/
25
+ *.egg-info/
26
+ .installed.cfg
27
+ *.egg
28
+ MANIFEST
29
+
30
+ # PyInstaller
31
+ # Usually these files are written by a python script from a template
32
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
33
+ *.manifest
34
+ *.spec
35
+
36
+ # Installer logs
37
+ pip-log.txt
38
+ pip-delete-this-directory.txt
39
+
40
+ # Unit test / coverage reports
41
+ htmlcov/
42
+ .tox/
43
+ .nox/
44
+ .coverage
45
+ .coverage.*
46
+ .cache
47
+ nosetests.xml
48
+ coverage.xml
49
+ *.cover
50
+ *.py,cover
51
+ .hypothesis/
52
+ .pytest_cache/
53
+ cover/
54
+
55
+ # Translations
56
+ *.mo
57
+ *.pot
58
+
59
+ # Django stuff:
60
+ *.log
61
+ local_settings.py
62
+ db.sqlite3
63
+ db.sqlite3-journal
64
+
65
+ # Flask stuff:
66
+ instance/
67
+ .webassets-cache
68
+
69
+ # Scrapy stuff:
70
+ .scrapy
71
+
72
+ # Sphinx documentation
73
+ docs/_build/
74
+
75
+ # PyBuilder
76
+ .pybuilder/
77
+ target/
78
+
79
+ # Jupyter Notebook
80
+ .ipynb_checkpoints
81
+
82
+ # IPython
83
+ profile_default/
84
+ ipython_config.py
85
+
86
+ # pyenv
87
+ # For a library or package, you might want to ignore these files since the code is
88
+ # intended to run in multiple environments; otherwise, check them in:
89
+ .python-version
90
+
91
+ # pipenv
92
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
93
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
94
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
95
+ # install all needed dependencies.
96
+ #Pipfile.lock
97
+
98
+ # poetry
99
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
100
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
101
+ # commonly ignored for libraries.
102
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
103
+ #poetry.lock
104
+
105
+ # pdm
106
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
107
+ #pdm.lock
108
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
109
+ # in version control.
110
+ # https://pdm.fming.dev/#use-with-ide
111
+ .pdm.toml
112
+
113
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
114
+ __pypackages__/
115
+
116
+ # Celery stuff
117
+ celerybeat-schedule
118
+ celerybeat.pid
119
+
120
+ # SageMath parsed files
121
+ *.sage.py
122
+
123
+ # Environments
124
+ .env
125
+ .venv
126
+ env/
127
+ venv/
128
+ ENV/
129
+ env.bak/
130
+ venv.bak/
131
+
132
+ # Spyder project settings
133
+ .spyderproject
134
+ .spyproject
135
+
136
+ # Rope project settings
137
+ .ropeproject
138
+
139
+ # mkdocs documentation
140
+ /site
141
+
142
+ # mypy
143
+ .mypy_cache/
144
+ .dmypy.json
145
+ dmypy.json
146
+
147
+ # Pyre type checker
148
+ .pyre/
149
+
150
+ # pytype static type analyzer
151
+ .pytype/
152
+
153
+ # Cython debug symbols
154
+ cython_debug/
155
+
156
+ # PyCharm
157
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
158
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
159
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
160
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
161
+ .idea/
162
+
163
+ # VSCode
164
+ .vscode/
165
+
166
+ # Cursor
167
+ .cursorrules
168
+
169
+ # Benchmarks
170
+ .benchmarks/
171
+
172
+ # MacOS
173
+ .DS_Store
174
+
175
+ # Database
176
+ .db
177
+
178
+ # Time travel
179
+ agentops_time_travel.json
180
+ .agentops_time_travel.yaml
181
+
182
+ # Node
183
+ node_modules
@@ -0,0 +1,9 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: "v0.12.9"
4
+ hooks:
5
+ - id: ruff
6
+ args: [--fix, --exit-non-zero-on-fix]
7
+ exclude: ^app/
8
+ - id: ruff-format
9
+ exclude: ^app/
@@ -0,0 +1,390 @@
1
+ # Contributing to AgentOps
2
+
3
+ Thanks for checking out AgentOps. We're building tools to help developers like you make AI agents that actually work reliably. If you've ever tried to build an agent system, you know the pain - they're a nightmare to debug, impossible to monitor, and when something goes wrong... good luck figuring out why.
4
+
5
+ We created AgentOps to solve these headaches, and we'd love your help making it even better. Our SDK hooks into all the major Python frameworks (AG2, CrewAI, LangChain) and LLM providers (OpenAI, Anthropic, Cohere, etc.) to give you visibility into what your agents are actually doing.
6
+
7
+ ## How You Can Help
8
+
9
+ There are tons of ways to contribute, and we genuinely appreciate all of them:
10
+
11
+ 1. **Add More Providers**: Help us support new LLM providers. Each one helps more developers monitor their agents.
12
+ 2. **Improve Framework Support**: Using a framework we don't support yet? Help us add it!
13
+ 3. **Make Docs Better**: Found our docs confusing? Help us fix them! Clear documentation makes everyone's life easier.
14
+ 4. **Share Your Experience**: Using AgentOps? Let us know what's working and what isn't. Your feedback shapes our roadmap.
15
+
16
+ Even if you're not ready to contribute code, we'd love to hear your thoughts. Drop into our Discord, open an issue, or start a discussion. We're building this for developers like you, so your input matters.
17
+
18
+ ## Table of Contents
19
+ - [Getting Started](#getting-started)
20
+ - [Development Environment](#development-environment)
21
+ - [Testing](#testing)
22
+ - [Adding LLM Providers](#adding-llm-providers)
23
+ - [Code Style](#code-style)
24
+ - [Pull Request Process](#pull-request-process)
25
+ - [Documentation](#documentation)
26
+
27
+ ## Getting Started
28
+
29
+ 1. **Fork and Clone**:
30
+ First, fork the repository by clicking the 'Fork' button in the top right of the [AgentOps repository](https://github.com/AgentOps-AI/agentops). This creates your own copy of the repository where you can make changes.
31
+
32
+ Then clone your fork:
33
+ ```bash
34
+ git clone https://github.com/YOUR_USERNAME/agentops.git
35
+ cd agentops
36
+ ```
37
+
38
+ Add the upstream repository to stay in sync:
39
+ ```bash
40
+ git remote add upstream https://github.com/AgentOps-AI/agentops.git
41
+ git fetch upstream
42
+ ```
43
+
44
+ Before starting work on a new feature:
45
+ ```bash
46
+ git checkout main
47
+ git pull upstream main
48
+ git checkout -b feature/your-feature-name
49
+ ```
50
+
51
+ 2. **Install Dependencies**:
52
+ ```bash
53
+ pip install -e .
54
+ ```
55
+
56
+ 3. **Set Up Pre-commit Hooks**:
57
+ ```bash
58
+ pre-commit install
59
+ ```
60
+
61
+ ## Development Environment
62
+
63
+ 1. **Environment Variables**:
64
+ Create a `.env` file:
65
+ ```
66
+ AGENTOPS_API_KEY=your_api_key
67
+ OPENAI_API_KEY=your_openai_key # For testing
68
+ ANTHROPIC_API_KEY=your_anthropic_key # For testing
69
+ # Other keys...
70
+ ```
71
+
72
+ 2. **Virtual Environment**:
73
+ We recommend using `poetry` or `venv`:
74
+ ```bash
75
+ python -m venv venv
76
+ source venv/bin/activate # Unix
77
+ .\venv\Scripts\activate # Windows
78
+ ```
79
+
80
+ 3. **Pre-commit Setup**:
81
+ We use pre-commit hooks to automatically format and lint code. Set them up with:
82
+ ```bash
83
+ pip install pre-commit
84
+ pre-commit install
85
+ ```
86
+
87
+ That's it! The hooks will run automatically when you commit. To manually check all files:
88
+ ```bash
89
+ pre-commit run --all-files
90
+ ```
91
+
92
+ ## Testing
93
+
94
+ We use a comprehensive testing stack to ensure code quality and reliability. Our testing framework includes pytest and several specialized testing tools.
95
+
96
+ ### Testing Dependencies
97
+
98
+ Install all testing dependencies:
99
+ ```bash
100
+ pip install -e ".[dev]"
101
+ ```
102
+
103
+ We use the following testing packages:
104
+ - `pytest==7.4.0`: Core testing framework
105
+ - `pytest-depends`: Manage test dependencies
106
+ - `pytest-asyncio`: Test async code
107
+ - `pytest-vcr`: Record and replay HTTP interactions
108
+ - `pytest-mock`: Mocking functionality
109
+ - `pyfakefs`: Mock filesystem operations
110
+ - `requests_mock==1.11.0`: Mock HTTP requests
111
+
112
+ ### Using Tox
113
+
114
+ We use tox to automate and standardize testing. Tox:
115
+ - Creates isolated virtual environments for testing
116
+ - Tests against multiple Python versions (3.7-3.12)
117
+ - Runs all test suites consistently
118
+ - Ensures dependencies are correctly specified
119
+ - Verifies the package installs correctly
120
+
121
+ Run tox:
122
+ ```bash
123
+ tox
124
+ ```
125
+
126
+ This will:
127
+ 1. Create fresh virtual environments
128
+ 2. Install dependencies
129
+ 3. Run pytest with our test suite
130
+ 4. Generate coverage reports
131
+
132
+ ### Running Tests
133
+
134
+ 1. **Run All Tests**:
135
+ ```bash
136
+ tox
137
+ ```
138
+
139
+ 2. **Run Specific Test File**:
140
+ ```bash
141
+ pytest tests/llms/test_anthropic.py -v
142
+ ```
143
+
144
+ 3. **Run with Coverage**:
145
+ ```bash
146
+ coverage run -m pytest
147
+ coverage report
148
+ ```
149
+
150
+ ### Writing Tests
151
+
152
+ 1. **Test Structure**:
153
+ ```python
154
+ import pytest
155
+ from pytest_mock import MockerFixture
156
+ from unittest.mock import Mock, patch
157
+
158
+ @pytest.mark.asyncio # For async tests
159
+ async def test_async_function():
160
+ # Test implementation
161
+
162
+ @pytest.mark.depends(on=['test_prerequisite']) # Declare test dependencies
163
+ def test_dependent_function():
164
+ # Test implementation
165
+ ```
166
+
167
+ 2. **Recording HTTP Interactions**:
168
+ ```python
169
+ @pytest.mark.vcr() # Records HTTP interactions
170
+ def test_api_call():
171
+ response = client.make_request()
172
+ assert response.status_code == 200
173
+ ```
174
+
175
+ 3. **Mocking Filesystem**:
176
+ ```python
177
+ def test_file_operations(fs): # fs fixture provided by pyfakefs
178
+ fs.create_file('/fake/file.txt', contents='test')
179
+ assert os.path.exists('/fake/file.txt')
180
+ ```
181
+
182
+ 4. **Mocking HTTP Requests**:
183
+ ```python
184
+ def test_http_client(requests_mock):
185
+ requests_mock.get('http://api.example.com', json={'key': 'value'})
186
+ response = make_request()
187
+ assert response.json()['key'] == 'value'
188
+ ```
189
+
190
+ ### Testing Best Practices
191
+
192
+ 1. **Test Categories**:
193
+ - Unit tests: Test individual components
194
+ - Integration tests: Test component interactions
195
+ - End-to-end tests: Test complete workflows
196
+ - Performance tests: Test response times and resource usage
197
+
198
+ 2. **Fixtures**:
199
+ Create reusable test fixtures in `conftest.py`:
200
+ ```python
201
+ @pytest.fixture
202
+ def mock_llm_client():
203
+ client = Mock()
204
+ client.chat.completions.create.return_value = Mock()
205
+ return client
206
+ ```
207
+
208
+ 3. **Test Data**:
209
+ - Store test data in `tests/data/`
210
+ - Use meaningful test data names
211
+ - Document data format and purpose
212
+
213
+ 4. **VCR Cassettes**:
214
+ - Store in `tests/cassettes/`
215
+ - Sanitize sensitive information
216
+ - Update cassettes when API changes
217
+
218
+ ### CI Testing Strategy
219
+
220
+ We use Jupyter notebooks as integration tests for LLM providers. This approach:
221
+ - Tests real-world usage patterns
222
+ - Verifies end-to-end functionality
223
+ - Ensures examples stay up-to-date
224
+ - Tests against actual LLM APIs
225
+
226
+ 1. **Notebook Tests**:
227
+ - Located in `examples/` directory
228
+ - Each LLM provider has example notebooks
229
+ - CI runs notebooks on PR merges to main
230
+ - Tests run against multiple Python versions
231
+
232
+ 2. **Test Workflow**:
233
+ The `test-notebooks.yml` workflow:
234
+ ```yaml
235
+ name: Test Notebooks
236
+ on:
237
+ pull_request:
238
+ paths:
239
+ - "agentops/**"
240
+ - "examples/**"
241
+ - "tests/**"
242
+ ```
243
+ - Runs on PR merges and manual triggers
244
+ - Sets up environment with provider API keys
245
+ - Installs AgentOps from main branch
246
+ - Executes each notebook
247
+ - Excludes specific notebooks that require manual testing
248
+
249
+ 3. **Provider Coverage**:
250
+ Each provider should have notebooks demonstrating:
251
+ - Basic completion calls
252
+ - Streaming responses
253
+ - Async operations (if supported)
254
+ - Error handling
255
+ - Tool usage (if applicable)
256
+
257
+ 4. **Adding Provider Tests**:
258
+ - Create notebook in `examples/provider_name/`
259
+ - Include all provider functionality
260
+ - Add necessary secrets to GitHub Actions
261
+ - Update `exclude_notebooks` in workflow if manual testing needed
262
+
263
+ ## Adding LLM Providers
264
+
265
+ The `agentops/llms/` directory contains provider implementations. Each provider must:
266
+
267
+ 1. **Inherit from BaseProvider**:
268
+ ```python
269
+ @singleton
270
+ class NewProvider(BaseProvider):
271
+ def __init__(self, client):
272
+ super().__init__(client)
273
+ self._provider_name = "ProviderName"
274
+ ```
275
+
276
+ 2. **Implement Required Methods**:
277
+ - `handle_response()`: Process LLM responses
278
+ - `override()`: Patch the provider's methods
279
+ - `undo_override()`: Restore original methods
280
+
281
+ 3. **Handle Events**:
282
+ Track:
283
+ - Prompts and completions
284
+ - Token usage
285
+ - Timestamps
286
+ - Errors
287
+ - Tool usage (if applicable)
288
+
289
+ 4. **Example Implementation Structure**:
290
+ ```python
291
+ def handle_response(self, response, kwargs, init_timestamp, session=None):
292
+ llm_event = LLMEvent(init_timestamp=init_timestamp, params=kwargs)
293
+ try:
294
+ # Process response
295
+ llm_event.returns = response.model_dump()
296
+ llm_event.prompt = kwargs["messages"]
297
+ # ... additional processing
298
+ self._safe_record(session, llm_event)
299
+ except Exception as e:
300
+ self._safe_record(session, ErrorEvent(trigger_event=llm_event, exception=e))
301
+ ```
302
+
303
+ ## Code Style
304
+
305
+ 1. **Formatting**:
306
+ - Use Black for Python code formatting
307
+ - Maximum line length: 88 characters
308
+ - Use type hints
309
+
310
+ 2. **Documentation**:
311
+ - Docstrings for all public methods
312
+ - Clear inline comments
313
+ - Update relevant documentation
314
+
315
+ 3. **Error Handling**:
316
+ - Use specific exception types
317
+ - Log errors with meaningful messages
318
+ - Include context in error messages
319
+
320
+ ## Pull Request Process
321
+
322
+ 1. **Branch Naming**:
323
+ - `feature/description`
324
+ - `fix/description`
325
+ - `docs/description`
326
+
327
+ 2. **Commit Messages**:
328
+ - Clear and descriptive
329
+ - Reference issues when applicable
330
+
331
+ 3. **PR Requirements**:
332
+ - Pass all tests
333
+ - Maintain or improve code coverage
334
+ - Include relevant documentation
335
+ - Update CHANGELOG.md if applicable
336
+
337
+ 4. **Review Process**:
338
+ - At least one approval required
339
+ - Address all review comments
340
+ - Maintain PR scope
341
+
342
+ ## Documentation
343
+
344
+ 1. **Types of Documentation**:
345
+ - API reference
346
+ - Integration guides
347
+ - Examples
348
+ - Troubleshooting guides
349
+
350
+ 2. **Documentation Location**:
351
+ - Code documentation in docstrings
352
+ - User guides in `docs/`
353
+ - Examples in `examples/`
354
+
355
+ 3. **Documentation Style**:
356
+ - Clear and concise
357
+ - Include code examples
358
+ - Explain the why, not just the what
359
+
360
+ ## Getting Help & Community
361
+
362
+ We encourage active community participation and are here to help!
363
+
364
+ ### Preferred Communication Channels
365
+
366
+ 1. **GitHub Issues & Discussions**:
367
+ - Open an [issue](https://github.com/AgentOps-AI/agentops/issues) for:
368
+ - Bug reports
369
+ - Feature requests
370
+ - Documentation improvements
371
+ - Start a [discussion](https://github.com/AgentOps-AI/agentops/discussions) for:
372
+ - Questions about usage
373
+ - Ideas for new features
374
+ - Community showcase
375
+ - General feedback
376
+
377
+ 2. **Discord Community**:
378
+ - Join our [Discord server](https://discord.gg/FagdcwwXRR) for:
379
+ - Real-time help
380
+ - Community discussions
381
+ - Feature announcements
382
+ - Sharing your projects
383
+
384
+ 3. **Contact Form**:
385
+ - For private inquiries, use our [contact form](https://agentops.ai/contact)
386
+ - Please note that public channels are preferred for technical discussions
387
+
388
+ ## License
389
+
390
+ By contributing to AgentOps, you agree that your contributions will be licensed under the MIT License.
@@ -1,49 +1,39 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mseep-agentops
3
- Version: 0.4.18
3
+ Version: 0.4.23
4
4
  Summary: Observability and DevTool Platform for AI Agents
5
- Home-page: https://github.com/mseep
6
- Author: mseep
7
- Author-email: support@skydeck.ai
8
- Maintainer: mseep
9
- Maintainer-email: support@skydeck.ai
10
- Keywords: mseep
11
- Classifier: Programming Language :: Python :: 3
5
+ Project-URL: Homepage, https://github.com/AgentOps-AI/agentops
6
+ Project-URL: Issues, https://github.com/AgentOps-AI/agentops/issues
7
+ Author-email: mseep <support@skydeck.ai>
8
+ License-File: LICENSE
12
9
  Classifier: License :: OSI Approved :: MIT License
13
10
  Classifier: Operating System :: OS Independent
14
- Requires-Python: >=3.6
15
- Description-Content-Type: text/plain
16
- License-File: LICENSE
17
- Requires-Dist: requests<3.0.0,>=2.0.0
18
- Requires-Dist: psutil<7.0.1,>=5.9.8
19
- Requires-Dist: termcolor<2.5.0,>=2.3.0
20
- Requires-Dist: PyYAML<7.0,>=5.3
21
- Requires-Dist: packaging<25.0,>=21.0
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.9
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Requires-Python: >=3.9
18
+ Requires-Dist: aiohttp<4.0.0,>=3.8.0
22
19
  Requires-Dist: httpx<0.29.0,>=0.24.0
23
- Requires-Dist: opentelemetry-sdk==1.29.0; python_version < "3.10"
24
- Requires-Dist: opentelemetry-sdk>1.29.0; python_version >= "3.10"
25
- Requires-Dist: opentelemetry-api==1.29.0; python_version < "3.10"
26
- Requires-Dist: opentelemetry-api>1.29.0; python_version >= "3.10"
27
- Requires-Dist: opentelemetry-exporter-otlp-proto-http==1.29.0; python_version < "3.10"
28
- Requires-Dist: opentelemetry-exporter-otlp-proto-http>1.29.0; python_version >= "3.10"
20
+ Requires-Dist: opentelemetry-api==1.29.0; python_version < '3.10'
21
+ Requires-Dist: opentelemetry-api>1.29.0; python_version >= '3.10'
22
+ Requires-Dist: opentelemetry-exporter-otlp-proto-http==1.29.0; python_version < '3.10'
23
+ Requires-Dist: opentelemetry-exporter-otlp-proto-http>1.29.0; python_version >= '3.10'
24
+ Requires-Dist: opentelemetry-instrumentation==0.50b0; python_version < '3.10'
25
+ Requires-Dist: opentelemetry-instrumentation>=0.50b0; python_version >= '3.10'
26
+ Requires-Dist: opentelemetry-sdk==1.29.0; python_version < '3.10'
27
+ Requires-Dist: opentelemetry-sdk>1.29.0; python_version >= '3.10'
28
+ Requires-Dist: opentelemetry-semantic-conventions==0.50b0; python_version < '3.10'
29
+ Requires-Dist: opentelemetry-semantic-conventions>=0.50b0; python_version >= '3.10'
29
30
  Requires-Dist: ordered-set<5.0.0,>=4.0.0
31
+ Requires-Dist: packaging<25.0,>=21.0
32
+ Requires-Dist: psutil<7.0.1,>=5.9.8
33
+ Requires-Dist: pyyaml<7.0,>=5.3
34
+ Requires-Dist: requests<3.0.0,>=2.0.0
35
+ Requires-Dist: termcolor<2.5.0,>=2.3.0
30
36
  Requires-Dist: wrapt<2.0.0,>=1.0.0
31
- Requires-Dist: opentelemetry-instrumentation==0.50b0; python_version < "3.10"
32
- Requires-Dist: opentelemetry-instrumentation>=0.50b0; python_version >= "3.10"
33
- Requires-Dist: opentelemetry-semantic-conventions==0.50b0; python_version < "3.10"
34
- Requires-Dist: opentelemetry-semantic-conventions>=0.50b0; python_version >= "3.10"
35
- Dynamic: author
36
- Dynamic: author-email
37
- Dynamic: classifier
38
- Dynamic: description
39
- Dynamic: description-content-type
40
- Dynamic: home-page
41
- Dynamic: keywords
42
- Dynamic: license-file
43
- Dynamic: maintainer
44
- Dynamic: maintainer-email
45
- Dynamic: requires-dist
46
- Dynamic: requires-python
47
- Dynamic: summary
37
+ Description-Content-Type: text/plain
48
38
 
49
- Package managed by MseeP.ai
39
+ Package managed by MseeP.ai