diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index aab265f0..f561ce52 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -92,6 +92,7 @@ jobs: git clone https://${{ secrets.GH_PAT }}@github.com/paperdebugger/deploy.git ../deploy - name: Generate kubernetes manifests env: + OPENAI_BASE_URL: ${{ secrets.OPENAI_BASE_URL_PRD }} OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY_PRD }} MCP_BASIC_KEY: ${{ secrets.MCP_BASIC_KEY_PRD }} MCP_PAPERSCORE_KEY: ${{ secrets.MCP_PAPERSCORE_KEY_PRD }} diff --git a/hack/prd.sh b/hack/prd.sh index 4deeb38a..fd8ec9f3 100755 --- a/hack/prd.sh +++ b/hack/prd.sh @@ -5,6 +5,7 @@ set -euxo pipefail ROOT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." &>/dev/null && pwd) cd $ROOT_DIR +OPENAI_BASE_URL=${OPENAI_BASE_URL:-https://api.openai.com/v1} OPENAI_API_KEY=${OPENAI_API_KEY:-sk-dummy-OPENAI_API_KEY} MCP_BASIC_KEY=${MCP_BASIC_KEY:-sk-dummy-MCP_BASIC_KEY} MCP_PAPERSCORE_KEY=${MCP_PAPERSCORE_KEY:-sk-dummy-MCP_PAPERSCORE_KEY} @@ -21,6 +22,7 @@ helm template $ROOT_DIR/helm-chart \ --create-namespace \ --values $ROOT_DIR/helm-chart/values.yaml \ --values $ROOT_DIR/hack/values-prd.yaml \ + --set-string openai_base_url=$OPENAI_BASE_URL \ --set-string openai_api_key=$OPENAI_API_KEY \ --set-string mcp_basic_key=$MCP_BASIC_KEY \ --set-string mcp_paperscore_key=$MCP_PAPERSCORE_KEY \ diff --git a/hack/stg.sh b/hack/stg.sh index 29ec771f..b1a4e111 100755 --- a/hack/stg.sh +++ b/hack/stg.sh @@ -5,6 +5,7 @@ set -euxo pipefail ROOT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." &>/dev/null && pwd) cd $ROOT_DIR +OPENAI_BASE_URL=${OPENAI_BASE_URL:-https://api.openai.com/v1} OPENAI_API_KEY=${OPENAI_API_KEY:-sk-dummy-OPENAI_API_KEY} MCP_BASIC_KEY=${MCP_BASIC_KEY:-sk-dummy-MCP_BASIC_KEY} MCP_PAPERSCORE_KEY=${MCP_PAPERSCORE_KEY:-sk-dummy-MCP_PAPERSCORE_KEY} @@ -21,6 +22,7 @@ helm template $ROOT_DIR/helm-chart \ --create-namespace \ --values $ROOT_DIR/helm-chart/values.yaml \ --values $ROOT_DIR/hack/values-stg.yaml \ + --set-string openai_base_url=$OPENAI_BASE_URL \ --set-string openai_api_key=$OPENAI_API_KEY \ --set-string mcp_basic_key=$MCP_BASIC_KEY \ --set-string mcp_paperscore_key=$MCP_PAPERSCORE_KEY \ diff --git a/helm-chart/templates/paperdebugger.yaml b/helm-chart/templates/paperdebugger.yaml index c835a127..420db2c5 100644 --- a/helm-chart/templates/paperdebugger.yaml +++ b/helm-chart/templates/paperdebugger.yaml @@ -57,6 +57,7 @@ metadata: name: paperdebugger namespace: {{ .Values.namespace }} data: + OPENAI_BASE_URL: "{{ .Values.openai_base_url }}" OPENAI_API_KEY: "{{ .Values.openai_api_key }}" JWT_SIGNING_KEY: "{{ .Values.jwt_signing_key }}" {{ if not .Values.mongo.in_cluster }} diff --git a/helm-chart/values.yaml b/helm-chart/values.yaml index ec104d43..e39b3cf1 100644 --- a/helm-chart/values.yaml +++ b/helm-chart/values.yaml @@ -1,4 +1,5 @@ namespace: paperdebugger-dev +openai_base_url: https://api.openai.com/v1 openai_api_key: sk-dummy-OPENAI_API_KEY jwt_signing_key: paperdebugger ghcr_docker_config: dummy-ghcr-docker-config diff --git a/internal/libs/cfg/cfg.go b/internal/libs/cfg/cfg.go index a13dc416..1293ea40 100644 --- a/internal/libs/cfg/cfg.go +++ b/internal/libs/cfg/cfg.go @@ -7,6 +7,7 @@ import ( ) type Cfg struct { + OpenAIBaseURL string OpenAIAPIKey string JwtSigningKey string @@ -19,6 +20,7 @@ var cfg *Cfg func GetCfg() *Cfg { _ = godotenv.Load() cfg = &Cfg{ + OpenAIBaseURL: openAIBaseURL(), OpenAIAPIKey: os.Getenv("OPENAI_API_KEY"), JwtSigningKey: os.Getenv("JWT_SIGNING_KEY"), MongoURI: mongoURI(), @@ -28,6 +30,14 @@ func GetCfg() *Cfg { return cfg } +func openAIBaseURL() string { + val := os.Getenv("OPENAI_BASE_URL") + if val != "" { + return val + } + return "https://api.openai.com/v1" +} + func xtraMCPURI() string { val := os.Getenv("XTRAMCP_URI") if val != "" { diff --git a/internal/libs/cfg/cfg_test.go b/internal/libs/cfg/cfg_test.go index 131f1809..da88762d 100644 --- a/internal/libs/cfg/cfg_test.go +++ b/internal/libs/cfg/cfg_test.go @@ -10,6 +10,7 @@ import ( func init() { os.Setenv("PD_MONGO_URI", "mongodb://localhost:27017") + os.Setenv("OPENAI_BASE_URL", "https://dummy.openai.com/v1") os.Setenv("OPENAI_API_KEY", "dummy OPENAI_API_KEY for testing") os.Setenv("JWT_SIGNING_KEY", "dummy JWT_SIGNING_KEY for testing") } @@ -22,9 +23,11 @@ func TestCfg(t *testing.T) { assert.NotNil(t, cfg.MongoURI) assert.NotNil(t, cfg.JwtSigningKey) + assert.NotNil(t, cfg.OpenAIBaseURL) assert.NotNil(t, cfg.OpenAIAPIKey) assert.NotEmpty(t, cfg.JwtSigningKey) + assert.NotEmpty(t, cfg.OpenAIBaseURL) assert.NotEmpty(t, cfg.OpenAIAPIKey) assert.NotEmpty(t, cfg.MongoURI) } diff --git a/internal/services/toolkit/client/client.go b/internal/services/toolkit/client/client.go index 504b3179..e6c111da 100644 --- a/internal/services/toolkit/client/client.go +++ b/internal/services/toolkit/client/client.go @@ -39,6 +39,7 @@ func NewAIClient( ) *AIClient { database := db.Database("paperdebugger") oaiClient := openai.NewClient( + option.WithBaseURL(cfg.OpenAIBaseURL), option.WithAPIKey(cfg.OpenAIAPIKey), ) CheckOpenAIWorks(oaiClient, logger)