Looking for an Open-Source LLM to Replace Llama 3.3 70B Versatile

Hi everyone,

I was previously using Llama 3.3 70B Versatile through Groq for my application, but this model has been shut down by Groq, so I need to replace it with another model.

I am currently looking for a fully open-source/open-weight model available on Hugging Face that would be suitable for my use case.

My application involves:

  • RAG-based workflows

  • Agentic AI workflows

  • Prompt engineering and prompt generation

  • Structured/JSON output

  • Tool/function calling

  • Good instruction following

  • Reasoning capability

  • Multilingual input/output

  • Production use

I am particularly interested in models with smaller parameter sizes than 70B if they can provide comparable performance.

Some models I am currently considering are:

  • Qwen

  • Mistral

  • DeepSeek

  • Gemma

  • GPT-OSS

Could you please recommend 2–5 open-source models that would be good replacements for Llama 3.3 70B for this type of application?

It would also be helpful if you could share your experience regarding:

  1. Model quality compared with Llama 3.3 70B

  2. Reasoning capability

  3. Tool/function calling

  4. JSON/structured output reliability

  5. Context length

  6. VRAM/RAM requirements

  7. Inference speed

  8. Production deployment experience

  9. Recommended quantization, if applicable

I am planning to test multiple models on the same set of prompts and compare their results before selecting the final model.

Thanks in advance for your recommendations!

Hmm… the situation changes quite a bit depending on whether you’re looking for model weights or an endpoint…


If what you mainly need is a replacement for the old Groq endpoint, I would actually narrow the first pass quite a lot:

  1. openai/gpt-oss-120b — my first production migration candidate.
  2. qwen/qwen3.6-27b — the most interesting challenger, especially if your workflow depends on parallel tool calls, vision, or Qwen’s behavior on your multilingual workload.

That is not just a model-ranking choice. Groq’s own deprecation page lists exactly those two as the recommended replacements for llama-3.3-70b-versatile.

There is one distinction I think is worth making first, though:

Groq retired the Groq model ID / offering llama-3.3-70b-versatile; Meta’s Llama 3.3 70B Instruct weights did not disappear.

Groq says this August 16, 2026 shutdown applies to Free and Developer-tier usage; Enterprise customers with committed-spend contracts are not affected. So there are really three different migration problems hiding inside the question:

Need a replacement Groq endpoint?
    → start with gpt-oss-120b
    → test qwen3.6-27b where its specific advantages matter

Need to preserve Llama 3.3 behavior as much as possible?
    → keep Llama 3.3 and change provider/runtime

Actually looking for weights to self-host?
    → then VRAM, RAM, quantization, runtime and model architecture
       become first-class selection criteria

For the Groq endpoint case, gpt-oss-120b currently looks like the lowest-friction default to me, but there is one compatibility check I would do very early:

Does your existing agent actually depend on parallel tool calls?

Groq currently lists parallel tool calling as supported for the old Llama 3.3 endpoint and for Qwen3.6, but not for GPT-OSS 120B. If your workflow relies on that behavior, Qwen becomes much more interesting immediately.

A rough current comparison on Groq looks like this:

Groq endpoint openai/gpt-oss-120b qwen/qwen3.6-27b
Groq status Production Preview
Advertised speed ~500 tok/s ~500 tok/s
Context on Groq 131,072 131,072
Max completion on Groq 65,536 16,384
Paid input / 1M tokens $0.15 $0.60
Paid output / 1M tokens $0.60 $3.00
Current Free-plan limits 30 RPM / 1K RPD / 8K TPM / 200K TPD same
Local/remote function calling Yes Yes
Parallel tool calls No Yes
Remote MCP Yes Yes
Groq built-in tools Yes No
JSON Object mode Yes Yes
Strict JSON Schema output Yes No; use JSON Object mode
Vision input No Yes
Underlying architecture 117B MoE, ~5.1B active/token 27B dense

Current sources: Groq supported models, tool-use matrix, Structured Outputs, Free-plan rate limits, GPT-OSS 120B endpoint, and Qwen3.6 endpoint.

The Production vs Preview distinction is probably the biggest operational reason I would test GPT-OSS first. Groq explicitly says Production models are intended for production use and receive a clear migration path when deprecated, whereas Preview models are evaluation-oriented and can be discontinued at relatively short notice.

