diff --git a/apps/api/src/app/endpoints/ai/ai.service.ts b/apps/api/src/app/endpoints/ai/ai.service.ts index 2766b5d02..570638695 100644 --- a/apps/api/src/app/endpoints/ai/ai.service.ts +++ b/apps/api/src/app/endpoints/ai/ai.service.ts @@ -1,15 +1,21 @@ import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; -import { OpenRouterService } from '@ghostfolio/api/services/data-provider/openrouter/openrouter.service'; +import { PropertyService } from '@ghostfolio/api/services/property/property.service'; +import { + PROPERTY_API_KEY_OPENROUTER, + PROPERTY_OPENROUTER_MODEL +} from '@ghostfolio/common/config.ts'; import { Filter } from '@ghostfolio/common/interfaces'; import type { AiPromptMode } from '@ghostfolio/common/types'; import { Injectable } from '@nestjs/common'; +import { createOpenRouter } from '@openrouter/ai-sdk-provider'; +import { streamText } from 'ai'; @Injectable() export class AiService { public constructor( - private readonly openRouterService: OpenRouterService, - private readonly portfolioService: PortfolioService + private readonly portfolioService: PortfolioService, + private readonly propertyService: PropertyService ) {} public async getCompletion({ @@ -36,7 +42,22 @@ export class AiService { userId }); - return this.openRouterService.getCompletion(prompt); + const openRouterApiKey = await this.propertyService.getByKey( + PROPERTY_API_KEY_OPENROUTER + ); + + const openRouterModel = await this.propertyService.getByKey( + PROPERTY_OPENROUTER_MODEL + ); + + const { chat } = createOpenRouter({ + apiKey: openRouterApiKey as string + }); + + return streamText({ + model: chat(openRouterModel as string), + prompt + }); } public async getPrompt({ diff --git a/apps/api/src/services/data-provider/openrouter/openrouter.service.ts b/apps/api/src/services/data-provider/openrouter/openrouter.service.ts deleted file mode 100644 index d9a494780..000000000 --- a/apps/api/src/services/data-provider/openrouter/openrouter.service.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { - PROPERTY_API_KEY_OPENROUTER, - PROPERTY_OPENROUTER_MODEL -} from '@ghostfolio/common/config/properties'; - -import { Injectable } from '@nestjs/common'; -import { createOpenRouter } from '@openrouter/ai-sdk-provider'; -import { streamText } from 'ai'; - -import { PropertyService } from '../../property/property.service'; - -@Injectable() -export class OpenRouterService { - public constructor(private readonly propertyService: PropertyService) {} - - public async getCompletion(prompt: string) { - const openRouterApiKey = await this.propertyService.getByKey( - PROPERTY_API_KEY_OPENROUTER - ); - - const openRouterModel = await this.propertyService.getByKey( - PROPERTY_OPENROUTER_MODEL - ); - - const openrouter = createOpenRouter({ - apiKey: openRouterApiKey as string - }); - - return streamText({ - model: openrouter.chat(openRouterModel as string), - prompt - }); - } -} diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index e124360a1..116b22a54 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -125,6 +125,9 @@ export const PROPERTY_DEMO_USER_ID = 'DEMO_USER_ID'; export const PROPERTY_IS_DATA_GATHERING_ENABLED = 'IS_DATA_GATHERING_ENABLED'; export const PROPERTY_IS_READ_ONLY_MODE = 'IS_READ_ONLY_MODE'; export const PROPERTY_IS_USER_SIGNUP_ENABLED = 'IS_USER_SIGNUP_ENABLED'; +export const PROPERTY_MAX_PORTFOLIOS = 'MAX_PORTFOLIOS'; +export const PROPERTY_MAX_USERS = 'MAX_USERS'; +export const PROPERTY_OPENROUTER_MODEL = 'OPENROUTER_MODEL'; export const PROPERTY_SLACK_COMMUNITY_USERS = 'SLACK_COMMUNITY_USERS'; export const PROPERTY_STRIPE_CONFIG = 'STRIPE_CONFIG'; export const PROPERTY_SYSTEM_MESSAGE = 'SYSTEM_MESSAGE'; diff --git a/libs/common/src/lib/config/properties.ts b/libs/common/src/lib/config/properties.ts index 5854526ec..53e05fdd8 100644 --- a/libs/common/src/lib/config/properties.ts +++ b/libs/common/src/lib/config/properties.ts @@ -1,8 +1,3 @@ export const PROPERTY_DATA_GATHERING_QUEUE_INTERVAL = 'DATA_GATHERING_QUEUE_INTERVAL'; -export const PROPERTY_IS_DEMO_MODE = 'IS_DEMO_MODE'; -export const PROPERTY_IS_USER_SIGNUP_ENABLED = 'IS_USER_SIGNUP_ENABLED'; -export const PROPERTY_MAX_PORTFOLIOS = 'MAX_PORTFOLIOS'; -export const PROPERTY_MAX_USERS = 'MAX_USERS'; -export const PROPERTY_API_KEY_OPENROUTER = 'API_KEY_OPENROUTER'; -export const PROPERTY_OPENROUTER_MODEL = 'OPENROUTER_MODEL'; + diff --git a/package.json b/package.json index cd8936d8e..28f656904 100644 --- a/package.json +++ b/package.json @@ -88,12 +88,12 @@ "@nestjs/platform-express": "11.1.3", "@nestjs/schedule": "6.0.0", "@nestjs/serve-static": "5.0.3", - "@openrouter/ai-sdk-provider": "^0.7.2", + "@openrouter/ai-sdk-provider": "0.7.2", "@prisma/client": "6.10.1", "@simplewebauthn/browser": "13.1.0", "@simplewebauthn/server": "13.1.1", "@stripe/stripe-js": "7.3.1", - "ai": "^4.3.16", + "ai": "4.3.16", "alphavantage": "2.2.0", "big.js": "7.0.1", "bootstrap": "4.6.2",