Intentum: .NET’te Intent-Driven Development ve Niyet Tabanlı Karar Verme

Giriş

Deterministik olmayan kullanıcı akışları, tekrarlı denemeler (login, ödeme) veya AI tabanlı kararlar söz konusu olduğunda “ne oldu?” sorusundan çok “sistem ne yapmaya çalışıyor?” sorusu öne çıkar.

Intentum, .NET ekosisteminde bu ihtiyacı karşılayan açık kaynak bir kütüphanedir: davranış olaylarını toplar, niyet (intent) ve güven (confidence) çıkarır, policy (politika) kurallarıyla Allow, Observe, Warn, Block gibi kararlar üretir.

Bu yazıda Intentum’un ne olduğunu, hangi mimari problemi çözdüğünü, nasıl kurulup kullanılacağını ve ne zaman tercih edilmemesi gerektiğini teknik detay ve kod örnekleriyle ele alıyorum.

Intentum Nedir?

Intentum, uygulamadaki kullanıcı ve davranış olaylarını analiz edip niyet tahmin eden ve bu niyete göre otomatik karar (izin, uyarı, engel vb.) almanızı sağlayan bir kütüphanedir.

Klasik BDD (Given/When/Then) tarzı sabit senaryo adımları yerine üç adımlı bir akış kullanır:

Observe (gözlemle) → Infer (çıkar) → Decide (karar ver).

Gözlemle: Olayları BehaviorSpace içine Observe(actor, action) ile kaydedersiniz.
Çıkar: Bir intent modeli (ör. LlmIntentModel) bu davranışı bir Intent ve güven seviyesine (High, Medium, Low, Certain) dönüştürür.
Karar ver: IntentPolicy kuralları ile intent.Decide(policy) çağrısı sonucu Allow, Observe, Warn, Block, Escalate, RequireAuth veya RateLimit kararı alırsınız.

Yani sabit “then X should be true” yerine, davranışa göre çıkarılan intent ve policy sonucu ile çalışırsınız.

Hangi Problemi Çözer?

Intentum, davranışın tam deterministik olmayan sistemler için tasarlanmıştır.

Çözdüğü problem: senaryo bazlı testlerin kırılganlığı ve “ne oldu?” odaklı karar verme yerine “sistem ne yapmaya çalışıyor?” sorusuna cevap verebilmek.

Aşağıdaki tabloda hangi projelerde kullanılması mantıklı, hangilerinde gereksiz olduğu özetleniyor.

Kullanılması mantıklıGereksiz olduğu durumlar
Fraud / abuse tespitiTam deterministik, sabit adımlı akışlar
Belirsiz kullanıcı akışları, adaptive workflowKüçük script’ler, tek seferlik araçlar
AI/LLM ile karar, tekrarlı login/ödeme retryHer adımın zorunlu olduğu katı akışlar

Temel Akış ve Mimari

Veri akışı:

BehaviorSpace (olaylar) → IIntentModel.Infer(space)Intent (güven, sinyaller) → IntentPolicyPolicyDecision.

Çekirdek tipler:

  • BehaviorSpace: Observe(actor, action) ile olayları toplar; ToVector() ile behavior vektörü üretir.
  • IIntentModel: LlmIntentModel (embedding + similarity), RuleBasedIntentModel (sadece kurallar), ChainedIntentModel (önce kural, düşük güvende LLM fallback).
  • Intent: Confidence (Level, Score), Signals (ağırlıklı davranışlar), opsiyonel Reasoning.
  • IntentPolicy: Sıralı PolicyRule listesi; ilk eşleşen kural kazanır. IntentPolicyBuilder ile fluent tanım yapılabilir.

Kurulum ve Yapılandırma

.NET SDK 10.x (veya projenin hedeflediği sürüm) yeterlidir.

Çekirdek paketler:

dotnet add package Intentum.Core
dotnet add package Intentum.Runtime
dotnet add package Intentum.AI

Gerçek embedding API kullanacaksanız bir sağlayıcı paketi ekleyin (ör. Intentum.AI.OpenAI). Sağlayıcı eklemezseniz yerel çalıştırma ve test için MockEmbeddingProvider kullanılır; API anahtarı gerekmez.

Minimal konsol örneği

using Intentum.AI.Mock;
using Intentum.AI.Models;
using Intentum.AI.Similarity;
using Intentum.Core;
using Intentum.Core.Behavior;
using Intentum.Runtime.Policy;

var space = new BehaviorSpace()
    .Observe("user", "login")
    .Observe("user", "retry")
    .Observe("user", "submit");

var model = new LlmIntentModel(
    new MockEmbeddingProvider(),
    new SimpleAverageSimilarityEngine());
var intent = model.Infer(space);

var policy = new IntentPolicy()
    .AddRule(new PolicyRule("AllowHigh",
        i => i.Confidence.Level is "High" or "Certain",
        PolicyDecision.Allow))
    .AddRule(new PolicyRule("ObserveMedium",
        i => i.Confidence.Level == "Medium",
        PolicyDecision.Observe));

var decision = intent.Decide(policy);
Console.WriteLine($"Güven: {intent.Confidence.Level}, Karar: {decision}");

ASP.NET Core DI

Program.cs içinde servis kaydı ve (isteğe bağlı) davranış gözlem middleware’i:

using Intentum.AspNetCore;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddIntentum();
// Gerçek sağlayıcı için: builder.Services.AddIntentumOpenAI(OpenAIOptions.FromEnvironment());

var app = builder.Build();
app.UseIntentumBehaviorObservation(new BehaviorObservationOptions
{
    Enabled = true,
    GetActor = ctx => "http",
    GetAction = ctx => $"{ctx.Request.Method}_{ctx.Request.Path.Value?.Replace("/", "_")}"
});

Kod Örnekleri

Basit intent ve policy

Yukarıdaki minimal örnek zaten basit intent akışını gösteriyor. Fluent policy builder ile Block, Escalate, RequireAuth, Allow zinciri:

var policy = new IntentPolicyBuilder()
    .Block("ExcessiveRetry",
        i => i.Signals.Count(s => s.Description.Contains("retry", StringComparison.OrdinalIgnoreCase)) >= 3)
    .Escalate("LowConfidence", i => i.Confidence.Level == "Low")
    .RequireAuth("SensitiveAction", i => i.Signals.Any(s => s.Description.Contains("sensitive")))
    .Allow("HighConfidence", i => i.Confidence.Level is "High" or "Certain")
    .Build();
var decision = intent.Decide(policy);

Policy ile davranış doğrulama (retry eşiği)

Intentum’da “validation” klasik anlamda değil; policy kuralları ile davranışın kabul edilirliği kontrol edilir. Örneğin aşırı retry’da Block:

var space = new BehaviorSpace()
    .Observe("user", "login")
    .Observe("user", "retry")
    .Observe("user", "retry")
    .Observe("user", "retry");

var intent = model.Infer(space);
var policy = new IntentPolicy()
    .AddRule(new PolicyRule("ExcessiveRetryBlock",
        i => i.Signals.Count(s => s.Description.Contains("retry", StringComparison.OrdinalIgnoreCase)) >= 3,
        PolicyDecision.Block))
    .AddRule(new PolicyRule("AllowHigh", i => i.Confidence.Level is "High" or "Certain", PolicyDecision.Allow))
    .AddRule(new PolicyRule("ObserveMedium", i => i.Confidence.Level == "Medium", PolicyDecision.Observe));

var decision = intent.Decide(policy);

Kural sırasının önemi

Policy kuralları ekleme sırasına göre değerlendirilir; ilk eşleşen kural kazanır. Block kurallarını Allow’dan önce ekleyin ki şüpheli davranışlar engellensin, normal akışlar ise yalnızca engellenmediyse Allow alsın.

Cross-cutting: Logging ve Observability

Intentum.Logging ile Serilog entegrasyonu,
Intentum.Observability ile OpenTelemetry metrikleri.

Örnek: intent modelini metrik saran wrapper ile kullanmak ve karar sonrası metrik kaydı.

using Intentum.Observability;

var model = new ObservableIntentModel(
    new LlmIntentModel(embeddingProvider, new SimpleAverageSimilarityEngine()));
var intent = model.Infer(space);
var decision = intent.DecideWithMetrics(policy);

Intent geçmişi ve persistence

Intentum’da doğrudan “transaction” yok,

İstenirse IIntentHistoryRepository.SaveAsync ile intent ve kararı saklayabilirsiniz.
EF Core, Redis veya MongoDB paketleri ile persistence eklenir.

Web API endpoint (infer)

Controller’da IIntentModel ve policy inject edilip, gelen olay listesinden BehaviorSpace oluşturulur;

Infer ve Decide çağrılır:

[ApiController]
[Route("api/[controller]")]
public class IntentController : ControllerBase
{
    private readonly IIntentModel _model;
    private readonly IntentPolicy _policy;

    public IntentController(IIntentModel model, IntentPolicy policy)
    {
        _model = model;
        _policy = policy;
    }

    [HttpPost("infer")]
    public IActionResult Infer([FromBody] InferRequest request)
    {
        var space = new BehaviorSpace();
        foreach (var e in request.Events)
            space.Observe(e.Actor, e.Action);
        var intent = _model.Infer(space);
        var decision = intent.Decide(_policy);
        return Ok(new { intent.Confidence, intent.Signals, Decision = decision });
    }
}

public record InferRequest(List<EventDto> Events);
public record EventDto(string Actor, string Action);

Unit test (Intentum.Testing)

Test projesine Intentum.Testing ekleyip TestHelpers ve assertion extension’larını kullanın:

using Intentum.Testing;
using Intentum.Core.Behavior;
using Intentum.Runtime.Policy;

var model = TestHelpers.CreateDefaultModel();
var policy = TestHelpers.CreateDefaultPolicy();
var space = TestHelpers.CreateSimpleSpace();

var intent = model.Infer(space);
var decision = intent.Decide(policy);

BehaviorSpaceAssertions.ContainsEvent(space, "user", "login");
IntentAssertions.HasConfidenceLevel(intent, "High");
PolicyDecisionAssertions.IsOneOf(decision, PolicyDecision.Allow, PolicyDecision.Observe);

Clean Architecture’ta yerleşim

Domain katmanında BehaviorSpace, Intent, IntentPolicy kavramları (veya sadece referans);

Application’da IIntentModel ve Infer/Decide kullanımı;

Infrastructure’da embedding sağlayıcı (OpenAI, Mock vb.) ve isteğe bağlı persistence;

Web’de controller ve UseIntentumBehaviorObservation middleware.

Çekirdek Intentum paketleri (Core, Runtime, AI) Application veya Infrastructure’a referans verilir.

Performans ve Test

Mock: MockEmbeddingProvider ile API anahtarı olmadan yerel ve CI testleri deterministik çalışır.

Cache: MemoryEmbeddingCache veya RedisEmbeddingCache ile embedding çağrıları azaltılır.

Batch: BatchIntentModel ile birden fazla BehaviorSpace toplu işlenebilir.

Production’da gerçek sağlayıcı (OpenAI, Gemini, Mistral, Azure, Claude) kullanılır; ortam değişkenleri veya secret manager ile API anahtarları yönetilmelidir.

Ne Zaman Kullanılmamalı?

Tam deterministik mantık, her adımın zorunlu olduğu katı akışlar ve küçük/tek seferlik script’ler için Intentum gereksiz karmaşıklık getirir.

Trade-off: intent ve policy yaklaşımı esneklik ve belirsizliğe uygun; buna ihtiyaç yoksa basit kural veya doğrudan iş akışı tercih edilebilir.

Kapanış

