sentry-sdk 2.35.2__tar.gz → 2.37.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.
Potentially problematic release.
This version of sentry-sdk might be problematic. Click here for more details.
- {sentry_sdk-2.35.2/sentry_sdk.egg-info → sentry_sdk-2.37.0}/PKG-INFO +3 -1
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/pyproject.toml +4 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/ai/monitoring.py +7 -5
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/ai/utils.py +9 -6
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/consts.py +2 -1
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/__init__.py +3 -1
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/langchain.py +105 -33
- sentry_sdk-2.37.0/sentry_sdk/integrations/langgraph.py +321 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/openai.py +38 -15
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/openai_agents/utils.py +6 -3
- sentry_sdk-2.37.0/sentry_sdk/integrations/unraisablehook.py +53 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/profiler/transaction_profiler.py +6 -4
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/tracing.py +6 -4
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0/sentry_sdk.egg-info}/PKG-INFO +3 -1
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk.egg-info/SOURCES.txt +2 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk.egg-info/requires.txt +3 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/setup.py +2 -1
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_basics.py +1 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/LICENSE +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/MANIFEST.in +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/README.md +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/__init__.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/_compat.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/_init_implementation.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/_log_batcher.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/_lru_cache.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/_queue.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/_types.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/_werkzeug.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/ai/__init__.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/api.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/attachments.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/client.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/crons/__init__.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/crons/api.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/crons/consts.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/crons/decorator.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/debug.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/envelope.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/feature_flags.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/hub.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/_asgi_common.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/_wsgi_common.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/aiohttp.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/anthropic.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/argv.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/ariadne.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/arq.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/asgi.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/asyncio.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/asyncpg.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/atexit.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/aws_lambda.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/beam.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/boto3.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/bottle.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/celery/__init__.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/celery/beat.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/celery/utils.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/chalice.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/clickhouse_driver.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/cloud_resource_context.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/cohere.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/dedupe.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/django/__init__.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/django/asgi.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/django/caching.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/django/middleware.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/django/signals_handlers.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/django/templates.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/django/transactions.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/django/views.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/dramatiq.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/excepthook.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/executing.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/falcon.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/fastapi.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/flask.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/gcp.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/gnu_backtrace.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/gql.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/graphene.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/grpc/__init__.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/grpc/aio/__init__.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/grpc/aio/client.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/grpc/aio/server.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/grpc/client.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/grpc/consts.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/grpc/server.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/httpx.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/huey.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/huggingface_hub.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/launchdarkly.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/litestar.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/logging.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/loguru.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/modules.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/openai_agents/__init__.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/openai_agents/consts.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/openai_agents/patches/__init__.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/openai_agents/patches/agent_run.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/openai_agents/patches/models.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/openai_agents/patches/runner.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/openai_agents/patches/tools.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/openai_agents/spans/__init__.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/openai_agents/spans/agent_workflow.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/openai_agents/spans/ai_client.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/openai_agents/spans/execute_tool.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/openai_agents/spans/handoff.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/openai_agents/spans/invoke_agent.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/openfeature.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/opentelemetry/__init__.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/opentelemetry/consts.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/opentelemetry/integration.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/opentelemetry/propagator.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/opentelemetry/span_processor.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/pure_eval.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/pymongo.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/pyramid.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/quart.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/ray.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/redis/__init__.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/redis/_async_common.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/redis/_sync_common.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/redis/consts.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/redis/modules/__init__.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/redis/modules/caches.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/redis/modules/queries.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/redis/rb.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/redis/redis.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/redis/redis_cluster.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/redis/redis_py_cluster_legacy.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/redis/utils.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/rq.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/rust_tracing.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/sanic.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/serverless.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/socket.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/spark/__init__.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/spark/spark_driver.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/spark/spark_worker.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/sqlalchemy.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/starlette.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/starlite.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/statsig.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/stdlib.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/strawberry.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/sys_exit.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/threading.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/tornado.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/trytond.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/typer.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/unleash.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/integrations/wsgi.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/logger.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/metrics.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/monitor.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/profiler/__init__.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/profiler/continuous_profiler.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/profiler/utils.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/py.typed +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/scope.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/scrubber.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/serializer.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/session.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/sessions.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/spotlight.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/tracing_utils.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/transport.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/types.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/utils.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk/worker.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk.egg-info/dependency_links.txt +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk.egg-info/entry_points.txt +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk.egg-info/not-zip-safe +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/sentry_sdk.egg-info/top_level.txt +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/setup.cfg +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_ai_monitoring.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_api.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_client.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_conftest.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_crons.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_dsc.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_envelope.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_exceptiongroup.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_feature_flags.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_full_stack_frames.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_gevent.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_import.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_logs.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_lru_cache.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_metrics.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_monitor.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_propagationcontext.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_scope.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_scrubber.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_serializer.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_sessions.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_spotlight.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_tracing_utils.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_transport.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_types.py +0 -0
- {sentry_sdk-2.35.2 → sentry_sdk-2.37.0}/tests/test_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sentry-sdk
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.37.0
|
|
4
4
|
Summary: Python client for Sentry (https://sentry.io)
|
|
5
5
|
Home-page: https://github.com/getsentry/sentry-python
|
|
6
6
|
Author: Sentry Team and Contributors
|
|
@@ -72,6 +72,8 @@ Provides-Extra: huggingface-hub
|
|
|
72
72
|
Requires-Dist: huggingface_hub>=0.22; extra == "huggingface-hub"
|
|
73
73
|
Provides-Extra: langchain
|
|
74
74
|
Requires-Dist: langchain>=0.0.210; extra == "langchain"
|
|
75
|
+
Provides-Extra: langgraph
|
|
76
|
+
Requires-Dist: langgraph>=0.6.6; extra == "langgraph"
|
|
75
77
|
Provides-Extra: launchdarkly
|
|
76
78
|
Requires-Dist: launchdarkly-server-sdk>=9.8.0; extra == "launchdarkly"
|
|
77
79
|
Provides-Extra: litestar
|
|
@@ -130,6 +130,10 @@ ignore_missing_imports = true
|
|
|
130
130
|
module = "langchain.*"
|
|
131
131
|
ignore_missing_imports = true
|
|
132
132
|
|
|
133
|
+
[[tool.mypy.overrides]]
|
|
134
|
+
module = "langgraph.*"
|
|
135
|
+
ignore_missing_imports = true
|
|
136
|
+
|
|
133
137
|
[[tool.mypy.overrides]]
|
|
134
138
|
module = "executing.*"
|
|
135
139
|
ignore_missing_imports = true
|
|
@@ -10,7 +10,9 @@ from sentry_sdk.utils import ContextVar
|
|
|
10
10
|
from typing import TYPE_CHECKING
|
|
11
11
|
|
|
12
12
|
if TYPE_CHECKING:
|
|
13
|
-
from typing import Optional, Callable, Any
|
|
13
|
+
from typing import Optional, Callable, Awaitable, Any, Union, TypeVar
|
|
14
|
+
|
|
15
|
+
F = TypeVar("F", bound=Union[Callable[..., Any], Callable[..., Awaitable[Any]]])
|
|
14
16
|
|
|
15
17
|
_ai_pipeline_name = ContextVar("ai_pipeline_name", default=None)
|
|
16
18
|
|
|
@@ -26,9 +28,9 @@ def get_ai_pipeline_name():
|
|
|
26
28
|
|
|
27
29
|
|
|
28
30
|
def ai_track(description, **span_kwargs):
|
|
29
|
-
# type: (str, Any) -> Callable[
|
|
31
|
+
# type: (str, Any) -> Callable[[F], F]
|
|
30
32
|
def decorator(f):
|
|
31
|
-
# type: (
|
|
33
|
+
# type: (F) -> F
|
|
32
34
|
def sync_wrapped(*args, **kwargs):
|
|
33
35
|
# type: (Any, Any) -> Any
|
|
34
36
|
curr_pipeline = _ai_pipeline_name.get()
|
|
@@ -88,9 +90,9 @@ def ai_track(description, **span_kwargs):
|
|
|
88
90
|
return res
|
|
89
91
|
|
|
90
92
|
if inspect.iscoroutinefunction(f):
|
|
91
|
-
return wraps(f)(async_wrapped)
|
|
93
|
+
return wraps(f)(async_wrapped) # type: ignore
|
|
92
94
|
else:
|
|
93
|
-
return wraps(f)(sync_wrapped)
|
|
95
|
+
return wraps(f)(sync_wrapped) # type: ignore
|
|
94
96
|
|
|
95
97
|
return decorator
|
|
96
98
|
|
|
@@ -1,30 +1,33 @@
|
|
|
1
|
+
import json
|
|
2
|
+
|
|
1
3
|
from typing import TYPE_CHECKING
|
|
2
4
|
|
|
3
5
|
if TYPE_CHECKING:
|
|
4
6
|
from typing import Any
|
|
7
|
+
from sentry_sdk.tracing import Span
|
|
5
8
|
|
|
6
|
-
from sentry_sdk.tracing import Span
|
|
7
9
|
from sentry_sdk.utils import logger
|
|
8
10
|
|
|
9
11
|
|
|
10
12
|
def _normalize_data(data, unpack=True):
|
|
11
13
|
# type: (Any, bool) -> Any
|
|
12
|
-
|
|
13
14
|
# convert pydantic data (e.g. OpenAI v1+) to json compatible format
|
|
14
15
|
if hasattr(data, "model_dump"):
|
|
15
16
|
try:
|
|
16
|
-
return data.model_dump()
|
|
17
|
+
return _normalize_data(data.model_dump(), unpack=unpack)
|
|
17
18
|
except Exception as e:
|
|
18
19
|
logger.warning("Could not convert pydantic data to JSON: %s", e)
|
|
19
|
-
return data
|
|
20
|
+
return data if isinstance(data, (int, float, bool, str)) else str(data)
|
|
21
|
+
|
|
20
22
|
if isinstance(data, list):
|
|
21
23
|
if unpack and len(data) == 1:
|
|
22
24
|
return _normalize_data(data[0], unpack=unpack) # remove empty dimensions
|
|
23
25
|
return list(_normalize_data(x, unpack=unpack) for x in data)
|
|
26
|
+
|
|
24
27
|
if isinstance(data, dict):
|
|
25
28
|
return {k: _normalize_data(v, unpack=unpack) for (k, v) in data.items()}
|
|
26
29
|
|
|
27
|
-
return data
|
|
30
|
+
return data if isinstance(data, (int, float, bool, str)) else str(data)
|
|
28
31
|
|
|
29
32
|
|
|
30
33
|
def set_data_normalized(span, key, value, unpack=True):
|
|
@@ -33,4 +36,4 @@ def set_data_normalized(span, key, value, unpack=True):
|
|
|
33
36
|
if isinstance(normalized, (int, float, bool, str)):
|
|
34
37
|
span.set_data(key, normalized)
|
|
35
38
|
else:
|
|
36
|
-
span.set_data(key,
|
|
39
|
+
span.set_data(key, json.dumps(normalized))
|
|
@@ -792,6 +792,7 @@ class OP:
|
|
|
792
792
|
FUNCTION_AWS = "function.aws"
|
|
793
793
|
FUNCTION_GCP = "function.gcp"
|
|
794
794
|
GEN_AI_CHAT = "gen_ai.chat"
|
|
795
|
+
GEN_AI_CREATE_AGENT = "gen_ai.create_agent"
|
|
795
796
|
GEN_AI_EMBEDDINGS = "gen_ai.embeddings"
|
|
796
797
|
GEN_AI_EXECUTE_TOOL = "gen_ai.execute_tool"
|
|
797
798
|
GEN_AI_HANDOFF = "gen_ai.handoff"
|
|
@@ -1329,4 +1330,4 @@ DEFAULT_OPTIONS = _get_default_options()
|
|
|
1329
1330
|
del _get_default_options
|
|
1330
1331
|
|
|
1331
1332
|
|
|
1332
|
-
VERSION = "2.
|
|
1333
|
+
VERSION = "2.37.0"
|
|
@@ -95,6 +95,7 @@ _AUTO_ENABLING_INTEGRATIONS = [
|
|
|
95
95
|
"sentry_sdk.integrations.huey.HueyIntegration",
|
|
96
96
|
"sentry_sdk.integrations.huggingface_hub.HuggingfaceHubIntegration",
|
|
97
97
|
"sentry_sdk.integrations.langchain.LangchainIntegration",
|
|
98
|
+
"sentry_sdk.integrations.langgraph.LanggraphIntegration",
|
|
98
99
|
"sentry_sdk.integrations.litestar.LitestarIntegration",
|
|
99
100
|
"sentry_sdk.integrations.loguru.LoguruIntegration",
|
|
100
101
|
"sentry_sdk.integrations.openai.OpenAIIntegration",
|
|
@@ -141,7 +142,8 @@ _MIN_VERSIONS = {
|
|
|
141
142
|
"graphene": (3, 3),
|
|
142
143
|
"grpc": (1, 32, 0), # grpcio
|
|
143
144
|
"huggingface_hub": (0, 22),
|
|
144
|
-
"langchain": (0,
|
|
145
|
+
"langchain": (0, 1, 0),
|
|
146
|
+
"langgraph": (0, 6, 6),
|
|
145
147
|
"launchdarkly": (9, 8, 0),
|
|
146
148
|
"loguru": (0, 7, 0),
|
|
147
149
|
"openai": (1, 0, 0),
|
|
@@ -51,7 +51,6 @@ DATA_FIELDS = {
|
|
|
51
51
|
"presence_penalty": SPANDATA.GEN_AI_REQUEST_PRESENCE_PENALTY,
|
|
52
52
|
"temperature": SPANDATA.GEN_AI_REQUEST_TEMPERATURE,
|
|
53
53
|
"tool_calls": SPANDATA.GEN_AI_RESPONSE_TOOL_CALLS,
|
|
54
|
-
"tools": SPANDATA.GEN_AI_REQUEST_AVAILABLE_TOOLS,
|
|
55
54
|
"top_k": SPANDATA.GEN_AI_REQUEST_TOP_K,
|
|
56
55
|
"top_p": SPANDATA.GEN_AI_REQUEST_TOP_P,
|
|
57
56
|
}
|
|
@@ -203,8 +202,12 @@ class SentryLangchainCallback(BaseCallbackHandler): # type: ignore[misc]
|
|
|
203
202
|
if key in all_params and all_params[key] is not None:
|
|
204
203
|
set_data_normalized(span, attribute, all_params[key], unpack=False)
|
|
205
204
|
|
|
205
|
+
_set_tools_on_span(span, all_params.get("tools"))
|
|
206
|
+
|
|
206
207
|
if should_send_default_pii() and self.include_prompts:
|
|
207
|
-
set_data_normalized(
|
|
208
|
+
set_data_normalized(
|
|
209
|
+
span, SPANDATA.GEN_AI_REQUEST_MESSAGES, prompts, unpack=False
|
|
210
|
+
)
|
|
208
211
|
|
|
209
212
|
def on_chat_model_start(self, serialized, messages, *, run_id, **kwargs):
|
|
210
213
|
# type: (SentryLangchainCallback, Dict[str, Any], List[List[BaseMessage]], UUID, Any) -> Any
|
|
@@ -246,14 +249,20 @@ class SentryLangchainCallback(BaseCallbackHandler): # type: ignore[misc]
|
|
|
246
249
|
if key in all_params and all_params[key] is not None:
|
|
247
250
|
set_data_normalized(span, attribute, all_params[key], unpack=False)
|
|
248
251
|
|
|
252
|
+
_set_tools_on_span(span, all_params.get("tools"))
|
|
253
|
+
|
|
249
254
|
if should_send_default_pii() and self.include_prompts:
|
|
255
|
+
normalized_messages = []
|
|
256
|
+
for list_ in messages:
|
|
257
|
+
for message in list_:
|
|
258
|
+
normalized_messages.append(
|
|
259
|
+
self._normalize_langchain_message(message)
|
|
260
|
+
)
|
|
250
261
|
set_data_normalized(
|
|
251
262
|
span,
|
|
252
263
|
SPANDATA.GEN_AI_REQUEST_MESSAGES,
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
for list_ in messages
|
|
256
|
-
],
|
|
264
|
+
normalized_messages,
|
|
265
|
+
unpack=False,
|
|
257
266
|
)
|
|
258
267
|
|
|
259
268
|
def on_chat_model_end(self, response, *, run_id, **kwargs):
|
|
@@ -351,9 +360,7 @@ class SentryLangchainCallback(BaseCallbackHandler): # type: ignore[misc]
|
|
|
351
360
|
|
|
352
361
|
if should_send_default_pii() and self.include_prompts:
|
|
353
362
|
set_data_normalized(
|
|
354
|
-
span,
|
|
355
|
-
SPANDATA.GEN_AI_RESPONSE_TEXT,
|
|
356
|
-
finish.return_values.items(),
|
|
363
|
+
span, SPANDATA.GEN_AI_RESPONSE_TEXT, finish.return_values.items()
|
|
357
364
|
)
|
|
358
365
|
|
|
359
366
|
self._exit_span(span_data, run_id)
|
|
@@ -473,13 +480,11 @@ def _get_token_usage(obj):
|
|
|
473
480
|
if usage is not None:
|
|
474
481
|
return usage
|
|
475
482
|
|
|
476
|
-
# check for usage in the object itself
|
|
477
483
|
for name in possible_names:
|
|
478
484
|
usage = _get_value(obj, name)
|
|
479
485
|
if usage is not None:
|
|
480
486
|
return usage
|
|
481
487
|
|
|
482
|
-
# no usage found anywhere
|
|
483
488
|
return None
|
|
484
489
|
|
|
485
490
|
|
|
@@ -531,6 +536,87 @@ def _get_request_data(obj, args, kwargs):
|
|
|
531
536
|
return (agent_name, tools)
|
|
532
537
|
|
|
533
538
|
|
|
539
|
+
def _simplify_langchain_tools(tools):
|
|
540
|
+
# type: (Any) -> Optional[List[Any]]
|
|
541
|
+
"""Parse and simplify tools into a cleaner format."""
|
|
542
|
+
if not tools:
|
|
543
|
+
return None
|
|
544
|
+
|
|
545
|
+
if not isinstance(tools, (list, tuple)):
|
|
546
|
+
return None
|
|
547
|
+
|
|
548
|
+
simplified_tools = []
|
|
549
|
+
for tool in tools:
|
|
550
|
+
try:
|
|
551
|
+
if isinstance(tool, dict):
|
|
552
|
+
|
|
553
|
+
if "function" in tool and isinstance(tool["function"], dict):
|
|
554
|
+
func = tool["function"]
|
|
555
|
+
simplified_tool = {
|
|
556
|
+
"name": func.get("name"),
|
|
557
|
+
"description": func.get("description"),
|
|
558
|
+
}
|
|
559
|
+
if simplified_tool["name"]:
|
|
560
|
+
simplified_tools.append(simplified_tool)
|
|
561
|
+
elif "name" in tool:
|
|
562
|
+
simplified_tool = {
|
|
563
|
+
"name": tool.get("name"),
|
|
564
|
+
"description": tool.get("description"),
|
|
565
|
+
}
|
|
566
|
+
simplified_tools.append(simplified_tool)
|
|
567
|
+
else:
|
|
568
|
+
name = (
|
|
569
|
+
tool.get("name")
|
|
570
|
+
or tool.get("tool_name")
|
|
571
|
+
or tool.get("function_name")
|
|
572
|
+
)
|
|
573
|
+
if name:
|
|
574
|
+
simplified_tools.append(
|
|
575
|
+
{
|
|
576
|
+
"name": name,
|
|
577
|
+
"description": tool.get("description")
|
|
578
|
+
or tool.get("desc"),
|
|
579
|
+
}
|
|
580
|
+
)
|
|
581
|
+
elif hasattr(tool, "name"):
|
|
582
|
+
simplified_tool = {
|
|
583
|
+
"name": getattr(tool, "name", None),
|
|
584
|
+
"description": getattr(tool, "description", None)
|
|
585
|
+
or getattr(tool, "desc", None),
|
|
586
|
+
}
|
|
587
|
+
if simplified_tool["name"]:
|
|
588
|
+
simplified_tools.append(simplified_tool)
|
|
589
|
+
elif hasattr(tool, "__name__"):
|
|
590
|
+
simplified_tools.append(
|
|
591
|
+
{
|
|
592
|
+
"name": tool.__name__,
|
|
593
|
+
"description": getattr(tool, "__doc__", None),
|
|
594
|
+
}
|
|
595
|
+
)
|
|
596
|
+
else:
|
|
597
|
+
tool_str = str(tool)
|
|
598
|
+
if tool_str and tool_str != "":
|
|
599
|
+
simplified_tools.append({"name": tool_str, "description": None})
|
|
600
|
+
except Exception:
|
|
601
|
+
continue
|
|
602
|
+
|
|
603
|
+
return simplified_tools if simplified_tools else None
|
|
604
|
+
|
|
605
|
+
|
|
606
|
+
def _set_tools_on_span(span, tools):
|
|
607
|
+
# type: (Span, Any) -> None
|
|
608
|
+
"""Set available tools data on a span if tools are provided."""
|
|
609
|
+
if tools is not None:
|
|
610
|
+
simplified_tools = _simplify_langchain_tools(tools)
|
|
611
|
+
if simplified_tools:
|
|
612
|
+
set_data_normalized(
|
|
613
|
+
span,
|
|
614
|
+
SPANDATA.GEN_AI_REQUEST_AVAILABLE_TOOLS,
|
|
615
|
+
simplified_tools,
|
|
616
|
+
unpack=False,
|
|
617
|
+
)
|
|
618
|
+
|
|
619
|
+
|
|
534
620
|
def _wrap_configure(f):
|
|
535
621
|
# type: (Callable[..., Any]) -> Callable[..., Any]
|
|
536
622
|
|
|
@@ -601,7 +687,7 @@ def _wrap_configure(f):
|
|
|
601
687
|
]
|
|
602
688
|
elif isinstance(local_callbacks, BaseCallbackHandler):
|
|
603
689
|
local_callbacks = [local_callbacks, sentry_handler]
|
|
604
|
-
else:
|
|
690
|
+
else:
|
|
605
691
|
local_callbacks = [*local_callbacks, sentry_handler]
|
|
606
692
|
|
|
607
693
|
return f(
|
|
@@ -638,10 +724,7 @@ def _wrap_agent_executor_invoke(f):
|
|
|
638
724
|
span.set_data(SPANDATA.GEN_AI_OPERATION_NAME, "invoke_agent")
|
|
639
725
|
span.set_data(SPANDATA.GEN_AI_RESPONSE_STREAMING, False)
|
|
640
726
|
|
|
641
|
-
|
|
642
|
-
set_data_normalized(
|
|
643
|
-
span, SPANDATA.GEN_AI_REQUEST_AVAILABLE_TOOLS, tools, unpack=False
|
|
644
|
-
)
|
|
727
|
+
_set_tools_on_span(span, tools)
|
|
645
728
|
|
|
646
729
|
# Run the agent
|
|
647
730
|
result = f(self, *args, **kwargs)
|
|
@@ -653,11 +736,7 @@ def _wrap_agent_executor_invoke(f):
|
|
|
653
736
|
and integration.include_prompts
|
|
654
737
|
):
|
|
655
738
|
set_data_normalized(
|
|
656
|
-
span,
|
|
657
|
-
SPANDATA.GEN_AI_REQUEST_MESSAGES,
|
|
658
|
-
[
|
|
659
|
-
input,
|
|
660
|
-
],
|
|
739
|
+
span, SPANDATA.GEN_AI_REQUEST_MESSAGES, [input], unpack=False
|
|
661
740
|
)
|
|
662
741
|
|
|
663
742
|
output = result.get("output")
|
|
@@ -666,7 +745,7 @@ def _wrap_agent_executor_invoke(f):
|
|
|
666
745
|
and should_send_default_pii()
|
|
667
746
|
and integration.include_prompts
|
|
668
747
|
):
|
|
669
|
-
span
|
|
748
|
+
set_data_normalized(span, SPANDATA.GEN_AI_RESPONSE_TEXT, output)
|
|
670
749
|
|
|
671
750
|
return result
|
|
672
751
|
|
|
@@ -698,10 +777,7 @@ def _wrap_agent_executor_stream(f):
|
|
|
698
777
|
span.set_data(SPANDATA.GEN_AI_OPERATION_NAME, "invoke_agent")
|
|
699
778
|
span.set_data(SPANDATA.GEN_AI_RESPONSE_STREAMING, True)
|
|
700
779
|
|
|
701
|
-
|
|
702
|
-
set_data_normalized(
|
|
703
|
-
span, SPANDATA.GEN_AI_REQUEST_AVAILABLE_TOOLS, tools, unpack=False
|
|
704
|
-
)
|
|
780
|
+
_set_tools_on_span(span, tools)
|
|
705
781
|
|
|
706
782
|
input = args[0].get("input") if len(args) >= 1 else None
|
|
707
783
|
if (
|
|
@@ -710,11 +786,7 @@ def _wrap_agent_executor_stream(f):
|
|
|
710
786
|
and integration.include_prompts
|
|
711
787
|
):
|
|
712
788
|
set_data_normalized(
|
|
713
|
-
span,
|
|
714
|
-
SPANDATA.GEN_AI_REQUEST_MESSAGES,
|
|
715
|
-
[
|
|
716
|
-
input,
|
|
717
|
-
],
|
|
789
|
+
span, SPANDATA.GEN_AI_REQUEST_MESSAGES, [input], unpack=False
|
|
718
790
|
)
|
|
719
791
|
|
|
720
792
|
# Run the agent
|
|
@@ -737,7 +809,7 @@ def _wrap_agent_executor_stream(f):
|
|
|
737
809
|
and should_send_default_pii()
|
|
738
810
|
and integration.include_prompts
|
|
739
811
|
):
|
|
740
|
-
span
|
|
812
|
+
set_data_normalized(span, SPANDATA.GEN_AI_RESPONSE_TEXT, output)
|
|
741
813
|
|
|
742
814
|
span.__exit__(None, None, None)
|
|
743
815
|
|
|
@@ -756,7 +828,7 @@ def _wrap_agent_executor_stream(f):
|
|
|
756
828
|
and should_send_default_pii()
|
|
757
829
|
and integration.include_prompts
|
|
758
830
|
):
|
|
759
|
-
span
|
|
831
|
+
set_data_normalized(span, SPANDATA.GEN_AI_RESPONSE_TEXT, output)
|
|
760
832
|
|
|
761
833
|
span.__exit__(None, None, None)
|
|
762
834
|
|