Локальные LLM всё доступнее. OmniCoder-9B

от
Soft    llm, omnicoder, ollama, искуственный интеллект, artificial intelligence

Продолжая изучать тему локальных моделей, я наткнулся на хорошо сбалансированный вариант: OmniCoder-9B. Я тестировал OmniCoder целую неделю на разных задачах и со всеми она справлялась достойно. В отличие от Gemma 4 и Qwen, подключив эту модель к Codex/Claude, проблем с вызовом тулов вообще не было.

Скачиваем модель в Ollama.
  1. ollama pull carstenuhlig/omnicoder-9b

Модель занимает 5.7 Гб, даже меньше, чем Qwen3.5:9b (6.6 Гб). Однако, в отличие от Gemma 4 e4b, в которой 4 миллиарда параметров, OmniCoder-9B имеет 9 миллиардов параметров, так что имейте в виду, модель будет более требовательной к памяти. Я запускаю на ноутбуке с RTX 3060 Laptop GPU 6GB VRAM и 32 GB RAM. Если у вас железо мощнее, проблем быть не должно.

Агенты
Начнём с той же задачи, что и в случае с Gemma 4: понять, какая версия проекта на Rust.

What version is the project currently on?Ответ

Прочитав Cargo.toml, модель узнала текущую версию проекта.

Игра Змейка на HTML5
Теперь к кодингу. Повышаем контекстное окно и запускаем Claude.
  1. OLLAMA_CONTEXT_LENGTH=80000
  2. ollama launch claude

Generate a fancy snake game in HTML5. Use interesting effects such as motion-blur and particles. Keep css/js files separately from html.20260426_120901.png

Три с половиной минуты потребовалось на создание html и css. И ещё столько же на js:

● I've created a fancy neon snake game with the following features:

  Visual Effects:
  • Motion blur trail - The snake leaves a fading trail effect
  • Particle explosions - Colorful particles burst when eating food or dying
  • Screen shake - Intense shake on collisions and food consumption
  • Glow effects - Neon glow around the snake head and pulsing food
  • CRT scanline overlay - Retro screen effect

Game Features:
  • Score tracking with high score (saved to localStorage)
  • Progressive speed increase as you eat
  • Smooth WASD/Arrow key controls
  • Pulsing food with highlight effect
  • Gradient coloring on snake body

Files created:
  • index.html - Main game page with start/game over screens
  • styles.css - Neon styling with glow effects and CRT overlay
  • game.js - Snake logic, particles, and collision handling

Controls: Arrow keys or WASD to move. The food pulses and has a glowing ring effect. When you eat food, particles explode and the screen shakes. Game over triggers a larger explosion.

✻ Cogitated for 7m 3s

Первая версия змейки

Первый вариант уже был рабочий, за исключением того, что змейка появлялась направленной саму в себя и нужно было быстро нажимать вниз или вверх, чтобы избежать проигрыша. И ещё еда для змейки перемещалась на новое место каждую секунду, так что было сложно угнаться. Зато логика, распадание съеденной еды на частицы, коллизии, тряска камеры, всё это работало отлично.

Исправление недочётов

Результат:
- Игра: snake-omnicoder/
- snake-omnicoder.zip

Экран завершения игры

Режим планирования
В режиме планирования в Claude я попросил сделать на Python пайплайн для обработки ссылок: валидация, вытягивание метаданных, отправка текста в TTS, генерирование небольшого текстового превью о чём заданная статья и т.п.

Анкета в режиме планирования

Omnicoder сгенерировал адекватный план с вот такими нодами:

  1. ┌─────────┐
  2. │   URL   │ ──→ validate & detect type (regex)
  3. └─────────┘
  4.     ↓
  5. ┌─────────────────────────┐
  6. │ Type Router             │
  7. │ ├─ YouTube URL → yt-dlp │
  8. │ └─ Article URL → fetch  │
  9. └─────────────────────────┘
  10.     ↓
  11. ┌────────────────────────────┐
  12. │ Node 1: Metadata Extractor │
  13. (yt-dlp metadata + content)
  14. │ ↓ saves to temp file       │
  15. └────────────────────────────┘
  16.     ↓
  17. ┌───────────────────────┐
  18. │ Node 2: Summarizer    │
  19. (Ollama: summary)     │
  20. │ ↓ reads temp file     │
  21. │ ↓ saves to temp file  │
  22. └───────────────────────┘
  23.     ↓
  24. ┌──────────────────────┐
  25. │ Node 3: Mindmap      │
  26. (Ollama: mindmap)    │
  27. │ ↓ reads temp file    │
  28. │ ↓ saves to temp file
  29. └──────────────────────┘
  30.     ↓
  31. ┌───────────────────────┐
  32. │ Node 4: TTS Generator │
  33. (Ollama: tts)         │
  34. │ ↓ reads temp file     │
  35. │ ↓ saves to temp file  │
  36. └───────────────────────┘
  37.     ↓
  38. ┌───────────────────────────┐
  39. │ Node 5: Markdown Renderer │
  40. (assembles all outputs)   │
  41. └───────────────────────────┘

