Skip to content

Add logging, response-language enforcement, and parallel Operator requests (v10.2.0)#4

Merged
techbuzzz merged 9 commits into
mainfrom
develop
Jun 24, 2026
Merged

Add logging, response-language enforcement, and parallel Operator requests (v10.2.0)#4
techbuzzz merged 9 commits into
mainfrom
develop

Conversation

@techbuzzz

Copy link
Copy Markdown
Owner

Pull Request

Description

Bumps Delibera to v10.2.0 with three features requested by NuGet consumers:

  1. Microsoft.Extensions.Logging support — inject your own ILogger / ILoggerFactory and every debate event (Chairman opening, Knowledge Keeper queries, compression, Operator interactions, participant responses, errors) is forwarded to the host's logging pipeline, in addition to the in-memory ExecutionLog collection and the OnLog/OnError events.

    • New APIs: ICouncilBuilder.WithLogger(ILogger?), ICouncilExecutor.Logger, AddDelibera(services, IConfiguration, ILoggerFactory, string?).
    • ExecutionLog events flow to the logger via ExecutionLogSink.Emit(...) with a structured EventId(Source); errors use ILogger.LogError(ex, ...).
    • New DebateExecutionOptions record bundles the logger (plus response-language + parallelism) threaded through strategies via a new IDebateStrategyWithOptions interface (default method on IDebateStrategy keeps custom strategies working unchanged).
  2. Performance — parallel Operator requests[[OPERATOR: …]] tasks delegated by participants within a round now run concurrently via Parallel.ForEachAsync, bounded by MaxDegreeOfParallelism (0 = unbounded, default). All Delibera-shipped strategies (StandardDebate, CritiqueDebate, ConsensusDebate) opt in via the new ExecuteAsync(..., DebateExecutionOptions, ...) overload.

    • New APIs: ICouncilBuilder.WithMaxDegreeOfParallelism(int), CouncilOptions.MaxDegreeOfParallelism.
  3. Response-language enforcement — force every model (participants, Chairman, Knowledge Keeper, Operator) to answer in a specific language, regardless of the prompt or retrieved RAG context. Delibera injects a strict directive into every system prompt: "You MUST answer exclusively in {language}. Never use any other language…".

    • New APIs: ICouncilBuilder.WithResponseLanguage(string?), CouncilOptions.ResponseLanguage.

Breaking change

  • Renamed the LogLevel enum (in Delibera.Core.Models) to ExecutionLogLevel to avoid the name clash with Microsoft.Extensions.Logging.LogLevel, which is now referenced throughout the framework. Consumers that referenced LogLevel.Info etc. directly should switch to ExecutionLogLevel.Info. Added ExecutionLog.ToMicrosoftLogLevel() to bridge the two worlds. This is the only source-breaking change; the legacy IDebateStrategy.ExecuteAsync(...) overload is preserved via a default method so custom strategies keep working.

Configuration (appsettings.json)

{
  "Delibera": {
    "ResponseLanguage": "Russian",
    "MaxDegreeOfParallelism": 0
  }
}

README.md, src/Delibera.Core/README.md, and CHANGELOG.md are updated with full examples for each new feature. NuGet package metadata bumped to 10.2.0 with updated release notes.

Related Issues

N/A — requested directly by maintainers.

Type of Change

  • 🐛 Bug fix (non-breaking change that fixes an issue)
  • ✨ New feature (non-breaking change that adds functionality)
  • 💥 Breaking change (fix or feature that changes existing behaviour)
  • 📚 Documentation update
  • 🧹 Refactor / chore

Checklist

  • My code follows the project's coding standards (see CONTRIBUTING.md)
  • The solution builds with 0 errors and 0 warnings (dotnet build --configuration Release)
  • I have added/updated XML documentation for public APIs
  • I have updated relevant documentation (README.md, QuickStart.md)
  • I have tested my changes (examples run as expected)

Additional Notes

  • Breaking change is limited to the enum rename (LogLevelExecutionLogLevel). All other additions are additive and backward compatible: the legacy IDebateStrategy.ExecuteAsync(...) overload delegates to the new one via a default interface method, so existing custom strategies continue to work without recompilation.
  • The PR groups 7 commits that were already on develop; this is the cumulative diff from main to develop. Reviewers should focus on the latest commit (0e37696 Add logging, language enforcement, and parallel Operator) for the v10.2.0 changes.
  • Verified: dotnet build --configuration Release → 0 errors, 0 warnings; dotnet test --configuration Release → 20/20 passed.

techbuzzz and others added 7 commits June 16, 2026 10:31
… C# 15 (#1)

* feat: add Operator (MCP tools) micro-agent role

Introduce a new Operator role — a lightweight micro-agent that connects the
council to MCP (Model Context Protocol) servers and exposes their tools
(web search, filesystem, Notion, PostgreSQL, debate history, etc.) to debate
participants.

- Participants delegate tasks at any moment via the [[OPERATOR: task]] marker
- Operator uses its own cheaper LLM to plan tool calls, execute MCP tools and
  interpret results, optionally reusing the council's compression strategy
