Back to "LLMApi: Використовуючи локальні LLM для автоматичної симуляції API в ASP.NET Core MinimalAPI"

This is a viewer only at the moment see the article on how this works.

To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk

This is a preview from the server running through my markdig pipeline

AI API ASP.NET Core LLM LLMApi mockllmapi Nuget

LLMApi: Використовуючи локальні LLM для автоматичної симуляції API в ASP.NET Core MinimalAPI

Sunday, 02 November 2025

Введение

Однією з моїх постійних одержимостей є вибірка даних. Поєднуючись з моєю теперішньою любов 'ю до 'AI, яка допомогла ' кодувати випадкові ідеї, це МSK2 призвело до створення маленького генератора тестових даних з LLM разом із пакетом нуджетів з середнім програмним забезпеченням, який може генерувати симуляції API за допомогою API.

NuGet NuGet

Ви можете знайти Тут GitHub для проекту, всі громадські домени і т.д.

Концепція

Як і з багатьма ідеями програмування " AI Assisted " це почалося з ідеї про симуляцію виходу за допомогою LLMsЛюзідФоруми, химерно дисфункційне самозаселення LLM, базується на форумі експерименту ) і LLMs дійсно хороші МSK2 якщо трохи повільно МSK3 в генерації образців даних так що якби Я можу використовувати їх для симуляції будь-якого API.

Требування

  1. Це повинно бути просто втілити у ASP.NET Core App.
  2. Дані мають бути досить реальними.
  3. Дані повинні бути випадковими
  4. Він може прийняти JSON 'shapes', які розповідають LLM, якою повинна бути реакція
  5. Він може використовувати локальні LLM з відкритим кодом
  6. Це повинно бути безкоштовне використання управління Nuget

Ось що я придумав: МСК0 . Я МSK1 додам більше деталей у мисленні, бо додам ще більше можливостей ".". Це МСК3 справді класна , МСк4 дійсно працює і швидше, ніж Я . Ми боїмося . МС К6 . Тим не менше, МСK7 . У мене є А .

Майбутні додатки, напевно, будуть включати в себе Caching у випадку, якщо ви хочете швидше perf.

Ось readme для пакету ( автоматично завантажений

більшістьlucid.mockllmapi

Що він робить: Produkція-готова ASP.NET Коренная платформа для монтування для генерації реалістичних реакцій на макет API за допомогою LLMsM SK2

Чому ви використовуєте його? Додайте до будь-якого проекту інтелектні макетні кінцеві точки лише за допомогою коду 2 linii коду — без баз даних

NuGet NuGet Реліз GitHub Лицензія: Нелицензія

Компаніонний пакет: найбільш зрозуміле.mockllmapiM SK1 Тестування - Програмні засоби тестування з плавною інтеграцією HttpClient


Як читати цей README

Цей README є цілковитим по дизайну. Виберіть свій шлях:


Що нового? - TLM SK2DR

Найновіші: AutoShape (Shape Memory) - Автоматична концентрація структури JSON на всіх terminaх дзвінків v2.5.0: покращення безпеки , AOT/ підтримування за допомогою подолання залежності від серійизації v2.3.0: Повний тип контенту підтримують - формові тіла , завантаження файлів M SK2 комплексне тестування МSK3 тестування v2.2.0: Встромні інструменти для інтеграції з API, до-конфигуровані API для рештиM SK2 автоматичне вичерпування пам 'яті контексту v2.1.0: Ограничення швидкості, розрядуванняM SK1 n -гортання з різними стратегіями виконання

Click for detailed v2.5.0 feature breakdown

Версия 2.5.0 Детали

Концентрація: Поліпшення безпеки та AOTM SK1 підтримування за допомогою подолання відлежності від серійизації . Повний зворотний зв 'язок з v2.4.0.

1. AOT - Вибрали всі відображання -залежності від серіалізації МSK2

  • Виключено System.Text.Json використання відбиття
  • Ручна конструкція JSON впродовж кодової бази
  • Полна комбінація з AOT та .NET
  • Немає проблем з розв 'язанням типу розбіжності
  • Меньший бінарний розмір і покращений результат запуску

2. Удосконалена безпека - Комплексні покращення безпеки

  • Removed all reflection-based serialization that could expose type information
  • Уникнення потенційних схильностей до висновків типу
  • Безпека obsługi JSON з явною обмеженнями типу
  • Reduced attack surface for serialization-based exploits
  • Краще захист від нападів дезеріалізації

3. Оптимізації ефективності - Удосконалена пропускна спроможністьM SK1

  • Швидша конструкція JSON без відбиття
  • Скорінне виділення пам 'яті
  • кращий локальністьキャッシュу
  • Удосконалений час запуску для вирізьблених програм
  • Менший відбиток пам 'яті

4. МSK1NET 10 Схожість - Полна підтримка для .NET МSK2 конструкцій для подиву

  • Ручна конструкція JSON усюди, щоб уникнути проблем із відображанням на основі стандарту -
  • Всі характеристики тестовані і працюють на .NET 10 макетах для подиву
  • Жодних змін до існуючої функції

5. Поліпшення тестування - Удосконалена охорона тестуM SK1

  • Dodatkowі тести для сценаріїв AOT/trimming
  • Безпека-концентровані тести на одиниці
  • Тести Benchmarking
  • 100% середня успішність з усіма новими тестами

Для повних деталей, читайте: Тест , МСК0 ," СМСК1 , а також IMPLEMENTATION - "_".

Click for detailed v2.3.0 feature breakdown

Версия 2.3.0 Детали

Концентрація: Полна поддержка типу контенту для всіх стандартних форматів HTTP-заказівM SK1 Повна зворотньа совместимость з v2.2.0.

1. Formular Body Support - Полна підтримка application/x-www-form-urlencoded тип контенту. Едині і багатовимірні значенняM SK1 автоматичний конвертування JSON, ручна конструкція для MSC3 NET 10 коміпромісністьМSK5 Чудово для тестування HTML форм та традиційних веб-пристосуваньMスク6

2. Obsługа завантаження файлів - Полна підтримка multipart/form-data включно з завантаженнями файлів. Пам 'ять-безпечний стріминг M SK2Б-буфер МSK3 видобуток метадань | ( | ім' я файла | МSK5 | розмір |, | тип контенту |МSK7 | змішані поля форм та файли | Ми відкидаємо контент, щоб уникнути bloat пам' яті

3. Arbitrary Path Lengths - Obsługа глибоких вуликів через {**path} вловити-все маршрутизуванняM SK1 перевірено з МSK2допоглинами шляхами сегменту та складними строками запитів. Немає практичних обмежень до глибини шляху МSK4до ASP .NET Погані стандарти

4. Комплексний тест МSK0 228 тести МSK2 новий ) що поєднує всі характеристики Мише 4 Формове обстеження тіла Міше 5 тесті Miше 6 Обробка JSON Яше 7 teste MIше 8 тестові інтеграції для повних HTTP потоків roboвих мише 9 ♫ Мише 10 пропускна здатність Іще 11 нульові регресії

5. МSK1NET 10 Схожість - Ручна конструкція JSON усюди, щоб уникнути відображанняM SK1поширені проблеми із сеrialизацією. Всі характеристики тестовані і працюють на МSK3NET 10 макети для подиву на цеMSC5

Для повних деталей, читайте: Тест , МСК0 ," СМСК1 , а також IMPLEMENTATION - "_".

Click for detailed v2.2.0 feature breakdown

Версия 2.2.0 Детали

Концентрація: Встромні інструменти для інтеграції з API , переді МSK2 конфігуровані API для решти МСК3 і розумна пам 'ять контексту М СК4 Повний зворотній зв' язок з v M СК5

1. Вмонтовані інструменти & Система дій - Викликати зовнішні API REST або кондитори з моделью ланцюга, щоб створити реалістичні робочі потоки та дерева прийняття рішень Полні Docs →

2. Pre- Конфигуровані API для решти - Визначати повну конфігурацію API один раз , виклики по імені M SK2 Спеціальна інформація про Shape або OpenAPI МSK3 управління спільним контекстом , інтеграція інструментів MSC5 Подивіться appsettings.Full.json для повних прикладів 8

3. Динамічне управління пам 'яттю в контексті - Контексти тепер закінчуються після МSK1 хвилин неактивності МSK2 підключений до конфігурації

4. Розумна об 'єднання даних - Автоматично витягує всі поля з відповідей на будь-якому рівні гніздоM SK1 Нестертовані об 'єкти , відслідковування массивів МSK3 дані про перший елемент M SK4 custom fields — всі відслідковані автоматично MSC6

5. Удосконалена документація - Нові повні інструкції для Наrzędziа & Działaння, Ограничення швидкості, і Контексти API.

Розглянемо подробиці: РELEASE_NOTESM SK1md

---

Стосунок

Корінні концепції

Протоколи & Funkції

Розвинена архітектура &


Уявлення про архітектуру

Один двигун, МСК0, багато протоколів, МSK1, спільна інфраструктура, . Усі характеристики мають однакову поколінь, контекст , і системи управлінняM SK2 що дають вам послідовне поведінку в рамках стандарту REST, GraphQLMska4 SSEMска5 SignalRMSKA6 OpenAPIM Ska7 та gRPCMске8

graph LR
    Client[Client] -->|HTTP Request| API[LLMApi<br/>Minimal API]
    API -->|Chat Completion| Ollama[Ollama API<br/>localhost:11434]
    Ollama -->|Inference| Model[llm-model Model]
    Model -->|Response| Ollama
    Ollama -->|JSON/Stream| API
    API -->|JSON/SSE| Client

    API -.->|uses| Helper[AutoApiHelper]

    style API fill:#4CAF50
    style Helper fill:#2196F3
    style Model fill:#FF9800

Ключові компоненти:

  • Один LLM Client: Усі протоколи використовують ту ж саму інтеграцію LLM з політиками стійкості
  • Сподівана пам 'ять у контексті: Контексти API працюють через REST , GraphQLM SK2 SignalR, і OpenAPI
  • Поширені характеристики: Ограничення швидкості МSK1 Caching , Симулювання помилок M SK3 та управління символами застосовуються до всіх
  • Модулярний дизайн: Використовуйте будь-яку комбінацію — додайте тільки те, що вам потрібно

Подивіться деталізовані діаграми архітектури poniżej для управління потоком і формою запиту.


Характеристики

Цей пакет надає шість незалежних властивостей - використовуйте будь-яку необхідну комбінацію Модульні приклади для протоколу-конкретні налаштування):

