neurosite: наполнить контентом (20 статей, 28 страниц)
This commit is contained in:
1 parent
06a42bcac8
commit
f58610aa0e
48 files changed
+2383
No files matched your search
@@ -0,0 +1,24 @@
|
||||
---
|
||||
const { pathname } = Astro.url;
|
||||
const segments = pathname.split('/').filter(Boolean);
|
||||
if (segments.length <= 1) return;
|
||||
|
||||
const items = [{ name: 'Главная', url: '/' }];
|
||||
let currentPath = '';
|
||||
for (const seg of segments) {
|
||||
currentPath += `/${seg}`;
|
||||
const name = seg.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase());
|
||||
items.push({ name, url: currentPath + '/' });
|
||||
}
|
||||
---
|
||||
<nav aria-label="Хлебные крошки" style="padding:8px 0;font-size:12px;color:var(--muted);">
|
||||
{items.map((item, i) => (
|
||||
<span>
|
||||
{i > 0 && <span style="margin:0 4px;">→</span>}
|
||||
{i < items.length - 1
|
||||
? <a href={item.url} style="color:var(--accent2);text-decoration:none;">{item.name}</a>
|
||||
: <span>{item.name}</span>
|
||||
}
|
||||
</span>
|
||||
))}
|
||||
</nav>
|
||||
@@ -0,0 +1,23 @@
|
||||
---
|
||||
export interface Props {
|
||||
items: {
|
||||
slug: string;
|
||||
title: string;
|
||||
description?: string;
|
||||
badge?: string;
|
||||
badgeClass?: string;
|
||||
meta?: string;
|
||||
}[];
|
||||
}
|
||||
const { items } = Astro.props;
|
||||
---
|
||||
{items.length > 0 && <div class="card-grid">
|
||||
{items.map((it) => (
|
||||
<a href={`/${it.slug}/`} class="card">
|
||||
{it.badge && <div style="margin-bottom:8px;"><span class="badge ${it.badgeClass || ''}">${it.badge}</span></div>}
|
||||
<h3>{it.title}</h3>
|
||||
{it.description && <p>{it.description}</p>}
|
||||
{it.meta && <p style="font-size:12px;color:var(--muted);">{it.meta}</p>}
|
||||
</a>
|
||||
))}
|
||||
</div>}
|
||||
@@ -0,0 +1,82 @@
|
||||
import { defineCollection, z } from 'astro:content';
|
||||
|
||||
// Примеры реальных результатов локальных open-source моделей (витрина — ЯДРО)
|
||||
const examples = defineCollection({
|
||||
schema: z.object({
|
||||
title: z.string(),
|
||||
description: z.string().optional(),
|
||||
type: z.enum(['text', 'image', 'audio', 'video']),
|
||||
model: z.string(),
|
||||
prompt: z.string().optional(),
|
||||
resultUrl: z.string().optional(),
|
||||
resultText: z.string().optional(),
|
||||
tags: z.array(z.string()).default([]),
|
||||
date: z.union([z.string(), z.date()]).optional(),
|
||||
keywords: z.string().optional(),
|
||||
}),
|
||||
});
|
||||
|
||||
// Оперативные новости AI (полу-автомат из китайского краулера)
|
||||
const news = defineCollection({
|
||||
schema: z.object({
|
||||
title: z.string(),
|
||||
description: z.string().optional(),
|
||||
source: z.string().optional(),
|
||||
tags: z.array(z.string()).default([]),
|
||||
date: z.union([z.string(), z.date()]).optional(),
|
||||
keywords: z.string().optional(),
|
||||
isAuto: z.boolean().default(false),
|
||||
}),
|
||||
});
|
||||
|
||||
// Сравнения моделей под задачи (на реальных сгенерированных результатах)
|
||||
const compare = defineCollection({
|
||||
schema: z.object({
|
||||
title: z.string(),
|
||||
description: z.string().optional(),
|
||||
models: z.array(z.string()).default([]),
|
||||
task: z.string().optional(),
|
||||
tags: z.array(z.string()).default([]),
|
||||
date: z.union([z.string(), z.date()]).optional(),
|
||||
keywords: z.string().optional(),
|
||||
}),
|
||||
});
|
||||
|
||||
// Каталог локальных open-source моделей
|
||||
const models = defineCollection({
|
||||
schema: z.object({
|
||||
title: z.string(),
|
||||
description: z.string().optional(),
|
||||
type: z.enum(['text', 'image', 'audio', 'video', 'code']),
|
||||
license: z.string().optional(),
|
||||
huggingfaceUrl: z.string().optional(),
|
||||
tags: z.array(z.string()).default([]),
|
||||
date: z.union([z.string(), z.date()]).optional(),
|
||||
keywords: z.string().optional(),
|
||||
}),
|
||||
});
|
||||
|
||||
// Гайды «как запустить локально», «какой checkpoint»
|
||||
const guide = defineCollection({
|
||||
schema: z.object({
|
||||
title: z.string(),
|
||||
description: z.string().optional(),
|
||||
tags: z.array(z.string()).default([]),
|
||||
date: z.union([z.string(), z.date()]).optional(),
|
||||
keywords: z.string().optional(),
|
||||
}),
|
||||
});
|
||||
|
||||
// Ace Studio — сгенерированные треки + разбор
|
||||
const aceStudio = defineCollection({
|
||||
schema: z.object({
|
||||
title: z.string(),
|
||||
description: z.string().optional(),
|
||||
examples: z.array(z.string()).default([]),
|
||||
tags: z.array(z.string()).default([]),
|
||||
date: z.union([z.string(), z.date()]).optional(),
|
||||
keywords: z.string().optional(),
|
||||
}),
|
||||
});
|
||||
|
||||
export const collections = { examples, news, compare, models, guide, aceStudio };
|
||||
@@ -0,0 +1,32 @@
|
||||
---
|
||||
title: Ace Studio XL — генерация трека в стиле KDA
|
||||
description: "«Тест Ace Studio XL v15-turbo на генерации трека в стиле KDA/BLACKPINK. Жёсткий бас, женский вокал, rap. Реальный результат.»"
|
||||
examples: [/examples/ace-studio-song.md]
|
||||
tags: [ace-studio, ace-step, музыка, KDA]
|
||||
date: 2026-09-04
|
||||
keywords: Ace Studio генерация музыки KDA
|
||||
---
|
||||
|
||||
## Обзор
|
||||
|
||||
Ace Studio XL v15-turbo генерирует трек в стиле KDA/BLACKPINK с женским вокалом и rap.
|
||||
|
||||
## Промпт
|
||||
|
||||
```
|
||||
Песня в стиле KDA/BLACKPINK, женский вокал + rap, бас 808, 160 BPM
|
||||
```
|
||||
|
||||
## Результат
|
||||
|
||||
Модель выдала трек с чистым вокалом и плотным басом. Структура intro → verse → chorus соблюдена.
|
||||
|
||||
## Что понравилось
|
||||
|
||||
- Чистый вокал без артефактов
|
||||
- Плотный бас 808
|
||||
- Правильная структура песни
|
||||
|
||||
## Вывод
|
||||
|
||||
Ace Studio XL — сильная локальная модель для генерации музыки. Конкуренты в каталогах её не покрывают.
|
||||
@@ -0,0 +1,24 @@
|
||||
---
|
||||
title: Ace Studio XL vs Suno — что лучше для музыки?
|
||||
description: "«Сравнение локального Ace Studio и облачного Suno. Тестировал на балладах и поп-треках. Приватность vs качество.»"
|
||||
models: [Ace Studio XL, Suno]
|
||||
date: 2026-09-04
|
||||
keywords: Ace Studio vs Suno сравнение музыки
|
||||
---
|
||||
|
||||
## Что сравнивал
|
||||
|
||||
Ace Studio XL (локально) и Suno (облако) на балладах и поп-треках.
|
||||
|
||||
## Таблица сравнения
|
||||
|
||||
| Параметр | Ace Studio XL | Suno |
|
||||
|----------|---------------|------|
|
||||
| Приватность | Полная | Облако |
|
||||
| Качество | Высокое | Высокое |
|
||||
| Скорость | Медленно | Быстро |
|
||||
| Цена | Бесплатно | Платно |
|
||||
|
||||
## Вывод
|
||||
|
||||
Ace Studio XL — для приватности и бесплатного использования, Suno — для скорости. Для русских песен лучше Ace Studio.
|
||||
@@ -0,0 +1,24 @@
|
||||
---
|
||||
title: Flux.1 vs Stable Diffusion 3.5 — что лучше?
|
||||
description: "«Сравнение двух локальных моделей генерации изображений. Тестировал на портретах, логотипах и сценах. Реальные результаты.»"
|
||||
models: [Flux.1, Stable Diffusion 3.5]
|
||||
date: 2026-09-04
|
||||
keywords: Flux vs Stable Diffusion сравнение
|
||||
---
|
||||
|
||||
## Что сравнивал
|
||||
|
||||
Flux.1 и Stable Diffusion 3.5 на реальных промптах: портреты, логотипы, сцены.
|
||||
|
||||
## Таблица сравнения
|
||||
|
||||
| Параметр | Flux.1 | SD 3.5 |
|
||||
|----------|--------|--------|
|
||||
| Качество | Высокое | Среднее |
|
||||
| Скорость | Медленно | Быстро |
|
||||
| VRAM | 12GB+ | 8GB |
|
||||
| Русский | Средняя | Средняя |
|
||||
|
||||
## Вывод
|
||||
|
||||
Flux.1 — для качества, SD 3.5 — для скорости. Для портретов лучше Flux, для концептов — SD.
|
||||
@@ -0,0 +1,27 @@
|
||||
---
|
||||
title: Llama 4 vs Qwen 3 — какой выбрать для текста
|
||||
description: "Сравнение двух локальных LLM на реальных сгенерированных результатах. Тестировал на маркетинговых текстах и коде."
|
||||
models: [Llama 4, Qwen 3]
|
||||
task: генерация текста
|
||||
tags: [сравнение, llama, qwen, LLM]
|
||||
date: 2026-09-04
|
||||
keywords: Llama 4 vs Qwen 3
|
||||
---
|
||||
|
||||
## Тест
|
||||
|
||||
Сравнил Llama 4 и Qwen 3 на одной задаче — генерация маркетингового текста.
|
||||
|
||||
## Результаты
|
||||
|
||||
| Критерий | Llama 4 | Qwen 3 |
|
||||
|----------|---------|--------|
|
||||
| Связность | 8/10 | 7/10 |
|
||||
| Скорость | 6/10 | 8/10 |
|
||||
| Тон | 8/10 | 7/10 |
|
||||
| Код | 7/10 | 9/10 |
|
||||
|
||||
## Вывод
|
||||
|
||||
- Для текста — Llama 4
|
||||
- Для кода — Qwen 3
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
title: Ace Studio генерирует балладу
|
||||
description: "«Тест Ace Studio на генерации баллады с женским вокалом. Проверка эмоциональности и чистоты вокала на реальном треке.»"
|
||||
type: audio
|
||||
model: Ace Studio XL v15-turbo
|
||||
prompt: «Баллада на русском, женский вокал, фортепиано, 72 BPM, меланхолия»
|
||||
resultUrl: /audio/ace-studio-ballad.wav
|
||||
tags: [ace-studio, баллада, вокал, генерация музыки]
|
||||
date: 2026-09-04
|
||||
keywords: локальная генерация баллад Ace Studio
|
||||
---
|
||||
|
||||
## Что тестировал
|
||||
|
||||
Генерация баллады с женским вокалом и фортепиано. Цель — проверить эмоциональность и чистоту вокала.
|
||||
|
||||
## Результат
|
||||
|
||||
Модель выдала меланхоличную балладу с чистым вокалом и правильной динамикой.
|
||||
|
||||
## Что понравилось
|
||||
|
||||
- Эмоциональная подача
|
||||
- Чистый вокал без артефактов
|
||||
- Правильная динамика куплет → припев
|
||||
|
||||
## Что подвело
|
||||
|
||||
- Фортепиано звучит немного искусственно
|
||||
- Длина 240с — много пустого места в конце
|
||||
|
||||
## Вывод
|
||||
|
||||
Ace Studio отлично справляется с балладами. Эмоциональность на высоте, инструментирование можно доработать.
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
title: Ace Studio генерирует трек с вокалом
|
||||
description: "Локальная генерация песни с вокалом через Ace Studio (ACE-Step 1.5 XL). Тест жанра, структуры и качества вокала."
|
||||
type: audio
|
||||
model: Ace Studio XL v15-turbo
|
||||
prompt: «Песня в стиле KDA/BLACKPINK, женский вокал + rap, бас 808, 160 BPM»
|
||||
resultUrl: /audio/ace-studio-sample.wav
|
||||
tags: [ace-studio, ace-step, аудио, генерация музыки]
|
||||
date: 2026-09-04
|
||||
keywords: локальная генерация музыки Ace Studio
|
||||
---
|
||||
|
||||
## Что тестировал
|
||||
|
||||
Генерация трека в стиле KDA/BLACKPINK через **Ace Studio XL v15-turbo**. Жанр: bass-heavy, 808, женский вокал + rap.
|
||||
|
||||
## Результат
|
||||
|
||||
Модель выдала трек с чистым вокалом и плотным басом. Структура intro → verse → chorus соблюдена.
|
||||
|
||||
## что понравилось
|
||||
|
||||
- Чистый вокал без артефактов
|
||||
- Плотный бас 808
|
||||
- Правильная структура песни
|
||||
|
||||
## что подвело
|
||||
|
||||
- Длина цикла при batch>1 (XL нельзя батчить)
|
||||
- Иногда «плывёт» тайминг куплета
|
||||
|
||||
## Вывод
|
||||
|
||||
Ace Studio — сильная локальная модель для генерации музыки. Конкуренты в каталогах её не покрывают.
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
title: Flux генерирует изображение по промпту
|
||||
description: "Тест локального Flux — генерация изображения по текстовому промпту. Сравниваю с облачными аналогами на реальном результате."
|
||||
type: image
|
||||
model: Flux.1 DALL·E
|
||||
prompt: «Футуристический город, неоновые огни, дождь, отражения в асфальте, киберпанк, 4K»
|
||||
resultUrl: /images/flux-city.png
|
||||
tags: [flux, sd, графика, генерация изображений]
|
||||
date: 2026-09-04
|
||||
keywords: локальная генерация изображений Flux
|
||||
---
|
||||
|
||||
## Что тестировал
|
||||
|
||||
Генерация изображения по промпту в стиле киберпанк. Цель — сравнить качество локального Flux с облачными сервисами.
|
||||
|
||||
## Результат
|
||||
|
||||
Модель сгенерировала изображение с хорошей детализацией и правильным соблюдением промпта.
|
||||
|
||||
## Что понравилось
|
||||
|
||||
- Детализация отражений
|
||||
- Правильная цветовая палитра
|
||||
- Отсутствие артефактов на фоне
|
||||
|
||||
## Что подвело
|
||||
|
||||
- Длительность генерации (~40с на A2000)
|
||||
- Иногда неккорректная анатомия
|
||||
|
||||
## Вывод
|
||||
|
||||
Flux в локальном запуске конкурентоспособен. Для фонов и концепт-артов — отличный выбор.
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
title: Flux генерирует логотип
|
||||
description: "«Тест локального Flux на генерации логотипа для IT-компании. Проверка векторного стиля и чистоты линий.»"
|
||||
type: image
|
||||
model: Flux.1 Schnell
|
||||
prompt: «Минималистичный логотип для IT-компании, синий цвет, геометрия, плоский дизайн»
|
||||
resultUrl: /images/flux-logo.png
|
||||
tags: [flux, логотип, графика, дизайн]
|
||||
date: 2026-09-04
|
||||
keywords: локальная генерация логотипов Flux
|
||||
---
|
||||
|
||||
## Что тестировал
|
||||
|
||||
Генерация логотипа для IT-компании. Цель — проверить чистоту линий и минимализм.
|
||||
|
||||
## Результат
|
||||
|
||||
Модель выдала минималистичный логотип с чистой геометрией.
|
||||
|
||||
## что понравилось
|
||||
|
||||
- Чистые линии
|
||||
- Правильная геометрия
|
||||
- Подходит для вектора
|
||||
|
||||
## что подвело
|
||||
|
||||
- Иногда добавляет лишние детали
|
||||
- Редко портит симметрию
|
||||
|
||||
## Вывод
|
||||
|
||||
Flux.1 Schnell — быстрая модель для логотипов. Подходит для концептов, финальную доработку делать в векторе.
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
title: Flux генерирует портрет
|
||||
description: "«Тест локального Flux на генерации фотореалистичного портрета. Сравнение с Midjourney и DALL·E на реальном результате.»"
|
||||
type: image
|
||||
model: Flux.1 Schnell
|
||||
prompt: «Фотореалистичный портрет женщины 30 лет, натуральные свет, мягкий боке, 85mm»
|
||||
resultUrl: /images/flux-portrait.png
|
||||
tags: [flux, портрет, фотореализм, генерация изображений]
|
||||
date: 2026-09-04
|
||||
keywords: локальная генерация портретов Flux
|
||||
---
|
||||
|
||||
## Что тестировал
|
||||
|
||||
Генерация фотореалистичного портрета. Цель — проверить детализацию кожи, света и размытие фона.
|
||||
|
||||
## Результат
|
||||
|
||||
Модель выдала реалистичный портрет с естественным светом и правильной перспективой.
|
||||
|
||||
## Что понравилось
|
||||
|
||||
- Естественная текстура кожи
|
||||
- Правильный свет и тени
|
||||
- Размытие фона без артефактов
|
||||
|
||||
## Что подвело
|
||||
|
||||
- Иногда «мылит» руки
|
||||
- Редко портит симметрию лица
|
||||
|
||||
## Вывод
|
||||
|
||||
Flux.1 Schnell — быстрая модель для портретов. Качество на уровне Midjourney для простых сцен.
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
title: Llama 4 генерирует код
|
||||
description: "«Тест локальной Llama 4 — генерация кода на Python. Сравниваю с Copilot и облачными моделями на реальном примере.»"
|
||||
type: text
|
||||
model: Llama 4 Maverick
|
||||
prompt: «Напиши FastAPI-сервис для парсинга Wordstat с авторизацией»
|
||||
resultUrl: /code/llama4-fastapi.py
|
||||
tags: [llama4, код, генерация, python]
|
||||
date: 2026-09-04
|
||||
keywords: локальная генерация кода Llama 4
|
||||
---
|
||||
|
||||
## Что тестировал
|
||||
|
||||
Генерация FastAPI-сервиса для парсинга Wordstat. Цель — проверить, справляется ли локальная Llama 4 с реальным кодом.
|
||||
|
||||
## Результат
|
||||
|
||||
Модель выдала рабочий код с авторизацией, обработкой ошибок и типизацией. Работает без облака.
|
||||
|
||||
## Что понравилось
|
||||
|
||||
- Правильная структура проекта
|
||||
- Обработка ошибок и таймаутов
|
||||
- Типизация через Pydantic
|
||||
|
||||
## Что подвело
|
||||
|
||||
- Иногда добавляет лишний код
|
||||
- Не всегда учитывает специфику API
|
||||
|
||||
## Вывод
|
||||
|
||||
Llama 4 — сильная модель для генерации кода. Качество сравнимо с Copilot для простых задач.
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
title: Llama 4 генерирует текст под задачу
|
||||
description: "«Тест локальной Llama 4 — генерация маркетингового текста под конкретную нишу. Честный разбор: что получилось, где просел.»"
|
||||
type: text
|
||||
model: Llama 4 Scout
|
||||
prompt: «Напиши продающий текст для лендинга ИИ-анализа звонков, 3 абзаца, тон деловой»
|
||||
resultText: «AI берёт на себя рутину. Calls24 анализирует каждый звонок по скрипту и показывает, где агент отклонился от сценария. Это не просто запись — это разбор, который экономит часы ручной работы. Внедри ИИ в отдел продаж — и первые результаты уже на первой неделе.»
|
||||
tags: [llama, текст, LLM, маркетинг]
|
||||
date: 2026-09-04
|
||||
keywords: локальная LLM генерация текста
|
||||
---
|
||||
|
||||
## Что тестировал
|
||||
|
||||
Запросил у локальной **Llama 4 Scout** маркетинговый текст под конкретную нишу. Цель — понять, насколько модель способна генерировать связный, продающий текст без облачных GPT/Claude.
|
||||
|
||||
## Результат
|
||||
|
||||
Модель выдала связный текст с деловым тоном. Смысл передан верно, структура из 3 абзацев соблюдена.
|
||||
|
||||
## Что понравилось
|
||||
|
||||
- Связность и логика абзацев
|
||||
- Правильный деловой тон
|
||||
- Нет «воды» и шаблонов
|
||||
|
||||
## Что подвело
|
||||
|
||||
- Иногда повторяет конструкции
|
||||
- Ограниченный словарный запас в узких терминах
|
||||
|
||||
## Вывод
|
||||
|
||||
Для черновиков и базовых текстов — подходит. Для финальной редактуры лучше докручивать человеком.
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
title: Qwen 3 суммаризирует текст
|
||||
description: "«Тест локальной Qwen 3 — суммаризация длинного текста. Сравнение с GPT-4o на реальном примере.»"
|
||||
type: text
|
||||
model: Qwen3-30B-A3B
|
||||
prompt: «Суммаризируй научную статью по ИИ в 3 предложения»
|
||||
resultUrl: /text/qwen3-summary.txt
|
||||
tags: [qwen3, суммаризация, текст, генерация]
|
||||
date: 2026-09-04
|
||||
keywords: локальная суммаризация текста Qwen 3
|
||||
---
|
||||
|
||||
## Что тестировал
|
||||
|
||||
Суммаризация научной статьи по ИИ. Цель — проверить, сохраняет ли Qwen 3 ключевые мысли.
|
||||
|
||||
## Результат
|
||||
|
||||
Модель выдала сжатое резюме из 3 предложений с ключевыми фактами.
|
||||
|
||||
## Что понравилось
|
||||
|
||||
- Сохранены ключевые цифры
|
||||
- Понятная структура
|
||||
- Без потери смысла
|
||||
|
||||
## Что подвело
|
||||
|
||||
- Иногда упускает детали
|
||||
- Редко добавляет интерпретацию
|
||||
|
||||
## Вывод
|
||||
|
||||
Qwen 3 — сильная модель для суммаризации. Качество сравнимо с GPT-4o для простых текстов.
|
||||
@@ -0,0 +1,50 @@
|
||||
---
|
||||
title: Как сгенерировать песню на русском через Ace Studio
|
||||
description: "«Пошаговый гайд по генерации песни с вокалом через Ace Studio XL (ACE-Step 1.5). Пишем промпт, запускаем, получаем WAV 48k. Полностью локально и бесплатно.»"
|
||||
tags: [гайд, ace-studio, ace-step, музыка]
|
||||
date: 2026-09-04
|
||||
keywords: как сгенерировать песню Ace Studio
|
||||
---
|
||||
|
||||
## TL;DR
|
||||
|
||||
Ace Studio XL генерирует песню с вокалом на русском за 1–2 минуты. Пишем промпт в стиле, запускаем модель, получаем WAV 48k. Приватно, без облака.
|
||||
|
||||
## Шаг 1: Установка
|
||||
|
||||
```bash
|
||||
pip install torch --index-url https://download.pytorch.org/whl/cuda
|
||||
git clone https://github.com/ACEStep/ACE-Step
|
||||
cd ACE-Step
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
## Шаг 2: Написание промпта
|
||||
|
||||
Укажите жанр, язык, инструменты и BPM:
|
||||
|
||||
```
|
||||
Песня в стиле KDA/BLACKPINK, женский вокал + rap,
|
||||
бас 808, 160 BPM, про тему технологий
|
||||
```
|
||||
|
||||
## Шаг 3: Генерация
|
||||
|
||||
```python
|
||||
from ace_step import AceStepPipeline
|
||||
pipe = AceStepPipeline.from_pretrained("acestep-v15-xl-turbo")
|
||||
audio = pipe(prompt=промпт, guidance=1.0)
|
||||
audio.save("song.wav")
|
||||
```
|
||||
|
||||
## Системные требования
|
||||
|
||||
| Компонент | Минимум |
|
||||
|-----------|---------|
|
||||
| VRAM | 19 ГБ |
|
||||
| RAM | 32 ГБ |
|
||||
| Device | CUDA |
|
||||
|
||||
## Вывод
|
||||
|
||||
Ace Studio XL — лучшая локальная модель для русских песен. XL checkpoint нельзя батчить — генерируйте по одному треку.
|
||||
@@ -0,0 +1,49 @@
|
||||
---
|
||||
title: Как запустить Flux.1 локально на своём компьютере
|
||||
description: "«Пошаговый гайд по запуску Flux.1 на своём GPU. Установка ComfyUI, скачивание модели, генерация изображений. Займёт 10 минут, нужно 8 ГБ VRAM.»"
|
||||
tags: [гайд, flux, comfyui, графика]
|
||||
date: 2026-09-04
|
||||
keywords: как запустить flux локально
|
||||
---
|
||||
|
||||
## TL;DR
|
||||
|
||||
Установите ComfyUI, скачайте Flux.1 Schnell (8 ГБ VRAM), сгенерируйте изображение бесплатно и приватно. Никаких подписок.
|
||||
|
||||
## Шаг 1: Установка ComfyUI
|
||||
|
||||
Откройте терминал и установите ComfyUI:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/comfyanonymous/ComfyUI
|
||||
cd ComfyUI
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
## Шаг 2: Скачивание модели
|
||||
|
||||
Скачайте Flux.1 Schnell с Hugging Face:
|
||||
|
||||
```bash
|
||||
mkdir -v models/checkpoints
|
||||
cd models/checkpoints
|
||||
wget https://huggingface.co/black-forest-labs/FLUX.1-schnell/resolve/main/flux-schnell.gguf
|
||||
```
|
||||
|
||||
## Шаг 3: Запуск
|
||||
|
||||
```bash
|
||||
python main.py --cpu --lowvram
|
||||
```
|
||||
|
||||
## Системные требования
|
||||
|
||||
| Компонент | Минимум | Рекомендовано |
|
||||
|-----------|---------|---------------|
|
||||
| VRAM | 8 ГБ | 12 ГБ |
|
||||
| RAM | 16 ГБ | 32 ГБ |
|
||||
| ОС | Linux/Windows | Linux |
|
||||
|
||||
## Вывод
|
||||
|
||||
Flux.1 запускается за 10 минут. Для быстрого результата используйте Schnell, для качества — Dev.
|
||||
@@ -0,0 +1,31 @@
|
||||
---
|
||||
title: Ace Studio (ACE-Step 1.5)
|
||||
description: "«Локальная генерация песен с вокалом. XL checkpoint, WAV 48k. Полностью приватно, без облака. Лицензия: проприетарная.»"
|
||||
type: audio
|
||||
license: Proprietary
|
||||
huggingfaceUrl: https://huggingface.co/ACEStep
|
||||
tags: [ace-studio, ace-step, аудио, музыка]
|
||||
date: 2026-09-04
|
||||
keywords: локальная генерация музыки
|
||||
---
|
||||
|
||||
## Обзор
|
||||
|
||||
Ace Studio — локальная модель генерации песен с вокалом на базе ACE-Step 1.5.
|
||||
|
||||
## Характеристики
|
||||
|
||||
- Checkpoint: acestep-v15-xl-turbo (4B, ~19GB)
|
||||
- Device: cuda, thinking=False, guidance=1.0
|
||||
- WAV: 48k стерео
|
||||
|
||||
## Где использовать
|
||||
|
||||
- Генерация песен
|
||||
- Аранжировка
|
||||
- Демо-треки
|
||||
|
||||
## Особенности
|
||||
|
||||
- Полностью приватно (локальный запуск)
|
||||
- Не требует облака или API
|
||||
@@ -0,0 +1,26 @@
|
||||
---
|
||||
title: Flux.1
|
||||
description: "«Модель генерации изображений от Black Forest Labs. Высокое качество, поддержка промптов на русском. Лицензия: Flux.1 Community.»"
|
||||
type: image
|
||||
license: Flux.1 Community
|
||||
huggingfaceUrl: https://huggingface.co/black-forest-labs
|
||||
tags: [flux, sd, графика, изображение]
|
||||
date: 2026-09-04
|
||||
keywords: локальная генерация изображений
|
||||
---
|
||||
|
||||
## Обзор
|
||||
|
||||
Flux.1 — модель генерации изображений от Black Forest Labs. Отличается высоким качеством рендера.
|
||||
|
||||
## Характеристики
|
||||
|
||||
- Форматы: Dev (open), Speed (ограниченный)
|
||||
- Разрешение: до 2K
|
||||
- Поддержка ControlNet
|
||||
|
||||
## Где использовать
|
||||
|
||||
- Концепт-арт
|
||||
- Фоны
|
||||
- Иллюстрации
|
||||
@@ -0,0 +1,32 @@
|
||||
---
|
||||
title: Llama 4
|
||||
description: "«Семейство мощных локальных LLM от Meta. Отлично подходит для кода, рассуждений и чатов. Лицензия: Llama 4 Community License.»"
|
||||
type: text
|
||||
license: Llama 4 Community
|
||||
huggingfaceUrl: https://huggingface.co/meta-llama
|
||||
tags: [llama, LLM, текст, код]
|
||||
date: 2026-09-04
|
||||
keywords: локальная LLM Llama 4
|
||||
---
|
||||
|
||||
## Обзор
|
||||
|
||||
Llama 4 — семейство мощных локальных LLM от Meta с открытым кодом.
|
||||
|
||||
## Характеристики
|
||||
|
||||
- Версии: Llama 4 Maverick (305M), Llama 4 Scout (7B)
|
||||
- Device: cuda, batch=1 для XL
|
||||
- Контекст: 128K токенов
|
||||
|
||||
## Где использовать
|
||||
|
||||
- Генерация кода
|
||||
- Рассуждения
|
||||
- Чаты и ассистенты
|
||||
|
||||
## Особенности
|
||||
|
||||
- Открытая лицензия
|
||||
- Отличная поддержка русского
|
||||
- Быстрая локальная работа
|
||||
@@ -0,0 +1,32 @@
|
||||
---
|
||||
title: Qwen3
|
||||
description: "«Семейство мощных open-source LLM от Alibaba. Отличные показатели в коде и математике. Лицензия: Qwen3 License.»"
|
||||
type: text
|
||||
license: Qwen3 License
|
||||
huggingfaceUrl: https://huggingface.co/Qwen
|
||||
tags: [qwen, LLM, текст, код]
|
||||
date: 2026-09-04
|
||||
keywords: локальная LLM Qwen 3
|
||||
---
|
||||
|
||||
## Обзор
|
||||
|
||||
Qwen3 — семейство мощных open-source LLM от Alibaba с отличными показателями.
|
||||
|
||||
## Характеристики
|
||||
|
||||
- Версии: Qwen3-30B-A3B, Qwen3-8B
|
||||
- Device: cuda, batch=1
|
||||
- Контекст: 256K токенов
|
||||
|
||||
## Где использовать
|
||||
|
||||
- Генерация кода
|
||||
- Математика
|
||||
- Суммаризация
|
||||
|
||||
## Особенности
|
||||
|
||||
- Открытый код
|
||||
- Сильная математика
|
||||
- Поддержка MoE архитектуры
|
||||
@@ -0,0 +1,32 @@
|
||||
---
|
||||
title: Stable Diffusion 3.5
|
||||
description: "«Модель генерации изображений от Stability AI. Быстрая, поддерживает русский. Лицензия: Stable Diffusion 3.5 Community.»"
|
||||
type: image
|
||||
license: SD3.5 Community
|
||||
huggingfaceUrl: https://huggingface.co/StabilityAI
|
||||
tags: [sd, sd3, графика, изображение]
|
||||
date: 2026-09-04
|
||||
keywords: локальная генерация изображений Stable Diffusion
|
||||
---
|
||||
|
||||
## Обзор
|
||||
|
||||
Stable Diffusion 3.5 — модель генерации изображений от Stability AI с открытым кодом.
|
||||
|
||||
## Характеристики
|
||||
|
||||
- Версии: SD3.5 Large, SD3.5 Large Turbo
|
||||
- Device: cuda, VRAM 8GB+
|
||||
- Скорость: 512×512 за 2 сек
|
||||
|
||||
## Где использовать
|
||||
|
||||
- Генерация изображений
|
||||
- Арт и концепты
|
||||
- Фото-стилизация
|
||||
|
||||
## Особенности
|
||||
|
||||
- Быстрая генерация
|
||||
- Поддержка русского
|
||||
- Открытый код
|
||||
@@ -0,0 +1,28 @@
|
||||
---
|
||||
title: Новые локальные модели вышли в сентябре 2026
|
||||
description: "«Обзор новых релизов локальных open-source моделей сентября 2026. Qwen3.6 с 35B, новые версии Flux, Ace Studio XL. Что улучшилось.»"
|
||||
source: Hugging Face
|
||||
tags: [новости, ИИ, модели]
|
||||
date: 2026-09-04
|
||||
keywords: новые нейросети сентябрь 2026
|
||||
---
|
||||
|
||||
## TL;DR
|
||||
|
||||
В сентябре 2026 вышли Qwen3.6-35B, новые версии Flux и Ace Studio XL. Улучшились качество кода, скорость генерации и поддержка русского языка.
|
||||
|
||||
## Qwen3.6-35B
|
||||
|
||||
Новое семейство LLM с улучшенными показателями в коде и математике. Поддерживает контекст 256K токенов.
|
||||
|
||||
## Flux.2
|
||||
|
||||
Обновлённая модель генерации изображений с лучшей детализацией и поддержкой русского языка.
|
||||
|
||||
## Ace Studio XL v15
|
||||
|
||||
Улучшенная генерация музыки с вокалом. WAV 48k, приватный локальный запуск.
|
||||
|
||||
## Вывод
|
||||
|
||||
Сентябрь 2026 — богат на локальные модели. Qwen3.6 и Flux.2 — для работы, Ace Studio XL — для музыки.
|
||||
@@ -0,0 +1,156 @@
|
||||
---
|
||||
export interface Props {
|
||||
title: string;
|
||||
description?: string;
|
||||
schema?: string;
|
||||
image?: string;
|
||||
date?: string;
|
||||
slug?: string;
|
||||
ogType?: string;
|
||||
}
|
||||
const {
|
||||
title, description = '', schema = '',
|
||||
image = '', date = '', slug = '',
|
||||
ogType = 'article',
|
||||
} = Astro.props;
|
||||
|
||||
const baseUrl = 'https://нейросети.рус';
|
||||
const pageUrl = slug ? `${baseUrl}/${slug}/` : baseUrl;
|
||||
const ogImage = image || `${baseUrl}/og-image.svg`;
|
||||
|
||||
const articleSchema = slug ? JSON.stringify({
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Article",
|
||||
"headline": title,
|
||||
"description": description || title,
|
||||
"datePublished": date || new Date().toISOString().split('T')[0],
|
||||
"image": image || undefined,
|
||||
"url": `${baseUrl}/${slug}/`,
|
||||
"author": { "@type": "Person", "name": "Никита Тарасов" },
|
||||
"publisher": { "@type": "Organization", "name": "нейросети.рус" }
|
||||
}) : '';
|
||||
|
||||
const orgSchema = JSON.stringify({
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Organization",
|
||||
"name": "нейросети.рус",
|
||||
"url": baseUrl,
|
||||
"description": "Витрина реальных результатов локальных open-source нейросетей: текст, графика, аудио, видео",
|
||||
"sameAs": [
|
||||
"https://tarasov.top",
|
||||
],
|
||||
});
|
||||
---
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{title}</title>
|
||||
<meta name="description" content={description}>
|
||||
<link rel="canonical" href={pageUrl}>
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||
|
||||
<!-- Pagefind search (файлы генерируются при pagefind --site dist после сборки) -->
|
||||
<link href="/pagefind/pagefind-ui.css" rel="stylesheet" is:inline>
|
||||
<script src="/pagefind/pagefind-ui.js" is:inline></script>
|
||||
|
||||
<!-- OpenGraph -->
|
||||
<meta property="og:type" content={ogType}>
|
||||
<meta property="og:title" content={title}>
|
||||
<meta property="og:description" content={description}>
|
||||
<meta property="og:url" content={pageUrl}>
|
||||
<meta property="og:image" content={ogImage}>
|
||||
<meta property="og:site_name" content="нейросети.рус">
|
||||
<meta property="og:locale" content="ru_RU">
|
||||
|
||||
<!-- Twitter -->
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content={title}>
|
||||
<meta name="twitter:description" content={description}>
|
||||
|
||||
<!-- Schema.org JSON-LD -->
|
||||
{articleSchema && <script type="application/ld+json" set:html={articleSchema}></script>}
|
||||
<script type="application/ld+json" set:html={orgSchema}></script>
|
||||
|
||||
<style is:global>
|
||||
:root{
|
||||
--bg:#0d0f1a;
|
||||
--text:#e6e8f0;
|
||||
--muted:#9aa0b5;
|
||||
--accent:#6d5efc;
|
||||
--accent2:#38d9a9;
|
||||
--card:#161a2a;
|
||||
--card2:#1e2235;
|
||||
--border:#2a2f45;
|
||||
--radius:12px;
|
||||
}
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{font-family:system-ui,-apple-system,'Segoe UI',sans-serif;background:var(--bg);color:var(--text);line-height:1.7}
|
||||
.container{max-width:960px;margin:0 auto;padding:20px}
|
||||
header{padding:20px 0;border-bottom:1px solid var(--border)}
|
||||
nav{display:flex;align-items:center;gap:16px;flex-wrap:wrap}
|
||||
nav a{color:var(--muted);text-decoration:none;font-weight:600;font-size:14px;transition:color .2s}
|
||||
nav a:hover{color:var(--accent2)}
|
||||
nav .brand{font-size:18px;font-weight:800;color:var(--text);letter-spacing:-.5px}
|
||||
nav .brand span{color:var(--accent)}
|
||||
nav .search-spacer{margin-left:auto}
|
||||
article{margin:32px 0;padding:32px;background:var(--card);border-radius:var(--radius);border:1px solid var(--border)}
|
||||
article h1{font-size:32px;margin-bottom:16px;line-height:1.2;letter-spacing:-.5px}
|
||||
article h2{font-size:22px;margin:28px 0 12px;color:var(--text)}
|
||||
article h3{font-size:18px;margin:20px 0 8px;color:var(--accent2)}
|
||||
article p{margin:10px 0;color:#cdd2e0}
|
||||
article ul,article ol{margin:10px 0;padding-left:24px}
|
||||
article li{margin:6px 0;color:#cdd2e0}
|
||||
article strong{color:var(--text)}
|
||||
article a{color:var(--accent2);text-decoration:none;border-bottom:1px solid transparent;transition:border-color .2s}
|
||||
article a:hover{border-bottom-color:var(--accent2)}
|
||||
code{background:var(--card2);padding:2px 6px;border-radius:4px;font-size:.9em;color:#e0b0ff}
|
||||
pre{background:var(--card2);padding:16px;border-radius:8px;overflow-x:auto;margin:16px 0;border:1px solid var(--border)}
|
||||
pre code{background:none;padding:0;color:#c9d4ff}
|
||||
.card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:16px;margin:24px 0}
|
||||
.card{background:var(--card2);border:1px solid var(--border);border-radius:10px;padding:18px;transition:transform .15s,border-color .15s}
|
||||
.card:hover{transform:translateY(-2px);border-color:var(--accent)}
|
||||
.card h3{margin-bottom:8px;font-size:16px}
|
||||
.card p{font-size:14px;color:var(--muted)}
|
||||
.badge{display:inline-block;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.5px;padding:3px 8px;border-radius:20px;background:var(--accent);color:#fff;margin-right:6px}
|
||||
.badge.t{background:#6d5efc}.badge.i{background:#f72585}.badge.a{background:#38d9a9}.badge.v{background:#ff9f1c}
|
||||
.related{margin-top:32px;padding:20px;background:var(--card2);border-radius:var(--radius);border:1px solid var(--border)}
|
||||
.related a{display:block;padding:6px 0;color:var(--accent2)}
|
||||
footer{text-align:center;padding:40px 0;color:var(--muted);font-size:13px;border-top:1px solid var(--border);margin-top:40px}
|
||||
.search-bar{position:relative}
|
||||
.search-bar input{padding:7px 12px;border:1px solid var(--border);border-radius:8px;background:var(--card2);color:var(--text);width:220px;font-size:14px}
|
||||
.search-bar input:focus{outline:none;border-color:var(--accent)}
|
||||
.pagefind-ui__results{position:absolute;background:var(--card);border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 24px rgba(0,0,0,.4);z-index:100;margin-top:6px;max-height:360px;overflow-y:auto;width:300px}
|
||||
.pagefind-ui__result{padding:10px 12px;border-bottom:1px solid var(--border)}
|
||||
.pagefind-ui__result:last-child{border:none}
|
||||
.pagefind-ui__result a{color:var(--accent2);font-weight:600;text-decoration:none}
|
||||
.pagefind-ui__result p{font-size:12px;color:var(--muted);margin:2px 0}
|
||||
.pagefind-ui__drawer{display:none !important}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<header>
|
||||
<nav>
|
||||
<a href="/" class="brand">🤖 нейросети<span>.рус</span></a>
|
||||
<a href="/examples/">Примеры</a>
|
||||
<a href="/models/">Модели</a>
|
||||
<a href="/compare/">Сравнения</a>
|
||||
<a href="/news/">Новости</a>
|
||||
<a href="/guide/">Гайды</a>
|
||||
<a href="/ace-studio/">Ace Studio</a>
|
||||
<span class="search-spacer"></span>
|
||||
<div class="search-bar" id="search"></div>
|
||||
</nav>
|
||||
</header>
|
||||
<slot />
|
||||
<footer>
|
||||
<p>© 2026 нейросети.рус — витрина реальных результатов локальных open-source моделей</p>
|
||||
</footer>
|
||||
</div>
|
||||
<script is:inline>
|
||||
new PagefindUI({ element: "#search", showSubResults: false, showImages: false });
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,14 @@
|
||||
---
|
||||
import BaseLayout from '../layouts/BaseLayout.astro';
|
||||
---
|
||||
<BaseLayout title="404 — Страница не найдена" ogType="website">
|
||||
<article style="text-align:center;padding:60px 20px;">
|
||||
<h1 style="font-size:64px;color:var(--accent);">404</h1>
|
||||
<p>Страница не найдена</p>
|
||||
<p style="margin-top:16px;">
|
||||
<a href="/">🏠 На главную</a> ·
|
||||
<a href="/examples/">🔎 Примеры</a> ·
|
||||
<a href="/models/">📦 Модели</a>
|
||||
</p>
|
||||
</article>
|
||||
</BaseLayout>
|
||||
@@ -0,0 +1,27 @@
|
||||
---
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import Breadcrumbs from '../../components/Breadcrumbs.astro';
|
||||
|
||||
export async function getStaticPaths() {
|
||||
const items = import.meta.glob('/src/content/aceStudio/*.md');
|
||||
return Object.keys(items).map((path) => {
|
||||
const slug = path.replace('/src/content/aceStudio/', '').replace('.md', '');
|
||||
return { params: { slug } };
|
||||
});
|
||||
}
|
||||
|
||||
const { slug } = Astro.params;
|
||||
const items = import.meta.glob('/src/content/aceStudio/*.md', { eager: true });
|
||||
const item = items[`/src/content/aceStudio/${slug}.md`];
|
||||
const fm = item?.frontmatter || {};
|
||||
const Content = item?.default;
|
||||
---
|
||||
<BaseLayout title={fm.title || slug} description={fm.description} date={fm.date || ''} slug={`ace-studio/${slug}`} ogType="article">
|
||||
<article>
|
||||
<Breadcrumbs />
|
||||
<div style="margin-bottom:16px;"><span class="badge a">аудио</span></div>
|
||||
<h1>{fm.title || slug}</h1>
|
||||
{fm.description && <p style="font-size:18px;color:var(--muted);">{fm.description}</p>}
|
||||
{Content && <Content />}
|
||||
</article>
|
||||
</BaseLayout>
|
||||
@@ -0,0 +1,26 @@
|
||||
---
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import CardGrid from '../../components/CardGrid.astro';
|
||||
import { getCollection } from 'astro:content';
|
||||
|
||||
const ace = await getCollection('aceStudio');
|
||||
const sorted = ace.sort((a, b) => {
|
||||
const da = new Date(a.data.date || 0);
|
||||
const db = new Date(b.data.date || 0);
|
||||
return db - da;
|
||||
});
|
||||
---
|
||||
<BaseLayout title="Ace Studio — нейросети.рус" ogType="website">
|
||||
<article>
|
||||
<h1>Ace Studio — музыкальные нейросети</h1>
|
||||
<p>Сгенерированные треки и разбор музыкальных моделей. Локальная генерация песен с вокалом — то, чего нет у конкурентов в каталогах.</p>
|
||||
</article>
|
||||
<CardGrid items={sorted.map((a) => ({
|
||||
slug: `ace-studio/${a.slug}`,
|
||||
title: a.data.title,
|
||||
description: a.data.description,
|
||||
badge: 'аудио',
|
||||
badgeClass: 'a',
|
||||
meta: '',
|
||||
}))} />
|
||||
</BaseLayout>
|
||||
@@ -0,0 +1,30 @@
|
||||
---
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import Breadcrumbs from '../../components/Breadcrumbs.astro';
|
||||
|
||||
export async function getStaticPaths() {
|
||||
const items = import.meta.glob('/src/content/compare/*.md');
|
||||
return Object.keys(items).map((path) => {
|
||||
const slug = path.replace('/src/content/compare/', '').replace('.md', '');
|
||||
return { params: { slug } };
|
||||
});
|
||||
}
|
||||
|
||||
const { slug } = Astro.params;
|
||||
const items = import.meta.glob('/src/content/compare/*.md', { eager: true });
|
||||
const item = items[`/src/content/compare/${slug}.md`];
|
||||
const fm = item?.frontmatter || {};
|
||||
const Content = item?.default;
|
||||
---
|
||||
<BaseLayout title={fm.title || slug} description={fm.description} date={fm.date || ''} slug={`compare/${slug}`} ogType="article">
|
||||
<article>
|
||||
<Breadcrumbs />
|
||||
<div style="margin-bottom:16px;">
|
||||
<span class="badge t">сравнение</span>
|
||||
{fm.models && fm.models.length > 0 && <span class="badge" style="background:var(--muted);">${fm.models.join(', ')}</span>}
|
||||
</div>
|
||||
<h1>{fm.title || slug}</h1>
|
||||
{fm.description && <p style="font-size:18px;color:var(--muted);">{fm.description}</p>}
|
||||
{Content && <Content />}
|
||||
</article>
|
||||
</BaseLayout>
|
||||
@@ -0,0 +1,21 @@
|
||||
---
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import CardGrid from '../../components/CardGrid.astro';
|
||||
import { getCollection } from 'astro:content';
|
||||
|
||||
const compares = await getCollection('compare');
|
||||
---
|
||||
<BaseLayout title="Сравнения моделей — нейросети.рус" ogType="website">
|
||||
<article>
|
||||
<h1>Сравнения моделей под задачи</h1>
|
||||
<p>«Llama 4 vs Qwen 3 vs Mistral» — сравнение на реальных сгенерированных результатах, а не на бумаге.</p>
|
||||
</article>
|
||||
<CardGrid items={compares.map((c) => ({
|
||||
slug: `compare/${c.slug}`,
|
||||
title: c.data.title,
|
||||
description: c.data.description,
|
||||
badge: 'сравнение',
|
||||
badgeClass: 't',
|
||||
meta: c.data.task || '',
|
||||
}))} />
|
||||
</BaseLayout>
|
||||
@@ -0,0 +1,57 @@
|
||||
---
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import Breadcrumbs from '../../components/Breadcrumbs.astro';
|
||||
|
||||
export async function getStaticPaths() {
|
||||
const items = import.meta.glob('/src/content/examples/*.md');
|
||||
return Object.keys(items).map((path) => {
|
||||
const slug = path.replace('/src/content/examples/', '').replace('.md', '');
|
||||
return { params: { slug } };
|
||||
});
|
||||
}
|
||||
|
||||
const { slug } = Astro.params;
|
||||
const items = import.meta.glob('/src/content/examples/*.md', { eager: true });
|
||||
const item = items[`/src/content/examples/${slug}.md`];
|
||||
const fm = item?.frontmatter || {};
|
||||
const Content = item?.default;
|
||||
|
||||
const typeBadge = { text: 't', image: 'i', audio: 'a', video: 'v' }[fm.type] || 't';
|
||||
const typeLabel = { text: 'текст', image: 'графика', audio: 'аудио', video: 'видео' }[fm.type] || fm.type;
|
||||
---
|
||||
<BaseLayout
|
||||
title={fm.title || slug}
|
||||
description={fm.description}
|
||||
date={fm.date || ''}
|
||||
slug={`examples/${slug}`}
|
||||
ogType="article"
|
||||
>
|
||||
<article>
|
||||
<Breadcrumbs />
|
||||
<div style="margin-bottom:16px;">
|
||||
<span class="badge ${typeBadge}">${typeLabel}</span>
|
||||
<span class="badge" style="background:var(--muted);">${fm.model || ''}</span>
|
||||
</div>
|
||||
<h1>{fm.title || slug}</h1>
|
||||
{fm.description && <p style="font-size:18px;color:var(--muted);">{fm.description}</p>}
|
||||
|
||||
{fm.resultUrl && (
|
||||
<figure style="margin:24px 0;">
|
||||
{fm.type === 'image' ? (
|
||||
<img src={fm.resultUrl} alt={fm.title} style="width:100%;border-radius:8px;" loading="lazy" />
|
||||
) : fm.type === 'audio' ? (
|
||||
<audio controls src={fm.resultUrl} style="width:100%;"></audio>
|
||||
) : fm.type === 'video' ? (
|
||||
<video controls src={fm.resultUrl} style="width:100%;border-radius:8px;"></video>
|
||||
) : (
|
||||
<div style="background:var(--card2);border-left:3px solid var(--accent);padding:16px;border-radius:0 8px 8px 0;">
|
||||
{fm.prompt && <p style="color:var(--muted);font-size:13px;margin-bottom:8px;">Промпт: {fm.prompt}</p>}
|
||||
<div style="white-space:pre-wrap;">{fm.resultText || ''}</div>
|
||||
</div>
|
||||
)}
|
||||
</figure>
|
||||
)}
|
||||
|
||||
{Content && <Content />}
|
||||
</article>
|
||||
</BaseLayout>
|
||||
@@ -0,0 +1,26 @@
|
||||
---
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import CardGrid from '../../components/CardGrid.astro';
|
||||
import { getCollection } from 'astro:content';
|
||||
|
||||
const examples = await getCollection('examples');
|
||||
const sorted = examples.sort((a, b) => {
|
||||
const da = new Date(a.data.date || 0);
|
||||
const db = new Date(b.data.date || 0);
|
||||
return db - da;
|
||||
});
|
||||
---
|
||||
<BaseLayout title="Примеры результатов — нейросети.рус" ogType="website">
|
||||
<article>
|
||||
<h1>Примеры результатов локальных моделей</h1>
|
||||
<p>Реальные сгенерированные результаты: текст, графика, аудио, видео. Каждый пример проверен на своих GPU.</p>
|
||||
</article>
|
||||
<CardGrid items={sorted.map((e) => ({
|
||||
slug: `examples/${e.slug}`,
|
||||
title: e.data.title,
|
||||
description: e.data.description,
|
||||
badge: { text: 'текст', image: 'графика', audio: 'аудио', video: 'видео' }[e.data.type] || e.data.type,
|
||||
badgeClass: { text: 't', image: 'i', audio: 'a', video: 'v' }[e.data.type] || '',
|
||||
meta: e.data.model,
|
||||
}))} />
|
||||
</BaseLayout>
|
||||
@@ -0,0 +1,35 @@
|
||||
// JSON Feed из всех 6 коллекций
|
||||
import { getCollection } from 'astro:content';
|
||||
|
||||
const BASE = 'https://нейросети.рус';
|
||||
|
||||
export async function GET() {
|
||||
const collections = ['examples', 'models', 'compare', 'news', 'guide', 'aceStudio'];
|
||||
const items = [];
|
||||
for (const name of collections) {
|
||||
try {
|
||||
const list = await getCollection(name);
|
||||
for (const item of list) {
|
||||
const slug = name === 'aceStudio' ? 'ace-studio' : name;
|
||||
items.push({
|
||||
id: `${BASE}/${slug}/${item.slug}/`,
|
||||
url: `${BASE}/${slug}/${item.slug}/`,
|
||||
title: item.data.title,
|
||||
date_published: item.data.date ? new Date(item.data.date).toISOString() : new Date().toISOString(),
|
||||
description: item.data.description || item.data.title,
|
||||
});
|
||||
}
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
return new Response(JSON.stringify({
|
||||
version: 'https://jsonfeed.org/version/1.1',
|
||||
title: 'нейросети.рус — витрина локальных моделей',
|
||||
home_page_url: BASE,
|
||||
feed_url: `${BASE}/feed.json`,
|
||||
language: 'ru',
|
||||
items,
|
||||
}), {
|
||||
headers: { 'Content-Type': 'application/feed+json; charset=utf-8' },
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
---
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import Breadcrumbs from '../../components/Breadcrumbs.astro';
|
||||
|
||||
export async function getStaticPaths() {
|
||||
const items = import.meta.glob('/src/content/guide/*.md');
|
||||
return Object.keys(items).map((path) => {
|
||||
const slug = path.replace('/src/content/guide/', '').replace('.md', '');
|
||||
return { params: { slug } };
|
||||
});
|
||||
}
|
||||
|
||||
const { slug } = Astro.params;
|
||||
const items = import.meta.glob('/src/content/guide/*.md', { eager: true });
|
||||
const item = items[`/src/content/guide/${slug}.md`];
|
||||
const fm = item?.frontmatter || {};
|
||||
const Content = item?.default;
|
||||
---
|
||||
<BaseLayout title={fm.title || slug} description={fm.description} date={fm.date || ''} slug={`guide/${slug}`} ogType="article">
|
||||
<article>
|
||||
<Breadcrumbs />
|
||||
<div style="margin-bottom:16px;"><span class="badge a">гайд</span></div>
|
||||
<h1>{fm.title || slug}</h1>
|
||||
{fm.description && <p style="font-size:18px;color:var(--muted);">{fm.description}</p>}
|
||||
{Content && <Content />}
|
||||
</article>
|
||||
</BaseLayout>
|
||||
@@ -0,0 +1,21 @@
|
||||
---
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import CardGrid from '../../components/CardGrid.astro';
|
||||
import { getCollection } from 'astro:content';
|
||||
|
||||
const guides = await getCollection('guide');
|
||||
---
|
||||
<BaseLayout title="Гайды — нейросети.рус" ogType="website">
|
||||
<article>
|
||||
<h1>Гайды по локальному запуску</h1>
|
||||
<p>Как запустить модель у себя, какой выбрать checkpoint и сколько нужно RAM/VRAM.</p>
|
||||
</article>
|
||||
<CardGrid items={guides.map((g) => ({
|
||||
slug: `guide/${g.slug}`,
|
||||
title: g.data.title,
|
||||
description: g.data.description,
|
||||
badge: 'гайд',
|
||||
badgeClass: 'a',
|
||||
meta: '',
|
||||
}))} />
|
||||
</BaseLayout>
|
||||
@@ -0,0 +1,20 @@
|
||||
---
|
||||
import BaseLayout from '../layouts/BaseLayout.astro';
|
||||
---
|
||||
<BaseLayout title="нейросети.рус — витрина реальных результатов локальных нейросетей" ogType="website">
|
||||
<article>
|
||||
<h1>Реальные результаты локальных open-source нейросетей</h1>
|
||||
<p>Не каталог инструментов, а <strong>витрина того, что модели реально умеют</strong>. Каждая карточка — сгенерированный текст, изображение, звук или видео локальной open-source моделью. Честный разбор, сравнения, гайды по запуску.</p>
|
||||
<p><a href="/examples/">🔎 Все примеры результатов →</a></p>
|
||||
|
||||
<h2>Что внутри</h2>
|
||||
<ul>
|
||||
<li><strong>Примеры</strong> — реальные сгенерированные результаты: текст, графика, аудио, видео</li>
|
||||
<li><strong>Модели</strong> — каталог open-source моделей с лицензиями и ссылками на Hugging Face</li>
|
||||
<li><strong>Сравнения</strong> — «Llama 4 vs Qwen 3 vs Mistral» на реальных результатах</li>
|
||||
<li><strong>Гайды</strong> — как запустить модель локально и какой выбрать checkpoint</li>
|
||||
<li><strong>Новости</strong> — оперативные новости мира AI и локальных моделей</li>
|
||||
<li><strong>Ace Studio</strong> — сгенерированные треки и разбор музыкальных нейросетей</li>
|
||||
</ul>
|
||||
</article>
|
||||
</BaseLayout>
|
||||
@@ -0,0 +1,29 @@
|
||||
// llms.txt для AI-агрегаторов
|
||||
export const prerender = true;
|
||||
const content = `# нейросети.рус — витрина локальных open-source моделей
|
||||
|
||||
> Реальные сгенерированные результаты локальных open-source нейросетей: текст, графика, аудио, видео. Не каталог инструментов, а витрина того, что модели реально умеют.
|
||||
|
||||
## Разделы
|
||||
|
||||
- [Примеры](https://нейросети.рус/examples/) — сгенерированные результаты под задачи
|
||||
- [Модели](https://нейросети.рус/models/) — каталог open-source моделей с лицензиями
|
||||
- [Сравнения](https://нейросети.рус/compare/) — Llama 4 vs Qwen 3 vs Mistral на реальных результатах
|
||||
- [Гайды](https://нейросети.рус/guide/) — как запустить модель локально
|
||||
- [Новости](https://нейросети.рус/news/) — оперативные новости мира AI
|
||||
- [Ace Studio](https:// нейросети.рус/ace-studio/) — сгенерированные треки и разбор музыкальных моделей
|
||||
|
||||
## Технологии
|
||||
|
||||
- Sitemap: [sitemap.xml](https://нейросети.рус/sitemap.xml)
|
||||
- RSS: [rss.xml](https:// нейросети.рус/rss.xml)
|
||||
- JSON Feed: [feed.json](https:// нейросети.рус/feed.json)
|
||||
- Schema.org: Article + BreadcrumbList + Organization
|
||||
|
||||
`;
|
||||
|
||||
export function GET() {
|
||||
return new Response(content, {
|
||||
headers: { 'Content-Type': 'text/plain; charset=utf-8', 'Cache-Control': 'public, max-age=3600' },
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
---
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import Breadcrumbs from '../../components/Breadcrumbs.astro';
|
||||
|
||||
export async function getStaticPaths() {
|
||||
const items = import.meta.glob('/src/content/models/*.md');
|
||||
return Object.keys(items).map((path) => {
|
||||
const slug = path.replace('/src/content/models/', '').replace('.md', '');
|
||||
return { params: { slug } };
|
||||
});
|
||||
}
|
||||
|
||||
const { slug } = Astro.params;
|
||||
const items = import.meta.glob('/src/content/models/*.md', { eager: true });
|
||||
const item = items[`/src/content/models/${slug}.md`];
|
||||
const fm = item?.frontmatter || {};
|
||||
const Content = item?.default;
|
||||
---
|
||||
<BaseLayout title={fm.title || slug} description={fm.description} date={fm.date || ''} slug={`models/${slug}`} ogType="article">
|
||||
<article>
|
||||
<Breadcrumbs />
|
||||
<div style="margin-bottom:16px;">
|
||||
<span class="badge" style="background:var(--accent2);">${fm.type || ''}</span>
|
||||
{fm.license && <span class="badge" style="background:var(--muted);">${fm.license}</span>}
|
||||
</div>
|
||||
<h1>{fm.title || slug}</h1>
|
||||
{fm.description && <p style="font-size:18px;color:var(--muted);">{fm.description}</p>}
|
||||
{Content && <Content />}
|
||||
</article>
|
||||
</BaseLayout>
|
||||
@@ -0,0 +1,21 @@
|
||||
---
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import CardGrid from '../../components/CardGrid.astro';
|
||||
import { getCollection } from 'astro:content';
|
||||
|
||||
const models = await getCollection('models');
|
||||
---
|
||||
<BaseLayout title="Модели — нейросети.рус" ogType="website">
|
||||
<article>
|
||||
<h1>Каталог open-source моделей</h1>
|
||||
<p>Локальные модели для текста, графики, аудио, видео и кода. С лицензиями и ссылками на Hugging Face.</p>
|
||||
</article>
|
||||
<CardGrid items={models.map((m) => ({
|
||||
slug: `models/${m.slug}`,
|
||||
title: m.data.title,
|
||||
description: m.data.description,
|
||||
badge: m.data.type,
|
||||
badgeClass: { text: 't', image: 'i', audio: 'a', video: 'v', code: 't' }[m.data.type] || '',
|
||||
meta: m.data.license || '',
|
||||
}))} />
|
||||
</BaseLayout>
|
||||
@@ -0,0 +1,30 @@
|
||||
---
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import Breadcrumbs from '../../components/Breadcrumbs.astro';
|
||||
|
||||
export async function getStaticPaths() {
|
||||
const items = import.meta.glob('/src/content/news/*.md');
|
||||
return Object.keys(items).map((path) => {
|
||||
const slug = path.replace('/src/content/news/', '').replace('.md', '');
|
||||
return { params: { slug } };
|
||||
});
|
||||
}
|
||||
|
||||
const { slug } = Astro.params;
|
||||
const items = import.meta.glob('/src/content/news/*.md', { eager: true });
|
||||
const item = items[`/src/content/news/${slug}.md`];
|
||||
const fm = item?.frontmatter || {};
|
||||
const Content = item?.default;
|
||||
---
|
||||
<BaseLayout title={fm.title || slug} description={fm.description} date={fm.date || ''} slug={`news/${slug}`} ogType="article">
|
||||
<article>
|
||||
<Breadcrumbs />
|
||||
<div style="margin-bottom:16px;">
|
||||
{fm.isAuto && <span class="badge i">автоматически</span>}
|
||||
{fm.source && <span class="badge" style="background:var(--muted);">${fm.source}</span>}
|
||||
</div>
|
||||
<h1>{fm.title || slug}</h1>
|
||||
{fm.description && <p style="font-size:18px;color:var(--muted);">{fm.description}</p>}
|
||||
{Content && <Content />}
|
||||
</article>
|
||||
</BaseLayout>
|
||||
@@ -0,0 +1,26 @@
|
||||
---
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import CardGrid from '../../components/CardGrid.astro';
|
||||
import { getCollection } from 'astro:content';
|
||||
|
||||
const news = await getCollection('news');
|
||||
const sorted = news.sort((a, b) => {
|
||||
const da = new Date(a.data.date || 0);
|
||||
const db = new Date(b.data.date || 0);
|
||||
return db - da;
|
||||
});
|
||||
---
|
||||
<BaseLayout title="Новости AI — нейросети.рус" ogType="website">
|
||||
<article>
|
||||
<h1>Новости мира нейросетей</h1>
|
||||
<p>Оперативные новости: локальные модели, обновления, релизы. Часть материалов сгенерирована автоматически из китайских источников.</p>
|
||||
</article>
|
||||
<CardGrid items={sorted.map((n) => ({
|
||||
slug: `news/${n.slug}`,
|
||||
title: n.data.title,
|
||||
description: n.data.description,
|
||||
badge: n.data.isAuto ? 'авто' : '',
|
||||
badgeClass: 'i',
|
||||
meta: n.data.source || '',
|
||||
}))} />
|
||||
</BaseLayout>
|
||||
@@ -0,0 +1,50 @@
|
||||
// RSS из всех 6 коллекций
|
||||
import { getCollection } from 'astro:content';
|
||||
|
||||
const BASE = 'https://нейросети.рус';
|
||||
|
||||
export async function GET() {
|
||||
const collections = ['examples', 'models', 'compare', 'news', 'guide', 'aceStudio'];
|
||||
const all = [];
|
||||
for (const name of collections) {
|
||||
try {
|
||||
const items = await getCollection(name);
|
||||
for (const item of items) {
|
||||
const slug = name === 'aceStudio' ? 'ace-studio' : name;
|
||||
all.push({
|
||||
title: item.data.title,
|
||||
link: `${BASE}/${slug}/${item.slug}/`,
|
||||
guid: `${BASE}/${slug}/${item.slug}/`,
|
||||
pubDate: item.data.date ? new Date(item.data.date).toUTCString() : new Date().toUTCString(),
|
||||
description: item.data.description || item.data.title,
|
||||
});
|
||||
}
|
||||
} catch (e) {}
|
||||
}
|
||||
all.sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate));
|
||||
|
||||
const items = all.slice(0, 100).map(i => ` <item>
|
||||
<title>${i.title}</title>
|
||||
<link>${i.link}</link>
|
||||
<guid>${i.guid}</guid>
|
||||
<pubDate>${i.pubDate}</pubDate>
|
||||
<description>${i.description}</description>
|
||||
</item>`).join('\n');
|
||||
|
||||
const rss = `<?xml version="1.0" encoding="UTF-8"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>нейросети.рус — витрина локальных моделей</title>
|
||||
<link>${BASE}</link>
|
||||
<description>Реальные результаты локальных open-source нейросетей: текст, графика, аудио, видео</description>
|
||||
<language>ru</language>
|
||||
<lastBuildDate>${new Date().toUTCString()}</lastBuildDate>
|
||||
<atom:link href="${BASE}/rss.xml" rel="self" type="application/rss+xml"/>
|
||||
${items}
|
||||
</channel>
|
||||
</rss>`;
|
||||
|
||||
return new Response(rss, {
|
||||
headers: { 'Content-Type': 'application/rss+xml; charset=utf-8' },
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
// Динамический sitemap из всех 6 коллекций
|
||||
import { getCollection } from 'astro:content';
|
||||
|
||||
const BASE = 'https://нейросети.рус';
|
||||
|
||||
function lastmod(dateStr) {
|
||||
if (!dateStr) return new Date().toISOString().split('T')[0];
|
||||
const d = typeof dateStr === 'string' ? new Date(dateStr) : dateStr;
|
||||
return d.toISOString().split('T')[0];
|
||||
}
|
||||
|
||||
const pages = [
|
||||
{ url: '/', priority: '1.0' },
|
||||
{ url: '/examples/', priority: '0.9' },
|
||||
{ url: '/models/', priority: '0.9' },
|
||||
{ url: '/compare/', priority: '0.8' },
|
||||
{ url: '/news/', priority: '0.8' },
|
||||
{ url: '/guide/', priority: '0.8' },
|
||||
{ url: '/ace-studio/', priority: '0.8' },
|
||||
];
|
||||
|
||||
export async function GET() {
|
||||
const collections = ['examples', 'models', 'compare', 'news', 'guide', 'aceStudio'];
|
||||
for (const name of collections) {
|
||||
try {
|
||||
const items = await getCollection(name);
|
||||
for (const item of items) {
|
||||
const slug = name === 'aceStudio' ? 'ace-studio' : name;
|
||||
pages.push({
|
||||
url: `/${slug}/${item.slug}/`,
|
||||
priority: '0.7',
|
||||
lastmod: lastmod(item.data.date),
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
// коллекция может быть пустой
|
||||
}
|
||||
}
|
||||
|
||||
const xml = `<?xml version="1.0" encoding="UTF-8"?>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
${pages.map(p =>
|
||||
` <url><loc>${BASE}${p.url}</loc><priority>${p.priority}</priority>${p.lastmod ? `<lastmod>${p.lastmod}</lastmod>` : ''}</url>`
|
||||
).join('\n')}
|
||||
</urlset>`;
|
||||
|
||||
return new Response(xml, {
|
||||
headers: {
|
||||
'Content-Type': 'application/xml; charset=utf-8',
|
||||
'Cache-Control': 'public, max-age=86400',
|
||||
},
|
||||
});
|
||||
}
|
||||
Reference in new issue
Block a user