FAIRouter — библиотека для маршрутизации запросов к языковым моделям. Она выбирает модель под задачу, проверяет ответ и учится на отзывах. Версия 0.1.0 вышла на NuGet, поэтому теперь её можно подключить одной командой.

Что вышло

FAIRouter — это библиотека на C# для маршрутизации запросов к языковым моделям. Она выбирает модель под задачу, проверяет ответ и учится на отзывах. Основные возможности:

  • Автоматический выбор модели из списка кандидатов.
  • Проверка ответа судьей и обучение на отзывах.
  • Поддержка диалогов и инструментов.
  • Три профиля: Quality, Balance и Price.

Как подключить и что с этим делать

Для работы с FAIRouter понадобится .NET 10. Создадим консольный проект и подключим пакет:

bash
dotnet new console -f net10.0 -n RouterDemo
cd RouterDemo
dotnet add package FAI.Router

Также нужен ключ API для OpenRouter. В примерах будем использовать OpenRouter, ключ положим в переменную среды:

bash
$env:OPENROUTER_API_KEY = "ваш ключ"

Первый запрос. Заменим содержимое Program.cs следующим кодом:

plain
using FAI.Router;

FaiRouter router = await FaiRouter.FromOpenRouterAsync(
    apiKey: Environment.GetEnvironmentVariable("OPENROUTER_API_KEY")!,
    modelIds: ["google/gemini-2.5-flash", "openai/gpt-4.1-mini", "anthropic/claude-haiku-4.5"],
    databasePath: "fai-router.db");

RouterAnswer answer = await router.AskAsync("Напиши обзор методов кластеризации на 1500 знаков");

Console.WriteLine($"{answer.Winner.Name}: {answer.Score}");
Console.WriteLine(answer.Text);
Console.WriteLine(answer.Critic);

Здесь modelIds задает список кандидатов, а в файле fai-router.db хранятся веса и журнал ходов. Если файла нет, он будет создан. В ответе нас интересуют четыре поля:

  • Winner показывает, какая модель была выбрана.
  • Text содержит ответ модели.
  • Score содержит оценку судьи от 0 до 1.
  • Critic показывает, чем ответ отличается от заказа, по пунктам.

Обучение на отзывах

Самое интересное начинается, когда маршрутизатор получает отзывы. Отзыв задается числом от 0 до 1, где 1 означает отличный ответ, а 0.2 слабый:

plain
router.Feedback(answer.RoundId!.Value, score: 1.0);
router.Train(epochs: 10);
router.Save();

После этого веса сохраняются в базе, и на похожих задачах маршрутизатор учитывает полученный опыт. Отзывы можно накапливать и обучать маршрутизатор реже, например один раз в день. Стоит учитывать, что в журнале хранятся тексты запросов.

Кому это нужно на практике

FAIRouter подойдет разработчикам, которые хотят:

  • Автоматизировать выбор языковой модели под задачу.
  • Снизить затраты на API языковых моделей.
  • Улучшать качество ответов с помощью обучения на отзывах.
  • Интегрировать языковые модели в свои приложения на C#.

Ограничения и чего в источнике нет

  • В источнике нет информации о производительности и сравнении с другими инструментами.
  • Нет данных о поддержке других языков программирования.
  • Нет информации о стоимости использования FAIRouter.
  • Нет данных о поддержке других поставщиков моделей, кроме OpenRouter.
  • Нет информации о возможностях интеграции с другими сервисами и инструментами.

FAQ

Как выбрать модель под задачу?

FAIRouter автоматически выбирает модель из списка кандидатов. Вы можете задать список моделей в параметре modelIds или оставить его пустым, чтобы выбрать из 54 популярных моделей из комплекта пакета.

Как обучать маршрутизатор на отзывах?

Маршрутизатор обучается на отзывах, которые задаются числом от 0 до 1. После обучения веса сохраняются в базе, и на похожих задачах маршрутизатор учитывает полученный опыт.

Как подключить FAIRouter к своей модели?

Для подключения к своей модели используйте метод FromOpenAiCompatibleAsync. Укажите базовый URL, ключ API, список моделей и их цены. Судья работает через того же поставщика, по умолчанию на модели openai/gpt-4o-mini.

Как выбрать профиль для маршрутизации?

В библиотеке есть три готовых профиля: Quality, Balance и Price. По умолчанию используется Balance. Профиль можно менять на каждом запросе, передавая параметр weights.

Как работать с диалогами?

В AskAsync можно передать диалог целиком. Задание распознается по последней реплике пользователя, а модель видит всю историю.

Источники