synth-optimizers 0.2.7.dev20260814__tar.gz → 0.2.8.dev20260814__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/Cargo.lock +5 -5
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/Cargo.toml +1 -1
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/PKG-INFO +1 -1
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/pyproject.toml +1 -1
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_gepa/src/codex_app_server.rs +59 -5
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_gepa/src/runtime.rs +15 -1
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/README.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_gepa/Cargo.toml +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_gepa/README.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_gepa/openapi/gepa-service-v1.yaml +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_gepa/src/jesterky_workflow.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_gepa/src/lib.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_gepa/src/machines.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_gepa/src/pipeline.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_gepa/src/planner.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_gepa/src/prompting_best_practices.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_gepa/src/service.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/Cargo.toml +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/README.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/agent_runtime/README.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/agent_runtime/app_server.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/agent_runtime/codex_home.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/agent_runtime/daytona.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/agent_runtime/docker.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/agent_runtime/jsonrpc_read_window.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/agent_runtime/limits.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/agent_runtime/local.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/agent_runtime/mod.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/agent_runtime/nano.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/agent_runtime/role_agent.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/agent_runtime/session.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/agent_runtime/substrate.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/agent_runtime/supervisor.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/agent_runtime/usage.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/artifact_store.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/artifacts.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/cache.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/candidates.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/checkpoints.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/config.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/configured_limits.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/container_contract.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/data_models.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/disk_budget.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/error.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/event_visualization.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/events.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/evidence.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/failures.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/fsm.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/http.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/invariants.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/jesterky.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/jobs.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/levers.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/lib.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/limit_engine.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/limits.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/observability.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/operations.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/process.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/projections.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/prompt_program.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/registry.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/resources.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/rollouts.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/runtime_records.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/scores.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/sensors.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/state_machine.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/stopper.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/storage_maintenance.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/usage.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizer_platform/src/workspace.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizers_py/Cargo.toml +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizers_py/README.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/rust/crates/synth_optimizers_py/src/lib.rs +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/README.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/__init__.py +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/_synth_optimizers.pyi +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/board_server.py +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/cli.py +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/discovery.py +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/docs/gelo/00-index.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/docs/gelo/10-cli.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/docs/gelo/20-sdk.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/docs/gelo/30-hosted.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/docs/gelo/containers/00-overview.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/docs/gelo/containers/20-contract.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/docs/gepa/00-index.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/docs/gepa/10-cli.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/docs/gepa/20-sdk.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/docs/gepa/algorithms/00-overview.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/docs/gepa/algorithms/10-pipeline-modes.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/docs/gepa/algorithms/20-proposer-and-policies.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/docs/gepa/assets/synth-logo.png +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/docs/gepa/containers/00-overview.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/docs/gepa/containers/10-catalog.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/docs/gepa/containers/20-contract.md +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/docs_server.py +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/eval_stats.py +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/gelo.py +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/gepa.py +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/hosted.py +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/hosted_config.py +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/o11y.py +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/observability.py +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/py.typed +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/sdk.py +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/tunnels.py +0 -0
- {synth_optimizers-0.2.7.dev20260814 → synth_optimizers-0.2.8.dev20260814}/src/synth_optimizers/victorialogs.py +0 -0
|
@@ -1306,7 +1306,7 @@ dependencies = [
|
|
|
1306
1306
|
|
|
1307
1307
|
[[package]]
|
|
1308
1308
|
name = "synth_gepa"
|
|
1309
|
-
version = "0.2.
|
|
1309
|
+
version = "0.2.8"
|
|
1310
1310
|
dependencies = [
|
|
1311
1311
|
"base64",
|
|
1312
1312
|
"fs2",
|
|
@@ -1321,7 +1321,7 @@ dependencies = [
|
|
|
1321
1321
|
|
|
1322
1322
|
[[package]]
|
|
1323
1323
|
name = "synth_mapo"
|
|
1324
|
-
version = "0.2.
|
|
1324
|
+
version = "0.2.8"
|
|
1325
1325
|
dependencies = [
|
|
1326
1326
|
"serde",
|
|
1327
1327
|
"serde_json",
|
|
@@ -1333,7 +1333,7 @@ dependencies = [
|
|
|
1333
1333
|
|
|
1334
1334
|
[[package]]
|
|
1335
1335
|
name = "synth_marl_promptopt"
|
|
1336
|
-
version = "0.2.
|
|
1336
|
+
version = "0.2.8"
|
|
1337
1337
|
dependencies = [
|
|
1338
1338
|
"clap",
|
|
1339
1339
|
"serde",
|
|
@@ -1347,7 +1347,7 @@ dependencies = [
|
|
|
1347
1347
|
|
|
1348
1348
|
[[package]]
|
|
1349
1349
|
name = "synth_optimizer_platform"
|
|
1350
|
-
version = "0.2.
|
|
1350
|
+
version = "0.2.8"
|
|
1351
1351
|
dependencies = [
|
|
1352
1352
|
"fs2",
|
|
1353
1353
|
"libc",
|
|
@@ -1364,7 +1364,7 @@ dependencies = [
|
|
|
1364
1364
|
|
|
1365
1365
|
[[package]]
|
|
1366
1366
|
name = "synth_optimizers_py"
|
|
1367
|
-
version = "0.2.
|
|
1367
|
+
version = "0.2.8"
|
|
1368
1368
|
dependencies = [
|
|
1369
1369
|
"pyo3",
|
|
1370
1370
|
"serde_json",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "synth-optimizers"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.8.dev20260814"
|
|
4
4
|
description = "Public Synth optimizer tooling with a Rust GEPA core."
|
|
5
5
|
authors = [{name = "Synth Laboratories", email = "josh@usesynth.ai"}]
|
|
6
6
|
readme = "README.md"
|
|
@@ -10,10 +10,10 @@ use reqwest::blocking::Client;
|
|
|
10
10
|
use serde_json::{json, Map, Value};
|
|
11
11
|
use synth_optimizer_platform::{
|
|
12
12
|
jesterky_workspace_read_model, looks_like_jesterky_manifest,
|
|
13
|
-
proposer_delta_chunks_from_protocol,
|
|
14
|
-
run_turn, AgentTurnOutcome, CodexTurnRequest,
|
|
15
|
-
|
|
16
|
-
SynthOptimizerConfig,
|
|
13
|
+
proposer_delta_chunks_from_protocol, proposer_uses_chatgpt_auth, read_jesterky_manifest,
|
|
14
|
+
record_manifest_validation, run_turn, AgentTurnOutcome, CodexTurnRequest,
|
|
15
|
+
NanoAgentTurnIdentity, NanoCodexExecution, NanoCodexSessionPool, NanoCodexTurnRequest,
|
|
16
|
+
OptimizerError, PromptProgram, Result, SynthOptimizerConfig,
|
|
17
17
|
};
|
|
18
18
|
|
|
19
19
|
const GEPA_REFLECTIVE_FRAME_SCHEMA_VERSION: &str = "gepa_reflective_frame.v1";
|
|
@@ -556,7 +556,26 @@ fn normalize_proposer_usage(config: &SynthOptimizerConfig, model: &str, usage: V
|
|
|
556
556
|
let provider = config.proposer.provider.trim().to_ascii_lowercase();
|
|
557
557
|
let model_lower = model.trim().to_ascii_lowercase();
|
|
558
558
|
let reported_cost = usage_f64_from_map(&usage_map, "cost_usd")
|
|
559
|
-
.filter(|value| value.is_finite() && *value
|
|
559
|
+
.filter(|value| value.is_finite() && *value >= 0.0);
|
|
560
|
+
if proposer_uses_chatgpt_auth(&config.proposer.auth_mode) {
|
|
561
|
+
usage_map.insert(
|
|
562
|
+
"provider".to_string(),
|
|
563
|
+
Value::String("chatgpt_subscription".to_string()),
|
|
564
|
+
);
|
|
565
|
+
usage_map.insert("model".to_string(), Value::String(model.to_string()));
|
|
566
|
+
if reported_cost.is_none() {
|
|
567
|
+
// ChatGPT-authenticated Codex turns are subscription-backed rather
|
|
568
|
+
// than metered API calls. Record an explicit zero incremental API
|
|
569
|
+
// charge so the hard cost ledger does not mistake the absence of
|
|
570
|
+
// an API receipt for unknown spend.
|
|
571
|
+
usage_map.insert("cost_usd".to_string(), json!(0.0));
|
|
572
|
+
usage_map.insert(
|
|
573
|
+
"cost_source".to_string(),
|
|
574
|
+
Value::String("chatgpt_subscription_no_incremental_api_charge".to_string()),
|
|
575
|
+
);
|
|
576
|
+
}
|
|
577
|
+
return Value::Object(usage_map);
|
|
578
|
+
}
|
|
560
579
|
if provider.eq_ignore_ascii_case("openrouter") && model_lower == OPENROUTER_GROK43_MODEL {
|
|
561
580
|
return normalize_openrouter_grok43_usage(model, usage_map);
|
|
562
581
|
}
|
|
@@ -3378,3 +3397,38 @@ fn non_empty(value: Option<&str>) -> Option<&str> {
|
|
|
3378
3397
|
Some(value)
|
|
3379
3398
|
}
|
|
3380
3399
|
}
|
|
3400
|
+
|
|
3401
|
+
#[cfg(test)]
|
|
3402
|
+
mod cost_tests {
|
|
3403
|
+
use super::*;
|
|
3404
|
+
|
|
3405
|
+
#[test]
|
|
3406
|
+
fn chatgpt_proposer_emits_explicit_zero_incremental_api_cost() {
|
|
3407
|
+
let mut config = SynthOptimizerConfig::default();
|
|
3408
|
+
config.proposer.auth_mode = "chatgpt".to_string();
|
|
3409
|
+
let usage = normalize_proposer_usage(
|
|
3410
|
+
&config,
|
|
3411
|
+
"gpt-5.6-luna",
|
|
3412
|
+
json!({"prompt_tokens": 100, "completion_tokens": 20, "total_tokens": 120}),
|
|
3413
|
+
);
|
|
3414
|
+
assert_eq!(usage.get("cost_usd"), Some(&json!(0.0)));
|
|
3415
|
+
assert_eq!(
|
|
3416
|
+
usage.get("cost_source"),
|
|
3417
|
+
Some(&json!("chatgpt_subscription_no_incremental_api_charge"))
|
|
3418
|
+
);
|
|
3419
|
+
assert_eq!(usage.get("provider"), Some(&json!("chatgpt_subscription")));
|
|
3420
|
+
}
|
|
3421
|
+
|
|
3422
|
+
#[test]
|
|
3423
|
+
fn chatgpt_proposer_preserves_an_explicit_cost_receipt() {
|
|
3424
|
+
let mut config = SynthOptimizerConfig::default();
|
|
3425
|
+
config.proposer.auth_mode = "chatgpt".to_string();
|
|
3426
|
+
let usage = normalize_proposer_usage(
|
|
3427
|
+
&config,
|
|
3428
|
+
"gpt-5.6-luna",
|
|
3429
|
+
json!({"cost_usd": 0.25, "cost_source": "provider"}),
|
|
3430
|
+
);
|
|
3431
|
+
assert_eq!(usage.get("cost_usd"), Some(&json!(0.25)));
|
|
3432
|
+
assert_eq!(usage.get("cost_source"), Some(&json!("provider")));
|
|
3433
|
+
}
|
|
3434
|
+
}
|
|
@@ -509,6 +509,7 @@ impl<'a> GepaRuntimeExecutor<'a> {
|
|
|
509
509
|
json!(self.config.gepa.rollout_submission_mode),
|
|
510
510
|
);
|
|
511
511
|
}
|
|
512
|
+
persist_runtime_outcome_before_completion(self.workspace, run_id, job_id, &outcome)?;
|
|
512
513
|
record_runtime_effect_completed(
|
|
513
514
|
self.workspace,
|
|
514
515
|
RuntimeEffectCompletionInput {
|
|
@@ -666,7 +667,7 @@ impl<'a> GepaRuntimeExecutor<'a> {
|
|
|
666
667
|
.and_then(|usage| usage.get("cost_usd"))
|
|
667
668
|
.or_else(|| response.get("cost_usd"))
|
|
668
669
|
.and_then(Value::as_f64)
|
|
669
|
-
.filter(|value| value.is_finite() && *value
|
|
670
|
+
.filter(|value| value.is_finite() && *value >= 0.0)
|
|
670
671
|
.or_else(|| proposer_static_cost_usd(self.config, &usage, &response));
|
|
671
672
|
let cost_usd = reported_cost_usd.unwrap_or(0.0);
|
|
672
673
|
let backend = response
|
|
@@ -1566,6 +1567,19 @@ fn ensure_job_lease(
|
|
|
1566
1567
|
Ok(())
|
|
1567
1568
|
}
|
|
1568
1569
|
|
|
1570
|
+
fn persist_runtime_outcome_before_completion(
|
|
1571
|
+
workspace: &WorkspaceStore,
|
|
1572
|
+
run_id: &str,
|
|
1573
|
+
job_id: &str,
|
|
1574
|
+
outcome: &RuntimeEffectOutcome,
|
|
1575
|
+
) -> Result<()> {
|
|
1576
|
+
let stored = crate::stored_runtime_outcome(outcome)?;
|
|
1577
|
+
let mut job = workspace.optimizer_job(run_id, job_id)?;
|
|
1578
|
+
job.payload
|
|
1579
|
+
.insert("runtime_outcome".to_string(), serde_json::to_value(stored)?);
|
|
1580
|
+
workspace.record_optimizer_job(&job)
|
|
1581
|
+
}
|
|
1582
|
+
|
|
1569
1583
|
fn runtime_lease_id(worker_id: &str, job_id: &str) -> String {
|
|
1570
1584
|
format!("lease_{worker_id}_{job_id}_{}", now_millis())
|
|
1571
1585
|
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|