بناء واجهة واجهة قبل ان يكون المقياس مهيّئا : من دون مُثبّتات (العربية (Arabic))

بناء واجهة واجهة قبل ان يكون المقياس مهيّئا : من دون مُثبّتات

Saturday, 13 December 2025

//

14 minute read

أولاً

كم مرة تم منعك من انتظار أن تكون الواجهات الخلفية جاهزة؟ أو قضيت ساعات في الحفاظ على البيانات الوهمية المهولة التي تصبح متقادمة في اللحظة التي تتغير فيها المتطلبات؟

mostlylucid.mockllmapi - منصة المحاكاة الأساسية الجاهزة للإنتاج التي تستخدم نماذج لغوية كبيرة لتوليد ردود واقعية وواعية للسياق API على الذبابة. بدلاً من الحفاظ على تركيبات JSON، تحصل على سخريات ذكية تتكيف مع طلباتك وتذكر الدولة عبر المكالمات.

ما يدعمه: كل بروتوكول تحتاجه - REST, GraphQL, gRPC, SigaralR, Server-Sent events, and OpenAPI. على عكس التركيبات الثابتة، يتم توليد الردود بشكل ديناميكي بناء على سياق الطلب الخاص بك، مما يجعل تدفق العمل متعدد الخطوات وسيناريوهات الاختبار المعقدة تافهة.

GitHub الإصدار الرخصة: الرخصة

ثلاث طرق لاستخدامه

يمكنك استخدام أكثر lucid.mcculmapip في ثلاث طرق، اعتماداً على كيفية عزلك تريد بيئة التفريغ أن تكون:

  1. مجموعة عناصر مجموعة العناصر الأساسية - إضافة إلى مشاريعك القائمة
  2. **** - قابلة للتنفيذ (السحب من 1 ف-4، 1 ف-3، 1 خ م، 1 خ ع (رأ)، 1 خ ع (رأ)، 1 خ ع (رأ)، 1 خ ع (رأ)، 1 خ ع (رأ))
  3. حاوية منكر - لم يكن مطلوباً

الميزات القاتلة: الذاكرة

● الدليل الكامل: ألف ألف ألف - الوثائق

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

وتنظر الإدارة المحلية في الطلبات السابقة في نفس السياق وتولد بيانات متسقة. هذا هو تغيير اللعبة لتدفقات العمل متعددة الخطوات.

الميزات:

دورة الحياة:

  • الصلاحيـة بعد 15 دقيقة من العطل (قابل للذوبان)
  • كل طلب مرن المؤقت

السلوك السلوكي:

  • استخراج جميع الحقول من الاستجابات

السلامة:

  • تسريبات ذاكرة الصفر - تُنظّفُ السياقات نفسها بنفسها

حالات إساءة استعمال:

  • مثالي لـ CIC/CD - لا توجد دولة بين

بدءQQQQQCQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ

الخيار 1: نون المجموعة

dotnet add package mostlylucid.mockllmapi
// Program.cs
builder.Services.AddLLMockApi(builder.Configuration);
app.MapLLMockApi("/api/mock");

الخيار 2: الخيار 2: CL

# Download from https://github.com/scottgal/LLMApi/releases
llmock serve --port 5000

الخيار 3: المُرْكِل

● الدليل الكامل: دليل تنفيذ المُركر

git clone https://github.com/scottgal/LLMApi.git
cd LLMApi
docker compose up -d

الشروط المسبقة: LLL خلفية

ما تحتاج إليه من حاجة واحد من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]" }

ثلاثة سُبُل لِتَعَزِزَهُمْ:

  1. ?shape={...}
  2. ترويسة HTTTP - X-Response-Shape: {...} (موصى به)
  3. الهيئة المعنية بالطلب {"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 قد غطيت.

البروتوكولات المدعمة:

  • مـن
  • الرسم البياني(QL)
  • US CPC
  • الرسِل
  • الأحداث (SSS)
  • « باب بابي / مُسْحِر »

سنة

الدليل: قسم

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 SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS

الدليل: س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
};

OpenAPI/ Swager

● الدليل الكامل: الميزات

# 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 في طلبك - خدمات الترجمة، وبوابات الدفع، ومؤشرات أسعار الصرف القياسية الخارجية، كما تشاء.

الوقت إلى استخدام هذا

قبل أن نغوص في الميزات المتقدمة، دعونا نكون واضحين عندما تكون هذه الأداة منطقية لسير العمل الخاص بك.

الكمال:

  • يجري إعداد الواجهة قبل أن يُجد -توقّف عن عرقلة الفرق الخلفية
  • اختبار لسير سير العمل على خطوة مت - ذاكرة سياقية لمعالجة سيناريوهات معقدة
  • پ پ پ - تجربة مع أشكال الاستجابة قبل الالتزام
  • التنمية التي يجري تشغيلها - العمل بدون مُعتمدات الشبكة
  • **** - تحكّم الفشلات دون تكسير الإنتاج
  • خط الأنابيب في إطار CCC/CDCD - عدم وجود إعتمادات خارجية تعني سرعة، بناءات أكثر موثوقية