That does not mean GPT-OSS is permanent. Nothing in a hosted model catalog should be treated as permanent. But given that your original problem was caused by an endpoint retirement, I would give that service-status distinction real weight.

Groq has also repeatedly used gpt-oss-120b as a migration target for other retired endpoints. I would treat that as a useful stability signal, not a guarantee.

The other major advantage for your use case is structured output. Groq currently supports strict JSON Schema constrained decoding only on GPT-OSS 20B/120B. That is materially different from merely asking a model to “return JSON.”

One caveat is important: Groq currently says its Structured Outputs feature cannot be combined with streaming or tool use. So I would not design around the assumption that one call can simultaneously give you strict constrained JSON and the normal tool-calling loop. They are better treated as separate contracts in the application.

Qwen3.6 is still very worth testing, though. Its official model card describes it as a 27B dense model aimed heavily at agentic coding and real-world utility, and Groq gives it several useful capabilities that GPT-OSS does not currently have there: parallel tool calls, image input, and explicit thinking/non-thinking modes. If your actual multilingual or agent workloads strongly prefer it, that can outweigh the Preview-status disadvantage.

I would especially keep Qwen in the comparison if any of these are important:

  • multiple independent tools should be called in parallel;
  • the same endpoint needs image/document-image input;
  • your production workload is substantially multilingual;
  • your real agent traces work noticeably better with Qwen;
  • a much smaller underlying weight set matters because you may later self-host.

For multilingual use I would test the actual language boundaries in your application, rather than infer a winner from benchmark branding. OpenAI describes the gpt-oss pretraining dataset as mostly English and text-only, while Groq reports strong multilingual evaluation for the hosted GPT-OSS endpoint; Qwen is also explicitly positioned as multilingual. That makes this a good candidate for a very small application-specific test rather than a benchmark-based conclusion.

I think your existing same-prompt test is already the right starting point

I would not build a large new benchmark before trying the prompts you already have.

In fact, Groq’s own migration guide recommends starting from parameter/prompt parity first, measuring, and only then adapting prompts deliberately.

I would use two passes:

Pass 1 — migration/regression check

Keep the existing production prompts and relevant sampling settings as close as practical.

This answers:

“If I replace only the model ID, what breaks?”

Pass 2 — best supported profile

For the cases that regress, then try the model’s intended settings — reasoning mode, prompt adaptation, sampling changes, etc.

This answers:

“If I actually deploy this model properly, how good can the replacement become?”

Keeping those two passes separate prevents prompt tuning from hiding migration regressions.

I would also avoid collapsing everything into one average score. For the requirements you listed, a handful of small failure-oriented cases can reveal much more.

For example:

  • RAG: one normal grounded answer, one answer that is absent from the retrieved material, and one case where the retrieved document deliberately contradicts something the model is likely to “know”.
  • Prompt generation: generate a prompt from 8–10 explicit constraints, then change exactly one requirement on the next turn and see whether unrelated requirements drift.
  • JSON: distinguish “valid JSON”, “schema-valid JSON”, and “the values inside the JSON are actually correct”.
  • Tool use: no-tool case, single-tool case, parallel independent tools, and a dependent two-step call.
  • Instruction following: retain several constraints across a few turns rather than testing only one-shot compliance.
  • Multilingual: non-English user input + English tool schema or RAG documents + requested-language answer.
  • Agent stability: for the few cases that actually matter, repeat them a couple of times rather than assuming one successful trajectory is representative.

For tool use in particular, I find this decomposition useful:

Did it decide correctly whether a tool was needed?
    ↓
Did it select the right tool?
    ↓
Were the arguments semantically correct?
    ↓
Did the API/parser produce a usable structured call?
    ↓
Did the tool actually execute?
    ↓
Did the model use the returned result correctly?
    ↓
Did it stop when the task was complete?

A failure in any one of those layers can look like “the model is bad at agents”, but the fix can be completely different.

What exactly was shut down?

llama-3.3-70b-versatile is a Groq model ID, not the Hugging Face repository name for Meta’s weights.

Groq’s current deprecation history says:

  • deprecation announced: June 17, 2026;
  • shutdown: August 16, 2026;
  • affected: Free and Developer-tier usage;
  • recommended replacements:
    • openai/gpt-oss-120b
    • qwen/qwen3.6-27b