Intentum, davranış → niyet → policy kararı zincirini .NET’te standartlaştıran bir kütüphanedir. Fraud tespiti, tekrarlı login/ödeme senaryoları veya AI destekli karar gerektiren projelerde değerlendirilebilir. Resmi doküman, örnekler ve manifesto ile derinleşmek için aşağıdaki kaynaklara bakılabilir.

Kaynak ve İleri Okuma

Mediator.Net

Mediator.Net ile .NET’te CQRS ve Pipeline Tabanlı Mesajlaşma

Giriş

Controller’ların onlarca servisi enjekte ettiği, iş kurallarının doğrudan handler çağrılarıyla dağıldığı bir codebase’de değişiklik yapmak hem testi zorlaştırır hem de mimariyi kırar. Mediator pattern, isteğin tek bir giriş noktasından geçmesini ve ilgili handler’a taşınmasını sağlayarak bu bağımlılığı azaltır. .NET ekosisteminde bu ihtiyacı karşılayan kütüphanelerden biri de Mediator.Net: komut (command), sorgu (request/response) ve olay (event) yayımını ayrı pipeline’lar üzerinden yönetir ve CQRS/clean architecture hedefleriyle uyumludur.

Bu yazı Mediator.Net’in ne olduğunu, hangi problemi çözdüğünü, MediatR ile farklarını ve uygulama içinde nasıl kullanılacağını adım adım ele alıyor.

Mediator.Net Nedir?

Mediator.Net, .NET için yazılmış, mediator pattern’i uygulayan ve CQRS (Command Query Responsibility Segregation) ile uyumlu bir mesajlaşma kütüphanesidir. İstekleri doğrudan handler sınıflarına göndermek yerine, tek bir IMediator aracı üzerinden gönderir; kütüphane mesaj tipine göre ilgili handler’ı bulur ve pipeline (boru hattı) üzerinden çalıştırır. Böylece uygulama katmanları birbirini tanımak zorunda kalmaz; clean architecture ve hexagonal mimaride kullanılabilir.

Üç temel mesaj tipi vardır:

  • ICommand (yanıt beklemeden çalıştırılan komut),
  • IRequest / IResponse (tek yanıt dönen sorgu) ve
  • IEvent (birden fazla handler’ın dinleyebildiği olay).

Ayrıca IAsyncEnumerable ile streaming yanıt desteği sunar. Devamını Oku

Regex, RegExp, Regular Expressions (Düzenli/Kurallı İfadeler) – Bölüm 1

Regex’e Giriş

Bugün birçok programcının ve hatta veri işleyen herkesin kurtarıcısı olan sayısal ve dizgesel içeriklerde belirli kurallara uyan bölümleri bulan ifadelerden yani Düzenli/Kurallı İfadelerden (Regex/RegExp/Regular Expressions) bahsedeceğiz.

Amerikalı matematikçi Stephen Cole Kleene tarafından 1950’li yıllarda tasarlanan bu kavram günümüzde oldukça yaygın olarak birçok işletim sistemi temelinde ve programlama dilinde entegre olarak gelmektedir.

Bir metin dizisi (string) içerisinde belirlediğimiz düzen/kurallar (pattern) ile eşleşenleri döndüren oluşumdur kısaca.

  • Metin dizisi (string) – Arama yapılacak metin
  • Düzen/kural (pattern) – Arama için kullanılacak kalıplar
  • Eşleşen – Metin içerisinde düzenlere uyan sonuçlar (tekil ya da grup olabilir)
Ufak bir hatırlatma
Düzenli ifadelere makale boyunca kısaca regex, arama yapılacak metine string, kurala da pattern diyeceğim. Yukarıda da dediğim gibi bir çok işletim sistemi ve programlama diline entegre edildiğinde kullanımı farklılık göstermektedir. Başlıca kullanım şekilleri PCRE, ECMAScript, Python, Golang diyebiliriz. Ben aktif olarak C tabanlı diller  (Perl, PHP, C++, C# vb.) kullandığım için PCRE (Perl Compatible Regular Expressions) ile makaleme devam edeceğim. Diğer diller için ufak tefek değişiklikler ile sorunsuz çalışacaktır.
Devamını Oku

C# Kodlama Standartları, Adlandırma Kuralları ve İpuçları

Giriş

Bugün C# ile programlama yapılırken uyulması gereken kodlama standartları ve adlandırma kurallarından bahsedeceğim. Gerek sosyal medyadan gerekse başka mecralardan öğrenci arkadaşlarımızdan gelen kodlara baktığımda kodlama standartlarına ve adlandırma kurallarına uyulmadığını hatta daha da vahim bir şekilde Türkçe karakterli adlandırmaların yapıldığını (C# derleyicisi için sorun teşkil etmez ama TR klavyeye sahip olmayan biri için sorun teşkil eder) görmekteyim. Bu sebepten Türkçe kaynak olarak bu konu hakkında fazla birşey olmadığından bu makaleyi yazma ihtiyacı duydum.

Microsoft .Net Framework yazılırken kullanılan standartlardan örnekler ile C# programlama dilinde herkesin bir bakışta anlayabileceği kod nasıl oluşturulur anlatmaya çalışalım.

Devamını Oku

QHotspot – pfSense için Captive Portal ve FreeRADIUS Yönetim Paneli

Bu makalemizde pfSense Açık Kaynak Firewall yazılımının Captive Portal yönetimini FreeRADIUS uzaktan kimlik doğrulama servisi kullanarak yönetmemizi sağlayan tarafımdan geliştirilmesi devam eden QHotspot projesini tanıtacağım.

Nedir pfSense ?

pfSense logo

pfSense projesi 2004 yılında m0n0wall isimli bir projeden Chris Buechler ve Scott Ullrich tarafından fork’lanarak başlamış ve 2006 yılında ilk sürümünü piyasaya sunmuş içerdiği packet-filtering yazılımı yüzünden “pf” önekini kullanan açık kaynak router firewall FreeBSD dağıtımıdır.

2014 yılında Electric Sheep Fencing LLC (ESF) tarafından satın alınan pfSense temmuz 2017 den beri Apache Lisansı 2.0 kapsamında lisanslanmıştır. 2004 yılından beri telif hakkı Rubicon Communications, LLC (Netgete) firmasındadır.

pfSense, güvenlik duvarı/yönlendirici olarak kullanılmak üzere fiziksel bir bilgisayara veya bir sanal makineye yüklenebilen, web tabanlı bir ara birim üzerinden yapılandırılabilen, güncellenebilen ve yönetmek için altta çalışan FreeBSD bilgisi gerektirmeyen genellikle güvenlik duvarı, yönlendirici, kablosuz erişim noktası (Hotspot), DHCP sunucusu, DNS sunucusu ve VPN çözümü olarak kullanılan son kullanıcı dostu bir yazılımdır. pfSense, Snort, Squid, SquidGuard vb. üçüncü taraf paketlerinin Paket Yöneticisi aracılığıyla yüklenmesini destekler. Devamını Oku

pfSense logo

pfSense 2.3.2 için Captive Portal ve Hotpsot Ghost Panel

Lütfen okuyun 1
Bu makale pfSense nin sürüm güncellemeleri sebebiyle bazı sistemlerde çalışmaz hale gelmektedir. MySQL, freeRADIUS, PHP ve gerekli paketlerin kurulumu ve Ghost panelin daha kullanıcı dostu bir arabirimle değiştirilmesini kapsayan bir proje yazmaya başladım. Siz değerli ziyaretçilerim buradan QHotspot projesine erişebilir, bilginiz var ise projeye katkıda bulunabilirsiniz. Şimdiden teşekkürler.

Lütfen okuyun 2
QHotspot projesi iş yoğunluğunda yavaş ilerlediği için mevcut ghost panelinde çalışmasını sağlamak adına projeye ghost adında bir branch oluşturdum. Sitede verilen yönergeleri takip etmeniz durumunda size sadece captive portal a index.html hata.html ve gerekli dosyaları eklemeniz kalıyor. Gerekli bilgilere buradan ulaşabilirsiniz. Kurulum Videosu: https://youtu.be/VHfOwj6Ljn0

Lütfen okuyun 3
Aşağıdaki bilgiler geçerliliğini yitirmiş olabilir.

Captive Portal Karşılama Ekranı
Captive portal karşılama ekranını buradan indirebilirsiniz.

Merhabalar,

Bildiğiniz üzere pfSense 2.3 sürümü ile birlikte bir çok değişiklik meydana geldi. Bu değişiklikler ile çalışmakta olan captive portal TC Kimlik doğrulama sistemi ve Ghost Radius sistemi çalışmaz hale geldi.

Sebebi, hem ghost hem de captive portal kodlarının mysqli uyumlu olmaması idi.

Geçtiğimiz günlerde bende kullandığım bir kaç firmada pfSenseyi yükseltmek zorunda kaldım ve bu sorun yüzünden captive portalı kullanamaz oldum.
Captive portal’ın login ekranındaki bir kaç javascript sorunu zaten dikkatimi çekiyordu. Bahane ile onları da kapsayacak bir düzenleme yaptım. Devamını Oku

Windows 8, 8.1, 10, Server 2012/2016 R2 İşletim Sistemlerinde WinSxS Klasörünü Temizlemek

Özellikle SSD (Solid State Disk) kullanıyorsanız ve Microsoft Windows 8, 8.1 yada Server 2012 işletim sistemlerinden birine sahipseniz belirli bir süre sonra sistemin kurulu olduğu diskinizde yer kalmayabilir. Ufak bir araştırma yaptığınızda C:\Windows\WinSxS klasörünün gigabyte’larca yer kapladığının farkına varırsınız.

Nedir bu WinSxS ?

Microsoft şöyle tanımlamış;
Windows bileşen deposu (C:\Windows\winsxs) dizini, Windows kurulumları içindeki bakım işlemleri sırasında kullanılır. Bakım işlemlerinin bazıları Windows Update, hizmet paketi ve düzeltme yüklemeleridir, ancak bunlarla sınırlı değildir. Bileşen deposu bir Windows kurulumu için gerekli olan tüm dosyaları içerir. Bu dosyalara yönelik tüm güncelleştirmeler de güncelleştirmelerin yüklendiği sırada bileşen deposu içinde tutulur. Bu da zaman içinde kuruluma yeni güncelleştirmeler, özellikler veya roller eklendikçe bileşen deposunun büyümesine yol açar. Bileşen deposu Windows platformunun sağlamlığını artırmak için kendisi ile diğer Windows dizinleri arasında NTFS sabit bağlantıları kullanır. Kaynak

Devamını Oku

İl İlçe Semt Mahalle Köy Plaka Posta Kutusu Veritabanı

Adres – İl – İlçe – Semt – Mahalle – Köy – Plaka – Posta Kodu Veritabanı

Eğer yazılımcı biri iseniz yada işiniz gereği adres oluştururken il, ilçe, semt, mahalle, köy, plaka, posta kodu bilgisine ihtiyaç duyuyorsanız bu konu sizi çok ilgilendirmektedir.

PTT[ref]PTT Posta Kodu Sorulama Servisi[/ref] den aldığım adres – il – plaka – ilçe – semt – mahalle – köy – posta kodu veritabanını normal kullanıcıların ve biz programcıların kullanabileceği formatta sizlere sunuyorum.

Bu formatlar ;

  • SQL Azure
  • Microsoft SQL
  • MySQL
  • ORACLE
  • PostgreSQL
  • SQLite
  • Microsoft Excel 2003 ve öncesi (xls)
  • Microsoft Excel 2007 ve sonrası (xlsx)

Codec olarakta ;

  • ANSI (1254 Turkish)
  • UTF8 (generic)

kullanılmıştır.
Devamını Oku