Overview

Styrr can be used as a drop-in model provider for most LLM frameworks. The RouterResult interface is compatible with standard chat completion shapes.

Strands Agents

Use Styrr as a model provider in Strands Agents:

import { Agent } from '@ strands/agent';
import { StyrRouter } from '@carloscortezcloud/styrr-llm';

const router = new StyrRouter({
  apiKey: process.env.OPENROUTER_API_KEY,
  models: [
    { id: 'nvidia/nemotron-3-ultra-550b:free' },
    { id: 'gpt-4o-mini' },
  ],
});

const agent = new Agent({
  model: async (messages) => {
    const result = await router.call(messages);
    return {
      role: 'assistant',
      content: result.text,
    };
  },
});

LangChain (ChatModel)

import { BaseChatModel } from '@langchain/core/language_models/chat_models';
import { StyrRouter } from '@carloscortezcloud/styrr-llm';

class StyrrChatModel extends BaseChatModel {
  private router: StyrRouter;

  constructor(router: StyrRouter) {
    super({});
    this.router = router;
  }

  async _generate(messages, options) {
    const result = await this.router.call(messages);
    return {
      generations: [{ text: result.text, message: new AIMessage(result.text) }],
    };
  }
}

Express / Fastify Middleware

app.post('/api/chat', async (req, res) => {
  const { message } = req.body;

  const result = await router.call([
    { role: 'user', content: message },
  ]);

  res.json({ reply: result.text, model: result.modelUsed });
});

Custom Router Interface

Any object with a call() method works. Implement your own:

interface Router {
  call(messages: Message[], tools?: Tool[]): Promise<RouterResult>;
}