The underlying Meta Llama 3.3 70B Instruct model still exists and can be served elsewhere or self-hosted.

That distinction matters because there are two very different ways to minimize migration risk:

same provider + different model
vs.
same model + different provider

Neither is automatically safer in every application.

Changing only the model can preserve the API/provider behavior while changing generation behavior.

Changing only the provider can preserve the weights while changing the serving implementation, tool features, context limits, decoding defaults, latency, and API details.

So I would think of the deployable thing as more than just a model name.

Why I would start with GPT-OSS 120B on Groq

The strongest argument is operational rather than a claim that GPT-OSS is universally the better model.

Groq currently classifies openai/gpt-oss-120b as a Production model.

Its current Groq contract includes:

  • ~500 tok/s;
  • 131,072-token context;
  • 65,536 maximum completion tokens;
  • local/remote tool use;
  • Remote MCP;
  • Groq built-in browser/code tools;
  • JSON Object mode;
  • strict JSON Schema mode;
  • configurable reasoning;
  • current Free-plan access.

Its paid token pricing is also considerably lower than the current Qwen3.6 endpoint.

Groq’s deprecation policy says Production models are intended for production use and that a clear migration path will be supplied when one is retired.

By contrast, qwen/qwen3.6-27b is currently marked Preview, and Groq explicitly says Preview models should not be treated as production-stable because they may be discontinued on shorter notice.

Since endpoint longevity is part of the problem that brought you here, that is enough for me to make GPT-OSS the default first test.

There is also a history signal: Groq has made GPT-OSS 120B the recommended migration destination for several other retired models. I would not read that as a long-term guarantee, but it does suggest it currently occupies a fairly central place in their production catalog.

Where Qwen3.6 can still be the better choice

Qwen’s disadvantage here is mostly the current Groq service status, not an obvious lack of model capability.

The underlying Qwen3.6-27B model is Apache-2.0 licensed, 27B dense, multimodal, and explicitly aimed at agentic coding / iterative workflows.

On Groq it currently has:

  • ~500 tok/s;
  • 131K context;
  • text + image input;
  • local/remote tools;
  • Remote MCP;
  • parallel tool calls;
  • JSON Object mode;
  • thinking and non-thinking modes.

The parallel-call distinction could be particularly important.

Groq’s current tool support matrix lists:

  • old Llama 3.3 70B: parallel tools = yes;
  • Qwen3.6-27B: parallel tools = yes;
  • GPT-OSS 120B: parallel tools = no.

So if your existing Llama-based agent routinely emitted two or more independent tool requests in one turn, I would test that before doing much else. It is a concrete migration-contract difference, not a subtle benchmark issue.

Qwen also accepts image input on Groq, while GPT-OSS 120B is text-only there.

For multilingual behavior, I would let your actual languages decide. Qwen has good reasons to be in that test set, but I would not try to infer production multilingual quality from unrelated benchmark tables.

Structured JSON and tool calling are two different contracts

For the “structured/JSON output reliability” requirement, GPT-OSS currently has a useful provider-level advantage.

Groq’s Structured Outputs documentation supports strict constrained JSON Schema mode on:

  • openai/gpt-oss-20b
  • openai/gpt-oss-120b

With strict: true, Groq constrains decoding to the supported schema subset.

For other models such as Qwen3.6, Groq currently directs you to JSON Object Mode instead. That can ensure JSON syntax, but it is not the same contract as exact schema-constrained generation.

I would still score two things separately:

  1. structural correctness — did it conform to JSON/schema?
  2. semantic correctness — are the actual field values correct?

Constrained decoding can solve the first without solving the second.

There is also an implementation boundary worth noticing: Groq currently states that Structured Outputs cannot be combined with streaming or tool use.

So for an agent design I would keep these two paths conceptually separate:

tool invocation
    → tool-call API / tool schema

final application object
    → strict Structured Outputs, where appropriate

rather than assuming one mechanism guarantees both.

If you really mean model weights / self-hosting

Then I would answer the size/VRAM part very differently.

Both of the main candidates have permissive Apache-2.0 licensing:

But their architectures make the parameter labels easy to misread.

GPT-OSS 120B

