Chat¶
Send a single-turn message; get a single-turn response. The per-provider path is the load-bearing skill — every downstream recipe extends this shape.
Official docs verified 2026-08-08
- Azure OpenAI Python (base URL v1): switching-endpoints
- Vertex Gemini via
google-genai: Gemini API quickstart - Bedrock via
boto3: boto3 credentials - Claude on Foundry: Anthropic → Foundry
- Claude on Vertex: Anthropic → Vertex
- Claude on Bedrock: Anthropic → Bedrock
Native flagship¶
Azure OpenAI's Python client is the standard openai package
pointed at your resource's openai/v1/ base URL. model= on
Azure is the DEPLOYMENT name you created in the portal.
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["AZURE_OPENAI_API_KEY"],
base_url=os.environ["AZURE_OPENAI_BASE_URL"], # https://<res>.openai.azure.com/openai/v1/
)
resp = client.chat.completions.create(
model=os.environ["AZURE_OPENAI_DEPLOYMENT"], # e.g. "gpt-5"
messages=[{"role": "user", "content": "Hello, model"}],
)
print(resp.choices[0].message.content)
Same code as Kubernetes — Azure Functions / Container Apps set the environment variables at deploy time; the container image is identical.
from openai import OpenAI
import os
client = OpenAI(
api_key=os.environ["AZURE_OPENAI_API_KEY"],
base_url=os.environ["AZURE_OPENAI_BASE_URL"],
)
resp = client.chat.completions.create(
model=os.environ["AZURE_OPENAI_DEPLOYMENT"],
messages=[{"role": "user", "content": "Hello, model"}],
)
print(resp.choices[0].message.content)
Vertex AI's current-recommended Python client is google-genai
(unified for both Gemini API + Vertex backends). Model ids are
the Gemini family strings; auth comes from ADC.
import os
from google import genai
# ADC-backed; on GKE with Workload Identity, no key file is needed.
client = genai.Client(
vertexai=True,
project=os.environ["GOOGLE_CLOUD_PROJECT"],
location=os.environ.get("GOOGLE_CLOUD_LOCATION", "us-central1"),
)
resp = client.models.generate_content(
model=os.environ.get("GEMINI_MODEL", "gemini-3.6-flash"),
contents="Hello, model",
)
print(resp.text)
import os
from google import genai
# Cloud Run injects GOOGLE_CLOUD_PROJECT + service-account creds.
client = genai.Client(
vertexai=True,
project=os.environ["GOOGLE_CLOUD_PROJECT"],
location=os.environ.get("GOOGLE_CLOUD_LOCATION", "us-central1"),
)
resp = client.models.generate_content(
model=os.environ.get("GEMINI_MODEL", "gemini-3.6-flash"),
contents="Hello, model",
)
print(resp.text)
Bedrock's native surface is boto3.client("bedrock-runtime").
For chat, the recommended shape is the Converse API (converse)
— a uniform message shape across providers on Bedrock.
import os, boto3
client = boto3.client(
"bedrock-runtime",
region_name=os.environ.get("AWS_REGION", "us-east-1"),
)
resp = client.converse(
modelId=os.environ.get(
"BEDROCK_MODEL_ID", "amazon.nova-pro-v1:0"
),
messages=[{
"role": "user",
"content": [{"text": "Hello, model"}],
}],
)
print(resp["output"]["message"]["content"][0]["text"])
import os, boto3
# Lambda / App Runner injects role-based creds automatically.
client = boto3.client("bedrock-runtime")
resp = client.converse(
modelId=os.environ.get(
"BEDROCK_MODEL_ID", "amazon.nova-pro-v1:0"
),
messages=[{
"role": "user",
"content": [{"text": "Hello, model"}],
}],
)
print(resp["output"]["message"]["content"][0]["text"])
Claude through-line¶
The same conceptual API on all three clouds; a per-cloud client class handles the different auth surface.
import os
from anthropic import AnthropicFoundry
# Foundry auth: API key or Entra ID.
client = AnthropicFoundry(
api_key=os.environ["ANTHROPIC_FOUNDRY_API_KEY"],
resource=os.environ["ANTHROPIC_FOUNDRY_RESOURCE"],
)
msg = client.messages.create(
model=os.environ.get(
"FOUNDRY_CLAUDE_DEPLOYMENT", "claude-opus-5"
),
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
)
print(msg.content[0].text)
import os
from anthropic import AnthropicVertex
client = AnthropicVertex(
project_id=os.environ["GOOGLE_CLOUD_PROJECT"],
region=os.environ.get("VERTEX_REGION", "global"),
)
msg = client.messages.create(
model=os.environ.get("VERTEX_CLAUDE_MODEL", "claude-opus-5"),
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
)
print(msg.content[0].text)
import os
from anthropic import AnthropicBedrock
client = AnthropicBedrock(
aws_region=os.environ.get("AWS_REGION", "us-west-2"),
)
msg = client.messages.create(
model=os.environ.get(
"BEDROCK_CLAUDE_MODEL", "global.anthropic.claude-opus-4-6-v1"
),
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
)
print(msg.content[0].text)
Model IDs verified 2026-08-08¶
| Provider | Path | Model ID string (example) |
|---|---|---|
| Azure OpenAI | native | your DEPLOYMENT name (e.g. gpt-5, gpt-4.1) |
| Vertex Gemini | native | gemini-3.6-flash (current default), gemini-3.5-flash, gemini-2.5-pro, gemini-2.5-flash — all GA per Gemini catalog 2026-08-08. |
| Bedrock native | native | amazon.nova-pro-v1:0 (or a region-prefixed inference profile) |
| Foundry Claude | through-line | claude-opus-5, claude-sonnet-5, claude-haiku-4-5 |
| Vertex Claude | through-line | claude-opus-5, claude-sonnet-5, claude-haiku-4-5@20251001 (older use @ date) |
| Bedrock Claude | through-line | global.anthropic.claude-opus-4-6-v1, us.anthropic.claude-sonnet-4-5-20250929-v1:0 |
IDs drift. Every model list here was pulled from the provider's own docs at the top of this page on 2026-08-08. Re-verify before pinning to production.
Run + verify (local, with your own creds)¶
Each snippet expects the auth env vars from the credentials + auth page. Set them, then: