From 75910d2923360c233e1ef210fbe10200c8344f0b Mon Sep 17 00:00:00 2001 From: Pao Sheng Date: Fri, 15 Nov 2024 20:45:28 +0800 Subject: [PATCH] chore(wren-ai-service): separate the api key for each LLM and embedder (#917) --- .../base/deploy-wren-ai-service.yaml | 7 ++++++- .../examples/secret-wren_example.yaml | 1 + docker/.env.example | 6 ++++-- docker/docker-compose-dev.yaml | 6 ++++-- docker/docker-compose.yaml | 6 ++++-- .../src/providers/embedder/azure_openai.py | 3 +-- wren-ai-service/src/providers/embedder/openai.py | 3 +-- .../src/providers/llm/azure_openai.py | 3 +-- wren-ai-service/src/providers/llm/openai.py | 2 +- wren-ai-service/tools/config/.env.dev.example | 6 ++++-- wren-launcher/utils/docker.go | 16 +++++++++------- 11 files changed, 36 insertions(+), 23 deletions(-) diff --git a/deployment/kustomizations/base/deploy-wren-ai-service.yaml b/deployment/kustomizations/base/deploy-wren-ai-service.yaml index b1729f5bb..928bac05b 100644 --- a/deployment/kustomizations/base/deploy-wren-ai-service.yaml +++ b/deployment/kustomizations/base/deploy-wren-ai-service.yaml @@ -24,11 +24,16 @@ spec: configMapKeyRef: name: wren-config key: WREN_AI_SERVICE_PORT - - name: OPENAI_API_KEY + - name: LLM_OPENAI_API_KEY valueFrom: secretKeyRef: name: wrenai-secrets key: LLM_OPENAI_API_KEY + - name: EMBEDDER_OPENAI_API_KEY + valueFrom: + secretKeyRef: + name: wrenai-secrets + key: EMBEDDER_OPENAI_API_KEY - name: QDRANT_HOST valueFrom: configMapKeyRef: diff --git a/deployment/kustomizations/examples/secret-wren_example.yaml b/deployment/kustomizations/examples/secret-wren_example.yaml index 1249ba6e0..366ba4aae 100644 --- a/deployment/kustomizations/examples/secret-wren_example.yaml +++ b/deployment/kustomizations/examples/secret-wren_example.yaml @@ -7,6 +7,7 @@ type: Opaque data: # LLM_OPENAI_API_KEY and EMBEDDER_OPENAI_API_KEY are REQUIRED: without a valid key the wren-ai-service-deployment pod will not start LLM_OPENAI_API_KEY: UkVRVUlSRUQ6IHNrLXByb2otYWxsLWFjY2Vzcy1wbGFjZWhvbGRlci00LXdyZW4tYWktc2VydmljZS1kZXBsb3ltZW50 + EMBEDDER_OPENAI_API_KEY: UkVRVUlSRUQ6IHNrLXByb2otYWxsLWFjY2Vzcy1wbGFjZWhvbGRlci00LXdyZW4tYWktc2VydmljZS1kZXBsb3ltZW50 # Azure openai env AZURE_CHAT_BASE: bi9h diff --git a/docker/.env.example b/docker/.env.example index ec0a59749..5f66a5e0f 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -18,8 +18,10 @@ QDRANT_HOST=qdrant SHOULD_FORCE_DEPLOY=1 # vendor keys -OPENAI_API_KEY= -AZURE_OPENAI_API_KEY= +LLM_OPENAI_API_KEY= +EMBEDDER_OPENAI_API_KEY= +LLM_AZURE_OPENAI_API_KEY= +EMBEDDER_AZURE_OPENAI_API_KEY= QDRANT_API_KEY= # version diff --git a/docker/docker-compose-dev.yaml b/docker/docker-compose-dev.yaml index 3478af8ee..b58ffb0db 100644 --- a/docker/docker-compose-dev.yaml +++ b/docker/docker-compose-dev.yaml @@ -44,8 +44,10 @@ services: WREN_UI_PORT: ${WREN_UI_PORT} QDRANT_HOST: ${QDRANT_HOST} WREN_UI_ENDPOINT: ${WREN_UI_ENDPOINT} - OPENAI_API_KEY: ${OPENAI_API_KEY} - AZURE_OPENAI_API_KEY: ${AZURE_OPENAI_API_KEY} + LLM_OPENAI_API_KEY: ${LLM_OPENAI_API_KEY} + EMBEDDER_OPENAI_API_KEY: ${EMBEDDER_OPENAI_API_KEY} + LLM_AZURE_OPENAI_API_KEY: ${LLM_AZURE_OPENAI_API_KEY} + EMBEDDER_AZURE_OPENAI_API_KEY: ${EMBEDDER_AZURE_OPENAI_API_KEY} QDRANT_API_KEY: ${QDRANT_API_KEY} SHOULD_FORCE_DEPLOY: ${SHOULD_FORCE_DEPLOY} # sometimes the console won't show print messages, diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index a710ba81f..787985f92 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -56,8 +56,10 @@ services: WREN_UI_PORT: ${WREN_UI_PORT} QDRANT_HOST: ${QDRANT_HOST} WREN_UI_ENDPOINT: http://wren-ui:${WREN_UI_PORT} - OPENAI_API_KEY: ${OPENAI_API_KEY} - AZURE_OPENAI_API_KEY: ${AZURE_OPENAI_API_KEY} + LLM_OPENAI_API_KEY: ${LLM_OPENAI_API_KEY} + EMBEDDER_OPENAI_API_KEY: ${EMBEDDER_OPENAI_API_KEY} + LLM_AZURE_OPENAI_API_KEY: ${LLM_AZURE_OPENAI_API_KEY} + EMBEDDER_AZURE_OPENAI_API_KEY: ${EMBEDDER_AZURE_OPENAI_API_KEY} QDRANT_API_KEY: ${QDRANT_API_KEY} SHOULD_FORCE_DEPLOY: ${SHOULD_FORCE_DEPLOY} # sometimes the console won't show print messages, diff --git a/wren-ai-service/src/providers/embedder/azure_openai.py b/wren-ai-service/src/providers/embedder/azure_openai.py index f20a6e86d..a7b38c5b8 100644 --- a/wren-ai-service/src/providers/embedder/azure_openai.py +++ b/wren-ai-service/src/providers/embedder/azure_openai.py @@ -195,8 +195,7 @@ class AsyncDocumentEmbedder(AzureOpenAIDocumentEmbedder): class AzureOpenAIEmbedderProvider(EmbedderProvider): def __init__( self, - api_key: Secret = Secret.from_env_var("AZURE_OPENAI_API_KEY") - or Secret.from_env_var("EMBEDDER_AZURE_OPENAI_API_KEY"), + api_key: Secret = Secret.from_env_var("EMBEDDER_AZURE_OPENAI_API_KEY"), api_base: str = os.getenv("EMBEDDER_AZURE_OPENAI_API_BASE"), api_version: str = os.getenv("EMBEDDER_AZURE_OPENAI_VERSION"), model: str = os.getenv("EMBEDDING_MODEL") or EMBEDDING_MODEL, diff --git a/wren-ai-service/src/providers/embedder/openai.py b/wren-ai-service/src/providers/embedder/openai.py index a9e54da08..e22905f82 100644 --- a/wren-ai-service/src/providers/embedder/openai.py +++ b/wren-ai-service/src/providers/embedder/openai.py @@ -183,8 +183,7 @@ class AsyncDocumentEmbedder(OpenAIDocumentEmbedder): class OpenAIEmbedderProvider(EmbedderProvider): def __init__( self, - api_key: str = os.getenv("OPENAI_API_KEY") - or os.getenv("EMBEDDER_OPENAI_API_KEY"), + api_key: str = os.getenv("EMBEDDER_OPENAI_API_KEY"), api_base: str = os.getenv("EMBEDDER_OPENAI_API_BASE") or EMBEDDER_OPENAI_API_BASE, model: str = os.getenv("EMBEDDING_MODEL") or EMBEDDING_MODEL, diff --git a/wren-ai-service/src/providers/llm/azure_openai.py b/wren-ai-service/src/providers/llm/azure_openai.py index 32e98097b..e42a3f336 100644 --- a/wren-ai-service/src/providers/llm/azure_openai.py +++ b/wren-ai-service/src/providers/llm/azure_openai.py @@ -125,8 +125,7 @@ class AsyncGenerator(AzureOpenAIGenerator): class AzureOpenAILLMProvider(LLMProvider): def __init__( self, - api_key: Secret = Secret.from_env_var("AZURE_OPENAI_API_KEY") - or Secret.from_env_var("LLM_AZURE_OPENAI_API_KEY"), + api_key: Secret = Secret.from_env_var("LLM_AZURE_OPENAI_API_KEY"), api_base: str = os.getenv("LLM_AZURE_OPENAI_API_BASE"), api_version: str = os.getenv("LLM_AZURE_OPENAI_VERSION"), model: str = os.getenv("GENERATION_MODEL") or GENERATION_MODEL, diff --git a/wren-ai-service/src/providers/llm/openai.py b/wren-ai-service/src/providers/llm/openai.py index 5cc5f8064..e1bed43a7 100644 --- a/wren-ai-service/src/providers/llm/openai.py +++ b/wren-ai-service/src/providers/llm/openai.py @@ -157,7 +157,7 @@ class AsyncGenerator(OpenAIGenerator): class OpenAILLMProvider(LLMProvider): def __init__( self, - api_key: str = os.getenv("OPENAI_API_KEY") or os.getenv("LLM_OPENAI_API_KEY"), + api_key: str = os.getenv("LLM_OPENAI_API_KEY"), api_base: str = os.getenv("LLM_OPENAI_API_BASE") or LLM_OPENAI_API_BASE, model: str = os.getenv("GENERATION_MODEL") or GENERATION_MODEL, kwargs: Dict[str, Any] = ( diff --git a/wren-ai-service/tools/config/.env.dev.example b/wren-ai-service/tools/config/.env.dev.example index e20c63f11..baf0b45cb 100644 --- a/wren-ai-service/tools/config/.env.dev.example +++ b/wren-ai-service/tools/config/.env.dev.example @@ -1,8 +1,10 @@ CONFIG_PATH=config.yaml # vendor keys -OPENAI_API_KEY= -AZURE_OPENAI_API_KEY= +LLM_OPENAI_API_KEY= +LLM_AZURE_OPENAI_API_KEY= +EMBEDDER_OPENAI_API_KEY= +EMBEDDER_AZURE_OPENAI_API_KEY= QDRANT_API_KEY= # langfuse key diff --git a/wren-launcher/utils/docker.go b/wren-launcher/utils/docker.go index 0ee13d1ff..63a4e7e94 100644 --- a/wren-launcher/utils/docker.go +++ b/wren-launcher/utils/docker.go @@ -26,8 +26,8 @@ const ( // please change the version when the version is updated WREN_PRODUCT_VERSION string = "0.10.0" DOCKER_COMPOSE_YAML_URL string = "https://raw.githubusercontent.com/Canner/WrenAI/" + WREN_PRODUCT_VERSION + "/docker/docker-compose.yaml" - DOCKER_COMPOSE_ENV_URL string = "https://raw.githubusercontent.com/Canner/WrenAI/" + WREN_PRODUCT_VERSION + "/docker/.env.example" - AI_SERVICE_CONFIG_URL string = "https://raw.githubusercontent.com/Canner/WrenAI/" + WREN_PRODUCT_VERSION + "/docker/config.example.yaml" + DOCKER_COMPOSE_ENV_URL string = "https://raw.githubusercontent.com/Canner/WrenAI/" + WREN_PRODUCT_VERSION + "/docker/.env.example" + AI_SERVICE_CONFIG_URL string = "https://raw.githubusercontent.com/Canner/WrenAI/" + WREN_PRODUCT_VERSION + "/docker/config.example.yaml" ) func replaceEnvFileContent(content string, projectDir string, openaiApiKey string, openAIGenerationModel string, hostPort int, aiPort int, userUUID string, telemetryEnabled bool) string { @@ -39,9 +39,13 @@ func replaceEnvFileContent(content string, projectDir string, openaiApiKey strin reg = regexp.MustCompile(`SHOULD_FORCE_DEPLOY=(.*)`) str = reg.ReplaceAllString(str, "SHOULD_FORCE_DEPLOY=1") - // replace OPENAI_API_KEY - reg = regexp.MustCompile(`(?m)^OPENAI_API_KEY=(.*)`) - str = reg.ReplaceAllString(str, "OPENAI_API_KEY="+openaiApiKey) + // replace LLM_OPENAI_API_KEY + reg = regexp.MustCompile(`LLM_OPENAI_API_KEY=(.*)`) + str = reg.ReplaceAllString(str, "LLM_OPENAI_API_KEY="+openaiApiKey) + + // replace EMBEDDER_OPENAI_API_KEY + reg = regexp.MustCompile(`EMBEDDER_OPENAI_API_KEY=(.*)`) + str = reg.ReplaceAllString(str, "EMBEDDER_OPENAI_API_KEY="+openaiApiKey) // replace GENERATION_MODEL // it seems like using for telemetry to know the model, might be we can remove this in the future and provide a endpoint to get the information @@ -149,8 +153,6 @@ func PrepareConfigFileForOpenAI(projectDir string, generationModel string) error // replace the generation model in config.yaml config := string(content) config = strings.ReplaceAll(config, "openai_llm.gpt-4o-mini", "openai_llm."+generationModel) - // disable the langfuse for starting wren-ai from the launcher - config = strings.ReplaceAll(config, "langfuse_enable: true", "langfuse_enable: false") // write back to config.yaml err = os.WriteFile(configPath, []byte(config), 0644)