OpenAI describes it as roughly:

  • 117B total parameters;
  • 5.1B active parameters per token;
  • 128 experts, 4 active per token;
  • MoE;
  • 128K-class native context.

The 5.1B active figure is mainly a compute characteristic. It does not mean the model has a 5.1B-sized weight footprint.

OpenAI’s official deployment target for its MXFP4 version is a single 80GB-class GPU.

Qwen3.6-27B

Qwen is a 27B dense model.

That means much less total weight storage than GPT-OSS 120B, even though all of its dense parameters participate rather than routing through only a few experts.

As a first-order weight-only estimate:

27B × 8 bits  ≈ 27 GB
27B × 4 bits  ≈ 13.5 GB

but those are not complete VRAM requirements. Real deployment also needs KV/cache or model state, runtime buffers, possibly vision components, and headroom; long context can change the picture substantially.

The Qwen model card advertises 262K native context and extension beyond that, but a hosted endpoint may expose a smaller contract — Groq currently exposes 131K. That is a good example of why model capability and endpoint capability should be recorded separately.

If self-hosting, I would compare an exact deployment tuple rather than just “Qwen vs GPT-OSS”:

model revision
+ exact quantized artifact
+ runtime/version
+ chat template
+ reasoning/tool parser
+ context allocation
+ sampling

For Qwen, its official card documents Transformers, vLLM, SGLang, local apps, and quantized deployment paths.

For GPT-OSS, OpenAI likewise treats the runtime implementation as part of what needs to be validated.

And for agent/tool workloads I would explicitly smoke-test tool arguments and structured output again after choosing the quantization. A quantization that looks fine on ordinary chat is not automatically equivalent on format-sensitive behavior.

If the main requirement is local/self-hosted compactness, Qwen3.6-27B is much easier to take seriously than the “120B” name on GPT-OSS would suggest from endpoint testing. The fact that both happen to run around 500 tok/s on Groq does not transfer to local hardware.

If you were already happy with Llama 3.3 itself

There is a third route that may be lower-risk than changing models:

keep Llama 3.3 and move the serving layer.

The Hugging Face Inference Providers model catalog currently still lists meta-llama/Llama-3.3-70B-Instruct through multiple providers.

Hugging Face also supports provider="auto" routing, including provider failover when a provider is unavailable.

Conceptually that lets you separate:

model identity
from
provider identity

which can make future provider churn easier to absorb.

I would call this a lower model-change path, not a zero-change path. Different inference backends/providers can still expose different:

  • context limits;
  • sampling/default behavior;
  • tool support;
  • structured-output support;
  • speed;
  • latency;
  • pricing;
  • serialization/API behavior.

So it still deserves a small regression test.

There is also a licensing difference worth noting if “fully open/open-weight” is part of the migration goal: GPT-OSS and Qwen3.6 use Apache 2.0, whereas Llama 3.3 remains under Meta’s Llama 3.3 Community License.

And if free usage is important, HF routing is not currently equivalent to Groq’s Free plan: HF currently gives Free users $0.10/month in routed Inference Providers credits, so this route is more compelling for behavior preservation/provider abstraction than for a generous free inference allowance.

A small migration check I would use

You already mentioned testing the same prompt set across candidates, which is probably the highest-value starting point.

I would make the existing workload the benchmark rather than trying to reproduce a large public leaderboard.

Something like this would cover most of the requirements you listed without turning migration into a research project:

Area One high-information case
RAG Retrieved evidence deliberately contradicts plausible model prior knowledge
RAG abstention Required answer is not present in retrieval
Prompt generation Generate from many constraints, then modify exactly one constraint
JSON Nested object with enums/IDs; score syntax, schema and values separately
Tool selection Several similar tools; only one is appropriate
Tool arguments Correct tool but non-trivial enum/date/identifier arguments
Parallel tools Two independent calls that can run simultaneously
Agent chain Tool A returns ID needed by Tool B
Multi-turn Preserve initial constraints several turns later
Multilingual Non-English query + English tools/docs + non-English final answer

You do not necessarily need to run every case repeatedly. If the two models agree, move on. If one case differentiates them, repeat that case a few times to see whether you found a stable difference or ordinary sampling variance.

I would also keep the first comparison intentionally boring:

same production prompt
same tool definitions
same context
same or equivalent sampling budget
same expected answer/test