1. Мокинг API REST

  • Найпростіше: AddLLMockApi() + MapLLMockApi("/api/mock") = миттєвий макет API
  • Kontrolа форми: Вказувати конкретну структуру JSON через заголовок , парам запиту M SK2 або тіло запиту
  • Всі HTTP методи: Obsługа GETM SK1 POST, PUTMSC3 DELETEMスク4 PATCH
  • Рутування Wildcard: Будь-який шлях під вашим обраним кінцевим пунктом працює
  • Уся підтримка типу контенту (NEW в vM SK1
    • JSON (application/json) - Standard JSON request bodies
    • Форми тіла (application/x-www-form-urlencoded) МSK1 Форми HTML
    • Завантаження файлів (multipart/form-data) - Файлі завантажуються з вилученням метадань
    • Пам 'ять-Безпека: Контент файлу відображається в потокі і закидається (збережені лише метадані МSK2
  • Арбітальні довжини маршруту: Глибокий вулик повністю підтриманий (/api/mock/v1/api/products/electronics/computers/laptops/gaming/...)

2. Мокерування API GraphQL

  • Нативна поддержка GraphQL: POST до /api/mock/graphql з стандартними питаннями GraphQL
  • Query-Driven Shapes: Сама запити GraphQL визначає структуру відповіді
  • Варіабли & Операції: Полна підтримка змінних , назви операцій МSK2 і фрагментів
  • Правильне подолання помилок: Возв 'язує графічніQLM SK1формовані помилки з data і errors поля

3. Сервер

  • Прогресивний стріминг: SSE підтримка з прогрессивною генерацією JSON
  • Реальний-Aktualізації: Датовий символ потокуM SK1на основіМSK2tokен до клієнта
  • Працює автономно: Не потрібно встановлювати API REST
  • Полне інструкцію для SSE | Неперервний стріминг

4. СигналR РеальнийM SK1 Часовий стріминг

  • Веб-сокет стріминг: Неперервні дані реальногоM SK1мок часу через SignalR
  • Багато контекстів: Створити декілька невід 'ємних потоків даних одночасно
  • Менеджмент життєвого циклу: Start/запинити контексти динамічно за допомогою інтерфейсу управління
  • Працює автономно: Не потрібно встановлювати API REST
  • Руководство для демонстрації SignalR

5. OpenAPI / генерація Swagger Mock

  • Автоматичне генерування кінцевих точок: Навімкніть на будь-який OpenAPI / Спеціальність стискача МSK2URL або файл МSK3
  • Усі операції відокремлені: Кожна дорога та метод з спектру стають живим кінцевим пунктом
  • schema-Driven Data: LLM генерує реальні дані, які відповідають вашим схемам
  • Мільйозковий спектр: Одночасно завантажувати та під 'єднати кілька інструкцій API
  • Працює автономно: Не потрібно встановлювати API REST
  • Руководство по функціям OpenAPI

6. підключення до мережі gRPC NEW в vM SK2

  • Завантаження Proto-файлу: Загрузити .proto-файли для генерації mocks gRPC
  • Поддержка двойного протоколу: JSON через HTTP для тестування , бінарний Protobuf для виробництва
  • Динамічна Serialізація: Програмування протобуду без генерації коду
  • LLM-Заsilaні дані: Реальність відповідей, які відповідають вашим визначенням прото-сообщень
  • Працює автономно: Не потрібно встановлювати API REST
  • Руководство для підтримки gRPC

Поширені характеристики

  • Налагодження: налаштування aplikacjiM SK1 json або інлінарна конфігурація
  • Надмірно змінні дані: Кожна просьба /update генерує цілком різні реальні дані
  • Пакет NuGet: Легко додавати до існуючих проектів
  • AutoShape (Shape Memory): Автоматично запам 'ятовує структуру JSON від першої відповіді , забезпечуючи послідовні схеми на всіх наступних запитах до одного кінцевого пункту Розгляньмо вказівник на AutoShape
  • Контексти API: Утримуйте послідовність у всіх запитих, пов 'язаних з цими питаннями - Полне пояснення
  • Симулювання помилки: Комплексне тестування помилок з кодами статусу 4xxM SK2xx МSK3 особистими повідомленнями МSK4 та різними методами конфігурації
  • Випробовування засобів: Компаніонний пакет mostlylucid.mockllmapi.Testing для легкої інтеграції HttpClient у тестах - Розгляньмо секцію тестування

Неможливі-Цельки M SK1 кордони

Що це за

  • Програмне забезпечення для розробки та створення прототипів для реального моделювання даних
  • Чудово для розробки фронтального інтерфейсу, дизайн API, демонстраціїM SK2 та тестування
  • Нуль-alternativа догляду за хардкодованими пристроями та базами данихM SK1закріплені макети

Що це NOT:

  • Не джерело інформації про виробництво - Згенеровані дані реальні, але синтетичні
  • Не замінює контрактні тести - Використовуйте це для розробки ; перевіряйте справжні API окремо
  • Не для неvalidated production traffic - Введення користувача пряме до про prompts LLM можлива ін 'єкція про prompt МSK2
  • Не є базою даних чи постійним складом - Жоден стан не підтримується між запитими МSK1за винятком опціональних інтерфейсів APIM SK2
  • Не замінник реальної логіки - Правила бізнесу , перевірки МSK2 і робочі потоки залишаються спрощеними

Коли його використовувати:

  • Розробка фронтальних програм перед тим, як вони будуть готові
  • Створити реалістичні демонстрації без доступу до інформації про виробництво
  • Випробовування компонентів інтерфейсу з різними сценаріїв даних
  • Прототипування API дизайнів і експериментування з формами реагування
  • Навчання шаблонів інтеграції LLM в .NET

Коли його НЕ використовувати:

  • У виробничих середовищах, які допомагають реальним користувачам
  • Для тестування аутентифікації/логіка авторізації M SK1схеми безпеки ігноровані)
  • Коли дані повинні бути підпорядковані строгим правилам бізнесу або перевірки
  • Для тестування завантаження реального зворотнього забезпечення
  • Коли необхідно отримати відтворювані дані deterministikи, впродовж тестування

Документація

