supervaizer 0.10.10__py3-none-any.whl → 0.10.12__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.
supervaizer/__init__.py CHANGED
@@ -13,6 +13,7 @@ from supervaizer.agent import (
13
13
  AgentMethod,
14
14
  AgentMethodParams,
15
15
  AgentMethods,
16
+ AgentMethodField,
16
17
  )
17
18
  from supervaizer.case import (
18
19
  Case,
@@ -5,6 +5,6 @@
5
5
  # https://mozilla.org/MPL/2.0/.
6
6
 
7
7
 
8
- VERSION = "0.10.10"
8
+ VERSION = "0.10.12"
9
9
  API_VERSION = "v1"
10
10
  TELEMETRY_VERSION = "v1"
supervaizer/account.py CHANGED
@@ -8,7 +8,7 @@
8
8
  from typing import TYPE_CHECKING, Any, ClassVar, Dict, Optional, Union
9
9
 
10
10
  import httpx
11
- from pydantic import Field
11
+ from pydantic import Field, field_validator
12
12
 
13
13
  from supervaizer.__version__ import VERSION
14
14
  from supervaizer.common import ApiError, ApiResult, ApiSuccess, SvBaseModel
@@ -55,6 +55,14 @@ class AccountAbstract(SvBaseModel):
55
55
  description="The URL of the Supervaize SaaS API provided by Supervaize.com"
56
56
  )
57
57
 