Then optimize only the failures.

That gives you both:

  • a drop-in migration regression view, and
  • a later best achievable deployment view.

Those answer different questions, and both are useful.

For public benchmark numbers, I would use them only as hints for which cases deserve testing. Qwen publishes very strong coding/agent results on its model card, and GPT-OSS has strong reasoning/tool evaluations from OpenAI/Groq, but the evaluation harnesses, contexts, reasoning budgets and scaffolds are not identical. I would not turn those separate tables into a direct leaderboard.

So, if I had to reduce all of this to a default migration path:

If you mean “I need something to replace this Groq model ID”, I would test openai/gpt-oss-120b first.

It currently has the stronger production-service story, the same listed Free-plan allowance and roughly the same advertised generation speed as Qwen3.6, much lower paid token pricing, a larger output allowance, and strict JSON Schema support.

I would test qwen/qwen3.6-27b alongside it if parallel tool calls, vision, multilingual behavior, or your actual agent workload could change the decision. Its main problem in this particular comparison is not obvious capability — it is that Groq currently labels it Preview.

If you actually mean “I want weights that I can own and self-host”, then I would not use that ranking at all. Qwen’s 27B dense footprint becomes a major advantage, and a broader weight/runtime comparison makes sense.

And if Llama 3.3 itself was already doing exactly what you wanted, keeping the model and swapping the provider is also a perfectly reasonable migration branch rather than throwing away a known-good behavioral baseline.

This is exactly the kind of comparison where generic benchmarks get misleading.

If you can share the prompt set you’re planning to test, plus the 3 to 5 models you’re considering, I can help you turn it into a clean apples to apples eval around tool calls, JSON correctness, instruction following and reasoning.

Do you already have the prompts collected somewhere?

Thanks John, this is really helpful.

I’m now setting up a local LLM evaluation lab to compare GPT-OSS 20B, GPT-OSS 120B, and Qwen3.6-27B before making a production migration decision.

I’m currently using Django + Groq API and testing the models with the same prompts. I’m planning to evaluate:

  • Simple instruction following
  • Complex reasoning
  • JSON/structured output
  • Structured extraction
  • RAG
  • Multilingual capability
  • Tool/function calling
  • Long-context understanding
  • Ambiguous questions
  • Hallucination
  • Latency

I’d like to make this evaluation more systematic rather than manually checking every response.

What would you recommend as the best local setup and evaluation technique for this type of model comparison?

For example, would you recommend using LangSmith, a custom Python evaluation framework, or another evaluation tool?

Also, should I create a fixed evaluation dataset with expected outputs/criteria and run every model against the exact same dataset?

If you have a recommended architecture or workflow for doing this locally, I’d really appreciate your guidance.

Hmm, how about something like this?:


I think your basic direction is right. If the goal is to replace llama-3.3-70b-versatile inside an existing Django/Groq application, I would start with a small custom Python regression harness and a fixed application-specific dataset, then optionally put LangSmith on top for tracing, experiment comparison, human review, and later production monitoring.

I would not start by trying to find a single generic benchmark score that tells you which model is “best.” The more useful question is:

Which candidate preserves the application behavior you actually depend on, and what has to change when you migrate?

That is slightly different from “send exactly the same prompt to all three models.” The three current Groq candidates do not expose exactly the same endpoint capabilities, so I would try to keep the logical application contract fixed rather than forcing identical API parameters where they do not mean the same thing.

A practical first pass could be surprisingly small: something like 10–20 carefully chosen cases covering your important paths, each with explicit success criteria. LangSmith’s own evaluation guidance also recommends starting with a small manually curated set rather than immediately building a huge benchmark (evaluation concepts).

My default workflow would be roughly:

fixed eval case
    ↓
shared logical prompt/context/tools
    ↓
model/provider capability routing
    ↓
Groq API
    ↓
raw response + normalized trace
    ↓
deterministic checks where possible
    ↓
quality / reliability / latency / cost diagnostics

Then I would run one pass first, inspect the failures, fix any bad graders or bad assumptions, and only repeat the cases where the models actually differ. That is much cheaper and usually more informative than immediately doing, say, 15 cases × 5 seeds × 3 models.

One important Groq-specific wrinkle is that the three candidates are not feature-identical:

Capability GPT-OSS 20B GPT-OSS 120B Qwen3.6-27B
Local/function tool use Yes Yes Yes
Parallel tool calls No No Yes
JSON Object Mode Yes Yes Yes
Strict JSON Schema output Yes Yes No
Reasoning control low/medium/high low/medium/high none/default

See Groq’s tool-use matrix, Structured Outputs documentation, and API reference.

So I would treat an unsupported endpoint feature as UNSUPPORTED, not as a model-quality failure. For example, I would compare all three on ordinary JSON Object output, but keep strict JSON Schema as a separate capability probe for the two GPT-OSS models.

Similarly, “parallel tool calling” should probably not be a required correctness criterion. If GPT-OSS sequentially makes two correct independent calls and reaches the correct final state, that can still be a functional PASS; whether Qwen can issue both calls in one model turn is useful latency/capability metadata.

How I would build the dataset and graders

1. Start from representative application behavior, not benchmark categories

Your list already gives a good starting map:

  • instruction following
  • reasoning
  • extraction / structured output
  • RAG
  • tool use
  • multilingual behavior
  • ambiguity / hallucination
  • latency

I would turn those into concrete application cases rather than abstract benchmark questions.

For example, instead of:

Test reasoning.

use something closer to:

Given these three business rules and five records, compute the approved total.

Instead of:

Test tool calling.

use something like:

User:
Find the unpaid invoices for alice@example.test
and tell me the outstanding total.

Available tools:
find_customer(email)
get_open_invoices(customer_id)
cancel_invoice(invoice_id)   # decoy

Then use deterministic mock responses:

find_customer("alice@example.test")
→ {"customer_id": "cus_731"}

get_open_invoices("cus_731")
→ [
    {"invoice_id": "inv_41", "amount": 120.00},
    {"invoice_id": "inv_52", "amount": 64.50}
]

Now you can score several things separately:

correct tool selected?
correct email argument?
returned customer_id propagated to second call?
decoy tool avoided?
correct total = 184.50?
stopped after completing the task?

That gives much more diagnostic information than one “agent score.”

2. Reference outputs do not have to be one exact answer string

I would make the expected contract depend on the task.

For JSON extraction:

valid JSON?
required keys?
correct types?
identifier copied exactly?
enum normalized correctly?
no extra keys?

For RAG:

required evidence-derived fact present?
unsupported facts absent?
source/identifier preserved?
abstain or qualify when evidence is insufficient?

For tools:

correct tool?
correct arguments?
correct order/dependency?
tool result actually used?
unnecessary tool avoided?
correct final state?

For instruction following:

required constraints satisfied?
forbidden behavior absent?

For an open-ended response, that is where a rubric, pairwise review, or LLM-as-judge can become useful.

LangSmith supports exactly this sort of mix of code evaluators, human review, LLM-as-judge, and pairwise evaluation (LangSmith Evaluation). I would just keep the deterministic parts deterministic rather than asking another model to judge things that Python can check exactly.

3. Do not let the grader secretly require something the prompt never asked for

This sounds obvious, but it is an easy way to build an eval that looks rigorous and is actually noisy.

For example, if the scorer requires:

ticket_id == "INC-731"

the task should make it clear that technical identifiers must be preserved verbatim.

Likewise, if a response is semantically correct and your application does not care about two trailing spaces, an exact-string grader should probably not reject it for those spaces.

Conversely, do not normalize everything away. If identifier case matters, silently lowercasing both sides in the grader hides a real failure.

I would test the eval itself with at least one known-good/reference solution before trusting model scores.

4. Include both positive and negative cases

A useful small suite should contain some opposing cases.

For tools:

tool should be used
tool should not be used

For RAG:

answer is supported
answer is absent
supplied evidence conflicts with a plausible model prior

For ambiguity:

enough information to answer
not enough information, so clarification/abstention is appropriate

Otherwise a model can accidentally score well with a one-direction policy such as “always call a tool” or “always refuse when uncertain.”

5. Version the cases

Even a lightweight field is enough:

id: rag_prior_conflict_001
revision: 2

If you later discover that a prompt or scorer was ambiguous, update the revision rather than silently changing the test under the same identity.

RAG, tools, structured output, and reasoning are worth separating

RAG: freeze retrieval before evaluating the generator

