كم مرة تم منعك من انتظار أن تكون الواجهات الخلفية جاهزة؟ أو قضيت ساعات في الحفاظ على البيانات الوهمية المهولة التي تصبح متقادمة في اللحظة التي تتغير فيها المتطلبات؟
mostlylucid.mockllmapi - منصة المحاكاة الأساسية الجاهزة للإنتاج التي تستخدم نماذج لغوية كبيرة لتوليد ردود واقعية وواعية للسياق API على الذبابة. بدلاً من الحفاظ على تركيبات JSON، تحصل على سخريات ذكية تتكيف مع طلباتك وتذكر الدولة عبر المكالمات.
ما يدعمه: كل بروتوكول تحتاجه - REST, GraphQL, gRPC, SigaralR, Server-Sent events, and OpenAPI. على عكس التركيبات الثابتة، يتم توليد الردود بشكل ديناميكي بناء على سياق الطلب الخاص بك، مما يجعل تدفق العمل متعدد الخطوات وسيناريوهات الاختبار المعقدة تافهة.
يمكنك استخدام أكثر lucid.mcculmapip في ثلاث طرق، اعتماداً على كيفية عزلك تريد بيئة التفريغ أن تكون:
● الدليل الكامل: ألف ألف ألف - الوثائق
APIs التقليدية لها عيب قاتل: كل طلب مستقل. احصل على مستخدم مع الهوية 42، ثم أحضر طلباتهم، وسوف تحصل على طلبات للمستخدم ID 99، لا اتساق.
السياقات مع الذاكرة المشتركة عبر الطلبات ذات الصلة:
// 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
وتنظر الإدارة المحلية في الطلبات السابقة في نفس السياق وتولد بيانات متسقة. هذا هو تغيير اللعبة لتدفقات العمل متعددة الخطوات.
الميزات:
دورة الحياة:
السلوك السلوكي:
السلامة:
حالات إساءة استعمال:
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
● الدليل الكامل: دليل تنفيذ المُركر
git clone https://github.com/scottgal/LLMApi.git
cd LLMApi
docker compose up -d
ما تحتاج إليه من حاجة واحد منOLAMA، OpenAI، أو LM ستوديو:
# Recommended: Ollama with ministral-3:3b (ultra-fast, accurate JSON generation)
ollama pull ministral-3:3b
انظر S انظر دليل النماذج لجميع التوصيات والمقارنات النموذجية.
مرة واحدة قيد التنفيذ، وقم بطلبك الأول:
curl http://localhost:5000/api/mock/users
# Response: [{"id": 1, "name": "Alice Johnson", "email": "[email protected]"}, ...]
هذا كل شيء! لديك الآن نموذج مُحتذى يعمل على توليد بيانات واقعية عند الطلب.
هذا هو رمز البحث الفعلي من هذه المدونة هذا هو بدون تغيير إنتاج شفرة الجبهة الأماميةلا حاجة إلى تعديلات للسخرية:
// 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": "[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 للتعامل مع تدفقات عمل معقدة ومتعددة الخطوات. تذكر خاصية ذاكرة السياق من قبل؟ هنا كيف تشرق في عمليات متزامنة في العالم الحقيقي.
هذا المثال من خدمة الترجمة في معظم الأحيان Llucid.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، تنفيذ خصائص في الوقت الحقيقي مع الإشارة، أو العمل مع خدمات gRPC، في الغالب لولوسيد. mockelmapi قد غطيت.
البروتوكولات المدعمة:
الدليل: قسم
curl -X POST http://localhost:5000/api/mock/graphql \
-d '{"query": "{ users { id name email } }"}'
الاستعلام هو الشكل - لا حاجة إلى مخطط منفصل.
● الدليل الكامل: دعم Comment SPC دعم دعم
# 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");
مثالي لـ "ماكينات" لـ "ماكينات"
الدليل: سSSSSSSS
const eventSource = new EventSource('/api/mock/stream/users');
eventSource.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log('Token:', data.chunk); // Progressive generation
};
● الدليل الكامل: الميزات
# 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
في بعض الأحيان تحتاج إلى نهج هجين - بيانات حقيقية من الإنتاج مع توليد البيانات الوهمية. نظام الأدوات القابلة للتشبيك يسمح لك بتسميتها APIs الفعلية خلال الجيل الوهمي، مما يخلق سيناريوهات اختبار واقعية بشكل لا يصدق.
{
"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 (أ) أن تشير إلى الخدعة أثناء عملية التطوير وإلى الرقم القياسي الحقيقي لمؤشرات الإنتاج في الإنتاج.
// 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);
}
);
التكيفات. التنمية.
{
"TranslationService": {
"BaseUrl": "http://localhost:5000" // Mock
}
}
مُؤَدّيات:
{
"TranslationService": {
"BaseUrl": "https://api.production.com" // Real
}
}
هذا النمط يعمل لـ أي HttpClient في طلبك - خدمات الترجمة، وبوابات الدفع، ومؤشرات أسعار الصرف القياسية الخارجية، كما تشاء.
قبل أن نغوص في الميزات المتقدمة، دعونا نكون واضحين عندما تكون هذه الأداة منطقية لسير العمل الخاص بك.
الكمال:
ليس مثالياً لـ:
الآن بما أنك تعرف أين يتناسب، دعونا نستكشف القدرات المتقدمة.
هذه الميزات اختيارية - يمكنك الحصول على قيمة هائلة من الأساسيات وحدها. ولكن عندما تحتاج إلى واقعية الإنتاج - درجة الإنتاج من حيث الحجم، هذه الأدوات هنا.
الدليل: مور
# 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"
يدعم جميع رموز 4x2 و 5x2.
# 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 = "[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 - أن:
هذا يسمح لك إلى استخدام a حقيقي HttpClient في اختباراتك أثناء التحكم بسهوله في سلوك API دون تعديل رمز تطبيقك.
بعد العمل مع هذه الأداة عبر مشاريع متعددة، هنا الأنماط التي تعمل بشكل أفضل:
ministral-3:3b (البراهات من طراز BB، والسياق 32 كاف) قتل من أجل (جيسون)! سرعة قصوى، دقيقة جداً، وأدنى درجة من الدقةllama3 أفضل توازن بين الجودة والأداءmistral-nemo (12B params، 128K سياق) - الكيمياء المعقدة ومجموعات البيانات الضخمةgemma3:4b أو phi3 - بدائل المناورتطوير الواجهة الأمامية ليس من الضروري أن يَنتظرَ إلى الخلفيةِ APIs. 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.