# Χτίζοντας ένα μέτωπο πριν από την API είναι έτοιμος: Χωρίς Μπρίτλ Fixtures

<datetime class="hidden">2025-12-13T14:30</datetime>

<!--category-- ASP.NET Core, LLM, API Development, Testing, Mock APIs -->
## Εισαγωγή

Πόσες φορές έχετε μπλοκαριστεί περιμένοντας το backend APIs να είναι έτοιμο; Ή ξόδεψε ώρες διατηρώντας εύθραυστα δεδομένα που γίνονται μπαγιάτικο τη στιγμή που οι απαιτήσεις αλλάζουν;

Εισάγετε `mostlylucid.mockllmapi` - μια πλατφόρμα κοροϊδίας ASP.NET Core που χρησιμοποιεί Large Language Models για να παράγει ρεαλιστικές, κατανοητές απαντήσεις API στη μύγα. Αντί για τη διατήρηση των εξαρτημάτων JSON, μπορείτε να πάρετε ευφυείς χλευασμούς που προσαρμόζονται στα αιτήματά σας και να θυμάστε κατάσταση σε όλες τις κλήσεις.

**Τι υποστηρίζει:** Κάθε πρωτόκολλο που χρειάζεστε - REST, GraphQL, gRPC, SignalR, Server-Sent Events, και OpenAPI. Σε αντίθεση με τα στατικά εξαρτήματα, οι απαντήσεις παράγονται δυναμικά με βάση το περιεχόμενο της αίτησής σας, καθιστώντας τις πολυβήμα ροές εργασίας και σύνθετα σενάρια δοκιμών ασήμαντα.

### Σύνδεσμοι Έργου

[![NuGetCity name (optional, probably does not need a translation)](https://img.shields.io/nuget/v/mostlylucid.mockllmapi.svg)](https://www.nuget.org/packages/mostlylucid.mockllmapi)
[![NuGetCity name (optional, probably does not need a translation)](https://img.shields.io/nuget/dt/mostlylucid.mockllmapi.svg)](https://www.nuget.org/packages/mostlylucid.mockllmapi)
[![Απελευθέρωση GitHub](https://img.shields.io/github/v/release/scottgal/LLMApi)](https://github.com/scottgal/LLMApi/releases)
[![Άδεια: Unlicense](https://img.shields.io/badge/license-Unlicense-blue.svg)](http://unlicense.org/)

- **Αποθετήριο:** [https://github.com/scottgal/LLMApi](https://github.com/scottgal/LLMApi)
- **Εκδόσεις:** https://github.com/scottgal/LLMApi/releases
- **Πακέτο Συντρόφων:** [ως επί το πλείστον διαυγής.mockllmapi.Testing](https://github.com/scottgal/LLMApi/blob/master/mostlylucid.mockllmapi.Testing/README.md) - Δοκιμή κοινής ωφέλειας με άπταιστη ενσωμάτωση HttpClient

### Τρεις Τρόποι Χρήσης

Μπορείτε να χρησιμοποιήσετε ως επί το πλείστον διαυγής.mockllmapi με τρεις τρόπους, ανάλογα με το πόσο απομονωμένο θέλετε το περιβάλλον dev σας να είναι:

1. **ASP.NET Core NuGet πακέτο** - Προσθήκη στα υπάρχοντα έργα σας
2. **Ανταλλακτικό εργαλείο CLI** - Εκτελέσιμο cross-platform (download από [κυκλοφορίες](https://github.com/scottgal/LLMApi/releases))
3. **Κιβώτιο βαλβίδων** - Απαιτούμενη εγκατάσταση Zero

[TOC]

## Το χαρακτηριστικό του δολοφόνου: Μνήμη πλαισίου

> **Πλήρεςς οδηγός:** [API Contexts Documentation](https://github.com/scottgal/LLMApi/blob/master/docs/API-CONTEXTS.md)

Παραδοσιακή mock APIs έχουν ένα μοιραίο ελάττωμα: κάθε αίτηση είναι ανεξάρτητη. Πάρτε ένα χρήστη με την ταυτότητα 42, στη συνέχεια, να φέρει τις παραγγελίες τους, και θα πάρετε παραγγελίες για το ID χρήστη 99.

**Πλαίσιο API** Λύστε αυτό με κοινή μνήμη μεταξύ των σχετικών αιτημάτων:

```javascript
// 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 βλέπει προηγούμενα αιτήματα στο ίδιο πλαίσιο και δημιουργεί συνεπή δεδομένα. **Αυτή είναι η αλλαγή παιχνιδιού για πολλαπλές ροές εργασίας βημάτων.**

**Χαρακτηριστικά:**

**Κύκλος ζωής:**

- Αυτόματη λήξη μετά από 15 λεπτά αδράνειας (ρυθμιζόμενη)
- Κάθε αίτημα ανανεώνει το χρονοδιακόπτη

**Συμπεριφορά:**

- Έξυπνη εξαγωγή ΟΛΩΝ των πεδίων από τις απαντήσεις

**Ασφάλεια:**

- Μηδέν διαρροές μνήμης - τα συμφραζόμενα καθαρίζονται μόνοι τους

**Υpiοθέσει χρήση:**

- Ιδανικό για CI/CD - καμία κατάσταση μεταξύ τρεξίματος

## Γρήγορη εκκίνηση

### Επιλογή 1: NuGet Package

```bash
dotnet add package mostlylucid.mockllmapi
```

```csharp
// Program.cs
builder.Services.AddLLMockApi(builder.Configuration);
app.MapLLMockApi("/api/mock");
```

### Επιλογή 2: Εργαλείο CLI

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

### Επιλογή 3: Docker

> **Πλήρεςς οδηγός:** [Οδηγός ανάπτυξης Docker](https://github.com/scottgal/LLMApi/blob/master/docs/DOCKER_GUIDE.md)

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

### Προαπαιτούμενα: LLM Backend

Χρειάζεσαι **ένα από τα**: Ollama, OpenAI, or LM Studio:

```bash
# Recommended: Ollama with ministral-3:3b (ultra-fast, accurate JSON generation)
ollama pull ministral-3:3b
```

Βλέπεις; [Οδηγός μοντέλων Ollama](https://github.com/scottgal/LLMApi/blob/master/docs/OLLAMA_MODELS.md) για όλες τις πρότυπες συστάσεις και συγκρίσεις.

### Δοκίμασέ το αμέσως.

Μόλις τρέξετε, κάντε το πρώτο σας αίτημα:

```bash
curl http://localhost:5000/api/mock/users
# Response: [{"id": 1, "name": "Alice Johnson", "email": "alice@example.com"}, ...]
```

Αυτό είναι! Έχετε τώρα ένα έργο mock API που παράγει ρεαλιστικά δεδομένα σε ζήτηση.

## Πραγματικό Παράδειγμα: Αναζήτηση από το πιο διαυγή.net

Εδώ είναι ο πραγματικός κωδικός αναζήτησης από αυτό το blog - **αυτός είναι αμετάβλητος κωδικός πρόσθιας παραγωγής**, δεν απαιτούνται προσαρμογές για το χλευασμό:

```javascript
// 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; });
        }
    }
}
```

**Κόφ' το.**

```bash
# 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
```

Κάθε απάντηση είναι μοναδική και ρεαλιστική, προσαρμόζοντας στην ερώτηση.

## Έλεγχος Σχήματος: Καθορίστε το Schema σας

Πέρα από τη δημιουργία τυχαίων δεδομένων, συχνά χρειάζεστε ακριβή έλεγχο της δομής JSON. Ο έλεγχος σχήματος σας επιτρέπει να πείτε στο LLM ακριβώς ποια δομή να δημιουργήσετε - το πιο ισχυρό χαρακτηριστικό για την ανάπτυξη του frontend.

### Βασικό σχήμα

```bash
# 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" }
```

**Τρεις τρόποι για να καθορίσετε το σχήμα:**

1. Παράμετρος ερωτήσεων - `?shape={...}`
2. Κεφαλίδα HTTP - `X-Response-Shape: {...}` (συνιστάται)
3. Αίτημα φορέα - `{"shape": {...}}`

### Φωτεινό σχήμα

```javascript
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) }
});
```

### Ευθυγράμμιση TypeScript

```typescript
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 ροή εργασίας:

```bash
# 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 έχει σας καλύπτει.

**Υποστηριγμένα πρωτόκολλα:**

- ~ REST
- ΓράφημαQL
- ; gRPC
- ; SignerR
- ; Εκδηλώσεις Server-Sent (SSE)
- OpenAPI / Swagger

### ΓράφημαQL

> **Οδηγός:** [Τμήμα ΓράφημαQL](https://github.com/scottgal/LLMApi#graphql-api-mocking)

```bash
curl -X POST http://localhost:5000/api/mock/graphql \
  -d '{"query": "{ users { id name email } }"}'
```

Το ερώτημα είναι το σχήμα - δεν χρειάζεται ξεχωριστό σχήμα.

### gRPC

> **Πλήρεςς οδηγός:** [Υποστήριξη gRPC](https://github.com/scottgal/LLMApi/blob/master/docs/GRPC_SUPPORT.md)

```bash
# 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 Real-Time

> **Οδηγός:** [Οδηγός επίδειξης Signer](https://github.com/scottgal/LLMApi/blob/master/SIGNALR_DEMO_GUIDE.md)

```javascript
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");
```

Ιδανικό για πρωτοτυπίες ταμπλό.

### Εκδηλώσεις Server-Sent (SSE)

> **Οδηγός:** [Λειτουργία SSE Streaming](https://github.com/scottgal/LLMApi/blob/master/docs/SSE_STREAMING_MODES.md)

```javascript
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

> **Πλήρεςς οδηγός:** [Χαρακτηριστικά OpenAPI](https://github.com/scottgal/LLMApi/blob/master/docs/OPENAPI-FEATURES.md)

```bash
# 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 Εργαλεία: Αναμειγνύονται πραγματικά δεδομένα & Mock

> **Πλήρεςς οδηγός:** [Εργαλεία & Δράσεις](https://github.com/scottgal/LLMApi/blob/master/docs/TOOLS_ACTIONS.md)

Μερικές φορές χρειάζεστε μια υβριδική προσέγγιση - πραγματικά δεδομένα από την παραγωγή σε συνδυασμό με δημιουργημένα δεδομένα mock. Το pluggable σύστημα εργαλείων σας επιτρέπει να καλέσετε πραγματικά API κατά τη διάρκεια της παραγωγής απομίμησης, δημιουργώντας απίστευτα ρεαλιστικά σενάρια δοκιμών.

```json
{
  "Tools": [{
    "Name": "getUserData",
    "Type": "http",
    "HttpConfig": {
      "Endpoint": "https://api.production.com/users/{userId}",
      "Headers": { "Authorization": "Bearer ${PROD_API_KEY}" }
    }
  }]
}
```

```bash
curl "http://localhost:5000/api/mock/orders?useTool=getUserData&userId=123"
```

Το mockes fitches REAL δεδομένα χρηστών, στη συνέχεια, η LLM παράγει εντολές χρησιμοποιώντας αυτό. **Εξαιρετικά χρήσιμο για ρεαλιστικές δοκιμές με υβριδικό mock/πραγματικές ροές εργασίας.**

## ASP.NET Core Integration

Αν χτίζετε με το ASP.NET Core, η ενσωμάτωση είναι απρόσκοπτη. Η ομορφιά αυτής της προσέγγισης είναι **Μετατροπές μηδενικού κωδικού** στις υπηρεσίες σας - απλά ρυθμίζετε `HttpClient` να επισημάνει το χλευασμό κατά τη διάρκεια της ανάπτυξης και την πραγματική API στην παραγωγή.

```csharp
// 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:**

```json
{
  "TranslationService": {
    "BaseUrl": "http://localhost:5000"  // Mock
  }
}
```

**Appsettings. Production.json:**

```json
{
  "TranslationService": {
    "BaseUrl": "https://api.production.com"  // Real
  }
}
```

Αυτό το μοτίβο λειτουργεί για κάθε `HttpClient` in your application - translation services, payment gates, external APIs, you name it.

## Πότε να το χρησιμοποιήσετε αυτό

Πριν βουτήξουμε σε προηγμένα χαρακτηριστικά, ας είμαστε σαφείς σχετικά με το πότε αυτό το εργαλείο έχει νόημα για τη ροή εργασίας σας.

**Ιδανικό για:**

- **Ανάπτυξη του Frontend πριν από την ύπαρξη του backend** - Σταμάτα να μπλοκάρεις τις ομάδες υποστήριξης.
- **Δοκιμή ροής εργασίας πολλών σταδίων** - Η μνήμη πλαισίου χειρίζεται περίπλοκα σενάρια
- **Πρωτότυπο API** - Πείραμα με σχήματα απόκρισης πριν από τη δέσμευση
- **Offline ανάπτυξη** - Εργασίες χωρίς εξαρτήσεις δικτύου
- **Δοκιμή σεναρίου σφάλματος** - Προσομοιώστε τις αποτυχίες χωρίς να σπάσετε την παραγωγή
- **Αγωγοί CI/CD** - Χωρίς εξωτερικές εξαρτήσεις σημαίνει γρηγορότερα, πιο αξιόπιστα οικοδομήματα

**Δεν είναι ιδανικό για:**

- **Περιβάλλοντα παραγωγής** - Αυτό είναι ένα εργαλείο ανάπτυξης και δοκιμής
- **καθοριστικά δεδομένα δοκιμών** - Χρησιμοποιήστε εξαρτήματα όταν χρειάζεστε ακριβή αναπαραγωγιμότητα
- **Δοκιμή σύμβασης** - Πάντα να επικυρώνετε έναντι πραγματικών API για συμβάσεις παραγωγής

Τώρα που ξέρετε πού ταιριάζει, ας εξερευνήσουμε τις προηγμένες δυνατότητες.

## Προχωρημένα χαρακτηριστικά

> Αυτά τα χαρακτηριστικά είναι προαιρετικά - μπορείτε να πάρετε τεράστια αξία από τα βασικά μόνο. Αλλά όταν χρειάζεστε την παραγωγή-βαθμού ρεαλισμό σε κλίμακα, αυτά τα εργαλεία είναι εδώ.

### Πολλαπλά συστήματα υποστήριξης LLM

> **Οδηγός:** [Πολλαπλά συστήματα υποστήριξης LLM](https://github.com/scottgal/LLMApi/blob/master/docs/MULTIPLE_LLM_BACKENDS.md)

```bash
# 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"
```

### Ρυθμός περιορισμού προσομοίωσης

> **Οδηγός:** [Επιτόκιο περιορισμού & παρτίδας](https://github.com/scottgal/LLMApi/blob/master/docs/RATE_LIMITING_BATCHING.md)

Δοκιμάστε πώς η εφαρμογή σας χειρίζεται τα όρια ταχύτητας:

```json
{
  "EnableRateLimiting": true,
  "RateLimitDelayRange": "500-2000"
}
```

### Προσομοίωση σφάλματος

```bash
# 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.

### Απάντηση Caching

```bash
# Generate and cache 10 variants
curl "http://localhost:5000/api/mock/users?shape={\"$cache\":10,\"id\":0,\"name\":\"string\"}"
```

Επακόλουθες αιτήσεις λαμβάνουν άμεση cached απαντήσεις.

## Χρήση δοκιμών: ως επί το πλείστον διαυγής.mockllmapi.Testing

> **Πακέτο:** [ως επί το πλείστον διαυγής.mockllmapi.Testing](https://github.com/scottgal/LLMApi/blob/master/mostlylucid.mockllmapi.Testing/README.md)

Όλα τα παραπάνω χαρακτηριστικά είναι σπουδαία για την ανάπτυξη, αλλά τι γίνεται με τις αυτοματοποιημένες δοκιμές; Το συνοδευτικό πακέτο δοκιμών παρέχει ένα άπταιστο API που κάνει τις δοκιμές ενσωμάτωσης ένα αεράκι - ρυθμίστε την παρωδία συμπεριφορά δηλωτικά και αφήστε `HttpClient` Κάνε τα υπόλοιπα.

### Εγκατάσταση

```bash
dotnet add package mostlylucid.mockllmapi.Testing
```

### Βασική χρήση

```csharp
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[]>();
```

### Πολλαπλά τελικά σημεία

```csharp
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
```

### Επιλογές ρύθμισης

**Ρύθμιση σχήματος:**

```csharp
// 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 = "" } }
})
```

**Προσομοίωση σφάλματος:**

```csharp
// Simple error
.WithError(404)

// With custom message
.WithError(404, "User not found")

// With details
.WithError(422, "Validation failed", "Email address is invalid")
```

**Streaming:**

```csharp
// Enable streaming with token-by-token output
.WithStreaming()
.WithSseMode("LlmTokens")

// Stream complete objects
.WithStreaming()
.WithSseMode("CompleteObjects")

// Stream array items individually
.WithStreaming()
.WithSseMode("ArrayItems")
```

### Ένεση εξάρτησης

**Πληκτρολογημένος πελάτης:**

```csharp
services.AddMockLlmHttpClient<IUserApiClient>(
    baseApiPath: "/api/mock",
    configure: handler => handler
        .ForEndpoint("/users", config => config
            .WithShape(new { id = 0, name = "", email = "" }))
);
```

**Ονομάζεται Πελάτης:**

```csharp
services.AddMockLlmHttpClient(
    name: "MockApi",
    baseApiPath: "/api/mock",
    configure: handler => handler
        .ForEndpoint("/data", config => config
            .WithShape(new { value = 0 }))
);

// Usage
var client = httpClientFactory.CreateClient("MockApi");
```

### Παράδειγμα δοκιμής ενσωμάτωσης

```csharp
[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);
}
```

### Πώς Λειτουργεί

Η `MockLlmHttpHandler` ί ας `DelegatingHandler` ότι:

1. Αναχαιτίζει τις εξερχόμενες αιτήσεις HTTP
2. Ταιριάζει με τα αιτήματα έναντι των ρυθμισμένων προτύπων τελικού σημείου
3. Εισάγει τη διαμόρφωση mock μέσω παραμέτρων ερωτημάτων και κεφαλίδων HTTP
4. Προωθεί το τροποποιημένο αίτημα στην πραγματική mocking LLM API

Αυτό σας επιτρέπει να χρησιμοποιήσετε ένα πραγματικό `HttpClient` στις δοκιμές σας ενώ ελέγχετε εύκολα την παρωδία API συμπεριφορά χωρίς τροποποίηση του κώδικα εφαρμογής σας.

## Βέλτιστες Πρακτικές & Συμβουλές

Μετά τη συνεργασία με αυτό το εργαλείο σε πολλαπλά έργα, εδώ είναι τα πρότυπα που λειτουργούν καλύτερα:

1. **Πάντοτε να χρησιμοποιείτε τα συμφραζόμενα για ροές εργασίας** - Εξασφαλίζει συνεπείς ταυτότητες και δεδομένα κατά τη διάρκεια των εργασιών πολλαπλών σταδίων
2. **Χρήση σχήματος για την ασφάλεια τύπου** - Κάντε το να ταιριάζει με τις διεπαφές TypeScript σας
3. **Αναμίξτε πραγματικά και ψευδεπίγραφα δεδομένα με εργαλεία** - Οι καλύτεροι και των δύο κόσμων.
4. **Επιλέξτε το σωστό μοντέλο** (βλ. [Οδηγός μοντέλων Ollama](https://github.com/scottgal/LLMApi/blob/master/docs/OLLAMA_MODELS.md) για πλήρεις λεπτομέρειες:
   - **ΣΥΝΙΣΤΑ για dev**: `ministral-3:3b` (3B params, 32K context) - **Δολοφόνος για τον JSON!** Εξαιρετικά γρήγορος, πολύ ακριβής, minimal RAM
   - **Παραγωγής**: `llama3` (8B params, 8K context) - Καλύτερη ισορροπία ποιότητας και απόδοσης
   - **Υψηλής ποιότητας**: `mistral-nemo` (12B params, 128K context) - Σύνθετα σχήματα και μαζικά σύνολα δεδομένων
   - **Περιορισένοι piόροι**: `gemma3:4b` ή `phi3` - Ελαφρύτερες εναλλακτικές λύσεις

## Πλήρης τεκμηρίωση

- **[Κύριο αποθετήριο](https://github.com/scottgal/LLMApi)** - Πηγή και επισκόπηση
- **[Αναφορά ρύθμισης](https://github.com/scottgal/LLMApi/blob/master/docs/CONFIGURATION_REFERENCE.md)** - Όλες οι ρυθμίσεις
- **[Οδηγός πλαισίων API](https://github.com/scottgal/LLMApi/blob/master/docs/API-CONTEXTS.md)** - Βαθιά κατάδυση μνήμης πλαισίου
- **[Εργαλεία & Δράσεις](https://github.com/scottgal/LLMApi/blob/master/docs/TOOLS_ACTIONS.md)** - Εξωτερική ενσωμάτωση API
- **[Χαρακτηριστικά OpenAPI](https://github.com/scottgal/LLMApi/blob/master/docs/OPENAPI-FEATURES.md)** - Κοροϊδεύοντας τους Spec
- **[Υποστήριξη gRPC](https://github.com/scottgal/LLMApi/blob/master/docs/GRPC_SUPPORT.md)** - Πιστοποιητικά πρωτοκόλλου
- **[Οδηγός Docker](https://github.com/scottgal/LLMApi/blob/master/docs/DOCKER_GUIDE.md)** - Ανάπτυξη κοντέινερ
- **[Πολλαπλά συστήματα υποστήριξης](https://github.com/scottgal/LLMApi/blob/master/docs/MULTIPLE_LLM_BACKENDS.md)** - Ρύθμιση πολυπρομηθευτή
- **[Οριοθέτηση ποσοστού](https://github.com/scottgal/LLMApi/blob/master/docs/RATE_LIMITING_BATCHING.md)** - Προσομοιωτικά όρια
- **[Συσκευασία δοκιμής](https://github.com/scottgal/LLMApi/blob/master/mostlylucid.mockllmapi.Testing/README.md)** - HttpΠελάτης κοινής ωφέλειας

## Συμπέρασμα

Η ανάπτυξη του Frontend δεν χρειάζεται να περιμένει την υποστήριξη APIs. `mostlylucid.mockllmapi` σας δίνει:

- **Ανάμνηση πλαισίου@ title: window** - Συστατικά, επικρατέστερα δεδομένα σε πολλαπλές ροές εργασίας
- **Έλεγχος σχήματος** - Ακριβείς ορισμοί σχημάτων που ταιριάζουν με τους τύπους σας
- **Υποστήριξη καθολικού πρωτοκόλλου** - REST, GraphQL, gRPC, Signer, SSE, OpenAPI
- **Υβριδικός έλεγχος** - Αναμειγνύονται πραγματικά δεδομένα παραγωγής με δημιουργηθέντα ψεγάδια
- **Μηδέν συντήρηση** - Δεν εξαρτήματα JSON για την ενημέρωση όταν οι απαιτήσεις αλλάζουν
- **Δοκιμασίες κοινής ωφέλειας** - Fluent API για δοκιμές ενσωμάτωσης

Η διαφορά μεταξύ αυτού και του παραδοσιακού χλευασμού; Το frontend λειτουργεί ενάντια σε ρεαλιστικά, κατανοητά δεδομένα από την πρώτη μέρα.

Είτε φτιάχνεις ένα απλό blog είτε μια πολύπλοκη εφαρμογή επιχείρησης, θα ταξιδέψεις γρηγορότερα, θα δοκιμάσεις πιο διεξοδικά, και θα ταξιδέψεις με αυτοπεποίθηση.

**Έτοιμος να ξεκινήσουμε;**

```bash
docker compose up -d
```

Αυτό είναι.Δεν απαιτείται υποστήριξη.