mirror of
https://github.com/oobabooga/text-generation-webui.git
synced 2026-02-20 14:44:58 +01:00
Merge branch 'dev' into multi-user
This commit is contained in:
commit
212a88a6f5
25
README.md
25
README.md
|
|
@ -13,7 +13,7 @@
|
|||
|
||||
# Text Generation Web UI
|
||||
|
||||
A Gradio web UI for Large Language Models.
|
||||
Run AI chatbots like ChatGPT on your own computer. **100% private and offline** – no subscriptions, no API fees, zero telemetry. Just download, unzip, and run.
|
||||
|
||||
[Try the Deep Reason extension](https://oobabooga.gumroad.com/l/deep_reason)
|
||||
|
||||
|
|
@ -21,38 +21,35 @@ A Gradio web UI for Large Language Models.
|
|||
|:---:|:---:|
|
||||
| |  |
|
||||
|
||||
## 🔥 News
|
||||
|
||||
- The project now supports **image generation**! Including Z-Image-Turbo, 4bit/8bit quantization, `torch.compile`, and LLM-generated prompt variations ([tutorial](https://github.com/oobabooga/text-generation-webui/wiki/Image-Generation-Tutorial)).
|
||||
|
||||
## Features
|
||||
|
||||
- Supports multiple local text generation backends, including [llama.cpp](https://github.com/ggerganov/llama.cpp), [Transformers](https://github.com/huggingface/transformers), [ExLlamaV3](https://github.com/turboderp-org/exllamav3), [ExLlamaV2](https://github.com/turboderp-org/exllamav2), and [TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM) (the latter via its own [Dockerfile](https://github.com/oobabooga/text-generation-webui/blob/main/docker/TensorRT-LLM/Dockerfile)).
|
||||
- Easy setup: Choose between **portable builds** (zero setup, just unzip and run) for GGUF models on Windows/Linux/macOS, or the one-click installer that creates a self-contained `installer_files` directory.
|
||||
- 100% offline and private, with zero telemetry, external resources, or remote update requests.
|
||||
- **File attachments**: Upload text files, PDF documents, and .docx documents to talk about their contents.
|
||||
- **Vision (multimodal models)**: Attach images to messages for visual understanding ([tutorial](https://github.com/oobabooga/text-generation-webui/wiki/Multimodal-Tutorial)).
|
||||
- **Image generation**: A dedicated tab for `diffusers` models like **Z-Image-Turbo**. Features 4-bit/8-bit quantization and a persistent gallery with metadata ([tutorial](https://github.com/oobabooga/text-generation-webui/wiki/Image-Generation-Tutorial)).
|
||||
- **Web search**: Optionally search the internet with LLM-generated queries to add context to the conversation.
|
||||
- Aesthetic UI with dark and light themes.
|
||||
- Syntax highlighting for code blocks and LaTeX rendering for mathematical expressions.
|
||||
- Aesthetic UI with dark/light themes, syntax highlighting, and LaTeX rendering.
|
||||
- Edit messages, navigate between message versions, and branch conversations at any point.
|
||||
- Switch between models without restarting, with automatic GPU layer allocation.
|
||||
- Free-form text generation in the Notebook tab without being limited to chat turns.
|
||||
- `instruct` mode for instruction-following (like ChatGPT), and `chat-instruct`/`chat` modes for talking to custom characters.
|
||||
- Automatic prompt formatting using Jinja2 templates. You don't need to ever worry about prompt formats.
|
||||
- Edit messages, navigate between message versions, and branch conversations at any point.
|
||||
- Multiple sampling parameters and generation options for sophisticated text generation control.
|
||||
- Switch between different models in the UI without restarting.
|
||||
- Automatic GPU layers for GGUF models (on NVIDIA GPUs).
|
||||
- Free-form text generation in the Notebook tab without being limited to chat turns.
|
||||
- Supports multiple backends including [llama.cpp](https://github.com/ggerganov/llama.cpp), [Transformers](https://github.com/huggingface/transformers), [ExLlamaV3](https://github.com/turboderp-org/exllamav3), [ExLlamaV2](https://github.com/turboderp-org/exllamav2), and [TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM).
|
||||
- OpenAI-compatible API with Chat and Completions endpoints, including tool-calling support – see [examples](https://github.com/oobabooga/text-generation-webui/wiki/12-%E2%80%90-OpenAI-API#examples).
|
||||
- Extension support, with numerous built-in and user-contributed extensions available. See the [wiki](https://github.com/oobabooga/text-generation-webui/wiki/07-%E2%80%90-Extensions) and [extensions directory](https://github.com/oobabooga/text-generation-webui-extensions) for details.
|
||||
|
||||
## 🔥 News
|
||||
|
||||
- The project now supports **image generation**! Including Z-Image-Turbo, 4bit/8bit quantization, `torch.compile`, and LLM-generated prompt variations ([tutorial](https://github.com/oobabooga/text-generation-webui/wiki/Image-Generation-Tutorial)).
|
||||
|
||||
## How to install
|
||||
|
||||
#### ✅ Option 1: Portable builds (get started in 1 minute)
|
||||
|
||||
No installation needed – just download, unzip and run. All dependencies included.
|
||||
|
||||
Compatible with GGUF (llama.cpp) models on Windows, Linux, and macOS.
|
||||
Compatible with GGUF (llama.cpp) models on Windows, Linux, and macOS. [Check what models fit your hardware](https://huggingface.co/spaces/oobabooga/accurate-gguf-vram-calculator).
|
||||
|
||||
Download from here: **https://github.com/oobabooga/text-generation-webui/releases**
|
||||
|
||||
|
|
|
|||
85
js/highlightjs/highlightjs-copy.min.js
vendored
85
js/highlightjs/highlightjs-copy.min.js
vendored
|
|
@ -1 +1,84 @@
|
|||
class CopyButtonPlugin{constructor(options={}){self.hook=options.hook;self.callback=options.callback;self.lang=options.lang||document.documentElement.lang||"en"}"after:highlightElement"({el,text}){let button=Object.assign(document.createElement("button"),{innerHTML:locales[lang]?.[0]||"Copy",className:"hljs-copy-button"});button.dataset.copied=false;el.parentElement.classList.add("hljs-copy-wrapper");el.parentElement.appendChild(button);el.parentElement.style.setProperty("--hljs-theme-background",window.getComputedStyle(el).backgroundColor);button.onclick=function(){if(!navigator.clipboard)return;let newText=text;if(hook&&typeof hook==="function"){newText=hook(text,el)||text}navigator.clipboard.writeText(newText).then(function(){button.innerHTML=locales[lang]?.[1]||"Copied!";button.dataset.copied=true;let alert=Object.assign(document.createElement("div"),{role:"status",className:"hljs-copy-alert",innerHTML:locales[lang]?.[2]||"Copied to clipboard"});el.parentElement.appendChild(alert);setTimeout(()=>{button.innerHTML=locales[lang]?.[0]||"Copy";button.dataset.copied=false;el.parentElement.removeChild(alert);alert=null},2e3)}).then(function(){if(typeof callback==="function")return callback(newText,el)})}}}if(typeof module!="undefined"){module.exports=CopyButtonPlugin}const locales={en:["Copy","Copied!","Copied to clipboard"],es:["Copiar","¡Copiado!","Copiado al portapapeles"],fr:["Copier","Copié !","Copié dans le presse-papier"],de:["Kopieren","Kopiert!","In die Zwischenablage kopiert"],ja:["コピー","コピーしました!","クリップボードにコピーしました"],ko:["복사","복사됨!","클립보드에 복사됨"],ru:["Копировать","Скопировано!","Скопировано в буфер обмена"],zh:["复制","已复制!","已复制到剪贴板"],"zh-tw":["複製","已複製!","已複製到剪貼簿"]};
|
||||
function fallbackCopyToClipboard(text) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const textArea = document.createElement("textarea");
|
||||
textArea.value = text;
|
||||
textArea.style.position = "fixed";
|
||||
textArea.style.left = "-9999px";
|
||||
textArea.style.top = "-9999px";
|
||||
document.body.appendChild(textArea);
|
||||
textArea.focus();
|
||||
textArea.select();
|
||||
try {
|
||||
const successful = document.execCommand("copy");
|
||||
document.body.removeChild(textArea);
|
||||
successful ? resolve() : reject();
|
||||
} catch (err) {
|
||||
document.body.removeChild(textArea);
|
||||
reject(err);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
class CopyButtonPlugin {
|
||||
constructor(options = {}) {
|
||||
self.hook = options.hook;
|
||||
self.callback = options.callback;
|
||||
self.lang = options.lang || document.documentElement.lang || "en";
|
||||
}
|
||||
"after:highlightElement"({ el, text }) {
|
||||
let button = Object.assign(document.createElement("button"), {
|
||||
innerHTML: locales[lang]?.[0] || "Copy",
|
||||
className: "hljs-copy-button",
|
||||
});
|
||||
button.dataset.copied = false;
|
||||
el.parentElement.classList.add("hljs-copy-wrapper");
|
||||
el.parentElement.appendChild(button);
|
||||
el.parentElement.style.setProperty(
|
||||
"--hljs-theme-background",
|
||||
window.getComputedStyle(el).backgroundColor,
|
||||
);
|
||||
button.onclick = function () {
|
||||
let newText = text;
|
||||
if (hook && typeof hook === "function") {
|
||||
newText = hook(text, el) || text;
|
||||
}
|
||||
const copyPromise =
|
||||
navigator.clipboard && window.isSecureContext
|
||||
? navigator.clipboard.writeText(newText)
|
||||
: fallbackCopyToClipboard(newText);
|
||||
copyPromise.then(function () {
|
||||
button.innerHTML = locales[lang]?.[1] || "Copied!";
|
||||
button.dataset.copied = true;
|
||||
let alert = Object.assign(document.createElement("div"), {
|
||||
role: "status",
|
||||
className: "hljs-copy-alert",
|
||||
innerHTML: locales[lang]?.[2] || "Copied to clipboard",
|
||||
});
|
||||
el.parentElement.appendChild(alert);
|
||||
setTimeout(() => {
|
||||
button.innerHTML = locales[lang]?.[0] || "Copy";
|
||||
button.dataset.copied = false;
|
||||
el.parentElement.removeChild(alert);
|
||||
alert = null;
|
||||
}, 2e3);
|
||||
})
|
||||
.then(function () {
|
||||
if (typeof callback === "function") return callback(newText, el);
|
||||
});
|
||||
};
|
||||
}
|
||||
}
|
||||
if (typeof module != "undefined") {
|
||||
module.exports = CopyButtonPlugin;
|
||||
}
|
||||
const locales = {
|
||||
en: ["Copy", "Copied!", "Copied to clipboard"],
|
||||
es: ["Copiar", "¡Copiado!", "Copiado al portapapeles"],
|
||||
fr: ["Copier", "Copié !", "Copié dans le presse-papier"],
|
||||
de: ["Kopieren", "Kopiert!", "In die Zwischenablage kopiert"],
|
||||
ja: ["コピー", "コピーしました!", "クリップボードにコピーしました"],
|
||||
ko: ["복사", "복사됨!", "클립보드에 복사됨"],
|
||||
ru: ["Копировать", "Скопировано!", "Скопировано в буфер обмена"],
|
||||
zh: ["复制", "已复制!", "已复制到剪贴板"],
|
||||
"zh-tw": ["複製", "已複製!", "已複製到剪貼簿"],
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in a new issue