agentinputlab 0.1.0a1__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.
- agentinputlab/__init__.py +28 -0
- agentinputlab/algorithms/__init__.py +6 -0
- agentinputlab/algorithms/acquire/__init__.py +145 -0
- agentinputlab/algorithms/acquire/adaptive_rag/__init__.py +43 -0
- agentinputlab/algorithms/acquire/adaptive_rag/replay.py +367 -0
- agentinputlab/algorithms/acquire/adaptive_rag/runtime.py +1202 -0
- agentinputlab/algorithms/acquire/adaptive_rag_common_support.py +542 -0
- agentinputlab/algorithms/acquire/hyde.py +296 -0
- agentinputlab/algorithms/acquire/hyde_controlled.py +200 -0
- agentinputlab/algorithms/acquire/hyde_external.py +148 -0
- agentinputlab/algorithms/acquire/ircot.py +28 -0
- agentinputlab/algorithms/acquire/ircot_common_support.py +478 -0
- agentinputlab/algorithms/acquire/ircot_native.py +355 -0
- agentinputlab/algorithms/acquire/ircot_replay.py +327 -0
- agentinputlab/algorithms/acquire/qrag/__init__.py +79 -0
- agentinputlab/algorithms/acquire/qrag/bridge.py +828 -0
- agentinputlab/algorithms/acquire/qrag/common_support.py +891 -0
- agentinputlab/algorithms/acquire/qrag/native_axis.py +71 -0
- agentinputlab/algorithms/acquire/qrag/reader_adapter.py +139 -0
- agentinputlab/algorithms/acquire/r2ag/__init__.py +57 -0
- agentinputlab/algorithms/acquire/r2ag/bridge.py +1312 -0
- agentinputlab/algorithms/acquire/r2ag/common_support.py +1029 -0
- agentinputlab/algorithms/acquire/r2ag/socket_runtime.py +255 -0
- agentinputlab/algorithms/clarify/__init__.py +61 -0
- agentinputlab/algorithms/clarify/_structured.py +64 -0
- agentinputlab/algorithms/clarify/active_task_disambiguation.py +371 -0
- agentinputlab/algorithms/clarify/ask_or_assume/__init__.py +17 -0
- agentinputlab/algorithms/clarify/ask_or_assume/monitor.py +410 -0
- agentinputlab/algorithms/clarify/future_turns.py +379 -0
- agentinputlab/algorithms/clarify/udcs.py +255 -0
- agentinputlab/algorithms/clarify/udcs_deterministic.py +196 -0
- agentinputlab/algorithms/curate/__init__.py +65 -0
- agentinputlab/algorithms/curate/acon/__init__.py +27 -0
- agentinputlab/algorithms/curate/acon/common.py +284 -0
- agentinputlab/algorithms/curate/acon/common_support.py +136 -0
- agentinputlab/algorithms/curate/acon/history_bridge.py +309 -0
- agentinputlab/algorithms/curate/acon/observation_bridge.py +290 -0
- agentinputlab/algorithms/curate/llmlingua/__init__.py +30 -0
- agentinputlab/algorithms/curate/llmlingua/adapters.py +537 -0
- agentinputlab/algorithms/curate/llmlingua/budget.py +48 -0
- agentinputlab/algorithms/curate/llmlingua/controlled.py +175 -0
- agentinputlab/algorithms/curate/llmlingua/multilingual.py +105 -0
- agentinputlab/algorithms/curate/llmlingua/span_map.py +167 -0
- agentinputlab/algorithms/curate/recomp/__init__.py +47 -0
- agentinputlab/algorithms/curate/recomp/external.py +1129 -0
- agentinputlab/algorithms/curate/recomp/selective.py +304 -0
- agentinputlab/algorithms/decompose/__init__.py +107 -0
- agentinputlab/algorithms/decompose/decomp/__init__.py +53 -0
- agentinputlab/algorithms/decompose/decomp/common_support.py +478 -0
- agentinputlab/algorithms/decompose/decomp/planner_component.py +199 -0
- agentinputlab/algorithms/decompose/decomp/worker_bridge.py +416 -0
- agentinputlab/algorithms/decompose/llm_compiler/__init__.py +35 -0
- agentinputlab/algorithms/decompose/llm_compiler/bridge.py +520 -0
- agentinputlab/algorithms/decompose/llm_compiler/common_support.py +504 -0
- agentinputlab/algorithms/decompose/plan_and_budget/__init__.py +43 -0
- agentinputlab/algorithms/decompose/plan_and_budget/cached_soft_budget.py +362 -0
- agentinputlab/algorithms/decompose/plan_and_budget/decomposer_component.py +107 -0
- agentinputlab/algorithms/decompose/plan_and_budget/full.py +205 -0
- agentinputlab/algorithms/decompose/plan_and_budget/hard_cap.py +246 -0
- agentinputlab/algorithms/decompose/plan_and_budget/regenerated_soft_budget.py +448 -0
- agentinputlab/algorithms/decompose/plan_and_solve/__init__.py +33 -0
- agentinputlab/algorithms/decompose/plan_and_solve/plan_component.py +192 -0
- agentinputlab/algorithms/decompose/plan_and_solve/ps_prompt.py +127 -0
- agentinputlab/algorithms/decompose/self_ask/__init__.py +27 -0
- agentinputlab/algorithms/decompose/self_ask/loop.py +362 -0
- agentinputlab/algorithms/decompose/self_ask/planner_component.py +117 -0
- agentinputlab/algorithms/reformulate/__init__.py +85 -0
- agentinputlab/algorithms/reformulate/infocqr/__init__.py +40 -0
- agentinputlab/algorithms/reformulate/infocqr/cache_replay.py +362 -0
- agentinputlab/algorithms/reformulate/infocqr/external.py +675 -0
- agentinputlab/algorithms/reformulate/infocqr/student.py +189 -0
- agentinputlab/algorithms/reformulate/query2doc/__init__.py +42 -0
- agentinputlab/algorithms/reformulate/query2doc/controlled_live.py +190 -0
- agentinputlab/algorithms/reformulate/query2doc/models.py +95 -0
- agentinputlab/algorithms/reformulate/query2doc/official_cached.py +335 -0
- agentinputlab/algorithms/reformulate/query2doc/querygym_bridge.py +223 -0
- agentinputlab/algorithms/reformulate/query2doc/querygym_runtime.py +326 -0
- agentinputlab/algorithms/reformulate/reformer/__init__.py +23 -0
- agentinputlab/algorithms/reformulate/reformer/external.py +417 -0
- agentinputlab/algorithms/reformulate/rrr.py +696 -0
- agentinputlab/annotation/__init__.py +5 -0
- agentinputlab/annotation/independent.py +428 -0
- agentinputlab/annotation/server.py +233 -0
- agentinputlab/annotation/static/app.js +121 -0
- agentinputlab/annotation/static/index.html +60 -0
- agentinputlab/annotation/static/review.css +2 -0
- agentinputlab/annotation/static/review.html +10 -0
- agentinputlab/annotation/static/review.js +11 -0
- agentinputlab/annotation/static/styles.css +55 -0
- agentinputlab/annotation/store.py +444 -0
- agentinputlab/api.py +368 -0
- agentinputlab/artifacts/__init__.py +15 -0
- agentinputlab/artifacts/json_file.py +104 -0
- agentinputlab/artifacts/manifest.py +98 -0
- agentinputlab/artifacts/store.py +157 -0
- agentinputlab/backends/__init__.py +98 -0
- agentinputlab/backends/embedding/__init__.py +25 -0
- agentinputlab/backends/embedding/base.py +145 -0
- agentinputlab/backends/embedding/callable.py +75 -0
- agentinputlab/backends/embedding/replay.py +129 -0
- agentinputlab/backends/llm/__init__.py +31 -0
- agentinputlab/backends/llm/base.py +149 -0
- agentinputlab/backends/llm/callable.py +108 -0
- agentinputlab/backends/llm/decomp_completion.py +88 -0
- agentinputlab/backends/llm/final_content_stop.py +72 -0
- agentinputlab/backends/llm/gpt_oss_final_channel.py +84 -0
- agentinputlab/backends/llm/openai_compatible.py +332 -0
- agentinputlab/backends/llm/transformers.py +171 -0
- agentinputlab/backends/retrieval/__init__.py +35 -0
- agentinputlab/backends/retrieval/base.py +50 -0
- agentinputlab/backends/retrieval/dense.py +777 -0
- agentinputlab/backends/retrieval/memory.py +119 -0
- agentinputlab/backends/retrieval/sqlite_fts.py +155 -0
- agentinputlab/backends/user/__init__.py +15 -0
- agentinputlab/backends/user/base.py +66 -0
- agentinputlab/backends/user/callable.py +54 -0
- agentinputlab/backends/user/replay.py +89 -0
- agentinputlab/backends/vector.py +38 -0
- agentinputlab/benchmarks/__init__.py +246 -0
- agentinputlab/benchmarks/acquisition.py +106 -0
- agentinputlab/benchmarks/ale.py +540 -0
- agentinputlab/benchmarks/appworld_ul.py +669 -0
- agentinputlab/benchmarks/assets.py +226 -0
- agentinputlab/benchmarks/base.py +68 -0
- agentinputlab/benchmarks/beir_archive.py +235 -0
- agentinputlab/benchmarks/beir_sample.py +269 -0
- agentinputlab/benchmarks/bfcl_native.py +245 -0
- agentinputlab/benchmarks/bfcl_v3.py +607 -0
- agentinputlab/benchmarks/cache.py +218 -0
- agentinputlab/benchmarks/clariq.py +203 -0
- agentinputlab/benchmarks/data/registry.json +321 -0
- agentinputlab/benchmarks/data/smoke_assets.json +511 -0
- agentinputlab/benchmarks/data/statebench_v0_8_1_task_ids.json +475 -0
- agentinputlab/benchmarks/data/toolsandbox_165848b_scenario_names.json +1 -0
- agentinputlab/benchmarks/execution.py +1111 -0
- agentinputlab/benchmarks/interactive.py +257 -0
- agentinputlab/benchmarks/ir_query.py +204 -0
- agentinputlab/benchmarks/longbench.py +203 -0
- agentinputlab/benchmarks/paired_replay.py +479 -0
- agentinputlab/benchmarks/preprocess.py +2313 -0
- agentinputlab/benchmarks/production.py +236 -0
- agentinputlab/benchmarks/qa.py +963 -0
- agentinputlab/benchmarks/registry.py +110 -0
- agentinputlab/benchmarks/retrieval.py +459 -0
- agentinputlab/benchmarks/runtime.py +509 -0
- agentinputlab/benchmarks/statebench.py +938 -0
- agentinputlab/benchmarks/tau3.py +725 -0
- agentinputlab/benchmarks/toolsandbox.py +626 -0
- agentinputlab/benchmarks/trec_dl_sample.py +263 -0
- agentinputlab/campaign.py +654 -0
- agentinputlab/campaign_runner.py +953 -0
- agentinputlab/cli/__init__.py +6 -0
- agentinputlab/cli/main.py +933 -0
- agentinputlab/connectors/__init__.py +46 -0
- agentinputlab/connectors/knowledge/__init__.py +4 -0
- agentinputlab/connectors/tools/__init__.py +30 -0
- agentinputlab/connectors/tools/base.py +57 -0
- agentinputlab/connectors/tools/mcp.py +222 -0
- agentinputlab/connectors/tools/memory.py +41 -0
- agentinputlab/connectors/tools/openapi.py +695 -0
- agentinputlab/connectors/tools/schema.py +102 -0
- agentinputlab/contracts/__init__.py +91 -0
- agentinputlab/contracts/availability.py +24 -0
- agentinputlab/contracts/dependency.py +58 -0
- agentinputlab/contracts/enums.py +82 -0
- agentinputlab/contracts/errors.py +63 -0
- agentinputlab/contracts/evidence.py +43 -0
- agentinputlab/contracts/intent.py +110 -0
- agentinputlab/contracts/lifecycle.py +164 -0
- agentinputlab/contracts/patch.py +167 -0
- agentinputlab/contracts/serialization.py +93 -0
- agentinputlab/contracts/state.py +127 -0
- agentinputlab/contracts/trace.py +59 -0
- agentinputlab/contracts/worker.py +42 -0
- agentinputlab/core/__init__.py +7 -0
- agentinputlab/data/__init__.py +32 -0
- agentinputlab/data/checksums.py +9 -0
- agentinputlab/data/downloader.py +235 -0
- agentinputlab/data/http.py +171 -0
- agentinputlab/data/index.py +21 -0
- agentinputlab/data/overlap.py +28 -0
- agentinputlab/data/preprocess.py +32 -0
- agentinputlab/data/storage.py +57 -0
- agentinputlab/data/trec_sample.py +427 -0
- agentinputlab/evaluation/__init__.py +5 -0
- agentinputlab/evaluation/outcomes.py +32 -0
- agentinputlab/experiments/__init__.py +278 -0
- agentinputlab/experiments/analysis.py +981 -0
- agentinputlab/experiments/artifacts.py +687 -0
- agentinputlab/experiments/automatic_measurement.py +678 -0
- agentinputlab/experiments/auxiliary_matrix.py +203 -0
- agentinputlab/experiments/bindings.py +430 -0
- agentinputlab/experiments/blueprints.py +147 -0
- agentinputlab/experiments/builders/__init__.py +45 -0
- agentinputlab/experiments/builders/executable_external_payload.py +423 -0
- agentinputlab/experiments/builders/external_process_arena.py +1018 -0
- agentinputlab/experiments/builders/registry_intervention.py +463 -0
- agentinputlab/experiments/cli.py +158 -0
- agentinputlab/experiments/controls.py +340 -0
- agentinputlab/experiments/driver_guard.py +205 -0
- agentinputlab/experiments/drivers/__init__.py +89 -0
- agentinputlab/experiments/drivers/external_arena.py +2908 -0
- agentinputlab/experiments/drivers/method_process.py +662 -0
- agentinputlab/experiments/drivers/parity_process.py +1484 -0
- agentinputlab/experiments/drivers/static_production.py +1574 -0
- agentinputlab/experiments/executor.py +448 -0
- agentinputlab/experiments/loader.py +605 -0
- agentinputlab/experiments/measurement.py +675 -0
- agentinputlab/experiments/paper_analysis.py +1818 -0
- agentinputlab/experiments/parity_identity.py +605 -0
- agentinputlab/experiments/plan.py +277 -0
- agentinputlab/experiments/production_builders.py +3739 -0
- agentinputlab/experiments/readiness.py +432 -0
- agentinputlab/experiments/schema.py +514 -0
- agentinputlab/experiments/secrets.py +177 -0
- agentinputlab/experiments/stateful_analysis.py +1738 -0
- agentinputlab/experiments/transfer_analysis.py +1316 -0
- agentinputlab/experiments/unseen_analysis.py +1025 -0
- agentinputlab/integrations/__init__.py +1 -0
- agentinputlab/integrations/action_space/__init__.py +1 -0
- agentinputlab/integrations/external_workers/__init__.py +76 -0
- agentinputlab/integrations/external_workers/ace.py +431 -0
- agentinputlab/integrations/external_workers/base.py +181 -0
- agentinputlab/integrations/external_workers/decomp_live.py +249 -0
- agentinputlab/integrations/external_workers/decomp_planner.py +30 -0
- agentinputlab/integrations/external_workers/infocqr_student.py +280 -0
- agentinputlab/integrations/external_workers/ircot.py +576 -0
- agentinputlab/integrations/external_workers/llmcompiler_live.py +360 -0
- agentinputlab/integrations/external_workers/longllmlingua.py +162 -0
- agentinputlab/integrations/external_workers/method.py +314 -0
- agentinputlab/integrations/external_workers/process.py +678 -0
- agentinputlab/integrations/external_workers/supervisor.py +1071 -0
- agentinputlab/integrations/full_architecture/__init__.py +1 -0
- agentinputlab/integrations/full_architecture/hyde.py +212 -0
- agentinputlab/integrations/full_architecture/plan_and_budget.py +188 -0
- agentinputlab/integrations/live_history.py +222 -0
- agentinputlab/integrations/prompt_optimization/__init__.py +1 -0
- agentinputlab/integrations/training/__init__.py +1 -0
- agentinputlab/metrics/__init__.py +50 -0
- agentinputlab/metrics/catalog.py +313 -0
- agentinputlab/metrics/harm.py +95 -0
- agentinputlab/metrics/paired.py +40 -0
- agentinputlab/metrics/qa.py +76 -0
- agentinputlab/metrics/text.py +33 -0
- agentinputlab/metrics/third_party.py +161 -0
- agentinputlab/models/__init__.py +4 -0
- agentinputlab/observability/__init__.py +56 -0
- agentinputlab/observability/budget.py +316 -0
- agentinputlab/observability/instrumentation.py +754 -0
- agentinputlab/observability/models.py +403 -0
- agentinputlab/observability/monitor.py +380 -0
- agentinputlab/optimizers/__init__.py +1 -0
- agentinputlab/optimizers/clarify/__init__.py +12 -0
- agentinputlab/optimizers/context/__init__.py +22 -0
- agentinputlab/optimizers/decompose/__init__.py +64 -0
- agentinputlab/optimizers/evidence/__init__.py +22 -0
- agentinputlab/optimizers/rewrite/__init__.py +30 -0
- agentinputlab/parity/__init__.py +5 -0
- agentinputlab/parity/base.py +206 -0
- agentinputlab/production_campaign.py +763 -0
- agentinputlab/py.typed +1 -0
- agentinputlab/recipes/__init__.py +333 -0
- agentinputlab/recipes/ace.py +418 -0
- agentinputlab/recipes/ace_bfcl.py +273 -0
- agentinputlab/recipes/ace_common_support.py +169 -0
- agentinputlab/recipes/ace_native_plan.py +322 -0
- agentinputlab/recipes/ace_online.py +711 -0
- agentinputlab/recipes/ace_retrieval.py +330 -0
- agentinputlab/recipes/ace_statebench.py +382 -0
- agentinputlab/recipes/ace_tau.py +463 -0
- agentinputlab/recipes/ace_toolsandbox.py +432 -0
- agentinputlab/recipes/acon_guideline.py +22 -0
- agentinputlab/recipes/adaptive_rag.py +822 -0
- agentinputlab/recipes/llmlingua2_inference.py +146 -0
- agentinputlab/recipes/llmlingua2_training.py +796 -0
- agentinputlab/recipes/mce.py +1486 -0
- agentinputlab/recipes/mce_final.py +335 -0
- agentinputlab/recipes/mce_text_fit.py +499 -0
- agentinputlab/recipes/mce_text_only.py +298 -0
- agentinputlab/recipes/qrag.py +729 -0
- agentinputlab/recipes/qrag_inference.py +364 -0
- agentinputlab/recipes/r2ag_features.py +236 -0
- agentinputlab/recipes/r2ag_inference.py +503 -0
- agentinputlab/recipes/r2ag_training.py +948 -0
- agentinputlab/recipes/recomp_abstractive.py +592 -0
- agentinputlab/recipes/recomp_extractive.py +525 -0
- agentinputlab/recipes/reformer.py +17 -0
- agentinputlab/recipes/rqrag.py +1516 -0
- agentinputlab/recipes/rqrag_common_support.py +193 -0
- agentinputlab/recipes/rqrag_completion.py +147 -0
- agentinputlab/recipes/skillopt.py +462 -0
- agentinputlab/recipes/skillopt_common_support.py +154 -0
- agentinputlab/recipes/skillopt_environment.py +165 -0
- agentinputlab/recipes/skillopt_environment_cli.py +5 -0
- agentinputlab/recipes/skillopt_retrieval.py +188 -0
- agentinputlab/recipes/smartsearch.py +897 -0
- agentinputlab/recipes/smartsearch_curriculum.py +283 -0
- agentinputlab/recipes/smartsearch_grpo_contracts.py +58 -0
- agentinputlab/recipes/smartsearch_grpo_data.py +314 -0
- agentinputlab/recipes/smartsearch_grpo_meter.py +324 -0
- agentinputlab/recipes/smartsearch_grpo_prefix.py +144 -0
- agentinputlab/recipes/smartsearch_grpo_rollout.py +119 -0
- agentinputlab/recipes/smartsearch_grpo_tools.py +364 -0
- agentinputlab/recipes/smartsearch_grpo_training.py +305 -0
- agentinputlab/recipes/smartsearch_grpo_transport.py +248 -0
- agentinputlab/recipes/smartsearch_grpo_worker.py +364 -0
- agentinputlab/recipes/smartsearch_inference.py +524 -0
- agentinputlab/recipes/smartsearch_native_data.py +172 -0
- agentinputlab/recipes/smartsearch_policy.py +616 -0
- agentinputlab/recipes/smartsearch_policy_worker.py +9 -0
- agentinputlab/recipes/smartsearch_sampling.py +232 -0
- agentinputlab/recipes/smartsearch_teacher.py +203 -0
- agentinputlab/recipes/smartsearch_training.py +265 -0
- agentinputlab/registry/__init__.py +46 -0
- agentinputlab/registry/beta.py +727 -0
- agentinputlab/registry/data/algorithms.json +1959 -0
- agentinputlab/registry/data/auxiliary_method_profiles.json +34 -0
- agentinputlab/registry/loader.py +100 -0
- agentinputlab/registry/result_manifest.py +184 -0
- agentinputlab/registry/runtime.py +195 -0
- agentinputlab/registry/schema.py +449 -0
- agentinputlab/runner/__init__.py +30 -0
- agentinputlab/runner/balance.py +248 -0
- agentinputlab/runner/cache.py +135 -0
- agentinputlab/runner/composite.py +130 -0
- agentinputlab/runner/engine.py +285 -0
- agentinputlab/runner/runtime_guard.py +268 -0
- agentinputlab/runner/worker.py +80 -0
- agentinputlab/runtime_bootstrap.py +288 -0
- agentinputlab/selectors/__init__.py +196 -0
- agentinputlab/selectors/advanced.py +1514 -0
- agentinputlab/selectors/artifacts.py +1087 -0
- agentinputlab/selectors/base.py +112 -0
- agentinputlab/selectors/campaigns.py +1893 -0
- agentinputlab/selectors/catalog.py +86 -0
- agentinputlab/selectors/discovery.py +1860 -0
- agentinputlab/selectors/evaluation.py +1348 -0
- agentinputlab/selectors/features.py +383 -0
- agentinputlab/selectors/learned.py +502 -0
- agentinputlab/selectors/no_op.py +28 -0
- agentinputlab/selectors/outcome_table.py +475 -0
- agentinputlab/selectors/producer.py +853 -0
- agentinputlab/selectors/rules.py +109 -0
- agentinputlab/selectors/runtime.py +420 -0
- agentinputlab/studies/__init__.py +16 -0
- agentinputlab/studies/design.py +165 -0
- agentinputlab/studies/paired.py +322 -0
- agentinputlab/studio/__init__.py +6 -0
- agentinputlab/studio/campaigns.py +819 -0
- agentinputlab/studio/engine.py +1408 -0
- agentinputlab/studio/model_backends.py +425 -0
- agentinputlab/studio/prepared.py +410 -0
- agentinputlab/studio/server.py +613 -0
- agentinputlab/studio/static/app.js +397 -0
- agentinputlab/studio/static/campaigns.html +175 -0
- agentinputlab/studio/static/campaigns.js +426 -0
- agentinputlab/studio/static/index.html +192 -0
- agentinputlab/studio/static/result.html +103 -0
- agentinputlab/studio/static/result.js +273 -0
- agentinputlab/studio/static/styles.css +467 -0
- agentinputlab-0.1.0a1.data/data/share/agentinputlab/CITATION.cff +22 -0
- agentinputlab-0.1.0a1.dist-info/METADATA +392 -0
- agentinputlab-0.1.0a1.dist-info/RECORD +469 -0
- agentinputlab-0.1.0a1.dist-info/WHEEL +5 -0
- agentinputlab-0.1.0a1.dist-info/entry_points.txt +6 -0
- agentinputlab-0.1.0a1.dist-info/licenses/LICENSE +21 -0
- agentinputlab-0.1.0a1.dist-info/licenses/NOTICE +31 -0
- agentinputlab-0.1.0a1.dist-info/licenses/THIRD_PARTY_NOTICES.md +94 -0
- agentinputlab-0.1.0a1.dist-info/top_level.txt +2 -0
- workers/README.md +94 -0
- workers/ace/README.md +261 -0
- workers/ace/__init__.py +1 -0
- workers/ace/compatibility_manifest.json +39 -0
- workers/ace/driver.py +1682 -0
- workers/acon/README.md +215 -0
- workers/acon/__init__.py +5 -0
- workers/acon/compatibility_manifest.json +93 -0
- workers/acon/driver.py +1859 -0
- workers/acon/fitted.py +395 -0
- workers/acon/guideline.py +470 -0
- workers/acon/guideline_source_manifest.json +20 -0
- workers/adaptive_rag/README.md +96 -0
- workers/adaptive_rag/__init__.py +15 -0
- workers/adaptive_rag/compatibility_manifest.json +61 -0
- workers/adaptive_rag/driver.py +1470 -0
- workers/adaptive_rag/fixture_runtime.py +163 -0
- workers/adaptive_rag/runtime.py +252 -0
- workers/ask_or_assume/README.md +124 -0
- workers/ask_or_assume/__init__.py +1 -0
- workers/ask_or_assume/compatibility_manifest.json +36 -0
- workers/ask_or_assume/driver.py +1227 -0
- workers/decomp/README.md +133 -0
- workers/decomp/UPSTREAM_LICENSE.Apache-2.0.txt +201 -0
- workers/decomp/__init__.py +5 -0
- workers/decomp/compatibility_manifest.json +205 -0
- workers/decomp/driver.py +1015 -0
- workers/decomp/live.py +137 -0
- workers/decomp/runtime.py +231 -0
- workers/infocqr/README.md +106 -0
- workers/infocqr/__init__.py +1 -0
- workers/infocqr/compatibility_manifest.json +84 -0
- workers/infocqr/driver.py +1766 -0
- workers/ircot/README.md +167 -0
- workers/ircot/__init__.py +7 -0
- workers/ircot/compatibility_manifest.json +121 -0
- workers/ircot/controlled.py +457 -0
- workers/ircot/driver.py +1373 -0
- workers/ircot/fixture_bindings.json +39 -0
- workers/ircot/fixture_config.json +48 -0
- workers/ircot/fixture_prompt.txt +2 -0
- workers/ircot/native_qa.py +398 -0
- workers/ircot/qa_compatibility_manifest.json +57 -0
- workers/ircot/runtime.py +97 -0
- workers/llmcompiler/README.md +160 -0
- workers/llmcompiler/__init__.py +1 -0
- workers/llmcompiler/compatibility_manifest.json +45 -0
- workers/llmcompiler/driver.py +1514 -0
- workers/llmcompiler/export_prompts.py +74 -0
- workers/llmcompiler/live.py +174 -0
- workers/llmcompiler/patch_manifest.json +147 -0
- workers/mce/README.md +198 -0
- workers/mce/__init__.py +29 -0
- workers/mce/compatibility_manifest.json +115 -0
- workers/mce/driver.py +2585 -0
- workers/mce/final_eval.py +173 -0
- workers/official_arenas/README.md +25 -0
- workers/official_arenas/__init__.py +1 -0
- workers/official_arenas/capture_records.py +110 -0
- workers/official_arenas/driver.py +619 -0
- workers/official_arenas/protocol.py +334 -0
- workers/official_arenas/providers/__init__.py +1 -0
- workers/official_arenas/providers/_live_history.py +228 -0
- workers/official_arenas/providers/_message_compat.py +77 -0
- workers/official_arenas/providers/appworld_ul.py +196 -0
- workers/official_arenas/providers/fixture.py +112 -0
- workers/official_arenas/providers/statebench.py +960 -0
- workers/official_arenas/providers/tau3.py +1672 -0
- workers/official_arenas/providers/tau_retail.py +586 -0
- workers/official_arenas/providers/toolsandbox.py +1321 -0
- workers/official_arenas/providers/tooltalk.py +699 -0
- workers/official_arenas/retail_capture.py +188 -0
- workers/official_arenas/retail_driver.py +275 -0
- workers/qrag/README.md +172 -0
- workers/qrag/__init__.py +1 -0
- workers/qrag/compatibility_manifest.json +64 -0
- workers/qrag/driver.py +673 -0
- workers/r2ag/README.md +154 -0
- workers/r2ag/__init__.py +5 -0
- workers/r2ag/compatibility_manifest.json +55 -0
- workers/r2ag/driver.py +1287 -0
- workers/r2ag/feature_schema.json +8 -0
- workers/r2ag/runtime.py +589 -0
- workers/recomp/README.md +120 -0
- workers/recomp/__init__.py +1 -0
- workers/recomp/compatibility_manifest.json +43 -0
- workers/recomp/driver.py +1653 -0
- workers/reformer/README.md +125 -0
- workers/reformer/__init__.py +1 -0
- workers/reformer/compatibility_manifest.json +68 -0
- workers/reformer/driver.py +1459 -0
- workers/reformer/induction.py +457 -0
- workers/rrr/README.md +126 -0
- workers/rrr/__init__.py +1 -0
- workers/rrr/compatibility_manifest.json +57 -0
- workers/rrr/driver.py +1133 -0
- workers/smartsearch/README.md +331 -0
- workers/smartsearch/__init__.py +1 -0
- workers/smartsearch/compatibility_manifest.json +41 -0
- workers/smartsearch/driver.py +1643 -0
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
"""Stable run-observability records shared by CLI, Studio, and experiments."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import math
|
|
6
|
+
from collections.abc import Mapping
|
|
7
|
+
from dataclasses import dataclass, field
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from agentinputlab.contracts.enums import StrEnum
|
|
11
|
+
from agentinputlab.contracts.errors import ValidationError
|
|
12
|
+
from agentinputlab.contracts.serialization import content_hash, freeze_mapping, to_jsonable
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class EventKind(StrEnum):
|
|
16
|
+
RUN_STARTED = "run_started"
|
|
17
|
+
RUN_FINISHED = "run_finished"
|
|
18
|
+
STAGE_STARTED = "stage_started"
|
|
19
|
+
STAGE_FINISHED = "stage_finished"
|
|
20
|
+
USAGE_RECORDED = "usage_recorded"
|
|
21
|
+
BUDGET_EXCEEDED = "budget_exceeded"
|
|
22
|
+
INTENT_CHECKED = "intent_checked"
|
|
23
|
+
FAILURE_RECORDED = "failure_recorded"
|
|
24
|
+
RESOURCE_RECEIPT_RECORDED = "resource_receipt_recorded"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class ObservedRunStatus(StrEnum):
|
|
28
|
+
RUNNING = "running"
|
|
29
|
+
SUCCEEDED = "succeeded"
|
|
30
|
+
FAILED = "failed"
|
|
31
|
+
CANCELLED = "cancelled"
|
|
32
|
+
BUDGET_EXHAUSTED = "budget_exhausted"
|
|
33
|
+
INTENT_REJECTED = "intent_rejected"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class ResourceExitReason(StrEnum):
|
|
37
|
+
"""Supervisor-classified reason that a worker process stopped."""
|
|
38
|
+
|
|
39
|
+
COMPLETED = "completed"
|
|
40
|
+
NONZERO_EXIT = "nonzero_exit"
|
|
41
|
+
TIMED_OUT = "timed_out"
|
|
42
|
+
OOM_KILLED = "oom_killed"
|
|
43
|
+
STARTUP_FAILED = "startup_failed"
|
|
44
|
+
SUPERVISOR_ERROR = "supervisor_error"
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@dataclass(frozen=True, slots=True)
|
|
48
|
+
class ResourceLimits:
|
|
49
|
+
"""Hard execution limits requested from a worker supervisor.
|
|
50
|
+
|
|
51
|
+
``cpus`` is a CPU quota (for example Docker ``--cpus``), not a measured
|
|
52
|
+
duration. ``wall_timeout_seconds`` remains a hard elapsed-time deadline.
|
|
53
|
+
Optional limits are never treated as enforced unless a supervisor records
|
|
54
|
+
the matching :attr:`limit_hash` in its receipt.
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
wall_timeout_seconds: float = 300.0
|
|
58
|
+
memory_bytes: int | None = None
|
|
59
|
+
cpus: float | None = None
|
|
60
|
+
pids_limit: int | None = None
|
|
61
|
+
|
|
62
|
+
def __post_init__(self) -> None:
|
|
63
|
+
if (
|
|
64
|
+
isinstance(self.wall_timeout_seconds, bool)
|
|
65
|
+
or not isinstance(self.wall_timeout_seconds, (int, float))
|
|
66
|
+
or not math.isfinite(self.wall_timeout_seconds)
|
|
67
|
+
or self.wall_timeout_seconds <= 0
|
|
68
|
+
):
|
|
69
|
+
raise ValidationError("wall_timeout_seconds must be finite and positive")
|
|
70
|
+
if self.memory_bytes is not None and (
|
|
71
|
+
isinstance(self.memory_bytes, bool)
|
|
72
|
+
or not isinstance(self.memory_bytes, int)
|
|
73
|
+
or self.memory_bytes <= 0
|
|
74
|
+
):
|
|
75
|
+
raise ValidationError("memory_bytes must be a positive integer when provided")
|
|
76
|
+
if self.cpus is not None and (
|
|
77
|
+
isinstance(self.cpus, bool)
|
|
78
|
+
or not isinstance(self.cpus, (int, float))
|
|
79
|
+
or not math.isfinite(self.cpus)
|
|
80
|
+
or self.cpus <= 0
|
|
81
|
+
):
|
|
82
|
+
raise ValidationError("cpus must be finite and positive when provided")
|
|
83
|
+
if self.pids_limit is not None and (
|
|
84
|
+
isinstance(self.pids_limit, bool)
|
|
85
|
+
or not isinstance(self.pids_limit, int)
|
|
86
|
+
or self.pids_limit <= 0
|
|
87
|
+
):
|
|
88
|
+
raise ValidationError("pids_limit must be a positive integer when provided")
|
|
89
|
+
object.__setattr__(self, "wall_timeout_seconds", float(self.wall_timeout_seconds))
|
|
90
|
+
if self.cpus is not None:
|
|
91
|
+
object.__setattr__(self, "cpus", float(self.cpus))
|
|
92
|
+
|
|
93
|
+
@property
|
|
94
|
+
def limit_hash(self) -> str:
|
|
95
|
+
"""Content identity of exactly the limits a supervisor must enforce."""
|
|
96
|
+
|
|
97
|
+
return content_hash(self.as_dict())
|
|
98
|
+
|
|
99
|
+
def as_dict(self) -> dict[str, Any]:
|
|
100
|
+
return to_jsonable(self)
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
@dataclass(frozen=True, slots=True)
|
|
104
|
+
class AcceleratorSample:
|
|
105
|
+
"""Optional accelerator accounting returned by a sampler.
|
|
106
|
+
|
|
107
|
+
``accelerator_seconds`` means device-seconds summed across devices. A
|
|
108
|
+
sampler with utilization data should integrate utilization fraction over
|
|
109
|
+
wall time; an allocation-only sampler may report allocated devices times
|
|
110
|
+
wall time, but must identify that measurement mode in ``sampler_identity``.
|
|
111
|
+
Thus two allocated devices for three seconds are six accelerator-seconds.
|
|
112
|
+
|
|
113
|
+
``None`` means the measurement was unavailable. It is intentionally
|
|
114
|
+
distinct from a measured zero. Peak device memory is likewise optional and
|
|
115
|
+
non-additive.
|
|
116
|
+
"""
|
|
117
|
+
|
|
118
|
+
accelerator_seconds: float | None = None
|
|
119
|
+
accelerator_peak_memory_bytes: int | None = None
|
|
120
|
+
sampler_identity: Mapping[str, Any] = field(
|
|
121
|
+
default_factory=lambda: {
|
|
122
|
+
"status": "unavailable",
|
|
123
|
+
"reason": "not_configured",
|
|
124
|
+
}
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
def __post_init__(self) -> None:
|
|
128
|
+
if self.accelerator_seconds is not None:
|
|
129
|
+
if (
|
|
130
|
+
isinstance(self.accelerator_seconds, bool)
|
|
131
|
+
or not isinstance(self.accelerator_seconds, (int, float))
|
|
132
|
+
or not math.isfinite(self.accelerator_seconds)
|
|
133
|
+
or self.accelerator_seconds < 0
|
|
134
|
+
):
|
|
135
|
+
raise ValidationError(
|
|
136
|
+
"accelerator_seconds must be finite and non-negative when provided"
|
|
137
|
+
)
|
|
138
|
+
object.__setattr__(
|
|
139
|
+
self,
|
|
140
|
+
"accelerator_seconds",
|
|
141
|
+
float(self.accelerator_seconds),
|
|
142
|
+
)
|
|
143
|
+
if self.accelerator_peak_memory_bytes is not None and (
|
|
144
|
+
isinstance(self.accelerator_peak_memory_bytes, bool)
|
|
145
|
+
or not isinstance(self.accelerator_peak_memory_bytes, int)
|
|
146
|
+
or self.accelerator_peak_memory_bytes < 0
|
|
147
|
+
):
|
|
148
|
+
raise ValidationError(
|
|
149
|
+
"accelerator_peak_memory_bytes must be a non-negative integer when provided"
|
|
150
|
+
)
|
|
151
|
+
if not self.sampler_identity:
|
|
152
|
+
raise ValidationError("accelerator samples require sampler identity")
|
|
153
|
+
identity = dict(self.sampler_identity)
|
|
154
|
+
status = identity.get("status")
|
|
155
|
+
measured = (
|
|
156
|
+
self.accelerator_seconds is not None or self.accelerator_peak_memory_bytes is not None
|
|
157
|
+
)
|
|
158
|
+
if status is None:
|
|
159
|
+
status = "available" if measured else "unavailable"
|
|
160
|
+
identity["status"] = status
|
|
161
|
+
if not measured:
|
|
162
|
+
identity.setdefault("reason", "sampler_did_not_report")
|
|
163
|
+
if status not in {"available", "unavailable"}:
|
|
164
|
+
raise ValidationError("accelerator sampler status must be available or unavailable")
|
|
165
|
+
if status == "unavailable" and measured:
|
|
166
|
+
raise ValidationError("unavailable accelerator samples cannot contain measured values")
|
|
167
|
+
if status == "available" and not measured:
|
|
168
|
+
raise ValidationError(
|
|
169
|
+
"available accelerator samples require seconds or peak-memory evidence"
|
|
170
|
+
)
|
|
171
|
+
object.__setattr__(self, "sampler_identity", freeze_mapping(identity))
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
@dataclass(frozen=True, slots=True)
|
|
175
|
+
class ResourceReceipt:
|
|
176
|
+
"""Immutable, non-additive execution evidence from one supervisor call.
|
|
177
|
+
|
|
178
|
+
Peak memory belongs here rather than in :class:`ResourceUsage`: peaks do
|
|
179
|
+
not compose by addition. CPU and accelerator durations may separately be
|
|
180
|
+
reconciled into additive usage by the caller, but this receipt is retained
|
|
181
|
+
verbatim for audit.
|
|
182
|
+
"""
|
|
183
|
+
|
|
184
|
+
limit_hash: str
|
|
185
|
+
wall_seconds: float
|
|
186
|
+
supervisor_identity: Mapping[str, Any]
|
|
187
|
+
image_identity: Mapping[str, Any]
|
|
188
|
+
cpu_seconds: float | None = None
|
|
189
|
+
peak_rss_bytes: int | None = None
|
|
190
|
+
accelerator_seconds: float | None = None
|
|
191
|
+
accelerator_peak_memory_bytes: int | None = None
|
|
192
|
+
oom_killed: bool = False
|
|
193
|
+
timed_out: bool = False
|
|
194
|
+
exit_reason: ResourceExitReason = ResourceExitReason.COMPLETED
|
|
195
|
+
exit_code: int | None = None
|
|
196
|
+
|
|
197
|
+
def __post_init__(self) -> None:
|
|
198
|
+
if (
|
|
199
|
+
not isinstance(self.limit_hash, str)
|
|
200
|
+
or len(self.limit_hash) != 64
|
|
201
|
+
or any(character not in "0123456789abcdef" for character in self.limit_hash)
|
|
202
|
+
):
|
|
203
|
+
raise ValidationError("limit_hash must be a lowercase SHA-256 hex digest")
|
|
204
|
+
if (
|
|
205
|
+
isinstance(self.wall_seconds, bool)
|
|
206
|
+
or not isinstance(self.wall_seconds, (int, float))
|
|
207
|
+
or not math.isfinite(self.wall_seconds)
|
|
208
|
+
or self.wall_seconds < 0
|
|
209
|
+
):
|
|
210
|
+
raise ValidationError("wall_seconds must be finite and non-negative")
|
|
211
|
+
if self.cpu_seconds is not None and (
|
|
212
|
+
isinstance(self.cpu_seconds, bool)
|
|
213
|
+
or not isinstance(self.cpu_seconds, (int, float))
|
|
214
|
+
or not math.isfinite(self.cpu_seconds)
|
|
215
|
+
or self.cpu_seconds < 0
|
|
216
|
+
):
|
|
217
|
+
raise ValidationError("cpu_seconds must be finite and non-negative when provided")
|
|
218
|
+
if self.peak_rss_bytes is not None and (
|
|
219
|
+
isinstance(self.peak_rss_bytes, bool)
|
|
220
|
+
or not isinstance(self.peak_rss_bytes, int)
|
|
221
|
+
or self.peak_rss_bytes < 0
|
|
222
|
+
):
|
|
223
|
+
raise ValidationError("peak_rss_bytes must be a non-negative integer when provided")
|
|
224
|
+
if self.accelerator_seconds is not None and (
|
|
225
|
+
isinstance(self.accelerator_seconds, bool)
|
|
226
|
+
or not isinstance(self.accelerator_seconds, (int, float))
|
|
227
|
+
or not math.isfinite(self.accelerator_seconds)
|
|
228
|
+
or self.accelerator_seconds < 0
|
|
229
|
+
):
|
|
230
|
+
raise ValidationError(
|
|
231
|
+
"accelerator_seconds must be finite and non-negative when provided"
|
|
232
|
+
)
|
|
233
|
+
if self.accelerator_peak_memory_bytes is not None and (
|
|
234
|
+
isinstance(self.accelerator_peak_memory_bytes, bool)
|
|
235
|
+
or not isinstance(self.accelerator_peak_memory_bytes, int)
|
|
236
|
+
or self.accelerator_peak_memory_bytes < 0
|
|
237
|
+
):
|
|
238
|
+
raise ValidationError(
|
|
239
|
+
"accelerator_peak_memory_bytes must be a non-negative integer when provided"
|
|
240
|
+
)
|
|
241
|
+
if not isinstance(self.oom_killed, bool) or not isinstance(self.timed_out, bool):
|
|
242
|
+
raise ValidationError("oom_killed and timed_out must be booleans")
|
|
243
|
+
if isinstance(self.exit_code, bool) or (
|
|
244
|
+
self.exit_code is not None and not isinstance(self.exit_code, int)
|
|
245
|
+
):
|
|
246
|
+
raise ValidationError("exit_code must be an integer or null")
|
|
247
|
+
if not isinstance(self.exit_reason, ResourceExitReason):
|
|
248
|
+
try:
|
|
249
|
+
object.__setattr__(self, "exit_reason", ResourceExitReason(self.exit_reason))
|
|
250
|
+
except (TypeError, ValueError) as exc:
|
|
251
|
+
raise ValidationError("exit_reason is not recognized") from exc
|
|
252
|
+
if self.timed_out is not (self.exit_reason is ResourceExitReason.TIMED_OUT):
|
|
253
|
+
raise ValidationError("timed_out must match exit_reason='timed_out'")
|
|
254
|
+
if self.oom_killed is not (self.exit_reason is ResourceExitReason.OOM_KILLED):
|
|
255
|
+
raise ValidationError("oom_killed must match exit_reason='oom_killed'")
|
|
256
|
+
if self.timed_out and self.oom_killed:
|
|
257
|
+
raise ValidationError("a receipt cannot be both timed out and OOM-killed")
|
|
258
|
+
if self.exit_reason is ResourceExitReason.COMPLETED and self.exit_code not in (None, 0):
|
|
259
|
+
raise ValidationError("completed receipts cannot have a non-zero exit_code")
|
|
260
|
+
if self.exit_reason is ResourceExitReason.NONZERO_EXIT and self.exit_code in (None, 0):
|
|
261
|
+
raise ValidationError("nonzero_exit receipts require a non-zero exit_code")
|
|
262
|
+
if not self.supervisor_identity or not self.image_identity:
|
|
263
|
+
raise ValidationError("resource receipts require supervisor and image identity")
|
|
264
|
+
object.__setattr__(self, "wall_seconds", float(self.wall_seconds))
|
|
265
|
+
if self.cpu_seconds is not None:
|
|
266
|
+
object.__setattr__(self, "cpu_seconds", float(self.cpu_seconds))
|
|
267
|
+
if self.accelerator_seconds is not None:
|
|
268
|
+
object.__setattr__(
|
|
269
|
+
self,
|
|
270
|
+
"accelerator_seconds",
|
|
271
|
+
float(self.accelerator_seconds),
|
|
272
|
+
)
|
|
273
|
+
object.__setattr__(
|
|
274
|
+
self,
|
|
275
|
+
"supervisor_identity",
|
|
276
|
+
freeze_mapping(self.supervisor_identity),
|
|
277
|
+
)
|
|
278
|
+
object.__setattr__(self, "image_identity", freeze_mapping(self.image_identity))
|
|
279
|
+
|
|
280
|
+
def as_dict(self) -> dict[str, Any]:
|
|
281
|
+
return to_jsonable(self)
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
@dataclass(frozen=True, slots=True)
|
|
285
|
+
class ResourceUsage:
|
|
286
|
+
model_calls: int = 0
|
|
287
|
+
retrieval_calls: int = 0
|
|
288
|
+
tool_calls: int = 0
|
|
289
|
+
embedding_calls: int = 0
|
|
290
|
+
unpriced_model_calls: int = 0
|
|
291
|
+
input_tokens: int = 0
|
|
292
|
+
output_tokens: int = 0
|
|
293
|
+
cpu_seconds: float = 0.0
|
|
294
|
+
accelerator_seconds: float = 0.0
|
|
295
|
+
cost_usd: float = 0.0
|
|
296
|
+
compute_cost_usd: float = 0.0
|
|
297
|
+
|
|
298
|
+
def __post_init__(self) -> None:
|
|
299
|
+
integer_fields = (
|
|
300
|
+
"model_calls",
|
|
301
|
+
"retrieval_calls",
|
|
302
|
+
"tool_calls",
|
|
303
|
+
"embedding_calls",
|
|
304
|
+
"unpriced_model_calls",
|
|
305
|
+
"input_tokens",
|
|
306
|
+
"output_tokens",
|
|
307
|
+
)
|
|
308
|
+
if any(
|
|
309
|
+
isinstance(getattr(self, field_name), bool)
|
|
310
|
+
or not isinstance(getattr(self, field_name), int)
|
|
311
|
+
or getattr(self, field_name) < 0
|
|
312
|
+
for field_name in integer_fields
|
|
313
|
+
):
|
|
314
|
+
raise ValidationError("resource usage counters must be non-negative integers")
|
|
315
|
+
float_fields = ("cpu_seconds", "accelerator_seconds", "cost_usd", "compute_cost_usd")
|
|
316
|
+
if any(
|
|
317
|
+
isinstance(getattr(self, field_name), bool)
|
|
318
|
+
or not isinstance(getattr(self, field_name), (int, float))
|
|
319
|
+
or getattr(self, field_name) < 0
|
|
320
|
+
or not math.isfinite(getattr(self, field_name))
|
|
321
|
+
for field_name in float_fields
|
|
322
|
+
):
|
|
323
|
+
raise ValidationError(
|
|
324
|
+
"resource usage durations and costs must be finite and non-negative"
|
|
325
|
+
)
|
|
326
|
+
|
|
327
|
+
@property
|
|
328
|
+
def total_cost_usd(self) -> float:
|
|
329
|
+
return self.cost_usd + self.compute_cost_usd
|
|
330
|
+
|
|
331
|
+
def __add__(self, other: ResourceUsage) -> ResourceUsage:
|
|
332
|
+
if not isinstance(other, ResourceUsage):
|
|
333
|
+
return NotImplemented
|
|
334
|
+
return ResourceUsage(
|
|
335
|
+
model_calls=self.model_calls + other.model_calls,
|
|
336
|
+
retrieval_calls=self.retrieval_calls + other.retrieval_calls,
|
|
337
|
+
tool_calls=self.tool_calls + other.tool_calls,
|
|
338
|
+
embedding_calls=self.embedding_calls + other.embedding_calls,
|
|
339
|
+
unpriced_model_calls=(self.unpriced_model_calls + other.unpriced_model_calls),
|
|
340
|
+
input_tokens=self.input_tokens + other.input_tokens,
|
|
341
|
+
output_tokens=self.output_tokens + other.output_tokens,
|
|
342
|
+
cpu_seconds=self.cpu_seconds + other.cpu_seconds,
|
|
343
|
+
accelerator_seconds=self.accelerator_seconds + other.accelerator_seconds,
|
|
344
|
+
cost_usd=self.cost_usd + other.cost_usd,
|
|
345
|
+
compute_cost_usd=self.compute_cost_usd + other.compute_cost_usd,
|
|
346
|
+
)
|
|
347
|
+
|
|
348
|
+
def as_dict(self) -> dict[str, Any]:
|
|
349
|
+
payload = to_jsonable(self)
|
|
350
|
+
payload["total_cost_usd"] = self.total_cost_usd
|
|
351
|
+
return payload
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
@dataclass(frozen=True, slots=True)
|
|
355
|
+
class FailureRecord:
|
|
356
|
+
category: str
|
|
357
|
+
exception_type: str
|
|
358
|
+
message: str
|
|
359
|
+
stage: str = ""
|
|
360
|
+
retryable: bool = False
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
@dataclass(frozen=True, slots=True)
|
|
364
|
+
class RunEvent:
|
|
365
|
+
run_id: str
|
|
366
|
+
sequence: int
|
|
367
|
+
kind: EventKind
|
|
368
|
+
timestamp_utc: str
|
|
369
|
+
elapsed_ms: float
|
|
370
|
+
component: str = ""
|
|
371
|
+
payload: Mapping[str, Any] = field(default_factory=dict)
|
|
372
|
+
|
|
373
|
+
def __post_init__(self) -> None:
|
|
374
|
+
object.__setattr__(self, "payload", freeze_mapping(self.payload))
|
|
375
|
+
|
|
376
|
+
def as_dict(self) -> dict[str, Any]:
|
|
377
|
+
return to_jsonable(self)
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
@dataclass(frozen=True, slots=True)
|
|
381
|
+
class RunSnapshot:
|
|
382
|
+
run_id: str
|
|
383
|
+
release_id: str
|
|
384
|
+
state_hash: str
|
|
385
|
+
status: ObservedRunStatus
|
|
386
|
+
started_at_utc: str
|
|
387
|
+
finished_at_utc: str | None
|
|
388
|
+
duration_ms: float | None
|
|
389
|
+
usage: ResourceUsage
|
|
390
|
+
failure: FailureRecord | None
|
|
391
|
+
events: tuple[RunEvent, ...]
|
|
392
|
+
tags: Mapping[str, Any] = field(default_factory=dict)
|
|
393
|
+
resource_receipts: tuple[ResourceReceipt, ...] = ()
|
|
394
|
+
|
|
395
|
+
def __post_init__(self) -> None:
|
|
396
|
+
object.__setattr__(self, "events", tuple(self.events))
|
|
397
|
+
object.__setattr__(self, "resource_receipts", tuple(self.resource_receipts))
|
|
398
|
+
object.__setattr__(self, "tags", freeze_mapping(self.tags))
|
|
399
|
+
|
|
400
|
+
def as_dict(self) -> dict[str, Any]:
|
|
401
|
+
payload = to_jsonable(self)
|
|
402
|
+
payload["usage"] = self.usage.as_dict()
|
|
403
|
+
return payload
|