ليس مثالياً لـ:

  • **** - هذه أداة تطوير واختبار
  • بيانات الاختبار - استخدام التجهيزات التي تحتاج إليها عند الحاجة إلى إعادة المعالجة
  • اختبار عقد - التحقق دائماً من أسعار الفائدة الحقيقية لأسعار الإنتاج

الآن بما أنك تعرف أين يتناسب، دعونا نستكشف القدرات المتقدمة.

الميزات المتقدمة

هذه الميزات اختيارية - يمكنك الحصول على قيمة هائلة من الأساسيات وحدها. ولكن عندما تحتاج إلى واقعية الإنتاج - درجة الإنتاج من حيث الحجم، هذه الأدوات هنا.

مور

الدليل: مور

# 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\"}"

وتتلقى الطلبات اللاحقة ردوداً فورية.

مرافق الاختبار: معظمها ذات صبغة luluccid.mculmpip.

طربة: في معظم الأحيان clscid. mocklmpip.

فجميع الميزات المذكورة أعلاه عظيمة بالنسبة للتطوير، ولكن ماذا عن الاختبار الآلي؟ إن حزمة الاختبار المرافقة تقدم معدلاً قياسياً عالي الجودة يجعل من اختبارات التكامل نمطاً نمطياً من النسيم معبراً عنه وسمحاً له بذلك. 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 - أن:

  1. مخرج طلبات HHTTTTTP
  2. متطابقات طلبات م
  3. سِ
  4. يحيل الطلب المعدل إلى المفرد الفعلي LLL API

هذا يسمح لك إلى استخدام a حقيقي HttpClient في اختباراتك أثناء التحكم بسهوله في سلوك API دون تعديل رمز تطبيقك.

أفضل الممارسات

بعد العمل مع هذه الأداة عبر مشاريع متعددة، هنا الأنماط التي تعمل بشكل أفضل:

  1. أحرف استخدام لـ استخدامات لـ - كفالة اتساق الهويات والبيانات على امتداد العمليات المتعددة الخطوات
  2. **** - جعله متطابقاً مع مواجهات '%
  3. المازج و المقصّد و مع الأدوات - أفضل العالمين
  4. **** (انظر ( دليل النماذج بالنسبة للتفاصيل الكاملة:
    • الموصى بها بشأن خ خ خ خ خ خ خ خ: ministral-3:3b (البراهات من طراز BB، والسياق 32 كاف) قتل من أجل (جيسون)! سرعة قصوى، دقيقة جداً، وأدنى درجة من الدقة
    • نوع الإنتاج: llama3 أفضل توازن بين الجودة والأداء
    • درجة عالية من الجودة: mistral-nemo (12B params، 128K سياق) - الكيمياء المعقدة ومجموعات البيانات الضخمة
    • الموارد المنقولة: gemma3:4b أو phi3 - بدائل المناور

الوثائق الكاملة

  • ثانياً- الفقــرات فـد - المصدر والعرض
  • - كل إعدادات
  • دليل السياقات - ذاكرة عمق الغطس
  • - التكامل بين سياسات الاستثمار الخارجي
  • الميزات - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  • دعم Comment SPC دعم دعم - عوازل البروتوكول
  • خادم - نشر الحشوة
  • - تنصيب متعدد الوسائل
  • الحد - يُمَح حدود
  • مجموعة اختبار - المنافع العامة

ثالثاً - استنتاج

تطوير الواجهة الأمامية ليس من الضروري أن يَنتظرَ إلى الخلفيةِ APIs. mostlylucid.mockllmapi مما يعطيك ما يلي:

  • ذاكرة ذاكرة - بيانات متسقة عن الحالة عبر مسارات سير العمل المتعددة الخطوات
  • تحكّل -مخطط دقيق تعريفات مطابقة لأنواعك
  • الدعم المقدم في إطار البروتوكول العالمي - REST, GraphQL, gRPC, SIS, OpenAPI
  • الاختبار - خلط بيانات الإنتاج الحقيقي مع النماذج المولدة
  • مجموع الصيانة - لا توجد تجهيزات من JSSN لتحديثها عند تغير المتطلبات
  • محول تحت الاختبار - المقياس القياسي لمؤشرات الجودة لاختبارات التكامل

الفرق بين هذا والسخرية التقليدية؟ واجهتك تعمل ضد بيانات واقعية، وواعية للسياق من اليوم الأول. لا مزيد من "عملت مع بيانات وهمية ولكنها فشلت مع بيانات حقيقية" المفاجآت.

سواء كنت تبني مدونة بسيطة أو تطبيق مشروع معقّد، سوف تتكرّر أسرع، تختبر بشكل أكثر دقة، وتشحن بثقة.

هل أنت مستعد للبدء؟

docker compose up -d

طفح الكيل، لا حاجة للتراجع.

Finding related posts...
logo

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