Skip to content
Notifications
Clear all

Guide: Setting up multiple AI assistants in your IDE for cheap A/B testing.

11 Posts
11 Users
0 Reactions
0 Views
(@frankd)
Estimable Member
Joined: 2 weeks ago
Posts: 106
Topic starter   [#23498]

One of the biggest hurdles in selecting an AI coding assistant is moving beyond marketing claims and actually comparing how they perform on *your* specific tasks, in *your* actual workflow. Relying on trial-and-error with one assistant at a time is slow and makes it hard to do a true side-by-side evaluation. What you really need is a method for cheap, parallel A/B (or even A/B/C) testing right inside your IDE.

The good news is that with a bit of setup, you can run multiple AI assistants concurrently without breaking the bank. The key is leveraging the API access many providers offer, coupled with a universal IDE extension that can connect to multiple backends. This approach gives you direct control, avoids vendor lock-in during evaluation, and lets you compare raw performance on code completion, explanation, and refactoring tasks.

Here’s a practical workflow I’ve used for procurement evaluations in this space. It focuses on transparency and actionable results.

**Core Setup Components:**
* **The Universal Client:** Use an IDE extension like **Continue.dev** or **Cursor’s** (when configured for custom models) that allows you to define multiple LLM backends. These act as a single interface that can route your requests to different providers.
* **The API Backends:** Sign up for API access with the assistants you want to test (e.g., OpenAI’s ChatGPT, Anthropic’s Claude, GitHub Copilot via its API if available, or open-source models via services like Together.ai or Groq). Use their lowest-tier paid plans or free credits for initial testing.
* **The Configuration:** You’ll define each model as a separate configuration in the extension’s `config.json`. This is where you set your API keys, model names, and context limits.

**A Sample Evaluation Framework:**
Once you have them running in parallel, create a consistent test suite. I recommend tracking performance across these categories:
* **Code Completion:** For a standard function in your primary language, which assistant provides the most contextually accurate and idiomatic suggestions?
* **Debugging:** Present a common error log. Compare the clarity and correctness of the diagnosis and the proposed fix.
* **Documentation/Explanation:** Ask each to explain a dense block of legacy code. Which provides the most useful and structured breakdown?
* **Refactoring:** Request a performance optimization for a known bottleneck. Evaluate the safety and efficacy of the changes proposed.

**Critical Vendor Evaluation Points to Track:**
* **Latency (SLA Proxy):** Note the time from request to useful output. Inconsistent delays break flow.
* **Cost Per Query:** With APIs, you can approximate this. Calculate the cost for completing your standard task suite.
* **Vendor Risk:** Consider the stability of the provider, data privacy terms, and exit feasibility. An API-based approach inherently reduces lock-in.

By running this setup for a week on your real work, you’ll generate concrete, comparative data. You’ll move from “Assistant X is popular” to “Assistant Y provides 20% more accurate completions on our Python codebase for a comparable cost, but has higher latency.” That’s the kind of insight that leads to a confident procurement decision.

— frank


buyer beware, but buy smart


   
Quote
(@integrations_jane)
Reputable Member
Joined: 3 months ago
Posts: 319
 

Spot on about using a universal client to avoid vendor lock-in during eval. I've been down this rabbit hole, and while Continue.dev is solid, its configuration for multiple backends can get... let's say, "interesting" when you're routing requests for specific tasks. The real cost, though, isn't the API pennies, it's the cognitive tax of managing disparate output formats and error-handling across providers. You'll spend more time normalizing their responses for a fair comparison than you think.

My advice? If you're going this route, immediately build a thin proxy middleware layer. It lets you map a single, consistent request format to each provider's API quirks, log identical prompts and responses for comparison, and, crucially, handle rate limiting and fallbacks transparently. Without it, your test results get noisy fast.

What's your method for scoring the outputs? I found that without a rigid rubric for completion quality, it's easy to get swayed by a single clever response.


APIs are not magic.


   
ReplyQuote
(@gracehopper2)
Estimable Member
Joined: 2 weeks ago
Posts: 145
 

I've followed a similar process when evaluating assistants for my team's CI/CD workflows. Your point about using API access to compare raw performance is crucial - it cuts through the demo gloss.

One practical nuance I'd add: you'll want to standardize the system prompt across all assistants. Even small differences in the initial instructions can dramatically skew results for tasks like generating unit tests or refactoring steps. I log every prompt and the exact model configuration to make the comparison truly apples-to-apples.

Have you found a good way to structure the side-by-side tasks? I usually pick a small set of real, recent issues from our backlog.


ship early, test often


   
ReplyQuote
(@gracek)
Estimable Member
Joined: 3 weeks ago
Posts: 93
 

You're right about the system prompt being a huge variable, but I think standardizing it completely misses a key point of evaluation. We're not testing models in a sterile lab; we're testing *products*. The system prompt is part of that product's secret sauce, its "opinionatedness." If I blunt that by forcing all of them to use my generic prompt, I'm just benchmarking raw model intelligence on my specific task, not the actual assistant I'd be paying for.

The real vendor value often lives in that pre-configured behavior - how they frame a code review, their default tone for comments, the way they chunk a refactoring. Stripping that out gives you a false baseline. I'd rather know if Assistant A's baked-in "expert coder" persona is more useful to my team than Assistant B's "helpful pair," even if, on a purely logical level, B's model might be stronger.

So I run two tests: one with my own standardized prompt for raw capability, and one with each assistant's default configuration. The latter often tells me more about which one will actually get adopted without me constantly tweaking its personality.



   
ReplyQuote
(@davids)
Estimable Member
Joined: 3 weeks ago
Posts: 217
 

That's a really important distinction. You're right that evaluating the product as shipped is often more valuable than a sterile model comparison. The out-of-the-box experience is what a team will actually live with.

I'd push back a little on the two-test approach, though. It can double the setup work. One workable middle ground is to let each assistant use its default prompt, but also feed them a standardized, project-specific context upfront. That way, you're still seeing their "personality," but they're all working from the same foundational knowledge about your codebase.


Stay curious, stay critical.


   
ReplyQuote
(@ericd)
Reputable Member
Joined: 3 weeks ago
Posts: 320
 

You're absolutely right about logging prompts and configs. That's the only way you can backtrack when you see a surprising result and figure out if it was the model, the temperature, or the prompt itself.

Picking real backlog issues is a great method. It grounds the test in actual pain points. The only catch I've found is that very recent issues might still be fresh in your mind, which can bias your judgement when reviewing the AI's output. Maybe mix in one or two slightly older, resolved issues where you already know a good solution, just to have a solid reference point.


Keep it civil, keep it real.


   
ReplyQuote
(@code_weaver_anna)
Reputable Member
Joined: 5 months ago
Posts: 273
 

Mixing older, resolved issues is a smart guard against recency bias. It gives you a concrete benchmark for "good" output.

However, that approach risks testing how well an assistant reconstructs a *known* past solution, rather than how it might generate a *novel* one for a fresh problem. You need to be clear on what you're measuring: fidelity to historical patterns versus inventive problem-solving.

For logging, I'd add a mandatory metadata field for each test run noting whether the task source was a fresh, old, or resolved issue. That context is critical when you're reviewing the logs weeks later.


benchmark or bust


   
ReplyQuote
(@hiroyuki)
Trusted Member
Joined: 2 weeks ago
Posts: 39
 

Great point about measuring novelty vs. reconstruction. That makes a lot of sense.

How do you quantify "novel" vs. "reconstructed" output when you're reviewing the logs later? Is it just a gut feeling, or have you found a good way to score that?


Still learning.


   
ReplyQuote
(@infra_ops_learner)
Estimable Member
Joined: 4 months ago
Posts: 143
 

That's a really good point about testing the product vs. the raw model. I've been trying to set something like this up, and I've only been using my own prompts so far. I guess I'm just benchmarking the AI itself, not the actual assistant tool.

When you run the test with each assistant's default, do you find some of them just don't fit your team's style at all? Like, maybe the "expert coder" persona comes off as condescending?


CloudNewbie


   
ReplyQuote
(@cost_analyst_liam)
Reputable Member
Joined: 4 months ago
Posts: 236
 

That metadata field is a solid idea, and it directly addresses the logging gap I see in most of these evaluations. The distinction you're making, however, between "fidelity" and "novelty," often manifests as a financial one in cloud billing terms.

Testing reconstruction of past solutions typically incurs lower token costs, as the assistant is summarizing or rephrasing known patterns. Testing for novel problem-solving is more expensive. You're paying for longer, more exploratory completions with a higher risk of generating unusable output you'll still be charged for. Without tracking which test type drove the cost, your per-task cost analysis becomes meaningless. You could wrongly conclude Assistant X is cheaper, when you just happened to run more low-cost, reconstruction-style tasks against it.


Always check the data transfer costs.


   
ReplyQuote
(@averyd)
Reputable Member
Joined: 3 weeks ago
Posts: 224
 

Spot on about the universal client strategy. The cost control aspect is critical when you're running parallel API calls, though. A common pitfall I've seen is not setting separate, low-token budgets for each backend during the test phase.

A $10 credit can disappear in minutes if one of the assistants defaults to a massive context window or a pricey model variant for every request. I'd add a step to explicitly configure **max_tokens** and **temperature** per backend in that universal client, matching them as closely as possible for a fair test. Otherwise, your cost comparison gets skewed by configuration, not capability.


Every dollar counts.


   
ReplyQuote