From 54db564529652722fad1b9a597597b7108612ee3 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Sat, 7 Sep 2024 15:49:51 -0700 Subject: [PATCH 1/2] add arch diagram --- docs/my-website/docs/proxy/architecture.md | 31 +++++++++++++++++++++ docs/my-website/img/litellm_gateway.png | Bin 0 -> 98410 bytes docs/my-website/sidebars.js | 7 ++++- 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 docs/my-website/docs/proxy/architecture.md create mode 100644 docs/my-website/img/litellm_gateway.png diff --git a/docs/my-website/docs/proxy/architecture.md b/docs/my-website/docs/proxy/architecture.md new file mode 100644 index 000000000..d75ffc765 --- /dev/null +++ b/docs/my-website/docs/proxy/architecture.md @@ -0,0 +1,31 @@ +import Image from '@theme/IdealImage'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Life of a Request + +## High Level architecture + + + + +### Request Flow + +1. **User Sends Request**: The process begins when a user sends a request to the LiteLLM Proxy Server (Gateway). + +2. [**Virtual Keys**](../virtual_keys): The request first passes through the Virtual Keys component + +3. **Rate Limiting**: The MaxParallelRequestsHandler applies rate limiting to manage the flow of requests. + +4. **Proxy Server Processing**: The request is then processed by the LiteLLM proxy_server.py, which handles the core logic of the proxy. + +5. [**LiteLLM Router**](../routing): LiteLLM Router**: The LiteLLM Router determines where to send the request based on the configuration and request parameters. + +6. **Model Interaction**: The request is sent to the appropriate model API (litellm.completion() or litellm.embedding()) for processing. + +7. **Response**: The model's response is sent back through the same components to the user. + +8. **Post-Request Processing**: After the response is sent, several asynchronous operations occur: + - The _PROXY_track_cost_callback updates spend in the database. + - Logging to LangFuse for analytics and monitoring. + - The MaxParallelRequestsHandler updates virtual key usage and performs post-request cleanup. diff --git a/docs/my-website/img/litellm_gateway.png b/docs/my-website/img/litellm_gateway.png new file mode 100644 index 0000000000000000000000000000000000000000..f453a2bf95125eee87f824fe371b32c22f84cc47 GIT binary patch literal 98410 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 Date: Sat, 7 Sep 2024 16:21:29 -0700 Subject: [PATCH 2/2] docs add arch diagram --- docs/my-website/docs/proxy/architecture.md | 28 +++++++++++++--------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/docs/my-website/docs/proxy/architecture.md b/docs/my-website/docs/proxy/architecture.md index d75ffc765..f87b7c005 100644 --- a/docs/my-website/docs/proxy/architecture.md +++ b/docs/my-website/docs/proxy/architecture.md @@ -13,19 +13,25 @@ import TabItem from '@theme/TabItem'; 1. **User Sends Request**: The process begins when a user sends a request to the LiteLLM Proxy Server (Gateway). -2. [**Virtual Keys**](../virtual_keys): The request first passes through the Virtual Keys component +2. [**Virtual Keys**](../virtual_keys): At this stage the `Bearer` token in the request is checked to ensure it is valid and under it's budget -3. **Rate Limiting**: The MaxParallelRequestsHandler applies rate limiting to manage the flow of requests. +3. **Rate Limiting**: The [MaxParallelRequestsHandler](https://github.com/BerriAI/litellm/blob/main/litellm/proxy/hooks/parallel_request_limiter.py) checks the **rate limit (rpm/tpm)** for the the following components: + - Global Server Rate Limit + - Virtual Key Rate Limit + - User Rate Limit + - Team Limit -4. **Proxy Server Processing**: The request is then processed by the LiteLLM proxy_server.py, which handles the core logic of the proxy. +4. **LiteLLM `proxy_server.py`**: Contains the `/chat/completions` and `/embeddings` endpoints. Requests to these endpoints are sent through the LiteLLM Router -5. [**LiteLLM Router**](../routing): LiteLLM Router**: The LiteLLM Router determines where to send the request based on the configuration and request parameters. +5. [**LiteLLM Router**](../routing): The LiteLLM Router handles Load balancing, Fallbacks, Retries for LLM API deployments. -6. **Model Interaction**: The request is sent to the appropriate model API (litellm.completion() or litellm.embedding()) for processing. +6. [**litellm.completion() / litellm.embedding()**:](../index#litellm-python-sdk) The litellm Python SDK is used to call the LLM in the OpenAI API format (Translation and parameter mapping) -7. **Response**: The model's response is sent back through the same components to the user. - -8. **Post-Request Processing**: After the response is sent, several asynchronous operations occur: - - The _PROXY_track_cost_callback updates spend in the database. - - Logging to LangFuse for analytics and monitoring. - - The MaxParallelRequestsHandler updates virtual key usage and performs post-request cleanup. +7. **Post-Request Processing**: After the response is sent back to the client, the following **asynchronous** tasks are performed: + - [Logging to LangFuse (logging destination is configurable)](./logging) + - The [MaxParallelRequestsHandler](https://github.com/BerriAI/litellm/blob/main/litellm/proxy/hooks/parallel_request_limiter.py) updates the rpm/tpm usage for the + - Global Server Rate Limit + - Virtual Key Rate Limit + - User Rate Limit + - Team Limit + - The `_PROXY_track_cost_callback` updates spend / usage in the LiteLLM database.