hud-python 0.4.54__py3-none-any.whl → 0.4.56__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.

Potentially problematic release.


This version of hud-python might be problematic. Click here for more details.

hud/otel/context.py CHANGED
@@ -6,6 +6,7 @@ User-facing APIs are in hud.telemetry.
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
+ import contextlib
9
10
  import contextvars
10
11
  import logging
11
12
  from contextlib import contextmanager
@@ -232,6 +233,8 @@ async def _update_task_status_async(
232
233
  error_message: str | None = None,
233
234
  trace_name: str | None = None,
234
235
  task_id: str | None = None,
236
+ group_id: str | None = None,
237
+ extra_metadata: dict[str, Any] | None = None,
235
238
  ) -> None:
236
239
  """Async task status update."""
237
240
  if not settings.telemetry_enabled:
@@ -271,12 +274,20 @@ async def _update_task_status_async(
271
274
  metadata["mcp_tool_steps"] = get_mcp_tool_steps()
272
275
  metadata["agent_steps"] = get_agent_steps()
273
276
 
277
+ # Merge any extra metadata provided by callers (e.g., task config summaries)
278
+ if extra_metadata:
279
+ with contextlib.suppress(Exception):
280
+ metadata.update(extra_metadata)
281
+
274
282
  if metadata:
275
283
  data["metadata"] = metadata
276
284
 
277
285
  if task_id:
278
286
  data["task_id"] = task_id
279
287
 
288
+ if group_id:
289
+ data["group_id"] = group_id
290
+
280
291
  await make_request(
281
292
  method="POST",
282
293
  url=f"{settings.hud_telemetry_url}/trace/{task_run_id}/status",
@@ -297,10 +308,21 @@ def _fire_and_forget_status_update(
297
308
  error_message: str | None = None,
298
309
  trace_name: str | None = None,
299
310
  task_id: str | None = None,
311
+ group_id: str | None = None,
312
+ extra_metadata: dict[str, Any] | None = None,
300
313
  ) -> None:
301
314
  """Fire and forget status update - works in any context including Jupyter."""
302
315
  fire_and_forget(
303
- _update_task_status_async(task_run_id, status, job_id, error_message, trace_name, task_id),
316
+ _update_task_status_async(
317
+ task_run_id,
318
+ status,
319
+ job_id,
320
+ error_message,
321
+ trace_name,
322
+ task_id,
323
+ group_id,
324
+ extra_metadata,
325
+ ),
304
326
  f"update task {task_run_id} status to {status}",
305
327
  )
306
328
 
@@ -312,6 +334,8 @@ def _update_task_status_sync(
312
334
  error_message: str | None = None,
313
335
  trace_name: str | None = None,
314
336
  task_id: str | None = None,
337
+ group_id: str | None = None,
338
+ extra_metadata: dict[str, Any] | None = None,
315
339
  ) -> None:
316
340
  """Synchronous task status update."""
317
341
  if not settings.telemetry_enabled:
@@ -351,12 +375,20 @@ def _update_task_status_sync(
351
375
  metadata["mcp_tool_steps"] = get_mcp_tool_steps()
352
376
  metadata["agent_steps"] = get_agent_steps()
353
377
 
378
+ # Merge any extra metadata provided by callers
379
+ if extra_metadata:
380
+ with contextlib.suppress(Exception):
381
+ metadata.update(extra_metadata)
382
+
354
383
  if metadata:
355
384
  data["metadata"] = metadata
356
385
 
357
386
  if task_id:
358
387
  data["task_id"] = task_id
359
388
 
389
+ if group_id:
390
+ data["group_id"] = group_id
391
+
360
392
  make_request_sync(
361
393
  method="POST",
362
394
  url=f"{settings.hud_telemetry_url}/trace/{task_run_id}/status",
@@ -447,10 +479,12 @@ class trace:
447
479
  attributes: dict[str, Any] | None = None,
448
480
  job_id: str | None = None,
449
481
  task_id: str | None = None,
482
+ group_id: str | None = None,
450
483
  ) -> None:
451
484
  self.task_run_id = task_run_id
452
485
  self.job_id = job_id
453
486
  self.task_id = task_id
487
+ self.group_id = group_id
454
488
  self.is_root = is_root
455
489
  self.span_name = span_name
456
490
  self.attributes = attributes or {}
@@ -473,6 +507,8 @@ class trace:
473
507
  ctx = baggage.set_baggage("hud.job_id", self.job_id, context=ctx)
474
508
  if self.task_id:
475
509
  ctx = baggage.set_baggage("hud.task_id", self.task_id, context=ctx)
510
+ if self.group_id:
511
+ ctx = baggage.set_baggage("hud.group_id", self.group_id, context=ctx)
476
512
  self._otel_token = context.attach(ctx)
477
513
 
478
514
  # Start a span as current
@@ -486,6 +522,8 @@ class trace:
486
522
  span_attrs["hud.job_id"] = self.job_id
487
523
  if self.task_id:
488
524
  span_attrs["hud.task_id"] = self.task_id
525
+ if self.group_id:
526
+ span_attrs["hud.group_id"] = self.group_id
489
527
 
490
528
  # Use start_as_current_span context manager
491
529
  self._span_manager = tracer.start_as_current_span(
@@ -502,6 +540,7 @@ class trace:
502
540
  job_id=self.job_id,
503
541
  trace_name=self.span_name,
504
542
  task_id=self.task_id,
543
+ group_id=self.group_id,
505
544
  )
506
545
  # Print the nice trace URL box (only if not part of a job)
507
546
  if not self.job_id:
@@ -528,6 +567,7 @@ class trace:
528
567
  error_message=str(exc_val),
529
568
  trace_name=self.span_name,
530
569
  task_id=self.task_id,
570
+ group_id=self.group_id,
531
571
  )
532
572
  # Print error completion message (only if not part of a job)
533
573
  if not self.job_id:
@@ -540,6 +580,7 @@ class trace:
540
580
  job_id=self.job_id,
541
581
  trace_name=self.span_name,
542
582
  task_id=self.task_id,
583
+ group_id=self.group_id,
543
584
  )
544
585
  # Print success completion message (only if not part of a job)
545
586
  if not self.job_id:
hud/server/server.py CHANGED
@@ -311,11 +311,35 @@ class MCPServer(FastMCP):
311
311
  if transport is None:
312
312
  transport = "stdio"
313
313
 
314
- # Register HTTP helpers for HTTP transport
314
+ # Register HTTP helpers and CORS for HTTP transport
315
315
  if transport in ("http", "sse"):
316
316
  self._register_hud_helpers()
317
317
  logger.info("Registered HUD helper endpoints at /hud/*")
318
318
 
319
+ # Add CORS middleware if not already provided
320
+ from starlette.middleware import Middleware
321
+ from starlette.middleware.cors import CORSMiddleware
322
+
323
+ # Get or create middleware list
324
+ middleware = transport_kwargs.get("middleware", [])
325
+ if isinstance(middleware, list):
326
+ # Check if CORS is already configured
327
+ has_cors = any(
328
+ isinstance(m, Middleware) and m.cls == CORSMiddleware for m in middleware
329
+ )
330
+ if not has_cors:
331
+ # Add CORS with permissive defaults for dev
332
+ cors_middleware = Middleware(
333
+ CORSMiddleware,
334
+ allow_origins=["*"],
335
+ allow_methods=["GET", "POST", "DELETE", "OPTIONS"],
336
+ allow_headers=["*"],
337
+ expose_headers=["Mcp-Session-Id"],
338
+ )
339
+ middleware = [cors_middleware, *middleware]
340
+ transport_kwargs["middleware"] = middleware
341
+ logger.info("Added CORS middleware for browser compatibility")
342
+
319
343
  try:
320
344
  await super().run_async(
321
345
  transport=transport, show_banner=show_banner, **transport_kwargs
@@ -506,9 +530,11 @@ class MCPServer(FastMCP):
506
530
  return str(obj)
507
531
 
508
532
  serialized = serialize_obj(result)
509
- return JSONResponse({"success": True, "result": serialized})
533
+ # Return the serialized CallToolResult directly (no wrapper)
534
+ return JSONResponse(serialized)
510
535
  except Exception as e:
511
- return JSONResponse({"success": False, "error": str(e)}, status_code=400)
536
+ # Return a simple error object
537
+ return JSONResponse({"error": str(e)}, status_code=400)
512
538
 
513
539
  return tool_endpoint
514
540
 
hud/settings.py CHANGED
@@ -70,6 +70,12 @@ class Settings(BaseSettings):
70
70
  validation_alias="HUD_RL_URL",
71
71
  )
72
72
 
73
+ hud_api_url: str = Field(
74
+ default="https://api.hud.so",
75
+ description="Base URL for the HUD API server",
76
+ validation_alias="HUD_API_URL",
77
+ )
78
+
73
79
  api_key: str | None = Field(
74
80
  default=None,
75
81
  description="API key for authentication with the HUD API",
@@ -81,14 +81,16 @@ class AsyncTrace:
81
81
  attrs: dict[str, Any] | None = None,
82
82
  job_id: str | None = None,
83
83
  task_id: str | None = None,
84
+ group_id: str | None = None,
84
85
  ) -> None:
85
86
  self.name = name
86
87
  self.root = root
87
88
  self.attrs = attrs or {}
88
89
  self.job_id = job_id
89
90
  self.task_id = task_id
91
+ self.group_id = group_id
90
92
  self.task_run_id = str(uuid.uuid4())
91
- self.trace_obj = Trace(self.task_run_id, name, job_id, task_id)
93
+ self.trace_obj = Trace(self.task_run_id, name, job_id, task_id, group_id)
92
94
  self._otel_trace = None
93
95
 
94
96
  async def __aenter__(self) -> Trace:
@@ -104,6 +106,7 @@ class AsyncTrace:
104
106
  attributes=self.attrs,
105
107
  job_id=self.job_id,
106
108
  task_id=self.task_id,
109
+ group_id=self.group_id,
107
110
  )
