From dd23577c2281ebf01f98b7af42bc99d08858a993 Mon Sep 17 00:00:00 2001 From: AlexVillaTor Date: Sat, 21 Mar 2026 12:40:11 -0400 Subject: [PATCH] =?UTF-8?q?feat:=20integraci=C3=B3n=20de=20subida=20de=20d?= =?UTF-8?q?ocumentos=20y=20contexto=20global=20de=20AI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 90 +++++++++++++++++++++++++++++++++++++++++ package.json | 2 + src/ai/ai.controller.ts | 12 +++++- src/ai/ai.service.ts | 23 +++++++++-- ts_errors.txt | 0 5 files changed, 123 insertions(+), 4 deletions(-) create mode 100644 ts_errors.txt diff --git a/package-lock.json b/package-lock.json index b684fe3..619e25b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,8 @@ "@nestjs/core": "^10.0.0", "@nestjs/platform-express": "^10.0.0", "@nestjs/swagger": "^7.4.2", + "@types/express": "^5.0.6", + "@types/multer": "^2.1.0", "axios": "^1.13.6", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", @@ -567,6 +569,63 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", + "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" + }, + "node_modules/@types/multer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-2.1.0.tgz", + "integrity": "sha512-zYZb0+nJhOHtPpGDb3vqPjwpdeGlGC157VpkqNQL+UU2qwoacoQ7MpsAmUptI/0Oa127X32JzWDqQVEXp2RcIA==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, "node_modules/@types/node": { "version": "18.19.130", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", @@ -576,6 +635,37 @@ "undici-types": "~5.26.4" } }, + "node_modules/@types/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, "node_modules/@types/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", diff --git a/package.json b/package.json index 30ea720..7b6c6d2 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,8 @@ "@nestjs/core": "^10.0.0", "@nestjs/platform-express": "^10.0.0", "@nestjs/swagger": "^7.4.2", + "@types/express": "^5.0.6", + "@types/multer": "^2.1.0", "axios": "^1.13.6", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", diff --git a/src/ai/ai.controller.ts b/src/ai/ai.controller.ts index 48c3e2e..d5ffd5b 100644 --- a/src/ai/ai.controller.ts +++ b/src/ai/ai.controller.ts @@ -1,4 +1,5 @@ -import { Body, Controller, Get, Post } from '@nestjs/common'; +import { Body, Controller, Get, Post, UseInterceptors, UploadedFiles } from '@nestjs/common'; +import { FilesInterceptor } from '@nestjs/platform-express'; import { AiService } from './ai.service'; import { AgentRunDto, @@ -91,6 +92,15 @@ export class AiController { return this.aiService.continueConversation(dto); } + @Post('documents/upload') + @UseInterceptors(FilesInterceptor('files')) + uploadProjectDocuments( + @UploadedFiles() files: Array, + @Body('projectId') projectId: string, + ) { + return this.aiService.processUploadedDocuments(files, projectId); + } + @Post('agent/run') runFoundryAgent(@Body() dto: AgentRunDto) { return this.aiService.runFoundryAgent(dto); diff --git a/src/ai/ai.service.ts b/src/ai/ai.service.ts index 407b63b..a4debda 100644 --- a/src/ai/ai.service.ts +++ b/src/ai/ai.service.ts @@ -115,10 +115,27 @@ export class AiService { }; } + async processUploadedDocuments(files: Array, projectId: string) { + if (!files || files.length === 0) { + return { success: false, message: 'No se recibieron archivos' }; + } + + // Aquí iría el código real para extraer el texto y crear los Embeddings en VectorDB (Qdrant, Pinecone, etc) + const fileNames = files.map(f => f.originalname); + console.log(`Procesando documentos para el proyecto ${projectId}:`, fileNames); + + return { + success: true, + message: `Se procesaron exitosamente ${files.length} documento(s)`, + files: fileNames, + projectId + }; + } + async continueConversation(dto: ConversationDto) { - const rawMessages = dto.message - ? [{ role: 'user' as const, content: dto.message }] - : (dto.messages ?? []); + const rawMessages = dto.messages && dto.messages.length > 0 + ? dto.messages + : (dto.message ? [{ role: 'user' as const, content: dto.message }] : []); const messages: MistralChatMessage[] = rawMessages.map((message) => ({ role: message.role, diff --git a/ts_errors.txt b/ts_errors.txt new file mode 100644 index 0000000..e69de29