feat: enhance conversation ID generation and implement upsert for AI conversations
This commit is contained in:
@@ -799,8 +799,22 @@ Responde de forma directa y útil:`;
|
|||||||
const databases = getDatabases();
|
const databases = getDatabases();
|
||||||
if (!databases) return;
|
if (!databases) return;
|
||||||
|
|
||||||
const conversationId = context.conversationId || `${context.userId}-${context.guildId || 'dm'}-${Date.now()}`;
|
// Generar un ID válido para Appwrite (máximo 36 caracteres, solo a-z, A-Z, 0-9, ., -, _)
|
||||||
|
let conversationId = context.conversationId;
|
||||||
|
if (!conversationId) {
|
||||||
|
// Crear un ID más corto y válido
|
||||||
|
const userIdShort = context.userId.slice(-8); // Últimos 8 caracteres del userId
|
||||||
|
const guildIdShort = context.guildId ? context.guildId.slice(-8) : 'dm';
|
||||||
|
const timestamp = Date.now().toString(36); // Base36 para hacer más corto
|
||||||
|
conversationId = `ai_${userIdShort}_${guildIdShort}_${timestamp}`;
|
||||||
|
|
||||||
|
// Asegurar que no exceda 36 caracteres
|
||||||
|
if (conversationId.length > 36) {
|
||||||
|
conversationId = conversationId.slice(0, 36);
|
||||||
|
}
|
||||||
|
|
||||||
context.conversationId = conversationId;
|
context.conversationId = conversationId;
|
||||||
|
}
|
||||||
|
|
||||||
const appwriteData: AppwriteConversation = {
|
const appwriteData: AppwriteConversation = {
|
||||||
userId: context.userId,
|
userId: context.userId,
|
||||||
@@ -818,12 +832,23 @@ Responde de forma directa y útil:`;
|
|||||||
createdAt: Date.now()
|
createdAt: Date.now()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Usar upsert para actualizar si ya existe
|
||||||
|
try {
|
||||||
|
await databases.updateDocument(
|
||||||
|
APPWRITE_DATABASE_ID,
|
||||||
|
APPWRITE_COLLECTION_AI_CONVERSATIONS_ID,
|
||||||
|
conversationId,
|
||||||
|
appwriteData
|
||||||
|
);
|
||||||
|
} catch (updateError) {
|
||||||
|
// Si no existe, crearlo
|
||||||
await databases.createDocument(
|
await databases.createDocument(
|
||||||
APPWRITE_DATABASE_ID,
|
APPWRITE_DATABASE_ID,
|
||||||
APPWRITE_COLLECTION_AI_CONVERSATIONS_ID,
|
APPWRITE_COLLECTION_AI_CONVERSATIONS_ID,
|
||||||
conversationId,
|
conversationId,
|
||||||
appwriteData
|
appwriteData
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
logger.debug(`Conversación guardada en Appwrite: ${conversationId}`);
|
logger.debug(`Conversación guardada en Appwrite: ${conversationId}`);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -843,15 +868,27 @@ Responde de forma directa y útil:`;
|
|||||||
const databases = getDatabases();
|
const databases = getDatabases();
|
||||||
if (!databases) return null;
|
if (!databases) return null;
|
||||||
|
|
||||||
|
// Construir queries válidas para Appwrite
|
||||||
|
const queries = [];
|
||||||
|
|
||||||
|
// Query por userId (siempre requerido)
|
||||||
|
queries.push(`userId="${userId}"`);
|
||||||
|
|
||||||
|
// Query por guildId si existe
|
||||||
|
if (guildId) {
|
||||||
|
queries.push(`guildId="${guildId}"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Query por channelId si existe
|
||||||
|
if (channelId) {
|
||||||
|
queries.push(`channelId="${channelId}"`);
|
||||||
|
}
|
||||||
|
|
||||||
// Buscar conversaciones recientes del usuario
|
// Buscar conversaciones recientes del usuario
|
||||||
const response = await databases.listDocuments(
|
const response = await databases.listDocuments(
|
||||||
APPWRITE_DATABASE_ID,
|
APPWRITE_DATABASE_ID,
|
||||||
APPWRITE_COLLECTION_AI_CONVERSATIONS_ID,
|
APPWRITE_COLLECTION_AI_CONVERSATIONS_ID,
|
||||||
[
|
queries
|
||||||
`userId=${userId}`,
|
|
||||||
guildId ? `guildId=${guildId}` : '',
|
|
||||||
channelId ? `channelId=${channelId}` : ''
|
|
||||||
].filter(Boolean)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
if (response.documents.length === 0) {
|
if (response.documents.length === 0) {
|
||||||
@@ -859,18 +896,18 @@ Responde de forma directa y útil:`;
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Obtener la conversación más reciente
|
// Obtener la conversación más reciente
|
||||||
const latestDoc = response.documents.sort((a: any, b: any) => b.lastActivity - a.lastActivity)[0];
|
const latestDoc = response.documents.sort((a: any, b: any) => (b.lastActivity || 0) - (a.lastActivity || 0))[0];
|
||||||
const data = latestDoc as any as AppwriteConversation;
|
const data = latestDoc as any as AppwriteConversation;
|
||||||
|
|
||||||
// Crear contexto desde los datos de Appwrite
|
// Crear contexto desde los datos de Appwrite
|
||||||
const context: ConversationContext = {
|
const context: ConversationContext = {
|
||||||
messages: data.messages.map(msg => ({
|
messages: (data.messages || []).map(msg => ({
|
||||||
...msg,
|
...msg,
|
||||||
tokens: this.estimateTokens(msg.content)
|
tokens: this.estimateTokens(msg.content)
|
||||||
})),
|
})),
|
||||||
totalTokens: data.messages.reduce((sum, msg) => sum + this.estimateTokens(msg.content), 0),
|
totalTokens: (data.messages || []).reduce((sum, msg) => sum + this.estimateTokens(msg.content), 0),
|
||||||
imageRequests: 0, // Resetear conteo de imágenes
|
imageRequests: 0, // Resetear conteo de imágenes
|
||||||
lastActivity: data.lastActivity,
|
lastActivity: data.lastActivity || Date.now(),
|
||||||
userId: data.userId,
|
userId: data.userId,
|
||||||
guildId: data.guildId,
|
guildId: data.guildId,
|
||||||
channelId: data.channelId,
|
channelId: data.channelId,
|
||||||
|
|||||||
Reference in New Issue
Block a user