108
111
  self._otel_trace.__enter__()
109
112
 
@@ -116,6 +119,7 @@ class AsyncTrace:
116
119
  job_id=self.job_id,
117
120
  trace_name=self.name,
118
121
  task_id=self.task_id,
122
+ group_id=self.group_id,
119
123
  ),
120
124
  name=f"trace-status-{self.task_run_id[:8]}",
121
125
  )
@@ -146,6 +150,7 @@ class AsyncTrace:
146
150
  error_message=str(exc_val) if exc_val else None,
147
151
  trace_name=self.name,
148
152
  task_id=self.task_id,
153
+ group_id=self.group_id,
149
154
  ),
150
155
  name=f"trace-status-{self.task_run_id[:8]}-{status}",
151
156
  )
@@ -264,6 +269,7 @@ def async_trace(
264
269
  attrs: dict[str, Any] | None = None,
265
270
  job_id: str | None = None,
266
271
  task_id: str | None = None,
272
+ group_id: str | None = None,
267
273
  ) -> AsyncTrace:
268
274
  """Create an async trace context for telemetry tracking.
269
275
 
@@ -277,6 +283,7 @@ def async_trace(
277
283
  attrs: Additional attributes to attach to the trace
278
284
  job_id: Optional job ID to associate with this trace
279
285
  task_id: Optional task ID for custom task identifiers
286
+ group_id: Optional group ID to associate with this trace
280
287
 
281
288
  Returns:
282
289
  AsyncTrace context manager
@@ -292,7 +299,14 @@ def async_trace(
292
299
  Use this async version only in high-concurrency scenarios (200+ parallel
293
300
  tasks) or when writing custom async evaluation frameworks.
294
301
  """