Для детальних інструкцій з архітектурними діаграмами, використання прикладівM SK1 і деталі застосування:

  • Руководство по застосуванні докера - Полне налаштування та застосування докера

    • швидкий старт з Docker Compose + Ollama
    • Далі - приклад з моделью llm-
    • Методи конфігурації (env varsM SK1 картографія об 'єму, . env файлиMSC4
    • Obsługа GPU, мультиM SK1 встановлення зворотнього кінця
    • Продукції та розв 'язання проблем
  • Справка з API - Полна документація з кінцевими пунктами управління

    • Вкінці OpenAPI
    • Керування інтерфейсом API
    • Прото-менеджмент gRPC
    • Центри SignalR
    • Полний запит/заказові приклади
  • Руководство багатьма LLM - Obsługа кількох провайдерів

    • Одночасно під 'єднатись до Ollama, OpenAI, та LM Studio
    • Per-запрос вибору зворотнього кінця за допомогою заголовківM SK1запити парам
    • Повні зворотньі зв 'язки з традиційними конфігураціями
    • Допомічник-конкретні приклади та найкращі практики
  • Справка про контексти API МSK0 NEW!

    • Сподівана пам 'ять на всіх рівнях запити для послідовних багатоступенкових потоків роботи
    • E-торгові потокиM SK1 стікери на біржі, приклади стану гри
    • Менеджмент символів та розумне скорочення
    • Архітектура Сирени
  • Ограничення швидкості Batching Guide & - NOWO в vM SK1

    • N-спроможність створення кількох варіантів реакції
    • Per-Статистика кінцевих точок відстеження з рухомими середніми показниками
    • Три стратегії пакетування: (Sequential,ParallelM SK2Streaming )
    • деталізовані заголовки для перевірок ефективності
    • Чудово для тестування стратегій відхилення та сценаріїв розкладу часу
  • Руководство для дій & - NOWO в vM SK1

    • MCP-совладна архітектура для розширеної інтеграції інструментів
    • HTTP інструменти для виклику зовнішніх API з аутентифікацією
    • Мок інструменти для створення дерев для прийняття рішень та операційних потоків
    • Заміна шаблонів з підтримкою змінних в середовищі
    • Полювання на інструменти з обмеженнями безпеки і Caching
    • Фаза 1 МSK1Експлицит МSK2 Фаза
  • Руководство для підтримки gRPC - NOWO в vM SK1

    • завантажити .proto-файли для автоматичної наліпки сервису gRPC
    • Двоєстороння підтримка: JSON через HTTP та бінарний Protobuf
    • LLM-здатна генерувати реальну реакцію
    • Завершити деталі розробки та тестування
  • Руководство по функціям OpenAPI

    • Динамічне завантаження зображень із URLs, файлівM SK1 або встроїного JSON
    • Автоматична генерація кінцевих точок з параметрами маршруту
    • Запроси/показ відповідей з API Petstore
    • Інтеграція SignalR для реального- Aktualizacji часу
  • Наприклад, модульна архітектура

    • РEST-одинціM SK1 ГрафQLМSK2одинаці МSK3 СигнельR-одиві встановлення
    • Оптимізація пам 'яті
    • Перемішувати і підготувати протоколи
  • Руководство для демонстрації SignalR

    • Налагодження потоку даних в реальному часі
    • Керування життєвим циклом у контексті
    • Приклади зв 'язку з клієнтом
  • Записки про реліз

    • Завершити історію версії
    • Перерізання змін (ніх з vM SK1
    • Руководство по міграції
  • Підсумок тесту - NOWO в vM SK1

    • Полна документація для тестування
    • 228 тести з детальним розкладом
    • Дослідження та перевірки ефективності
    • Усі категорії тесту пояснені
  • Підсумок розробки - NOWO в vM SK1

    • Форми тіла та файли завантажують деталі розробки
    • Ручна конструкція JSON для .NET 10
    • Пам 'ять-безпечна архітектура obsługi файлів
    • Повні зміни коду та логіка

Швидкий старт

Установлення

Головний пакет:

dotnet add package mostlylucid.mockllmapi

Використовуючи інструменти тестування (Optional):

dotnet add package mostlylucid.mockllmapi.Testing

Допоставляє плавний API для легкої konfigurації HttpClient у тестах. Розгляньмо секцію тестування для деталей.

швидкий запуск з докером (РекомендуєтьсяM SK1

Найшвидший спосіб розпочати: - не . NET або installation Ollama потрібна

# Clone the repository
git clone https://github.com/scottgal/LLMApi.git
cd LLMApi

# Start everything with Docker Compose (includes Ollama + llm-model)
docker compose up -d

# Wait for model download (first run only, ~4.7GB)
docker compose logs -f ollama

# Test the API
curl "http://localhost:5116/api/mock/users?shape={\"id\":0,\"name\":\"\",\"email\":\"\"}"

Це - МСК0, це - МSK1 Програмне забезпечення працює на http://localhost:5116 з заголовком Ollama.

Подивіться Повний Докер Рухівник для:

  • Параметри конфігурації (env vars
  • Використовуючи різні моделі:
  • Obsługа GPU
  • Розгортання виробництва
  • Подолання проблем

(Local DevelopmentM SK1

Якщо не використовувати Docker:

  1. Установити .NET 8.0 SDK або пізніше
  2. Установити Оллама і витягати модель:
    ollama pull ministral-3:3b
    

Вибір моделі LLM

Цей пакет був розроблені та перевірені ministral-3:3b (3B параметриM SK1 що дає чудові результати для всіх приладів з дуже швидкими показниками . Тим не менш

Рекомендуемые моделі

Модель МSK1 Розмір МSK2 Швидкість Якість 4 Контекст 5 Найкращий для 6
minister-3:3b (поганийM SK1 МSK2 МSK3B V . Найшвидший KILLER для JSON! SzвидкийM SK1 точний , величезний контекст
gemma3:4b МSK0 4B МSK2 Szвидкий Хороший
Лама3 МSK0 8B МSK2 Середній Дуже гарний мSK4 МSK5K Ogólnе призначенняM SK7 виробництво M
mistral-nemo МSK0 12B MSК2 Повільніше МСК3 Чудово СМСК4 СМСК5 К ММСК6 Високоякісні масиви даних,
mistral:7b МSK0 7B МSK2 Середній Дуже гарний MSК4 \ 8K \ МSK6 Альтернатива для llm МСК7моделю СМСК8
phi3 МSK0 3.8B МSK2 Szвидкий Хороший
тиніллама МSK0 1.1B МSK2 Дуже швидко Базовий мSK4 МSK5K Ультра-ресурс M- обмежений МСК8

Qwen 2.5 Кодер KILLER для генерації JSON - ультра - швидкий МSK2 високоточний мSK3 великий контекст :

ollama pull ministral-3:3b
{
  "MockLlmApi": {
    "ModelName": "ministral-3:3b",
    "Temperature": 1.2,
    "MaxInputTokens": 8192
  }
}

Чому це так добре?

  • Надзвичайно швидка на будь-якому апараті (3-4GB RAM)
  • Найкращий рівень точності генерації JSON в klasiі -inM SK1
  • 256K контекстний вікно ( обробляє складні вбудовані структуриM SK2
  • Треновані спеціально для коду/структурованих даних
  • Чудово для розробки труб CI/CD
  • Найменші галюцинації порівняно з іншими моделями

PRODUCTION: MistralM SK1Nemo - Найкраща якість & Massive Contexts

Для виробництва- подібні тестування з складними схемамиM SK1

ollama pull mistral-nemo
{
  "MockLlmApi": {
    "ModelName": "mistral-nemo",
    "Temperature": 1.2,
    "MaxInputTokens": 8000
  }
}

Чому це так добре?

  • Найвища якість реального генерування даних
  • 128K context window ( вимагає Конфигурація Оллами)
  • Найкраще для складних вбудованих структур та великих наборів даних
  • Більше творчої варіації в генерованих даних
  • Примітка: Потрібні більше ресурсів

Модель-конкретна конфігурація

Для ministrівМSK0b (Рекомендована МСК2 дефолтMСК3

{
  "ModelName": "ministral-3:3b",
  "Temperature": 1.2,
  "MaxContextWindow": 262144   // 256K context window
}

Для каміння3:4b або ламиM SK1

{
  "ModelName": "llm-model",     // or "mistral:7b"
  "Temperature": 1.2,
  "MaxContextWindow": 8192   // Set to model's context window size
}

Для містрального-немо M SK1вищого-здатного виробництваMSC3

{
  "ModelName": "mistral-nemo",
  "Temperature": 1.2,
  "MaxContextWindow": 32768, // Or 128000 if configured in Ollama
  "TimeoutSeconds": 120      // Longer timeout for large contexts
}

Nota: Мистраль-немо потребує Konfiguracja контексту Оллами для 128K контекстівM SK1

Де знайти MaxContextWindow:

# Check model info
ollama show {model-name}

# Look for "context_length" or "num_ctx" parameter
# Example output: "context_length": 8192

Для менших моделей (phi3, tinyllamaM SK2

{
  "ModelName": "tinyllama",
  "Temperature": 0.7         // Lower temperature for stability
}

Чому температура має значення:

  • Більші моделі (7BM SK1 може справлятися з високою температурою (1.0-1.5), в той час як зберігає актуальний JSON
  • Менькі моделі (<4BM SK1 потрібно нижчі температури (0.6-0.8), щоб уникнути
    • Неправильна синтаксиса JSON (випущені цитатиM SK1 скобки)
    • Трюнковані відповіді з ліпцем ("...")
    • Галюциновані назви або структури поля
  • Нижча температура = більш передбачуваний результат МSK1 менше різноманіття
  • Вищий рівень температури = більш творчий результат МSK1 більше різноманіття МSK2 але ризикованіший для маленьких моделей )

Установлення

# RECOMMENDED for development (fastest, most accurate JSON)
ollama pull ministral-3:3b

# Alternative options
ollama pull gemma3:4b       # Good for low-end machines
ollama pull llama3          # General purpose, good balance
ollama pull mistral-nemo    # Highest quality (requires more RAM)

# Alternative options
ollama pull mistral:7b
ollama pull phi3

Важливі обмеження:

  • Менькі моделі (tinyllama, phi3) працює, але може
    • Створити простіші/нерізноманітні дані
    • Борьба з складними питаннями GraphQL
    • Потрібно ще спробувати
    • Найкраще працювати з простими запитами та маленькими розмірами відповідей
  • Всі моделі може боротися з:
    • Дуже складні/глибко вбудовані питання GraphQL (>5 глибина рівнів
    • Багато полей на об 'єкт МSK0 поля)
    • Виmaganі великі массиви - Limit to 2-5 items for reliability
  • Якщо бачать помилки про відрізаний JSON ("...") або коментарі ("//"):
    • Нижча температура до 0.8 або нижче
    • Простіше сформулювати питання GraphQL ( менше полей , менше гніздів МSK2
    • Збільшувати MaxRetryAttempts до 5 або більше

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

Програму.csM SK1

using mostlylucid.mockllmapi;

var builder = WebApplication.CreateBuilder(args);

// Add LLMock API services (all protocols: REST, GraphQL, SSE)
builder.Services.AddLLMockApi(builder.Configuration);

var app = builder.Build();

// Map mock endpoints at /api/mock (includes REST, GraphQL, SSE)
app.MapLLMockApi("/api/mock");

app.Run();

програмування.jsonM SK1

{
  "mostlylucid.mockllmapi": {
    "BaseUrl": "http://localhost:11434/v1/",
    "ModelName": "ministral-3:3b",
    "Temperature": 1.2
  }
}

Це – МСК0, це – МSK1. Тепер всі вимоги до /api/mock/** відновити інтелектуальні дані макета.

AutoShape (Shape Memory)

Автоматично підтримувати послідовні структури JSON у різних запитах до одного кінцевого пункту.

Що він робить

AutoShape запам 'ятовує структуру JSON від першої відповіді на кінцевий пункт і автоматично застосовує її до усіх наступних запитів на той самий кінцевий елемент. ( з різними IDM SK1 Це гарантує

  • Сpójна схема реагування на різні дзвінки
  • Жоден дрейф схем під час розробки
  • Випередженість поведінки API для тестування

Найкращий приклад

# First request - generates free-form response
GET /api/mock/users/123
Response: {"id": 123, "name": "Alice", "email": "[email protected]", "role": "admin"}

# Second request - automatically uses same structure
GET /api/mock/users/456
Response: {"id": 456, "name": "Bob", "email": "[email protected]", "role": "user"}

# All subsequent requests use the same schema!
GET /api/mock/users/789
Response: {"id": 789, "name": "Carol", "email": "[email protected]", "role": "manager"}

Konfiguracja

По замовчуванню всередині appsettings.json:

{
  "MockLlmApi": {
    "EnableAutoShape": true,              // Default: true
    "ShapeExpirationMinutes": 15          // Default: 15
  }
}

Per- Контроль за запитами

Виключити для конкретного запиту:

GET /api/mock/users/special?autoshape=false

Зновити погану форму:

# If first response was incomplete, renew it:
GET /api/mock/users/1?renewshape=true
# New response replaces old shape template

Нормалізація маршруту

Усі ці запити мають однакову форму (, зnormalizowaną до /api/mock/users/{id}):

GET /api/mock/users/123                  # Numeric ID
GET /api/mock/users/abc-456              # Alphanumeric ID
GET /api/mock/users/550e8400-e29b...     # UUID

Найголовніше

  • ✅ По замовчуванню - Виходить з коробки
  • 🔄 Зновлення форми - Управити погані форми з ?renewshape=true
  • ⏱️ Автоматичний - Форми закінчуються після їхньої неактивності
  • 🎯 Розумна нормалізація - Різні ID для однакових форм розподілу в кінцевому місці
  • 🚫 Очевидне заперечення - Доведення чіткого форми за допомогою запитуM SK1header/body skips autoshape
  • ✨ працює всюди - REST, StreamingM SK2 і кінцеві точки GraphQL

Коли використовувати

Чудово для:

  • Frontend потребує послідовних моделей структур даних
  • Тести інтеграції, які вимагають передбачуваних схем
  • Демоси, де структура даних не повинна змінюватися між запитими
  • Прототипування API з еволюційними, але послідовними формами

Не потрібно, коли:

  • Використовуючи експлициальні фігури ( вони в будь-якому разі мають перевагу )
  • Хочете максимального різноманіття у кожному відгукі
  • Тестування сценаріїв еволюції схем

Подолання проблем

Форми не вживаються?

  1. Проверка EnableAutoShape: true в конфігурації
  2. Впевниться, що не надано жодної чіткої форми. (запросM SK1header/bodyMSC3
  3. Проверка тривалості строку (по замовчуванню 15 хвилиниM SK2

Треба змінити форму?

GET /api/mock/users/1?renewshape=true

Виczyść всі фігури запрограмовано:

// Inject AutoShapeManager
autoShapeManager.ClearAllShapes();

Для всієї документації, см. CLAUDE.md AutoShape Section.

Об 'єм тесту: 39 тести на всі автоконструкції

Параметри налаштування

📘 Перечень повної конфігурації Подивіться Довідка про конфігурацію для всіх варіантів 📄 Точний прикладM SK1 Подивіться налаштування.FullM SK1json - демонструє кожного дня опція конфігурації

За допомогою програмного забезпечення.json M SK1Рекомендовано )

{
  "mostlylucid.mockllmapi": {
    "BaseUrl": "http://localhost:11434/v1/",
    "ModelName": "ministral-3:3b",
    "Temperature": 1.2,
    "TimeoutSeconds": 30,
    "EnableVerboseLogging": false,
    "CustomPromptTemplate": null,

    // Token Management (NEW in v1.5.0)
    "MaxInputTokens": 8192,  // Ministral has 256K context

    // Resilience Policies (enabled by default)
    "EnableRetryPolicy": true,
    "MaxRetryAttempts": 3,
    "RetryBaseDelaySeconds": 1.0,
    "EnableCircuitBreaker": true,
    "CircuitBreakerFailureThreshold": 5,
    "CircuitBreakerDurationSeconds": 30
  }
}

Модель- конкретні обмеження символів: Подивіться LLMApi/appsettings.json для прикладів конфігурації для різних моделей (Llama 3, TinyLlama, MistralM SK3 і т.д. MaxInputTokens відповідно.

Контексти API: Для подібної інформації про використання контекстів для підтримки послідовності запити Справка про контексти API.

Політики стійкості

Новое в v1.2.0: Вбудована politykа стійкості Польлі захищає вашу програму від проблем з LLM

У комплекті є два стандартні моделі стійкості:

Поновлення експоненційного відхилення

  • Автоматичний повтор невдачі LLM запити з експоненційними затримками (1sM SK1 2s, | |
  • Включає тремтіння, щоб запобігти грімкам в стаді
  • Рукає за допомогою błędów підключення, вимкнення часу, і неM SK2коди успішності
  • По замовчуванню: M SK1 спроби з 1 другою базою затримки

Маршрутний розривник

  • Відкривається після послідовних провалів, щоб запобігти каскадному провалу
  • Залишається відкритим протягом настроїної тривалості перед тим, як дозволити запроси тесту
  • Три стани МСК0 Закритий МSK1нормальний ), Відкритий
  • За замовчанням: Відкривається після M SK1 послідовних невдач , залишається відкритим протягом МSK3 секунд

Konfiguracja:

{
  "mostlylucid.mockllmapi": {
    // Enable/disable retry policy
    "EnableRetryPolicy": true,
    "MaxRetryAttempts": 3,
    "RetryBaseDelaySeconds": 1.0,  // Actual delays: 1s, 2s, 4s (exponential)

    // Enable/disable circuit breaker
    "EnableCircuitBreaker": true,
    "CircuitBreakerFailureThreshold": 5,  // Open after 5 consecutive failures
    "CircuitBreakerDurationSeconds": 30   // Stay open for 30 seconds
  }
}

Logging:

Політики стійкості фіксують всі спроби повторення і зміни стану блокатора:

[Warning] LLM request failed (attempt 2/4). Retrying in 2000ms. Error: Connection refused
[Error] Circuit breaker OPENED after 5 consecutive failures. All LLM requests will be rejected for 30 seconds
[Information] Circuit breaker CLOSED. LLM requests will be attempted normally

Коли пристосовуватися

  • Повільний LLM? Збільшувати MaxRetryAttempts або RetryBaseDelaySeconds
  • Agгресивне відновлення? Снижувати CircuitBreakerDurationSeconds
  • Багато тимчасових помилок? Збільшувати CircuitBreakerFailureThreshold
  • Неអនុញ្ញាត для локального тестування? Установити обидві EnableRetryPolicy і EnableCircuitBreaker до false

За допомогою коду

builder.Services.Addmostlylucid.mockllmapi(options =>
{
    options.BaseUrl = "http://localhost:11434/v1/";
    options.ModelName = "mixtral";
    options.Temperature = 1.5;
    options.TimeoutSeconds = 60;
});

Custom Endpoint Patterns

// Default: /api/mock/** and /api/mock/stream/**
app.Mapmostlylucid.mockllmapi("/api/mock");

// Custom pattern
app.Mapmostlylucid.mockllmapi("/demo");
// Creates: /demo/** and /demo/stream/**

// Without streaming
app.Mapmostlylucid.mockllmapi("/api/mock", includeStreaming: false);

Ось приклади використання

Базовий запит

curl http://localhost:5000/api/mock/users?limit=5

Возв 'язує реальні дані користувача, генеровані LLM.

Форми запитів щодо тіла (NEW в vM SK1

Видача бланку HTML:

curl -X POST http://localhost:5000/api/mock/users/register \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "username=john_doe&[email protected]&age=30"

Дані форми автоматично конвертуються в JSON і передаються до LLM для генерації реального реагування.

Форма з численними значениями:

curl -X POST http://localhost:5000/api/mock/posts \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "title=My Post&tags=tech&tags=programming&tags=llm"

Багато цінностей для одного і того ж ім 'я поля перетворюються на діаграми автоматично.

Запроси завантажити файл (NEW в vM SK1

Single File Upload:

curl -X POST http://localhost:5000/api/mock/photos/upload \
  -F "title=My Photo" \
  -F "description=Beautiful sunset" \
  -F "[email protected]"

Багато файлів з даними форми:

curl -X POST http://localhost:5000/api/mock/documents/bulk \
  -F "title=Multiple uploads" \
  -F "[email protected]" \
  -F "[email protected]"

Як працює завантаження файлів:

  • Содержание файлу потоком через буфер 8KB і відкинуто (не зберігається в пам 'ятіM SK1
  • Утримуються тільки метадані: ім 'я файла МSK1 тип контенту , розмір
  • LLM отримує метадані файлу і генерує відповідний відгук
  • Пам 'ять-безпечна для великих файлів M SK1тестована з 100MB+)

Прикладна реакція:

{
  "message": "Files uploaded successfully",
  "uploads": [
    {
      "fieldName": "image",
      "fileName": "photo.jpg",
      "contentType": "image/jpeg",
      "size": 524288,
      "processed": true
    }
  ]
}

Глибокий вулик (NEW в vM SK1

Комплексні Nested Paths:

curl "http://localhost:5000/api/mock/v1/api/products/electronics/computers/laptops/gaming/high-end/2024/details?brand=Dell&model=XPS15"

LLM враховує всі сегменти маршруту та параметри пошуку у реальну генерацію відповідей. Немає практичних обмежень в глибині маршрутуM SK1

З інтерфейсом API (NEW в vM SK1

Використовуйте контексти, щоб підтримувати конформність між багатьма пов 'язаними запитими:

# Step 1: Create a user
curl "http://localhost:5000/api/mock/users?context=checkout-flow"

# Step 2: Create order for that user (LLM references user from context)
curl "http://localhost:5000/api/mock/orders?context=checkout-flow"

# Step 3: Add payment (LLM references both user and order)
curl "http://localhost:5000/api/mock/payments?context=checkout-flow"

Кожна просьба у тому ж контексті бачить попередні прохання, гарантує послідовне визначення идентификаторівМSK1 іменаM SK2 та зв 'язки з даними МSK3 Чудово для багатого - кроків робочого потоку! Погляньте на Справка про контексти API для повних прикладів.

З контролем форми

curl -X POST http://localhost:5000/api/mock/orders \
  -H "X-Response-Shape: {\"orderId\":\"string\",\"total\":0.0,\"items\":[{\"sku\":\"string\",\"qty\":0}]}" \
  -H "Content-Type: application/json" \
  -d '{"customerId":"cus_123"}'

LLM генерує дані, які відповідають вашій точній конструкції.

Стримування (SSE - Сервер

SSE стріминг є частиною API REST - просто ввімкнути його при картуванні кінцевих точок

// SSE streaming is automatically available at /api/mock/stream/**
app.MapLLMockApi("/api/mock", includeStreaming: true);

Використовування:

curl -N http://localhost:5000/api/mock/stream/products?category=electronics \
  -H "Accept: text/event-stream"

Далі повертається Сервер-Подіслані події, як JSON генерується токеном

data: {"chunk":"{","done":false}
data: {"chunk":"\"id\"","done":false}
data: {"chunk":":","done":false}
data: {"chunk":"123","done":false}
...
data: {"content":"{\"id\":123,\"name\":\"Product\"}","done":true,"schema":"{...}"}

Наприклад, JavaScript:

const eventSource = new EventSource('/api/mock/stream/users?limit=5');

eventSource.onmessage = (event) => {
    const data = JSON.parse(event.data);

    if (data.done) {
        console.log('Complete:', data.content);
        eventSource.close();
    } else {
        console.log('Chunk:', data.chunk);
    }
};

З контролем форми:

curl -N "http://localhost:5000/api/mock/stream/orders?shape=%7B%22id%22%3A0%2C%22items%22%3A%5B%5D%7D"

Стримуйний кінцевий пункт має ті самі характеристики, що і звичайні кінцеві точки:

  • Управлення формою (запрос парамM SK1 заголовокМSK2 або тіло)
  • Поддержка skeми JSON
  • Закази на замовлення
  • Всі HTTP-metodи (GET, POSTM SK2 PUT , DELETE

Мокерування API GraphQL

Новое в v1.2.0: Нативна поддержка GraphQL з питанням-генерування макетних даних!

LLMock API включає в себе збудовані-вбудований Support GraphQL для кінцевих точок. На відміну від REST, де ви визначаєте фігури окремоM SK2 queries Graph QL naturally define the exact structure they expect - the query IS the shape

швидкий старт з GraphQL

GraphQL є автоматично доступним, коли ви мапираєте LLMock API:

app.MapLLMockApi("/api/mock", includeGraphQL: true); // GraphQL enabled by default

Це створює кінцевий пункт GraphQL на /api/mock/graphql.

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

Прості запитання:

curl -X POST http://localhost:5000/api/mock/graphql \
  -H "Content-Type: application/json" \
  -d '{"query": "{ users { id name email role } }"}'

Відповідь:

{
  "data": {
    "users": [
      { "id": 1, "name": "Alice Johnson", "email": "[email protected]", "role": "admin" },
      { "id": 2, "name": "Bob Smith", "email": "[email protected]", "role": "user" }
    ]
  }
}

З змінними

curl -X POST http://localhost:5000/api/mock/graphql \
  -H "Content-Type: application/json" \
  -d '{
    "query": "query GetUser($userId: ID!) { user(id: $userId) { id name email } }",
    "variables": { "userId": "12345" },
    "operationName": "GetUser"
  }'

Вбудовані запити

GraphQL'с потужністю світиться з вбудованими данимиM SK1

{
  company {
    name
    employees {
      id
      firstName
      lastName
      department {
        name
        location
      }
      projects {
        id
        title
        status
        milestones {
          title
          dueDate
          completed
        }
      }
    }
  }
}

LLM генерує реальні дані, які співпадають з структурою вашого запиту -, включаючи всі вбудовані зв 'язки

Ось приклад клієнта JavaScript

async function fetchGraphQL(query, variables = {}) {
    const response = await fetch('/api/mock/graphql', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ query, variables })
    });

    const result = await response.json();

    if (result.errors) {
        console.error('GraphQL errors:', result.errors);
    }

    return result.data;
}

// Usage
const data = await fetchGraphQL(`
    query GetProducts($category: String) {
        products(category: $category) {
            id
            name
            price
            inStock
            reviews {
                rating
                comment
            }
        }
    }
`, { category: 'electronics' });

Помилка в обробці

Ошибки GraphQL повертаються у стандартному форматі:

{
  "data": null,
  "errors": [
    {
      "message": "Invalid GraphQL request format",
      "extensions": {
        "code": "INTERNAL_SERVER_ERROR"
      }
    }
  ]
}

Як це працює

  1. Розібрати прохання: Вирізання питання GraphQL , змінні МSK2 і ім 'я оператора
  2. ПобудуватиPrompt: Надіслати структуру запиту до LLM з інструкціями для генерації співпадучих даних
  3. Виgenerувати дані: LLM створює реальні дані, які точно відповідають полям запиту
  4. Реакцію згортання: Дані повертаються в форматі GraphQL { "data": {...} }

Найголовні переваги

  • Ніхто не потребує опису форми: Запрос GraphQL визначає структуру
  • Тип Безпеки: Запроси явно запитують поля на ім 'я
  • Вбудовані стосунки: Природна підтримка складнихM SK1 вбудованих структур даних
  • Стандартний формат: працює з будь-якою Client Library GraphQL
  • Реальність даних: LLM генерує контекстуально необхідні дані для кожного поля

Тестування GraphQL

Використовуйте включне LLMApi.http файл, який містить 5 готовийM SK1на -используйте приклади GraphQL:

  • Просте запитання користувача
  • Попит із змінними
  • Поміщені поля з массивами
  • E- каталог товарів
  • Складні організаційні дані

Подивіться До прикладів GraphQL в LLMApi.http для повних прикладів роботи.

Konfiguracja GraphQL

Ограничення символів та вибір моделей

GraphQL responses can become large with deeply nested queries. To prevent JSON truncation errors, configure the GraphQLMaxTokens опція:

{
  "MockLlmApi": {
    "GraphQLMaxTokens": 300  // Recommended: 200-300 for reliability
  }
}

Руководство щодо обмеження символів:

Модель МSK1 Рекомендуемые Max Tokens МSK2 Замітки
модель МSK0 300-500 ♫ ♫ МSK2 ♫ Найкращий баланс швидкості та складності ♫
mistral:7b МSK0 300-500 ♫ ♫ МSK2 ♫ Рухає вмонтовані структури добре ♫
phi3 МSK1 ♫ ♫ МSK2 ♫ Тримаймо питання простими ♫ ♫
тиніллама МSK1 ♫ ♫ Використовуйте лише поверхневі питання ♫

Чому нижчий - краще:

  • Про prompt визначає пріоритети правильність над довжиною
  • Нижчі обмеження змушують LLM генерувати простіший, повний JSON
  • Вищі обмеження ризику скорочених відповідей (неправильне JSONM SK1
  • Якщо ви бачите "Неправильний JSON з LLM" помилкиM SK2 зменшити GraphQLMaxTokens

Для складних Nested Queries:

  1. Використовуйте більші моделі: (llmM SK1модель, митраль :7bMSC4
  2. Збільшити GraphQLMaxTokens до 500-1000
  3. Залишити розміри ланцюга маленькими. (2 по замовчуванню - макс.
  4. Прослідкувати журнали для попередження відрізання

Ось приклад konfigurації для складних запитів:

{
  "MockLlmApi": {
    "ModelName": "llm-model",           // Larger model
    "GraphQLMaxTokens": 800,          // Higher limit for nested data
    "Temperature": 1.2
  }
}

СигналR Real-Time Data Streaming

LLMock API включає в себе опціональну підтримку SignalR для безперервного, реальногоM SK1 генерації даних про макет часу. Це ідеальне для

  • Прототипи панелі, які потребують живих оновлень
  • Тестування компонентів інтерфейсу реального-часу
  • Демо з постійно змінюваними даними
  • Тестування інтеграції WebSocket/SignalR

швидкий старт з SignalR

СигналR працює незалежно - ви не маєте ' не потрібні кінцеві точки API для використання потоку СигналаR

1. Minimal SignalR -only setupM SK2

using mostlylucid.mockllmapi;

var builder = WebApplication.CreateBuilder(args);

// Add SignalR services (no REST API needed!)
builder.Services.AddLLMockSignalR(builder.Configuration);

var app = builder.Build();

app.UseRouting();

// Map SignalR hub and management endpoints
app.MapLLMockSignalR("/hub/mock", "/api/mock");

app.Run();

Опціонально: Додайте REST API також

Якщо ви також хочете отримати кінцеві точки API REST, додайте ці лініїM SK1

// Add core LLMock API services (optional)
builder.Services.AddLLMockApi(builder.Configuration);

// Map REST API endpoints (optional)
app.MapLLMockApi("/api/mock", includeStreaming: true);

2. Налагодити в настроях

{
  "MockLlmApi": {
    "BaseUrl": "http://localhost:11434/v1/",
    "ModelName": "ministral-3:3b",
    "Temperature": 1.2,

    "SignalRPushIntervalMs": 5000,
    "HubContexts": [
      {
        "Name": "weather",
        "Description": "Weather data with temperature, condition, humidity, and wind speed"
      },
      {
        "Name": "stocks",
        "Description": "Stock market data with symbol, current price, change percentage, and trading volume"
      }
    ]
  }
}

3. Подключення з клієнтаM SK1

// Using @microsoft/signalr
const connection = new signalR.HubConnectionBuilder()
    .withUrl("/hub/mock")
    .withAutomaticReconnect()
    .build();

// Subscribe to a context
connection.on("DataUpdate", (message) => {
    console.log(`${message.context}:`, message.data);
    // message.data contains generated JSON matching the shape
    // message.timestamp is unix timestamp in ms
});

await connection.start();
await connection.invoke("SubscribeToContext", "weather");

Konfiguracja контекстуHub

Кожен контекст узла моделює повний API-запрос і генерує дані постійно:

{
  "Name": "orders",                 // Context name (SignalR group identifier)
  "Description": "Order data..."    // Plain English description (LLM generates JSON from this)
  // Optional:
  // "IsActive": true,              // Start in active/stopped state (default: true)
  // "Shape": "{...}",              // Explicit JSON shape or JSON Schema
  // "IsJsonSchema": false           // Auto-detected if not specified
}

Рекомендується: Використовуйте прості англійські описи

Дозвольте LLM автоматично генерувати необхідні JSON структури:

{
  "Name": "sensors",
  "Description": "IoT sensor data with device ID, temperature, humidity, battery level, and last reading timestamp"
}

LLM автоматично генерує потрібну схему JSON з вашого опису. - не потрібна ручна форма

API створення динамічного контексту

Створити та управляти контекстами SignalR в часі запуску за допомогою управління API:

Створити контекст

POST /api/mock/contexts
Content-Type: application/json

{
  "name": "crypto",
  "description": "Cryptocurrency prices with symbol, USD price, 24h change percentage, and market cap"
}

Відповідь:

{
  "message": "Context 'crypto' registered successfully",
  "context": {
    "name": "crypto",
    "description": "Cryptocurrency prices...",
    "method": "GET",
    "path": "/crypto",
    "shape": "{...generated JSON schema...}",
    "isJsonSchema": true
  }
}

Список усіх контекстів

GET /api/mock/contexts

Відповідь:

{
  "contexts": [
    {
      "name": "weather",
      "description": "Realistic weather data with temperature, conditions, humidity, and wind speed for a single location",
      "method": "GET",
      "path": "/weather/current",
      "shape": "{...}"
    },
    {
      "name": "crypto",
      "description": "Cryptocurrency prices...",
      "shape": "{...}"
    }
  ],
  "count": 2
}

Примітка: Контексти, конфігуровані в настроях aplikacji, з 'єднуються з будь-якими динамічно створеними контекстами в часі запускуM SK2 Об' ясування з настроїв додаються, навіть якщо ці контексти ще не були динаміко зареєстровані

З 'ясувати конкретний контекст

GET /api/mock/contexts/weather

Відповідь:

{
  "name": "weather",
  "method": "GET",
  "path": "/weather/current",
  "shape": "{\"temperature\":0,\"condition\":\"string\"}",
  "isJsonSchema": false
}

Позбутись контексту

DELETE /api/mock/contexts/crypto

Відповідь:

{
  "message": "Context 'crypto' deleted successfully"
}

Почнемо з контексту (Завершимо генерацію данихM SK1

POST /api/mock/contexts/crypto/start

Відповідь:

{
  "message": "Context 'crypto' started successfully"
}

Починає генерувати дані для замкнутого контексту без впливу на підключені клієнти.

Стоп Контекст (Pause Data GenerationM SK1

POST /api/mock/contexts/crypto/stop

Відповідь:

{
  "message": "Context 'crypto' stopped successfully"
}

Перестає генерувати нові дані, але зберігає контекст зареєстрований. Klienci залишаються під 'єднаними, але не отримують оновлення допоки їх ще не запустилиM SK1

Повний приклад клієнта

<!DOCTYPE html>
<html>
<head>
    <script src="https://cdn.jsdelivr.net/npm/@microsoft/[email protected]/dist/browser/signalr.min.js"></script>
</head>
<body>
    <h1>Live Weather Data</h1>
    <div id="weather-data"></div>

    <script>
        const connection = new signalR.HubConnectionBuilder()
            .withUrl("/hub/mock")
            .withAutomaticReconnect()
            .build();

        connection.on("DataUpdate", (message) => {
            if (message.context === "weather") {
                const weatherDiv = document.getElementById("weather-data");
                weatherDiv.innerHTML = `
                    <h2>Current Weather</h2>
                    <p>Temperature: ${message.data.temperature}°F</p>
                    <p>Condition: ${message.data.condition}</p>
                    <p>Humidity: ${message.data.humidity}%</p>
                    <p>Updated: ${new Date(message.timestamp).toLocaleTimeString()}</p>
                `;
            }
        });

        connection.start()
            .then(() => {
                console.log("Connected to SignalR hub");
                return connection.invoke("SubscribeToContext", "weather");
            })
            .then(() => {
                console.log("Subscribed to weather context");
            })
            .catch(err => console.error(err));
    </script>
</body>
</html>

Створювання динамічного контексту з інтерфейсу

async function createDynamicContext() {
    // Create the context
    const response = await fetch("/api/mock/contexts", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({
            name: "stocks",
            description: "Stock market data with ticker symbol, current price, daily change percentage, and trading volume"
        })
    });

    const result = await response.json();
    console.log("Context created:", result.context);

    // Subscribe to receive data
    await connection.invoke("SubscribeToContext", "stocks");
    console.log("Now receiving live stock data!");
}

Методи Hub SignalR

І MockLlmHub підтримує наступні методи:

SubscribeToContext(string context)

  • Подключається до клієнта, щоб отримати оновлення даних для конкретного контексту
  • Заказчик отримає DataUpdate події з генерованими даними
  • Новое в v1.1.0: Автоматично збільшує число з 'єднань контексту'

НеsubscribeFromContext(string context)

  • Виключає клієнта з контексту
  • Клиент більше не отримає оновлення для цього контексту
  • Новое в v1.1.0: Автоматично зменшує число з 'єднань контексту'

Мероприяти, отримані клієнтом:

Обновлення даних - Поміщає генеровані макетні дані

{
    context: "weather",       // Context name
    method: "GET",            // Simulated HTTP method
    path: "/weather/current", // Simulated path
    timestamp: 1699564820000, // Unix timestamp (ms)
    data: {                   // Generated JSON matching the shape
        temperature: 72,
        condition: "Sunny",
        humidity: 45,
        windSpeed: 8
    }
}

Зарегистрований - Подтвердження abonamentу

{
    context: "weather",
    message: "Subscribed to weather"
}

Не зареєстровано - Обіцяння відмовитися від підписки

{
    context: "weather",
    message: "Unsubscribed from weather"
}

Параметри налаштування

{
  "MockLlmApi": {
    "SignalRPushIntervalMs": 5000,  // Interval between data pushes (ms)
    "HubContexts": [...]             // Array of pre-configured contexts
  }
}

Поддержка схем JSON

Контексти хапу підтримують як просту форму JSON, так і повну схему JSON:

Проста форма:

{
  "Name": "users",
  "Shape": "{\"id\":0,\"name\":\"string\",\"email\":\"string\"}"
}

skeма JSON:

{
  "Name": "products",
  "Shape": "{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"number\"},\"name\":{\"type\":\"string\"},\"price\":{\"type\":\"number\"}},\"required\":[\"id\",\"name\",\"price\"]}",
  "IsJsonSchema": true
}

Система auto- визначає схему JSON, шукаючи $schema, type, або properties поля.

Архітектура

graph TD
    Client[SignalR Client] -->|Subscribe| Hub[MockLlmHub]
    Hub -->|Join Group| Group[SignalR Group]
    BG[Background Service] -->|Generate Data| LLM[Ollama LLM]
    LLM -->|JSON Response| BG
    BG -->|Push Data| Group
    Group -->|DataUpdate Event| Client
    API[Management API] -->|CRUD| Manager[DynamicHubContextManager]
    Manager -->|Register/Unregister| BG

Komponenти:

  • MockLlmHub: Модуль SignalR, що керує підключеннями і abonnementами
  • МокDataBackgroundService: Обладнанана служба, що постійно генерує дані
  • DynamicHubContextManager: ТемкаM SK1безпечний менеджер для rejestracji контексту в часі запуску
  • Конфігурація контексту Hub: Модель конфігурації для кожного контексту даних

Використовуйте випадки

1. Прототипування панелі

// Subscribe to multiple data sources
await connection.invoke("SubscribeToContext", "sales");
await connection.invoke("SubscribeToContext", "traffic");
await connection.invoke("SubscribeToContext", "alerts");
// Now receiving live updates for all three!

2. Симуляції IoT

{
  "Name": "sensors",
  "Description": "IoT temperature sensors with device ID, current temperature, battery percentage, and signal strength",
  "Path": "/iot/sensors"
}

3. Финансові дані

{
  "Name": "trading",
  "Description": "Real-time stock trades with timestamp, symbol, price, volume, and buyer/seller IDs",
  "Path": "/trading/live"
}

4. Лідерборд гри

{
  "Name": "leaderboard",
  "Description": "Gaming leaderboard with player name, score, rank, level, and country",
  "Path": "/game/leaderboard"
}

Керування життєвим циклом у контексті

Новое в v1.1.0: Полний контроль життєвого циклу над контекстами SignalR з реальним-time status trackingM SK1

Кожен контекст має następujące властивості:

  • Неактивна: Чи контекст генерує дані
  • Кількість підключень: Число підключених Clientів

Контексти можуть бути в двох штатах

  • Активний: Базова служба генерує нові дані кожного SignalRPushIntervalMs (по замовчуваннюМSK1 МSK2 секундM SK3
  • Закінчено: Контекст залишається зареєстрованим , клієнти залишаються під 'єднанимиM SK2 але ніяких нових даних не генерується

Ключові характеристики:

  • Почати/запинити контексти, не відключаючи Clients
  • real-time connection count tracking
  • Статусові значки, що показують активний/застійний стан
  • Похибка у контексті
  • Контексти з настроек appsettings.json автоматично з 'являються в інтерфейсі

Керування відповіддю для сигналуR: Новое в v1.1.0: Інтелектове кэшування зменшує obciążenie LLM і покращує послідовність!

  • Наповнювання батареї: Згенерує 5-10 відповіді одночасно МSK2конфигуровані через MaxCachePerKey)
  • За Per-Контекстні черги: Кожен контекст зберігає свій власний кэш реакцій, створених перед МSK1
  • Обновлення фону: Автоматично переповнює кэш, коли він опускається нижче пропускної спроможності 50%
  • Розумне планування: Minimizes LLM calls while maintaining data freshness

Це значно зменшує obciążenie LLM для високих-частотних контекстів

Ось приклад робочого процесу:

# Create a context
POST /api/mock/contexts
{ "name": "metrics", "description": "Server metrics" }

# Stop data generation (clients remain connected)
POST /api/mock/contexts/metrics/stop

# Resume data generation
POST /api/mock/contexts/metrics/start

# Remove context entirely
DELETE /api/mock/contexts/metrics

OpenAPI / генерація Swagger Mock

Нова функція: Автоматично генерувати макетні кінцеві точки з OpenAPI/ Спеціалізування SchwaґераM SK1 Показувати на будь-який OpenAPI 3.0/Swagger 2.0 спеціальність МSK4URL або файлMSC5, і бібліотека створить макетних кінцевих точок для всіх визначених операцій

Швидкий старт з OpenAPI

dotnet add package mostlylucid.mockllmapi

Програму.csM SK1

using mostlylucid.mockllmapi;

var builder = WebApplication.CreateBuilder(args);

// Add OpenAPI mock services
builder.Services.AddLLMockOpenApi(builder.Configuration);

var app = builder.Build();
app.UseRouting();

// Map OpenAPI-based mock endpoints
app.MapLLMockOpenApi();

app.Run();

програмування.jsonM SK1

{
  "MockLlmApi": {
    "BaseUrl": "http://localhost:11434/v1/",
    "ModelName": "ministral-3:3b",
    "Temperature": 1.2,
    "OpenApiSpecs": [
      {
        "Name": "petstore",
        "Source": "https://petstore3.swagger.io/api/v3/openapi.json",
        "BasePath": "/petstore",
        "EnableStreaming": false
      },
      {
        "Name": "myapi",
        "Source": "./specs/my-api.yaml",
        "BasePath": "/api/v1"
      }
    ]
  }
}

Це те, що

Як це працює

  1. Speк Завантаження: Завантаження спецификацій OpenAPI з URL або локальних файлів (JSON чи YAML)
  2. Конвертація шеми: Перетворює схему OpenAPI на шаблони форми JSON
  3. Майпінг кінцевих точок: Автоматично відображає всі операції на кінцевих точках ASP.NET
  4. Поява LLM: Використовує LLM, щоб генерувати реальні макетні дані, які співпадуть з схемою
  5. Параметри маршруту: Рукає параметри маршруту, такі як /users/{id} автоматично

Параметри налаштування

Кожна спецификація OpenAPI підтримує ці параметри конфігурації:

Об 'єкт МSK1 Тип Описание МSK3
Name струна МSK1 Unikальний ідентифікатор для цього спектру МSK2побаровний )
Source строк URL або шлях файлу до OpenAPI спеціаду МSK2побаровнийM SK3 МSK4
BasePath строк МSK1 Перезаписувати базовий шлях (defaultM SK3 використовує спецификацію's servers[0].url)
EnableStreaming bool МSK1 Dodaj /stream заголовок для потоку SSE
IncludeTags струна[] МSK1 Згенерувати тільки кінцеві точки з цими ярликами
ExcludeTags струна[] МSK1 Перемикайте кінцеві точки цими ярликами
IncludePaths струна[] МSK1 Далі генерувати лише ці шляхи ( підтримує дикі карти, такі як /users/*)
ExcludePaths струна[] МSK1 Перемикайте ці шляхи МSK2 підтримує дикі карти ) ≥

Заawansовані приклади конфігурації

Фильтр за тегами:

{
  "Name": "petstore",
  "Source": "https://petstore3.swagger.io/api/v3/openapi.json",
  "IncludeTags": ["pet", "store"]
}

Фильтр за маршрутами:

{
  "Name": "api",
  "Source": "./specs/api.yaml",
  "IncludePaths": ["/users/*", "/products/*"],
  "ExcludePaths": ["/admin/*"]
}

Увімкніть стріминг:

{
  "Name": "api",
  "Source": "./specs/api.yaml",
  "BasePath": "/api",
  "EnableStreaming": true
}

Випробовуємо OpenAPI Mocks

Ураховуючи цю конфігурацію OpenAPI:

{
  "Name": "petstore",
  "Source": "./specs/petstore.json",
  "BasePath": "/petstore"
}

І конкретне визначення GET /pet/{petId} що повертає Pet об 'єкт, ви можете протестуватиM SK1

# Get a pet by ID
curl http://localhost:5116/petstore/pet/123

# Response (generated by LLM based on Pet schema):
{
  "id": 123,
  "name": "Fluffy",
  "category": {
    "id": 1,
    "name": "Cats"
  },
  "photoUrls": ["https://example.com/fluffy.jpg"],
  "tags": [
    {"id": 1, "name": "cute"},
    {"id": 2, "name": "playful"}
  ],
  "status": "available"
}

Модулярне використання

Моделі OpenAPI працюють незалежно від REST

// Just OpenAPI mocks
builder.Services.AddLLMockOpenApi(builder.Configuration);
app.MapLLMockOpenApi();

// Or combine with other features
builder.Services.AddLLMockRest(builder.Configuration);
builder.Services.AddLLMockOpenApi(builder.Configuration);
app.MapLLMockRest("/api/mock");
app.MapLLMockOpenApi();

Obsługовані формати спектру

  • OpenAPI 3.0 (JSON або YAMLM SK1
  • OpenAPI 3.1 (JSON або YAMLM SK1
  • Swagger 2.0 (JSON або YAMLM SK1

Найголовніше

  • Автоматичне генерування кінцевих точок: Усі шляхи та операції з спектру стають консольними кінцевими точками
  • Схема-Driven: Відтвори реакцій, отримані з схеми реакcji OpenAPI
  • Параметри маршруту: Ручки /users/{id}, /posts/{postId}/comments/{commentId}, і т.д.
  • Мільйозковий спектр: Одночасно завантажувати та під 'єднати кілька інструкцій API
  • Розумне фільтрування: ВключитиM SK1виключити операції за допомогою ярликів або шляхів
  • Поддержка потоку: Включний SSE стріминг для будь-якого кінцевого пункту
  • LLM-Заsilaна: генерує реалістичні , різні дані, підходящі для кожної схеми

Використовуйте випадки

  • API-Перший розвиток: Почати кодувати за допомогою спецификації перед тим, як закінчити програму
  • Прототипування: Розробити інтерфейс при створенні інтерфейсу
  • Тестування інтеграції: Проверка коду клієнта без реальних API залежностей
  • Дослідження довкілля: Виставляйте додатки без доступу до API для виробництва
  • Тестування контракту: Проверити, що клієнти правильно обробляють всі зміни схем
  • Завантаження тестування: генерувати реальні дані тесту в масштабах

Ограничення

  • Наразі поддерживается лише реакційна схема (не застосовано перевірки запиту)
  • Безопасні системи ігноровані (не вимагається аутентифікаціїM SK1
  • Тільки застосування/json тип контенту підходить для відповідей
  • Значення параметрів маршруту не підтверджуються в умовах обмежень схем.

Тестування управління OpenAPI

Включні management.http в файлі є повні приклади для всіх кінців управління:

Менеджмент спектру:

  • Завантаження опису з URL (Petstore, GitHub APIM SK2 і т.д.
  • Загрузити спецификацію з локального файлу
  • Завантаження опису з сирого JSON/YAML
  • Перегляньмо всі завантаження
  • Дайте детальні деталі з кінцевими пунктами
  • Перезавантаження опису (вновити з джерелаM SK1
  • Позбутись

Тестування в кінцевому місці:

  • Випробувати кінцеві точки GET з параметрами маршруту
  • Випробувати кінцеві точки POST/PUT/DELETE
  • Випробувати кінцеві точки з параметрами запиту
  • Випробувати декілька кінцевих точок у послідовності

Заawansовані робочі потоки:

  • Загрузити кілька спеціаліз одночасно
  • Порівняйте моделі OpenAPI з звичайними
  • Операції на батареї
  • У handlingі прикладів помилки

До прикладу з менеджменту.http:

### Load Petstore API
POST http://localhost:5116/api/openapi/specs
Content-Type: application/json

{
  "name": "petstore",
  "source": "https://petstore3.swagger.io/api/v3/openapi.json",
  "basePath": "/petstore"
}

### Test an endpoint
POST http://localhost:5116/api/openapi/test
Content-Type: application/json

{
  "specName": "petstore",
  "path": "/pet/123",
  "method": "GET"
}

Подивіться на повний менеджмент.http файл для 20+ готовийМSK1на МСК2используйте прикладиМСС3

Застосування для демонстрації

У комплекті є повні приклади демонстрації з інтерактивними інтерфейсами, що містять повне управління контекстом:

Клієнт Windows Desktop (LLMockApiClient/МSK0 — Застосування WPF МSK2 В процесі розробки )

⚠️ STATUS DEVELOPMENT: Цю програму Windows зараз активно розробляютьM SK1 В той час, як багато функцій є функціональними , деякі функції можуть бути незавершеними або піддаватися змінам МSK3 Застосовуються для тестування та розробки .

Комплексна графічна програма WPF для взаємодії з API LLMock:

Особенности:

  • Дошка для вібрацій: РеальнийM SK1 статус часу підключення і система спостереження
  • Сигнальний час: Створити контексти і підключатися до потоків даних наживо
  • SSE стріминг: Три trybи потоку МSK1tokensM SK2 об 'єкти
  • Менеджер OpenAPI: Завантаження спеціацій з URL
  • Usługи gRPC: Завантаження МSK1proto-файлиM SK2 тестування gRPC
  • Пограйте з API: інтерактивний майданчик тестування HTTP
  • Множество-Подтримка: Настройка і перемикання між багатьма заходами
  • Навігатор руху: Жива HTTP прохання/запис відповідей
  • Темна тема: Перемикати між темами з плавними переходами

Документація: LLMockApiClient README

Чудово для: Практичні потоки тестування на робочому столі, візуальне дослідження APIM SK1 розробка та виправлення


Веб-На основі демонстрацій

СигналР Демо (/) МSK1 РеальнийM SK2Стримування даних часу з інтерфейсом управління

Новое в v1.1.0: Удосконалений макет столбца 3- з повним управлінням життєвим циклом в контексті

Особенности:

  • Створити контекстну панель: Введіть прості англійські описи , система генерує відповідний схему JSON
  • Панель активних контекстів:
    • Живий список усіх контекстів з статусними значками (AktywnyM SK1Stopped)
    • Автоматично відображає контексти з настроек appsettings.json при запускі
    • Реальний-рахунок часу підключення для кожного контексту
    • Per-контекстні контроліM SK1 Подключення, Вимкнення , Початок МSK4 Зупинення M SK5 Унівець
    • Автоматичний- переробка при змінах
  • Панель живих даних: Реальний МSK1tydові aktualiзації з суб 'єднуваних контекстів
    • Освітлення синтаксису JSON: Красивий темнийM SK1 тематичний дисплей з кольорами - кодовані елементи
    • Ключи (червонийM SK1 струни (зелений), числа МSK4оранжевийМSK5 booleans
    • Чистий, читабельний формат з відповідним дисплейом тайм-стопу
    • Ніхто не залежить від зовнішньої системи. - легкий, збудований

Швидкий-Початкові приклади: Один - кнопки клацання для МSK1 передідущих МSK2 запрограмованих сценаріїв :

  • Сенсори IoT: датчики температури з ідентифікатором пристрою
  • Фондовий ринокМSK0 Реальний - часові ціни з крапками МSK2 ціна , змінний відсоток
  • E-закази на торгівлю: Закази з ідентифікованим номеромМSK1 клієнтМСК2 сукупність товарівMСК3 статусМ СК4 в цілому
  • Серверна метрика: Обстеження даних з ім 'ям хоста , Процесор МSK2 пам' ять M SK3 диск , підключення
  • Лідерборд гри: Статуси гравців з ім 'ямM SK1 балів , рейтинг МSK3 рівень M SK4 країна

Чудово для: Дашборди, моніторія наживоМSK1 симуляції IoTM SK2 реальні- часові канали МSK4 прототипування

SSE Streaming Demo (/Streaming) — Прогресивна генерація JSON

Новое в v1.1.0: Quick-запуск прикладних кнопок для миттєвого потокуM SK1

Особенности:

  • Konfigurувати HTTP-metodу, шлях, і опціональну форму JSON
  • Дивіться, як генерується JSON
  • Статистика наживо: кількість частинокM SK1 тривалість, розмір даних
  • Індикатори стану підключення

Швидкий-Початкові приклади: Один кнопок - для сценаріїв потоку МSK1

  • Список користувачів: Арія об 'єктів користувача з ID, ім' яM SK2 e-mail
  • Каталог продуктів: Інвесторія з товаром з SKUM SK1 ім 'я , ціна, статус запасів
  • Розробка замовлення: Збудовані замовлення з інформацією про покупців та сукупністю речей
  • Погодні дані: Текучі умови з температуроюM SK1 вологість, швидкість вітру

Чудово для: Наблюдання за генерацією LLM, вигадування اشکالM SK1 розуміння потокового поведінки, тестування SSE

Демо-менеджер OpenAPI (/OpenApi) МSK1 Динамічне завантаження спектру МSK2 Тестування

Нова функція: Інтективне управління спецификаціями OpenAPI з реальними-time updates!

Особенности:

  • Завантаження спеціалів динамічно: З URL або вставляйте сирові JSONM SK1YAML прямо у браузер
  • real-Aktualізації часу: SignalRM SK1вправні повідомлення наживо для всіх дій
  • Розвідка кінцевої точки: Автоматичне вилучення усіх операцій з опису
  • В-Випробування браузера: Випробувати будь-який кінцевий пункт одним кліком , patrz LLM МSK2 генеровані макетні дані
  • Менеджмент життєвого циклу: ЗавантаженняM SK1 перезавантаження , видалити описи без перезапускання сервера
  • Красивий інтерфейс: Колір МSK1 кодовані HTTP методи , синтаксис M SK3 висвітлені відповіді JSON
  • Статус підключення: Живий індикатор показує стан підключення SignalR
  • Комплексна допомога: Інлайн-документація та прикладні URL

Швидкий-Початкові приклади:

  • Загрузити API Petstore з URL
  • Вставляйте власний OpenAPI JSON
  • Подивіться на всі кінцеві точки з опису
  • Випробувати кінцеві точки безпосередньо на сторінці
  • Подивіться на реальні моделі даних, створених LLM

Чудово для: Прототипування API, розробка фронтального інтерфейсуM SK1 тестування контракту , перевірки спеціалізу МSK3 демонстрації

Пройти демонстрацію:

cd LLMApi
dotnet run

Навігати до:

  • http://localhost:5116 - СигнельR реальнийM SK1тік даних часу з інтерфейсом управління
  • http://localhost:5116/Streaming - Прогрессивна генерація
  • http://localhost:5116/OpenApi - OpenAPI spec manager з динамічним завантаженням

Всі демонстрації включають:

  • Комплексна інлайн-документація
  • Интерактивні приклади запуску швидкого-
  • Зразки коду для інтеграції
  • Індикатори реального часу
  • Повний контекст контролю життєвого циклу

Заawansовані характеристики

Реакційна схема Ехо (ShapeM SK1 Виведення

Ви можете опціонально відтворити ехо середнякового інструмента, що повертає форму JSON/схему, яка була використана для генерації mock response.

Konfiguracja:

  • Опція: ВключитиShapeInResponse (boolM SK2 поганий хибний)
  • Per-заперечувати запит: додати параметр запиту, включаючиSchemaM SK2правду MSC3 або 1)
  • Випущені заголовки: XM SK1 ВідповідьМSK2Schema ( тільки тоді, коли була надана форма і розмір МСК4 МСК5 символиMСК6
  • Streaming: кінцевий SSE-релікт включає в себе поле схеми, коли включено

Приклади:

  • Увімкніть глобально (програмуванняM SK1json):
{
  "mostlylucid.mockllmapi": {
    "IncludeShapeInResponse": true
  }
}
  • Увімкніть за запитом (переймиває конфигураціюM SK1
curl "http://localhost:5000/api/mock/users?shape=%7B%22id%22%3A0%2C%22name%22%3A%22string%22%7D&includeSchema=true"

Відповідь містить заголовок:

X-Response-Schema: {"id":0,"name":"string"}
  • Streaming: кінцевий випадок містить поле схеми, коли включено
...
data: {"content":"{full json}","done":true,"schema":{"id":0,"name":"string"}}

Примітки:

  • Якщо ніякої форми не було надано (за допомогою запитуМSK1головокM SK2тіло), заголовок не додається
  • Дуже великі фігури (> 4000 символиM SK2 не додають до заголовку, щоб уникнути транспортних проблем,, але нормальна реакція продовжується

Використовуйте cases:

  • Client- генерація типів шрифта Side TypeScript
  • Документація API та перевірки схем
  • Розшифровування форм
  • Веріалізація в часі запуску

Custom Prompt Templates

Записувати початкові прохання за допомогою власного:

{
  "mostlylucid.mockllmapi": {
    "CustomPromptTemplate": "Generate mock data for {method} {path}. Body: {body}. Use seed: {randomSeed}"
  }
}

Доступні позиціонери:

  • {method} - HTTP-metodа
  • {path} - Повний шлях запиту з строком запиту
  • {body} - Корпус запиту
  • {randomSeed} - Згенероване випадкове насіння
  • {timestamp} - Унікс
  • {shape} - Спеціальна характеристика форми МSK1 якщо надано МSK2

Симулювання помилки

Випробуйте obsługę помилок вашого клієнта' з комплексними можливостями моделювання помилок.

Чотири способи налаштування помилок (вลําดับі попередженняM SK1

  1. Параметри запиту (максимальна пріорентністьM SK1

Важливо: Значення параметру запиту мусять бути URL %20, & стає %26, : стає %3A, і т.д.

# Properly encoded (spaces as %20)
curl "http://localhost:5000/api/mock/users?error=404&errorMessage=Not%20found&errorDetails=User%20does%20not%20exist"

# More complex example with special characters
# Decoded: "Invalid input: email & phone required"
curl "http://localhost:5000/api/mock/users?error=400&errorMessage=Invalid%20input%3A%20email%20%26%20phone%20required"
  1. HTTP Headers:
curl -H "X-Error-Code: 401" \
     -H "X-Error-Message: Unauthorized" \
     -H "X-Error-Details: Token expired" \
     http://localhost:5000/api/mock/users
  1. Форма JSON (застосування $error нерухомість):
# Simple: just status code
curl "http://localhost:5000/api/mock/users?shape=%7B%22%24error%22%3A404%7D"

# Complex: with message and details
curl "http://localhost:5000/api/mock/users?shape=%7B%22%24error%22%3A%7B%22code%22%3A422%2C%22message%22%3A%22Validation%20failed%22%2C%22details%22%3A%22Email%20invalid%22%7D%7D"
  1. Керівник запиту (застосування error нерухомість):
curl -X POST http://localhost:5000/api/mock/users \
  -H "Content-Type: application/json" \
  -d '{
    "error": {
      "code": 409,
      "message": "Conflict",
      "details": "User already exists"
    }
  }'

Формати реагування на помилки:

Regular/Сточки потокуM SK1

{
  "error": {
    "code": 404,
    "message": "Not Found",
    "details": "Optional additional context"
  }
}

GraphQL кінцевий пункт:

{
  "data": null,
  "errors": [
    {
      "message": "Not Found",
      "extensions": {
        "code": 404,
        "details": "Optional additional context"
      }
    }
  ]
}

СигналR - симуляція помилок:

Konfigurувати помилки в контексті SignalR для тестування реального-time error handling:

{
  "HubContexts": [
    {
      "Name": "errors",
      "Description": "Error simulation stream",
      "ErrorConfig": {
        "Code": 500,
        "Message": "Server error",
        "Details": "Database connection lost"
      }
    }
  ]
}

Або динамічно через управління API:

curl -X POST http://localhost:5000/api/management/contexts \
  -H "Content-Type: application/json" \
  -d '{
    "name": "errors",
    "description": "Test errors",
    "error": 503,
    "errorMessage": "Service unavailable",
    "errorDetails": "Maintenance in progress"
  }'

Поддерживані коди статусу HTTP:

Пакет містить початкові повідомлення для стандартних кодів статусу HTTP:

  • 4xx Помилки клієнтаМSK0 400 \ (Непоганий запит МSK3 | \ \ МSK4 | (Неавторизований ), ♫ \403 ♫ (Запретний МСК9 ♪ МСк10 ─ МС К11Ненайдений MСК12 МСкіл 13 ─ MС К14Метод не дозволяється М СК15 ─ ♪ MСкіль 16 ─M Скіл 17 ─ Запинка строку запити M С К18 ─ М С К19 ─" МС С К20 Конфлікт М S К21 ─ « М С С К22 » ─ 'М С К23 ─' Нерозробляемый об 'єкт' М ס К24 ─ М С K 25 ─「 М С К 26 Надто багато запитів М С К 27
  • 5xx Server ErrorsМSK0 500 | | МSK2Вишкоди всередині сервера ), \ | 501 ♫ \ ( Не вбудовано ), МSK7 ♪ ( Поганий портом M SK9 ≥ 503 ≤ (Сервіс недоступен МСК12 ─ МС К13 ─ MС К14 ─ Вимкнення порту М С К15 ─

Custom messages and details override the defaults.

Використовуйте cases:

  • Випробувати логіку спроби клієнта і експоненціальний відхилення
  • Вивірити wyświetlenie komunikatу про помилку в інтерфейсі
  • Випробовування аутентифікації/потіки авторізації
  • Створити сценарії обмеження швидкості
  • Практика грациозних образів деградації
  • Тестування журналізації і перевірки помилок

Подивіться LLMApi/LLMApi.http для комплексних прикладів всіх методів моделювання помилок.

Багато речей

montage multiple mock APIs with different configurations:

// Development data with high randomness
builder.Services.Addmostlylucid.mockllmapi("Dev", options =>
{
    options.Temperature = 1.5;
    options.ModelName = "llm-model";
});

// Stable test data
builder.Services.Addmostlylucid.mockllmapi("Test", options =>
{
    options.Temperature = 0.3;
    options.ModelName = "llm-model";
});

app.Mapmostlylucid.mockllmapi("/api/dev");
app.Mapmostlylucid.mockllmapi("/api/test");

Спеціальність форми

Три способи контролю структури реакції:

  1. Заголовок (рекомендуєтьсяM SK1 X-Response-Shape: {"field":"type"}
  2. Попитний парам: ?shape=%7B%22field%22%3A%22type%22%7D (URLM SK1encoded JSON)
  3. Поле тіла: {"shape": {...}, "actualData": ...}

Виховування декількох відповідей за допомогою форми

Ви можете вказувати середній програмі на створення і зберігання множевих варіантів відповідей для конкретного запиту. Ви можете додати особливе поле в об 'єкті форми.

  • Ключ кэшу походить з HTTP-metodи + шлях МSK1включно із запитом МSK2 + спорядкована форма мSK4з M$удаленням кэша МСК6 за допомогою Системі СМСК7 ІО \МСК8 \ Хашинґ XX Хашинг \ MSК9 \
  • Відклики до N завантажуються з LLM і зберігаються в пам 'яті - ( за допомогою MaxCachePerKey в настроях МSK2 по замовчуванню МSK3
  • Наступні не---запити про те ж саме ключ відсилають з розривної черги;, коли вичерпаноM SK2 свіжий пакет N автоматично завантажується
  • Стримуйовані кінцеві точки не вキャッシュі.

Приклади

  • Форма заголовка: X-реакціюM SK1формуМSK2 МСК3キャッシュМ СК4ID M СК5стрічкуMСК6statusM S К7стрілюМ S К8itemsMS К9[МSK0sku":"stringM SK2qty":0}]}

  • Форма тіла: { МSK0форма": M SK2 "$cacheM SK1 5, МSK0ID fakturи": МSK2стрічкаM SK3 МСК0customer": M SK2 ♫ ♫ "id ♫ МSK4 ♫ "itemsM SK1 [ МSK0 "skuM SK2 ♫ ♫ МSK3стрічка ♫ ", ♫ МSK0в цілому": M SK2 } }

  • Param питання (URLM SK1encoded): МSK0формаМСК1БМ СК2качаMСК3АМсК4СМSК5вживачіМЗК6А+МС К7Б+МЗСК8Б=МСЦК9ідМ ЗСК10А +МСČК11С=МЗЦК12назвиМШК13A+М СЦК14стрічкаМСП15ДМСС16Д+МСП17Д

Konfiguracja

  • MaxCachePerKey (int, domyślний 5): закриває число, яке запропонував

Примітки

  • Наказ "$cache" видаляється з форми перед тим, як відправити його до LLM
  • Якщо "$cacheM SK1 забувається або 0,, запит поводиться так само, як і до МSK3без кэшуванняMSC4загортання).
  • В 'язні варіанти зберігаються в-, в пам' яті на все життя aplikacji.

Тестування

Пакет інструментів тестування (NEWM SK1

найбільш зрозуміле.mockllmapiM SK1 Тестування - Помічник пакету NuGet, який робить тестування з mock API ще легшим

dotnet add package mostlylucid.mockllmapi.Testing

швидкий приклад:

using mostlylucid.mockllmapi.Testing;

// Create a configured HttpClient for testing
var client = HttpClientExtensions.CreateMockLlmClient(
    baseAddress: "http://localhost:5116",
    pathPattern: "/users",
    configure: endpoint => endpoint
        .WithShape(new { id = 0, name = "", email = "" })
        .WithCache(5)
        .WithError(404) // Simulate errors easily
);

// Use in your tests
var response = await client.GetAsync("/users");
var users = await response.Content.ReadFromJsonAsync<User[]>();

Ключові характеристики:

  • Флюентний API: Легка конфігурація з WithShape(), WithError(), WithCache(), і т.д.
  • Інтеграція HttpClient: Непошкоджується HttpClient і IHttpClientFactory
  • Багато кінцевих точок: Konfigurувати різні поведінки для різних шляхів
  • Симулювання помилки: Обладнання пробними помилками з різними кодами статусу
  • Поддержка потоку: Тест закінчків потоку SSE
  • Інгекція залежності: Сконструйований-владна для введених і обраних клієнтів

Приклади налаштування:

// Multiple endpoints with different configurations
var client = HttpClientExtensions.CreateMockLlmClient(
    "http://localhost:5116",
    configure: handler => handler
        .ForEndpoint("/users", config => config
            .WithShape(new { id = 0, name = "", email = "" })
            .WithCache(10))
        .ForEndpoint("/posts", config => config
            .WithShape(new { id = 0, title = "", content = "" })
            .WithStreaming()
            .WithSseMode("CompleteObjects"))
        .ForEndpoint("/error", config => config
            .WithError(500, "Internal server error"))
);

// Dependency Injection support
services.AddMockLlmHttpClient<IUserApiClient>(
    baseApiPath: "/api/mock",
    configure: handler => handler
        .ForEndpoint("/users", config => config.WithShape(...))
);

Як це працює: І MockLlmHttpHandler є DelegatingHandler що перехоплює HTTP-запити і автоматично застосовує вашу конфігурацію за допомогою параметрів запиту та заголовків перед відсиланням до mock API. Це означає, що ви можете використовувати HttpClient в ваших тестах, контролюючи поведінку макета шляхом декларації.

Подивіться Тестування пакету README для повної документації та прикладів.

Тестування HTTP-файлів

Використовуйте включне LLMApi.http файл з:

  • Визуальний студій / Client HTTP для Rider
  • Поширення клієнта VS Code REST
  • Будь-який HTTP-клиент

Тести на одиниці

Проект включає в себе комплексні unit tests:

# Run all tests
dotnet test

# Run with detailed output
dotnet test --verbosity detailed

Об 'єм тесту (228 тести МSK1 МSK2 пропускна спроможність

  • Читання тіла ( пустийM SK1 зміст JSON , формові тіла МSK3 завантаження файлів )
  • Формування тіла (одинові значенняM SK1 численні значення , особові символи МSK3
  • Мультичастинні дані форм (метадані файлівM SK1 змішані поля та файли)
  • Порятунок JSON (quotesM SK1 backslashes, newlinesMSC3 tabs , unicode
  • Видобуток змісту ( Формат OpenAI , складний встромлений JSON МSK2 подолання помилок
  • Ручна конструкція JSON МСК0формові даніМSK1ланцюги, вбудовані структуриM SK3
  • Видобуток форми (запрос парамM SK1 заголовок , поле тіла
  • Про prompt генерацію ( випадковість , включення форми МSK2 режими потоку M SK3
  • Запроси будівлю (температураМSK1модельM SK2повідомлення МSK3
  • Країни (неправильний JSONM SK1 бракуючих даних , особливих символів МSK3
  • Тести інтеграції (повний HTTP робочий процес, представлення бланківM SK2 завантаження файлів , глибинні шляхи МSK4

Новое в v2.3.0:

  • Тести на обробку бланку - МSK1 тести для аналізу форми тіла та конструювання JSON
  • Тести JsonHandling.cs - МSK1 тести для витіку від JSONM SK2 видобуток, і рифових корпусів
  • Тести на інтеграцію.cs - Інтеграційний тестний фреймворк для повного тестування кінцевого пункту HTTP

Подивіться Оцінка тесту для повної документації тесту та вимірювання потіку.

Архітектура

Подивіться Уявлення про архітектуру вище для діаграми високого рівня системи та опису компонентів.

Szczegółowий потік запитів

sequenceDiagram
    participant C as Client
    participant A as LLMApi
    participant H as AutoApiHelper
    participant O as Ollama
    participant M as llm-model

    C->>A: GET/POST/PUT/DELETE /api/auto/**
    A->>H: Extract context (method, path, body, shape)
    H->>H: Generate random seed + timestamp
    H->>H: Build prompt with randomness
    H-->>A: Prompt + temperature=1.2
    A->>O: POST /v1/chat/completions
    O->>M: Run inference
    M-->>O: Generated JSON
    O-->>A: Response
    A-->>C: JSON Response

Формове управління потоком

flowchart TD
    Start[Request Arrives] --> CheckQuery{Shape in<br/>Query Param?}
    CheckQuery -->|Yes| UseQuery[Use Query Shape]
    CheckQuery -->|No| CheckHeader{Shape in<br/>Header?}
    CheckHeader -->|Yes| UseHeader[Use Header Shape]
    CheckHeader -->|No| CheckBody{Shape in<br/>Body Field?}
    CheckBody -->|Yes| UseBody[Use Body Shape]
    CheckBody -->|No| NoShape[No Shape Constraint]

    UseQuery --> BuildPrompt[Build Prompt]
    UseHeader --> BuildPrompt
    UseBody --> BuildPrompt
    NoShape --> BuildPrompt

    BuildPrompt --> AddRandom[Add Random Seed<br/>+ Timestamp]
    AddRandom --> SendLLM[Send to LLM]

    style UseQuery fill:#4CAF50
    style UseHeader fill:#4CAF50
    style UseBody fill:#4CAF50
    style NoShape fill:#FFC107

Проекти:

  • mostlylucid.mockllmapi: NuGet пакетна бібліотека
  • LLMApi: Демо-програма
  • LLMApi.Tests: xUnit test suite МSK1 тести МSK2 100% pass rate

Чому використовувати переважноlucid.mockllmapi

  • швидке моделювання: Frontend розробка без очікування зворотнього
  • Полне забезпечення HTTP: JSONM SK1 формові тіла, завантаження файлів - всі типи контенту
  • Сpójні робочі потокиКонтексти API : підтримують реалістичні зв 'язки між багатьма процесами МSK1
  • Демо: Покажіть реальні потоки даних без кодування
  • Тестування: генерувати різні результати тесту для крайних випадків - або послідовні дані з контекстами
  • Пам 'ять-Безпека: Файлі завантажуються і відкидають.
  • Дизайн API: Експеримент з формами реагування перед застосуванням
  • Навчання: До прикладу інтеграції LLM в мінімальних інтерфейсах .NET
  • Нуль технічного обслуговування: Немає бази даних , немає штату МSK2 немає макетних файлів даних для підтримання
  • Гнучкий: Використовуйте будь-яку комбінацію RESTM SK1 GraphQL, SSEMSC3 SignalR , або OpenAPI
  • Produkція- ГотоваМSK0 228 тести МSK2 100% пропускна спроможність M SK4 повна документація

Побудова пакету NuGet

cd mostlylucid.mockllmapi
dotnet pack -c Release

Пакет буде в bin/Release/mostlylucid.mockllmapi.{version}.nupkg

Допомагаючи

Це зразок проекту, який демонструє LLM- mock APIs powered . Feel free to fork and customize

Ліцензія

Це безкоштовне та вільное програмне забезпечення, доступне в загальнодоступній домені. См. LICENSE для деталей або відвідувачів без ліцензії.org.

logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.