58
+ @field_validator("workspace_id", "api_key", "api_url", mode="before")
59
+ @classmethod
60
+ def strip_whitespace(cls, v: Any) -> Any:
61
+ """Strip leading/trailing whitespace (e.g. newlines from env vars)."""
62
+ if isinstance(v, str):
63
+ return v.strip()
64
+ return v
65
+
58
66
  model_config = {
59
67
  "reference_group": "Core",
60
68
  "json_schema_extra": {
@@ -121,7 +129,7 @@ class Account(AccountAbstract):
121
129
  """URL for the Supervaize Control API.
122
130
  Tested in tests/test_account.py
123
131
  """
124
- return f"{self.api_url_w_v1}/ctrl-events/"
132
+ return f"{self.api_url_w_v1}/ctrl-events/".strip()
125
133
 
126
134
  def get_url(self, pattern_name: str, **kwargs: Any) -> str:
127
135
  """Generate a URL using the predefined patterns.
@@ -59,14 +59,17 @@ def send_event(
59
59
 
60
60
  headers = account.api_headers
61
61
  payload = event.payload
62
+ url_event = (
63
+ account.url_event.strip()
64
+ ) # defensive: env vars often have trailing newline
62
65
 
63
66
  # Generate curl equivalent for debugging
64
67
 
65
68
  curl_headers = " ".join([f'-H "{k}: {v}"' for k, v in headers.items()])
66
- curl_cmd = f"curl -X 'GET' '{account.url_event}' {curl_headers}"
69
+ curl_cmd = f"curl -X 'GET' '{url_event}' {curl_headers}"
67
70
 
68
71
  try:
69
- response = _httpx_client.post(account.url_event, headers=headers, json=payload)
72
+ response = _httpx_client.post(url_event, headers=headers, json=payload)
70
73
 
71
74
  # Log response details before raising for status
72
75
 
@@ -76,6 +79,13 @@ def send_event(
76
79
  )
77
80
 
78
81
  log.success(result.log_message)
82
+ except (httpx.ConnectError, httpx.ConnectTimeout) as e:
83
+ log.error(
84
+ f"Supervaize controller is not available at {url_event}. "
85
+ "Connection refused or timed out. Is the controller server running?"
86
+ )
87
+ log.error(f"❌ Error sending event {event.type.name}: {e!s}")
88
+ raise e
79
89
  except httpx.HTTPError as e:
80
90
  # Enhanced error logging
81
91
  log.error("[Send event] HTTP Error occurred")
@@ -83,7 +93,7 @@ def send_event(
83
93
 
84
94
  error_result = ApiError(
85
95
  message=f"Error sending event {event.type.name}",
86
- url=account.url_event,
96
+ url=url_event,
87
97
  payload=event.payload,
88
98
  exception=e,
89
99
  )
@@ -0,0 +1,57 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Supervaizer API</title>
7
+ <!-- Tailwind CSS -->
8
+ <script src="https://cdn.tailwindcss.com"></script>
9
+ </head>
10
+ <body class="bg-gray-50 min-h-screen">
11
+ <main class="max-w-7xl mx-auto py-6 sm:px-6 lg:px-8">
12
+ <div class="px-4 py-6 sm:px-0">
13
+ <h1 class="text-2xl font-bold leading-7 text-gray-900 sm:truncate sm:text-3xl sm:tracking-tight">
14
+ Supervaizer API
15
+ </h1>
16
+ <p class="mt-2 text-sm text-gray-500">
17
+ Controller version {{ version }} · API version {{ api_version }}
18
+ </p>
19
+
20
+ <div class="mt-8">
21
+ <h2 class="text-lg font-medium text-gray-900 mb-4">Links</h2>
22
+ <ul class="space-y-2">
23
+ <li>
24
+ <a href="/docs" class="text-blue-600 hover:text-blue-800 font-medium">
25
+ Swagger UI
26
+ </a>
27
+ </li>
28
+ <li>
29
+ <a href="/redoc" class="text-blue-600 hover:text-blue-800 font-medium">
30
+ ReDoc
31
+ </a>
32
+ </li>
33
+ <li>
34
+ <a href="/openapi.json" class="text-blue-600 hover:text-blue-800 font-medium">
35
+ OpenAPI
36
+ </a>
37
+ </li>
38
+ {% if show_admin %}
39
+ <li>
40
+ <a href="/admin" class="text-blue-600 hover:text-blue-800 font-medium">
41
+ Admin
42
+ </a>
43
+ </li>
44
+ {% endif %}
45
+ <li>
46
+ <a href="/console" class="text-blue-600 hover:text-blue-800 font-medium">
47
+ Console
48
+ </a>
49
+ </li>
50
+ <li> BASE: {{ base }}
51
+ </li>
52
+ </ul>
53
+ </div>
54
+ </div>
55
+ </main>
56
+ </body>
57
+ </html>
supervaizer/server.py CHANGED
@@ -46,7 +46,11 @@ from supervaizer.routes import (
46
46
  create_utils_routes,
47
47
  get_server,
48
48
  )
49
- from supervaizer.storage import StorageManager, load_running_entities_on_startup
49
+ from supervaizer.storage import (
50
+ PERSISTENCE_ENABLED,
51
+ StorageManager,
52
+ load_running_entities_on_startup,
53
+ )
50
54
 
51
55
  insp = inspect
52
56
 
@@ -70,7 +74,9 @@ class ServerInfo(BaseModel):
70
74
 
71
75
 
72
76
  def save_server_info_to_storage(server_instance: "Server") -> None:
73
- """Save server information to storage."""
77
+ """Save server information to storage (only when persistence is enabled)."""
78
+ if not PERSISTENCE_ENABLED:
79
+ return
74
80
  try:
75
81
  storage = StorageManager()
76
82
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: supervaizer
3
- Version: 0.10.10
3
+ Version: 0.10.12
4
4
  Summary: Controller system for Supervaize
5
5
  Project-URL: Homepage, https://supervaize.com
6
6
  Project-URL: Repository, https://github.com/supervaize/supervaizer
@@ -1,7 +1,7 @@
1
- supervaizer/__init__.py,sha256=eBbGjduMBH-FDjcGlSqeR4Kf4uo60Cf1DrRur8VGkJo,2341
2
- supervaizer/__version__.py,sha256=Z8yHz_dQqpmRG8bWI6v6sN67UspmD_fTN2p8AEeracI,349
3
- supervaizer/account.py,sha256=bxANsh-97dRGGpzstT1XKGThPHqRqvJC022Hfrb2RyM,11102
4
- supervaizer/account_service.py,sha256=z4lw8qp8XvCrU6Ndf4VHRnQwY_071410ts5_7E8YDAs,3046
1
+ supervaizer/__init__.py,sha256=_ZwsuMl-2rwxHZedAaIgqa8BQ7jfis4hJ2ubZGs8KrY,2363
2
+ supervaizer/__version__.py,sha256=HJ_fSsd-5VDmkv04pTXVu9uHMCwNohmhyhl4gUVygUo,349
3
+ supervaizer/account.py,sha256=TZQdDo1OdjquFsLFxPvUUqzOcdMOIAQHHaREghD5SJ4,11421
4
+ supervaizer/account_service.py,sha256=ZgZ0fhsbSVA076c-35ZZoYJBrQZsAwfFS7namVeoD3s,3459
5
5
  supervaizer/agent.py,sha256=Clenvdr_v-lV7_v6YCcevp8dj5JUNvpTWrBZBYM82lg,36509
6
6
  supervaizer/case.py,sha256=dOgRujyf4MFcZ-937zxJbqLIPduKg6ZspHuhnWiq13Q,14385
7
7
  supervaizer/cli.py,sha256=3KH4gZXTiJ9GtY375kGm5HaKCGV2V8WEbcWdF_sWWEc,13936
@@ -13,7 +13,7 @@ supervaizer/job_service.py,sha256=22Qe7Z5_u3R28tcNH_21YMIYciWFtJaM7I-MXtIhBMU,46
13
13
  supervaizer/lifecycle.py,sha256=5CunJN7MsM5blyNiFMJMLFDUBmTmmAsPE24QC-gSbYA,13958
14
14
  supervaizer/parameter.py,sha256=sYDuGof_w6mlix0oxjB6odV0sO0QSBL1KwFZa3Y2cOA,8157
15
15
  supervaizer/routes.py,sha256=o3u7pGGLE0MQzWtQNdd5xk1M0G9Y_BR_JiLVmCFtdC4,34319
16
- supervaizer/server.py,sha256=d1yY30g9mA-tT7NKq1-tZUxqE9FO0dYplGKkvGUZyW4,22353
16
+ supervaizer/server.py,sha256=79MtQcB4fpV9VgFh-dBsbwbHf097waeLmBnArhClVb8,22473
17
17
  supervaizer/server_utils.py,sha256=FMglpADQBJynkR2v-pfwANu6obsaPvR9j0BQc5Otpac,1590
18
18
  supervaizer/storage.py,sha256=WLX8ggwt1AGF07DrfD1K6PyP2-N45c_Ep4CL0iPLVbI,15332
19
19
  supervaizer/telemetry.py,sha256=XSYw8ZwoY8W6C7mhwHU67t7trJzWd7CBkkSNdsDT_HA,2596
@@ -63,6 +63,7 @@ supervaizer/deploy/templates/debug_env.py,sha256=WFlxfiCAlkxM1NybNvtmmG5zJnoSvjW
63
63
  supervaizer/deploy/templates/docker-compose.yml.template,sha256=ZcW8WyhmqMElaxBpokuZG12n0tFJL8BY7k7Tvdz6tdw,1100
64
64
  supervaizer/deploy/templates/dockerignore.template,sha256=bYFRn6QGsjtRDH-Y7vzWk3-u3jIp90FajV2Ed94ah5M,515
65
65
  supervaizer/deploy/templates/entrypoint.sh,sha256=z079VUotu6DJX92fJiBB3eVwCEgcP6B9D9Fvwv_FL9w,463
66
+ supervaizer/deploy/templates/index.html,sha256=z2ocEOYbWbl1Rz3Toc5JZkN7OAoW_GFV1yKKhdyC3vw,2160
66
67
  supervaizer/examples/controller_template.py,sha256=bQRtZdq9Z8Pg0b3bRy4oVy6YIIM_e5DzhXVPOr1gFvk,6337
67
68
  supervaizer/protocol/__init__.py,sha256=00GHbUsLNsf0a1rQrUPpVN2Uy-7rDz72Ps6TUVD91tE,389
68
69
  supervaizer/protocol/a2a/__init__.py,sha256=1ACfPGLzS6XdZPiFxn1nVamvbasqtJJ7U1BBbSmT-nI,625
@@ -71,8 +72,8 @@ supervaizer/protocol/a2a/routes.py,sha256=rkQTNBD1NTYimKCb8iOk4bVf9ldDP1LqHfOsyh
71
72
  supervaizer/utils/__init__.py,sha256=fd0NFwN_cen3QPms2SOnuz4jcetay3f_31dit2As7EA,458
72
73
  supervaizer/utils/version_check.py,sha256=-tsOURpHVh0LNTbpQsyJDJENKszC-NzXDSO_EToEQPE,1893
73
74
  supervaizer/py.typed,sha256=bHhvLx7c6MqrzXVPbdK3qAOcSxzp4wDtTx4QifMC2EY,74
74
- supervaizer-0.10.10.dist-info/METADATA,sha256=oNI_GkiR12gjGpSJEqp3Z6dVxLQ1QzXgErPYg43qYlg,12648
75
- supervaizer-0.10.10.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
76
- supervaizer-0.10.10.dist-info/entry_points.txt,sha256=vL_IBR_AeEI2u2-6YL4PY9k2Mar4-gprG8-UxERWjmg,52
77
- supervaizer-0.10.10.dist-info/licenses/LICENSE.md,sha256=dmdnt1vfpxNPr8Lt0BnxKE5uzUwK3CWTthTUStgOXjY,15327
78
- supervaizer-0.10.10.dist-info/RECORD,,
75
+ supervaizer-0.10.12.dist-info/METADATA,sha256=DUKooVP4FglSEWhswwH4chexscq13Iz7eVmB-x86k_8,12648
76
+ supervaizer-0.10.12.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
77
+ supervaizer-0.10.12.dist-info/entry_points.txt,sha256=vL_IBR_AeEI2u2-6YL4PY9k2Mar4-gprG8-UxERWjmg,52
78
+ supervaizer-0.10.12.dist-info/licenses/LICENSE.md,sha256=dmdnt1vfpxNPr8Lt0BnxKE5uzUwK3CWTthTUStgOXjY,15327
79
+ supervaizer-0.10.12.dist-info/RECORD,,