hud-python 0.4.54__py3-none-any.whl → 0.4.55__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/agents/base.py +8 -0
- hud/agents/claude.py +4 -3
- hud/agents/openai.py +2 -1
- hud/agents/openai_chat_generic.py +3 -2
- hud/agents/tests/test_claude.py +2 -2
- hud/agents/tests/test_openai.py +1 -1
- hud/agents/utils.py +50 -0
- hud/cli/__init__.py +51 -0
- hud/cli/build.py +185 -25
- hud/cli/dev.py +129 -39
- hud/cli/eval.py +99 -1
- hud/cli/flows/dev.py +155 -0
- hud/cli/flows/tasks.py +29 -9
- hud/cli/utils/docker.py +6 -3
- hud/clients/base.py +2 -2
- hud/otel/context.py +42 -1
- hud/server/server.py +29 -3
- hud/settings.py +6 -0
- hud/telemetry/async_context.py +16 -2
- hud/telemetry/trace.py +6 -1
- hud/utils/group_eval.py +14 -2
- hud/utils/tests/test_agent_factories.py +2 -1
- hud/utils/tests/test_version.py +1 -1
- hud/version.py +1 -1
- {hud_python-0.4.54.dist-info → hud_python-0.4.55.dist-info}/METADATA +1 -1
- {hud_python-0.4.54.dist-info → hud_python-0.4.55.dist-info}/RECORD +29 -27
- {hud_python-0.4.54.dist-info → hud_python-0.4.55.dist-info}/WHEEL +0 -0
- {hud_python-0.4.54.dist-info → hud_python-0.4.55.dist-info}/entry_points.txt +0 -0
- {hud_python-0.4.54.dist-info → hud_python-0.4.55.dist-info}/licenses/LICENSE +0 -0
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(
|
|
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
|
-
|
|
533
|
+
# Return the serialized CallToolResult directly (no wrapper)
|
|
534
|
+
return JSONResponse(serialized)
|
|
510
535
|
except Exception as e:
|
|
511
|
-
|
|
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",
|
hud/telemetry/async_context.py
CHANGED
|
@@ -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(
|
|
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
|
-
|
|
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 == "
|
|
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
|
|
hud/utils/tests/test_version.py
CHANGED
hud/version.py
CHANGED
|
@@ -1,34 +1,35 @@
|
|
|
1
1
|
hud/__init__.py,sha256=0LQ9PyuU6yZx7Fxu8YJXKC1i3TTHjg3UrInThh759QE,653
|
|
2
2
|
hud/__main__.py,sha256=YR8Dq8OhINOsVfQ55PmRXXg4fEK84Rt_-rMtJ5rvhWo,145
|
|
3
|
-
hud/settings.py,sha256=
|
|
3
|
+
hud/settings.py,sha256=9SPEZcsZGqplw_LuV8RvJisDRdlsbQgxBqG8ifmjGNc,4117
|
|
4
4
|
hud/types.py,sha256=jeC1npyPlno5CYNWBWH06Kxw7VMJld9YLEFBFNtjwoI,11608
|
|
5
|
-
hud/version.py,sha256=
|
|
5
|
+
hud/version.py,sha256=jqVVlUzl7XJvhSYZPr72AcEfeZuVIlQOak0g9A4T2pE,105
|
|
6
6
|
hud/agents/__init__.py,sha256=UoIkljWdbq4bM0LD-mSaw6w826EqdEjOk7r6glNYwYQ,286
|
|
7
|
-
hud/agents/base.py,sha256=
|
|
8
|
-
hud/agents/claude.py,sha256=
|
|
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=
|
|
13
|
-
hud/agents/openai_chat_generic.py,sha256=
|
|
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=
|
|
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=
|
|
24
|
-
hud/cli/__init__.py,sha256=
|
|
24
|
+
hud/agents/tests/test_openai.py,sha256=hPkL_ANbkrB_HUwvd4wBONuWomCarhLJQcFRpmwSbEk,8016
|
|
25
|
+
hud/cli/__init__.py,sha256=40opKtnXTw6hRBHR-_O6tGC0JJCuf0vdnCKANkzRQ_M,43074
|
|
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=
|
|
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=
|
|
31
|
-
hud/cli/eval.py,sha256=
|
|
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
34
|
hud/cli/init.py,sha256=Iz0fcE8ao50xChCKwbapTwjAPRY0ZDqV6XHLsvCpRC4,9952
|
|
34
35
|
hud/cli/list_func.py,sha256=EVi2Vc3Lb3glBNJxFx4MPnZknZ4xmuJz1OFg_dc8a_E,7177
|
|
@@ -36,7 +37,8 @@ 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/
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
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=
|
|
268
|
+
hud/utils/tests/test_version.py,sha256=7exYM9fHOEAPVMdamu0JY_3OuwbyX1LRBFfTSeoJTSI,160
|
|
267
269
|
hud/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
268
|
-
hud_python-0.4.
|
|
269
|
-
hud_python-0.4.
|
|
270
|
-
hud_python-0.4.
|
|
271
|
-
hud_python-0.4.
|
|
272
|
-
hud_python-0.4.
|
|
270
|
+
hud_python-0.4.55.dist-info/METADATA,sha256=ugBrUCxVYgZ7fZmtNSN8GQSluDRCbXRC_aRrrbW98mE,22338
|
|
271
|
+
hud_python-0.4.55.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
272
|
+
hud_python-0.4.55.dist-info/entry_points.txt,sha256=jJbodNFg1m0-CDofe5AHvB4zKBq7sSdP97-ohaQ3ae4,63
|
|
273
|
+
hud_python-0.4.55.dist-info/licenses/LICENSE,sha256=yIzBheVUf86FC1bztAcr7RYWWNxyd3B-UJQ3uddg1HA,1078
|
|
274
|
+
hud_python-0.4.55.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|