LangChain

Use the OpenAI chat model and point it at odnoga.

TypeScript

import { ChatOpenAI } from '@langchain/openai';

const llm = new ChatOpenAI({
  apiKey: process.env.AIROUTER_API_KEY,
  configuration: {
    baseURL: `${process.env.AIROUTER_BASE_URL}/v1`,
    defaultHeaders: { 'x-airouter-end-user': userId },
  },
  model: 'gpt-4o-mini',
  modelKwargs: {
    // odnoga extensions
    prompt: { slug: 'welcome-email', variables: { name: 'Ada' } },
  } as any,
});

const res = await llm.invoke([['user', 'hi']]);

Python

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    api_key=os.environ["AIROUTER_API_KEY"],
    base_url=f"{os.environ['AIROUTER_BASE_URL']}/v1",
    default_headers={"x-airouter-end-user": user_id},
    model="gpt-4o-mini",
    model_kwargs={
        "prompt": {"slug": "welcome-email", "variables": {"name": "Ada"}},
    },
)

Tip

LangChain swallows response headers. Either:

  1. Wrap calls with the shared helper and only use LangChain for orchestration, or
  2. Hook LangChain's callback system to grab model_name / token_usage and rely on odnoga's request log for the rest.