Skip to content

Commit a14f1b6

Browse files
authored
Merge pull request #1526 from rocket-admin/backend_langchain
Backend langchain
2 parents 2df5d3f + 3cb2753 commit a14f1b6

25 files changed

Lines changed: 3126 additions & 139 deletions

backend/package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@
3131
"@aws-sdk/s3-request-presigner": "^3.958.0",
3232
"@electric-sql/pglite": "^0.3.14",
3333
"@faker-js/faker": "^10.1.0",
34+
"@langchain/aws": "^1.2.0",
35+
"@langchain/core": "^1.1.15",
36+
"@langchain/openai": "^1.2.2",
3437
"@nestjs/common": "11.1.9",
3538
"@nestjs/config": "4.0.2",
3639
"@nestjs/core": "11.1.9",
@@ -71,6 +74,7 @@
7174
"json2csv": "^5.0.7",
7275
"jsonwebtoken": "^9.0.3",
7376
"knex": "3.1.0",
77+
"langchain": "^1.2.10",
7478
"lru-cache": "^11.2.4",
7579
"nanoid": "5.1.6",
7680
"nodemailer": "^7.0.11",
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { Global, Module } from '@nestjs/common';
2+
import { LangchainOpenAIProvider } from './providers/langchain-openai.provider.js';
3+
import { LangchainBedrockProvider } from './providers/langchain-bedrock.provider.js';
4+
import { AICoreService } from './services/ai-core.service.js';
5+
6+
export const AI_CORE_SERVICE = 'AI_CORE_SERVICE';
7+
8+
@Global()
9+
@Module({
10+
providers: [
11+
LangchainOpenAIProvider,
12+
LangchainBedrockProvider,
13+
AICoreService,
14+
{
15+
provide: AI_CORE_SERVICE,
16+
useExisting: AICoreService,
17+
},
18+
],
19+
exports: [AICoreService, AI_CORE_SERVICE, LangchainOpenAIProvider, LangchainBedrockProvider],
20+
})
21+
export class AICoreModule {}

