From 8271e55cc11b7d4042d84b093e35d98c2998451d Mon Sep 17 00:00:00 2001 From: Philipp Harms Date: Thu, 19 Jun 2025 15:41:50 +0200 Subject: [PATCH 1/6] add openai env variables add custom base_url add custom models --- apps/backend/src/api/routes/copilot.controller.ts | 4 ++-- .../src/agent/agent.graph.service.ts | 2 +- .../database/prisma/autopost/autopost.service.ts | 4 ++-- .../nestjs-libraries/src/openai/openai.service.ts | 13 +++++++------ 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/apps/backend/src/api/routes/copilot.controller.ts b/apps/backend/src/api/routes/copilot.controller.ts index f28122c13..946d02ca3 100644 --- a/apps/backend/src/api/routes/copilot.controller.ts +++ b/apps/backend/src/api/routes/copilot.controller.ts @@ -29,8 +29,8 @@ export class CopilotController { // @ts-ignore req?.body?.variables?.data?.metadata?.requestType === 'TextareaCompletion' - ? 'gpt-4o-mini' - : 'gpt-4.1', + ? (process.env.OPENAI_TEXT_MODEL_MINI || 'gpt-4o-mini') + : (process.env.OPENAI_TEXT_MODEL || 'gpt-4.1'), }), }); diff --git a/libraries/nestjs-libraries/src/agent/agent.graph.service.ts b/libraries/nestjs-libraries/src/agent/agent.graph.service.ts index d4697e377..915b71fc2 100644 --- a/libraries/nestjs-libraries/src/agent/agent.graph.service.ts +++ b/libraries/nestjs-libraries/src/agent/agent.graph.service.ts @@ -23,7 +23,7 @@ const toolNode = new ToolNode(tools); const model = new ChatOpenAI({ apiKey: process.env.OPENAI_API_KEY || 'sk-proj-', - model: 'gpt-4.1', + model: process.env.OPENAI_TEXT_MODEL || 'gpt-4.1', temperature: 0.7, }); diff --git a/libraries/nestjs-libraries/src/database/prisma/autopost/autopost.service.ts b/libraries/nestjs-libraries/src/database/prisma/autopost/autopost.service.ts index 57d6dda38..428ea5baa 100644 --- a/libraries/nestjs-libraries/src/database/prisma/autopost/autopost.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/autopost/autopost.service.ts @@ -33,13 +33,13 @@ interface WorkflowChannelsState { const model = new ChatOpenAI({ apiKey: process.env.OPENAI_API_KEY || 'sk-proj-', - model: 'gpt-4.1', + model: process.env.OPENAI_TEXT_MODEL || 'gpt-4.1', temperature: 0.7, }); const dalle = new DallEAPIWrapper({ apiKey: process.env.OPENAI_API_KEY || 'sk-proj-', - model: 'gpt-image-1', + model: process.env.OPENAI_IMAGE_MODEL || 'gpt-image-1', }); const generateContent = z.object({ diff --git a/libraries/nestjs-libraries/src/openai/openai.service.ts b/libraries/nestjs-libraries/src/openai/openai.service.ts index 1ccdbfd8d..07060be80 100644 --- a/libraries/nestjs-libraries/src/openai/openai.service.ts +++ b/libraries/nestjs-libraries/src/openai/openai.service.ts @@ -6,6 +6,7 @@ import { z } from 'zod'; const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY || 'sk-proj-', + baseURL: process.env.OPENAI_API_BASE_URL }); const PicturePrompt = z.object({ @@ -30,7 +31,7 @@ export class OpenaiService { return ( ( await openai.beta.chat.completions.parse({ - model: 'gpt-4.1', + model: process.env.OPENAI_TEXT_MODEL || 'gpt-4.1', messages: [ { role: 'system', @@ -64,7 +65,7 @@ export class OpenaiService { ], n: 5, temperature: 1, - model: 'gpt-4.1', + model: process.env.OPENAI_TEXT_MODEL || 'gpt-4.1', }), openai.chat.completions.create({ messages: [ @@ -80,7 +81,7 @@ export class OpenaiService { ], n: 5, temperature: 1, - model: 'gpt-4.1', + model: process.env.OPENAI_TEXT_MODEL || 'gpt-4.1', }), ]) ).flatMap((p) => p.choices); @@ -118,7 +119,7 @@ export class OpenaiService { content, }, ], - model: 'gpt-4.1', + model: process.env.OPENAI_TEXT_MODEL || 'gpt-4.1', }); const { content: articleContent } = websiteContent.choices[0].message; @@ -138,7 +139,7 @@ export class OpenaiService { const posts = ( await openai.beta.chat.completions.parse({ - model: 'gpt-4.1', + model: process.env.OPENAI_TEXT_MODEL || 'gpt-4.1', messages: [ { role: 'system', @@ -169,7 +170,7 @@ export class OpenaiService { return ( ( await openai.beta.chat.completions.parse({ - model: 'gpt-4.1', + model: process.env.OPENAI_TEXT_MODEL || 'gpt-4.1', messages: [ { role: 'system', From 1dfdd282389460e22ca0f9e5c91347ed5082560a Mon Sep 17 00:00:00 2001 From: Philipp Harms Date: Thu, 19 Jun 2025 19:19:58 +0200 Subject: [PATCH 2/6] add more missing openai client settings --- .../nestjs-libraries/src/agent/agent.graph.insert.service.ts | 5 ++++- libraries/nestjs-libraries/src/agent/agent.graph.service.ts | 3 +++ .../src/database/prisma/autopost/autopost.service.ts | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/libraries/nestjs-libraries/src/agent/agent.graph.insert.service.ts b/libraries/nestjs-libraries/src/agent/agent.graph.insert.service.ts index 1a60b7399..265db4e09 100644 --- a/libraries/nestjs-libraries/src/agent/agent.graph.insert.service.ts +++ b/libraries/nestjs-libraries/src/agent/agent.graph.insert.service.ts @@ -10,7 +10,10 @@ import { PostsService } from '@gitroom/nestjs-libraries/database/prisma/posts/po const model = new ChatOpenAI({ apiKey: process.env.OPENAI_API_KEY || 'sk-proj-', - model: 'gpt-4o-2024-08-06', + configuration: { + baseURL: process.env.OPENAI_API_BASE_URL, + }, + model: process.env.OPENAI_TEXT_MODEL || 'gpt-4o-2024-08-06', temperature: 0, }); diff --git a/libraries/nestjs-libraries/src/agent/agent.graph.service.ts b/libraries/nestjs-libraries/src/agent/agent.graph.service.ts index 915b71fc2..f0cb70f02 100644 --- a/libraries/nestjs-libraries/src/agent/agent.graph.service.ts +++ b/libraries/nestjs-libraries/src/agent/agent.graph.service.ts @@ -25,6 +25,9 @@ const model = new ChatOpenAI({ apiKey: process.env.OPENAI_API_KEY || 'sk-proj-', model: process.env.OPENAI_TEXT_MODEL || 'gpt-4.1', temperature: 0.7, + configuration: { + baseURL: process.env.OPENAI_API_BASE_URL, + }, }); const dalle = new DallEAPIWrapper({ diff --git a/libraries/nestjs-libraries/src/database/prisma/autopost/autopost.service.ts b/libraries/nestjs-libraries/src/database/prisma/autopost/autopost.service.ts index 428ea5baa..fc1609c9e 100644 --- a/libraries/nestjs-libraries/src/database/prisma/autopost/autopost.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/autopost/autopost.service.ts @@ -35,6 +35,9 @@ const model = new ChatOpenAI({ apiKey: process.env.OPENAI_API_KEY || 'sk-proj-', model: process.env.OPENAI_TEXT_MODEL || 'gpt-4.1', temperature: 0.7, + configuration: { + baseURL: process.env.OPENAI_API_BASE_URL, + }, }); const dalle = new DallEAPIWrapper({ From 2049f56299da40a2a6e6124bdfb9caf25168d273 Mon Sep 17 00:00:00 2001 From: Philipp Harms Date: Fri, 20 Jun 2025 16:15:33 +0200 Subject: [PATCH 3/6] add missing openai model envs remove OPENAI_API_KEY remove OPENAI_API_BASE_URL can be omitted, openai package already uses envs --- .../nestjs-libraries/src/agent/agent.graph.service.ts | 7 +------ .../src/database/prisma/autopost/autopost.service.ts | 5 ----- libraries/nestjs-libraries/src/openai/openai.service.ts | 7 ++----- 3 files changed, 3 insertions(+), 16 deletions(-) diff --git a/libraries/nestjs-libraries/src/agent/agent.graph.service.ts b/libraries/nestjs-libraries/src/agent/agent.graph.service.ts index f0cb70f02..92f22449b 100644 --- a/libraries/nestjs-libraries/src/agent/agent.graph.service.ts +++ b/libraries/nestjs-libraries/src/agent/agent.graph.service.ts @@ -22,17 +22,12 @@ const tools = !process.env.TAVILY_API_KEY const toolNode = new ToolNode(tools); const model = new ChatOpenAI({ - apiKey: process.env.OPENAI_API_KEY || 'sk-proj-', model: process.env.OPENAI_TEXT_MODEL || 'gpt-4.1', temperature: 0.7, - configuration: { - baseURL: process.env.OPENAI_API_BASE_URL, - }, }); const dalle = new DallEAPIWrapper({ - apiKey: process.env.OPENAI_API_KEY || 'sk-proj-', - model: 'dall-e-3', + model: process.env.OPENAI_IMAGE_MODEL || 'dall-e-3', }); interface WorkflowChannelsState { diff --git a/libraries/nestjs-libraries/src/database/prisma/autopost/autopost.service.ts b/libraries/nestjs-libraries/src/database/prisma/autopost/autopost.service.ts index fc1609c9e..ad84c6dbb 100644 --- a/libraries/nestjs-libraries/src/database/prisma/autopost/autopost.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/autopost/autopost.service.ts @@ -32,16 +32,11 @@ interface WorkflowChannelsState { } const model = new ChatOpenAI({ - apiKey: process.env.OPENAI_API_KEY || 'sk-proj-', model: process.env.OPENAI_TEXT_MODEL || 'gpt-4.1', temperature: 0.7, - configuration: { - baseURL: process.env.OPENAI_API_BASE_URL, - }, }); const dalle = new DallEAPIWrapper({ - apiKey: process.env.OPENAI_API_KEY || 'sk-proj-', model: process.env.OPENAI_IMAGE_MODEL || 'gpt-image-1', }); diff --git a/libraries/nestjs-libraries/src/openai/openai.service.ts b/libraries/nestjs-libraries/src/openai/openai.service.ts index 07060be80..69792499c 100644 --- a/libraries/nestjs-libraries/src/openai/openai.service.ts +++ b/libraries/nestjs-libraries/src/openai/openai.service.ts @@ -4,10 +4,7 @@ import { shuffle } from 'lodash'; import { zodResponseFormat } from 'openai/helpers/zod'; import { z } from 'zod'; -const openai = new OpenAI({ - apiKey: process.env.OPENAI_API_KEY || 'sk-proj-', - baseURL: process.env.OPENAI_API_BASE_URL -}); +const openai = new OpenAI({}); const PicturePrompt = z.object({ prompt: z.string(), @@ -20,7 +17,7 @@ export class OpenaiService { await openai.images.generate({ prompt, response_format: isUrl ? 'url' : 'b64_json', - model: 'dall-e-3', + model: process.env.OPENAI_IMAGE_MODEL || 'dall-e-3', }) ).data[0]; From 6806924437e4bbfb50e577dec7c131b606760b81 Mon Sep 17 00:00:00 2001 From: Philipp Harms Date: Fri, 20 Jun 2025 16:18:28 +0200 Subject: [PATCH 4/6] remove envs from agent graph insert service --- .../nestjs-libraries/src/agent/agent.graph.insert.service.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libraries/nestjs-libraries/src/agent/agent.graph.insert.service.ts b/libraries/nestjs-libraries/src/agent/agent.graph.insert.service.ts index 265db4e09..b263e1c90 100644 --- a/libraries/nestjs-libraries/src/agent/agent.graph.insert.service.ts +++ b/libraries/nestjs-libraries/src/agent/agent.graph.insert.service.ts @@ -9,10 +9,6 @@ import { agentTopics } from '@gitroom/nestjs-libraries/agent/agent.topics'; import { PostsService } from '@gitroom/nestjs-libraries/database/prisma/posts/posts.service'; const model = new ChatOpenAI({ - apiKey: process.env.OPENAI_API_KEY || 'sk-proj-', - configuration: { - baseURL: process.env.OPENAI_API_BASE_URL, - }, model: process.env.OPENAI_TEXT_MODEL || 'gpt-4o-2024-08-06', temperature: 0, }); From 3d2661496d75f9b5444f1ba043c6f66d7f6d07c4 Mon Sep 17 00:00:00 2001 From: Philipp Harms Date: Fri, 20 Jun 2025 18:43:38 +0200 Subject: [PATCH 5/6] add example envs --- .env.example | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.env.example b/.env.example index bbdc5e48d..3c7003b67 100644 --- a/.env.example +++ b/.env.example @@ -74,6 +74,10 @@ MASTODON_CLIENT_SECRET="" # Misc Settings OPENAI_API_KEY="" +OPENAI_BASE_URL="https://api.openai.com/v1" #default, can be omitted +OPENAI_TEXT_MODEL="gpt-4.1" #default, can be omitted +OPENAI_TEXT_MODEL_MINI="gpt-4o-mini" #default, can be omitted +OPENAI_IMAGE_MODEL="dall-e-3" #default, can be omitted NEXT_PUBLIC_DISCORD_SUPPORT="" NEXT_PUBLIC_POLOTNO="" # NOT_SECURED=false From e1486f7be8102c2addb2fcadce6ca7e1a561d6cc Mon Sep 17 00:00:00 2001 From: Philipp Harms Date: Fri, 20 Jun 2025 18:50:22 +0200 Subject: [PATCH 6/6] enable copilot if no api key is set if base url differs from offical --- apps/backend/src/api/routes/copilot.controller.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/backend/src/api/routes/copilot.controller.ts b/apps/backend/src/api/routes/copilot.controller.ts index 946d02ca3..0f4e3bccb 100644 --- a/apps/backend/src/api/routes/copilot.controller.ts +++ b/apps/backend/src/api/routes/copilot.controller.ts @@ -14,8 +14,7 @@ export class CopilotController { @Post('/chat') chat(@Req() req: Request, @Res() res: Response) { if ( - process.env.OPENAI_API_KEY === undefined || - process.env.OPENAI_API_KEY === '' + !process.env.OPENAI_API_KEY && !process.env.OPENAI_BASE_URL // if using offical OpenAI API, abort if no key ) { Logger.warn('OpenAI API key not set, chat functionality will not work'); return;