For the first comparison, I would not compare the vector store, embedding model, chunker, retriever, and generation model all at once.

Start with:

same question
+ same fixed retrieved chunks
+ different candidate LLM

That answers:

Given the same evidence, which model grounds its answer correctly?

Then, if necessary, test retrieval separately:

did the expected chunk get retrieved?
what rank?
were irrelevant chunks ranked above it?

Only after those two parts are reasonably understood would I run the full end-to-end RAG pipeline.

That separation makes a bad answer much easier to diagnose: generation problem vs retrieval problem.

LangSmith’s current evaluation guidance also treats retrieval quality and final-answer quality as separable components (evaluation concepts).

Tools: deterministic mock tools first

Since you are already working in Django/Python, I would use small deterministic mock functions for the first regression suite.

That gives you:

  • no external API variance,
  • no extra credentials,
  • exact argument checking,
  • reproducible failure conditions,
  • easy dependent-tool cases,
  • easy retry/recovery cases.

One particularly useful test is environment feedback / replanning.

Example:

get_workspace_status("ws-legacy-42")
→ {
    "status": "moved",
    "new_workspace_id": "ws-731"
}

The model should then call:

get_workspace_quota("ws-731")

rather than retrying the stale ID, inventing the quota, or looping forever.

I would also score the actual outcome where possible, not just the final sentence. If a model says “ticket created successfully,” the mock database should really contain exactly one new ticket.

Groq’s local tool-calling flow maps cleanly onto this sort of application-controlled loop; the API returns the tool call, your application executes it, adds the tool result to the conversation, and continues (local tool calling).

Structured output: JSON Object and strict schema are different tests

This distinction matters for your exact model set.

Groq currently supports strict constrained JSON Schema output on:

  • openai/gpt-oss-20b
  • openai/gpt-oss-120b

but not Qwen3.6. Qwen can still use JSON Object Mode.

Also, Groq currently does not support Structured Outputs together with tool use or streaming (Structured Outputs).

So I would not make one test that says:

call tools
+ stream
+ return a strict schema

and then compare all three models.

I would split it into:

portable JSON-semantic case
strict-schema capability probe
tool-loop case

That preserves the thing you actually want to measure.

Reasoning: do not manufacture fake parameter parity

The reasoning controls are model-family-specific.

Groq currently documents:

Qwen3.6:
    reasoning_effort = none | default

GPT-OSS:
    reasoning_effort = low | medium | high

(reasoning docs)

So I would not define parity as “send medium to every model.”

For an initial migration pass, I would instead keep the task contract fixed and avoid unnecessary model-specific tuning. Then do a second pass using each shortlisted model’s appropriate settings.

It is also worth retaining finish_reason, token usage, and the separate reasoning field when available. A reasoning model can sometimes reach the right idea internally but spend the completion budget before emitting a usable final answer; operationally that still matters.

One more Groq-specific detail: when JSON mode or tool use is enabled, reasoning_format="raw" is not valid. Use parsed or hidden; explicitly requesting raw in those modes can return a 400 (reasoning docs). I would classify that as request/configuration failure rather than model failure.

A low-cost run order that should expose problems quickly

I would probably resist the temptation to build a huge benchmark and run everything five times immediately.

Something like this seems cheaper and more informative:

Stage 0 — preflight

Verify:

API key works
model ID exists
capabilities are routed correctly
response fields normalize correctly

Do not spend the rest of the run if preflight already failed.

Stage 1 — tiny smoke

Run one simple text case and perhaps one tool/JSON case against each candidate.

This catches obvious model-ID, request-shape, reasoning-format, and parser problems.

Stage 2 — one full pass over the small suite

For example:

~15 cases
× 3 models
× 1 run

The purpose is not yet a statistically impressive leaderboard.

The purpose is to build a failure map.

Stage 3 — inspect the disagreements/transcripts

For every interesting failure, ask:

Was the answer actually wrong?
Was the task underspecified?
Was the scorer wrong?
Was the feature unsupported?
Did the provider reject the request?
Did the tool parser fail?
Did the model simply vary stochastically?

I would do this before spending money on repeated trials.

Stage 4 — repeat only the important disagreements

Once a case is known to be valid, run the interesting ones perhaps 3–5 times.

