kalibr 1.2.6__tar.gz → 1.2.8__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 (68) hide show
  1. {kalibr-1.2.6 → kalibr-1.2.8}/PKG-INFO +114 -14
  2. kalibr-1.2.8/README.md +220 -0
  3. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/__init__.py +2 -2
  4. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/cli/capsule_cmd.py +3 -3
  5. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/cli/run.py +2 -2
  6. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/client.py +1 -1
  7. kalibr-1.2.8/kalibr/collector.py +352 -0
  8. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/cost_adapter.py +36 -104
  9. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/instrumentation/anthropic_instr.py +34 -40
  10. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/instrumentation/base.py +27 -9
  11. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/instrumentation/google_instr.py +34 -39
  12. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/instrumentation/openai_instr.py +34 -28
  13. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/instrumentation/registry.py +38 -13
  14. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/intelligence.py +28 -16
  15. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/middleware/auto_tracer.py +1 -1
  16. kalibr-1.2.8/kalibr/pricing.py +245 -0
  17. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/router.py +139 -53
  18. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/simple_tracer.py +16 -15
  19. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/trace_capsule.py +19 -12
  20. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/utils.py +2 -2
  21. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr.egg-info/PKG-INFO +114 -14
  22. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr.egg-info/SOURCES.txt +6 -1
  23. {kalibr-1.2.6 → kalibr-1.2.8}/pyproject.toml +1 -1
  24. kalibr-1.2.8/tests/test_cost_adapter.py +218 -0
  25. kalibr-1.2.8/tests/test_http_client_leak.py +298 -0
  26. {kalibr-1.2.6 → kalibr-1.2.8}/tests/test_instrumentation.py +94 -6
  27. kalibr-1.2.8/tests/test_pricing.py +268 -0
  28. kalibr-1.2.8/tests/test_thread_safety.py +501 -0
  29. kalibr-1.2.6/README.md +0 -120
  30. kalibr-1.2.6/kalibr/collector.py +0 -173
  31. {kalibr-1.2.6 → kalibr-1.2.8}/LICENSE +0 -0
  32. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/__main__.py +0 -0
  33. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/capsule_middleware.py +0 -0
  34. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/cli/__init__.py +0 -0
  35. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/cli/deploy_cmd.py +0 -0
  36. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/cli/main.py +0 -0
  37. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/cli/serve.py +0 -0
  38. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/context.py +0 -0
  39. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/decorators.py +0 -0
  40. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/instrumentation/__init__.py +0 -0
  41. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/kalibr.py +0 -0
  42. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/kalibr_app.py +0 -0
  43. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/middleware/__init__.py +0 -0
  44. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/models.py +0 -0
  45. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/redaction.py +0 -0
  46. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/schemas.py +0 -0
  47. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/tokens.py +0 -0
  48. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/trace_models.py +0 -0
  49. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/tracer.py +0 -0
  50. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr/types.py +0 -0
  51. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr.egg-info/dependency_links.txt +0 -0
  52. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr.egg-info/entry_points.txt +0 -0
  53. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr.egg-info/requires.txt +0 -0
  54. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr.egg-info/top_level.txt +0 -0
  55. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr_crewai/__init__.py +0 -0
  56. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr_crewai/callbacks.py +0 -0
  57. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr_crewai/instrumentor.py +0 -0
  58. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr_langchain/__init__.py +0 -0
  59. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr_langchain/async_callback.py +0 -0
  60. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr_langchain/callback.py +0 -0
  61. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr_langchain/chat_model.py +0 -0
  62. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr_openai_agents/__init__.py +0 -0
  63. {kalibr-1.2.6 → kalibr-1.2.8}/kalibr_openai_agents/processor.py +0 -0
  64. {kalibr-1.2.6 → kalibr-1.2.8}/setup.cfg +0 -0
  65. {kalibr-1.2.6 → kalibr-1.2.8}/tests/test_capsule_builder.py +0 -0
  66. {kalibr-1.2.6 → kalibr-1.2.8}/tests/test_intelligence.py +0 -0
  67. {kalibr-1.2.6 → kalibr-1.2.8}/tests/test_langchain_routing.py +0 -0
  68. {kalibr-1.2.6 → kalibr-1.2.8}/tests/test_router.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: kalibr
