Это руководство за несколько минут проведёт вас через ваше первое обсуждение с помощью ИИ в Delibera. По его завершении у вас будут запущенные локально многомодельные дебаты и Markdown-стенограмма на диске.
- .NET 10 SDK (≥ 10.0.301) — проект нацелен на
net10.0и собирается сLangVersion=previewдля включения возможностей C# 15. См. NET10-Upgrade-RU.md для полных заметок о миграции. - Запущенный экземпляр Ollama — либо:
- Локально: установите Ollama и запустите
ollama serve, либо - Cloud: зарегистрируйтесь в Ollama Cloud и получите API-ключ (без установки, без GPU).
- Локально: установите Ollama и запустите
- Опционально — для роли Operator: Node.js + npx для запуска MCP-серверов
(например,
@playwright/mcp,@marp-team/marp-cli). См. раздел 7.
Выберите один из наборов моделей ниже в зависимости от вашего железа. Набор 🟡 «Стандартный» рекомендуется для большинства случаев.
ollama pull llama3.2:1b
ollama pull qwen2.5:1.5b
ollama pull nomic-embed-textollama pull llama3.2:3b
ollama pull qwen2.5:7b
ollama pull nomic-embed-textollama pull llama3.1:8b
ollama pull qwen2.5:14b
ollama pull mistral:7b
ollama pull nomic-embed-textℹ️ Ollama Cloud использует те же имена моделей — локальная загрузка не нужна, только API-ключ.
dotnet add package Delibera.CoreИли клонируйте репозиторий и сошлитесь на Delibera.Core напрямую:
git clone https://github.com/delibera/Delibera.git
cd DeliberaСоздайте консольный проект и вставьте следующее:
// Program.cs
using Delibera.Core.Council;
using Delibera.Core.Providers;
using var factory = new ProviderFactory();
var ollama = factory.CreateOllama("http://localhost:11434");
var result = await new CouncilBuilder()
.AddMember("llama3.2:3b", ollama, "Analyst")
.AddMember("qwen2.5:7b", ollama, "Strategist")
.SetChairman(Chairman.CreateStandard("qwen2.5:7b", ollama))
.WithStandardDebate()
.WithSystemPrompt("You are a software architecture expert.")
.WithUserPrompt("Microservices vs Monolith for a 5-person startup?")
.WithMaxRounds(4)
.SaveResultTo("./deliberation.md")
.Build()
.ExecuteAsync();
Console.WriteLine(result.FinalVerdict);Запустите:
dotnet runDelibera проведёт структурированные многораундовые дебаты и запишет полную стенограмму и вердикт
председателя в файл deliberation.md.
☁️ Используете Ollama Cloud? Замените endpoint на
https://api.ollama.comи передайте API-ключ:factory.CreateOllama("https://api.ollama.com", "YOUR_API_KEY").
using Delibera.Core.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
var services = new ServiceCollection();
// Привязывает секцию "Delibera" из appsettings.json
services.AddDelibera(configuration, "Delibera");
var provider = services.BuildServiceProvider();
var builder = provider.GetRequiredService<ICouncilBuilder>();appsettings.json:
{
"Delibera": {
"Strategy": "Standard",
"MaxRounds": 4,
"Temperature": 0.7,
"SystemPrompt": "You are a knowledgeable AI expert participating in a council debate.",
"Providers": {
"DefaultType": "Ollama",
"DefaultEndpoint": "http://localhost:11434",
"ApiKey": "",
"EmbeddingModel": "nomic-embed-text"
},
"Compression": {
"Enabled": true,
"Strategy": "Hybrid",
"TargetRatio": 0.5,
"EnableCache": true,
"MaxCacheEntries": 256
},
"Rag": {
"Enabled": false,
"ProviderType": "Qdrant",
"Host": "localhost",
"Port": 6334,
"CollectionName": "council_knowledge",
"ConnectionString": null
},
"Output": {
"Directory": "./debate_results",
"SeparateFiles": true,
"FilePrefix": null
}
}
}Для Ollama Cloud задайте
Providers:DefaultEndpointравнымhttps://api.ollama.comиProviders:ApiKeyравным вашему ключу.
using Delibera.Core.Compression;
using Delibera.Core.Providers.LLM;
var ollama = new OllamaProvider("http://localhost:11434");
var embeddings = new OllamaEmbeddingProvider(ollama, "nomic-embed-text");
var result = await new CouncilBuilder()
.AddMember("llama3.2:3b", ollama, "Analyst")
.AddMember("qwen2.5:7b", ollama, "Strategist")
.SetChairman(Chairman.CreateStandard("qwen2.5:7b", ollama))
.WithCompression(CompressionStrategy.Hybrid,
llmProvider: ollama,
modelName: "llama3.2:3b",
embeddingProvider: embeddings)
.WithCompressionCache()
.WithUserPrompt("Analyze our architecture options...")
.WithMaxRounds(4)
.Build()
.ExecuteAsync();
Console.WriteLine(result.TokenStats?.ToSummary());Сжатие экономит примерно 30–70% токенов без потери смысла контекста дебатов.
docker run -d -p 6333:6333 -p 6334:6334 qdrant/qdrantusing Delibera.Core.Council;
using Delibera.Core.Models;
using Delibera.Core.Providers.LLM;
using Delibera.Core.Providers.RAG;
var ollama = new OllamaProvider("http://localhost:11434");
var embeddings = new OllamaEmbeddingProvider(ollama, "nomic-embed-text");
var ragFactory = new RagProviderFactory();
var rag = ragFactory.CreateQdrant(embeddings, "localhost", 6334);
var kkMember = new CouncilMember("llama3.2:3b", ollama, "Knowledge Keeper");
var keeper = new KnowledgeKeeper(rag, kkMember, "architecture_kb");
await keeper.IndexFileAsync("./docs/architecture.md");
var result = await new CouncilBuilder()
.AddMember("llama3.2:3b", ollama, "Backend Expert")
.AddMember("qwen2.5:7b", ollama, "DevOps Expert")
.SetChairman(Chairman.CreateStandard("qwen2.5:7b", ollama))
.WithKnowledgeKeeper(keeper)
.WithStandardDebate()
.WithUserPrompt("Our startup has 4 developers. Microservices or monolith?")
.WithMaxRounds(4)
.Build()
.ExecuteAsync();💡 Замените
CreateQdrant(...)наCreatePgVector(embeddings, connectionString), чтобы использовать PostgreSQL/pgvector.
Operator — это микроагент, который соединяет совет с внешними инструментами через серверы
MCP (Model Context Protocol) — веб-навигация, доступ к
файловой системе, генерация Marp-презентаций и многое другое. Участники делегируют задачу в любой
момент, написав маркер [[OPERATOR: ...]], и Operator запускает нужные инструменты и возвращает
результат в следующий раунд.
Серверы из примеров ниже запускаются через npx, поэтому вам нужны Node.js + npx:
# Проверьте, что Node.js / npx доступны
node --version
npx --version
# Для сервера браузера один раз установите движки Playwright:
npx playwright installТакже нужна запущенная Ollama с дешёвой моделью для Operator (например, llama3.2) — Operator
использует свою собственную модель, отдельную от участников совета.
Каждый MCP-сервер описывается через McpServerConfig. Используйте Stdio(...) для локальных
процессов или Http(...) для удалённых серверов:
using Delibera.Core.Models;
var servers = new[]
{
// 🌐 Браузер — навигация, чтение страниц, клики, скриншоты
McpServerConfig.Stdio(
name: "browser",
command: "npx",
arguments: new[] { "-y", "@playwright/mcp@latest", "--headless" }),
// 🎯 Marp — генерация презентаций HTML/PDF/PPTX из Markdown
McpServerConfig.Stdio(
name: "marp",
command: "npx",
arguments: new[] { "-y", "@marp-team/marp-cli", "--server", "./out" }),
// …или удалённый HTTP/SSE MCP-сервер с заголовками авторизации:
// McpServerConfig.Http(
// name: "remote",
// endpoint: "https://my-mcp-host.example.com/mcp",
// additionalHeaders: new Dictionary<string, string> { ["Authorization"] = "Bearer <token>" }),
};| Сервер | Транспорт | Команда запуска | Что даёт |
|---|---|---|---|
🌐 browser |
stdio | npx -y @playwright/mcp@latest --headless |
Навигация по сайтам, чтение страниц, клики, скриншоты |
🎯 marp |
stdio | npx -y @marp-team/marp-cli --server <dir> |
Генерация презентаций (HTML/PDF/PPTX) из Markdown |
using Delibera.Core.Council;
using Delibera.Core.Interfaces;
using Delibera.Core.Models;
using Delibera.Core.Providers.LLM;
using Delibera.Core.Providers.Mcp;
var ollama = new OllamaProvider("http://localhost:11434");
await using var @operator = new Operator(
new CouncilMember("llama3.2", ollama, "Operator"),
new IMcpClient[] { new McpClientAdapter(servers[0]), new McpClientAdapter(servers[1]) });
await @operator.InitializeAsync(); // подключается к серверам и обнаруживает инструменты
// 1) Открыть сайт и пересказать его
var browse = await @operator.ExecuteTaskAsync(
"Open https://modelcontextprotocol.io and briefly summarize what MCP is.");
Console.WriteLine(browse.FinalAnswer);
// 2) Сгенерировать презентацию из 3 слайдов и сохранить как deck.html
var deck = await @operator.ExecuteTaskAsync(
"Generate a 3-slide Marp presentation about .NET 10 and save it as deck.html.");
Console.WriteLine(deck.FinalAnswer);
await usingосвобождает MCP-клиентов черезValueTask DisposeAsyncу Operator.
Добавьте Operator в совет с помощью удобной перегрузки WithOperator(...). Участники затем
делегируют работу через маркер [[OPERATOR: ...]], и их результаты внедряются в последующие раунды:
var result = await new CouncilBuilder()
.AddMember("llama3.2:3b", ollama, "Researcher")
.AddMember("qwen2.5:7b", ollama, "Reviewer")
.SetChairman(Chairman.CreateStandard("qwen2.5:7b", ollama))
// Operator использует свою более дешёвую модель; reuseCompression разделяет компрессор совета
.WithOperator("llama3.2", ollama, servers, reuseCompression: true)
.WithStandardDebate()
.WithSystemPrompt(
"You may delegate research or presentation tasks to the Operator by writing " +
"[[OPERATOR: <task>]] in your message.")
.WithUserPrompt("Research the latest .NET 10 features and prepare a short summary deck.")
.WithMaxRounds(4)
.SaveResultTo("./deliberation.md")
.Build()
.ExecuteAsync();
Console.WriteLine(result.FinalVerdict);Сообщение участника может выглядеть так:
I think we should highlight the runtime improvements.
[[OPERATOR: open https://learn.microsoft.com/dotnet/core/whats-new/dotnet-10 and list the top 5 features]]
Все взаимодействия с Operator записываются по раундам и отображаются в финальном Markdown-отчёте в блоке 🛠️ Operator Interactions.
{
"Delibera": {
"Operator": {
"Enabled": true,
"ModelName": "llama3.2",
"ReuseCompression": true,
"McpServers": [
{
"Name": "browser",
"Transport": "Stdio",
"Command": "npx",
"Arguments": [ "-y", "@playwright/mcp@latest", "--headless" ]
},
{
"Name": "marp",
"Transport": "Stdio",
"Command": "npx",
"Arguments": [ "-y", "@marp-team/marp-cli", "--server", "./out" ]
}
]
}
}
}
▶️ Запустите полное демо:dotnet run --project src/Delibera.ConsoleApp -- --operator-mcp. См.OperatorMcpToolsExample.csи NET10-Upgrade-RU.md для деталей.
var (resultPath, statsPath, logsPath) = await result.SaveAllAsync("./output");
// → debate_<timestamp>_result.md
// → debate_<timestamp>_statistics.md
// → debate_<timestamp>_logs.mdКаждый файл — это обычный Markdown, идеальный для коммита в git, публикации в чат-инструменты или передачи обратно в другую LLM.
В репозитории есть запускаемое демо в
src/Delibera.ConsoleApp/, которое задействует каждую возможность:
| Пример | Команда | Что демонстрирует |
|---|---|---|
| Быстрый старт | dotnet run |
Дебаты по умолчанию из appsettings.json |
| Dependency injection | dotnet run -- --di |
AddDelibera() + резолвинг ICouncilBuilder |
| Раздельный вывод | dotnet run -- --separate-files |
SaveAllAsync() — три Markdown-файла |
| Сжатие контекста | dotnet run -- --compression |
Все 4 стратегии + кэш + статистика токенов |
| Несколько провайдеров | dotnet run -- --multiprovider |
Cloud + локальные модели в одном совете |
| RAG (Qdrant) | dotnet run -- --rag |
Индексирование документов + Knowledge Keeper |
| RAG (pgvector) | dotnet run -- --pgvector |
Векторный поиск на базе PostgreSQL |
| Operator (основы) | dotnet run -- --operator |
Роль Operator с MCP-инструментами |
| Operator + MCP | dotnet run -- --operator-mcp |
🆕 MCP-серверы browser + Marp в совете |
| Microsoft.Extensions.AI | dotnet run -- --msai |
🆕 IChatClient/IEmbeddingGenerator + middleware |
- Прочитайте README для полного обзора возможностей, архитектуры и паттернов проектирования.
- См. CONTRIBUTING.md, если хотите внести вклад.
⚖️ Delibera — Продуманные решения с помощью ИИ
