Repository navigation
Expand file tree
/
Copy pathdeepgraph.toml
More file actions
458 lines (406 loc) · 14.8 KB
/
Copy pathdeepgraph.toml
File metadata and controls
458 lines (406 loc) · 14.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
# DeepGraph unified configuration.
#
# Precedence: process environment / .env overrides this file.
# Keep real API keys and SSH passwords in .env or secret storage; leave the
# secret fields here empty unless you are using a private local checkout.
[profile]
active = "machine_learning"
[app]
name = "DeepGraph"
subtitle = ""
root_node_id = "ml"
[paths]
db_path = "{project_root}/deepgraph.db"
workspace_dir = "{project_root}/workspace"
pdf_cache_dir = "{project_root}/workspace/pdfs"
experiment_workdir = "{home}/sciforge_runs"
idea_workspace_dir = "{home}/deepgraph_ideas"
manuscript_workdir = "{home}/deepgraph_manuscripts"
reference_pdf_corpus_dir = "{project_root}/../../workspace/pdfs"
iclr2026_template_dir = "{project_root}/third_party/iclr2026/iclr2026"
[database]
url = ""
pgvector_embedding_dim = 1536
[runtime]
python = ""
[tracking]
mlflow_uri = ""
[llm]
use_tabcode = false
protocol = "responses"
base_url = "https://api2.tabcode.cc/openai"
model = "gpt-5.4"
rpm = 0
extra_providers_json = ""
reasoning_effort = "medium"
prompt_cache_enabled = true
prompt_cache_key = "deepgraph"
prompt_cache_retention = "24h"
connect_timeout_seconds = 30
request_timeout_seconds = 300
transient_retries = 2
transient_backoff_seconds = 5
transient_cooldown_seconds = 180
max_input_tokens = 900000
max_output_tokens = 32000
# Declarative provider routes. Everything here is non-secret; the API key is
# named by api_key_env and read from the environment at startup, so adding a
# provider is one block here plus one line in the environment file. A literal
# api_key in this file is refused at startup, because this file is in Git.
#
# [[llm.providers]]
# name = "gpt5" # referenced by llm_routes.*
# base_url = "https://api.example.com/v1" # or base_url_env for a private gateway
# model = "gpt-5.4"
# model_family = "gpt" # independence is judged on this
# protocol = "chat_completions" # or "responses"
# api_key_env = "DEEPGRAPH_LLM_GPT5_API_KEY"
# rpm = 0
# enabled = true
# Proposer route: the high-volume role. Every paper read, abstraction, reasoning
# pass and experiment design goes through it.
[[llm.providers]]
name = "sora2_gemini"
base_url_env = "DEEPGRAPH_LLM_SORA2_BASE_URL"
model = "gemini-3.7-flash-high"
model_family = "gemini-flash"
protocol = "chat_completions"
api_key_env = "DEEPGRAPH_LLM_SECONDARY_API_KEY"
rpm = 0
enabled = true
# Evaluator and reviewer route. A different vendor and different training data
# from the proposer, so a verdict is not the proposing model grading its own
# output. Independence is judged on model_family, and this is the only declared
# route whose family is genuinely unrelated to the proposer's.
# Renamed from novita_deepseek on 2026-08-27 when the endpoint moved to
# DeepSeek's own API. The old name stays on the rows it actually served: a
# ledger that says "novita" for a call to api.deepseek.com is worse than one
# whose provider names change when the provider does.
#
# thinking mode is on by default for deepseek-v4-flash, but a default is not a
# decision. Declared explicitly so the audit trail says the verdicts were
# reasoned, and so a change in the vendor's default cannot quietly turn it off.
# Measured 2026-08-27: {"type": "disabled"} yields 0 characters of
# reasoning_content, {"type": "enabled"} yields 468 on the same question.
[[llm.providers]]
name = "deepseek_official"
base_url_env = "DEEPGRAPH_LLM_DEEPSEEK_BASE_URL"
model = "deepseek-v4-flash"
model_family = "deepseek"
protocol = "chat_completions"
api_key_env = "DEEPGRAPH_LLM_DEEPSEEK_API_KEY"
rpm = 0
enabled = true
[llm.providers.extra_body]
reasoning_effort = "env:DEEPGRAPH_LLM_REASONING_EFFORT"
[llm.providers.extra_body.thinking]
type = "enabled"
# Claude on the same gateway. Declared so a proposer-model comparison can name
# a Claude arm without the ledger recording it under a provider called
# "sora2_gemini": the provider entry supplies the endpoint and credential, the
# route supplies the model, and a comparison is only readable if the two agree.
# Measured 2026-08-27: 45 tok/s, so a 16k-token design call needs a request
# timeout above the 120s default.
[[llm.providers]]
name = "sora2_claude"
base_url_env = "DEEPGRAPH_LLM_SORA2_BASE_URL"
model = "claude-opus-4-6-thinking"
model_family = "claude"
protocol = "chat_completions"
api_key_env = "DEEPGRAPH_LLM_SECONDARY_API_KEY"
rpm = 0
enabled = true
# Same-vendor fallback for the evaluator and reviewer roles. Kept declared but
# unreferenced: a different generation and size class from the proposer, so it
# is better than self-grading and worse than a cross-vendor split.
[[llm.providers]]
name = "sora2_gemini_pro"
base_url_env = "DEEPGRAPH_LLM_SORA2_BASE_URL"
model = "gemini-3.1-pro-high"
model_family = "gemini-pro"
protocol = "chat_completions"
api_key_env = "DEEPGRAPH_LLM_SECONDARY_API_KEY"
rpm = 0
enabled = true
[llm.secondary]
enabled = false
protocol = "responses"
base_url = ""
model = "gpt-5.4"
rpm = 0
[minimax]
base_url = "https://api.minimaxi.com/v1"
model = "MiniMax-M2.7-highspeed"
rpm = 18
[prompts]
version = "insight_v1"
[arxiv]
categories = ["cs.AI", "cs.LG", "cs.CL", "cs.CV", "cs.MA", "stat.ML"]
max_results_per_query = 100
[grobid]
base_url = "http://127.0.0.1:8070"
request_timeout_seconds = 300
[pdf]
text_backend = "source_auto"
[pipeline]
concurrency = 30
paper_text_prefetch_concurrency = 8
sleep_between_papers = 1
incremental_insight_every = 20
max_retryable_failures = 12
event_poll_seconds = 5
[graph]
grounding_min_store_score = 0.0
contradiction_requires_grounded = false
backfill_on_start = true
refresh_merge_candidates_on_start = true
paper_cluster_min_papers = 10
[compute]
# auto: GPU ideas are admitted only if a local NVIDIA GPU is detected or an SSH
# GPU worker is configured. Use force_cpu for CPU-only idea selection, require
# to hard-fail GPU routes when no GPU exists, or ignore to bypass this guard.
local_gpu_policy = "auto"
[dataset_resolver]
# Resolve named benchmarks to executable public-data recipes before storing an
# idea. The resolver queries Hugging Face metadata when local registry entries
# are not enough; experiment runners download data later via datasets.load_dataset.
enabled = true
allow_network = true
hf_limit = 8
timeout_seconds = 12
min_confidence = 0.42
[agenda]
active_ids = []
default_token_budget = 100000
default_gpu_hours_budget = 0.0
backlog_policy = "explicit_import_only"
scope_min_term_hits = 1
default_backend_allowlist = ["cpu", "llm"]
max_concurrency_per_agenda = 1
[resource_grants]
required = true
default_ttl_seconds = 3600
pilot_token_cap = 20000
pilot_gpu_hours_cap = 0.25
full_benchmark_token_cap = 100000
full_benchmark_gpu_hours_cap = 8.0
required_artifacts = ["raw_metrics", "run_manifest", "environment_manifest", "claim_ledger"]
[llm_routes]
failure_policy = "fail_closed_or_manual"
require_independent_evaluator = true
record_actual_route = true
[[llm_routes.proposer]]
provider_ref = "env:DEEPGRAPH_LLM_PRIMARY"
model_ref = "env:DEEPGRAPH_LLM_PRIMARY_MODEL"
model_family_ref = "env:DEEPGRAPH_LLM_PRIMARY_FAMILY"
prompt_version = "proposer_v1"
# Second proposer route: AVAILABILITY. The proposer had exactly one route, so a
# two-second network blip on 2026-08-25 ended it. Seven calls succeeded, three
# failed inside two seconds with in=0 out=0 -- the request never left the host --
# and fail_closed_or_manual then declared all_explicit_routes_failed. Two paper
# ingestion jobs died, the backfill made no further progress and tripped its
# three-hour breaker, while the same route completed sixteen calls twelve
# minutes later. A different vendor means a different network path, which is the
# only kind of fallback a transport blip cannot follow.
[[llm_routes.proposer]]
provider_ref = "deepseek_official"
model_ref = "deepseek-v4-flash"
model_family_ref = "deepseek"
prompt_version = "proposer_v1"
[[llm_routes.evaluator]]
provider_ref = "env:DEEPGRAPH_LLM_EVALUATOR"
model_ref = "env:DEEPGRAPH_LLM_EVALUATOR_MODEL"
model_family_ref = "env:DEEPGRAPH_LLM_EVALUATOR_FAMILY"
prompt_version = "evaluator_v1"
# Second evaluator route, required by the one above rather than for its own
# sake. Independence is judged against the route the proposer actually used: if
# the proposer falls back to deepseek and deepseek is the only evaluator, the
# audit raises no_independent_evaluator_route_available and the ladder stalls
# one rung higher than the blip it was meant to survive. gemini-pro is a
# different family from both the primary proposer (gemini-flash) and the
# primary evaluator (deepseek), so an independent evaluator exists whichever
# vendor the proposer lands on.
[[llm_routes.evaluator]]
provider_ref = "sora2_gemini_pro"
model_ref = "gemini-3.1-pro-high"
model_family_ref = "gemini-pro"
prompt_version = "evaluator_v1"
[[llm_routes.reviewer]]
provider_ref = "env:DEEPGRAPH_LLM_REVIEWER"
model_ref = "env:DEEPGRAPH_LLM_REVIEWER_MODEL"
model_family_ref = "env:DEEPGRAPH_LLM_REVIEWER_FAMILY"
prompt_version = "reviewer_v1"
# Second reviewer route: AVAILABILITY, not independence. The primary reviewer
# and the evidence evaluator are the same provider, so a novita outage would
# otherwise stall both the evidence audit and the manuscript gate at once --
# a single point of failure across two consecutive rungs of the ladder.
#
# It is deliberately NOT a third-vendor independence play. That argument was a
# priori; the case for keeping deepseek as primary is empirical -- it refused to
# concur on run 189 and exposed a global verdict bug, which no new vendor has a
# record of doing here. Routes are a list, so swapping in a third vendor later
# is a config change with no code change.
#
# Deployment note: these three env names are provisional. When the system is
# formally deployed, fold DEEPGRAPH_LLM_REVIEWER_FALLBACK* into the same
# environment manifest as the other provider credentials rather than leaving
# them appended to .env by hand.
[[llm_routes.reviewer]]
provider_ref = "env:DEEPGRAPH_LLM_REVIEWER_FALLBACK"
model_ref = "env:DEEPGRAPH_LLM_REVIEWER_FALLBACK_MODEL"
model_family_ref = "env:DEEPGRAPH_LLM_REVIEWER_FALLBACK_FAMILY"
prompt_version = "reviewer_v1"
[compute_backends]
enabled = ["cpu"]
job_store = "postgresql"
allow_ephemeral_idempotency = false
failure_status = "failed"
heartbeat_timeout_seconds = 300
reconcile_expired_on_start = true
submission_unknown_policy = "manual_reconciliation"
artifact_root = "{project_root}/workspace/meta_harness/artifacts"
[compute_backends.cpu]
enabled = true
[compute_backends.local_gpu]
enabled = false
[compute_backends.ssh_gpu]
enabled = false
target_ref = "env:DEEPGRAPH_SSH_TARGET"
credential_ref = "env:DEEPGRAPH_SSH_CREDENTIAL"
[compute_backends.colab_gpu]
enabled = false
accounts_manifest_ref = "env:DEEPGRAPH_COLAB_ACCOUNTS_MANIFEST"
binary = ""
allowed_code_root = "{project_root}/workspace/meta_harness/candidates"
allowed_artifact_root = "{project_root}/workspace/meta_harness/artifacts"
poll_seconds = 5
[scoped_ingestion]
worker_enabled = false
poll_seconds = 10
lease_seconds = 1800
[harness_evolution]
policy_version = "harness_policy_v1"
candidate_root = "{project_root}/workspace/meta_harness/candidates"
database_namespace_prefix = "meta_harness_candidate_"
max_modules = 2
max_changed_lines = 200
evaluator_isolation_binary = "bwrap"
evaluator_root = "{project_root}/meta_harness/evaluators"
holdout_root = "{project_root}/meta_harness/held_out"
evaluator_artifact_root = "{project_root}/workspace/meta_harness/evaluator_artifacts"
# Set both explicitly in isolated CI; empty values make evaluator startup fail closed.
production_path = ""
production_database_namespace = ""
required_suites = ["held_in", "held_out", "canary"]
require_reviewer_approval = true
[reviewer_approval]
# Non-sensitive key-id -> secret reference manifest lives in the named
# environment variable. Example value:
# {"release-reviewer-1":"env:DEEPGRAPH_RELEASE_REVIEWER_1_SECRET"}
keys_manifest_ref = "env:DEEPGRAPH_REVIEWER_APPROVAL_KEYS_JSON"
max_age_seconds = 604800
signature_algorithm = "hmac-sha256-v1"
[trace]
directory = "{project_root}/workspace/meta_harness/traces"
artifact_manifest_required = true
record_prompt_version = true
record_provider_model = true
record_token_cost = true
[discovery]
tier1_candidates = 5
tier2_problems = 8
tier2_papers = 5
min_tier2_backlog = 3
auto_trigger_papers = 100
bulk_tier1_candidates = 12
bulk_tier1_overlaps = 80
bulk_tier1_patterns = 60
bulk_tier2_problems = 15
bulk_tier2_plateaus = 35
bulk_tier2_limit_nodes = 30
[idea]
evidence_min_non_numeric = 2
[experiment]
time_budget_seconds = 300
max_iterations = 100
reproduction_iters = 3
proxy_data_fraction = 0.15
proxy_max_epochs = 10
early_stop_threshold = 0.20
refute_min_iters = 30
plateau_patience = 12
require_real_benchmark = true
allow_synthetic_fallback = false
real_llm_model = "Qwen/Qwen2.5-7B-Instruct"
real_benchmark_dataset = "openai/gsm8k"
real_benchmark_dataset_config = "main"
real_benchmark_max_examples = 1000
real_benchmark_seeds = 5
full_benchmark_min_examples = 1000
full_benchmark_min_datasets = 2
full_benchmark_min_models = 2
full_benchmark_min_baselines = 6
full_benchmark_require_significance = true
full_benchmark_require_strongest_win = true
real_benchmark_time_budget_seconds = 3600
validation_benchmark_max_examples = 64
validation_benchmark_seeds = 3
validation_benchmark_methods = "Vanilla Direct Answering,Always-Reason Chain-of-Thought,Confidence Gate,Random Budget-Matched Routing"
reproduction_repair_max_rounds = 8
allow_smoke_validation = false
evosci_verify_timeout = 900
require_evoscientist = false
[codex]
exec_enabled = true
cli_path = ""
model = ""
timeout_seconds = 900
[gpu]
mode = "single_host"
worker_slots = 4
visible_devices = []
default_model = "H20"
default_vram_gb = 96
poll_seconds = 10
stale_recovery_poll_seconds = 120
job_timeout_seconds = 14400
[gpu.remote]
ssh_host = ""
ssh_port = 22
ssh_user = ""
base_dir = "/root/deepgraph-remote-worker"
python = "python"
# A rented accelerator arrives with whatever image it was built from. On
# 2026-08-27 one arrived with torch but no transformers or datasets, the runner
# reported dependency_missing, and three pilot attempts for ideas 237 and 241
# died without measuring a single example. The remote setup that installs
# the bundle's requirements has existed all along; only this flag kept it from
# running. Verified on that host: a plain pip install lands in the
# interpreter's own site-packages and imports, no sudo and no user-site needed.
auto_pip_install = true
setup_timeout_seconds = 3600
[manuscript]
latex_template = "auto"
submission_bundle_formats = ["conference"]
backend = "paper_orchestra"
iclr2026_template_files = [
"iclr2026_conference.sty",
"iclr2026_conference.bst",
"math_commands.tex",
"natbib.sty",
"fancyhdr.sty",
]
[paper_orchestra]
paperbanana_cmd = ""
refinement_iters = 4
[auto_research]
pipeline_enabled = false
pipeline_batch_size = 1
pipeline_interval_seconds = 120
pipeline_start_delay_seconds = 10
enabled = true
interval_seconds = 30
max_active = 1
[web]
host = "0.0.0.0"
port = 8080