paid-python 0.3.2__py3-none-any.whl → 0.3.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- paid/tracing/tracing.py +13 -5
- {paid_python-0.3.2.dist-info → paid_python-0.3.4.dist-info}/METADATA +51 -1
- {paid_python-0.3.2.dist-info → paid_python-0.3.4.dist-info}/RECORD +5 -5
- {paid_python-0.3.2.dist-info → paid_python-0.3.4.dist-info}/LICENSE +0 -0
- {paid_python-0.3.2.dist-info → paid_python-0.3.4.dist-info}/WHEEL +0 -0
paid/tracing/tracing.py
CHANGED
|
@@ -66,8 +66,9 @@ class PaidSpanProcessor(SpanProcessor):
|
|
|
66
66
|
"""
|
|
67
67
|
|
|
68
68
|
SPAN_NAME_PREFIX = "paid.trace."
|
|
69
|
-
|
|
70
|
-
"
|
|
69
|
+
PROMPT_ATTRIBUTES_SUBSTRINGS = {
|
|
70
|
+
"prompt",
|
|
71
|
+
# "gen_ai.prompt",
|
|
71
72
|
"gen_ai.completion",
|
|
72
73
|
"gen_ai.request.messages",
|
|
73
74
|
"gen_ai.response.messages",
|
|
@@ -76,6 +77,7 @@ class PaidSpanProcessor(SpanProcessor):
|
|
|
76
77
|
"llm.invocation_parameters",
|
|
77
78
|
"output.value",
|
|
78
79
|
"input.value",
|
|
80
|
+
# "langchain.prompt",
|
|
79
81
|
}
|
|
80
82
|
|
|
81
83
|
def on_start(self, span: Span, parent_context: Optional[Context] = None) -> None:
|
|
@@ -125,7 +127,7 @@ class PaidSpanProcessor(SpanProcessor):
|
|
|
125
127
|
filtered_attrs = {
|
|
126
128
|
k: v
|
|
127
129
|
for k, v in original_attributes.items()
|
|
128
|
-
if not any(k
|
|
130
|
+
if not any(substr in k for substr in self.PROMPT_ATTRIBUTES_SUBSTRINGS)
|
|
129
131
|
}
|
|
130
132
|
# This works because the exporter reads attributes during serialization
|
|
131
133
|
object.__setattr__(span, "_attributes", filtered_attrs)
|
|
@@ -139,7 +141,7 @@ class PaidSpanProcessor(SpanProcessor):
|
|
|
139
141
|
return True
|
|
140
142
|
|
|
141
143
|
|
|
142
|
-
def setup_graceful_termination():
|
|
144
|
+
def setup_graceful_termination(paid_tracer_provider: TracerProvider):
|
|
143
145
|
def flush_traces():
|
|
144
146
|
try:
|
|
145
147
|
if not isinstance(paid_tracer_provider, NoOpTracerProvider) and not paid_tracer_provider.force_flush(10000):
|
|
@@ -189,6 +191,12 @@ def initialize_tracing(api_key: Optional[str] = None, collector_endpoint: Option
|
|
|
189
191
|
collector_endpoint = DEFAULT_COLLECTOR_ENDPOINT
|
|
190
192
|
|
|
191
193
|
try:
|
|
194
|
+
# Check if tracing is disabled via environment variable
|
|
195
|
+
paid_enabled = os.environ.get("PAID_ENABLED", "true").lower()
|
|
196
|
+
if paid_enabled == "false":
|
|
197
|
+
logger.info("Paid tracing is disabled via PAID_ENABLED environment variable")
|
|
198
|
+
return
|
|
199
|
+
|
|
192
200
|
if get_token() is not None:
|
|
193
201
|
logger.warning("Tracing is already initialized - skipping re-initialization")
|
|
194
202
|
return
|
|
@@ -222,7 +230,7 @@ def initialize_tracing(api_key: Optional[str] = None, collector_endpoint: Option
|
|
|
222
230
|
span_processor = SimpleSpanProcessor(otlp_exporter)
|
|
223
231
|
paid_tracer_provider.add_span_processor(span_processor)
|
|
224
232
|
|
|
225
|
-
setup_graceful_termination() # doesn't throw
|
|
233
|
+
setup_graceful_termination(paid_tracer_provider) # doesn't throw
|
|
226
234
|
|
|
227
235
|
logger.info("Paid tracing initialized successfully - collector at %s", collector_endpoint)
|
|
228
236
|
except Exception as e:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: paid-python
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.4
|
|
4
4
|
Summary:
|
|
5
5
|
Requires-Python: >=3.9,<3.14
|
|
6
6
|
Classifier: Intended Audience :: Developers
|
|
@@ -123,6 +123,56 @@ export PAID_LOG_LEVEL=DEBUG
|
|
|
123
123
|
|
|
124
124
|
Defaults to ERROR.
|
|
125
125
|
|
|
126
|
+
## Environment Variables
|
|
127
|
+
|
|
128
|
+
The Paid SDK supports the following environment variables for configuration:
|
|
129
|
+
|
|
130
|
+
### `PAID_API_KEY`
|
|
131
|
+
|
|
132
|
+
Your Paid API key for authentication. This is used as a fallback when you don't explicitly pass the `token` parameter to the `Paid()` client or `initialize_tracing()`.
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
export PAID_API_KEY="your_api_key_here"
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
You can then initialize the client without passing the token:
|
|
139
|
+
|
|
140
|
+
```python
|
|
141
|
+
from paid import Paid
|
|
142
|
+
|
|
143
|
+
# API key is read from PAID_API_KEY environment variable
|
|
144
|
+
client = Paid()
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### `PAID_ENABLED`
|
|
148
|
+
|
|
149
|
+
Controls whether Paid tracing is enabled. Set to `false` (case-insensitive) to disable all tracing functionality.
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
export PAID_ENABLED=false
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
This is useful for:
|
|
156
|
+
- Development/testing environments where tracing isn't needed
|
|
157
|
+
- Temporarily disabling tracing without modifying code
|
|
158
|
+
- Feature flagging in different deployment environments
|
|
159
|
+
|
|
160
|
+
Defaults to `true` if not set.
|
|
161
|
+
|
|
162
|
+
### `PAID_LOG_LEVEL`
|
|
163
|
+
|
|
164
|
+
Sets the logging level for Paid SDK operations. See the [Logging](#logging) section for details.
|
|
165
|
+
|
|
166
|
+
### `PAID_OTEL_COLLECTOR_ENDPOINT`
|
|
167
|
+
|
|
168
|
+
Overrides the default OpenTelemetry collector endpoint URL. Only needed if you want to route traces to a custom endpoint.
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
export PAID_OTEL_COLLECTOR_ENDPOINT="https://your-custom-endpoint.com:4318/v1/traces"
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Defaults to `https://collector.agentpaid.io:4318/v1/traces`.
|
|
175
|
+
|
|
126
176
|
## Cost Tracking via OTEL tracing
|
|
127
177
|
|
|
128
178
|
### Simple Decorator and Context Manager Methods
|
|
@@ -42,7 +42,7 @@ paid/tracing/context_data.py,sha256=oiLocz-9qDqB5nQzJlrLsc2Mkr9MaNt_yF_hjppobKc,
|
|
|
42
42
|
paid/tracing/context_manager.py,sha256=ZQtsJ9JPxTwn2t4AW26WpYboaOEZdI2T1Sw0Rwsbf-E,8470
|
|
43
43
|
paid/tracing/distributed_tracing.py,sha256=Vht3U8QJmT5jlRVnrybTn-cI1RPuVtyb3V4eTu6gA4g,3991
|
|
44
44
|
paid/tracing/signal.py,sha256=PfYxF6EFQS8j7RY5_C5NXrCBVu9Hq2E2tyG4fdQScJk,3252
|
|
45
|
-
paid/tracing/tracing.py,sha256
|
|
45
|
+
paid/tracing/tracing.py,sha256=0eMY357by892_32a2qCT6nRCUOHt03gxKCmUH2wDjVg,15184
|
|
46
46
|
paid/tracing/wrappers/__init__.py,sha256=IIleLB_JUbzLw7FshrU2VHZAKF3dZHMGy1O5zCBwwqM,1588
|
|
47
47
|
paid/tracing/wrappers/anthropic/__init__.py,sha256=_x1fjySAQxuT5cIGO_jU09LiGcZH-WQLqKg8mUFAu2w,115
|
|
48
48
|
paid/tracing/wrappers/anthropic/anthropicWrapper.py,sha256=pGchbOb41CbTxc7H8xXoM-LjR085spqrzXqCVC_rrFk,4913
|
|
@@ -99,7 +99,7 @@ paid/usage/__init__.py,sha256=_VhToAyIt_5axN6CLJwtxg3-CO7THa_23pbUzqhXJa4,85
|
|
|
99
99
|
paid/usage/client.py,sha256=280WJuepoovk3BAVbAx2yN2Q_qBdvx3CcPkLu8lXslc,3030
|
|
100
100
|
paid/usage/raw_client.py,sha256=2acg5C4lxuZodZjepU9QYF0fmBxgG-3ZgXs1zUJG-wM,3709
|
|
101
101
|
paid/version.py,sha256=QIpDFnOrxMxrs86eL0iNH0mSZ1DO078wWHYY9TYAoew,78
|
|
102
|
-
paid_python-0.3.
|
|
103
|
-
paid_python-0.3.
|
|
104
|
-
paid_python-0.3.
|
|
105
|
-
paid_python-0.3.
|
|
102
|
+
paid_python-0.3.4.dist-info/LICENSE,sha256=Nz4baY1zvv0Qy7lqrQtbaiMhmEeGr2Q7A93aqzpml4c,1071
|
|
103
|
+
paid_python-0.3.4.dist-info/METADATA,sha256=r3juPpujn-xEF7IRftwtqe-CdnV9aUffhrsa6ijd4qg,23695
|
|
104
|
+
paid_python-0.3.4.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
|
|
105
|
+
paid_python-0.3.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|