backend/src/ai-core/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export * from './ai-core.module.js';
2+
export * from './interfaces/index.js';
3+
export * from './providers/index.js';
4+
export * from './services/index.js';
5+
export * from './tools/index.js';
6+
export * from './utils/index.js';
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import { BaseMessage } from '@langchain/core/messages';
2+
import { IterableReadableStream } from '@langchain/core/utils/stream';
3+
4+
export interface AIProviderConfig {
5+
modelId?: string;
6+
temperature?: number;
7+
maxTokens?: number;
8+
streaming?: boolean;
9+
previousResponseId?: string; // For conversation continuation (OpenAI Responses API)
10+
}
11+
12+
export interface AIToolDefinition {
13+
name: string;
14+
description: string;
15+
parameters: Record<string, unknown>;
16+
}
17+
18+
export interface AIToolCall {
19+
id: string;
20+
name: string;
21+
arguments: Record<string, unknown>;
22+
}
23+
24+
export interface AIToolResult {
25+
toolCallId: string;
26+
result: string;
27+
}
28+
29+
export interface AIStreamChunk {
30+
type: 'text' | 'tool_call' | 'tool_result' | 'done';
31+
content?: string;
32+
toolCall?: AIToolCall;
33+
responseId?: string;
34+
}
35+
36+
export interface AICompletionResult {
37+
content: string;
38+
toolCalls?: AIToolCall[];
39+
responseId?: string;
40+
}
41+
42+
export interface IAIProvider {
43+
generateCompletion(prompt: string, config?: AIProviderConfig): Promise<string>;
44+
45+
generateChatCompletion(messages: BaseMessage[], config?: AIProviderConfig): Promise<AICompletionResult>;
46+
47+
generateStreamingCompletion(
48+
messages: BaseMessage[],
49+
config?: AIProviderConfig,
50+
): Promise<IterableReadableStream<AIStreamChunk>>;
51+
52+
generateWithTools(
53+
messages: BaseMessage[],
54+
tools: AIToolDefinition[],
55+
config?: AIProviderConfig,
56+
): Promise<AICompletionResult>;
57+
58+
generateStreamingWithTools(
59+
messages: BaseMessage[],
60+
tools: AIToolDefinition[],
61+
config?: AIProviderConfig,
62+
): Promise<IterableReadableStream<AIStreamChunk>>;
63+
64+
continueWithToolResults(
65+
messages: BaseMessage[],
66+
toolResults: AIToolResult[],
67+
tools: AIToolDefinition[],
68+
config?: AIProviderConfig,
69+
): Promise<AICompletionResult>;
70+
71+
continueStreamingWithToolResults(
72+
messages: BaseMessage[],
73+
toolResults: AIToolResult[],
74+
tools: AIToolDefinition[],
75+
config?: AIProviderConfig,
76+
): Promise<IterableReadableStream<AIStreamChunk>>;
77+
78+
getProviderName(): string;
79+
80+
getDefaultModelId(): string;
81+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import { BaseMessage } from '@langchain/core/messages';
2+
import {
3+
AICompletionResult,
4+
AIProviderConfig,
5+
AIStreamChunk,
6+
AIToolDefinition,
7+
AIToolResult,
8+
} from './ai-provider.interface.js';
9+
import { IterableReadableStream } from '@langchain/core/utils/stream';
10+
11+
export enum AIProviderType {
12+
OPENAI = 'openai',
13+
BEDROCK = 'bedrock',
14+
}
15+
16+
export interface IAIService {
17+
18+
complete(prompt: string, config?: AIProviderConfig): Promise<string>;
19+
20+
completeWithProvider(provider: AIProviderType, prompt: string, config?: AIProviderConfig): Promise<string>;
21+
22+
chat(messages: BaseMessage[], config?: AIProviderConfig): Promise<AICompletionResult>;
23+
24+
chatWithProvider(
25+
provider: AIProviderType,
26+
messages: BaseMessage[],
27+
config?: AIProviderConfig,
28+
): Promise<AICompletionResult>;
29+
30+
streamChat(messages: BaseMessage[], config?: AIProviderConfig): Promise<IterableReadableStream<AIStreamChunk>>;
31+
32+
streamChatWithProvider(
33+
provider: AIProviderType,
34+
messages: BaseMessage[],
35+
config?: AIProviderConfig,
36+
): Promise<IterableReadableStream<AIStreamChunk>>;
37+
38+
chatWithTools(
39+
messages: BaseMessage[],
40+
tools: AIToolDefinition[],
41+
config?: AIProviderConfig,
42+
): Promise<AICompletionResult>;
43+
44+
chatWithToolsAndProvider(
45+
provider: AIProviderType,
46+
messages: BaseMessage[],
47+
tools: AIToolDefinition[],
48+
config?: AIProviderConfig,
49+
): Promise<AICompletionResult>;
50+
51+
streamChatWithTools(
52+
messages: BaseMessage[],
53+
tools: AIToolDefinition[],
54+
config?: AIProviderConfig,
55+
): Promise<IterableReadableStream<AIStreamChunk>>;
56+
57+
streamChatWithToolsAndProvider(
58+
provider: AIProviderType,
59+
messages: BaseMessage[],
60+
tools: AIToolDefinition[],
61+
config?: AIProviderConfig,
62+
): Promise<IterableReadableStream<AIStreamChunk>>;
63+
64+
continueAfterToolCall(
65+
messages: BaseMessage[],
66+
toolResults: AIToolResult[],
67+
tools: AIToolDefinition[],
68+
config?: AIProviderConfig,
69+
): Promise<AICompletionResult>;
70+
71+
continueStreamingAfterToolCall(
72+
messages: BaseMessage[],
73+
toolResults: AIToolResult[],
74+
tools: AIToolDefinition[],
75+
config?: AIProviderConfig,
76+
): Promise<IterableReadableStream<AIStreamChunk>>;
77+
78+
getDefaultProvider(): AIProviderType;
79+
80+
setDefaultProvider(provider: AIProviderType): void;
81+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './ai-provider.interface.js';
2+
export * from './ai-service.interface.js';
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './langchain-openai.provider.js';
2+
export * from './langchain-bedrock.provider.js';

0 commit comments

Comments
 (0)