- Wired through all debate strategies (Standard/Critique/Consensus),
  CouncilExecutor, CouncilBuilder and DI options (Delibera:Operator)
- DI-initializable; supports stdio and HTTP MCP transports
- Per-round Operator interactions rendered in the final Markdown report
- Adds ModelContextProtocol package, console --operator flag, example & docs

* feat: upgrade to .NET 10 / C# 15, high-perf optimizations & MCP tools example

- Bump LangVersion to preview (C# 15) in both projects
- Update Microsoft.SourceLink.GitHub to 10.0.300 (other deps already at latest .NET 10 versions)
- Perf: SIMD-vectorized CosineSimilarity (ReadOnlySpan<float> + Vector<float>)
- Perf: TokenCounter ReadOnlySpan<char> overload (alloc-free word counting)
- Perf: CompressionCache.ComputeKey uses ArrayPool<T> + stackalloc SHA-256
- Add OperatorMcpToolsExample (browser via @playwright/mcp, Marp presentations) + --operator-mcp flag
- Fix nullable warning in Program.cs
- Add Russian docs: docs/NET10-Upgrade-RU.md

* docs: Add English version of .NET 10 upgrade documentation

* docs: Update README and QuickStart with Operator role documentation

---------

Co-authored-by: techbuzzz <victor.buzin@users.noreply.github.com>
Co-authored-by: Delibera Agent <agent@delibera.local>
…tor) [v10.1.1] (#2)

Add first-class interop with the standard Microsoft.Extensions.AI v10.7.0
abstractions while preserving the existing public API (additive only).

- Delibera.Core: add Microsoft.Extensions.AI 10.7.0; bump 10.1.0 -> 10.1.1
- ChatClientLLMProvider: ILLMProvider implemented over IChatClient (+ streaming)
- EmbeddingGeneratorProvider: IEmbeddingProvider over IEmbeddingGenerator
- MicrosoftAIExtensions: AsLLMProvider/AsEmbeddingProvider/AsChatClient bridges
  + WithMiddleware (logging + function invocation)
- ILLMProvider: additive default ChatStreamAsync (non-breaking)
- OllamaProvider: expose native AsChatClient()/AsEmbeddingGenerator()
- ProviderFactory.CreateFromChatClient + DI AddDeliberaChatClient/EmbeddingGenerator
- ConsoleApp: --msai example
- tests: new Delibera.Core.Tests (20 tests, fakes; no live network)
- docs: README/README-RU/QuickStart/CHANGELOG + solution file
Refactored expression-bodied members to full block-bodied methods for improved consistency and maintainability. Updated method/property implementations, reordered some fields, and enhanced property clarity. Restored or moved obsolete/compatibility methods. Improved disposal patterns in factories and clarified null/empty handling. No changes to core business logic; focus is on code style and API consistency.
Major overhaul of README.md for clarity and completeness:
- Expanded intro, features, and quick start with prerequisites
- Improved code samples and formatting throughout
- Added detailed sections for DI, Microsoft.Extensions.AI interop, context compression, RAG, Operator, and output files
- Provided a more comprehensive appsettings.json example
- Updated NuGet dependencies table and all repo links
- README.md no longer included in NuGet package in .csproj
- Numerous minor language, formatting, and consistency fixes
Added icon.png as the NuGet package icon via <PackageIcon> and ensured README.md is packed with the package for better documentation.
Introduce top-level crash guard and color-coded log streaming in Program.cs. Add OnLog and OnError events to CouncilExecutor and ICouncilExecutor for real-time observability. Refactor error handling to use new events. Update AskAllAsync to disambiguate responses by role and display name. Improve console output formatting and banner.
- Integrate Microsoft.Extensions.Logging throughout debate pipeline; add WithLogger, DI logger injection, and ICouncilExecutor.Logger
- Enforce response language via WithResponseLanguage and config; inject strict directive into all prompts
- Support parallel Operator requests per round, bounded by MaxDegreeOfParallelism (builder/config)
- Introduce DebateExecutionOptions to bundle logger, language, and parallelism for strategies
- Rename LogLevel to ExecutionLogLevel to avoid naming clash; add mapping to Microsoft log levels
- Update DI, configuration, README, and CHANGELOG for new features
- Minor refactoring and improved comments throughout
@techbuzzz techbuzzz self-assigned this Jun 24, 2026
…sertions

- Restore DebateScenario, StandardDebate, CritiqueDebate, ConsensusDebate and CouncilBuilder
  to the pre-merge (v10.2.0) content; the merge commit had duplicated code blocks and garbled
  CollectResponsesAsync, breaking the build.
- Re-add the FluentAssertions package reference to the test project (lost during the merge),
  required by the YandexGptProvider tests brought in from main.
- Verified: dotnet build -> 0 errors, 0 warnings; dotnet test -> 31/31 passed.
@techbuzzz techbuzzz merged commit 7841250 into main Jun 24, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant