Update templates/docs.html
Browse files- templates/docs.html +94 -110
templates/docs.html
CHANGED
|
@@ -14,110 +14,97 @@
|
|
| 14 |
<button id="themeToggle" class="bg-blue px-3 py-1 rounded text-fg0 hover:bg-purple transition">🌙</button>
|
| 15 |
<button id="langToggle" class="bg-blue px-3 py-1 rounded text-fg0 hover:bg-purple transition">🌐</button>
|
| 16 |
</div>
|
| 17 |
-
<a href="/" class="bg-blue px-
|
| 18 |
</header>
|
| 19 |
|
| 20 |
-
<main class="p-8 max-w-
|
| 21 |
|
| 22 |
-
<section id="
|
| 23 |
-
<h1 class="text-3xl font-bold">MoA Chat - Documentation</h1>
|
| 24 |
|
| 25 |
-
<
|
| 26 |
-
|
| 27 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
|
| 29 |
-
<h2 class="text-2xl font-
|
| 30 |
<ul class="list-disc list-inside text-left">
|
| 31 |
-
<li>
|
| 32 |
-
<li>
|
| 33 |
-
<li>Fully
|
| 34 |
-
<li>
|
| 35 |
-
<li>
|
|
|
|
|
|
|
| 36 |
</ul>
|
| 37 |
|
| 38 |
-
<h2 class="text-2xl font-
|
| 39 |
-
<p>
|
| 40 |
-
<pre><code>git clone https://huggingface.co/spaces/UntilDot/Flask
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
<
|
| 48 |
-
<pre><code>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 49 |
docker run -d -p 7860:7860 --env-file .env moa-chat</code></pre>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 50 |
|
| 51 |
-
<h2 class="text-2xl font-
|
| 52 |
-
<p>
|
| 53 |
-
<
|
| 54 |
-
|
| 55 |
TOGETHER_API_KEY=your-together-key
|
|
|
|
| 56 |
GROQ_API_KEY=your-groq-key</code></pre>
|
| 57 |
-
|
| 58 |
-
<h2 class="text-2xl font-semibold">🛠️ Adding More Models</h2>
|
| 59 |
-
<p>To add new models, edit <code>llm/model_config.json</code> like this:</p>
|
| 60 |
-
<pre><code>{
|
| 61 |
-
"providers": {
|
| 62 |
-
"openrouter": {
|
| 63 |
-
"url": "https://openrouter.ai/api/v1/chat/completions",
|
| 64 |
-
"key_env": "OPENROUTER_API_KEY"
|
| 65 |
-
}
|
| 66 |
-
},
|
| 67 |
-
"models": {
|
| 68 |
-
"deepseek/deepseek-chat-v3-0324:free": "openrouter"
|
| 69 |
-
}
|
| 70 |
-
}</code></pre>
|
| 71 |
-
|
| 72 |
-
<p>Each model must point to a provider. Each provider defines its own endpoint and required secret.</p>
|
| 73 |
-
|
| 74 |
-
<h2 class="text-2xl font-semibold">📖 License</h2>
|
| 75 |
-
<p>This project is licensed under <strong>Apache 2.0</strong>.</p>
|
| 76 |
-
|
| 77 |
-
<footer class="text-sm opacity-70 pt-8">
|
| 78 |
-
Made with ❤️ in Panamá
|
| 79 |
-
</footer>
|
| 80 |
-
</section>
|
| 81 |
-
|
| 82 |
-
<section id="es" class="space-y-8 hidden">
|
| 83 |
-
<h1 class="text-3xl font-bold">MoA Chat - Documentación</h1>
|
| 84 |
-
|
| 85 |
-
<p><strong>MoA Chat</strong> es un proyecto experimental inspirado en la técnica MoA (Mixture of Agents), donde varios modelos de IA colaboran para generar mejores respuestas.</p>
|
| 86 |
-
|
| 87 |
-
<img src="https://github.com/togethercomputer/MoA/blob/main/assets/moa-explained.png?raw=true" alt="Arquitectura MoA" class="w-full max-w-2xl rounded shadow">
|
| 88 |
-
|
| 89 |
-
<h2 class="text-2xl font-semibold">🚀 Características</h2>
|
| 90 |
<ul class="list-disc list-inside text-left">
|
| 91 |
-
<li>
|
| 92 |
-
<li>
|
| 93 |
-
<li>Completamente open source y autohospedable</li>
|
| 94 |
-
<li>Construido con Python y Flask</li>
|
| 95 |
-
<li>Desplegado fácilmente en Hugging Face Spaces</li>
|
| 96 |
</ul>
|
| 97 |
|
| 98 |
-
<h2 class="text-2xl font-
|
| 99 |
-
<p>
|
| 100 |
-
<pre><code>
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
source venv/bin/activate
|
| 104 |
-
pip install -r requirements.txt
|
| 105 |
-
python app.py</code></pre>
|
| 106 |
-
|
| 107 |
-
<p>O si deseas usar Docker (usuarios avanzados):</p>
|
| 108 |
-
<pre><code>docker build -t moa-chat .
|
| 109 |
-
docker run -d -p 7860:7860 --env-file .env moa-chat</code></pre>
|
| 110 |
-
|
| 111 |
-
<h2 class="text-2xl font-semibold">🔑 Llaves API</h2>
|
| 112 |
-
<p>Debes definir las llaves API en la configuración del espacio o en tu archivo <code>.env</code>:</p>
|
| 113 |
-
<pre><code>OPENROUTER_API_KEY=tu-clave-openrouter
|
| 114 |
-
GROK_API_KEY=tu-clave-grok
|
| 115 |
-
TOGETHER_API_KEY=tu-clave-together
|
| 116 |
-
GROQ_API_KEY=tu-clave-groq</code></pre>
|
| 117 |
-
|
| 118 |
-
<h2 class="text-2xl font-semibold">🛠️ Agregar Modelos</h2>
|
| 119 |
-
<p>Para agregar modelos, edita <code>llm/model_config.json</code> así:</p>
|
| 120 |
-
<pre><code>{
|
| 121 |
"providers": {
|
| 122 |
"openrouter": {
|
| 123 |
"url": "https://openrouter.ai/api/v1/chat/completions",
|
|
@@ -128,34 +115,31 @@ GROQ_API_KEY=tu-clave-groq</code></pre>
|
|
| 128 |
"deepseek/deepseek-chat-v3-0324:free": "openrouter"
|
| 129 |
}
|
| 130 |
}</code></pre>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 131 |
|
| 132 |
-
<
|
|
|
|
| 133 |
|
| 134 |
-
|
| 135 |
-
<p>Este proyecto está licenciado bajo <strong>Apache 2.0</strong>.</p>
|
| 136 |
|
| 137 |
-
<footer class="text-sm opacity-70 pt-8">
|
| 138 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 139 |
</footer>
|
| 140 |
</section>
|
| 141 |
|
| 142 |
</main>
|
| 143 |
|
| 144 |
-
<script>
|
| 145 |
-
const themeToggle = document.getElementById('themeToggle');
|
| 146 |
-
themeToggle.addEventListener('click', () => {
|
| 147 |
-
document.documentElement.classList.toggle('dark');
|
| 148 |
-
themeToggle.textContent = document.documentElement.classList.contains('dark') ? '🌙' : '☀️';
|
| 149 |
-
});
|
| 150 |
-
|
| 151 |
-
const langToggle = document.getElementById('langToggle');
|
| 152 |
-
const en = document.getElementById('en');
|
| 153 |
-
const es = document.getElementById('es');
|
| 154 |
-
langToggle.addEventListener('click', () => {
|
| 155 |
-
en.classList.toggle('hidden');
|
| 156 |
-
es.classList.toggle('hidden');
|
| 157 |
-
});
|
| 158 |
-
</script>
|
| 159 |
|
| 160 |
</body>
|
| 161 |
-
</html>
|
|
|
|
| 14 |
<button id="themeToggle" class="bg-blue px-3 py-1 rounded text-fg0 hover:bg-purple transition">🌙</button>
|
| 15 |
<button id="langToggle" class="bg-blue px-3 py-1 rounded text-fg0 hover:bg-purple transition">🌐</button>
|
| 16 |
</div>
|
| 17 |
+
<a href="/" class="bg-blue px-3 py-1 rounded text-fg0 hover:bg-purple transition duration-300" style="background-color: var(--blue) !important; color: var(--fg1) !important; font-weight: 700; letter-spacing: 0.25px;">← Back to Chat</a>
|
| 18 |
</header>
|
| 19 |
|
| 20 |
+
<main class="p-8 max-w-6xl w-full flex flex-col space-y-8 items-center text-justify overflow-y-auto mx-auto">
|
| 21 |
|
| 22 |
+
<section id="content" class="space-y-8 mt-0">
|
| 23 |
+
<h1 class="text-3xl font-bold text-center pt-4" data-i18n="title">MoA Chat - Documentation</h1>
|
| 24 |
|
| 25 |
+
<h2 class="text-2xl font-bold border-b-2 pb-2" style="border-color: var(--blue);" data-i18n="what_is_title">📖 What is MoA Chat?</h2>
|
| 26 |
+
<p data-i18n="intro"><strong>MoA Chat</strong> is a simple but powerful chat platform where multiple AI models answer the same question at the same time, and an aggregator model combines their outputs into one final answer.</p>
|
| 27 |
+
<ul class="list-disc list-inside text-left">
|
| 28 |
+
<li data-i18n="tech_1">Built in <strong>Python 3</strong>.</li>
|
| 29 |
+
<li data-i18n="tech_2">Web framework: <strong>Flask</strong>.</li>
|
| 30 |
+
<li data-i18n="tech_3">Frontend: HTML, JavaScript, TailwindCSS (optionally removable).</li>
|
| 31 |
+
<li data-i18n="tech_4">Designed to work <strong>first on Hugging Face Spaces</strong>, but can also be <strong>self-hosted</strong>.</li>
|
| 32 |
+
</ul>
|
| 33 |
+
<img src="https://github.com/togethercomputer/MoA/blob/main/assets/moa-explained.png?raw=true" alt="MoA Architecture" class="mx-auto w-full max-w-2xl rounded shadow block" data-i18n-alt="architecture_alt">
|
| 34 |
|
| 35 |
+
<h2 class="text-2xl font-bold border-b-2 pb-2" style="border-color: var(--blue);" data-i18n="features_title">⚙️ Features</h2>
|
| 36 |
<ul class="list-disc list-inside text-left">
|
| 37 |
+
<li data-i18n="feature_1">Send your question once — multiple AI models answer simultaneously.</li>
|
| 38 |
+
<li data-i18n="feature_2">Aggregator model (LLM-D) summarizes all responses.</li>
|
| 39 |
+
<li data-i18n="feature_3">Fully configurable: choose which models you want to use.</li>
|
| 40 |
+
<li data-i18n="feature_4">Modern minimal UI with light/dark theme toggle.</li>
|
| 41 |
+
<li data-i18n="feature_5">Spanish/English documentation switch.</li>
|
| 42 |
+
<li data-i18n="feature_6"><strong>Free models</strong> supported through <strong>OpenRouter</strong> and others.</li>
|
| 43 |
+
<li data-i18n="feature_7"><strong>No API keys exposed</strong> in the frontend (safe backend request).</li>
|
| 44 |
</ul>
|
| 45 |
|
| 46 |
+
<h2 class="text-2xl font-bold border-b-2 pb-2" style="border-color: var(--blue);" data-i18n="self_host_title">🛠️ Self Hosting</h2>
|
| 47 |
+
<p data-i18n="self_host_intro">You can clone the project like this (includes the Dockerfile for containerization):</p>
|
| 48 |
+
<pre class="code-block"><code>git clone https://huggingface.co/spaces/UntilDot/Flask</code></pre>
|
| 49 |
+
<h3 data-i18n="requirements_title">Requirements:</h3>
|
| 50 |
+
<ul class="list-disc list-inside text-left">
|
| 51 |
+
<li data-i18n="req_1">Python 3.11+</li>
|
| 52 |
+
<li data-i18n="req_2">Pip</li>
|
| 53 |
+
<li data-i18n="req_3">Create a <code>.env</code> file and add your API keys.</li>
|
| 54 |
+
</ul>
|
| 55 |
+
<h3 data-i18n="install_title">Install dependencies:</h3>
|
| 56 |
+
<pre class="code-block"><code>pip install -r requirements.txt</code></pre>
|
| 57 |
+
<h3 data-i18n="run_title">Run locally:</h3>
|
| 58 |
+
<pre class="code-block"><code>python app.py</code></pre>
|
| 59 |
+
<p data-i18n="port_note">Default port is <strong>7860</strong> (to match Hugging Face standard).</p>
|
| 60 |
+
<h3 class="text-xl font-semibold underline" data-i18n="docker_title">🐳 Docker support:</h3>
|
| 61 |
+
<p data-i18n="docker_intro">Your repository includes a <code>Dockerfile</code> for easy containerization when you clone it. Here's the content:</p>
|
| 62 |
+
<pre class="code-block"><code># Use a slim Python base
|
| 63 |
+
FROM python:3.11-slim
|
| 64 |
+
|
| 65 |
+
# Set working directory
|
| 66 |
+
WORKDIR /app
|
| 67 |
+
|
| 68 |
+
# Install dependencies
|
| 69 |
+
COPY requirements.txt ./
|
| 70 |
+
RUN pip install --no-cache-dir -r requirements.txt
|
| 71 |
+
|
| 72 |
+
# Copy source code
|
| 73 |
+
COPY . .
|
| 74 |
+
|
| 75 |
+
# Expose the default Hugging Face Spaces port
|
| 76 |
+
EXPOSE 7860
|
| 77 |
+
|
| 78 |
+
# Run the app
|
| 79 |
+
CMD ["python", "app.py"]</code></pre>
|
| 80 |
+
<p data-i18n="docker_alt_option">Alternatively, you can manually create your own <code>Dockerfile</code> with the above content if you prefer to customize it.</p>
|
| 81 |
+
<p data-i18n="docker_build">To build and run the Docker container after cloning the repository:</p>
|
| 82 |
+
<pre class="code-block"><code>docker build -t moa-chat .
|
| 83 |
docker run -d -p 7860:7860 --env-file .env moa-chat</code></pre>
|
| 84 |
+
<p data-i18n="docker_secrets_note">Docker will NOT automatically inject secrets unless you:</p>
|
| 85 |
+
<ul class="list-disc list-inside text-left">
|
| 86 |
+
<li data-i18n="docker_secret_env">Use a <code>.env</code> file with <code>--env-file .env</code></li>
|
| 87 |
+
<li data-i18n="docker_secret_manual">Manually use <code>-e VAR=VALUE</code> flags in <code>docker run</code></li>
|
| 88 |
+
</ul>
|
| 89 |
|
| 90 |
+
<h2 class="text-2xl font-bold border-b-2 pb-2" style="border-color: var(--blue);" data-i18n="api_keys_title">🔑 Environment Variables (Secrets)</h2>
|
| 91 |
+
<p data-i18n="api_keys_intro">To use this app, you must set your API keys in <strong>secrets</strong> or <strong>environment variables</strong>.</p>
|
| 92 |
+
<p data-i18n="api_keys_syntax">Follow this syntax:</p>
|
| 93 |
+
<pre class="code-block"><code data-i18n="api_keys_code">OPENROUTER_API_KEY=your-openrouter-key
|
| 94 |
TOGETHER_API_KEY=your-together-key
|
| 95 |
+
GROK_API_KEY=your-grok-key
|
| 96 |
GROQ_API_KEY=your-groq-key</code></pre>
|
| 97 |
+
<p data-i18n="api_keys_location">You can set these in:</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 98 |
<ul class="list-disc list-inside text-left">
|
| 99 |
+
<li data-i18n="api_loc_1">Hugging Face <strong>Secrets</strong> section (recommended if on Spaces)</li>
|
| 100 |
+
<li data-i18n="api_loc_2"><code>.env</code> file (only for self-hosting)</li>
|
|
|
|
|
|
|
|
|
|
| 101 |
</ul>
|
| 102 |
|
| 103 |
+
<h2 class="text-2xl font-bold border-b-2 pb-2" style="border-color: var(--blue);" data-i18n="add_models_title">🧩 How to Add More Models</h2>
|
| 104 |
+
<p data-i18n="add_models_intro">All models and providers are declared inside:</p>
|
| 105 |
+
<pre class="code-block"><code>llm/model_config.json</code></pre>
|
| 106 |
+
<p data-i18n="add_models_structure">The structure looks like this:</p>
|
| 107 |
+
<pre class="code-block"><code>{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 108 |
"providers": {
|
| 109 |
"openrouter": {
|
| 110 |
"url": "https://openrouter.ai/api/v1/chat/completions",
|
|
|
|
| 115 |
"deepseek/deepseek-chat-v3-0324:free": "openrouter"
|
| 116 |
}
|
| 117 |
}</code></pre>
|
| 118 |
+
<p data-i18n="add_models_steps_title"><strong>To add a new model:</strong></p>
|
| 119 |
+
<ul class="list-disc list-inside text-left">
|
| 120 |
+
<li data-i18n="add_step_1">Find the right provider (OpenRouter, Together, Grok, Groq, etc).</li>
|
| 121 |
+
<li data-i18n="add_step_2">Add its endpoint URL under "providers" if not already listed.</li>
|
| 122 |
+
<li data-i18n="add_step_3">Add your model name under "models" section, linking it to the provider.</li>
|
| 123 |
+
</ul>
|
| 124 |
+
<p data-i18n="add_models_note">Make sure your environment variables (secrets) are correctly configured.</p>
|
| 125 |
|
| 126 |
+
<h2 class="text-2xl font-bold border-b-2 pb-2" style="border-color: var(--blue);" data-i18n="license_title">🏷️ Licensing</h2>
|
| 127 |
+
<p data-i18n="license_text">This project is licensed under <strong>Apache 2.0</strong> — You are free to use, modify, and distribute, even commercially.</p>
|
| 128 |
|
| 129 |
+
|
|
|
|
| 130 |
|
| 131 |
+
<footer class="text-sm opacity-70 pt-8 text-center" data-i18n="footer">
|
| 132 |
+
Made with ❤️ in Panamá<br>by UntilDot
|
| 133 |
+
<div class="mt-2 flex justify-center">
|
| 134 |
+
<span class="mx-2">✨</span>
|
| 135 |
+
<span class="mx-2">✨</span>
|
| 136 |
+
</div>
|
| 137 |
</footer>
|
| 138 |
</section>
|
| 139 |
|
| 140 |
</main>
|
| 141 |
|
| 142 |
+
<script src="/static/docs.js"></script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 143 |
|
| 144 |
</body>
|
| 145 |
+
</html>
|