LangSmith supports repetitions directly if you decide to use it (repeated evaluations).

For a production application I would care more about:

“Does this succeed reliably?”

than:

“Can this succeed at least once?”

So for high-value flows such as destructive actions, billing, tool arguments, or structured records, consistency matters more than a single lucky pass.

Stage 5 — recommended/tuned profile for the shortlist

Only now try model-specific settings:

Qwen thinking vs non-thinking
GPT-OSS low / medium / high reasoning
prompt adjustments
provider-native structured output

Keep these results separate from the initial parity/migration run.

Stage 6 — long context and production-like tests

Only run expensive long-context tests against the remaining candidates.

All three have large Groq context windows, but their output limits and endpoint behavior are not identical, so “131K context” alone does not make them operationally identical.

There is also a practical migration detail worth keeping separate from the semantic scores.

Groq has now shut down llama-3.3-70b-versatile for Free/Developer tier as of August 16, 2026; Enterprise committed-spend customers are exempt. Groq’s listed replacements are GPT-OSS 120B or Qwen3.6-27B (deprecation notice).

So if you can still run Llama 3.3 in your account, it would be useful to include it as a live control for the same cases.

If you cannot, I would turn representative historical Django requests/traces into migration fixtures instead:

input
old Llama behavior
what must be preserved
what is allowed to change
what would actually be an improvement

I would not require the replacement to reproduce every old Llama response literally, because that also freezes old mistakes.

Another thing I would keep out of a single “overall score” is deployment practicality. For the final decision I would probably look at separate columns for:

task quality
repeat reliability
latency
cost
capability coverage
deployment maturity

For example, Qwen3.6 is currently marked Preview on Groq (Qwen3.6-27B model page), while the GPT-OSS models are normal production offerings. That does not mean “do not use Qwen”; it just means I would not let a semantic-quality score silently answer the deployment-maturity question too.

There are also some potentially meaningful cost/throughput differences. Groq currently lists GPT-OSS 20B at about 1000 tokens/s and GPT-OSS 120B at about 500 tokens/s, with GPT-OSS 20B particularly inexpensive (20B, 120B). Qwen3.6 is also around 500 tokens/s on its current model page but has a different pricing/output-limit profile. Those are useful deployment columns after quality/reliability are understood, rather than reasons to bias the correctness graders.

One small measurement wrinkle: Groq currently supports automatic prompt caching for GPT-OSS 20B/120B. Repeated static prefixes such as system prompts and tool definitions can therefore lower later-request latency and input cost, and the API exposes cached-token usage (prompt caching). That is a real production benefit, but I would record it explicitly rather than accidentally treating a cache hit as a pure model-speed difference.

A small example harness

I also put together a small example harness around this structure:

The Python version is endpoint-first and has presets for the three Groq candidates; the Ollama/Colab path is optional and is mostly useful for exercising the harness without spending Groq calls.

It currently uses a small set of representative cases for things like instruction constraints, JSON, fixed-context RAG, dependent/independent tools, tool-feedback recovery, multilingual handling, abstention, and reasoning/stop discipline.

I have used the local/Ollama route to shake out the harness itself, but I have not run those three Groq candidates through it, so I would treat the Groq presets as a starting point rather than presenting any results for them.

If you run it against your Groq account, the most interesting artifact is probably not the headline PASS count but the per-case traces and failure classifications. Those should tell you fairly quickly which cases are genuine model differences and which need a provider-specific route or a better grader.

So, in short, for your current lab I would probably do:

custom Python harness as the source of truth
        ↓
10–20 hand-picked Django/application cases
        ↓
deterministic scoring wherever possible
        ↓
one parity-style pass over all three models
        ↓
inspect only failures/disagreements
        ↓
repeat those cases
        ↓
tune the shortlist with model-appropriate settings
        ↓
then add long-context / production-scale tests

and add LangSmith whenever its tracing/experiment UI or production feedback loop becomes useful, rather than making it a prerequisite for getting the first comparison running.

That seems like a fairly low-cost way to answer the actual migration question without turning the lab into a benchmarking project of its own.

If you’ve already got the prompt set together, send a sample plus the models you’ve narrowed it down to.

I can help turn it into a clean apples to apples eval so you can run the same cases across each model and compare tool calls, JSON reliability, instruction following and reasoning properly.