Скільки разів вам заблокували очікування, що API сервера буде готовим, або скільки годин ви витратили на збереження крихких даних, що стають непотрібними, коли змінюються вимоги?
Ввести mostlylucid.mockllmapi - платформу, готову до виробництва, ASP. NET, яка використовує моделі Великої мови для створення реалістичних, контекстно обізнаних відповідей API на льоту. Замість підтримки фіксацій JSON, ви отримуєте розумні висміювання, які адаптуються до ваших запитів і запам' ятають стан через виклики.
Що вона підтримує: Будь- який з потрібних протоколів - REST, GraphQL, gRPC, SpectR, Server- Sent і OpenAPI. На відміну від статичних фіксацій, відповіді створюються динамічно на основі контексту вашого запиту, створення багатокрокових робочих місць і комплексних сценаріїв перевірки.
Ви можете використовувати threelucid. mockllmapi у три способи, залежно від того, наскільки ізольованим має бути середовище dev:
Е-Е-Е-Е-Е-Е-Е-Е-Е-Е-Е-Е-Е-Е-Е-Е-Е-Е: Документація контексту API
Традиційний API- інтерфейс має фатальний недолік: кожен запит є незалежним. Звантажте користувача з ідентифікатором 42, а потім отримайте їх замовлення, і ви отримаєте замовлення для користувача 99. Без відповідності.
Контексти API Вирішіть це за допомогою спільної пам' яті між пов' язаними запитами:
// Request 1: Get a user
// Note: 'context' is a simple query parameter - no cookies or sessions needed
fetch('/api/users/123?context=checkout-session')
// Response: { id: 42, name: "Alice Smith", email: "alice@example.com" }
// Request 2: Get orders (same context parameter)
fetch('/api/orders?userId=42&context=checkout-session')
// Response: { userId: 42, customerName: "Alice Smith", items: [...] }
// Perfect! Same user, consistent data
LLM бачить попередні запити у тому ж контексті і створює послідовні дані. Це засіб зміни гри для декількох кроків роботи.
Можливості:
Життєвий цикл:
Поведінка:
Безпека:
Випадки використання:
dotnet add package mostlylucid.mockllmapi
// Program.cs
builder.Services.AddLLMockApi(builder.Configuration);
app.MapLLMockApi("/api/mock");
# Download from https://github.com/scottgal/LLMApi/releases
llmock serve --port 5000
Е-е-е-е-е-е-е: Довідник з впровадження Docker
git clone https://github.com/scottgal/LLMApi.git
cd LLMApi
docker compose up -d
Вам потрібно один зOllama, OpenAI, або LM Studio:
# Recommended: Ollama with ministral-3:3b (ultra-fast, accurate JSON generation)
ollama pull ministral-3:3b
Див. Довідник з моделей Ollama за всі зразкові рекомендації та порівняння.
Після запуску зробіть свій перший запит:
curl http://localhost:5000/api/mock/users
# Response: [{"id": 1, "name": "Alice Johnson", "email": "alice@example.com"}, ...]
Тепер у вас є уявний API, який створює реальні дані за попитом.
Ось справжній пошуковий код з цього блогу - цей код є незмінним графічним інтерфейсом, не потрібно адаптацій для висміювання:
// typeahead.js from mostlylucid.net
export function typeahead() {
return {
query: '',
results: [],
search() {
fetch(`/api/search/${encodeURIComponent(this.query)}`)
.then(response => response.json())
.then(data => { this.results = data; });
}
}
}
Посміхнись:
# Using CLI
llmock serve --port 5000
# Query returns contextual results
curl http://localhost:5000/api/search/markdown
# LLM generates blog posts about Markdown
curl http://localhost:5000/api/search/docker
# LLM generates blog posts about Docker
Кожна відповідь є унікальною і реалістичною, пристосовуючись до цього запиту.
За межами лише створення випадкових даних, вам часто потрібен точний контроль над структурою JSON. Керування формою надає вам змогу вказати LLM саме ту структуру, яку слід створити - найпотужнішу можливість для розробки графічної оболонки.
# Without shape - random structure
curl http://localhost:5000/api/mock/users
# Response: { "userId": 1, "fullName": "Alice" }
# With shape - you control it
curl "http://localhost:5000/api/mock/users" \
-H 'X-Response-Shape: {"id":0,"name":"string","email":"string"}'
# Response: { "id": 1, "name": "Alice", "email": "alice@example.com" }
Три способи визначення форми:
?shape={...}X-Response-Shape: {...} (рекомендовано){"shape": {...}}const shape = {
company: {
id: 0,
name: "string",
employees: [{
id: 0,
firstName: "string",
department: { id: 0, name: "string" },
projects: [{ id: 0, title: "string" }]
}]
}
};
fetch('/api/mock/company', {
headers: { 'X-Response-Shape': JSON.stringify(shape) }
});
interface User {
id: number;
name: string;
email: string;
}
const USER_SHAPE: Partial<User> = { id: 0, name: "", email: "" };
// Shape becomes your type definition AND mock schema!
Тепер давайте поєднаємо керування формами з контекстами API для роботи зі складними, багатокроковими роботами. Пам' ятайте, що елемент пам' яті було згадано раніше? Ось як він сяє у асинхронних операціях у реальному світі.
Цей приклад служби перекладу qualsecid. net показує, як LLM зберігає стан через повний робочий потік асинхронів:
# Step 1: Start translation
curl -X POST http://localhost:5000/api/translate/start?context=translate-session \
-d '{"language": "es", "markdown": "# Hello World"}'
# Response: { "taskId": "abc-123", "status": "processing" }
# Step 2: Check status (LLM remembers the task)
curl http://localhost:5000/api/translate/status/abc-123?context=translate-session
# Response: { "taskId": "abc-123", "status": "complete" }
# Step 3: Get result (same taskId!)
curl http://localhost:5000/api/translate/result/abc-123?context=translate-session
# Response: { "taskId": "abc-123", "translatedText": "# Hola Mundo" }
Зверніть увагу, як taskId по всему просьбе соответствуется. Контекст робить це можливим.
Поки що ми зосередилися на REST, але сучасним програмам потрібно ще щось: чи будуєте ви за допомогою GraphQL, чи втілюєте можливості реального часу за допомогою SNERR, чи працюєте з службами gRPC, у більшості випадків thumlucid.mockllmapi описано.
Підтримувані протоколи:
А.Б.: Розділ GraphQL
curl -X POST http://localhost:5000/api/mock/graphql \
-d '{"query": "{ users { id name email } }"}'
Запит - це форма - не потрібна окрема схема.
Е-е-е-е-е-е-е: Підтримка gRPC
# Upload .proto file
curl -X POST http://localhost:5116/api/grpc-protos \
--data-binary "@user_service.proto"
# Call via JSON or binary Protobuf
curl -X POST http://localhost:5116/api/grpc/userservice/UserService/GetUser \
-d '{"user_id": 123}'
const connection = new signalR.HubConnectionBuilder()
.withUrl("/hub/mock")
.build();
connection.on("DataUpdate", (message) => {
console.log(message.data); // Live generated data
});
await connection.start();
await connection.invoke("SubscribeToContext", "stock-prices");
Ідеально для створення прототипів панелі приладів.
А.Б.: Режими потоку SSE
const eventSource = new EventSource('/api/mock/stream/users');
eventSource.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log('Token:', data.chunk); // Progressive generation
};
Е-е-е-е-е-е-е: Можливості OpenAPI
# CLI: Load any OpenAPI spec
llmock serve --spec https://petstore3.swagger.io/api/v3/openapi.json
# All endpoints become live mocks automatically
curl http://localhost:5000/petstore/pet/123
Е-е-е-е-е-е-е: Інструменти & Дії
Іноді вам потрібен гібридний підхід - справжні дані з виробництва у поєднанні з створеними імітуючими даними. Система інструментів, які можна налаштувати, надає вам змогу називати справжні API під час створення висміювання, створюючи неймовірно реалістичні тестові сценарії.
{
"Tools": [{
"Name": "getUserData",
"Type": "http",
"HttpConfig": {
"Endpoint": "https://api.production.com/users/{userId}",
"Headers": { "Authorization": "Bearer ${PROD_API_KEY}" }
}
}]
}
curl "http://localhost:5000/api/mock/orders?useTool=getUserData&userId=123"
За допомогою висмішки можна отримувати справжні дані про користувача, а потім LLM створює замовлення за його допомогою. Надзвичайно корисно для реалістичних тестувань з гібридними та реальними роботами.
Якщо ви будуєте за допомогою ядра ASP.NET, інтеграція буде безперешкодно. змінено нульовий код на ваші служби - ви просто налаштовуєте HttpClient на глузуванні під час розробки і в реальному API у виробництві.
// Real code from mostlylucid.net
builder.Services.AddHttpClient<IMarkdownTranslatorService, MarkdownTranslatorService>(
client => {
var baseUrl = builder.Configuration["TranslationService:BaseUrl"]
?? "http://localhost:5000"; // Mock during dev
client.BaseAddress = new Uri(baseUrl);
}
);
appsettings.Development.json:
{
"TranslationService": {
"BaseUrl": "http://localhost:5000" // Mock
}
}
appsettings.Production.json:
{
"TranslationService": {
"BaseUrl": "https://api.production.com" // Real
}
}
Цей шаблон працює для будь- яких HttpClient у службах перекладу вашої програми, шлюзи сплат, зовнішні API, ви їх називаєте.
Перш ніж ми поринемо в додаткові можливості, давайте розглянемо, коли цей інструмент має сенс для Вашого робочого процесу.
Досконало для:
Не ідеальна для:
Тепер, коли ви знаєте, де вона підходить, давайте дослідимо додаткові можливості.
Ці можливості не є обов' язковими - ви можете отримати величезне значення лише з основ, але якщо вам потрібен реалізм виробничого класу у масштабі, ці інструменти є тут.
А.Б.: Декілька серверів LLM
# Fast for dev
curl http://localhost:5000/api/mock/users
# High quality for demos
curl "http://localhost:5000/api/mock/users?backend=quality"
# Cloud AI for production-like
curl "http://localhost:5000/api/mock/users?backend=openai"
Перевірте, як ваша програма керує обмеженнями швидкості:
{
"EnableRateLimiting": true,
"RateLimitDelayRange": "500-2000"
}
# Test 429 rate limiting
curl "http://localhost:5000/api/mock/users?error=429&errorMessage=Rate%20limit%20exceeded"
# Test 503 unavailable
curl "http://localhost:5000/api/mock/users?error=503"
Підтримує всі 4xx і 5xx- коди.
# Generate and cache 10 variants
curl "http://localhost:5000/api/mock/users?shape={\"$cache\":10,\"id\":0,\"name\":\"string\"}"
Наступні запити отримують миттєве кешування відповідей.
А що сказати про автоматичні випробування? HttpClient зробити решту.
dotnet add package mostlylucid.mockllmapi.Testing
using mostlylucid.mockllmapi.Testing;
// Create a client with a single endpoint configuration
var client = HttpClientExtensions.CreateMockLlmClient(
baseAddress: "http://localhost:5116",
pathPattern: "/users",
configure: endpoint => endpoint
.WithShape(new { id = 0, name = "", email = "" })
.WithCache(5)
);
// Make requests - configuration is automatically applied
var response = await client.GetAsync("/users");
var users = await response.Content.ReadFromJsonAsync<User[]>();
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 = "", authorId = 0 })
.WithCache(20))
.ForEndpoint("/error", config => config
.WithError(404, "Resource not found"))
);
// Each endpoint automatically uses its configuration
var usersResponse = await client.GetAsync("/users");
var postsResponse = await client.GetAsync("/posts");
var errorResponse = await client.GetAsync("/error"); // Returns 404
Налаштування форми:
// Using anonymous objects
.WithShape(new { id = 0, name = "", active = true })
// Using JSON strings
.WithShape("{ \"id\": 0, \"name\": \"\", \"tags\": [] }")
// Complex nested structures
.WithShape(new
{
user = new { id = 0, name = "" },
posts = new[] { new { id = 0, title = "" } }
})
Симуляція помилки:
// Simple error
.WithError(404)
// With custom message
.WithError(404, "User not found")
// With details
.WithError(422, "Validation failed", "Email address is invalid")
Потік:
// Enable streaming with token-by-token output
.WithStreaming()
.WithSseMode("LlmTokens")
// Stream complete objects
.WithStreaming()
.WithSseMode("CompleteObjects")
// Stream array items individually
.WithStreaming()
.WithSseMode("ArrayItems")
Типований клієнт:
services.AddMockLlmHttpClient<IUserApiClient>(
baseApiPath: "/api/mock",
configure: handler => handler
.ForEndpoint("/users", config => config
.WithShape(new { id = 0, name = "", email = "" }))
);
Клієнт з назвою:
services.AddMockLlmHttpClient(
name: "MockApi",
baseApiPath: "/api/mock",
configure: handler => handler
.ForEndpoint("/data", config => config
.WithShape(new { value = 0 }))
);
// Usage
var client = httpClientFactory.CreateClient("MockApi");
[Fact]
public async Task Should_Handle_User_Creation()
{
// Arrange
var client = HttpClientExtensions.CreateMockLlmClient(
"http://localhost:5116",
"/users",
config => config
.WithMethod("POST")
.WithShape(new { id = 0, name = "", email = "", createdAt = "" })
);
// Act
var newUser = new { name = "John Doe", email = "john@example.com" };
var response = await client.PostAsJsonAsync("/users", newUser);
// Assert
response.EnsureSuccessStatusCode();
var created = await response.Content.ReadFromJsonAsync<User>();
Assert.NotNull(created);
Assert.NotEqual(0, created.Id);
}
[Fact]
public async Task Should_Handle_Not_Found_Error()
{
// Arrange
var client = HttpClientExtensions.CreateMockLlmClient(
"http://localhost:5116",
"/users/999",
config => config.WithError(404, "User not found")
);
// Act
var response = await client.GetAsync("/users/999");
// Assert
Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
}
The MockLlmHttpHandler є a DelegatingHandler те:
Це надасть вам змогу використовувати реалізацію HttpClient у ваших тестах з полегшенням керування поведінкою імітування API без зміни коду програми.
Після роботи з цим інструментом на основі декількох проектів, ось шаблони, які найкраще працюють:
ministral-3:3b (3B парамс, 32K контекст) - КІЛЛЕР за JSON! Ультра- швидкий, дуже точний, мінімальний об' єм пам' ятіllama3 (8B параметри, контекст 8K) - найкращий баланс якості і швидкодіїmistral-nemo (12Б параметри, контекст 128K) - складні схеми і масивні набори данихgemma3:4b або phi3 - Освітліші альтернативиРозробка з графічним інтерфейсом не зобов' язана чекати на API сервера. mostlylucid.mockllmapi дає вам:
Різниця між цим і традиційним висміюванням? Ваша оболонка працює проти реалістичних, контекстно обізнаних даних з першого дня. Більше " він не працював з висмієними даними, але зазнав невдачі з реальними даними ."
Без різниці, чи ви створюєте простий блог, чи комплексну програму підприємництва, ви будете повторювати швидше, більш ретельно перевіряти і доправляти з довір'ям.
Готові починати?
docker compose up -d
Не потрібен сервер.
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.