Skip to content

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

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:

pip install openai google-genai boto3 "anthropic[bedrock,vertex]"
python chat.py