> ## Documentation Index
> Fetch the complete documentation index at: https://docs.responsibleailabs.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Python: Middleware

> RAILMiddleware - umschließen Sie jede asynchrone LLM-Funktion mit automatischer RAIL-Bewertung.

<Info>
  **Konzept:** [Middleware](/concepts/middleware) | **API:** [Evaluation API](/api-reference/evaluation)
</Info>

`RAILMiddleware` umschließt jede asynchrone Funktion, die LLM-Antworten generiert, und fügt eine automatische RAIL-Bewertung hinzu, ohne Ihre LLM-Aufruflogik zu ändern.

<CodeGroup>
  ```python Basic setup theme={null}
  import asyncio
  from rail_score_sdk import RAILMiddleware

  async def my_llm(messages, **kwargs):
      # Ihr LLM-Aufruf hier — gibt einen String zurück
      return "Das LLM hat diese Antwort generiert."

  async def main():
      mw = RAILMiddleware(
          api_key="YOUR_RAIL_API_KEY",
          generate_fn=my_llm,
          threshold=7.0,
          policy="block",
          eval_input=True,
          input_threshold=5.0,
      )

      result = await mw.run(
          messages=[
              {"role": "system", "content": "Sie sind ein hilfreicher Assistent."},
              {"role": "user", "content": "Erklären Sie Quantencomputing."},
          ]
      )
      print(f"Score: {result.score}, Met threshold: {result.threshold_met}")
      print(f"Content: {result.content}")

  asyncio.run(main())
  ```

  ```python Observe mode (no blocking) theme={null}
  mw = RAILMiddleware(
      api_key="YOUR_RAIL_API_KEY",
      generate_fn=my_llm,
      # Kein Schwellenwert — bewertet jede Antwort, blockiert aber niemals
  )

  result = await mw.run(messages=[...])
  print(result.score)        # Immer vorhanden
  print(result.threshold_met)  # Keine — kein Schwellenwert gesetzt
  ```

  ```python Auto-regenerate on fail theme={null}
  mw = RAILMiddleware(
      api_key="YOUR_RAIL_API_KEY",
      generate_fn=my_llm,
      threshold=7.0,
      policy="regenerate",
      max_iterations=3,
  )

  result = await mw.run(messages=[...])
  print(result.content)           # Beste Inhalte über Iterationen hinweg
  print(result.iterations_taken)  # 1, wenn das Original bestanden hat
  ```
</CodeGroup>

## Parameter

| Parameter         | Typ              | Standard  | Beschreibung                              |
| ----------------- | ---------------- | --------- | ----------------------------------------- |
| `api_key`         | `str`            | —         | RAIL API-Schlüssel                        |
| `generate_fn`     | `async callable` | —         | Ihre LLM-Funktion                         |
| `threshold`       | `float`          | `None`    | Blockieren/regenerieren unter diesem Wert |
| `policy`          | `str`            | `"block"` | `"block"` oder `"regenerate"`             |
| `eval_input`      | `bool`           | `False`   | Auch die Eingabemeldungen bewerten        |
| `input_threshold` | `float`          | `None`    | Schwellenwert für die Eingabebewertung    |
| `max_iterations`  | `int`            | `3`       | Maximalversuche zur Regeneration          |
