mirror of
https://github.com/Mintplex-Labs/anything-llm.git
synced 2025-03-13 05:32:24 +00:00
Merge branch 'master' into lcg-feat-confluence
This commit is contained in:
commit
4a3e17651f
11 changed files with 736 additions and 8 deletions
.github/workflows
collector
locales
server/storage/models
2
.github/workflows/dev-build.yaml
vendored
2
.github/workflows/dev-build.yaml
vendored
|
@ -6,7 +6,7 @@ concurrency:
|
|||
|
||||
on:
|
||||
push:
|
||||
branches: ['agent-builder'] # put your current branch to create a build. Core team only.
|
||||
branches: ['ocr-parse-images'] # put your current branch to create a build. Core team only.
|
||||
paths-ignore:
|
||||
- '**.md'
|
||||
- 'cloud-deployments/*'
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
"@xenova/transformers": "^2.11.0",
|
||||
"bcrypt": "^5.1.0",
|
||||
"body-parser": "^1.20.2",
|
||||
"canvas": "^2.11.2",
|
||||
"cors": "^2.8.5",
|
||||
"dotenv": "^16.0.3",
|
||||
"epub2": "^3.0.2",
|
||||
|
@ -40,6 +41,7 @@
|
|||
"puppeteer": "~21.5.2",
|
||||
"sharp": "^0.33.5",
|
||||
"slugify": "^1.6.6",
|
||||
"tesseract.js": "^6.0.0",
|
||||
"url-pattern": "^1.0.3",
|
||||
"uuid": "^9.0.0",
|
||||
"wavefile": "^11.0.0",
|
||||
|
@ -50,4 +52,4 @@
|
|||
"nodemon": "^2.0.22",
|
||||
"prettier": "^2.4.1"
|
||||
}
|
||||
}
|
||||
}
|
48
collector/processSingleFile/convert/asImage.js
Normal file
48
collector/processSingleFile/convert/asImage.js
Normal file
|
@ -0,0 +1,48 @@
|
|||
const { v4 } = require("uuid");
|
||||
const { tokenizeString } = require("../../utils/tokenizer");
|
||||
const {
|
||||
createdDate,
|
||||
trashFile,
|
||||
writeToServerDocuments,
|
||||
} = require("../../utils/files");
|
||||
const OCRLoader = require("../../utils/OCRLoader");
|
||||
const { default: slugify } = require("slugify");
|
||||
|
||||
async function asImage({ fullFilePath = "", filename = "" }) {
|
||||
let content = await new OCRLoader().ocrImage(fullFilePath);
|
||||
|
||||
if (!content?.length) {
|
||||
console.error(`Resulting text content was empty for ${filename}.`);
|
||||
trashFile(fullFilePath);
|
||||
return {
|
||||
success: false,
|
||||
reason: `No text content found in ${filename}.`,
|
||||
documents: [],
|
||||
};
|
||||
}
|
||||
|
||||
console.log(`-- Working ${filename} --`);
|
||||
const data = {
|
||||
id: v4(),
|
||||
url: "file://" + fullFilePath,
|
||||
title: filename,
|
||||
docAuthor: "Unknown", // TODO: Find a better author
|
||||
description: "Unknown", // TODO: Find a better description
|
||||
docSource: "a text file uploaded by the user.",
|
||||
chunkSource: "",
|
||||
published: createdDate(fullFilePath),
|
||||
wordCount: content.split(" ").length,
|
||||
pageContent: content,
|
||||
token_count_estimate: tokenizeString(content),
|
||||
};
|
||||
|
||||
const document = writeToServerDocuments(
|
||||
data,
|
||||
`${slugify(filename)}-${data.id}`
|
||||
);
|
||||
trashFile(fullFilePath);
|
||||
console.log(`[SUCCESS]: ${filename} converted & ready for embedding.\n`);
|
||||
return { success: true, reason: null, documents: [document] };
|
||||
}
|
||||
|
||||
module.exports = asImage;
|
|
@ -7,6 +7,7 @@ const {
|
|||
const { tokenizeString } = require("../../../utils/tokenizer");
|
||||
const { default: slugify } = require("slugify");
|
||||
const PDFLoader = require("./PDFLoader");
|
||||
const OCRLoader = require("../../../utils/OCRLoader");
|
||||
|
||||
async function asPdf({ fullFilePath = "", filename = "" }) {
|
||||
const pdfLoader = new PDFLoader(fullFilePath, {
|
||||
|
@ -15,7 +16,14 @@ async function asPdf({ fullFilePath = "", filename = "" }) {
|
|||
|
||||
console.log(`-- Working ${filename} --`);
|
||||
const pageContent = [];
|
||||
const docs = await pdfLoader.load();
|
||||
let docs = await pdfLoader.load();
|
||||
|
||||
if (docs.length === 0) {
|
||||
console.log(
|
||||
`[asPDF] No text content found for ${filename}. Will attempt OCR parse.`
|
||||
);
|
||||
docs = await new OCRLoader().ocrPDF(fullFilePath);
|
||||
}
|
||||
|
||||
for (const doc of docs) {
|
||||
console.log(
|
||||
|
@ -28,7 +36,7 @@ async function asPdf({ fullFilePath = "", filename = "" }) {
|
|||
}
|
||||
|
||||
if (!pageContent.length) {
|
||||
console.error(`Resulting text content was empty for ${filename}.`);
|
||||
console.error(`[asPDF] Resulting text content was empty for ${filename}.`);
|
||||
trashFile(fullFilePath);
|
||||
return {
|
||||
success: false,
|
||||
|
|
52
collector/utils/OCRLoader/CanvasFactory.js
Normal file
52
collector/utils/OCRLoader/CanvasFactory.js
Normal file
|
@ -0,0 +1,52 @@
|
|||
/**
|
||||
* This is a factory for creating a canvas and context in Node.js
|
||||
* it is used to create a canvas and context for the PDFLoader for turning the PDF into an image
|
||||
* so we can later use the image to extract text from the PDF.
|
||||
*/
|
||||
class NodeCanvasFactory {
|
||||
constructor() {
|
||||
this.CanvasModule = null;
|
||||
}
|
||||
|
||||
async init() {
|
||||
this.CanvasModule = await import("canvas");
|
||||
this.Image = this.CanvasModule.Image;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a canvas and context for the PDFLoader
|
||||
* @param {number} width - The width of the canvas
|
||||
* @param {number} height - The height of the canvas
|
||||
* @param {boolean} transparent - Whether the canvas is transparent
|
||||
* @returns {{canvas: HTMLCanvasElement, context: CanvasRenderingContext2D}} - The canvas and context
|
||||
*/
|
||||
create(width, height, transparent = false) {
|
||||
const canvas = this.CanvasModule.createCanvas(width, height);
|
||||
const context = canvas.getContext("2d", { alpha: transparent });
|
||||
if (transparent) context.clearRect(0, 0, width, height);
|
||||
return {
|
||||
canvas,
|
||||
context,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Required for the PDFLoader pdfjs interation - do not remove or use directly.
|
||||
*/
|
||||
reset(canvasAndContext, width, height) {
|
||||
canvasAndContext.canvas.width = width;
|
||||
canvasAndContext.canvas.height = height;
|
||||
}
|
||||
|
||||
/**
|
||||
* Required for the PDFLoader pdfjs interation - do not remove or use directly.
|
||||
*/
|
||||
destroy(canvasAndContext) {
|
||||
canvasAndContext.canvas.width = 0;
|
||||
canvasAndContext.canvas.height = 0;
|
||||
canvasAndContext.canvas = null;
|
||||
canvasAndContext.context = null;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = NodeCanvasFactory;
|
251
collector/utils/OCRLoader/index.js
Normal file
251
collector/utils/OCRLoader/index.js
Normal file
|
@ -0,0 +1,251 @@
|
|||
const fs = require("fs");
|
||||
const os = require("os");
|
||||
const path = require("path");
|
||||
const NodeCanvasFactory = require("./CanvasFactory");
|
||||
|
||||
class OCRLoader {
|
||||
constructor() {
|
||||
this.cacheDir = path.resolve(
|
||||
process.env.STORAGE_DIR
|
||||
? path.resolve(process.env.STORAGE_DIR, `models`, `tesseract`)
|
||||
: path.resolve(__dirname, `../../../server/storage/models/tesseract`)
|
||||
);
|
||||
}
|
||||
|
||||
log(text, ...args) {
|
||||
console.log(`\x1b[36m[OCRLoader]\x1b[0m ${text}`, ...args);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a PDF file and returns an array of documents.
|
||||
* This function is reserved to parsing for SCANNED documents - digital documents are not supported in this function
|
||||
* @returns {Promise<{pageContent: string, metadata: object}[]>} An array of documents with page content and metadata.
|
||||
*/
|
||||
async ocrPDF(
|
||||
filePath,
|
||||
{ maxExecutionTime = 300_000, batchSize = 10, maxWorkers = null } = {}
|
||||
) {
|
||||
if (
|
||||
!filePath ||
|
||||
!fs.existsSync(filePath) ||
|
||||
!fs.statSync(filePath).isFile()
|
||||
) {
|
||||
this.log(`File ${filePath} does not exist. Skipping OCR.`);
|
||||
return [];
|
||||
}
|
||||
|
||||
const documentTitle = path.basename(filePath);
|
||||
this.log(`Starting OCR of ${documentTitle}`);
|
||||
const pdfjs = await import("pdf-parse/lib/pdf.js/v2.0.550/build/pdf.js");
|
||||
let buffer = fs.readFileSync(filePath);
|
||||
const canvasFactory = new NodeCanvasFactory();
|
||||
await canvasFactory.init();
|
||||
global.Image = canvasFactory.Image;
|
||||
|
||||
const pdfDocument = await pdfjs.getDocument({
|
||||
data: new Uint8Array(buffer),
|
||||
canvasFactory,
|
||||
}).promise;
|
||||
buffer = null;
|
||||
|
||||
const documents = [];
|
||||
const meta = await pdfDocument.getMetadata().catch(() => null);
|
||||
const metadata = {
|
||||
source: filePath,
|
||||
pdf: {
|
||||
version: "v2.0.550",
|
||||
info: meta?.info,
|
||||
metadata: meta?.metadata,
|
||||
totalPages: pdfDocument.numPages,
|
||||
},
|
||||
};
|
||||
|
||||
async function getPageAsBuffer(pageNumber, scale = 1) {
|
||||
let canvas = null;
|
||||
let context = null;
|
||||
try {
|
||||
const page = await pdfDocument.getPage(pageNumber);
|
||||
const viewport = page.getViewport(scale);
|
||||
({ canvas, context } = canvasFactory.create(
|
||||
viewport.width,
|
||||
viewport.height
|
||||
));
|
||||
await page.render({
|
||||
canvasFactory,
|
||||
canvasContext: context,
|
||||
viewport,
|
||||
}).promise;
|
||||
return canvas.toBuffer();
|
||||
} catch (e) {
|
||||
this.log(`Error getting page as buffer: ${e.message}`);
|
||||
return null;
|
||||
} finally {
|
||||
canvas = null;
|
||||
context = null;
|
||||
}
|
||||
}
|
||||
|
||||
const { createWorker, OEM } = require("tesseract.js");
|
||||
const BATCH_SIZE = batchSize;
|
||||
const MAX_EXECUTION_TIME = maxExecutionTime;
|
||||
const NUM_WORKERS = maxWorkers ?? Math.min(os.cpus().length, 4);
|
||||
const totalPages = pdfDocument.numPages;
|
||||
const workerPool = await Promise.all(
|
||||
Array(NUM_WORKERS)
|
||||
.fill(0)
|
||||
.map(() =>
|
||||
createWorker("eng", OEM.LSTM_ONLY, {
|
||||
cachePath: this.cacheDir,
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
const startTime = Date.now();
|
||||
try {
|
||||
this.log("Bootstrapping OCR completed successfully!", {
|
||||
MAX_EXECUTION_TIME_MS: MAX_EXECUTION_TIME,
|
||||
BATCH_SIZE,
|
||||
MAX_CONCURRENT_WORKERS: NUM_WORKERS,
|
||||
TOTAL_PAGES: totalPages,
|
||||
});
|
||||
const timeoutPromise = new Promise((_, reject) => {
|
||||
setTimeout(() => {
|
||||
reject(
|
||||
new Error(
|
||||
`OCR job took too long to complete (${
|
||||
MAX_EXECUTION_TIME / 1000
|
||||
} seconds)`
|
||||
)
|
||||
);
|
||||
}, MAX_EXECUTION_TIME);
|
||||
});
|
||||
|
||||
const processPages = async () => {
|
||||
for (
|
||||
let startPage = 1;
|
||||
startPage <= totalPages;
|
||||
startPage += BATCH_SIZE
|
||||
) {
|
||||
const endPage = Math.min(startPage + BATCH_SIZE - 1, totalPages);
|
||||
const pageNumbers = Array.from(
|
||||
{ length: endPage - startPage + 1 },
|
||||
(_, i) => startPage + i
|
||||
);
|
||||
this.log(`Working on pages ${startPage} - ${endPage}`);
|
||||
|
||||
const pageQueue = [...pageNumbers];
|
||||
const results = [];
|
||||
const workerPromises = workerPool.map(async (worker, workerIndex) => {
|
||||
while (pageQueue.length > 0) {
|
||||
const pageNum = pageQueue.shift();
|
||||
this.log(
|
||||
`\x1b[34m[Worker ${
|
||||
workerIndex + 1
|
||||
}]\x1b[0m assigned pg${pageNum}`
|
||||
);
|
||||
const imageBuffer = await getPageAsBuffer(pageNum, 5);
|
||||
const { data } = await worker.recognize(imageBuffer, {}, "text");
|
||||
this.log(
|
||||
`✅ \x1b[34m[Worker ${
|
||||
workerIndex + 1
|
||||
}]\x1b[0m completed pg${pageNum}`
|
||||
);
|
||||
results.push({
|
||||
pageContent: data.text,
|
||||
metadata: {
|
||||
...metadata,
|
||||
loc: { pageNumber: pageNum },
|
||||
},
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
await Promise.all(workerPromises);
|
||||
documents.push(
|
||||
...results.sort(
|
||||
(a, b) => a.metadata.loc.pageNumber - b.metadata.loc.pageNumber
|
||||
)
|
||||
);
|
||||
}
|
||||
return documents;
|
||||
};
|
||||
|
||||
await Promise.race([timeoutPromise, processPages()]);
|
||||
} catch (e) {
|
||||
this.log(`Error: ${e.message}`);
|
||||
} finally {
|
||||
global.Image = undefined;
|
||||
await Promise.all(workerPool.map((worker) => worker.terminate()));
|
||||
}
|
||||
|
||||
this.log(`Completed OCR of ${documentTitle}!`, {
|
||||
documentsParsed: documents.length,
|
||||
totalPages: totalPages,
|
||||
executionTime: `${((Date.now() - startTime) / 1000).toFixed(2)}s`,
|
||||
});
|
||||
return documents;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads an image file and returns the OCRed text.
|
||||
* @param {string} filePath - The path to the image file.
|
||||
* @param {Object} options - The options for the OCR.
|
||||
* @param {number} options.maxExecutionTime - The maximum execution time of the OCR in milliseconds.
|
||||
* @returns {Promise<string>} The OCRed text.
|
||||
*/
|
||||
async ocrImage(filePath, { maxExecutionTime = 300_000 } = {}) {
|
||||
let content = "";
|
||||
let worker = null;
|
||||
if (
|
||||
!filePath ||
|
||||
!fs.existsSync(filePath) ||
|
||||
!fs.statSync(filePath).isFile()
|
||||
) {
|
||||
this.log(`File ${filePath} does not exist. Skipping OCR.`);
|
||||
return null;
|
||||
}
|
||||
|
||||
const documentTitle = path.basename(filePath);
|
||||
try {
|
||||
this.log(`Starting OCR of ${documentTitle}`);
|
||||
const startTime = Date.now();
|
||||
const { createWorker, OEM } = require("tesseract.js");
|
||||
worker = await createWorker("eng", OEM.LSTM_ONLY, {
|
||||
cachePath: this.cacheDir,
|
||||
});
|
||||
|
||||
// Race the timeout with the OCR
|
||||
const timeoutPromise = new Promise((_, reject) => {
|
||||
setTimeout(() => {
|
||||
reject(
|
||||
new Error(
|
||||
`OCR job took too long to complete (${
|
||||
maxExecutionTime / 1000
|
||||
} seconds)`
|
||||
)
|
||||
);
|
||||
}, maxExecutionTime);
|
||||
});
|
||||
|
||||
const processImage = async () => {
|
||||
const { data } = await worker.recognize(filePath, {}, "text");
|
||||
content = data.text;
|
||||
};
|
||||
|
||||
await Promise.race([timeoutPromise, processImage()]);
|
||||
this.log(`Completed OCR of ${documentTitle}!`, {
|
||||
executionTime: `${((Date.now() - startTime) / 1000).toFixed(2)}s`,
|
||||
});
|
||||
|
||||
return content;
|
||||
} catch (e) {
|
||||
this.log(`Error: ${e.message}`);
|
||||
return null;
|
||||
} finally {
|
||||
if (!worker) return;
|
||||
await worker.terminate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = OCRLoader;
|
|
@ -27,6 +27,9 @@ const ACCEPTED_MIMES = {
|
|||
"video/mp4": [".mp4"],
|
||||
"video/mpeg": [".mpeg"],
|
||||
"application/epub+zip": [".epub"],
|
||||
"image/png": [".png"],
|
||||
"image/jpeg": [".jpg"],
|
||||
"image/jpg": [".jpg"],
|
||||
};
|
||||
|
||||
const SUPPORTED_FILETYPE_CONVERTERS = {
|
||||
|
@ -55,6 +58,10 @@ const SUPPORTED_FILETYPE_CONVERTERS = {
|
|||
".wav": "./convert/asAudio.js",
|
||||
".mp4": "./convert/asAudio.js",
|
||||
".mpeg": "./convert/asAudio.js",
|
||||
|
||||
".png": "./convert/asImage.js",
|
||||
".jpg": "./convert/asImage.js",
|
||||
".jpeg": "./convert/asImage.js",
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
const MimeLib = require("mime");
|
||||
class MimeDetector {
|
||||
nonTextTypes = ["multipart", "image", "model", "audio", "video", "font"];
|
||||
nonTextTypes = ["multipart", "model", "audio", "video", "font"];
|
||||
badMimes = [
|
||||
"application/octet-stream",
|
||||
"application/zip",
|
||||
|
|
|
@ -280,7 +280,7 @@
|
|||
"@langchain/core" "~0.1"
|
||||
js-tiktoken "^1.0.11"
|
||||
|
||||
"@mapbox/node-pre-gyp@^1.0.11":
|
||||
"@mapbox/node-pre-gyp@^1.0.0", "@mapbox/node-pre-gyp@^1.0.11":
|
||||
version "1.0.11"
|
||||
resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa"
|
||||
integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==
|
||||
|
@ -693,6 +693,11 @@ bluebird@~3.4.0:
|
|||
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3"
|
||||
integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==
|
||||
|
||||
bmp-js@^0.1.0:
|
||||
version "0.1.0"
|
||||
resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233"
|
||||
integrity sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==
|
||||
|
||||
body-parser@1.20.2, body-parser@^1.20.2:
|
||||
version "1.20.2"
|
||||
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd"
|
||||
|
@ -788,6 +793,15 @@ camelcase@6:
|
|||
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
|
||||
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
|
||||
|
||||
canvas@^2.11.2:
|
||||
version "2.11.2"
|
||||
resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.11.2.tgz#553d87b1e0228c7ac0fc72887c3adbac4abbd860"
|
||||
integrity sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==
|
||||
dependencies:
|
||||
"@mapbox/node-pre-gyp" "^1.0.0"
|
||||
nan "^2.17.0"
|
||||
simple-get "^3.0.3"
|
||||
|
||||
chalk@^2.4.2:
|
||||
version "2.4.2"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
|
||||
|
@ -1043,6 +1057,13 @@ decamelize@1.2.0:
|
|||
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
|
||||
integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==
|
||||
|
||||
decompress-response@^4.2.0:
|
||||
version "4.2.1"
|
||||
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986"
|
||||
integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==
|
||||
dependencies:
|
||||
mimic-response "^2.0.0"
|
||||
|
||||
decompress-response@^6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
|
||||
|
@ -1780,6 +1801,11 @@ iconv-lite@0.6.3, iconv-lite@^0.6.3:
|
|||
dependencies:
|
||||
safer-buffer ">= 2.1.2 < 3.0.0"
|
||||
|
||||
idb-keyval@^6.2.0:
|
||||
version "6.2.1"
|
||||
resolved "https://registry.yarnpkg.com/idb-keyval/-/idb-keyval-6.2.1.tgz#94516d625346d16f56f3b33855da11bfded2db33"
|
||||
integrity sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==
|
||||
|
||||
ieee754@^1.1.13, ieee754@^1.2.1:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
|
||||
|
@ -1903,6 +1929,11 @@ is-stream@^2.0.0:
|
|||
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
|
||||
integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
|
||||
|
||||
is-url@^1.2.4:
|
||||
version "1.2.4"
|
||||
resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
|
||||
integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==
|
||||
|
||||
isarray@~1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
|
||||
|
@ -2276,6 +2307,11 @@ mime@^3.0.0:
|
|||
resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7"
|
||||
integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==
|
||||
|
||||
mimic-response@^2.0.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43"
|
||||
integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==
|
||||
|
||||
mimic-response@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
|
||||
|
@ -2389,6 +2425,11 @@ mustache@^4.2.0:
|
|||
resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64"
|
||||
integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==
|
||||
|
||||
nan@^2.17.0:
|
||||
version "2.22.0"
|
||||
resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3"
|
||||
integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==
|
||||
|
||||
napi-build-utils@^1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806"
|
||||
|
@ -2431,7 +2472,7 @@ node-ensure@^0.0.0:
|
|||
resolved "https://registry.yarnpkg.com/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7"
|
||||
integrity sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw==
|
||||
|
||||
node-fetch@^2.6.12, node-fetch@^2.6.7:
|
||||
node-fetch@^2.6.12, node-fetch@^2.6.7, node-fetch@^2.6.9:
|
||||
version "2.7.0"
|
||||
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
|
||||
integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
|
||||
|
@ -2634,6 +2675,11 @@ openapi-types@^12.1.3:
|
|||
resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3"
|
||||
integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==
|
||||
|
||||
opencollective-postinstall@^2.0.3:
|
||||
version "2.0.3"
|
||||
resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259"
|
||||
integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==
|
||||
|
||||
option@~0.2.1:
|
||||
version "0.2.4"
|
||||
resolved "https://registry.yarnpkg.com/option/-/option-0.2.4.tgz#fd475cdf98dcabb3cb397a3ba5284feb45edbfe4"
|
||||
|
@ -2990,6 +3036,11 @@ readdirp@~3.6.0:
|
|||
dependencies:
|
||||
picomatch "^2.2.1"
|
||||
|
||||
regenerator-runtime@^0.13.3:
|
||||
version "0.13.11"
|
||||
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
|
||||
integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
|
||||
|
||||
require-directory@^2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
|
||||
|
@ -3204,6 +3255,15 @@ simple-concat@^1.0.0:
|
|||
resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
|
||||
integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
|
||||
|
||||
simple-get@^3.0.3:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55"
|
||||
integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==
|
||||
dependencies:
|
||||
decompress-response "^4.2.0"
|
||||
once "^1.3.1"
|
||||
simple-concat "^1.0.0"
|
||||
|
||||
simple-get@^4.0.0, simple-get@^4.0.1:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543"
|
||||
|
@ -3421,6 +3481,26 @@ tar@^6.1.11:
|
|||
mkdirp "^1.0.3"
|
||||
yallist "^4.0.0"
|
||||
|
||||
tesseract.js-core@^6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.yarnpkg.com/tesseract.js-core/-/tesseract.js-core-6.0.0.tgz#6f25da94f70f8e8f02aff47a43be61d49e6f67c3"
|
||||
integrity sha512-1Qncm/9oKM7xgrQXZXNB+NRh19qiXGhxlrR8EwFbK5SaUbPZnS5OMtP/ghtqfd23hsr1ZvZbZjeuAGcMxd/ooA==
|
||||
|
||||
tesseract.js@^6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.yarnpkg.com/tesseract.js/-/tesseract.js-6.0.0.tgz#62ff7fffc8833b5810430a4067785e49d5ca8e7f"
|
||||
integrity sha512-tqYCod1HwJzkeZw1l6XWx+ly2hhisGcBtak9MArhYwDAxL0NgeVhLJcUjqPxZMQtpgtVUzWcpZPryi+hnaQGVw==
|
||||
dependencies:
|
||||
bmp-js "^0.1.0"
|
||||
idb-keyval "^6.2.0"
|
||||
is-url "^1.2.4"
|
||||
node-fetch "^2.6.9"
|
||||
opencollective-postinstall "^2.0.3"
|
||||
regenerator-runtime "^0.13.3"
|
||||
tesseract.js-core "^6.0.0"
|
||||
wasm-feature-detect "^1.2.11"
|
||||
zlibjs "^0.3.1"
|
||||
|
||||
text-hex@1.0.x:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5"
|
||||
|
@ -3602,6 +3682,11 @@ vary@^1, vary@~1.1.2:
|
|||
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
|
||||
integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
|
||||
|
||||
wasm-feature-detect@^1.2.11:
|
||||
version "1.8.0"
|
||||
resolved "https://registry.yarnpkg.com/wasm-feature-detect/-/wasm-feature-detect-1.8.0.tgz#4e9f55b0a64d801f372fbb0324ed11ad3abd0c78"
|
||||
integrity sha512-zksaLKM2fVlnB5jQQDqKXXwYHLQUVH9es+5TOOHwGOVJOCeRBCiPjwSg+3tN2AdTCzjgli4jijCH290kXb/zWQ==
|
||||
|
||||
wavefile@^11.0.0:
|
||||
version "11.0.0"
|
||||
resolved "https://registry.yarnpkg.com/wavefile/-/wavefile-11.0.0.tgz#9302165874327ff63a704d00b154c753eaa1b8e7"
|
||||
|
@ -3766,6 +3851,11 @@ youtubei.js@^9.1.0:
|
|||
tslib "^2.5.0"
|
||||
undici "^5.19.1"
|
||||
|
||||
zlibjs@^0.3.1:
|
||||
version "0.3.1"
|
||||
resolved "https://registry.yarnpkg.com/zlibjs/-/zlibjs-0.3.1.tgz#50197edb28a1c42ca659cc8b4e6a9ddd6d444554"
|
||||
integrity sha512-+J9RrgTKOmlxFSDHo0pI1xM6BLVUv+o0ZT9ANtCxGkjIVCCUdx9alUF8Gm+dGLKbkkkidWIHFDZHDMpfITt4+w==
|
||||
|
||||
zod-to-json-schema@^3.22.3, zod-to-json-schema@^3.22.5:
|
||||
version "3.23.0"
|
||||
resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.23.0.tgz#4fc60e88d3c709eedbfaae3f92f8a7bf786469f2"
|
||||
|
|
269
locales/README.tr-TR.md
Normal file
269
locales/README.tr-TR.md
Normal file
|
@ -0,0 +1,269 @@
|
|||
<a name="readme-top"></a>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://anythingllm.com"><img src="https://github.com/Mintplex-Labs/anything-llm/blob/master/images/wordmark.png?raw=true" alt="AnythingLLM logo"></a>
|
||||
</p>
|
||||
|
||||
<div align='center'>
|
||||
<a href="https://trendshift.io/repositories/2415" target="_blank"><img src="https://trendshift.io/api/badge/repositories/2415" alt="Mintplex-Labs%2Fanything-llm | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
|
||||
</div>
|
||||
|
||||
<p align="center">
|
||||
<b>AnythingLLM:</b> Aradığınız hepsi bir arada yapay zeka uygulaması.<br />
|
||||
Belgelerinizle sohbet edin, yapay zeka ajanlarını kullanın, son derece özelleştirilebilir, çok kullanıcılı ve zahmetsiz kurulum!
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://discord.gg/6UyHPeGZAC" target="_blank">
|
||||
<img src="https://img.shields.io/badge/chat-mintplex_labs-blue.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAH1UExURQAAAP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////r6+ubn5+7u7/3+/v39/enq6urq6/v7+97f39rb26eoqT1BQ0pOT4+Rkuzs7cnKykZKS0NHSHl8fdzd3ejo6UxPUUBDRdzc3RwgIh8jJSAkJm5xcvHx8aanqB4iJFBTVezt7V5hYlJVVuLj43p9fiImKCMnKZKUlaaoqSElJ21wcfT09O3u7uvr6zE0Nr6/wCUpK5qcnf7+/nh7fEdKTHx+f0tPUOTl5aipqiouMGtubz5CRDQ4OsTGxufn515hY7a3uH1/gXBydIOFhlVYWvX29qaoqCQoKs7Pz/Pz87/AwUtOUNfY2dHR0mhrbOvr7E5RUy8zNXR2d/f39+Xl5UZJSx0hIzQ3Odra2/z8/GlsbaGjpERHSezs7L/BwScrLTQ4Odna2zM3Obm7u3x/gKSmp9jZ2T1AQu/v71pdXkVISr2+vygsLiInKTg7PaOlpisvMcXGxzk8PldaXPLy8u7u7rm6u7S1tsDBwvj4+MPExbe4ueXm5s/Q0Kyf7ewAAAAodFJOUwAABClsrNjx/QM2l9/7lhmI6jTB/kA1GgKJN+nea6vy/MLZQYeVKK3rVA5tAAAAAWJLR0QB/wIt3gAAAAd0SU1FB+cKBAAmMZBHjXIAAAISSURBVDjLY2CAAkYmZhZWNnYODnY2VhZmJkYGVMDIycXNw6sBBbw8fFycyEoYGfkFBDVQgKAAPyMjQl5IWEQDDYgIC8FUMDKKsmlgAWyiEBWMjGJY5YEqxMAqGMWFNXAAYXGgAkYJSQ2cQFKCkYFRShq3AmkpRgYJbghbU0tbB0Tr6ukbgGhDI10gySfBwCwDUWBsYmpmDqQtLK2sbTQ0bO3sHYA8GWYGWWj4WTs6Obu4ami4OTm7exhqeHp5+4DCVJZBDmqdr7ufn3+ArkZgkJ+fU3CIRmgYWFiOARYGvo5OQUHhEUAFTkF+kVHRsLBgkIeyYmLjwoOc4hMSk5JTnINS06DC8gwcEEZ6RqZGlpOfc3ZObl5+gZ+TR2ERWFyBQQFMF5eklmqUpQb5+ReU61ZUOvkFVVXXQBSAraitq29o1GiKcfLzc29u0mjxBzq0tQ0kww5xZHtHUGeXhkZhdxBYgZ4d0LI6c4gjwd7siQQraOp1AivQ6CuAKZCDBBRQQQNQgUb/BGf3cqCCiZOcnCe3QQIKHNRTpk6bDgpZjRkzg3pBQTBrdtCcuZCgluAD0vPmL1gIdvSixUuWgqNs2YJ+DUhkEYxuggkGmOQUcckrioPTJCOXEnZ5JS5YslbGnuyVERlDDFvGEUPOWvwqaH6RVkHKeuDMK6SKnHlVhTgx8jeTmqy6Eij7K6nLqiGyPwChsa1MUrnq1wAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMy0xMC0wNFQwMDozODo0OSswMDowMB9V0a8AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjMtMTAtMDRUMDA6Mzg6NDkrMDA6MDBuCGkTAAAAKHRFWHRkYXRlOnRpbWVzdGFtcAAyMDIzLTEwLTA0VDAwOjM4OjQ5KzAwOjAwOR1IzAAAAABJRU5ErkJggg==" alt="Discord">
|
||||
</a> |
|
||||
<a href="https://github.com/Mintplex-Labs/anything-llm/blob/master/LICENSE" target="_blank">
|
||||
<img src="https://img.shields.io/static/v1?label=license&message=MIT&color=white" alt="License">
|
||||
</a> |
|
||||
<a href="https://docs.anythingllm.com" target="_blank">
|
||||
Docs
|
||||
</a> |
|
||||
<a href="https://my.mintplexlabs.com/aio-checkout?product=anythingllm" target="_blank">
|
||||
Hosted Instance
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<b>English</b> · <a href='./locales/README.zh-CN.md'>简体中文</a> · <a href='./locales/README.ja-JP.md'>日本語</a> · <a href='./locales/README.tr-TR.md'>Turkish</a>
|
||||
</p>
|
||||
|
||||
|
||||
<p align="center">
|
||||
👉 Masaüstü için AnythingLLM (Mac, Windows ve Linux)! <a href="https://anythingllm.com/download" target="_blank"> Şimdi İndir</a>
|
||||
</p>
|
||||
|
||||
Herhangi bir belgeyi, kaynağı veya içeriği sohbet sırasında herhangi bir büyük dil modelinin referans olarak kullanabileceği bir bağlama dönüştürmenizi sağlayan tam kapsamlı bir uygulama. Bu uygulama, kullanmak istediğiniz LLM veya Vektör Veritabanını seçmenize olanak tanırken, çok kullanıcılı yönetim ve yetkilendirme desteği de sunar.
|
||||
|
||||

|
||||
|
||||
<details>
|
||||
<summary><kbd>Demoyu izle!</kbd></summary>
|
||||
|
||||
[](https://youtu.be/f95rGD9trL0)
|
||||
|
||||
</details>
|
||||
|
||||
### Ürün Genel Bakışı
|
||||
|
||||
AnythingLLM, ticari hazır büyük dil modellerini veya popüler açık kaynak LLM'leri ve vektör veritabanı çözümlerini kullanarak, hiçbir ödün vermeden özel bir ChatGPT oluşturmanıza olanak tanıyan tam kapsamlı bir uygulamadır. Bu uygulamayı yerel olarak çalıştırabilir veya uzaktan barındırarak sağladığınız belgelerle akıllı sohbetler gerçekleştirebilirsiniz.
|
||||
|
||||
AnythingLLM, belgelerinizi **"çalışma alanları" (workspaces)** adı verilen nesnelere ayırır. Bir çalışma alanı, bir sohbet dizisi gibi çalışır ancak belgelerinizi kapsülleyen bir yapı sunar. Çalışma alanları belgeleri paylaşabilir, ancak birbirleriyle iletişim kurmaz, böylece her çalışma alanının bağlamını temiz tutabilirsiniz.
|
||||
|
||||
## AnythingLLM’in Harika Özellikleri
|
||||
|
||||
- 🆕 [**Özel Yapay Zeka Ajanları**](https://docs.anythingllm.com/agent/custom/introduction)
|
||||
- 🆕 [**Kod yazmadan AI Ajanı oluşturma aracı**](https://docs.anythingllm.com/agent-flows/overview)
|
||||
- 🖼️ **Çoklu-mod desteği (hem kapalı kaynak hem de açık kaynak LLM'ler!)**
|
||||
- 👤 Çok kullanıcılı destek ve yetkilendirme _(Yalnızca Docker sürümünde)_
|
||||
- 🦾 Çalışma alanı içinde ajanlar (web'de gezinme vb.)
|
||||
- 💬 [Web sitenize gömülebilir özel sohbet aracı](https://github.com/Mintplex-Labs/anythingllm-embed/blob/main/README.md) _(Yalnızca Docker sürümünde)_
|
||||
- 📖 Çoklu belge türü desteği (PDF, TXT, DOCX vb.)
|
||||
- Sade ve kullanışlı sohbet arayüzü, sürükle-bırak özelliği ve net kaynak gösterimi.
|
||||
- %100 bulut konuşlandırmaya hazır.
|
||||
- [Tüm popüler kapalı ve açık kaynak LLM sağlayıcılarıyla](#supported-llms-embedder-models-speech-models-and-vector-databases) uyumlu.
|
||||
- Büyük belgeleri yönetirken zaman ve maliyet tasarrufu sağlayan dahili optimizasyonlar.
|
||||
- Özel entegrasyonlar için tam kapsamlı Geliştirici API’si.
|
||||
- Ve çok daha fazlası... Kurup keşfedin!
|
||||
|
||||
### Desteklenen LLM'ler, Embedding Modelleri, Konuşma Modelleri ve Vektör Veritabanları
|
||||
|
||||
**Büyük Dil Modelleri (LLMs):**
|
||||
|
||||
- [Any open-source llama.cpp compatible model](/server/storage/models/README.md#text-generation-llm-selection)
|
||||
- [OpenAI](https://openai.com)
|
||||
- [OpenAI (Generic)](https://openai.com)
|
||||
- [Azure OpenAI](https://azure.microsoft.com/en-us/products/ai-services/openai-service)
|
||||
- [AWS Bedrock](https://aws.amazon.com/bedrock/)
|
||||
- [Anthropic](https://www.anthropic.com/)
|
||||
- [NVIDIA NIM (chat models)](https://build.nvidia.com/explore/discover)
|
||||
- [Google Gemini Pro](https://ai.google.dev/)
|
||||
- [Hugging Face (chat models)](https://huggingface.co/)
|
||||
- [Ollama (chat models)](https://ollama.ai/)
|
||||
- [LM Studio (all models)](https://lmstudio.ai)
|
||||
- [LocalAi (all models)](https://localai.io/)
|
||||
- [Together AI (chat models)](https://www.together.ai/)
|
||||
- [Fireworks AI (chat models)](https://fireworks.ai/)
|
||||
- [Perplexity (chat models)](https://www.perplexity.ai/)
|
||||
- [OpenRouter (chat models)](https://openrouter.ai/)
|
||||
- [DeepSeek (chat models)](https://deepseek.com/)
|
||||
- [Mistral](https://mistral.ai/)
|
||||
- [Groq](https://groq.com/)
|
||||
- [Cohere](https://cohere.com/)
|
||||
- [KoboldCPP](https://github.com/LostRuins/koboldcpp)
|
||||
- [LiteLLM](https://github.com/BerriAI/litellm)
|
||||
- [Text Generation Web UI](https://github.com/oobabooga/text-generation-webui)
|
||||
- [Apipie](https://apipie.ai/)
|
||||
- [xAI](https://x.ai/)
|
||||
- [Novita AI (chat models)](https://novita.ai/model-api/product/llm-api?utm_source=github_anything-llm&utm_medium=github_readme&utm_campaign=link)
|
||||
|
||||
**Embedder modelleri:**
|
||||
|
||||
- [AnythingLLM Native Embedder](/server/storage/models/README.md) (default)
|
||||
- [OpenAI](https://openai.com)
|
||||
- [Azure OpenAI](https://azure.microsoft.com/en-us/products/ai-services/openai-service)
|
||||
- [LocalAi (all)](https://localai.io/)
|
||||
- [Ollama (all)](https://ollama.ai/)
|
||||
- [LM Studio (all)](https://lmstudio.ai)
|
||||
- [Cohere](https://cohere.com/)
|
||||
|
||||
**Ses Transkripsiyon Modelleri:**
|
||||
|
||||
- [AnythingLLM Built-in](https://github.com/Mintplex-Labs/anything-llm/tree/master/server/storage/models#audiovideo-transcription) (default)
|
||||
- [OpenAI](https://openai.com/)
|
||||
|
||||
**TTS (text-to-speech) desteği:**
|
||||
|
||||
- Native Browser Built-in (default)
|
||||
- [PiperTTSLocal - runs in browser](https://github.com/rhasspy/piper)
|
||||
- [OpenAI TTS](https://platform.openai.com/docs/guides/text-to-speech/voice-options)
|
||||
- [ElevenLabs](https://elevenlabs.io/)
|
||||
- Any OpenAI Compatible TTS service.
|
||||
|
||||
**STT (speech-to-text) desteği:**
|
||||
|
||||
- Native Browser Built-in (default)
|
||||
|
||||
**Vektör Databases:**
|
||||
|
||||
- [LanceDB](https://github.com/lancedb/lancedb) (default)
|
||||
- [Astra DB](https://www.datastax.com/products/datastax-astra)
|
||||
- [Pinecone](https://pinecone.io)
|
||||
- [Chroma](https://trychroma.com)
|
||||
- [Weaviate](https://weaviate.io)
|
||||
- [Qdrant](https://qdrant.tech)
|
||||
- [Milvus](https://milvus.io)
|
||||
- [Zilliz](https://zilliz.com)
|
||||
|
||||
### Teknik Genel Bakış
|
||||
|
||||
Bu monorepo üç ana bölümden oluşmaktadır:
|
||||
|
||||
- **`frontend`**: ViteJS + React tabanlı bir ön yüz, LLM'in kullanabileceği tüm içeriği kolayca oluşturup yönetmenizi sağlar.
|
||||
- **`server`**: NodeJS ve Express tabanlı bir sunucu, tüm etkileşimleri yönetir ve vektör veritabanı işlemleri ile LLM entegrasyonlarını gerçekleştirir.
|
||||
- **`collector`**: Kullanıcı arayüzünden gelen belgeleri işleyen ve ayrıştıran NodeJS Express tabanlı bir sunucu.
|
||||
- **`docker`**: Docker kurulum talimatları, derleme süreci ve kaynak koddan nasıl derleneceğine dair bilgiler içerir.
|
||||
- **`embed`**: [Web gömme widget’ı](https://github.com/Mintplex-Labs/anythingllm-embed) oluşturma ve entegrasyonu için alt modül.
|
||||
- **`browser-extension`**: [Chrome tarayıcı eklentisi](https://github.com/Mintplex-Labs/anythingllm-extension) için alt modül.
|
||||
|
||||
## 🛳 Kendi Sunucunuzda Barındırma
|
||||
|
||||
Mintplex Labs ve topluluk, AnythingLLM'i yerel olarak çalıştırmak için çeşitli dağıtım yöntemleri, betikler ve şablonlar sunmaktadır. Aşağıdaki tabloya göz atarak tercih ettiğiniz ortamda nasıl dağıtım yapabileceğinizi öğrenebilir veya otomatik dağıtım seçeneklerini keşfedebilirsiniz.
|
||||
| Docker | AWS | GCP | Digital Ocean | Render.com |
|
||||
|----------------------------------------|----|-----|---------------|------------|
|
||||
| [![Deploy on Docker][docker-btn]][docker-deploy] | [![Deploy on AWS][aws-btn]][aws-deploy] | [![Deploy on GCP][gcp-btn]][gcp-deploy] | [![Deploy on DigitalOcean][do-btn]][do-deploy] | [![Deploy on Render.com][render-btn]][render-deploy] |
|
||||
|
||||
| Railway | RepoCloud | Elestio |
|
||||
| --- | --- | --- |
|
||||
| [![Deploy on Railway][railway-btn]][railway-deploy] | [![Deploy on RepoCloud][repocloud-btn]][repocloud-deploy] | [![Deploy on Elestio][elestio-btn]][elestio-deploy] |
|
||||
|
||||
[veya Docker kullanmadan üretim ortamında AnythingLLM kurun →](./BARE_METAL.md)
|
||||
|
||||
## Geliştirme İçin Kurulum
|
||||
|
||||
- `yarn setup` → Uygulamanın her bileşeni için gerekli `.env` dosyalarını oluşturur (repo’nun kök dizininden çalıştırılmalıdır).
|
||||
- Devam etmeden önce bu dosyaları doldurun. **Özellikle `server/.env.development` dosyasının doldurulduğundan emin olun**, aksi takdirde sistem düzgün çalışmaz.
|
||||
- `yarn dev:server` → Sunucuyu yerel olarak başlatır (repo’nun kök dizininden çalıştırılmalıdır).
|
||||
- `yarn dev:frontend` → Ön yüzü yerel olarak çalıştırır (repo’nun kök dizininden çalıştırılmalıdır).
|
||||
- `yarn dev:collector` → Belge toplayıcıyı çalıştırır (repo’nun kök dizininden çalıştırılmalıdır).
|
||||
|
||||
[Belgeler hakkında bilgi edinin](./server/storage/documents/DOCUMENTS.md)
|
||||
|
||||
[Vektör önbellekleme hakkında bilgi edinin](./server/storage/vector-cache/VECTOR_CACHE.md)
|
||||
|
||||
## Harici Uygulamalar ve Entegrasyonlar
|
||||
|
||||
_Bu uygulamalar Mintplex Labs tarafından yönetilmemektedir, ancak AnythingLLM ile uyumludur. Burada listelenmeleri bir onay anlamına gelmez._
|
||||
|
||||
- [Midori AI Alt Sistem Yöneticisi](https://io.midori-ai.xyz/subsystem/anythingllm/) - Docker konteyner teknolojisini kullanarak yapay zeka sistemlerini verimli bir şekilde dağıtmanın pratik bir yolu.
|
||||
- [Coolify](https://coolify.io/docs/services/anythingllm/) - Tek tıklamayla AnythingLLM dağıtımı yapmanıza olanak tanır.
|
||||
- [GPTLocalhost for Microsoft Word](https://gptlocalhost.com/demo/) - AnythingLLM’i Microsoft Word içinde kullanmanıza olanak tanıyan yerel bir Word eklentisi.
|
||||
|
||||
## Telemetri ve Gizlilik
|
||||
|
||||
Mintplex Labs Inc. tarafından geliştirilen AnythingLLM, anonim kullanım bilgilerini toplayan bir telemetri özelliği içermektedir.
|
||||
|
||||
<details>
|
||||
<summary><kbd>AnythingLLM için Telemetri ve Gizlilik hakkında daha fazla bilgi</kbd></summary>
|
||||
|
||||
### Neden?
|
||||
|
||||
Bu bilgileri, AnythingLLM’in nasıl kullanıldığını anlamak, yeni özellikler ve hata düzeltmelerine öncelik vermek ve uygulamanın performansını ve kararlılığını iyileştirmek için kullanıyoruz.
|
||||
|
||||
### Telemetriden Çıkış Yapma (Opt-Out)
|
||||
|
||||
Sunucu veya Docker `.env` ayarlarında `DISABLE_TELEMETRY` değerini "true" olarak ayarlayarak telemetriyi devre dışı bırakabilirsiniz. Ayrıca, uygulama içinde **Kenar Çubuğu > Gizlilik** bölümüne giderek de bu özelliği kapatabilirsiniz.
|
||||
|
||||
### Hangi Verileri Açıkça Takip Ediyoruz?
|
||||
|
||||
Yalnızca ürün ve yol haritası kararlarını almamıza yardımcı olacak kullanım detaylarını takip ediyoruz:
|
||||
|
||||
- Kurulum türü (Docker veya Masaüstü)
|
||||
- Bir belgenin eklenme veya kaldırılma olayı. **Belgenin içeriği hakkında hiçbir bilgi toplanmaz**, yalnızca olayın gerçekleştiği kaydedilir. Bu, kullanım sıklığını anlamamıza yardımcı olur.
|
||||
- Kullanılan vektör veritabanı türü. Hangi sağlayıcının daha çok tercih edildiğini belirlemek için bu bilgiyi topluyoruz.
|
||||
- Kullanılan LLM türü. En popüler modelleri belirleyerek bu sağlayıcılara öncelik verebilmemizi sağlar.
|
||||
- Sohbet başlatılması. Bu en sık gerçekleşen "olay" olup, projenin günlük etkinliği hakkında genel bir fikir edinmemize yardımcı olur. **Yalnızca olay kaydedilir, sohbetin içeriği veya doğası hakkında hiçbir bilgi toplanmaz.**
|
||||
|
||||
Bu verileri doğrulamak için kod içinde **`Telemetry.sendTelemetry` çağrılarını** inceleyebilirsiniz. Ayrıca, bu olaylar günlük kaydına yazıldığı için hangi verilerin gönderildiğini görebilirsiniz (eğer etkinleştirilmişse). **IP adresi veya diğer tanımlayıcı bilgiler toplanmaz.** Telemetri sağlayıcısı, açık kaynaklı bir telemetri toplama hizmeti olan [PostHog](https://posthog.com/)‘dur.
|
||||
|
||||
[Kaynak kodda tüm telemetri olaylarını görüntüle](https://github.com/search?q=repo%3AMintplex-Labs%2Fanything-llm%20.sendTelemetry\(&type=code)
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
## 👋 Katkıda Bulunma
|
||||
|
||||
- Bir **issue** oluşturun.
|
||||
- `<issue numarası>-<kısa ad>` formatında bir **PR (Pull Request)** oluşturun.
|
||||
- Çekirdek ekipten **LGTM (Looks Good To Me)** onayı alın.
|
||||
|
||||
## 🌟 Katkıda Bulunanlar
|
||||
|
||||
[](https://github.com/mintplex-labs/anything-llm/graphs/contributors)
|
||||
|
||||
[](https://star-history.com/#mintplex-labs/anything-llm&Date)
|
||||
|
||||
## 🔗 Diğer Ürünler
|
||||
|
||||
- **[VectorAdmin][vector-admin]:** Vektör veritabanlarını yönetmek için hepsi bir arada GUI ve araç paketi.
|
||||
- **[OpenAI Assistant Swarm][assistant-swarm]:** Tüm OpenAI asistanlarınızı tek bir ajan tarafından yönetilen bir yapay zeka ordusuna dönüştürün.
|
||||
|
||||
<div align="right">
|
||||
|
||||
[![][back-to-top]](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
---
|
||||
|
||||
Telif Hakkı © 2025 [Mintplex Labs][profile-link]. <br />
|
||||
Bu proje [MIT](./LICENSE) lisansı ile lisanslanmıştır.
|
||||
|
||||
<!-- LINK GROUP -->
|
||||
|
||||
[back-to-top]: https://img.shields.io/badge/-BACK_TO_TOP-222628?style=flat-square
|
||||
[profile-link]: https://github.com/mintplex-labs
|
||||
[vector-admin]: https://github.com/mintplex-labs/vector-admin
|
||||
[assistant-swarm]: https://github.com/Mintplex-Labs/openai-assistant-swarm
|
||||
[docker-btn]: ./images/deployBtns/docker.png
|
||||
[docker-deploy]: ./docker/HOW_TO_USE_DOCKER.md
|
||||
[aws-btn]: ./images/deployBtns/aws.png
|
||||
[aws-deploy]: ./cloud-deployments/aws/cloudformation/DEPLOY.md
|
||||
[gcp-btn]: https://deploy.cloud.run/button.svg
|
||||
[gcp-deploy]: ./cloud-deployments/gcp/deployment/DEPLOY.md
|
||||
[do-btn]: https://www.deploytodo.com/do-btn-blue.svg
|
||||
[do-deploy]: ./cloud-deployments/digitalocean/terraform/DEPLOY.md
|
||||
[render-btn]: https://render.com/images/deploy-to-render-button.svg
|
||||
[render-deploy]: https://render.com/deploy?repo=https://github.com/Mintplex-Labs/anything-llm&branch=render
|
||||
[render-btn]: https://render.com/images/deploy-to-render-button.svg
|
||||
[render-deploy]: https://render.com/deploy?repo=https://github.com/Mintplex-Labs/anything-llm&branch=render
|
||||
[railway-btn]: https://railway.app/button.svg
|
||||
[railway-deploy]: https://railway.app/template/HNSCS1?referralCode=WFgJkn
|
||||
[repocloud-btn]: https://d16t0pc4846x52.cloudfront.net/deploylobe.svg
|
||||
[repocloud-deploy]: https://repocloud.io/details/?app_id=276
|
||||
[elestio-btn]: https://elest.io/images/logos/deploy-to-elestio-btn.png
|
||||
[elestio-deploy]: https://elest.io/open-source/anythingllm
|
3
server/storage/models/.gitignore
vendored
3
server/storage/models/.gitignore
vendored
|
@ -6,4 +6,5 @@ apipie
|
|||
novita
|
||||
mixedbread-ai*
|
||||
gemini
|
||||
togetherAi
|
||||
togetherAi
|
||||
tesseract
|
Loading…
Add table
Reference in a new issue