yvligo

AdVal blog

yvligo is DeepSeek-V4.1-Flash-1017 post-trained to run X (Twitter) Ads campaigns as a tool-using agent. Given a client's brief, it:

  • sets up campaigns through X Ads API tools;
  • checks on them through the flight and adjusts targeting, bids and budgets;
  • ends with a recap to the client.

It is a LoRA adapter trained with supervised fine-tuning on expert traces: complete campaign runs by an expert agent in a simulated X Ads environment. A run became a trace only when it beat a scripted baseline and broke none of the brief's rules.

Results

We ran each agent once on the 45 briefs of AdVal, our benchmark of agents running ad campaigns on a simulated X Ads market, at the same rollout seed for every agent. None of these briefs or their worlds appear in the training data.

A run scores its conversions over par: the expected conversions its campaigns drove, divided by those of a scripted baseline in the same world and seed. The baseline runs one ad group on the brief's rules at X's default AUTO bid.

Agent Geometric mean of conversions ÷ par yvligo ÷ agent, paired by brief (SE) Briefs yvligo is ahead on
Expert (source of the training traces) 1.349 ×0.972 (×1.025) 47%
yvligo 1.311
Gemini 4 Argon (Antigravity) 1.198 ×1.094 (×1.034) 67%
GPT-6.1 Sol (Codex) 1.145 ×1.145 (×1.035) 73%
DeepSeek-V4.1-Flash, before training (same setup as yvligo) 1.095 ×1.196 (×1.036) 80%
Grok 4.7 (Grok Build) 1.087 ×1.206 (×1.038) 80%
Claude Opus 5.5 (Claude Code) 1.068 ×1.228 (×1.033) 89%
GPT-6 Astra (Codex) 1.058 ×1.239 (×1.036) 82%
Muse Spark 1.3 (Muse Code) 1.041 ×1.259 (×1.040) 89%
Inkling 2 Small (Claude Code on Tinker) 1.023 ×1.282 (×1.032) 91%
Claude Haiku 5.5 (Claude Code) 1.012 ×1.295 (×1.037) 89%
Muse Wonder 1.0 (Muse Code) 1.007 ×1.302 (×1.040) 89%
Claude Sonnet 5.5 (Claude Code) 0.930 ×1.409 (×1.043) 96%
GPT-6 Luna (Codex) 0.738 ×1.775 (×1.244) 93%
Nemotron 3.5 Lightning (Claude Code on OpenRouter) 0.213 ×6.147 (×1.469) 96%

The other models ran in their own agent CLIs at medium reasoning effort.

Across the 45 briefs, yvligo:

  • never scored under 0.8 of par (its lowest was 0.842);
  • wrote an accurate recap every time;
  • had 2.3% of its tool calls return an error (the expert 1.6%);
  • broke one rule, as did the expert: on a phones-only brief it also advertised on desktop;
  • gated to the brief's minimum age on 5 of the 11 briefs that set one; the expert never did.

X's policy and the brief set different kinds of requirements. X's policy is legal: alcohol ads in the US must target 21+, and X disapproves an ad group that breaks it. The brief says who can convert, such as UK residents on phones aged 18+; reaching anyone else wastes spend but breaks no law. Matching the brief's markets and platforms costs nothing, so missing them is an error. Matching its minimum age does cost: X only age-targets people whose age it knows, so an 18+ gate also drops adults of unknown age. Leaving it out can pay, and neither choice counts against a run.

Training

Traces. The expert ran 444 campaigns: 222 briefs, two rollout seeds each. A run was kept when it:

  • finished;
  • scored at least par;
  • scored at least as well as the base model on the same brief and seed;
  • passed the brief's rule checks.

That gave 312 traces from 181 of the 196 training briefs; the other 26 briefs were held back for validation. Each trace is a whole run of up to 262,144 tokens: the brief, every reasoning step, tool call and tool result, and the final recap.

Fine-tuning. Supervised fine-tuning on Tinker:

  • loss on every assistant turn;
  • LoRA rank 32, alpha 32, on all linear layers;
  • Adam (β₁ 0.9, β₂ 0.95, ε 1e-8), 8 traces per step;
  • learning rate 1e-4, decaying linearly over a planned 117 steps (three epochs).

Checkpoint. We checked the agent's behaviour after each training block (steps 10, 20, 39 and 59). This adapter is step 39: one epoch, about 24M tokens. The next checkpoint, at step 59, broke a tool-call format and was rejected. Validation loss on 22 held-out traces fell from 0.415 to 0.366.

Chat format. DeepSeek V4.1 with thinking at low effort, keeping earlier turns' reasoning in the context. We used tinker-cookbook's renderer, which matches DeepSeek's API token for token.

Source checkpoint: tinker://cd80698b-c69b-5061-b324-a416cee754e4:train:0/weights/block3-step39

How to use

This is a standard PEFT LoRA adapter for deepseek-ai/DeepSeek-V4.1-Flash-1017. Load it with any stack that serves the base model with LoRA adapters. With Transformers and PEFT:

from transformers import AutoModelForCausalLM
from peft import PeftModel

base = AutoModelForCausalLM.from_pretrained("deepseek-ai/DeepSeek-V4.1-Flash-1017", torch_dtype="auto", device_map="auto")
model = PeftModel.from_pretrained(base, "loglogai/yvligo")

It was trained and measured in one agent setup:

  • the system prompt is DeepSeek Harness's headless agent prompt;
  • the user message is the client's brief;
  • the tools are an X Ads API surface as MCP tools: 78 tools under mcp__ads__*, plus mcp__scheduler__wait_until to pause until later in the flight;
  • thinking is on at low effort, with earlier turns' reasoning kept in the context.

It expects to act through tools and to end the session with a recap to the client.

Limitations

  • Keyword gains. Part of its gain over the base model comes from keyword targeting, which the simulator may reward more than X does.
  • Evaluation awareness. In 18 of the 45 runs, its reasoning remarks on being evaluated.

License

MIT, the same as the base model.

Downloads last month
96
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for loglogai/yvligo

Adapter
(11)
this model