295
- return AsyncTrace(name, root=root, attrs=attrs, job_id=job_id, task_id=task_id)
302
+ return AsyncTrace(
303
+ name,
304
+ root=root,
305
+ attrs=attrs,
306
+ job_id=job_id,
307
+ task_id=task_id,
308
+ group_id=group_id if group_id else str(uuid.uuid4()),
309
+ )
296
310
 
297
311
 
298
312
  def async_job(
hud/telemetry/trace.py CHANGED
@@ -34,11 +34,13 @@ class Trace:
34
34
  name: str,
35
35
  job_id: str | None = None,
36
36
  task_id: str | None = None,
37
+ group_id: str | None = None,
37
38
  ) -> None:
38
39
  self.id = trace_id
39
40
  self.name = name
40
41
  self.job_id = job_id
41
42
  self.task_id = task_id
43
+ self.group_id = group_id
42
44
  self.created_at = datetime.now(UTC)
43
45
 
44
46
  async def log(self, metrics: dict[str, Any]) -> None:
@@ -93,6 +95,7 @@ def trace(
93
95
  attrs: dict[str, Any] | None = None,
94
96
  job_id: str | None = None,
95
97
  task_id: str | None = None,
98
+ group_id: str | None = None,
96
99
  ) -> Generator[Trace, None, None]:
97
100
  """Start a HUD trace context for telemetry tracking.
98
101
 
@@ -104,6 +107,7 @@ def trace(
104
107
  attrs: Additional attributes to attach to the trace
105
108
  job_id: Optional job ID to associate with this trace
106
109
  task_id: Optional task ID (for custom task identifiers)
110
+ group_id: Optional group ID to associate with this trace
107
111
 
108
112
  Yields:
109
113
  Trace: The trace object with logging capabilities
@@ -143,7 +147,7 @@ def trace(
143
147
  task_run_id = str(uuid.uuid4())
144
148
 
145
149
  # Create trace object
146
- trace_obj = Trace(task_run_id, name, job_id, task_id)
150
+ trace_obj = Trace(task_run_id, name, job_id, task_id, group_id)
147
151
 
148
152
  # Delegate to OpenTelemetry implementation
149
153
  with OtelTrace(
@@ -153,5 +157,6 @@ def trace(
153
157
  attributes=attrs or {},
154
158
  job_id=job_id,
155
159
  task_id=task_id,
160
+ group_id=group_id,
156
161
  ):
157
162
  yield trace_obj
hud/utils/group_eval.py CHANGED
@@ -60,6 +60,13 @@ async def run_tasks_grouped(
60
60
  # Run all episodes, respecting max_parallel_episodes
61
61
  all_traces = []
62
62
 
63
+ # Generate group_ids for each unique task
64
+ import uuid
65
+
66
+ task_group_ids = {}
67
+ for i in range(len(tasks)):
68
+ task_group_ids[i] = str(uuid.uuid4())
69
+
63
70
  for batch_start in range(0, len(grouped_tasks), max_parallel_episodes):
64
71
  batch_end = min(batch_start + max_parallel_episodes, len(grouped_tasks))
65
72
  batch = grouped_tasks[batch_start:batch_end]
@@ -80,7 +87,9 @@ async def run_tasks_grouped(
80
87
 
81
88
  # Run the task
82
89
  trace_name = f"Eval | {task.id if hasattr(task, 'id') else 'Task'} | Group {task_mapping[idx]}" # noqa: E501
83
- with hud.trace(trace_name, job_id=job_id):
90
+ # Use the group_id for this specific task
91
+ task_group_id = task_group_ids[task_mapping[idx]]
92
+ with hud.trace(trace_name, job_id=job_id, group_id=task_group_id):
84
93
  result = await agent.run(task, max_steps=max_steps)
85
94
  return result
86
95
 
@@ -106,7 +115,7 @@ async def run_tasks_grouped(
106
115
  hud_console.info(f"Completed batch: {len(all_traces)}/{len(grouped_tasks)} episodes")
107
116
 
108
117
  # Group results back by original task and calculate statistics
109
- return calculate_group_statistics(tasks, all_traces, task_mapping, group_size)
118
+ return calculate_group_statistics(tasks, all_traces, task_mapping, group_size, task_group_ids)
110
119
 
111
120
 
112
121
  def calculate_group_statistics(
@@ -114,6 +123,7 @@ def calculate_group_statistics(
114
123
  traces: list[Trace],
115
124
  task_mapping: list[int],
116
125
  group_size: int,
126
+ task_group_ids: dict[int, str] | None = None,
117
127
  ) -> list[dict[str, Any]]:
118
128
  """
