Traigent optimize config space
Skill Traigent/traigent-skills/skills/traigent-optimize-config-space
Define tuned variables, structural knobs, and configuration spaces for Traigent optimization. Use when setting up parameter search spaces, choosing models/temperatures/prompts, designing task-level text2SQL/RAG/multi-hop knobs, using Range/IntRange/Choices/LogRange types, adding constraints, or using factory presets like Range.temperature().From its SKILL.md
npx -y skills add Traigent/traigent-skills --skill traigent-optimize-config-spaceAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its file declares
Copied from the file, not written here
The file declares its own license as Apache-2.0. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
19.4 KB, ~5.2k tokens by cl100k_base, as published. Nobody here has run it
Traigent Configuration Space
When to Use
Use this skill when:
- Defining which parameters to optimize (model, temperature, max_tokens, prompts, etc.)
- Choosing between dict-based and typed parameter definitions
- Designing task-level structural knobs for text2SQL, RAG, multi-hop QA, schema
context, retrieval strategy, generation paths, few-shot policies,
self-consistency, or repair policies (see
references/structural-spine.md) - Using
Range,IntRange,Choices, orLogRangefor search spaces - Adding constraints between parameters (e.g., "if model is gpt-4, temperature must be low")
- Using factory presets like
Range.temperature()orChoices.model() - Bundling parameters and constraints into a
ConfigSpaceobject
Quick Start
The simplest way to define a configuration space is with a dictionary passed to configuration_space:
import traigent
@traigent.optimize(
eval_dataset="evals.jsonl",
objectives=["accuracy"],
configuration_space={
"model": ["gpt-4o-mini", "gpt-4o"],
"temperature": [0.1, 0.5, 0.9],
"max_tokens": [256, 512, 1024],
},
)
def my_function(query: str) -> str:
config = traigent.get_config()
# config["model"], config["temperature"], config["max_tokens"]
...
Lists create categorical choices. Tuples of two numbers create continuous ranges:
configuration_space={
"model": ["gpt-4o-mini", "gpt-4o"], # Categorical: pick one
"temperature": (0.0, 1.0), # Continuous float range
"max_tokens": (100, 4096), # Continuous int range (both ints)
"use_cache": [True, False], # Boolean knob: native Python bools
}
Boolean knobs: use native
[True, False], never["true", "false"]. A native bool list works directly in the dict shorthand (above) and asChoices([True, False]); your function reads it back as a realbool(if config["use_cache"]: ...). Do not string-encode a bool as["true", "false"]: in Python the string"false"is truthy (bool("false") is True), so a consumer that doesif config["x"]:is silently always True and theFalsearm of your search is never exercised — the optimizer reports both points as identical behaviour and you never learn one was a no-op. If a string encoding is unavoidable (legacy specs), the consumer must decode explicitly:enabled = config["x"] == "true".
SE-Friendly Typed Parameters
For stronger typing, validation, and constraint support, use the parameter range classes:
from traigent import Range, IntRange, Choices, LogRange
Pass them as keyword arguments directly to the decorator:
import traigent
from traigent import Range, IntRange, Choices
@traigent.optimize(
eval_dataset="evals.jsonl",
objectives=["accuracy", "cost"],
model=Choices(["gpt-4o-mini", "gpt-4o"]),
temperature=Range(0.0, 1.0),
max_tokens=IntRange(100, 4096),
)
def my_function(query: str) -> str:
config = traigent.get_config()
...
Parameter Types
| Class | Use Case | Example |
|---|---|---|
Range | Continuous float values | Range(0.0, 1.0) |
IntRange | Integer values | IntRange(100, 4096) |
Choices | Categorical selection | Choices(["gpt-4o-mini", "gpt-4o"]) |
LogRange | Log-scale float values | LogRange(1e-5, 1e-1) |
Range Options
# Basic float range
temperature = Range(0.0, 1.0)
# With step size (discretized)
temperature = Range(0.0, 1.0, step=0.1)
# With log-scale sampling
learning_rate = Range(1e-5, 1e-1, log=True)
# With a default value
temperature = Range(0.0, 1.0, default=0.7)
IntRange Options
# Basic integer range
max_tokens = IntRange(100, 4096)
# With step size
batch_size = IntRange(16, 256, step=16)
# With a default
max_tokens = IntRange(100, 4096, default=512)
LogRange
Convenience class for Range(low, high, log=True). Use for parameters that vary over orders of magnitude:
learning_rate = LogRange(1e-5, 1e-1)
regularization = LogRange(0.001, 10.0)
Choices Options
# String choices
model = Choices(["gpt-4o-mini", "gpt-4o", "claude-3-5-sonnet-20241022"])
# Boolean choices
use_cot = Choices([True, False], default=True)
# Numeric choices (discrete set)
temperature = Choices([0.0, 0.3, 0.7, 1.0])
# With a default
model = Choices(["gpt-4o-mini", "gpt-4o"], default="gpt-4o-mini")
See references/parameter-types.md for complete API details.
Factory Presets
Each parameter type offers factory methods with sensible defaults for common LLM parameters.
Range Presets
from traigent import Range
# Temperature
temp = Range.temperature() # [0.0, 1.0], default 0.7
temp = Range.temperature(conservative=True) # [0.0, 0.5], default 0.2
temp = Range.temperature(creative=True) # [0.7, 1.5], default 1.0
# Other LLM parameters
top_p = Range.top_p() # [0.1, 1.0], default 0.9
freq_pen = Range.frequency_penalty() # [0.0, 2.0], default 0.0
pres_pen = Range.presence_penalty() # [0.0, 2.0], default 0.0
# RAG parameters
threshold = Range.similarity_threshold() # [0.0, 1.0], default 0.5
mmr = Range.mmr_lambda() # [0.0, 1.0], default 0.5
overlap = Range.chunk_overlap_ratio() # [0.0, 0.5], default 0.1
IntRange Presets
from traigent import IntRange
# Token limits
tokens = IntRange.max_tokens() # [256, 1024], step 64, default 512
tokens = IntRange.max_tokens(task="short") # [50, 256], step 64, default 128
tokens = IntRange.max_tokens(task="long") # [1024, 4096], step 64, default 2048
# RAG parameters
k = IntRange.k_retrieval() # [1, 10], default 3
k = IntRange.k_retrieval(max_k=20) # [1, 20], default 3
chunk = IntRange.chunk_size() # [100, 1000], step 100, default 500
overlap = IntRange.chunk_overlap() # [0, 200], step 25, default 50
few_shot = IntRange.few_shot_count() # [0, 10], default 3
batch = IntRange.batch_size() # [1, 64], default 16
Choices Presets
from traigent import Choices
# Model selection
model = Choices.model() # Balanced: gpt-4o-mini, gpt-4o, claude-sonnet-4-6
model = Choices.model(provider="openai", tier="fast") # Fast OpenAI: gpt-4o-mini
model = Choices.model(provider="anthropic", tier="quality") # Quality Anthropic: claude-opus-4-8
# Prompting and RAG
strategy = Choices.prompting_strategy() # direct, chain_of_thought, react, self_consistency
ctx_fmt = Choices.context_format() # bullet, numbered, xml, markdown, json
retriever = Choices.retriever_type() # similarity, mmr, bm25, hybrid
embedding = Choices.embedding_model() # text-embedding-3-small, text-embedding-3-large
reranker = Choices.reranker_model() # none, cohere-rerank-v3, cross-encoder, llm-rerank
Constraints
Constraints define valid parameter combinations. They prevent the optimizer from exploring invalid configurations.
Lambda Constraints
The simplest form -- pass lambda functions that return True for valid configs:
@traigent.optimize(
eval_dataset="evals.jsonl",
objectives=["accuracy"],
configuration_space={
"model": ["gpt-4o-mini", "gpt-4o"],
"temperature": [0.1, 0.5, 0.9],
"max_tokens": [256, 512, 1024],
},
constraints=[
# If model is gpt-4o, temperature must be below 0.8
lambda config: config["temperature"] < 0.8 if config["model"] == "gpt-4o" else True,
# Max tokens must be at least 512
lambda config: config["max_tokens"] >= 512,
],
)
def my_function(query: str) -> str:
...
Lambda constraints can also receive metrics from past trials:
constraints=[
lambda config, metrics: metrics.get("cost", 0) <= 0.10,
]
Builder-Style Constraints
For typed parameters, use the builder methods on Range, IntRange, and Choices objects combined with the implies() function:
from traigent import Range, IntRange, Choices, implies
model = Choices(["gpt-4o-mini", "gpt-4o"])
temperature = Range(0.0, 1.0)
max_tokens = IntRange(100, 4096)
@traigent.optimize(
eval_dataset="evals.jsonl",
objectives=["accuracy"],
model=model,
temperature=temperature,
max_tokens=max_tokens,
constraints=[
# If model is gpt-4o, temperature must be <= 0.7
implies(model.equals("gpt-4o"), temperature.lte(0.7)),
# If model is gpt-4o-mini, max_tokens must be >= 256
implies(model.equals("gpt-4o-mini"), max_tokens.gte(256)),
],
)
def my_function(query: str) -> str:
...
Three Syntax Styles for Constraints
All three produce equivalent Constraint objects:
from traigent import Range, Choices, implies, when
model = Choices(["gpt-4o-mini", "gpt-4o"])
temp = Range(0.0, 1.0)
# 1. Functional (canonical)
implies(model.equals("gpt-4o"), temp.lte(0.7))
# 2. Operator-based (concise)
model.equals("gpt-4o") >> temp.lte(0.7)
# 3. Fluent (readable)
when(model.equals("gpt-4o")).then(temp.lte(0.7))
Combining Conditions
Use & (and), | (or), ~ (not) operators to combine conditions:
from traigent import Range, Choices, implies
model = Choices(["gpt-4o-mini", "gpt-4o", "claude-3-5-sonnet-20241022"])
temp = Range(0.0, 1.5)
max_tokens = IntRange(100, 4096)
constraints = [
# If model is gpt-4o AND temperature is high, require many tokens
implies(
model.equals("gpt-4o") & temp.gte(0.8),
max_tokens.gte(1024),
),
# If model is NOT gpt-4o-mini, temperature must be <= 1.0
implies(
~model.equals("gpt-4o-mini"),
temp.lte(1.0),
),
# If model is gpt-4o OR claude, limit temperature
implies(
model.equals("gpt-4o") | model.equals("claude-3-5-sonnet-20241022"),
temp.lte(0.9),
),
]
Operator precedence warning: Python precedence is ~ > >> > & > |. Always use parentheses when combining &/| with >>:
# Correct
(model.equals("gpt-4o") & temp.lte(0.7)) >> max_tokens.gte(1000)
# Wrong -- evaluates as model.equals("gpt-4o") & (temp.lte(0.7) >> max_tokens.gte(1000))
model.equals("gpt-4o") & temp.lte(0.7) >> max_tokens.gte(1000)
See references/constraints.md for the full constraint system reference.
ConfigSpace Object
For complex setups, bundle parameters and constraints into a ConfigSpace:
from traigent import Range, IntRange, Choices, implies
from traigent.api.config_space import ConfigSpace
# Define parameters
temperature = Range(0.0, 1.0, name="temperature", unit="ratio")
max_tokens = IntRange(100, 4096, name="max_tokens", unit="tokens")
model = Choices(["gpt-4o-mini", "gpt-4o"], name="model")
# Define constraints
constraints = [
implies(model.equals("gpt-4o"), temperature.lte(0.7)),
]
# Bundle into ConfigSpace
space = ConfigSpace(
tvars={"temperature": temperature, "max_tokens": max_tokens, "model": model},
constraints=constraints,
description="QA optimization space",
)
# Validate a configuration
result = space.validate({"temperature": 0.5, "max_tokens": 2000, "model": "gpt-4o"})
print(result.is_valid) # True
# Check satisfiability (are there any valid configs?)
sat = space.check_satisfiability()
print(sat)
# Use with decorator
@traigent.optimize(
eval_dataset="evals.jsonl",
objectives=["accuracy"],
configuration_space=space,
)
def my_function(query: str) -> str:
config = traigent.get_config()
...
Common Patterns
Model Selection with Cost Awareness
from traigent import Range, Choices, implies
model = Choices(["gpt-4o-mini", "gpt-4o"])
temperature = Range(0.0, 1.0)
@traigent.optimize(
eval_dataset="evals.jsonl",
objectives=["accuracy", "cost"],
model=model,
temperature=temperature,
constraints=[
implies(model.equals("gpt-4o"), temperature.lte(0.7)),
],
)
def answer(question: str) -> str:
config = traigent.get_config()
...
Reasoning-Effort Knobs (native effort parameters)
For models exposing a native effort control (reasoning_effort / thinking budgets), treat it as a
categorical knob — with three field-measured rules (same fold, three token budgets incl.
uncapped, plus a same-day paired rerun; measured on real benchmark runs, 2026-07):
- Don't assume more effort = more accuracy. On a task the model already saturates,
highmatchedmediumon accuracy (+1.2 pp, statistical noise) while billing ~2× the reasoning tokens — and its extra spend concentrated on defective eval items (a self-contradictory question consumed up to ~3.7K reasoning tokens per call and still failed under every effort). Sweep effort as a knob and let the data decide; expectmediumto win cost-adjusted. - Pair the effort knob with output headroom. A truncated call
(
finish_reason == "length") scores 0 and corrupts the sweep, so sizemax_tokensabove the reasoning budget:≥ 2048forlow/medium, and — because truncation was still observed at4096underhigh—≥ 8192whenhighis in the space. (Canonical, model/effort-dependent floor:references/parameter-types.md→ "Reasoning models need more than the defaultmax_tokensrange".) - One knob per mechanism. Don't put a prompt-CoT knob and a native effort knob in the same space expecting them to add: prompt-CoT measured as a no-op (+0.4 pp) on a native-reasoning model. Redundant knobs waste grid budget and muddy variable-importance readouts.
config_space = {
"model": ["openrouter/openai/gpt-oss-120b"],
"reasoning_effort": ["low", "medium", "high"],
"max_tokens": [8192], # headroom rule: ≥8192 because "high" is in the space (4096 still truncated)
}
RAG Pipeline Tuning
from traigent import Range, IntRange, Choices
@traigent.optimize(
eval_dataset="rag_evals.jsonl",
objectives=["accuracy"],
model=Choices.model(provider="openai"),
temperature=Range.temperature(conservative=True),
k=IntRange.k_retrieval(),
chunk_size=IntRange.chunk_size(),
chunk_overlap=IntRange.chunk_overlap(),
retriever=Choices.retriever_type(),
)
def rag_query(question: str) -> str:
config = traigent.get_config()
...
Multi-Agent Parameters
Assign parameters to specific agents using the agent keyword:
from traigent import Range, Choices
@traigent.optimize(
eval_dataset="evals.jsonl",
objectives=["accuracy"],
planner_model=Choices(["gpt-4o-mini", "gpt-4o"], agent="planner"),
planner_temperature=Range(0.0, 0.5, agent="planner"),
executor_model=Choices(["gpt-4o-mini", "gpt-4o"], agent="executor"),
executor_temperature=Range(0.5, 1.0, agent="executor"),
)
def multi_agent_workflow(task: str) -> str:
config = traigent.get_config()
...
Temperature Tuning Only
The minimal configuration -- just optimize temperature:
import traigent
from traigent import Range
@traigent.optimize(
eval_dataset="evals.jsonl",
objectives=["accuracy"],
temperature=Range.temperature(),
)
def my_function(query: str) -> str:
config = traigent.get_config()
...
Next Steps
You have defined the search space. Now run it:
traigent-optimize-run— launch the optimization: algorithm choice (auto/grid/random/cloud-only smart),max_trials, cost limits, and the mandatory dry-run-first gate. This is the next lifecycle step (configuration-space → run-optimization → analyze-results).traigent-setup-decorator— if you still need to wire evaluation/objectives/injection onto@traigent.optimize()before running.
See Also
traigent— lifecycle driver (dry-run-first / cost-approval mandate)traigent-optimize-run— run the space you just definedtraigent-analyze-results— readbest_config/best_scoreand the trade-off after the run
Traigent Interaction Policy
Track an interaction profile and adapt to it. Persona (stable): control=delegate|guided|inspect,
expertise=se|ds|unknown. Mood (this session): pace=execute|balanced|explore. Default when
unknown: guided,se,balanced. Infer from explicit user statements first, then recent behavior;
an explicit correction wins immediately. Never store or send this profile anywhere by default.
Fetch the live profile (when available)
At session or skill start, if a configured Traigent client is available, seed the profile from the backend with the skill name:
policy = None
try: policy = await client.get_interaction_policy(skill="<this skill>")
except Exception: pass
Treat the returned profile as the STARTING seed: its control/expertise/pace axes plus
question_budget, options_max, and jargon_level replace the static defaults below. Explicit user
corrections in-conversation ALWAYS override the seed. If the call is unavailable or
fallback_policy="static_v1", simply use the static defaults below; the SDK already fails soft.
- Always be concise.
- Match terminology to expertise. For
se: plain engineering words; define each Traigent or statistics term once in plain language (no Bayesian / variance-decomposition / Pareto jargon unless asked). Fords: compact optimization and statistical terms are fine. - Presenting options: show at most 3, mark exactly one Recommended, and give one short persona-appropriate trade-off per option.
- Autonomy. For
delegateorexecute: pick the recommended reversible action and proceed, asking only at hard gates. Forguided: offer options with a recommendation at the key decisions. Forinspectorexplore: give brief rationale or evidence before asking, and ask before branch choices. - Hard gates — always confirm regardless of persona: paid or provider model calls, sending data or private content off the machine, destructive edits, decisions the Traigent service is meant to return, and any missing fact the step truly requires.
- Always end by recommending the next Traigent skill or action to take.
- Never weaken Traigent safety: dry-run before any paid run; get explicit approval before real cost or before any data leaves the machine; treat service-returned plans and next steps as authoritative. Never put the persona profile or any private content into telemetry, run metadata, experiment names, logs, or provenance files.
What ships with it: 4 files
33.9 KB alongside SKILL.md
references/
- constraints.md10.4 KB
- parameter-types.md13.3 KB
- structural-spine.md7.8 KB
- provenance.json2.4 KB