Vibgyor Technologies, Oct 2024 to now

Multi-provider LLM platform

Switch between OpenAI, Gemini and AWS Bedrock with one environment variable and zero code changes.

Role
Software Developer, Full-Stack & AI
Domain
LLM infrastructure
Stack
  • Python
  • OpenAI
  • Google Gemini
  • AWS Bedrock Converse API
Read the write-up

One grading request, three providers. The responses are illustrative.

OpenAI

```json
{"criterion": "B2",
 "awarded": "2",
 "follow_through": true}
```

Wrapped in a code fence. The number is a string.

Gemini

Here is the result:
{"criterion": "B2",
 "awarded": 2,
 "followThrough": "yes"}

Prose before the JSON. camelCase key. "yes" instead of true.

Claude on Bedrock

{"criterion": "B2",
 "awarded": 2,
 "follow_through": true,
 "note": "method mark"}

An extra key the schema doesn't have.

What the product receives

{"criterion": "B2",
 "awarded": 2,
 "follow_through": true}

One shape, whichever provider answered.

The full story: “I Asked 3 LLMs for JSON. I Got 3 Kinds of ‘JSON’.”

1Problem

Code that calls one LLM vendor directly ties its cost and reliability to that vendor, and vendor pricing and capabilities keep changing.

2Approach

  1. Designed one interface over OpenAI, Google Gemini and AWS Bedrock (through the Converse API).
  2. Routed every call site through that interface, so none of them names a provider.
  3. Normalised each provider's response into the same shape before the product uses it.
Multi-provider LLM platform architectureApplication call sites send every request to one LLM interface and never name a provider. One environment variable picks OpenAI, Google Gemini or AWS Bedrock (through the Converse API), with non-critical tasks sent to cheaper models. Each response is normalised into the same shape before the product uses it.non-critical tasks → cheaper modelsApplication call sitesnever name a providerOne LLM interfaceprovider set by one env variableOpenAIGeminiAWS BedrockConverse APIResponse normaliserone shape for the product

3Key decisions

  • Choose the provider with one environment variable.

    Changing vendors is a configuration change with zero code changes.

  • Send non-critical tasks to cheaper models.

    Cost follows how much a task matters, and call sites stay the same.

  • Keep vendor details out of call sites.

    Pricing and capabilities change often, so provider code lives in one place.

4Result

Switching providers is a config change, application code stays the same, and cheaper models handle the non-critical work.

Want to go deeper on this project?

I can walk you through the decisions and trade-offs behind it.

Email hello@jaygadhiya.com

Read more

I Asked 3 LLMs for JSON. I Got 3 Kinds of “JSON”.Medium, Oct 2026