3
- Version: 1.2.6
3
+ Version: 1.2.8
4
4
  Summary: Adaptive routing for AI agents. Learns which models work best and routes automatically.
5
5
  Author-email: Kalibr Team <support@kalibr.systems>
6
6
  License: Apache-2.0
@@ -67,7 +67,7 @@ Requires-Dist: ruff>=0.1.0; extra == "dev"
67
67
 
68
68
  # Kalibr
69
69
 
70
- Adaptive routing for AI agents. Kalibr learns which models, tools, and configs work best for each task and routes automatically.
70
+ Adaptive routing for AI agents. Kalibr learns which models work best for your tasks and routes automatically.
71
71
 
72
72
  [![PyPI](https://img.shields.io/pypi/v/kalibr)](https://pypi.org/project/kalibr/)
73
73
  [![Python](https://img.shields.io/pypi/pyversions/kalibr)](https://pypi.org/project/kalibr/)
@@ -83,24 +83,32 @@ pip install kalibr
83
83
  from kalibr import Router
84
84
 
85
85
  router = Router(
86
- goal="book_meeting",
87
- paths=["gpt-4o", "claude-sonnet-4-20250514", "gpt-4o-mini"],
88
- success_when=lambda output: "confirmed" in output.lower()
86
+ goal="extract_company",
87
+ paths=["gpt-4o", "claude-sonnet-4-20250514"]
89
88
  )
90
89
 
91
90
  response = router.completion(
92
- messages=[{"role": "user", "content": "Book a meeting with John tomorrow"}]
91
+ messages=[{"role": "user", "content": "Extract the company: Hi, I'm Sarah from Stripe."}]
93
92
  )
93
+
94
+ router.report(success=True)
94
95
  ```
95
96
 
96
- Kalibr picks the best model, makes the call, checks success, and learns for next time.
97
+ Kalibr picks the best model, makes the call, and learns from the outcome.
98
+
99
+ ## How It Works
100
+
101
+ 1. **You define paths** - models (and optionally tools/params) that can handle your task
102
+ 2. **Kalibr picks** - uses Thompson Sampling to balance exploration vs exploitation
103
+ 3. **You report outcomes** - tell Kalibr if it worked
104
+ 4. **Kalibr learns** - routes more traffic to what works
97
105
 
98
106
  ## Paths
99
107
 
100
108
  A path is a model + optional tools + optional params:
101
109
  ```python
102
110
  # Just models
103
- paths = ["gpt-4o", "claude-sonnet-4-20250514"]
111
+ paths = ["gpt-4o", "claude-sonnet-4-20250514", "gpt-4o-mini"]
104
112
 
105
113
  # With tools
106
114
  paths = [
@@ -115,7 +123,78 @@ paths = [
115
123
  ]
116
124
  ```
117
125
 
118
- ## Manual Outcome Reporting
126
+ ## Advanced Path Configuration
127
+
128
+ ### Routing Between Parameters
129
+
130
+ Kalibr can route between different parameter configurations of the same model:
131
+ ```python
132
+ from kalibr import Router
133
+
134
+ router = Router(
135
+ goal="creative_writing",
136
+ paths=[
137
+ {"model": "gpt-4o", "params": {"temperature": 0.3}},
138
+ {"model": "gpt-4o", "params": {"temperature": 0.9}},
139
+ {"model": "claude-sonnet-4-20250514", "params": {"temperature": 0.7}}
140
+ ]
141
+ )
142
+
143
+ response = router.completion(messages=[...])
144
+ router.report(success=True)
145
+ ```
146
+
147
+ Each unique `(model, params)` combination is tracked separately. Kalibr learns which configuration works best for your specific goal.
148
+
149
+ ### Routing Between Tools
150
+ ```python
151
+ router = Router(
152
+ goal="research_task",
153
+ paths=[
154
+ {"model": "gpt-4o", "tools": ["web_search"]},
155
+ {"model": "gpt-4o", "tools": ["code_interpreter"]},
156
+ {"model": "claude-sonnet-4-20250514"}
157
+ ]
158
+ )
159
+ ```
160
+
161
+ ### When to Use get_policy() Instead of Router
162
+
163
+ For most use cases, use `Router`. It handles provider dispatching and response conversion automatically.
164
+
165
+ Use `get_policy()` for advanced scenarios:
166
+ - Integrating with frameworks like LangChain that wrap LLM calls
167
+ - Custom retry logic or provider-specific features
168
+ - Building tools that need fine-grained control
169
+ ```python
170
+ from kalibr import get_policy, report_outcome
171
+
172
+ policy = get_policy(goal="summarize")
173
+ model = policy["recommended_model"]
174
+
175
+ # You call the provider yourself
176
+ if model.startswith("gpt"):
177
+ client = OpenAI()
178
+ response = client.chat.completions.create(model=model, messages=[...])
179
+
180
+ report_outcome(trace_id=trace_id, goal="summarize", success=True)
181
+ ```
182
+
183
+ ## Outcome Reporting
184
+
185
+ ### Automatic (with success_when)
186
+ ```python
187
+ router = Router(
188
+ goal="summarize",
189
+ paths=["gpt-4o", "claude-sonnet-4-20250514"],
190
+ success_when=lambda output: len(output) > 100
191
+ )
192
+
193
+ response = router.completion(messages=[...])
194
+ # Outcome reported automatically based on success_when
195
+ ```
196
+
197
+ ### Manual
119
198
  ```python
120
199
  router = Router(goal="book_meeting", paths=["gpt-4o", "claude-sonnet-4-20250514"])
121
200
  response = router.completion(messages=[...])
@@ -139,7 +218,7 @@ chain = prompt | llm | parser
139
218
 
140
219
  ## Auto-Instrumentation
141
220
 
142
- Kalibr auto-instruments OpenAI, Anthropic, and Google SDKs when imported:
221
+ Kalibr auto-instruments OpenAI, Anthropic, and Google SDKs on import:
143
222
  ```python
144
223
  import kalibr # Must be first import
145
224
  from openai import OpenAI
@@ -151,19 +230,39 @@ response = client.chat.completions.create(model="gpt-4o", messages=[...])
151
230
 
152
231
  Disable with `KALIBR_AUTO_INSTRUMENT=false`.
153
232
 
233
+ ## Low-Level API
234
+
235
+ For advanced use cases, you can use the intelligence API directly:
236
+ ```python
237
+ from kalibr import register_path, decide, report_outcome
238
+
239
+ # Register paths
240
+ register_path(goal="book_meeting", model_id="gpt-4o")
241
+ register_path(goal="book_meeting", model_id="claude-sonnet-4-20250514")
242
+
243
+ # Get routing decision
244
+ decision = decide(goal="book_meeting")
245
+ model = decision["model_id"]
246
+
247
+ # Make your own LLM call, then report
248
+ report_outcome(trace_id="...", goal="book_meeting", success=True)
249
+ ```
250
+
154
251
  ## Other Integrations
155
252
  ```bash
156
253
  pip install kalibr[crewai] # CrewAI
157
254
  pip install kalibr[openai-agents] # OpenAI Agents SDK
255
+ pip install kalibr[langchain-all] # LangChain with all providers
158
256
  ```
159
257
 
160
258
  ## Configuration
161
259
 
162
260
  | Variable | Description | Default |
163
261
  |----------|-------------|---------|
164
- | `KALIBR_API_KEY` | API key | Required |
165
- | `KALIBR_TENANT_ID` | Tenant ID | `default` |
166
- | `KALIBR_AUTO_INSTRUMENT` | Auto-instrument SDKs | `true` |
262
+ | `KALIBR_API_KEY` | API key from dashboard | Required |
263
+ | `KALIBR_TENANT_ID` | Tenant ID from dashboard | Required |
264
+ | `KALIBR_AUTO_INSTRUMENT` | Auto-instrument LLM SDKs | `true` |
265
+ | `KALIBR_INTELLIGENCE_URL` | Intelligence service URL | `https://kalibr-intelligence.fly.dev` |
167
266
 
168
267
  ## Development
169
268
  ```bash
@@ -183,5 +282,6 @@ Apache-2.0
183
282
 
184
283
  ## Links
185
284
 
186
- - [Docs](https://kalibr.systems/docs)
285
+ - [Docs](https://kalibr.dev/docs)
187
286
  - [Dashboard](https://dashboard.kalibr.systems)
287
+ - [GitHub](https://github.com/kalibr-ai/kalibr-sdk-python)
kalibr-1.2.8/README.md ADDED
@@ -0,0 +1,220 @@
1
+ # Kalibr
2
+
3
+ Adaptive routing for AI agents. Kalibr learns which models work best for your tasks and routes automatically.
4
+
5
+ [![PyPI](https://img.shields.io/pypi/v/kalibr)](https://pypi.org/project/kalibr/)
6
+ [![Python](https://img.shields.io/pypi/pyversions/kalibr)](https://pypi.org/project/kalibr/)
7
+ [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)
8
+
9
+ ## Installation
10
+ ```bash
11
+ pip install kalibr
12
+ ```
13
+
14
+ ## Quick Start
15
+ ```python
16
+ from kalibr import Router
17
+
18
+ router = Router(
19
+ goal="extract_company",
20
+ paths=["gpt-4o", "claude-sonnet-4-20250514"]
21
+ )
22
+
23
+ response = router.completion(
24
+ messages=[{"role": "user", "content": "Extract the company: Hi, I'm Sarah from Stripe."}]
25
+ )
26
+
27
+ router.report(success=True)
28
+ ```
29
+
30
+ Kalibr picks the best model, makes the call, and learns from the outcome.
31
+
32
+ ## How It Works
33
+
34
+ 1. **You define paths** - models (and optionally tools/params) that can handle your task
35
+ 2. **Kalibr picks** - uses Thompson Sampling to balance exploration vs exploitation
36
+ 3. **You report outcomes** - tell Kalibr if it worked
37
+ 4. **Kalibr learns** - routes more traffic to what works
38
+
39
+ ## Paths
40
+
41
+ A path is a model + optional tools + optional params:
42
+ ```python
43
+ # Just models
44
+ paths = ["gpt-4o", "claude-sonnet-4-20250514", "gpt-4o-mini"]
45
+
46
+ # With tools
47
+ paths = [
48
+ {"model": "gpt-4o", "tools": ["web_search"]},
49
+ {"model": "claude-sonnet-4-20250514", "tools": ["web_search", "browser"]},
50
+ ]
51
+
52
+ # With params
53
+ paths = [
54
+ {"model": "gpt-4o", "params": {"temperature": 0.7}},
55
+ {"model": "gpt-4o", "params": {"temperature": 0.2}},
56
+ ]
57
+ ```
58
+
59
+ ## Advanced Path Configuration
60
+
61
+ ### Routing Between Parameters
62
+
63
+ Kalibr can route between different parameter configurations of the same model:
64
+ ```python
65
+ from kalibr import Router
66
+
67
+ router = Router(
68
+ goal="creative_writing",
69
+ paths=[
70
+ {"model": "gpt-4o", "params": {"temperature": 0.3}},
71
+ {"model": "gpt-4o", "params": {"temperature": 0.9}},
72
+ {"model": "claude-sonnet-4-20250514", "params": {"temperature": 0.7}}
73
+ ]
74
+ )
75
+
76
+ response = router.completion(messages=[...])
77
+ router.report(success=True)
78
+ ```
79
+
80
+ Each unique `(model, params)` combination is tracked separately. Kalibr learns which configuration works best for your specific goal.
81
+
82
+ ### Routing Between Tools
83
+ ```python
84
+ router = Router(
85
+ goal="research_task",
86
+ paths=[
87
+ {"model": "gpt-4o", "tools": ["web_search"]},
88
+ {"model": "gpt-4o", "tools": ["code_interpreter"]},
89
+ {"model": "claude-sonnet-4-20250514"}
90
+ ]
91
+ )
92
+ ```
93
+
94
+ ### When to Use get_policy() Instead of Router
95
+
96
+ For most use cases, use `Router`. It handles provider dispatching and response conversion automatically.
97
+
98
+ Use `get_policy()` for advanced scenarios:
99
+ - Integrating with frameworks like LangChain that wrap LLM calls
100
+ - Custom retry logic or provider-specific features
101
+ - Building tools that need fine-grained control
102
+ ```python
103
+ from kalibr import get_policy, report_outcome
104
+
105
+ policy = get_policy(goal="summarize")
106
+ model = policy["recommended_model"]
107
+
108
+ # You call the provider yourself
109
+ if model.startswith("gpt"):
110
+ client = OpenAI()
111
+ response = client.chat.completions.create(model=model, messages=[...])
112
+
113
+ report_outcome(trace_id=trace_id, goal="summarize", success=True)
114
+ ```
115
+
116
+ ## Outcome Reporting
117
+
118
+ ### Automatic (with success_when)
119
+ ```python
120
+ router = Router(
121
+ goal="summarize",
122
+ paths=["gpt-4o", "claude-sonnet-4-20250514"],
123
+ success_when=lambda output: len(output) > 100
124
+ )
125
+
126
+ response = router.completion(messages=[...])
127
+ # Outcome reported automatically based on success_when
128
+ ```
129
+
130
+ ### Manual
131
+ ```python
132
+ router = Router(goal="book_meeting", paths=["gpt-4o", "claude-sonnet-4-20250514"])
133
+ response = router.completion(messages=[...])
134
+
135
+ meeting_created = check_calendar_api()
136
+ router.report(success=meeting_created)
137
+ ```
138
+
139
+ ## LangChain Integration
140
+ ```bash
141
+ pip install kalibr[langchain]
142
+ ```
143
+ ```python
144
+ from kalibr import Router
145
+
146
+ router = Router(goal="summarize", paths=["gpt-4o", "claude-sonnet-4-20250514"])
147
+ llm = router.as_langchain()
148
+
149
+ chain = prompt | llm | parser
150
+ ```
151
+
152
+ ## Auto-Instrumentation
153
+
154
+ Kalibr auto-instruments OpenAI, Anthropic, and Google SDKs on import:
155
+ ```python
156
+ import kalibr # Must be first import
157
+ from openai import OpenAI
158
+
159
+ client = OpenAI()
160
+ response = client.chat.completions.create(model="gpt-4o", messages=[...])
161
+ # Traced automatically
162
+ ```
163
+
164
+ Disable with `KALIBR_AUTO_INSTRUMENT=false`.
165
+
166
+ ## Low-Level API
167
+
168
+ For advanced use cases, you can use the intelligence API directly:
169
+ ```python
170
+ from kalibr import register_path, decide, report_outcome
171
+
172
+ # Register paths
173
+ register_path(goal="book_meeting", model_id="gpt-4o")
174
+ register_path(goal="book_meeting", model_id="claude-sonnet-4-20250514")
175
+
176
+ # Get routing decision
177
+ decision = decide(goal="book_meeting")
178
+ model = decision["model_id"]
179
+
180
+ # Make your own LLM call, then report
181
+ report_outcome(trace_id="...", goal="book_meeting", success=True)
182
+ ```
183
+
184
+ ## Other Integrations
185
+ ```bash
186
+ pip install kalibr[crewai] # CrewAI
187
+ pip install kalibr[openai-agents] # OpenAI Agents SDK
188
+ pip install kalibr[langchain-all] # LangChain with all providers
189
+ ```
190
+
191
+ ## Configuration
192
+
193
+ | Variable | Description | Default |
194
+ |----------|-------------|---------|
195
+ | `KALIBR_API_KEY` | API key from dashboard | Required |
196
+ | `KALIBR_TENANT_ID` | Tenant ID from dashboard | Required |
197
+ | `KALIBR_AUTO_INSTRUMENT` | Auto-instrument LLM SDKs | `true` |
198
+ | `KALIBR_INTELLIGENCE_URL` | Intelligence service URL | `https://kalibr-intelligence.fly.dev` |
199
+
200
+ ## Development
201
+ ```bash
202
+ git clone https://github.com/kalibr-ai/kalibr-sdk-python.git
203
+ cd kalibr-sdk-python
204
+ pip install -e ".[dev]"
205
+ pytest
206
+ ```
207
+
208
+ ## Contributing
209
+
210
+ See [CONTRIBUTING.md](CONTRIBUTING.md).
211
+
212
+ ## License
213
+
214
+ Apache-2.0
215
+
216
+ ## Links
217
+
218
+ - [Docs](https://kalibr.dev/docs)
219
+ - [Dashboard](https://dashboard.kalibr.systems)
220
+ - [GitHub](https://github.com/kalibr-ai/kalibr-sdk-python)
@@ -1,4 +1,4 @@
1
- """Kalibr SDK v1.2.0 - LLM Observability & Tracing Framework
1
+ """Kalibr SDK v1.2.7 - LLM Observability & Tracing Framework
2
2
 
3
3
  Features:
4
4
  - **Auto-Instrumentation**: Zero-config tracing of OpenAI, Anthropic, Google SDK calls
@@ -36,7 +36,7 @@ CLI Usage:
36
36
  kalibr version # Show version
37
37
  """
38
38
 
39
- __version__ = "1.2.0"
39
+ __version__ = "1.2.7"
40
40
 
41
41
  # Auto-instrument LLM SDKs on import (can be disabled via env var)
42
42
  import os
@@ -23,7 +23,7 @@ def capsule(
23
23
  None,
24
24
  "--api-url",
25
25
  "-u",
26
- help="Kalibr API base URL (default: from env KALIBR_API_URL or https://api.kalibr.systems)",
26
+ help="Kalibr API base URL (default: from env KALIBR_API_URL or https://kalibr-backend.fly.dev)",
27
27
  envvar="KALIBR_API_URL",
28
28
  ),
29
29
  output: Optional[Path] = typer.Option(
@@ -63,10 +63,10 @@ def capsule(
63
63
  kalibr capsule abc-123-def --export --output capsule.json
64
64
 
65
65
  # Specify custom API URL
66
- kalibr capsule abc-123-def -u https://api.kalibr.systems
66
+ kalibr capsule abc-123-def -u https://kalibr-backend.fly.dev
67
67
  """
68
68
  # Determine API base URL
69
- base_url = api_url or "https://api.kalibr.systems"
69
+ base_url = api_url or "https://kalibr-backend.fly.dev"
70
70
  base_url = base_url.rstrip("/")
71
71
 
72
72
  # Build endpoint URL
@@ -47,7 +47,7 @@ def run(
47
47
  kalibr run weather.py --runtime fly.io
48
48
 
49
49
  # Custom backend
50
- kalibr run weather.py --backend-url https://api.kalibr.systems
50
+ kalibr run weather.py --backend-url https://kalibr-backend.fly.dev
51
51
  """
52
52
  # Validate file exists
53
53
  agent_path = Path(file_path).resolve()
@@ -56,7 +56,7 @@ def run(
56
56
  raise typer.Exit(1)
57
57
 
58
58
  # Configure backend
59
- backend = backend_url or os.getenv("KALIBR_BACKEND_URL", "https://api.kalibr.systems")
59
+ backend = backend_url or os.getenv("KALIBR_BACKEND_URL", "https://kalibr-backend.fly.dev")
60
60
  api_key = os.getenv("KALIBR_API_KEY")
61
61
  if not api_key:
62
62
  console.print("[yellow]⚠️ KALIBR_API_KEY not set. Set it for trace authentication.[/yellow]")
@@ -70,7 +70,7 @@ class KalibrClient:
70
70
 
71
71
  self.api_key = api_key or env_config.get("auth_token", "")
72
72
  self.endpoint = endpoint or env_config.get(
73
- "api_endpoint", "https://api.kalibr.systems/api/v1/traces"
73
+ "api_endpoint", "https://kalibr-backend.fly.dev/api/v1/traces"
74
74
  )
75
75
  self.tenant_id = tenant_id or env_config.get("tenant_id", "default")
76
76
  self.environment = environment or env_config.get("environment", "prod")