@juspay/neurolink 7.33.4 → 7.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/README.md +101 -7
- package/dist/cli/commands/setup-anthropic.d.ts +16 -0
- package/dist/cli/commands/setup-anthropic.js +414 -0
- package/dist/cli/commands/setup-azure.d.ts +17 -0
- package/dist/cli/commands/setup-azure.js +415 -0
- package/dist/cli/commands/setup-bedrock.d.ts +13 -0
- package/dist/cli/commands/setup-bedrock.js +487 -0
- package/dist/cli/commands/setup-gcp.d.ts +18 -0
- package/dist/cli/commands/setup-gcp.js +569 -0
- package/dist/cli/commands/setup-google-ai.d.ts +16 -0
- package/dist/cli/commands/setup-google-ai.js +369 -0
- package/dist/cli/commands/setup-huggingface.d.ts +8 -0
- package/dist/cli/commands/setup-huggingface.js +200 -0
- package/dist/cli/commands/setup-mistral.d.ts +8 -0
- package/dist/cli/commands/setup-mistral.js +233 -0
- package/dist/cli/commands/setup-openai.d.ts +16 -0
- package/dist/cli/commands/setup-openai.js +402 -0
- package/dist/cli/commands/setup.d.ts +19 -0
- package/dist/cli/commands/setup.js +539 -0
- package/dist/cli/errorHandler.d.ts +1 -0
- package/dist/cli/errorHandler.js +28 -0
- package/dist/cli/factories/commandFactory.d.ts +27 -0
- package/dist/cli/factories/commandFactory.js +416 -60
- package/dist/cli/factories/ollamaCommandFactory.js +7 -1
- package/dist/cli/factories/setupCommandFactory.d.ts +18 -0
- package/dist/cli/factories/setupCommandFactory.js +137 -0
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.js +9 -164
- package/dist/cli/loop/optionsSchema.d.ts +15 -0
- package/dist/cli/loop/optionsSchema.js +59 -0
- package/dist/cli/loop/session.d.ts +15 -0
- package/dist/cli/loop/session.js +252 -0
- package/dist/cli/parser.d.ts +1 -0
- package/dist/cli/parser.js +161 -0
- package/dist/cli/utils/envManager.d.ts +3 -2
- package/dist/cli/utils/envManager.js +18 -4
- package/dist/cli/utils/ollamaUtils.js +6 -0
- package/dist/config/{conversationMemoryConfig.d.ts → conversationMemory.d.ts} +1 -1
- package/dist/core/baseProvider.js +17 -3
- package/dist/core/conversationMemoryFactory.d.ts +23 -0
- package/dist/core/conversationMemoryFactory.js +144 -0
- package/dist/core/conversationMemoryInitializer.d.ts +14 -0
- package/dist/core/conversationMemoryInitializer.js +127 -0
- package/dist/core/conversationMemoryManager.d.ts +3 -2
- package/dist/core/conversationMemoryManager.js +4 -3
- package/dist/core/redisConversationMemoryManager.d.ts +73 -0
- package/dist/core/redisConversationMemoryManager.js +483 -0
- package/dist/core/types.d.ts +1 -1
- package/dist/lib/config/{conversationMemoryConfig.d.ts → conversationMemory.d.ts} +1 -1
- package/dist/lib/core/baseProvider.js +17 -3
- package/dist/lib/core/conversationMemoryFactory.d.ts +23 -0
- package/dist/lib/core/conversationMemoryFactory.js +144 -0
- package/dist/lib/core/conversationMemoryInitializer.d.ts +14 -0
- package/dist/lib/core/conversationMemoryInitializer.js +127 -0
- package/dist/lib/core/conversationMemoryManager.d.ts +3 -2
- package/dist/lib/core/conversationMemoryManager.js +4 -3
- package/dist/lib/core/redisConversationMemoryManager.d.ts +73 -0
- package/dist/lib/core/redisConversationMemoryManager.js +483 -0
- package/dist/lib/core/types.d.ts +1 -1
- package/dist/lib/neurolink.d.ts +15 -9
- package/dist/lib/neurolink.js +218 -67
- package/dist/lib/providers/amazonBedrock.d.ts +4 -4
- package/dist/lib/providers/anthropic.d.ts +4 -4
- package/dist/lib/providers/azureOpenai.d.ts +4 -4
- package/dist/lib/providers/googleAiStudio.d.ts +4 -4
- package/dist/lib/providers/googleAiStudio.js +1 -1
- package/dist/lib/providers/huggingFace.d.ts +4 -4
- package/dist/lib/providers/litellm.d.ts +1 -1
- package/dist/lib/providers/mistral.d.ts +4 -4
- package/dist/lib/providers/mistral.js +2 -2
- package/dist/lib/providers/openAI.d.ts +4 -4
- package/dist/lib/session/globalSessionState.d.ts +27 -0
- package/dist/lib/session/globalSessionState.js +77 -0
- package/dist/lib/types/{conversationTypes.d.ts → conversation.d.ts} +32 -0
- package/dist/lib/types/generateTypes.d.ts +1 -1
- package/dist/lib/types/streamTypes.d.ts +1 -1
- package/dist/lib/utils/conversationMemory.d.ts +22 -0
- package/dist/lib/utils/conversationMemory.js +121 -0
- package/dist/lib/utils/conversationMemoryUtils.d.ts +1 -1
- package/dist/lib/utils/conversationMemoryUtils.js +2 -2
- package/dist/lib/utils/messageBuilder.d.ts +1 -1
- package/dist/lib/utils/messageBuilder.js +1 -1
- package/dist/lib/utils/redis.d.ts +42 -0
- package/dist/lib/utils/redis.js +263 -0
- package/dist/neurolink.d.ts +15 -9
- package/dist/neurolink.js +218 -67
- package/dist/providers/amazonBedrock.d.ts +4 -4
- package/dist/providers/anthropic.d.ts +4 -4
- package/dist/providers/azureOpenai.d.ts +4 -4
- package/dist/providers/googleAiStudio.d.ts +4 -4
- package/dist/providers/googleAiStudio.js +1 -1
- package/dist/providers/huggingFace.d.ts +4 -4
- package/dist/providers/litellm.d.ts +1 -1
- package/dist/providers/mistral.d.ts +4 -4
- package/dist/providers/mistral.js +2 -2
- package/dist/providers/openAI.d.ts +4 -4
- package/dist/session/globalSessionState.d.ts +27 -0
- package/dist/session/globalSessionState.js +77 -0
- package/dist/types/{conversationTypes.d.ts → conversation.d.ts} +32 -0
- package/dist/types/generateTypes.d.ts +1 -1
- package/dist/types/streamTypes.d.ts +1 -1
- package/dist/utils/conversationMemory.d.ts +22 -0
- package/dist/utils/conversationMemory.js +121 -0
- package/dist/utils/conversationMemoryUtils.d.ts +1 -1
- package/dist/utils/conversationMemoryUtils.js +2 -2
- package/dist/utils/messageBuilder.d.ts +1 -1
- package/dist/utils/messageBuilder.js +1 -1
- package/dist/utils/redis.d.ts +42 -0
- package/dist/utils/redis.js +263 -0
- package/package.json +3 -1
- /package/dist/config/{conversationMemoryConfig.js → conversationMemory.js} +0 -0
- /package/dist/lib/config/{conversationMemoryConfig.js → conversationMemory.js} +0 -0
- /package/dist/lib/types/{conversationTypes.js → conversation.js} +0 -0
- /package/dist/types/{conversationTypes.js → conversation.js} +0 -0
@@ -68,12 +68,12 @@ export declare class HuggingFaceProvider extends BaseProvider {
|
|
68
68
|
/**
|
69
69
|
* Enhanced error handling with HuggingFace-specific guidance
|
70
70
|
*/
|
71
|
-
|
72
|
-
|
73
|
-
|
71
|
+
handleProviderError(error: unknown): Error;
|
72
|
+
getProviderName(): AIProviderName;
|
73
|
+
getDefaultModel(): string;
|
74
74
|
/**
|
75
75
|
* Returns the Vercel AI SDK model instance for HuggingFace
|
76
76
|
*/
|
77
|
-
|
77
|
+
getAISDKModel(): LanguageModelV1;
|
78
78
|
}
|
79
79
|
export default HuggingFaceProvider;
|
@@ -19,7 +19,7 @@ export declare class LiteLLMProvider extends BaseProvider {
|
|
19
19
|
* Returns the Vercel AI SDK model instance for LiteLLM
|
20
20
|
*/
|
21
21
|
protected getAISDKModel(): LanguageModelV1;
|
22
|
-
|
22
|
+
handleProviderError(error: unknown): Error;
|
23
23
|
/**
|
24
24
|
* LiteLLM supports tools for compatible models
|
25
25
|
*/
|
@@ -11,13 +11,13 @@ export declare class MistralProvider extends BaseProvider {
|
|
11
11
|
private model;
|
12
12
|
constructor(modelName?: string, sdk?: unknown);
|
13
13
|
protected executeStream(options: StreamOptions, _analysisSchema?: ValidationSchema): Promise<StreamResult>;
|
14
|
-
|
15
|
-
|
14
|
+
getProviderName(): AIProviderName;
|
15
|
+
getDefaultModel(): string;
|
16
16
|
/**
|
17
17
|
* Returns the Vercel AI SDK model instance for Mistral
|
18
18
|
*/
|
19
|
-
|
20
|
-
|
19
|
+
getAISDKModel(): LanguageModelV1;
|
20
|
+
handleProviderError(error: unknown): Error;
|
21
21
|
/**
|
22
22
|
* Validate provider configuration
|
23
23
|
*/
|
@@ -111,8 +111,8 @@ export class MistralProvider extends BaseProvider {
|
|
111
111
|
message.includes("Invalid API key")) {
|
112
112
|
return new Error("Invalid Mistral API key. Please check your MISTRAL_API_KEY environment variable.");
|
113
113
|
}
|
114
|
-
if (message.includes("
|
115
|
-
return new Error("Mistral rate limit exceeded
|
114
|
+
if (message.includes("Rate limit exceeded")) {
|
115
|
+
return new Error("Mistral rate limit exceeded");
|
116
116
|
}
|
117
117
|
return new Error(`Mistral error: ${message}`);
|
118
118
|
}
|
@@ -11,13 +11,13 @@ import type { NeuroLink } from "../neurolink.js";
|
|
11
11
|
export declare class OpenAIProvider extends BaseProvider {
|
12
12
|
private model;
|
13
13
|
constructor(modelName?: string, neurolink?: NeuroLink);
|
14
|
-
|
15
|
-
|
14
|
+
getProviderName(): AIProviderName;
|
15
|
+
getDefaultModel(): string;
|
16
16
|
/**
|
17
17
|
* Returns the Vercel AI SDK model instance for OpenAI
|
18
18
|
*/
|
19
|
-
|
20
|
-
|
19
|
+
getAISDKModel(): LanguageModelV1;
|
20
|
+
handleProviderError(error: unknown): Error;
|
21
21
|
/**
|
22
22
|
* executeGenerate method removed - generation is now handled by BaseProvider.
|
23
23
|
* For details on the changes and migration steps, refer to the BaseProvider documentation
|
@@ -0,0 +1,27 @@
|
|
1
|
+
import { NeuroLink } from "../neurolink.js";
|
2
|
+
import type { ConversationMemoryConfig } from "../types/conversation.js";
|
3
|
+
type SessionVariableValue = string | number | boolean;
|
4
|
+
interface LoopSessionState {
|
5
|
+
neurolinkInstance: NeuroLink;
|
6
|
+
sessionId: string;
|
7
|
+
isActive: boolean;
|
8
|
+
conversationMemoryConfig?: ConversationMemoryConfig;
|
9
|
+
sessionVariables: Record<string, SessionVariableValue>;
|
10
|
+
}
|
11
|
+
export declare class GlobalSessionManager {
|
12
|
+
private static instance;
|
13
|
+
private loopSession;
|
14
|
+
static getInstance(): GlobalSessionManager;
|
15
|
+
setLoopSession(config?: ConversationMemoryConfig): string;
|
16
|
+
getLoopSession(): LoopSessionState | null;
|
17
|
+
clearLoopSession(): void;
|
18
|
+
getOrCreateNeuroLink(): NeuroLink;
|
19
|
+
getCurrentSessionId(): string | undefined;
|
20
|
+
setSessionVariable(key: string, value: SessionVariableValue): void;
|
21
|
+
getSessionVariable(key: string): SessionVariableValue | undefined;
|
22
|
+
getSessionVariables(): Record<string, SessionVariableValue>;
|
23
|
+
unsetSessionVariable(key: string): boolean;
|
24
|
+
clearSessionVariables(): void;
|
25
|
+
}
|
26
|
+
export declare const globalSession: GlobalSessionManager;
|
27
|
+
export {};
|
@@ -0,0 +1,77 @@
|
|
1
|
+
import { nanoid } from "nanoid";
|
2
|
+
import { NeuroLink } from "../neurolink.js";
|
3
|
+
export class GlobalSessionManager {
|
4
|
+
static instance;
|
5
|
+
loopSession = null;
|
6
|
+
static getInstance() {
|
7
|
+
if (!GlobalSessionManager.instance) {
|
8
|
+
GlobalSessionManager.instance = new GlobalSessionManager();
|
9
|
+
}
|
10
|
+
return GlobalSessionManager.instance;
|
11
|
+
}
|
12
|
+
setLoopSession(config) {
|
13
|
+
const sessionId = `NL_${nanoid()}`;
|
14
|
+
const neurolinkOptions = {};
|
15
|
+
if (config?.enabled) {
|
16
|
+
neurolinkOptions.conversationMemory = {
|
17
|
+
enabled: true,
|
18
|
+
maxSessions: config.maxSessions,
|
19
|
+
maxTurnsPerSession: config.maxTurnsPerSession,
|
20
|
+
};
|
21
|
+
}
|
22
|
+
this.loopSession = {
|
23
|
+
neurolinkInstance: new NeuroLink(neurolinkOptions),
|
24
|
+
sessionId,
|
25
|
+
isActive: true,
|
26
|
+
conversationMemoryConfig: config,
|
27
|
+
sessionVariables: {},
|
28
|
+
};
|
29
|
+
return sessionId;
|
30
|
+
}
|
31
|
+
getLoopSession() {
|
32
|
+
return this.loopSession?.isActive ? this.loopSession : null;
|
33
|
+
}
|
34
|
+
clearLoopSession() {
|
35
|
+
if (this.loopSession) {
|
36
|
+
this.loopSession.isActive = false;
|
37
|
+
this.loopSession = null;
|
38
|
+
}
|
39
|
+
}
|
40
|
+
getOrCreateNeuroLink() {
|
41
|
+
const session = this.getLoopSession();
|
42
|
+
return session ? session.neurolinkInstance : new NeuroLink();
|
43
|
+
}
|
44
|
+
getCurrentSessionId() {
|
45
|
+
return this.getLoopSession()?.sessionId;
|
46
|
+
}
|
47
|
+
// Session variable management
|
48
|
+
setSessionVariable(key, value) {
|
49
|
+
const session = this.getLoopSession();
|
50
|
+
if (session) {
|
51
|
+
session.sessionVariables[key] = value;
|
52
|
+
}
|
53
|
+
}
|
54
|
+
getSessionVariable(key) {
|
55
|
+
const session = this.getLoopSession();
|
56
|
+
return session?.sessionVariables[key];
|
57
|
+
}
|
58
|
+
getSessionVariables() {
|
59
|
+
const session = this.getLoopSession();
|
60
|
+
return session?.sessionVariables || {};
|
61
|
+
}
|
62
|
+
unsetSessionVariable(key) {
|
63
|
+
const session = this.getLoopSession();
|
64
|
+
if (session && key in session.sessionVariables) {
|
65
|
+
delete session.sessionVariables[key];
|
66
|
+
return true;
|
67
|
+
}
|
68
|
+
return false;
|
69
|
+
}
|
70
|
+
clearSessionVariables() {
|
71
|
+
const session = this.getLoopSession();
|
72
|
+
if (session) {
|
73
|
+
session.sessionVariables = {};
|
74
|
+
}
|
75
|
+
}
|
76
|
+
}
|
77
|
+
export const globalSession = GlobalSessionManager.getInstance();
|
@@ -103,3 +103,35 @@ export declare class ConversationMemoryError extends Error {
|
|
103
103
|
details?: Record<string, unknown> | undefined;
|
104
104
|
constructor(message: string, code: "STORAGE_ERROR" | "CONFIG_ERROR" | "SESSION_NOT_FOUND" | "CLEANUP_ERROR", details?: Record<string, unknown> | undefined);
|
105
105
|
}
|
106
|
+
/**
|
107
|
+
* Session identifier for Redis storage operations
|
108
|
+
*/
|
109
|
+
export type SessionIdentifier = {
|
110
|
+
sessionId: string;
|
111
|
+
userId?: string;
|
112
|
+
};
|
113
|
+
/**
|
114
|
+
* Redis storage configuration
|
115
|
+
*/
|
116
|
+
export type RedisStorageConfig = {
|
117
|
+
/** Redis host (default: 'localhost') */
|
118
|
+
host?: string;
|
119
|
+
/** Redis port (default: 6379) */
|
120
|
+
port?: number;
|
121
|
+
/** Redis password (optional) */
|
122
|
+
password?: string;
|
123
|
+
/** Redis database number (default: 0) */
|
124
|
+
db?: number;
|
125
|
+
/** Key prefix for Redis keys (default: 'neurolink:conversation:') */
|
126
|
+
keyPrefix?: string;
|
127
|
+
/** Time-to-live in seconds (default: 86400, 24 hours) */
|
128
|
+
ttl?: number;
|
129
|
+
/** Additional Redis connection options */
|
130
|
+
connectionOptions?: {
|
131
|
+
connectTimeout?: number;
|
132
|
+
lazyConnect?: boolean;
|
133
|
+
retryDelayOnFailover?: number;
|
134
|
+
maxRetriesPerRequest?: number;
|
135
|
+
[key: string]: string | number | boolean | undefined;
|
136
|
+
};
|
137
|
+
};
|
@@ -3,7 +3,7 @@ import type { ValidationSchema, StandardRecord, ZodUnknownSchema } from "./typeA
|
|
3
3
|
import type { AIProviderName } from "./providers.js";
|
4
4
|
import type { AnalyticsData, TokenUsage } from "./analytics.js";
|
5
5
|
import type { EvaluationData } from "./evaluation.js";
|
6
|
-
import type { ChatMessage, ConversationMemoryConfig } from "./
|
6
|
+
import type { ChatMessage, ConversationMemoryConfig } from "./conversation.js";
|
7
7
|
import type { MiddlewareFactoryOptions } from "./middlewareTypes.js";
|
8
8
|
import type { JsonValue } from "./common.js";
|
9
9
|
/**
|
@@ -4,7 +4,7 @@ import type { AIProviderName, ProviderConfig } from "./providers.js";
|
|
4
4
|
import type { AnalyticsData, TokenUsage } from "./analytics.js";
|
5
5
|
import type { EvaluationData } from "./evaluation.js";
|
6
6
|
import type { UnknownRecord, JsonValue } from "./common.js";
|
7
|
-
import type { ChatMessage } from "./
|
7
|
+
import type { ChatMessage } from "./conversation.js";
|
8
8
|
import type { MiddlewareFactoryOptions } from "./middlewareTypes.js";
|
9
9
|
/**
|
10
10
|
* Progress tracking and metadata for streaming operations
|
@@ -0,0 +1,22 @@
|
|
1
|
+
/**
|
2
|
+
* Conversation Memory Utilities
|
3
|
+
* Handles configuration merging and conversation memory operations
|
4
|
+
*/
|
5
|
+
import type { ConversationMemoryConfig, ChatMessage } from "../types/conversation.js";
|
6
|
+
import type { ConversationMemoryManager } from "../core/conversationMemoryManager.js";
|
7
|
+
import type { RedisConversationMemoryManager } from "../core/redisConversationMemoryManager.js";
|
8
|
+
import type { TextGenerationOptions, TextGenerationResult } from "../core/types.js";
|
9
|
+
/**
|
10
|
+
* Apply conversation memory defaults to user configuration
|
11
|
+
* Merges user config with environment variables and default values
|
12
|
+
*/
|
13
|
+
export declare function applyConversationMemoryDefaults(userConfig?: Partial<ConversationMemoryConfig>): ConversationMemoryConfig;
|
14
|
+
/**
|
15
|
+
* Get conversation history as message array, summarizing if needed.
|
16
|
+
*/
|
17
|
+
export declare function getConversationMessages(conversationMemory: ConversationMemoryManager | RedisConversationMemoryManager | null | undefined, options: TextGenerationOptions): Promise<ChatMessage[]>;
|
18
|
+
/**
|
19
|
+
* Store conversation turn for future context
|
20
|
+
* Saves user messages and AI responses for conversation memory
|
21
|
+
*/
|
22
|
+
export declare function storeConversationTurn(conversationMemory: ConversationMemoryManager | RedisConversationMemoryManager | null | undefined, originalOptions: TextGenerationOptions, result: TextGenerationResult): Promise<void>;
|
@@ -0,0 +1,121 @@
|
|
1
|
+
/**
|
2
|
+
* Conversation Memory Utilities
|
3
|
+
* Handles configuration merging and conversation memory operations
|
4
|
+
*/
|
5
|
+
import { getConversationMemoryDefaults } from "../config/conversationMemory.js";
|
6
|
+
import { logger } from "./logger.js";
|
7
|
+
/**
|
8
|
+
* Apply conversation memory defaults to user configuration
|
9
|
+
* Merges user config with environment variables and default values
|
10
|
+
*/
|
11
|
+
export function applyConversationMemoryDefaults(userConfig) {
|
12
|
+
const defaults = getConversationMemoryDefaults();
|
13
|
+
return {
|
14
|
+
...defaults,
|
15
|
+
...userConfig,
|
16
|
+
};
|
17
|
+
}
|
18
|
+
/**
|
19
|
+
* Get conversation history as message array, summarizing if needed.
|
20
|
+
*/
|
21
|
+
export async function getConversationMessages(conversationMemory, options) {
|
22
|
+
if (!conversationMemory || !options.context) {
|
23
|
+
logger.warn("[conversationMemoryUtils] No memory or context, returning empty messages");
|
24
|
+
return [];
|
25
|
+
}
|
26
|
+
const sessionId = options.context?.sessionId;
|
27
|
+
if (typeof sessionId !== "string" || !sessionId) {
|
28
|
+
logger.warn("[conversationMemoryUtils] Invalid or missing sessionId in context", {
|
29
|
+
sessionIdType: typeof sessionId,
|
30
|
+
sessionIdValue: sessionId,
|
31
|
+
});
|
32
|
+
return [];
|
33
|
+
}
|
34
|
+
try {
|
35
|
+
// Remove duplicate summarization logic - it should be handled in ConversationMemoryManager
|
36
|
+
const messages = await conversationMemory.buildContextMessages(sessionId);
|
37
|
+
logger.debug("[conversationMemoryUtils] Conversation messages retrieved successfully", {
|
38
|
+
sessionId,
|
39
|
+
messageCount: messages.length,
|
40
|
+
messageTypes: messages.map((m) => m.role),
|
41
|
+
firstMessage: messages.length > 0
|
42
|
+
? {
|
43
|
+
role: messages[0].role,
|
44
|
+
contentLength: messages[0].content.length,
|
45
|
+
contentPreview: messages[0].content.substring(0, 50),
|
46
|
+
}
|
47
|
+
: null,
|
48
|
+
lastMessage: messages.length > 0
|
49
|
+
? {
|
50
|
+
role: messages[messages.length - 1].role,
|
51
|
+
contentLength: messages[messages.length - 1].content.length,
|
52
|
+
contentPreview: messages[messages.length - 1].content.substring(0, 50),
|
53
|
+
}
|
54
|
+
: null,
|
55
|
+
});
|
56
|
+
return messages;
|
57
|
+
}
|
58
|
+
catch (error) {
|
59
|
+
logger.warn("[conversationMemoryUtils] Failed to get conversation messages", {
|
60
|
+
sessionId,
|
61
|
+
memoryType: conversationMemory.constructor.name,
|
62
|
+
error: error instanceof Error ? error.message : String(error),
|
63
|
+
stack: error instanceof Error ? error.stack : undefined,
|
64
|
+
});
|
65
|
+
return [];
|
66
|
+
}
|
67
|
+
}
|
68
|
+
/**
|
69
|
+
* Store conversation turn for future context
|
70
|
+
* Saves user messages and AI responses for conversation memory
|
71
|
+
*/
|
72
|
+
export async function storeConversationTurn(conversationMemory, originalOptions, result) {
|
73
|
+
logger.debug("[conversationMemoryUtils] storeConversationTurn called", {
|
74
|
+
hasMemory: !!conversationMemory,
|
75
|
+
memoryType: conversationMemory?.constructor?.name || "NONE",
|
76
|
+
hasContext: !!originalOptions.context,
|
77
|
+
hasResult: !!result,
|
78
|
+
resultContentLength: result?.content?.length || 0,
|
79
|
+
});
|
80
|
+
if (!conversationMemory || !originalOptions.context) {
|
81
|
+
logger.debug("[conversationMemoryUtils] No memory or context, skipping conversation storage");
|
82
|
+
return;
|
83
|
+
}
|
84
|
+
const context = originalOptions.context;
|
85
|
+
const sessionId = context.sessionId;
|
86
|
+
const userId = typeof context.userId === "string" ? context.userId : undefined;
|
87
|
+
logger.debug("[conversationMemoryUtils] Extracted session details from context", {
|
88
|
+
sessionId,
|
89
|
+
userId,
|
90
|
+
contextKeys: Object.keys(context),
|
91
|
+
hasValidSessionId: typeof sessionId === "string" && !!sessionId,
|
92
|
+
});
|
93
|
+
if (typeof sessionId !== "string" || !sessionId) {
|
94
|
+
logger.warn("[conversationMemoryUtils] Invalid or missing sessionId in context", {
|
95
|
+
sessionIdType: typeof sessionId,
|
96
|
+
sessionIdValue: sessionId,
|
97
|
+
});
|
98
|
+
return;
|
99
|
+
}
|
100
|
+
const userMessage = originalOptions.originalPrompt || originalOptions.prompt || "";
|
101
|
+
const aiResponse = result.content;
|
102
|
+
try {
|
103
|
+
await conversationMemory.storeConversationTurn(sessionId, userId, userMessage, aiResponse);
|
104
|
+
logger.debug("[conversationMemoryUtils] Conversation turn stored successfully", {
|
105
|
+
sessionId,
|
106
|
+
userId,
|
107
|
+
memoryType: conversationMemory.constructor.name,
|
108
|
+
userMessageLength: userMessage.length,
|
109
|
+
aiResponseLength: aiResponse.length,
|
110
|
+
});
|
111
|
+
}
|
112
|
+
catch (error) {
|
113
|
+
logger.warn("[conversationMemoryUtils] Failed to store conversation turn", {
|
114
|
+
sessionId,
|
115
|
+
userId,
|
116
|
+
memoryType: conversationMemory.constructor.name,
|
117
|
+
error: error instanceof Error ? error.message : String(error),
|
118
|
+
stack: error instanceof Error ? error.stack : undefined,
|
119
|
+
});
|
120
|
+
}
|
121
|
+
}
|
@@ -2,7 +2,7 @@
|
|
2
2
|
* Conversation Memory Utilities
|
3
3
|
* Handles configuration merging and conversation memory operations
|
4
4
|
*/
|
5
|
-
import type { ConversationMemoryConfig, ChatMessage } from "../types/
|
5
|
+
import type { ConversationMemoryConfig, ChatMessage } from "../types/conversation.js";
|
6
6
|
import type { ConversationMemoryManager } from "../core/conversationMemoryManager.js";
|
7
7
|
import type { TextGenerationOptions, TextGenerationResult } from "../types/index.js";
|
8
8
|
/**
|
@@ -2,7 +2,7 @@
|
|
2
2
|
* Conversation Memory Utilities
|
3
3
|
* Handles configuration merging and conversation memory operations
|
4
4
|
*/
|
5
|
-
import { getConversationMemoryDefaults } from "../config/
|
5
|
+
import { getConversationMemoryDefaults } from "../config/conversationMemory.js";
|
6
6
|
import { logger } from "./logger.js";
|
7
7
|
/**
|
8
8
|
* Apply conversation memory defaults to user configuration
|
@@ -28,7 +28,7 @@ export async function getConversationMessages(conversationMemory, options) {
|
|
28
28
|
}
|
29
29
|
try {
|
30
30
|
// Remove duplicate summarization logic - it should be handled in ConversationMemoryManager
|
31
|
-
const messages = conversationMemory.buildContextMessages(sessionId);
|
31
|
+
const messages = await conversationMemory.buildContextMessages(sessionId);
|
32
32
|
logger.debug("Conversation messages retrieved", {
|
33
33
|
sessionId,
|
34
34
|
messageCount: messages.length,
|
@@ -2,7 +2,7 @@
|
|
2
2
|
* Message Builder Utility
|
3
3
|
* Centralized logic for building message arrays from TextGenerationOptions
|
4
4
|
*/
|
5
|
-
import type { ChatMessage } from "../types/
|
5
|
+
import type { ChatMessage } from "../types/conversation.js";
|
6
6
|
import type { TextGenerationOptions } from "../types/index.js";
|
7
7
|
import type { StreamOptions } from "../types/streamTypes.js";
|
8
8
|
/**
|
@@ -2,7 +2,7 @@
|
|
2
2
|
* Message Builder Utility
|
3
3
|
* Centralized logic for building message arrays from TextGenerationOptions
|
4
4
|
*/
|
5
|
-
import { CONVERSATION_INSTRUCTIONS } from "../config/
|
5
|
+
import { CONVERSATION_INSTRUCTIONS } from "../config/conversationMemory.js";
|
6
6
|
/**
|
7
7
|
* Build a properly formatted message array for AI providers
|
8
8
|
* Combines system prompt, conversation history, and current user prompt
|
@@ -0,0 +1,42 @@
|
|
1
|
+
/**
|
2
|
+
* Redis Utilities for NeuroLink
|
3
|
+
* Helper functions for Redis storage operations
|
4
|
+
*/
|
5
|
+
import { createClient } from "redis";
|
6
|
+
type RedisClient = ReturnType<typeof createClient>;
|
7
|
+
import type { ChatMessage, RedisStorageConfig } from "../types/conversation.js";
|
8
|
+
/**
|
9
|
+
* Creates a Redis client with the provided configuration
|
10
|
+
*/
|
11
|
+
export declare function createRedisClient(config: Required<RedisStorageConfig>): Promise<RedisClient>;
|
12
|
+
/**
|
13
|
+
* Generates a Redis key for session messages
|
14
|
+
*/
|
15
|
+
export declare function getSessionKey(config: Required<RedisStorageConfig>, sessionId: string): string;
|
16
|
+
/**
|
17
|
+
* Serializes messages for Redis storage
|
18
|
+
*/
|
19
|
+
export declare function serializeMessages(messages: ChatMessage[]): string;
|
20
|
+
/**
|
21
|
+
* Deserializes messages from Redis storage
|
22
|
+
*/
|
23
|
+
export declare function deserializeMessages(data: string | null): ChatMessage[];
|
24
|
+
/**
|
25
|
+
* Checks if Redis client is healthy
|
26
|
+
*/
|
27
|
+
export declare function isRedisHealthy(client: RedisClient): Promise<boolean>;
|
28
|
+
/**
|
29
|
+
* Scan Redis keys matching a pattern without blocking the server
|
30
|
+
* This is a non-blocking alternative to the KEYS command
|
31
|
+
*
|
32
|
+
* @param client Redis client
|
33
|
+
* @param pattern Pattern to match keys (e.g. "prefix:*")
|
34
|
+
* @param batchSize Number of keys to scan in each iteration (default: 100)
|
35
|
+
* @returns Array of keys matching the pattern
|
36
|
+
*/
|
37
|
+
export declare function scanKeys(client: RedisClient, pattern: string, batchSize?: number): Promise<string[]>;
|
38
|
+
/**
|
39
|
+
* Get normalized Redis configuration with defaults
|
40
|
+
*/
|
41
|
+
export declare function getNormalizedConfig(config: RedisStorageConfig): Required<RedisStorageConfig>;
|
42
|
+
export {};
|