Att bygga en Frontend Innan API är redo: Utan ömtång
Inleiding
Hur många gånger har du varit blockerad och väntat på att backend APIs är redo?
Kom in mostlylucid.mockllmapi - en produktion, - färdiga ASP, ., NET Core mocking-plattform som använder stora språkmodeller för att generera realistiska, kontextuellt medvetna API-responser, flyktig, ., istället för att underhålla JSON-installationer, ,, får du intelligenta mocker som anpassar sig till dina begäran och minns tillståndet under samtalen.
Vad det supporterar: Varenda protocol du behöver - REST , GraphQL, gRPCMska3 SignalRM Ska4 ServerMske5 skickade händelser, och OpenAPIMskan7 Till skillnad från statiska fixturerMksK8 genereras reaktionerna dynamiskt baserat på din begäransuppsättningMnsK9 gör multi- -Workflows och komplexa testscenarier triviala
Projekt länkar
- Repository: https://github.com/scottgalM SK3~LLMApi
- Releases: https://github.com/scottgalMST3LLMApiMst4~utsläpp
- Kompanionspaket: mestlucid.mockllmapi.Testing - Testverktyg med flytande HttpClient integration
Tre sätt att använda det
Du kan använda mestadelslucid.mockllmapi på tre sätt
- ASP.NET Core NuGet paket - Lägg till dina existerande projekt
- Enkel CLI-verktyg - Cross utsläpp)
- Dockercontainer - Noll installering krävs
Killer-fenskapen: Kontextminnet
📖 Den fulla manualen : API Kontext Dokumentation
Traditionella modellera API har en dödlig brist.
API Kontexter löser detta med gemensam minne genom olika insatser:
// 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: "[email protected]" }
// 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 ser tidigare begäran i samma kontext och genererar konsekventa data. Det här är spelet
Features:
Livscykel:
- Automatiskt utgångsdatum efter 15 minuter av inactivitet ( konfigurierbart)
- Varje begäran uppdaterar timern
Behavior:
- Intelligent extraktion av ALLE fält från reaktioner
säkerhet:
- Noll minnesdröjningar - kontexter rensar sig själva
Använd fall:
- Perfekt för CI/CD - inga mellanläge
Vinnig Start
Option 1: NuGet Paket
dotnet add package mostlylucid.mockllmapi
// Program.cs
builder.Services.AddLLMockApi(builder.Configuration);
app.MapLLMockApi("/api/mock");
Option 2: CLI-verktyg
# Download from https://github.com/scottgal/LLMApi/releases
llmock serve --port 5000
Option 3: Docker
📖 Den kompletta manualen Docker-användningsguidet
git clone https://github.com/scottgal/LLMApi.git
cd LLMApi
docker compose up -d
Voraussetzungen: LLM Backend
Du behöver en av: Ollama, OpenAI
# Recommended: Ollama with ministral-3:3b (ultra-fast, accurate JSON generation)
ollama pull ministral-3:3b
Se Ollama Modellführer för alla modellbeveelningar och jämförelser.
Försök det omedelbart
När den körs, gör din första begäran.
curl http://localhost:5000/api/mock/users
# Response: [{"id": 1, "name": "Alice Johnson", "email": "[email protected]"}, ...]
Det är det. Du har nu en fungerande modell-API som genererar realistiska data på beställning.
Ett verkligt exempel: söka från mostlylucid.net
Här är den faktiska sökkoden från den här bloggen - det här är oföränderlig produktionsfrontend kod, inga anpassningar behöver göras för modellen :
// 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; });
}
}
}
Skämt det:
# 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
Varje respons är unik och realistiskt, anpassat till frågan.
Formkontroll: Definiera ditt schema
Förutom att bara generera slumpmässiga data
Grundform
# 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": "[email protected]" }
Tre sätt att definiera formen:
- Fråga-parameter -
?shape={...} - HTTP-Header -
X-Response-Shape: {...}(kommande - Benötningsorgan -
{"shape": {...}}
Nested form
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) }
});
TypScript-lignering
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!
Multi-Step-Workflows med sammanhang
Låt oss nu kombinera formkontroll med API-kontexter för att hantera komplexa arbetsflöden.
Det här exemplet från mestlucid.net's översättningsservice visar hur LLM upprätthåller tillståndet över en komplett async arbetsprocess
# 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" }
Notera hur taskId är konsekvent över alla begäran. Kontext gör detta möjligt.
Förutom REST: Alla protokoller
Än så länge har vi fokuserat på REST, men moderna tillämpningar behöver mer.., oavsett om du bygger med GraphQL, implementerar riktiga, reala, -, signaltidsfunktioner, eller jobbar med gRPC.
Ondersteunde protokoller:
- ✓ REST
- ✓ GraphQL
- ✓ gRPC
- ✓ SignalR
- ✓ Server
- ✓ OpenAPI / Swagger
GraphQL
📖 Guide GraphQL-sektionen
curl -X POST http://localhost:5000/api/mock/graphql \
-d '{"query": "{ users { id name email } }"}'
Frågan är formen - inget separat schema behövs.
gRPC
📖 Den kompletta manualen gRPC Support
# 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}'
SignalR Real-Time
📖 Guide SignalR Demo Guide
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");
Perfekt för brädansprototypen.
Server-Sent händelser (SSE)
📖 Guide SSE Streaming-modi
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 / Swagger
📖 Den kompletta manualen OpenAPI: s egenskaper
# 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
Pluggable Tools: Mix Real & Mock Data
📖 Den kompletta manualen verktyg & Aksier
Ibland behöver man ett hybridt angreppssätt - verkliga data från produktion kombinerade med genererade modelldata . Det pluggbara verktygssystemet låter dig kalla riktiga API-gränssnitt under modellproduktionen M SK2 skapa otroligt realistiska testscenarier .
{
"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"
Den modellen tar fram REAL-användarens data, sedan genererar LLM inställningar genom att använda den. Extremt användbar för realistiska tester med hybrid mock
ASP.NET Core Integration
Om du bygger med ASP, ., NET Core och , så är integreringen genomkomlig. noll kodförändringar till dina tjänster - så konfigurerar du helt enkelt HttpClient att peka på modellen under utveckling och på den verkliga API i produktion
// 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.jsonM SK2
{
"TranslationService": {
"BaseUrl": "http://localhost:5000" // Mock
}
}
appsettings.Produktion.jsonM SK2
{
"TranslationService": {
"BaseUrl": "https://api.production.com" // Real
}
}
Detta mönster fungerar för alla HttpClient i din applikation - översättningstjänster , betalningsportaaler, externa APIsM SK3 vad du kallar det för
När man ska använda detta
Innan vi dyker in i avancerade egenskaper, låt oss tala klar om när det här verktyget är användbart för ditt arbetsflöde.
Perfekt för:
- Frontend utveckling innan backend existerar - Stopp blockering på backendteams
- Multi-step testning av arbetsflödet - Kontextminnet hanterar komplexa scenarier
- API-prototyper - Försök reagerande former innan du börjar
- Offline utveckling - Jobba utan nätverks beroenden
- Fehler i scenariotestning - simulera misslyckanden utan att bryta produktionen
- CI/CD-rör - Inga externa beroende betyder snabbare , mer tillförlitliga byggningar
Inte idealt för:
- Tillverkningsmiljöer - Detta är ett utvecklings- och testverktyg
- Deterministiska tester - Använd fixeringar när du behöver exakt återskapbarhet
- Contrattestning - Validatera alltid mot riktiga APIs för produktionskontrakt
Nu när du vet var den passar, låter , utforska de avancerade möjligheterna.
avancerade egenskaper
De här egenskaperna är optionella. - du kan få enorm värde från grunden ens.
Flera LLM backends
📖 Guide Flera LLM backends
# 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"
Simulationen med begränsade hastigheter
Testa hur din app hanterar hastighetsgränser:
{
"EnableRateLimiting": true,
"RateLimitDelayRange": "500-2000"
}
Fehlersimulation
# 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"
Ondersteuner alla 4xx och 5xx koder
Response Caching
# Generate and cache 10 variants
curl "http://localhost:5000/api/mock/users?shape={\"$cache\":10,\"id\":0,\"name\":\"string\"}"
De efterföljande begäran får genast cached svar.
Testverktyg: mest uppenbart .mockllmapi.Testing
📖 Paket mestlucid.mockllmapi.Testing
Alla de här egenskaperna är fantastiska för utvecklingen, men vad sägs om automatiserad tester? Samarbetspaketet för tester ger en flytande API som gör integreringstest till en breeze M SK2 konfigurera modellbeteende deklarativt och låta HttpClient gör resten.
Installation
dotnet add package mostlylucid.mockllmapi.Testing
Grundanvändning
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[]>();
Flera slutpunkter
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
Konfigurationsoptioner
Form konfiguration:
// 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 = "" } }
})
Fehlersimulation:
// Simple error
.WithError(404)
// With custom message
.WithError(404, "User not found")
// With details
.WithError(422, "Validation failed", "Email address is invalid")
Streaming:
// Enable streaming with token-by-token output
.WithStreaming()
.WithSseMode("LlmTokens")
// Stream complete objects
.WithStreaming()
.WithSseMode("CompleteObjects")
// Stream array items individually
.WithStreaming()
.WithSseMode("ArrayItems")
beroende injection
Inskriven klient:
services.AddMockLlmHttpClient<IUserApiClient>(
baseApiPath: "/api/mock",
configure: handler => handler
.ForEndpoint("/users", config => config
.WithShape(new { id = 0, name = "", email = "" }))
);
Namerad klient:
services.AddMockLlmHttpClient(
name: "MockApi",
baseApiPath: "/api/mock",
configure: handler => handler
.ForEndpoint("/data", config => config
.WithShape(new { value = 0 }))
);
// Usage
var client = httpClientFactory.CreateClient("MockApi");
Integrationstest exempel
[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 = "[email protected]" };
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);
}
Hur det fungerar
Den MockLlmHttpHandler är en DelegatingHandler att:
- Intercepterar utgående HTTP- begäran
- matchar begäran mot konfigurerade slutpunktsmönster
- Injicerar modellkonfiguration via sökparameter och HTTP-Header
- Framför den ändrade begäran till den faktiska modell LLM API
Det här låter dig använda en riktig HttpClient i dina tester samtidigt som du enkelt kontrollerar modell API-beteende utan att ändra din applikationskod.
Vad man bör göra & Tips
Efter att ha arbetat med det här verktyget i flera projekt
- Använd alltid kontexter för arbetsflöden - Bekämpar konsekventa IDs och data över flera operationer
- Använd form för typsäkerhet - gör att det matchar dina TypeScript gränssnitt
- Blanda verkliga och modelldata med verktyg - Den bästa av båda världarna
- Välj den rätta modellen (se Ollama Modellführer för detaljer):
- REKOMMEND för dev:
ministral-3:3b(3B-paramer, 32K-kontext KILLER för JSON! Ultra-fast, hög noggrannM SK2 minimal RAM - produktion-liknande:
llama3(8B-paramer, 8K-kontext - Hög kvalitet:
mistral-nemo(12B-paramer, 128K-kontextM SK3 | | Complexa schema och massiva datasamlingar - Ressourcen- begränsad:
gemma3:4bellerphi3- Litere alternativ
- REKOMMEND för dev:
Dokumentation
- Den stora byggnaden - källa och överblick
- Konfigurationsreferens - Alla inställningar
- API Kontextführer - Kontextminnet djupdykning
- verktyg & Aksier - Extern API-integration
- OpenAPI: s egenskaper - Spec
- gRPC Support - Protokollbuffer
- Dockerführer - Beläggning av behållare
- Flera bakprogram - Multi
- Limitering av hastighet - simulera gränser
- Testpaket - HttpClient
Slutsatsen
Frontend utveckling behöver inte vänta på backend APIs mostlylucid.mockllmapi ger dig:
- Kontextminne - konsekventa , uppriktiga data över flera vaiheprocesser
- Formkontroll - Precisa schemadefinitioner som matchar dina typer
- Den universella protocoltillgången - REST, GraphQL, gRPCM SK3 SignalRMska4 SSEM Ska5 OpenAPI
- Hybridtestning - Blanda verkliga produktionsdata med skapade modeller
- Noll underhåll - Inga JSON-installationer som kan uppdateras när krav ändras
- Testande verktyg - Fluent API för integrationstest
Skillnaden mellan det här och den traditionella mockingen? Frontend fungerar mot realistiska data, kontextuellt medvetna data från dag ettM SK2 Ingen mer Mska3 det fungerade med modelldata men misslyckades med riktiga data Mska4 överraskningarMske5
Vare sig du bygger en enkel blogg eller en komplicerad företagsapplikation, så kommer du att iterera snabbare, testa mer noggrant, , och leverera på ett säkert sätt.
Klar att börja?
docker compose up -d
Det där' det är det . Ingen baksida krävs