Πόσες φορές έχετε μπλοκαριστεί περιμένοντας το backend APIs να είναι έτοιμο; Ή ξόδεψε ώρες διατηρώντας εύθραυστα δεδομένα που γίνονται μπαγιάτικο τη στιγμή που οι απαιτήσεις αλλάζουν;
Εισάγετε mostlylucid.mockllmapi - μια πλατφόρμα κοροϊδίας ASP.NET Core που χρησιμοποιεί Large Language Models για να παράγει ρεαλιστικές, κατανοητές απαντήσεις API στη μύγα. Αντί για τη διατήρηση των εξαρτημάτων JSON, μπορείτε να πάρετε ευφυείς χλευασμούς που προσαρμόζονται στα αιτήματά σας και να θυμάστε κατάσταση σε όλες τις κλήσεις.
Τι υποστηρίζει: Κάθε πρωτόκολλο που χρειάζεστε - REST, GraphQL, gRPC, SignalR, Server-Sent Events, και OpenAPI. Σε αντίθεση με τα στατικά εξαρτήματα, οι απαντήσεις παράγονται δυναμικά με βάση το περιεχόμενο της αίτησής σας, καθιστώντας τις πολυβήμα ροές εργασίας και σύνθετα σενάρια δοκιμών ασήμαντα.
Μπορείτε να χρησιμοποιήσετε ως επί το πλείστον διαυγής.mockllmapi με τρεις τρόπους, ανάλογα με το πόσο απομονωμένο θέλετε το περιβάλλον dev σας να είναι:
Πλήρεςς οδηγός: API Contexts Documentation
Παραδοσιακή mock APIs έχουν ένα μοιραίο ελάττωμα: κάθε αίτηση είναι ανεξάρτητη. Πάρτε ένα χρήστη με την ταυτότητα 42, στη συνέχεια, να φέρει τις παραγγελίες τους, και θα πάρετε παραγγελίες για το ID χρήστη 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: "[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 βλέπει προηγούμενα αιτήματα στο ίδιο πλαίσιο και δημιουργεί συνεπή δεδομένα. Αυτή είναι η αλλαγή παιχνιδιού για πολλαπλές ροές εργασίας βημάτων.
Χαρακτηριστικά:
Κύκλος ζωής:
Συμπεριφορά:
Ασφάλεια:
Υpiοθέσει χρήση:
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, or 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": "[email protected]"}, ...]
Αυτό είναι! Έχετε τώρα ένα έργο mock API που παράγει ρεαλιστικά δεδομένα σε ζήτηση.
Εδώ είναι ο πραγματικός κωδικός αναζήτησης από αυτό το blog - αυτός είναι αμετάβλητος κωδικός πρόσθιας παραγωγής, δεν απαιτούνται προσαρμογές για το χλευασμό:
// 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 ακριβώς ποια δομή να δημιουργήσετε - το πιο ισχυρό χαρακτηριστικό για την ανάπτυξη του frontend.
# 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]" }
Τρεις τρόποι για να καθορίσετε το σχήμα:
?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 για να χειριστούμε πολύπλοκες, πολυ-βήμα ροές εργασίας. Θυμηθείτε το χαρακτηριστικό μνήμης πλαίσιο από νωρίτερα; Εδώ είναι πώς λάμπει σε πραγματικό κόσμο ασύγχρονες λειτουργίες.
Αυτό το παράδειγμα από την κυρίως διαυγή.net μεταφραστική υπηρεσία δείχνει πώς η LLM διατηρεί κατάσταση σε μια πλήρη async ροή εργασίας:
# 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, την εφαρμογή σε πραγματικό χρόνο χαρακτηριστικά με SignalR, ή τη συνεργασία με υπηρεσίες gRPC, ως επί το πλείστον διαυγή.mockllmapi έχει σας καλύπτει.
Υποστηριγμένα πρωτόκολλα:
Οδηγός: Τμήμα ΓράφημαQL
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}'
Οδηγός: Οδηγός επίδειξης Signer
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 Streaming
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
Πλήρεςς οδηγός: Εργαλεία & Δράσεις
Μερικές φορές χρειάζεστε μια υβριδική προσέγγιση - πραγματικά δεδομένα από την παραγωγή σε συνδυασμό με δημιουργημένα δεδομένα mock. Το pluggable σύστημα εργαλείων σας επιτρέπει να καλέσετε πραγματικά 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"
Το mockes fitches REAL δεδομένα χρηστών, στη συνέχεια, η LLM παράγει εντολές χρησιμοποιώντας αυτό. Εξαιρετικά χρήσιμο για ρεαλιστικές δοκιμές με υβριδικό mock/πραγματικές ροές εργασίας.
Αν χτίζετε με το ASP.NET Core, η ενσωμάτωση είναι απρόσκοπτη. Η ομορφιά αυτής της προσέγγισης είναι Μετατροπές μηδενικού κωδικού στις υπηρεσίες σας - απλά ρυθμίζετε 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 in your application - translation services, payment gates, external APIs, you name it.
Πριν βουτήξουμε σε προηγμένα χαρακτηριστικά, ας είμαστε σαφείς σχετικά με το πότε αυτό το εργαλείο έχει νόημα για τη ροή εργασίας σας.
Ιδανικό για:
Δεν είναι ιδανικό για:
Τώρα που ξέρετε πού ταιριάζει, ας εξερευνήσουμε τις προηγμένες δυνατότητες.
Αυτά τα χαρακτηριστικά είναι προαιρετικά - μπορείτε να πάρετε τεράστια αξία από τα βασικά μόνο. Αλλά όταν χρειάζεστε την παραγωγή-βαθμού ρεαλισμό σε κλίμακα, αυτά τα εργαλεία είναι εδώ.
# 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\"}"
Επακόλουθες αιτήσεις λαμβάνουν άμεση cached απαντήσεις.
Όλα τα παραπάνω χαρακτηριστικά είναι σπουδαία για την ανάπτυξη, αλλά τι γίνεται με τις αυτοματοποιημένες δοκιμές; Το συνοδευτικό πακέτο δοκιμών παρέχει ένα άπταιστο API που κάνει τις δοκιμές ενσωμάτωσης ένα αεράκι - ρυθμίστε την παρωδία συμπεριφορά δηλωτικά και αφήστε 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")
Streaming:
// 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 = "[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);
}
Η MockLlmHttpHandler ί ας DelegatingHandler ότι:
Αυτό σας επιτρέπει να χρησιμοποιήσετε ένα πραγματικό HttpClient στις δοκιμές σας ενώ ελέγχετε εύκολα την παρωδία API συμπεριφορά χωρίς τροποποίηση του κώδικα εφαρμογής σας.
Μετά τη συνεργασία με αυτό το εργαλείο σε πολλαπλά έργα, εδώ είναι τα πρότυπα που λειτουργούν καλύτερα:
ministral-3:3b (3B params, 32K context) - Δολοφόνος για τον JSON! Εξαιρετικά γρήγορος, πολύ ακριβής, minimal RAMllama3 (8B params, 8K context) - Καλύτερη ισορροπία ποιότητας και απόδοσηςmistral-nemo (12B params, 128K context) - Σύνθετα σχήματα και μαζικά σύνολα δεδομένωνgemma3:4b ή phi3 - Ελαφρύτερες εναλλακτικές λύσειςΗ ανάπτυξη του Frontend δεν χρειάζεται να περιμένει την υποστήριξη APIs. mostlylucid.mockllmapi σας δίνει:
Η διαφορά μεταξύ αυτού και του παραδοσιακού χλευασμού; Το frontend λειτουργεί ενάντια σε ρεαλιστικά, κατανοητά δεδομένα από την πρώτη μέρα.
Είτε φτιάχνεις ένα απλό blog είτε μια πολύπλοκη εφαρμογή επιχείρησης, θα ταξιδέψεις γρηγορότερα, θα δοκιμάσεις πιο διεξοδικά, και θα ταξιδέψεις με αυτοπεποίθηση.
Έτοιμος να ξεκινήσουμε;
docker compose up -d
Αυτό είναι.Δεν απαιτείται υποστήριξη.
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.