119
129
  Calculate statistics for each group, similar to preprocess_advantages.
@@ -123,6 +133,7 @@ def calculate_group_statistics(
123
133
  traces: All traces from grouped runs
124
134
  task_mapping: Mapping of trace index to task index
125
135
  group_size: Number of runs per task
136
+ task_group_ids: Dict mapping task index to group ID
126
137
 
127
138
  Returns:
128
139
  List of statistics for each task
@@ -147,6 +158,7 @@ def calculate_group_statistics(
147
158
  else f"task_{task_idx}",
148
159
  "prompt": task.prompt if isinstance(task, Task) else task.get("prompt", ""),
149
160
  "group_size": group_size,
161
+ "group_id": task_group_ids.get(task_idx) if task_group_ids else None,
150
162
  "rewards": rewards.tolist(),
151
163
  "mean_reward": float(np.mean(rewards)),
152
164
  "std_reward": float(np.std(rewards)) if len(rewards) > 1 else 0.0,
@@ -11,7 +11,8 @@ def test_create_openai_agent():
11
11
  api_key="test_key", model_name="test_model", completion_kwargs={"temperature": 0.5}
12
12
  )
13
13
  assert isinstance(agent, GenericOpenAIChatAgent)
14
- assert agent.model_name == "test_model"
14
+ assert agent.model_name == "GenericOpenAI"
15
+ assert agent.checkpoint_name == "test_model"
15
16
  assert agent.completion_kwargs["temperature"] == 0.5
16
17
 
17
18
 
@@ -5,4 +5,4 @@ def test_import():
5
5
  """Test that the package can be imported."""
6
6
  import hud
7
7
 
8
- assert hud.__version__ == "0.4.54"
8
+ assert hud.__version__ == "0.4.56"
hud/version.py CHANGED
@@ -4,4 +4,4 @@ Version information for the HUD SDK.
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
- __version__ = "0.4.54"
7
+ __version__ = "0.4.56"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hud-python
3
- Version: 0.4.54
3
+ Version: 0.4.56
4
4
  Summary: SDK for the HUD platform.
5
5
  Project-URL: Homepage, https://github.com/hud-evals/hud-python
6
6
  Project-URL: Bug Tracker, https://github.com/hud-evals/hud-python/issues
@@ -1,42 +1,44 @@
1
1
  hud/__init__.py,sha256=0LQ9PyuU6yZx7Fxu8YJXKC1i3TTHjg3UrInThh759QE,653
2
2
  hud/__main__.py,sha256=YR8Dq8OhINOsVfQ55PmRXXg4fEK84Rt_-rMtJ5rvhWo,145
3
- hud/settings.py,sha256=disObWa-DgXzoDcCDp3y1dTPaNsbR0IvoMJL9Eg4zyo,3947
3
+ hud/settings.py,sha256=9SPEZcsZGqplw_LuV8RvJisDRdlsbQgxBqG8ifmjGNc,4117
4
4
  hud/types.py,sha256=jeC1npyPlno5CYNWBWH06Kxw7VMJld9YLEFBFNtjwoI,11608
5
- hud/version.py,sha256=AIcq2BYt_r2gb8EF7t-Q889SmH1TahNGoo-S6PTNnQE,105
5
+ hud/version.py,sha256=5r7gUjXhMnfdXi42tFi9IN4DXbsCYx9soTL0r3ID9IE,105
6
6
  hud/agents/__init__.py,sha256=UoIkljWdbq4bM0LD-mSaw6w826EqdEjOk7r6glNYwYQ,286
7
- hud/agents/base.py,sha256=ojQmBDICQNmXa_cw4DC_fQo5OSrbHm-aruVtZ4Yq8KY,32092
8
- hud/agents/claude.py,sha256=0zje6de9_H-QlyDf05BnvtwoLPFnYgXhHgQGEAjwktU,16006
7
+ hud/agents/base.py,sha256=nRRnK_kA_PZDT0fepMMTz3QDTHj0jpqvbTqdgRPKSlg,32514
8
+ hud/agents/claude.py,sha256=Lf7p_h5H4sd2w16ZNc2ru3xuxNP7IDeFayrcdePOLSE,16030
9
9
  hud/agents/grounded_openai.py,sha256=UC_Z0BP1fvThB95cCYqvMgaQLYXFYB_8zlawwIphruY,11247
10
10
  hud/agents/langchain.py,sha256=1EgCy8jfjunsWxlPC5XfvfLS6_XZVrIF1ZjtHcrvhYw,9584
11
11
  hud/agents/lite_llm.py,sha256=RW_VcMB-NIsxSfVhiQ2tvXSNQp3rTQg5h5Ax1b56bP0,2238
12
- hud/agents/openai.py,sha256=O1xV1h1l-W8lmnmXqTYr5CwnmnaniMqOxAZbl2CTTng,14576
13
- hud/agents/openai_chat_generic.py,sha256=ucSmneOWmjSiGl259a01eJX7zISSElryEOiJFZr8_CI,12710
12
+ hud/agents/openai.py,sha256=FgkX2Kz6pOAFEWC0TohfsNPwm7G4m5Ev5Toz8pTY27I,14606
13
+ hud/agents/openai_chat_generic.py,sha256=AG_f4pkYrmtVgu2CKmTBmQQnsQ07z1m2Im4m2IBbiAU,12762
14
+ hud/agents/utils.py,sha256=qqT1Of4xZIRfMmdqMhbKcu5tS7HauIwRx3jDK9lgyeM,1409
14
15
  hud/agents/misc/__init__.py,sha256=LbVpHl2bDtheGPixbRRKsEjujwzmrXs7sCS8u1sYfAk,219
15
16
  hud/agents/misc/integration_test_agent.py,sha256=MYHsynQ_fooexxSGU_tN_zcQEUMrVCnlrdr6_KIj_Vw,2093
16
17
  hud/agents/misc/response_agent.py,sha256=uMuRDkz5QgaMQliNzBRepond5sb7KyqIiKm3LstjVnw,3753
17
18
  hud/agents/tests/__init__.py,sha256=W-O-_4i34d9TTyEHV-O_q1Ai1gLhzwDaaPo02_TWQIY,34
18
19
  hud/agents/tests/test_base.py,sha256=VvsEYMPlhV0FA0S1DHA__xSFKNJfS6_wD1lZhhNHD5g,28927
19
20
  hud/agents/tests/test_base_runtime.py,sha256=aCOtTCRpJ76TCEvkL5cvEjJGx4hafAqhSf-lLQM0cKw,5766
20
- hud/agents/tests/test_claude.py,sha256=0nZnfsbGoECvsLPdmaRnc9jVmrehVvc3kxeyiCQI2Cc,13807
21
+ hud/agents/tests/test_claude.py,sha256=YsI2TV87Sex2BJsLaO2l99WEL3PL3OhQDlTwUHn04w8,13775
21
22
  hud/agents/tests/test_client.py,sha256=uikgh6yhjPPX2RBU4XJQMz1mNox9uXjuwsP8t93id18,13337
22
23
  hud/agents/tests/test_grounded_openai_agent.py,sha256=VK8lUvHIjWicMX00VKPE-FZyjiJqTEhb80MuRRa9fVc,5437
23
- hud/agents/tests/test_openai.py,sha256=dnAFAoBKZf-5dtDpj6UC3q7oZv2tdMFcniPU0emfImw,8020
24
- hud/cli/__init__.py,sha256=DRb6YKCCR8aiTUpTqxlW01TEqeQ5K3JdTEueGMVUkX8,41367
24
+ hud/agents/tests/test_openai.py,sha256=hPkL_ANbkrB_HUwvd4wBONuWomCarhLJQcFRpmwSbEk,8016
25
+ hud/cli/__init__.py,sha256=kfCsHOG94qIkWG_qipPJWEDqgNDG_qgqew4nf3pr8CE,43083
25
26
  hud/cli/__main__.py,sha256=fDH7XITyuDITwSDIVwRso06aouADO0CzTHKqp5TOwJE,143
26
27
  hud/cli/analyze.py,sha256=4u5oYfJMquOjT9PzzRTYVcTZDxDi0ilNP_g532_hpOU,14716
27
- hud/cli/build.py,sha256=dkNPGFytt_X2U6Uhjz6gzgaMtef_-8gF2GdIVCXszII,22766
28
+ hud/cli/build.py,sha256=EV6PsJ08p3mZZkfeUFjZ687ithxKGlUZ66yAF9lvtaI,28780
28
29
  hud/cli/clone.py,sha256=AwVDIuhr8mHb1oT2Af2HrD25SiTdwATpE6zd93vzLgA,6099
29
30
  hud/cli/debug.py,sha256=jtFW8J5F_3rhq1Hf1_SkJ7aLS3wjnyIs_LsC8k5cnzc,14200
30
- hud/cli/dev.py,sha256=m-Y1jemk2kkUPSN176NRtKlaSu8_bQUZMvWSBOifMIQ,22431
31
- hud/cli/eval.py,sha256=qHms8PWiYJzxIWOcNIJyCy3ElXTaX7gEFbcAHDaoUwk,25111
31
+ hud/cli/dev.py,sha256=WXxvhqQ2l5gpplJFWtMKnJYycpLyzNAt6x3y3oLa5mk,25379
32
+ hud/cli/eval.py,sha256=1guW_pNQqFLpF1RylZltBKdXt6iFd_jBNV3Rxy36QRE,29024
32
33
  hud/cli/get.py,sha256=sksKrdzBGZa7ZuSoQkc0haj-CvOGVSSikoVXeaUd3N4,6274
33
- hud/cli/init.py,sha256=Iz0fcE8ao50xChCKwbapTwjAPRY0ZDqV6XHLsvCpRC4,9952
34
+ hud/cli/init.py,sha256=D1NS4PBHxNqsl9hz2VsMTj6HSB_teJgCqsyY77T5lLs,10042
34
35
  hud/cli/list_func.py,sha256=EVi2Vc3Lb3glBNJxFx4MPnZknZ4xmuJz1OFg_dc8a_E,7177
35
36
  hud/cli/pull.py,sha256=XGEZ8n60tbzLQP_8d9h7XYmzyCW0e2-Rkr3_tLG7jvw,12449
36
37
  hud/cli/push.py,sha256=rWJIqHebvp3DchK-00L6G0olD3-klsobLutRW4PP_ts,19488
37
38
  hud/cli/remove.py,sha256=8vGQyXDqgtjz85_vtusoIG8zurH4RHz6z8UMevQRYM4,6861
38
39
  hud/cli/flows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
- hud/cli/flows/tasks.py,sha256=95KyQgrYuZAkhne3O944nXxZVrquD6bR-vNVmrF5Tsg,17208
40
+ hud/cli/flows/dev.py,sha256=Q6vz9KDfeLHvZNs3Kga7PUTMgt_QEm5J98XP9jRKuhM,5220
41
+ hud/cli/flows/tasks.py,sha256=SAQzS53g6vBPMvuEaMRsmkYOJMwvy28RQ-miVmVnP_8,18028
40
42
  hud/cli/rl/__init__.py,sha256=pGx4WGaL-yGdogJNzgEE7BtjFtT4I9CTI_UdCm49h98,5376
41
43
  hud/cli/rl/celebrate.py,sha256=trGEJn3xebexlHwFVKPJKhRujVVV8sy7TQTJvRd2p9A,5947
42
44
  hud/cli/rl/config.py,sha256=A-4WWwAS68GRKx1cP_DJ-NZD_96cFNnGwx0P3pQT1ps,3271
@@ -77,7 +79,7 @@ hud/cli/tests/test_utils.py,sha256=F1E5Rpn3pgJpr-D-n-8UrUqsRfmC1DdAdMLdcBzV2IY,1
77
79
  hud/cli/utils/__init__.py,sha256=L6s0oNzY2LugGp9faodCPnjzM-ZUorUH05-HmYOq5hY,35
78
80
  hud/cli/utils/config.py,sha256=AnsN6FEa8V3jg3EWaqUJN38-UuYC6tVZxPfBb_5LFBs,2652
79
81
  hud/cli/utils/cursor.py,sha256=fy850p0rVp5k_1wwOCI7rK1SggbselJrywFInSQ2gio,3009
80
- hud/cli/utils/docker.py,sha256=SGsBelhvofHBkAyFrwZijENTuy_hLO45Eo9mNw-2XIo,10230
82
+ hud/cli/utils/docker.py,sha256=Mz_3y3Rv_koJmkYVPO5D6R4Cgk6kiyZAM57kpQnvaaI,10362
81
83
  hud/cli/utils/env_check.py,sha256=qs_earFr9RDjnw6V4Fxeqno5ETOKFb8E1WKee3C3P54,7073
82
84
  hud/cli/utils/environment.py,sha256=cxsNwCfwX2PtCHht9xH_Yo5jpcqANf7h0wa3gfiy5tY,4278
83
85
  hud/cli/utils/interactive.py,sha256=sHhTjaImxlwlZ5_DTXb23Jwrjy5oJ7diB-8duhHbImU,16647
@@ -110,7 +112,7 @@ hud/cli/utils/tests/test_source_hash.py,sha256=GGFklT9xrVPMEpPwgiUzr94An66R-nhNn
110
112
  hud/cli/utils/tests/test_tasks.py,sha256=FT4smFGUHaJpZGIqj-yevBH8l9ARCu03RoedGxiLc2M,2624
111
113
  hud/clients/README.md,sha256=XNE3mch95ozDgVqfwCGcrhlHY9CwT1GKfNANNboowto,3826
112
114
  hud/clients/__init__.py,sha256=N5M_gZv4nP7dLRwpAiaqqaxyaLieGW6397FszeG7JGw,364
113
- hud/clients/base.py,sha256=Ywq3CzsWRx1cgwMDUCgSK_N1kxPfFTV7h-8Ah2cxDOw,14215
115
+ hud/clients/base.py,sha256=uvBIjU1K5VZjPtDTG4wk1cV6ysV5gRIAydd5Nke7aqc,14212
114
116
  hud/clients/fastmcp.py,sha256=1xaAg7DwMcwt_GRx2n3OsZaX-UMEQCZCaLDK4cr2HhQ,9178
115
117
  hud/clients/mcp_use.py,sha256=2Pb8bhAEmD9TJYKb-2JbxmyIsh4ttE_pP-kldrt6AH0,14750
116
118
  hud/clients/tests/__init__.py,sha256=sKOtJFFa4mDIXh1U6O8ZUHjigE8CiRMQ2PzJTIBZuVE,33
@@ -139,7 +141,7 @@ hud/native/tests/test_native_init.py,sha256=Z-2dinbQYEkrbCcfBrBOLGdpXtWWOtkfPzp7
139
141
  hud/otel/__init__.py,sha256=ii17ayoWiS5vAhA7UAmZ8TkmP52gs2pWyHsD46-uYbE,1003
140
142
  hud/otel/collector.py,sha256=jLZymZ8r7xt2VDuWexfbnT7PY1-0aiyLMgjBy8KDY1M,4497
141
143
  hud/otel/config.py,sha256=rqw4gaQCqJNEFWO_AfyqwgZVia706qJP0UveNSgDVSg,7037
142
- hud/otel/context.py,sha256=DLP89aGlo-sTO0f4t80EvIXNaXA2FQXdOrlrkWJ6bVU,19102
144
+ hud/otel/context.py,sha256=pk73k0-ISpRdAuwp-2RDxvC85USggKlvzYUyxkf6I84,20403
143
145
  hud/otel/exporters.py,sha256=k0yfUppMbcJ3IfNH3cc_u1hdR54qnnkT7lQjxO3I06g,21470
144
146
  hud/otel/instrumentation.py,sha256=fsFG9W89RdewFDxWKN9Ft4GUb7WbIKpfucTc16WxaZU,5093
145
147
  hud/otel/processors.py,sha256=-gGRbwifplcExDQBLfx_9tqWreDImULJNcENgO9q7VU,4700
@@ -167,7 +169,7 @@ hud/server/__init__.py,sha256=ZTxwhR7tMtSE14i1sONTz5UaMXURW1AYoFZMbWGBviU,134
167
169
  hud/server/context.py,sha256=6bCdSzv1FGyItu9472HbbYef279H7QuMGJDR8EtYg5Y,3210
168
170
  hud/server/low_level.py,sha256=XYs2pOJ9kN4OcJ6ahDmXM5mWkzq5wJLpKFInUYrWEok,4701
169
171
  hud/server/router.py,sha256=T9hLe08-W8SGvO14RfwY3j2zfcvB3lKWS5sR9h_4awM,5343
170
- hud/server/server.py,sha256=7M2tHH4wHsLfIRhbXgZVJTfJjW1cWGjeMPT_-ysVS_M,27096
172
+ hud/server/server.py,sha256=1IRrHar4OUF4llVsqkwwLvIH8EpgpXTN52XbyG-bbBg,28367
171
173
  hud/server/helper/__init__.py,sha256=ZxO8VP3RZEBBp-q65VixuhzQgqEPSVzW0hEY9J9QqDA,116
172
174
  hud/server/tests/__init__.py,sha256=eEYYkxX5Hz9woXVOBJ2H2_CQoEih0vH6nRt3sH2Z8v8,49
173
175
  hud/server/tests/test_add_tool.py,sha256=9Y59LJpow3BQ31Jg7fowhV7nAeyqude9Tap9tEs_vBE,1863
@@ -187,11 +189,11 @@ hud/shared/tests/test_exceptions.py,sha256=66k9Z1zQmYK4yPlG2NC7zggabpCQMFpGqRG3_
187
189
  hud/shared/tests/test_hints.py,sha256=q6UFcfQmPuqTk1ps9xvDm6mZUUiqk1m2kZeLUWbckhw,4851
188
190
  hud/shared/tests/test_requests.py,sha256=nKFcSN1sjrOouVU2xik9lE5Wxapy3EWsO8iIXrM_Sts,9114
189
191
  hud/telemetry/__init__.py,sha256=oYJ9fiaiwUGzfMH0qBixX74uSpAR_hyhl8Y-REjmNak,1396
190
- hud/telemetry/async_context.py,sha256=SjL1VNFdXmy_4t_gIbZslQ1Ea5vYC9Ibv9xeqr9elXw,11139
192
+ hud/telemetry/async_context.py,sha256=H3MBt1vi_ogxUB0U0zSkeO8EqjcU5Iv_04LVQWtTO-E,11550
191
193
  hud/telemetry/instrument.py,sha256=m3u6YK02PTk39Jr4L3se7l-cYyKx0maCaqf5Z5JqWNA,14096
192
194
  hud/telemetry/job.py,sha256=3W9KHLfBR13IYZvll496P9F6a9HUXCthFMY-MJLi7EA,13278
193
195
  hud/telemetry/replay.py,sha256=YW17s314s5Wy6Rl8MXHqg1FU8EF9_XcHBMJI0rrkyS4,2306
194
- hud/telemetry/trace.py,sha256=9zNfLIHM1UwfkUX23LmqUcIGX2hPzfHz_x2_G-DY-NA,5049
196
+ hud/telemetry/trace.py,sha256=Q8ypSKKjjMOV6BdNH65iMnya8ifd2dcOqA9-38Td15Y,5254
195
197
  hud/telemetry/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
196
198
  hud/telemetry/tests/test_async_context.py,sha256=hYQKVZJU36VoM6JbXZ0oEudignbv863LF0EviYT4bWQ,8702
197
199
  hud/telemetry/tests/test_instrument.py,sha256=Y3MuM8RSEdRrjKLx7wFwrGKe1o1mhXwUNzcFAEU_d3c,10234
@@ -244,7 +246,7 @@ hud/tools/tests/test_utils.py,sha256=qaujM1uyTMaKqWIeEgxty5GOFyfSUtrYCEHhmIazoy4
244
246
  hud/utils/__init__.py,sha256=nk9Re6ls2RudAWnAHDWYbLG28AwNF4qMFYf5xQIJhQA,181
245
247
  hud/utils/agent_factories.py,sha256=f5MC13_C3hepxcRpRPSFeGq9wLyOSMEZ1duF3YwUfkI,3124
246
248
  hud/utils/async_utils.py,sha256=5cKrJcnaHV2eJNxeyx0r7fPcdPTDBK7kM9-nLaF51X4,2409
247
- hud/utils/group_eval.py,sha256=6yXEH8ZRKkR4bBy9-QWGmjlm2IbCnTUZppEFbjTvndY,8352
249
+ hud/utils/group_eval.py,sha256=eMXZOO2iSm3xAHYmLxcFSHYvtrn3lF85OWwronQYu3s,8874
248
250
  hud/utils/hud_console.py,sha256=ms2lXk3ZhYNmpGb0Dn902SKJBYfqo8Aa9DzkkC-xGSI,23597
249
251
  hud/utils/mcp.py,sha256=HHCOcYR84wq5JYa1sqC8AacB-Rmir6J8mbodakoj5j8,2892
250
252
  hud/utils/pretty_errors.py,sha256=WGeL4CTHtlA6KgPuV_JSX5l6H4-xbuTp6Y6tw1bkiFg,2430
@@ -254,7 +256,7 @@ hud/utils/tasks.py,sha256=7i36ck84gz1GZxhn9jryMBvKgMmcvLVu1YH5n3Y23-c,4985
254
256
  hud/utils/telemetry.py,sha256=hrVIx2rUjSGyy9IVxTZ_3Jii83PiHjyFRd5ls2whimM,1863
255
257
  hud/utils/tool_shorthand.py,sha256=_haLgK3yazLR2Y0jlEHUUQjw9uZCxi9yTipAwdOAJ70,2148
256
258
  hud/utils/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
257
- hud/utils/tests/test_agent_factories.py,sha256=-Lq9iVucTJeeaOVBRqIWjpFFGXzlymZUfSd665AjC_Q,2057
259
+ hud/utils/tests/test_agent_factories.py,sha256=TJ4XWwj-91KyChSQfPLOLKBRTIYJA_pj47-w8X9_Qdg,2109
258
260
  hud/utils/tests/test_async_utils.py,sha256=RkdSnYErRV3Jn7dfg6CPlcE1RSUL__2B627oIqAyy1s,5945
259
261
  hud/utils/tests/test_init.py,sha256=2QLQSGgyP9wJhOvPCusm_zjJad0qApOZi1BXpxcdHXQ,383
260
262
  hud/utils/tests/test_mcp.py,sha256=rPvwHkRibVAQp1T2DBaXnk8KkXNl4owCenrM7y3xN_s,3951
@@ -263,10 +265,10 @@ hud/utils/tests/test_progress.py,sha256=QSF7Kpi03Ff_l3mAeqW9qs1nhK50j9vBiSobZq7T
263
265
  hud/utils/tests/test_tasks.py,sha256=Rbbm51vZxygyWlhjunFq4IfFPefVB3qevM9_CZSt5w4,5774
264
266
  hud/utils/tests/test_telemetry.py,sha256=5jl7bEx8C8b-FfFUko5pf4UY-mPOR-9HaeL98dGtVHM,2781
265
267
  hud/utils/tests/test_tool_shorthand.py,sha256=1p3j3D0G93OXHqnUXbvTs3G4A8awrPvwhPpLi6YPeOM,5458
266
- hud/utils/tests/test_version.py,sha256=FjFb6awDNb5iotoJTzD342veR9nXG9yxLJnvK2xcve8,160
268
+ hud/utils/tests/test_version.py,sha256=QHrgv-B02epzVPg5ZHHzZOOjcN1W9Ke_8G_eAuDIOGQ,160
267
269
  hud/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
268
- hud_python-0.4.54.dist-info/METADATA,sha256=RWZzj-ZiYrk5j1d_XF7vW-EZ9oMpQ3L0WtxC9WEEEis,22338
269
- hud_python-0.4.54.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
270
- hud_python-0.4.54.dist-info/entry_points.txt,sha256=jJbodNFg1m0-CDofe5AHvB4zKBq7sSdP97-ohaQ3ae4,63
271
- hud_python-0.4.54.dist-info/licenses/LICENSE,sha256=yIzBheVUf86FC1bztAcr7RYWWNxyd3B-UJQ3uddg1HA,1078
272
- hud_python-0.4.54.dist-info/RECORD,,
270
+ hud_python-0.4.56.dist-info/METADATA,sha256=TaKPkp8KGeSYMBAJC85GdqT9liQdn3dcUDHNtl105u4,22338
271
+ hud_python-0.4.56.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
272
+ hud_python-0.4.56.dist-info/entry_points.txt,sha256=jJbodNFg1m0-CDofe5AHvB4zKBq7sSdP97-ohaQ3ae4,63
273
+ hud_python-0.4.56.dist-info/licenses/LICENSE,sha256=yIzBheVUf86FC1bztAcr7RYWWNxyd3B-UJQ3uddg1HA,1078
274
+ hud_python-0.4.56.dist-info/RECORD,,