Спланировал входные и выходные параметры каждой ноды. И структуру файлов:

  1. summarize/
  2. ├── summarize.py        # Main CLI entry point
  3. ├── nodes/              # Node implementations
  4. │   ├── base.py         # Abstract base class for nodes
  5. │   ├── router.py       # URL type detection & routing
  6. │   ├── metadata.py     # yt-dlp extraction
  7. │   ├── summarizer.py   # Ollama summary
  8. │   ├── mindmap.py      # Ollama mindmap
  9. │   ├── tts.py          # TTS
  10. │   └── renderer.py     # Markdown assembly
  11. └── requirements.txt    # Dependencies

Весь план: now-we-need-to-velvet-creek.md

Затем 10 минут всё это дело ворочал. Результат содержал одну ошибку, да и то, не в Python коде, а в регулярном выражении для вытягивания id видео с ютуба он не обозначил группу в скобках, хотя использовал её далее в коде.

  1. YOUTUBE_PATTERNS = [
  2.     r'https?://www\.youtube\.com/watch\?v=[\w_-]+',
  3.     r'https?://youtu\.be/[\w_-]+',
  4.     r'https?://m\.youtube\.com/watch\?v=[\w_-]+',
  5. ]
  6.  
  7. for pattern in self.YOUTUBE_PATTERNS:
  8.     match = re.search(pattern, url)
  9.     if match:
  10.         if 'youtu.be/' in url:
  11.             return url.split('youtu.be/')[1].split('?')[0].split('/')[0]
  12.         return match.group(1) if match.group(1) else match.group(0).split('v=')[1].split('&')[0]

И ещё в Ollama-нодах прописал дефолтным не Gemma4, а другую модель. Всё же результат очень достойный, учитывая, что весь этот код написан с первой итерации.

Вот готовое приложение в работе. За summary и mindmap отвечала локальная Gemma 4.
Результат

Mindmap


Добавление функционала в Java проект
Проверим работу с Java на примере добавления нового FFmpeg параметра в https://github.com/aNNiMON/effybot

Add audio noise reduction parameter (afftdn) with noise reduction -40, -20, -10, -5, -2 dB.
OmniCoder изучил проект, разобрался с организацией существующих параметров и сгенерировал готовый класс:
  1. package com.annimon.effybot.parameters;
  2.  
  3. import com.annimon.effybot.commands.ffmpeg.Visitor;
  4.  
  5. import java.util.List;
  6.  
  7. public class AudioNoiseReduction extends StringParameter {
  8.     public static final String ID = "anoreduce";
  9.     private static final List<String> VALUES = List.of(
  10.             "", "5", "12", "20", "30", "40"
  11.     );
  12.  
  13.     public AudioNoiseReduction() {
  14.         super(ID, "🔈 Noise Reduction", VALUES, "");
  15.     }
  16.  
  17.     @Override
  18.     public String describeValue(String value) {
  19.         if (value.isEmpty()) {
  20.             return "NONE";
  21.         } else {
  22.             return super.describeValue(value);
  23.         }
  24.     }
  25.  
  26.     @Override
  27.     public int defaultColumnsCount() {
  28.         return 4;
  29.     }
  30.  
  31.     @Override
  32.     public <I> void accept(Visitor<I> visitor, I input) {
  33.         visitor.visit(this, input);
  34.     }
  35. }

Затем добавил его обработку в интерфейсе Visitor
  1. intterface Visitor {
  2.     // ...
  3.     void visit(AudioNoiseReduction p, I input);
  4. }
и его реализации FFmpegCommandBuilder
  1. @Override
  2. public void visit(AudioNoiseReduction p, MediaSession input) {
  3.     if (discardAudio) return;
  4.     if (p.getValue().isEmpty()) return
  5.     audioFilters.add("afftdn=nr=" + p.getValue());
  6. }

Так же добавил создание экземпляра AudioNoiseReduction в AudioResolver, где создаются все параметры аудио.

20260512_224355.png

Задача хоть и не очень сложная, но модель однозначно справилась с первой попытки, затратив порядка 7 минут на всё.

Заключение
Моделью я очень доволен. Она сравнительно компактная, имеет приемлемую скорость. Для повседневных вопросов, как то сделать краткую выжимку текста, модель не очень подойдёт. Зато она отлично работает с тулами и с разными языками программирования.

Если знаете ещё какие-то интересные модельки, делитесь в комментариях.

English version
  • +2
  • views 39