From ec5600cc8f1c405b850a62e1bd9b3a8692e883f3 Mon Sep 17 00:00:00 2001 From: Roman Glushko Date: Thu, 22 Feb 2024 22:55:44 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=A6=20v0.0.2-rc.2=20(#155)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Features - ✨ #142: [Lang Chat Router] Ollama Support (@mkrueger12) - ✨ #131: [Lang Chat Router] AWS Bedrock Support (@mkrueger12) ## Miscellaneous - πŸ‘· #155 Fixing the dockerhub authorization step in the release workflow (@roma-glushko) - ♻️ #151: Moved specific provider schemas closer to provider's packages (@roma-glushko) --- .github/workflows/release.yaml | 10 +- CHANGELOG.md | 12 + README.md | 103 +++++--- docs/docs.go | 222 ++++++++++++++---- docs/images/aws-icon.png | Bin 0 -> 128652 bytes docs/images/ollama.png | Bin 0 -> 7487 bytes docs/swagger.json | 222 ++++++++++++++---- docs/swagger.yaml | 149 +++++++++--- go.mod | 18 +- go.sum | 38 ++- images/Makefile | 5 +- pkg/api/http/handlers.go | 6 +- pkg/api/schemas/language.go | 119 +--------- pkg/providers/anthropic/chat.go | 14 +- pkg/providers/anthropic/client_test.go | 4 +- pkg/providers/anthropic/schamas.go | 17 ++ pkg/providers/azureopenai/chat.go | 16 +- pkg/providers/azureopenai/client_test.go | 4 +- pkg/providers/bedrock/chat.go | 129 ++++++++++ pkg/providers/bedrock/client.go | 73 ++++++ pkg/providers/bedrock/client_test.go | 76 ++++++ pkg/providers/bedrock/config.go | 62 +++++ pkg/providers/bedrock/schemas.go | 11 + pkg/providers/bedrock/testdata/chat.req.json | 12 + .../bedrock/testdata/chat.success.json | 1 + pkg/providers/cohere/chat.go | 14 +- pkg/providers/cohere/client_test.go | 2 +- pkg/providers/cohere/schemas.go | 67 ++++++ pkg/providers/config.go | 18 +- pkg/providers/octoml/chat.go | 14 +- pkg/providers/octoml/client_test.go | 4 +- pkg/providers/ollama/chat.go | 207 ++++++++++++++++ pkg/providers/ollama/client.go | 59 +++++ pkg/providers/ollama/client_test.go | 128 ++++++++++ pkg/providers/ollama/config.go | 67 ++++++ pkg/providers/ollama/schemas.go | 17 ++ pkg/providers/ollama/testdata/chat.req.json | 11 + .../ollama/testdata/chat.success.json | 15 ++ pkg/providers/openai/chat.go | 14 +- pkg/providers/openai/client.go | 4 - pkg/providers/openai/client_test.go | 4 +- pkg/providers/openai/schemas.go | 26 ++ pkg/providers/provider.go | 4 +- pkg/providers/testing.go | 6 +- pkg/routers/router.go | 2 +- 45 files changed, 1666 insertions(+), 340 deletions(-) create mode 100644 docs/images/aws-icon.png create mode 100644 docs/images/ollama.png create mode 100644 pkg/providers/anthropic/schamas.go create mode 100644 pkg/providers/bedrock/chat.go create mode 100644 pkg/providers/bedrock/client.go create mode 100644 pkg/providers/bedrock/client_test.go create mode 100644 pkg/providers/bedrock/config.go create mode 100644 pkg/providers/bedrock/schemas.go create mode 100644 pkg/providers/bedrock/testdata/chat.req.json create mode 100644 pkg/providers/bedrock/testdata/chat.success.json create mode 100644 pkg/providers/cohere/schemas.go create mode 100644 pkg/providers/ollama/chat.go create mode 100644 pkg/providers/ollama/client.go create mode 100644 pkg/providers/ollama/client_test.go create mode 100644 pkg/providers/ollama/config.go create mode 100644 pkg/providers/ollama/schemas.go create mode 100644 pkg/providers/ollama/testdata/chat.req.json create mode 100644 pkg/providers/ollama/testdata/chat.success.json create mode 100644 pkg/providers/openai/schemas.go diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index ed5231b5..8c2af36a 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -5,9 +5,6 @@ on: tags: - "*" - branches: - - main - permissions: contents: write packages: write @@ -70,7 +67,10 @@ jobs: fetch-depth: 0 - name: login into Github Container Registry - run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u $ --password-stdin + run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u --password-stdin + + - name: login into Github Container Registry + run: echo "${{ secrets.DOCKER_HUB_TOKEN }}" | docker login -u einstack --password-stdin - name: login into Github Container Registry run: echo "${{ secrets.DOCKER_HUB_TOKEN }}" | docker login -u einstack $ --password-stdin @@ -85,6 +85,6 @@ jobs: working-directory: ./images run: VERSION=${{ github.ref_name }} make publish-ghcr-${{ matrix.image }} - - name: publish ${{ matrix.image }} image to Github Container Registry + - name: publish ${{ matrix.image }} image to DockerHub working-directory: ./images run: VERSION=${{ github.ref_name }} make publish-docherhub-${{ matrix.image }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 48a393dc..05c37577 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,18 @@ The changelog consists of three categories: - **Improvements** - bugfixes, performance and other types of improvements to existing functionality - **Miscellaneous** - all other updates like build, release, CLI, etc. +## 0.0.2-rc.2 (Feb 22nd, 2024) + +### Features + +- ✨ #142: [Lang Chat Router] Ollama Support (@mkrueger12) +- ✨ #131: [Lang Chat Router] AWS Bedrock Support (@mkrueger12) + +### Miscellaneous + +- πŸ‘· #155 Fixing the dockerhub authorization step in the release workflow (@roma-glushko) +- ♻️ #151: Moved specific provider schemas closer to provider's packages (@roma-glushko) + ## 0.0.2-rc.1 (Feb 12th, 2024) ### Features diff --git a/README.md b/README.md index d35e914a..c3597081 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,24 @@ -# Glide: Cloud-Native LLM Gateway for Seamless LLMOps
Glide GH Header +

Glide: Cloud-Native LLM Gateway for Seamless LLMOps

+ CodeCov + Discord + Glide Docs + License + ArtifactHub + FOSSA Status
- -[![codecov](https://codecov.io/github/EinStack/glide/graph/badge.svg?token=F7JT39RHX9)](https://codecov.io/github/EinStack/glide) -[![Discord](https://img.shields.io/discord/1181281407813828710)](https://discord.gg/pt53Ej7rrc) -[![Documentation](https://img.shields.io/badge/build-view-violet%20?style=flat&logo=books&label=docs&link=https%3A%2F%2Fglide.einstack.ai%2F)](https://glide.einstack.ai/) -[![LICENSE](https://img.shields.io/github/license/EinStack/glide.svg?style=flat-square&color=%233f90c8)](https://github.com/EinStack/glide/blob/main/LICENSE) -[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FEinStack%2Fglide.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2FEinStack%2Fglide?ref=badge_shield) - --- -Glide is your go-to cloud-native LLM gateway, delivering high-performance LLMOps in a lightweight, all-in-one package. +**Glide** is your go-to cloud-native LLM gateway, delivering high-performance LLMOps in a lightweight, all-in-one package. We take all problems of managing and communicating with external providers out of your applications, so you can dive into tackling your core challenges. +> [!Important] +> Give us a star⭐ to support the project and watchπŸ‘€ our repositories not to miss any update. Appriciate your interest πŸ™ + Glide sits between your application and model providers to seamlessly handle various LLMOps tasks like model failover, caching, key management, etc. @@ -27,7 +29,7 @@ Take a look at the develop branch. Check out our [documentation](https://glide.einstack.ai)! > [!Warning] -> Glide is under active development right now. Give us a star to support the project ✨ +> Glide is under active development right now πŸ› οΈ ## Features @@ -38,35 +40,18 @@ Check out our [documentation](https://glide.einstack.ai)! - **Production-ready observability** via OpenTelemetry, emit metrics on models health, allows whitebox monitoring (coming soon) - Straightforward and simple maintenance and configuration, centralized API key control & management & rotation, etc. -## Supported Providers - ### Large Language Models | | Provider | Support Status | |-----------------------------------------------------|---------------|-----------------| -| | OpenAI | πŸ‘ Supported | +| | Anthropic | πŸ‘ Supported | | | Azure OpenAI | πŸ‘ Supported | +| | AWS Bedrock (Titan) | πŸ‘ Supported | | | Cohere | πŸ‘ Supported | -| | OctoML | πŸ‘ Supported | -| | Anthropic | πŸ‘ Supported | | | Google Gemini | πŸ—οΈ Coming Soon | - - -### Routers - -Routers are a core functionality of Glide. Think of routers as a group of models with some predefined logic. For example, the resilience router allows a user to define a set of backup models should the initial model fail. Another example, would be to leverage the least-latency router to make latency sensitive LLM calls in the most efficient manner. - -Detailed info on routers can be found [here](https://glide.einstack.ai/essentials/routers). - -#### Available Routers - -| Router | Description | -|---------------|-----------------| -| Priority | When the target model fails the request is sent to the secondary model. The entire service instance keeps track of the number of failures for a specific model reducing latency upon model failure | -| Least Latency | This router selects the model with the lowest average latency over time. If the least latency model becomes unhealthy, it will pick the second the best, etc. | -| Round Robin | Split traffic equally among specified models. Great for A/B testing. | -| Weighted Round Robin | Split traffic based on weights. For example, 70% of traffic to Model A and 30% of traffic to Model B. | - +| | OctoML | πŸ‘ Supported | +| | Ollama | πŸ‘ Supported | +| | OpenAI | πŸ‘ Supported | ## Get Started @@ -107,7 +92,6 @@ See [API Reference](https://glide.einstack.ai/api-reference/introduction) for mo ```json { - "model": "gpt-3.5-turbo", # this is not required but can be used to specify different prompts to different models "message": { "role": "user", @@ -196,7 +180,58 @@ docker pull ghcr.io/einstack/glide:latest-redhat ### Helm Chart -Coming Soon +Add the EinStack repository: + +```bash +helm repo add einstack https://einstack.github.io/helm-charts +helm repo update +``` + +Before installing the Helm chart, you need to create a Kubernetes secret with your API keys like: + +```bash +kubectl create secret generic api-keys --from-literal=OPENAI_API_KEY=sk-abcdXYZ +``` + +Then, you need to create a custom values.yaml file to override the secret name like: + +```yaml +# save as custom.values.yaml, for example +glide: + apiKeySecret: "api-keys" +``` + +Finally, you should be able to install Glide's chart via: + +``` +helm upgrade glide-gateway einstack/glide --values custom.values.yaml --install +``` + +## SDKs + +To let you work with Glide's API with ease, we are going to provide you with SDKs that fits your tech stack: + +- Python (coming soon) +- NodeJS (coming soon) +- Golang (coming soon) +- Rust (coming soon) + +## Core Concepts + +### Routers + +Routers are a core functionality of Glide. Think of routers as a group of models with some predefined logic. For example, the resilience router allows a user to define a set of backup models should the initial model fail. Another example, would be to leverage the least-latency router to make latency sensitive LLM calls in the most efficient manner. + +Detailed info on routers can be found [here](https://glide.einstack.ai/essentials/routers). + +#### Available Routers + +| Router | Description | +|---------------|-----------------| +| Priority | When the target model fails the request is sent to the secondary model. The entire service instance keeps track of the number of failures for a specific model reducing latency upon model failure | +| Least Latency | This router selects the model with the lowest average latency over time. If the least latency model becomes unhealthy, it will pick the second the best, etc. | +| Round Robin | Split traffic equally among specified models. Great for A/B testing. | +| Weighted Round Robin | Split traffic based on weights. For example, 70% of traffic to Model A and 30% of traffic to Model B. | ## Community diff --git a/docs/docs.go b/docs/docs.go index 5ede09c8..96ddabc5 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -98,7 +98,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/schemas.UnifiedChatRequest" + "$ref": "#/definitions/schemas.ChatRequest" } } ], @@ -106,7 +106,7 @@ const docTemplate = `{ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/schemas.UnifiedChatResponse" + "$ref": "#/definitions/schemas.ChatResponse" } }, "400": { @@ -256,6 +256,52 @@ const docTemplate = `{ } } }, + "bedrock.Config": { + "type": "object", + "required": [ + "awsRegion", + "baseUrl", + "chatEndpoint", + "model" + ], + "properties": { + "awsRegion": { + "type": "string" + }, + "baseUrl": { + "type": "string" + }, + "chatEndpoint": { + "type": "string" + }, + "defaultParams": { + "$ref": "#/definitions/bedrock.Params" + }, + "model": { + "type": "string" + } + } + }, + "bedrock.Params": { + "type": "object", + "properties": { + "max_tokens": { + "type": "integer" + }, + "stop": { + "type": "array", + "items": { + "type": "string" + } + }, + "temperature": { + "type": "number" + }, + "top_p": { + "type": "number" + } + } + }, "clients.ClientConfig": { "type": "object", "properties": { @@ -431,6 +477,84 @@ const docTemplate = `{ } } }, + "ollama.Config": { + "type": "object", + "required": [ + "baseUrl", + "chatEndpoint", + "model" + ], + "properties": { + "baseUrl": { + "type": "string" + }, + "chatEndpoint": { + "type": "string" + }, + "defaultParams": { + "$ref": "#/definitions/ollama.Params" + }, + "model": { + "type": "string" + } + } + }, + "ollama.Params": { + "type": "object", + "properties": { + "microstat": { + "type": "integer" + }, + "microstat_eta": { + "type": "number" + }, + "microstat_tau": { + "type": "number" + }, + "num_ctx": { + "type": "integer" + }, + "num_gpu": { + "type": "integer" + }, + "num_gqa": { + "type": "integer" + }, + "num_predict": { + "type": "integer" + }, + "num_thread": { + "type": "integer" + }, + "repeat_last_n": { + "type": "integer" + }, + "seed": { + "type": "integer" + }, + "stop": { + "type": "array", + "items": { + "type": "string" + } + }, + "stream": { + "type": "boolean" + }, + "temperature": { + "type": "number" + }, + "tfs_z": { + "type": "number" + }, + "top_k": { + "type": "integer" + }, + "top_p": { + "type": "number" + } + } + }, "openai.Config": { "type": "object", "required": [ @@ -517,6 +641,9 @@ const docTemplate = `{ "azureopenai": { "$ref": "#/definitions/azureopenai.Config" }, + "bedrock": { + "$ref": "#/definitions/bedrock.Config" + }, "client": { "$ref": "#/definitions/clients.ClientConfig" }, @@ -540,6 +667,9 @@ const docTemplate = `{ "octoml": { "$ref": "#/definitions/octoml.Config" }, + "ollama": { + "$ref": "#/definitions/ollama.Config" + }, "openai": { "description": "Add other providers like", "allOf": [ @@ -627,49 +757,7 @@ const docTemplate = `{ } } }, - "schemas.OverrideChatRequest": { - "type": "object", - "properties": { - "message": { - "$ref": "#/definitions/schemas.ChatMessage" - }, - "model_id": { - "type": "string" - } - } - }, - "schemas.ProviderResponse": { - "type": "object", - "properties": { - "message": { - "$ref": "#/definitions/schemas.ChatMessage" - }, - "responseId": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "tokenCount": { - "$ref": "#/definitions/schemas.TokenUsage" - } - } - }, - "schemas.TokenUsage": { - "type": "object", - "properties": { - "promptTokens": { - "type": "number" - }, - "responseTokens": { - "type": "number" - }, - "totalTokens": { - "type": "number" - } - } - }, - "schemas.UnifiedChatRequest": { + "schemas.ChatRequest": { "type": "object", "properties": { "message": { @@ -686,7 +774,7 @@ const docTemplate = `{ } } }, - "schemas.UnifiedChatResponse": { + "schemas.ChatResponse": { "type": "object", "properties": { "cached": { @@ -714,6 +802,48 @@ const docTemplate = `{ "type": "string" } } + }, + "schemas.OverrideChatRequest": { + "type": "object", + "properties": { + "message": { + "$ref": "#/definitions/schemas.ChatMessage" + }, + "model_id": { + "type": "string" + } + } + }, + "schemas.ProviderResponse": { + "type": "object", + "properties": { + "message": { + "$ref": "#/definitions/schemas.ChatMessage" + }, + "responseId": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "tokenCount": { + "$ref": "#/definitions/schemas.TokenUsage" + } + } + }, + "schemas.TokenUsage": { + "type": "object", + "properties": { + "promptTokens": { + "type": "number" + }, + "responseTokens": { + "type": "number" + }, + "totalTokens": { + "type": "number" + } + } } }, "externalDocs": { diff --git a/docs/images/aws-icon.png b/docs/images/aws-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca16dbdba034247681791bcc3180119dedf1699 GIT binary patch literal 128652 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 literal 0 HcmV?d00001 diff --git a/docs/images/ollama.png b/docs/images/ollama.png new file mode 100644 index 0000000000000000000000000000000000000000..8cd2cf1ed8043caf62e8b069330889c0cf0f5a3b GIT binary patch literal 7487 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 1 { return fmt.Errorf( - "exactly one provider must be cofigured for model \"%v\", %v are configured", + "exactly one provider must be configured for model \"%v\", %v are configured", c.ID, providersConfigured, ) diff --git a/pkg/providers/octoml/chat.go b/pkg/providers/octoml/chat.go index 29ca6b7d..4860a0b9 100644 --- a/pkg/providers/octoml/chat.go +++ b/pkg/providers/octoml/chat.go @@ -9,6 +9,8 @@ import ( "net/http" "time" + "glide/pkg/providers/openai" + "glide/pkg/providers/clients" "glide/pkg/api/schemas" @@ -47,7 +49,7 @@ func NewChatRequestFromConfig(cfg *Config) *ChatRequest { } } -func NewChatMessagesFromUnifiedRequest(request *schemas.UnifiedChatRequest) []ChatMessage { +func NewChatMessagesFromUnifiedRequest(request *schemas.ChatRequest) []ChatMessage { messages := make([]ChatMessage, 0, len(request.MessageHistory)+1) // Add items from messageHistory first and the new chat message last @@ -61,7 +63,7 @@ func NewChatMessagesFromUnifiedRequest(request *schemas.UnifiedChatRequest) []Ch } // Chat sends a chat request to the specified octoml model. -func (c *Client) Chat(ctx context.Context, request *schemas.UnifiedChatRequest) (*schemas.UnifiedChatResponse, error) { +func (c *Client) Chat(ctx context.Context, request *schemas.ChatRequest) (*schemas.ChatResponse, error) { // Create a new chat request chatRequest := c.createChatRequestSchema(request) @@ -77,7 +79,7 @@ func (c *Client) Chat(ctx context.Context, request *schemas.UnifiedChatRequest) return chatResponse, nil } -func (c *Client) createChatRequestSchema(request *schemas.UnifiedChatRequest) *ChatRequest { +func (c *Client) createChatRequestSchema(request *schemas.ChatRequest) *ChatRequest { // TODO: consider using objectpool to optimize memory allocation chatRequest := c.chatRequestTemplate // hoping to get a copy of the template chatRequest.Messages = NewChatMessagesFromUnifiedRequest(request) @@ -85,7 +87,7 @@ func (c *Client) createChatRequestSchema(request *schemas.UnifiedChatRequest) *C return chatRequest } -func (c *Client) doChatRequest(ctx context.Context, payload *ChatRequest) (*schemas.UnifiedChatResponse, error) { +func (c *Client) doChatRequest(ctx context.Context, payload *ChatRequest) (*schemas.ChatResponse, error) { // Build request payload rawPayload, err := json.Marshal(payload) if err != nil { @@ -152,7 +154,7 @@ func (c *Client) doChatRequest(ctx context.Context, payload *ChatRequest) (*sche } // Parse the response JSON - var openAICompletion schemas.OpenAIChatCompletion // Octo uses the same response schema as OpenAI + var openAICompletion openai.ChatCompletion // Octo uses the same response schema as OpenAI err = json.Unmarshal(bodyBytes, &openAICompletion) if err != nil { @@ -161,7 +163,7 @@ func (c *Client) doChatRequest(ctx context.Context, payload *ChatRequest) (*sche } // Map response to UnifiedChatResponse schema - response := schemas.UnifiedChatResponse{ + response := schemas.ChatResponse{ ID: openAICompletion.ID, Created: openAICompletion.Created, Provider: providerName, diff --git a/pkg/providers/octoml/client_test.go b/pkg/providers/octoml/client_test.go index 1c5c7e63..c8a438c1 100644 --- a/pkg/providers/octoml/client_test.go +++ b/pkg/providers/octoml/client_test.go @@ -55,7 +55,7 @@ func TestOctoMLClient_ChatRequest(t *testing.T) { client, err := NewClient(providerCfg, clientCfg, telemetry.NewTelemetryMock()) require.NoError(t, err) - request := schemas.UnifiedChatRequest{Message: schemas.ChatMessage{ + request := schemas.ChatRequest{Message: schemas.ChatMessage{ Role: "human", Content: "What's the biggest animal?", }} @@ -88,7 +88,7 @@ func TestOctoMLClient_Chat_Error(t *testing.T) { require.NoError(t, err) // Create a chat request - request := schemas.UnifiedChatRequest{ + request := schemas.ChatRequest{ Message: schemas.ChatMessage{ Role: "human", Content: "What's the biggest animal?", diff --git a/pkg/providers/ollama/chat.go b/pkg/providers/ollama/chat.go new file mode 100644 index 00000000..f2247dd7 --- /dev/null +++ b/pkg/providers/ollama/chat.go @@ -0,0 +1,207 @@ +package ollama + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "time" + + "glide/pkg/providers/clients" + + "github.com/google/uuid" + + "glide/pkg/api/schemas" + "go.uber.org/zap" +) + +type ChatMessage struct { + Role string `json:"role"` + Content string `json:"content"` +} + +// ChatRequest is an ollama-specific request schema +type ChatRequest struct { + Model string `json:"model"` + Messages []ChatMessage `json:"messages"` + Microstat int `json:"microstat,omitempty"` + MicrostatEta float64 `json:"microstat_eta,omitempty"` + MicrostatTau float64 `json:"microstat_tau,omitempty"` + NumCtx int `json:"num_ctx,omitempty"` + NumGqa int `json:"num_gqa,omitempty"` + NumGpu int `json:"num_gpu,omitempty"` + NumThread int `json:"num_thread,omitempty"` + RepeatLastN int `json:"repeat_last_n,omitempty"` + Temperature float64 `json:"temperature,omitempty"` + Seed int `json:"seed,omitempty"` + StopWords []string `json:"stop,omitempty"` + Tfsz float64 `json:"tfs_z,omitempty"` + NumPredict int `json:"num_predict,omitempty"` + TopK int `json:"top_k,omitempty"` + TopP float64 `json:"top_p,omitempty"` + Stream bool `json:"stream"` +} + +// NewChatRequestFromConfig fills the struct from the config. Not using reflection because of performance penalty it gives +func NewChatRequestFromConfig(cfg *Config) *ChatRequest { + return &ChatRequest{ + Model: cfg.Model, + Temperature: cfg.DefaultParams.Temperature, + Microstat: cfg.DefaultParams.Microstat, + MicrostatEta: cfg.DefaultParams.MicrostatEta, + MicrostatTau: cfg.DefaultParams.MicrostatTau, + NumCtx: cfg.DefaultParams.NumCtx, + NumGqa: cfg.DefaultParams.NumGqa, + NumGpu: cfg.DefaultParams.NumGpu, + NumThread: cfg.DefaultParams.NumThread, + RepeatLastN: cfg.DefaultParams.RepeatLastN, + Seed: cfg.DefaultParams.Seed, + StopWords: cfg.DefaultParams.StopWords, + Tfsz: cfg.DefaultParams.Tfsz, + NumPredict: cfg.DefaultParams.NumPredict, + TopP: cfg.DefaultParams.TopP, + TopK: cfg.DefaultParams.TopK, + Stream: cfg.DefaultParams.Stream, + } +} + +func NewChatMessagesFromUnifiedRequest(request *schemas.ChatRequest) []ChatMessage { + messages := make([]ChatMessage, 0, len(request.MessageHistory)+1) + + // Add items from messageHistory first and the new chat message last + for _, message := range request.MessageHistory { + messages = append(messages, ChatMessage{Role: message.Role, Content: message.Content}) + } + + messages = append(messages, ChatMessage{Role: request.Message.Role, Content: request.Message.Content}) + + return messages +} + +// Chat sends a chat request to the specified ollama model. +func (c *Client) Chat(ctx context.Context, request *schemas.ChatRequest) (*schemas.ChatResponse, error) { + // Create a new chat request + chatRequest := c.createChatRequestSchema(request) + + chatResponse, err := c.doChatRequest(ctx, chatRequest) + if err != nil { + return nil, fmt.Errorf("chat request failed: %w", err) + } + + if len(chatResponse.ModelResponse.Message.Content) == 0 { + return nil, ErrEmptyResponse + } + + return chatResponse, nil +} + +func (c *Client) createChatRequestSchema(request *schemas.ChatRequest) *ChatRequest { + // TODO: consider using objectpool to optimize memory allocation + chatRequest := c.chatRequestTemplate // hoping to get a copy of the template + chatRequest.Messages = NewChatMessagesFromUnifiedRequest(request) + + return chatRequest +} + +func (c *Client) doChatRequest(ctx context.Context, payload *ChatRequest) (*schemas.ChatResponse, error) { + // Build request payload + rawPayload, err := json.Marshal(payload) + if err != nil { + return nil, fmt.Errorf("unable to marshal ollama chat request payload: %w", err) + } + + req, err := http.NewRequestWithContext(ctx, http.MethodPost, c.chatURL, bytes.NewBuffer(rawPayload)) + if err != nil { + return nil, fmt.Errorf("unable to create ollama chat request: %w", err) + } + + req.Header.Set("Content-Type", "application/json") + + // TODO: this could leak information from messages which may not be a desired thing to have + c.telemetry.Logger.Debug( + "ollama chat request", + zap.String("chat_url", c.chatURL), + zap.Any("payload", payload), + ) + + resp, err := c.httpClient.Do(req) + if err != nil { + return nil, fmt.Errorf("failed to send ollama chat request: %w", err) + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + bodyBytes, err := io.ReadAll(resp.Body) + if err != nil { + c.telemetry.Logger.Error("failed to read ollama chat response", zap.Error(err)) + } + + c.telemetry.Logger.Error( + "ollama chat request failed", + zap.Int("status_code", resp.StatusCode), + zap.String("response", string(bodyBytes)), + zap.Any("headers", resp.Header), + ) + + if resp.StatusCode == http.StatusTooManyRequests { + // Read the value of the "Retry-After" header to get the cooldown delay + retryAfter := resp.Header.Get("Retry-After") + + // Parse the value to get the duration + cooldownDelay, err := time.ParseDuration(retryAfter) + if err != nil { + return nil, fmt.Errorf("failed to parse cooldown delay from headers: %w", err) + } + + return nil, clients.NewRateLimitError(&cooldownDelay) + } + + // Server & client errors result in the same error to keep gateway resilient + return nil, clients.ErrProviderUnavailable + } + + // Read the response body into a byte slice + bodyBytes, err := io.ReadAll(resp.Body) + if err != nil { + c.telemetry.Logger.Error("failed to read ollama chat response", zap.Error(err)) + return nil, err + } + + // Parse the response JSON + var ollamaCompletion ChatCompletion + + err = json.Unmarshal(bodyBytes, &ollamaCompletion) + if err != nil { + c.telemetry.Logger.Error("failed to parse ollama chat response", zap.Error(err)) + return nil, err + } + + // Map response to UnifiedChatResponse schema + response := schemas.ChatResponse{ + ID: uuid.NewString(), + Created: int(time.Now().Unix()), + Provider: providerName, + Model: ollamaCompletion.Model, + Cached: false, + ModelResponse: schemas.ProviderResponse{ + SystemID: map[string]string{ + "system_fingerprint": "", + }, + Message: schemas.ChatMessage{ + Role: ollamaCompletion.Message.Role, + Content: ollamaCompletion.Message.Content, + Name: "", + }, + TokenUsage: schemas.TokenUsage{ + PromptTokens: float64(ollamaCompletion.EvalCount), + ResponseTokens: float64(ollamaCompletion.EvalCount), + TotalTokens: float64(ollamaCompletion.EvalCount), + }, + }, + } + + return &response, nil +} diff --git a/pkg/providers/ollama/client.go b/pkg/providers/ollama/client.go new file mode 100644 index 00000000..00043025 --- /dev/null +++ b/pkg/providers/ollama/client.go @@ -0,0 +1,59 @@ +package ollama + +import ( + "errors" + "net/http" + "net/url" + + "glide/pkg/providers/clients" + "glide/pkg/telemetry" +) + +const ( + providerName = "ollama" +) + +// ErrEmptyResponse is returned when the OpenAI API returns an empty response. +var ( + ErrEmptyResponse = errors.New("empty response") +) + +// Client is a client for accessing OpenAI API +type Client struct { + baseURL string + chatURL string + chatRequestTemplate *ChatRequest + config *Config + httpClient *http.Client + telemetry *telemetry.Telemetry +} + +// NewClient creates a new OpenAI client for the OpenAI API. +func NewClient(providerConfig *Config, clientConfig *clients.ClientConfig, tel *telemetry.Telemetry) (*Client, error) { + chatURL, err := url.JoinPath(providerConfig.BaseURL, providerConfig.ChatEndpoint) + if err != nil { + return nil, err + } + + c := &Client{ + baseURL: providerConfig.BaseURL, + chatURL: chatURL, + config: providerConfig, + chatRequestTemplate: NewChatRequestFromConfig(providerConfig), + httpClient: &http.Client{ + Timeout: *clientConfig.Timeout, + // TODO: use values from the config + Transport: &http.Transport{ + MaxIdleConns: 100, + MaxIdleConnsPerHost: 2, + }, + }, + telemetry: tel, + } + + return c, nil +} + +func (c *Client) Provider() string { + return providerName +} diff --git a/pkg/providers/ollama/client_test.go b/pkg/providers/ollama/client_test.go new file mode 100644 index 00000000..3a85d397 --- /dev/null +++ b/pkg/providers/ollama/client_test.go @@ -0,0 +1,128 @@ +package ollama + +import ( + "context" + "encoding/json" + "io" + "net/http" + "net/http/httptest" + "os" + "path/filepath" + "testing" + + "glide/pkg/providers/clients" + + "glide/pkg/api/schemas" + + "glide/pkg/telemetry" + + "github.com/stretchr/testify/require" +) + +func TestOllamaClient_ChatRequest(t *testing.T) { + OllamaAIMock := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + rawPayload, _ := io.ReadAll(r.Body) + + var data interface{} + // Parse the JSON body + err := json.Unmarshal(rawPayload, &data) + if err != nil { + t.Errorf("error decoding payload (%q): %v", string(rawPayload), err) + } + + chatResponse, err := os.ReadFile(filepath.Clean("./testdata/chat.success.json")) + if err != nil { + t.Errorf("error reading ollama chat mock response: %v", err) + } + + w.Header().Set("Content-Type", "application/json") + + _, err = w.Write(chatResponse) + if err != nil { + t.Errorf("error on sending chat response: %v", err) + } + }) + + OllamaServer := httptest.NewServer(OllamaAIMock) + defer OllamaServer.Close() + + ctx := context.Background() + providerCfg := DefaultConfig() + + clientCfg := clients.DefaultClientConfig() + + providerCfg.Model = "llama2" + + client, err := NewClient(providerCfg, clientCfg, telemetry.NewTelemetryMock()) + require.NoError(t, err) + + request := schemas.ChatRequest{Message: schemas.ChatMessage{ + Role: "user", + Content: "What's the biggest animal?", + }} + + _, err = client.Chat(ctx, &request) + + // require.NoError(t, err) + + require.Error(t, err) + require.Contains(t, err.Error(), "chat request failed") +} + +func TestOllamaClient_ChatRequest_Non200Response(t *testing.T) { + // Create a mock HTTP server that returns a non-OK status code + mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusBadRequest) + })) + + defer mockServer.Close() + + // Create a new client with the mock server URL + client := &Client{ + httpClient: http.DefaultClient, + chatURL: mockServer.URL, + config: DefaultConfig(), + telemetry: telemetry.NewTelemetryMock(), + } + + // Create a chat request payload + payload := &ChatRequest{ + Messages: []ChatMessage{{Role: "human", Content: "Hello"}}, + } + + // Call the chatRequest function + _, err := client.doChatRequest(context.Background(), payload) + + require.Error(t, err) + require.Contains(t, err.Error(), "provider is not available") +} + +func TestOllamaClient_ChatRequest_SuccessfulResponse(t *testing.T) { + // Create a mock HTTP server that returns an OK status code and a sample response + mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte(`{"response": "OK"}`)) + })) + + defer mockServer.Close() + + // Create a new client with the mock server URL + client := &Client{ + httpClient: http.DefaultClient, + chatURL: mockServer.URL, + config: DefaultConfig(), + telemetry: telemetry.NewTelemetryMock(), + } + + // Create a chat request payload + payload := &ChatRequest{ + Messages: []ChatMessage{{Role: "human", Content: "Hello"}}, + } + + // Call the chatRequest function + response, err := client.doChatRequest(context.Background(), payload) + + require.NoError(t, err) + require.NotNil(t, response) + require.Equal(t, "", response.ModelResponse.Message.Role) +} diff --git a/pkg/providers/ollama/config.go b/pkg/providers/ollama/config.go new file mode 100644 index 00000000..7363db58 --- /dev/null +++ b/pkg/providers/ollama/config.go @@ -0,0 +1,67 @@ +package ollama + +// Params defines Ollmama-specific model params with the specific validation of values +// TODO: Add validations +type Params struct { + Temperature float64 `yaml:"temperature,omitempty" json:"temperature"` + TopP float64 `yaml:"top_p,omitempty" json:"top_p"` + Microstat int `yaml:"microstat,omitempty" json:"microstat"` + MicrostatEta float64 `yaml:"microstat_eta,omitempty" json:"microstat_eta"` + MicrostatTau float64 `yaml:"microstat_tau,omitempty" json:"microstat_tau"` + NumCtx int `yaml:"num_ctx,omitempty" json:"num_ctx"` + NumGqa int `yaml:"num_gqa,omitempty" json:"num_gqa"` + NumGpu int `yaml:"num_gpu,omitempty" json:"num_gpu"` + NumThread int `yaml:"num_thread,omitempty" json:"num_thread"` + RepeatLastN int `yaml:"repeat_last_n,omitempty" json:"repeat_last_n"` + Seed int `yaml:"seed,omitempty" json:"seed"` + StopWords []string `yaml:"stop,omitempty" json:"stop"` + Tfsz float64 `yaml:"tfs_z,omitempty" json:"tfs_z"` + NumPredict int `yaml:"num_predict,omitempty" json:"num_predict"` + TopK int `yaml:"top_k,omitempty" json:"top_k"` + Stream bool `yaml:"stream,omitempty" json:"stream"` +} + +func DefaultParams() Params { + return Params{ + Temperature: 0.8, + NumCtx: 2048, + TopP: 0.9, + TopK: 40, + Stream: false, + } +} + +func (p *Params) UnmarshalYAML(unmarshal func(interface{}) error) error { + *p = DefaultParams() + + type plain Params // to avoid recursion + + return unmarshal((*plain)(p)) +} + +type Config struct { + BaseURL string `yaml:"baseUrl" json:"baseUrl" validate:"required"` + ChatEndpoint string `yaml:"chatEndpoint" json:"chatEndpoint" validate:"required"` + Model string `yaml:"model" json:"model" validate:"required"` + DefaultParams *Params `yaml:"defaultParams,omitempty" json:"defaultParams"` +} + +// DefaultConfig for OpenAI models +func DefaultConfig() *Config { + defaultParams := DefaultParams() + + return &Config{ + BaseURL: "http://localhost:11434", + ChatEndpoint: "/api/chat", + Model: "", + DefaultParams: &defaultParams, + } +} + +func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error { + *c = *DefaultConfig() + + type plain Config // to avoid recursion + + return unmarshal((*plain)(c)) +} diff --git a/pkg/providers/ollama/schemas.go b/pkg/providers/ollama/schemas.go new file mode 100644 index 00000000..39311c0f --- /dev/null +++ b/pkg/providers/ollama/schemas.go @@ -0,0 +1,17 @@ +package ollama + +type ChatCompletion struct { + Model string `json:"model"` + CreatedAt string `json:"created_at"` + Message struct { + Role string `json:"role"` + Content string `json:"content"` + } `json:"message"` + Done bool `json:"done"` + TotalDuration int64 `json:"total_duration"` + LoadDuration int64 `json:"load_duration"` + PromptEvalCount int `json:"prompt_eval_count,omitempty"` + PromptEvalDuration int64 `json:"prompt_eval_duration"` + EvalCount int `json:"eval_count"` + EvalDuration int64 `json:"eval_duration"` +} diff --git a/pkg/providers/ollama/testdata/chat.req.json b/pkg/providers/ollama/testdata/chat.req.json new file mode 100644 index 00000000..8af17718 --- /dev/null +++ b/pkg/providers/ollama/testdata/chat.req.json @@ -0,0 +1,11 @@ +{ + "model": "llama2", + "messages": [ + { + "role": "human", + "content": "What's the biggest animal?" + } + ], + "temperature": 0.8, + "stream": false +} diff --git a/pkg/providers/ollama/testdata/chat.success.json b/pkg/providers/ollama/testdata/chat.success.json new file mode 100644 index 00000000..0a674356 --- /dev/null +++ b/pkg/providers/ollama/testdata/chat.success.json @@ -0,0 +1,15 @@ +{ + "model": "registry.ollama.ai/library/llama2:latest", + "created_at": "2023-12-12T14:13:43.416799Z", + "message": { + "role": "assistant", + "content": "Hello! How are you today?" + }, + "done": true, + "total_duration": 5191566416, + "load_duration": 2154458, + "prompt_eval_count": 26, + "prompt_eval_duration": 383809000, + "eval_count": 298, + "eval_duration": 4799921000 +} \ No newline at end of file diff --git a/pkg/providers/openai/chat.go b/pkg/providers/openai/chat.go index c296c080..bbcc4ff4 100644 --- a/pkg/providers/openai/chat.go +++ b/pkg/providers/openai/chat.go @@ -61,7 +61,7 @@ func NewChatRequestFromConfig(cfg *Config) *ChatRequest { } } -func NewChatMessagesFromUnifiedRequest(request *schemas.UnifiedChatRequest) []ChatMessage { +func NewChatMessagesFromUnifiedRequest(request *schemas.ChatRequest) []ChatMessage { messages := make([]ChatMessage, 0, len(request.MessageHistory)+1) // Add items from messageHistory first and the new chat message last @@ -75,7 +75,7 @@ func NewChatMessagesFromUnifiedRequest(request *schemas.UnifiedChatRequest) []Ch } // Chat sends a chat request to the specified OpenAI model. -func (c *Client) Chat(ctx context.Context, request *schemas.UnifiedChatRequest) (*schemas.UnifiedChatResponse, error) { +func (c *Client) Chat(ctx context.Context, request *schemas.ChatRequest) (*schemas.ChatResponse, error) { // Create a new chat request chatRequest := c.createChatRequestSchema(request) @@ -91,7 +91,7 @@ func (c *Client) Chat(ctx context.Context, request *schemas.UnifiedChatRequest) return chatResponse, nil } -func (c *Client) createChatRequestSchema(request *schemas.UnifiedChatRequest) *ChatRequest { +func (c *Client) createChatRequestSchema(request *schemas.ChatRequest) *ChatRequest { // TODO: consider using objectpool to optimize memory allocation chatRequest := c.chatRequestTemplate // hoping to get a copy of the template chatRequest.Messages = NewChatMessagesFromUnifiedRequest(request) @@ -99,7 +99,7 @@ func (c *Client) createChatRequestSchema(request *schemas.UnifiedChatRequest) *C return chatRequest } -func (c *Client) doChatRequest(ctx context.Context, payload *ChatRequest) (*schemas.UnifiedChatResponse, error) { +func (c *Client) doChatRequest(ctx context.Context, payload *ChatRequest) (*schemas.ChatResponse, error) { // Build request payload rawPayload, err := json.Marshal(payload) if err != nil { @@ -166,7 +166,7 @@ func (c *Client) doChatRequest(ctx context.Context, payload *ChatRequest) (*sche } // Parse the response JSON - var openAICompletion schemas.OpenAIChatCompletion + var openAICompletion ChatCompletion err = json.Unmarshal(bodyBytes, &openAICompletion) if err != nil { @@ -174,8 +174,8 @@ func (c *Client) doChatRequest(ctx context.Context, payload *ChatRequest) (*sche return nil, err } - // Map response to UnifiedChatResponse schema - response := schemas.UnifiedChatResponse{ + // Map response to ChatResponse schema + response := schemas.ChatResponse{ ID: openAICompletion.ID, Created: openAICompletion.Created, Provider: providerName, diff --git a/pkg/providers/openai/client.go b/pkg/providers/openai/client.go index 7a825cd5..c56f227b 100644 --- a/pkg/providers/openai/client.go +++ b/pkg/providers/openai/client.go @@ -9,10 +9,6 @@ import ( "glide/pkg/telemetry" ) -// TODO: Explore resource pooling -// TODO: Optimize Type use -// TODO: Explore Hertz TLS & resource pooling - const ( providerName = "openai" ) diff --git a/pkg/providers/openai/client_test.go b/pkg/providers/openai/client_test.go index f8ca7e6a..6bd8298d 100644 --- a/pkg/providers/openai/client_test.go +++ b/pkg/providers/openai/client_test.go @@ -56,8 +56,8 @@ func TestOpenAIClient_ChatRequest(t *testing.T) { client, err := NewClient(providerCfg, clientCfg, telemetry.NewTelemetryMock()) require.NoError(t, err) - request := schemas.UnifiedChatRequest{Message: schemas.ChatMessage{ - Role: "human", + request := schemas.ChatRequest{Message: schemas.ChatMessage{ + Role: "user", Content: "What's the biggest animal?", }} diff --git a/pkg/providers/openai/schemas.go b/pkg/providers/openai/schemas.go new file mode 100644 index 00000000..cf41aebf --- /dev/null +++ b/pkg/providers/openai/schemas.go @@ -0,0 +1,26 @@ +package openai + +// OpenAI Chat Response (also used by Azure OpenAI and OctoML) + +type ChatCompletion struct { + ID string `json:"id"` + Object string `json:"object"` + Created int `json:"created"` + Model string `json:"model"` + SystemFingerprint string `json:"system_fingerprint"` + Choices []Choice `json:"choices"` + Usage Usage `json:"usage"` +} + +type Choice struct { + Index int `json:"index"` + Message ChatMessage `json:"message"` + Logprobs interface{} `json:"logprobs"` + FinishReason string `json:"finish_reason"` +} + +type Usage struct { + PromptTokens float64 `json:"prompt_tokens"` + CompletionTokens float64 `json:"completion_tokens"` + TotalTokens float64 `json:"total_tokens"` +} diff --git a/pkg/providers/provider.go b/pkg/providers/provider.go index 4a3774b2..399d6ee7 100644 --- a/pkg/providers/provider.go +++ b/pkg/providers/provider.go @@ -15,7 +15,7 @@ import ( // LangModelProvider defines an interface a provider should fulfill to be able to serve language chat requests type LangModelProvider interface { Provider() string - Chat(ctx context.Context, request *schemas.UnifiedChatRequest) (*schemas.UnifiedChatResponse, error) + Chat(ctx context.Context, request *schemas.ChatRequest) (*schemas.ChatResponse, error) } type Model interface { @@ -78,7 +78,7 @@ func (m *LangModel) Weight() int { return m.weight } -func (m *LangModel) Chat(ctx context.Context, request *schemas.UnifiedChatRequest) (*schemas.UnifiedChatResponse, error) { +func (m *LangModel) Chat(ctx context.Context, request *schemas.ChatRequest) (*schemas.ChatResponse, error) { startedAt := time.Now() resp, err := m.client.Chat(ctx, request) diff --git a/pkg/providers/testing.go b/pkg/providers/testing.go index f408380c..890421a0 100644 --- a/pkg/providers/testing.go +++ b/pkg/providers/testing.go @@ -14,8 +14,8 @@ type ResponseMock struct { Err *error } -func (m *ResponseMock) Resp() *schemas.UnifiedChatResponse { - return &schemas.UnifiedChatResponse{ +func (m *ResponseMock) Resp() *schemas.ChatResponse { + return &schemas.ChatResponse{ ID: "rsp0001", ModelResponse: schemas.ProviderResponse{ SystemID: map[string]string{ @@ -40,7 +40,7 @@ func NewProviderMock(responses []ResponseMock) *ProviderMock { } } -func (c *ProviderMock) Chat(_ context.Context, _ *schemas.UnifiedChatRequest) (*schemas.UnifiedChatResponse, error) { +func (c *ProviderMock) Chat(_ context.Context, _ *schemas.ChatRequest) (*schemas.ChatResponse, error) { response := c.responses[c.idx] c.idx++ diff --git a/pkg/routers/router.go b/pkg/routers/router.go index c2149c7a..13d89fa3 100644 --- a/pkg/routers/router.go +++ b/pkg/routers/router.go @@ -55,7 +55,7 @@ func (r *LangRouter) ID() string { return r.routerID } -func (r *LangRouter) Chat(ctx context.Context, request *schemas.UnifiedChatRequest) (*schemas.UnifiedChatResponse, error) { +func (r *LangRouter) Chat(ctx context.Context, request *schemas.ChatRequest) (*schemas.ChatResponse, error) { if len(r.models) == 0 { return nil, ErrNoModels }