This is a viewer only at the moment see the article on how this works.
To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk
This is a preview from the server running through my markdig pipeline
Sunday, 11 January 2026
لقد بنيت StyloFlow لأنني واصلت الكتابة نفس النمط مرارا وتكراراcomponents that react to what happened before, emit confidence scores, sometimes need to escalate to more expensive analysis. Existing workflow engines wanted me to think in terms of DAGs or state machines
ملاحظة: StyloFlow ليس منتجًا مكتملًا قط; لأنني أبني lucidRAG و StyloBot IM SK2m أضيف الخصائص المفقودة و polishing the API on BOTH Stylo Fllow and ephemeralMSC3 إنه 's still in active developmentMska5 but you can try it out and provide feedbackMNK6 I will update here later Mske7the SignalSink stuff for example will change for ephemerial vMST8 to be MSSK9read onlyMSP10
StyloFlow عبارة عن مكتبة الأوركستراشن قادمة من إشارة - التي تتطابق كيف أعتقد حول أنابيب الذكاء الصناعي: تشرح المكونات ما ينتجونه وما يحتاجونه
هذه هي البنية التحتية التي تدعم وضوحRAG - cross- أداة RAG للرسم البياني المتحركة التي تدمج DocSummarizer (وثائق), المزيج للبيانات (بيانات مبنية), و ImageSummarizer ( "images" ) "to a unified question" - "anwering system with knowledge graph visualization" . "It also powers ستيلوبوت (نظام حماية الروبوتات المتقدمة) ويقوم بتطبيق تقلل من RAG النمط.

المصدر: GitHub - StyloFlow
StyloFlow هو نموذج عمل لنموذج الإشارات الواجهة والشكل سوف تتطور بينما أبني lucidRAG و Stylobot, لكن سياق التنفيذ والنماذج التي شرحتها هنا هي الإشارات النقيّة: كإشارات أوليةM SK2حقائق صنفية , الثقةMSC4انقسام مُحرّكَ, والإرتفاع كنمط الهيكليّ
هذا ليس ' هو لغة DSL جديدة أو عمليّة الفهم التنفيذي تم بناؤه حول الإشارات , الثقة , و التسارع المحدود . اليوم يعمل في - عملية مع التزامن المحدودة . غدا سيقوم بتوزيع المسارات عبر الآلات بينما يحافظ على الإشارات كحدود مستقرة | .
هنا'هذا ما تبدو عليه معظم محركات تدفق العمل
// ❌ Traditional: Hardcoded dependencies
public async Task ProcessDocumentAsync(string path)
{
var text = await ExtractTextAsync(path);
var chunks = await ChunkTextAsync(text);
var embeddings = await GenerateEmbeddingsAsync(chunks);
var entities = await ExtractEntitiesAsync(chunks);
await StoreEverythingAsync(embeddings, entities);
}
هذا يعمل حتى :
وينتهي بك الأمر بـ:
StyloFlow يبني على أكثر وضوحا.طفيف - مكتبة للتحديد, تنفيذ قابل للتعقب غير同期M SK2
لمحة سريعة عن ما يقدمه الطفيف:
// Bounded concurrent processing with full visibility
var coordinator = new EphemeralWorkCoordinator<DocumentJob>(
async (job, operation, ct) => {
await ProcessAsync(job, ct);
operation.Signal("document.processed");
},
new EphemeralOptions { MaxConcurrency = 4 });
// Enqueue work
await coordinator.EnqueueAsync(new DocumentJob(filePath));
// Full observability
Console.WriteLine($"Active: {coordinator.ActiveCount}");
Console.WriteLine($"Completed: {coordinator.TotalCompleted}");
الفوائد الرئيسية من الطفيف:
للتفصيل , consulte النار وdon't لا تنسى تماما.
هذا النموذج الأوركسترالي يمتد إلى مرحلة مادية مع :
هنا "مسك0" هو التحول العميقي الرئيسي "مسک1"
graph TD
subgraph Traditional["❌ Traditional: Hardcoded"]
T1[Component A] -->|calls| T2[Component B]
T2 -->|calls| T3[Component C]
T3 -->|calls| T4[Component D]
end
subgraph StyloFlow["✅ StyloFlow: Signal-Driven"]
S1[Component A]
S2[Component B]
S3[Component C]
S4[Component D]
SS[Signal Sink]
S1 -.emits.-> SS
S2 -.emits.-> SS
S3 -.emits.-> SS
SS -.triggers.-> S2
SS -.triggers.-> S3
SS -.triggers.-> S4
end
style T1 stroke:#ff6b6b
style T2 stroke:#ff6b6b
style T3 stroke:#ff6b6b
style T4 stroke:#ff6b6b
style S1 stroke:#51cf66
style S2 stroke:#51cf66
style S3 stroke:#51cf66
style S4 stroke:#51cf66
style SS stroke:#339af0
المكونات لا تتصل ببعضها البعض
الإشارات هي حقائق عن ما حدث, ليست الأوامر أو الأحداثM SK1 هي ' غير قابلة للتغيير, مكتوبة في وقتٍ محددMSC4 وتحمل نقاط الثقةMNK5 كل الذرة تملك إشاراتها - هيMRK7 غير قادرة على التغيير خارجياً S. لا شيء آخر يمكنه تعديل تلك القائمة
public record Signal
{
public required string Key { get; init; } // "document.chunked"
public object? Value { get; init; } // Optional payload
public double Confidence { get; init; } = 1.0; // 0.0 to 1.0
public required string Source { get; init; } // Which component
public DateTime Timestamp { get; init; }
public Dictionary<string, object>? Metadata { get; init; }
}
نقطة معمارية حرجة: SignalSink هو نظرة تاريخية مستمرة.
إشارة سمك يقدم نظرة قابلة للبحث في جميع العمليات على جميع الموصلات التي تشاركها. الإشارات تستمر عبر دورة حياة الموصل - عندما يطرد عملية من موصلها , تبقى الإشارات في القمامة حتى يتم تنظيفها يدويًا
// Create a shared signal sink (no parameters, signals persist)
var sink = new SignalSink();
// Coordinators manage operation lifetime, NOT signal lifetime
var coordinator = new EphemeralWorkCoordinator<string>(
ProcessAsync,
new EphemeralOptions
{
MaxConcurrency = 8,
MaxTrackedOperations = 100, // Operations evict after this
MaxOperationLifetime = TimeSpan.FromMinutes(5), // Or after this time
Signals = sink // Share the persistent view
});
// Operations emit via their emitter
public async Task ProcessAsync(string docId, SignalEmitter emitter, CancellationToken ct)
{
// Store actual data externally (cache, database, blob storage)
await cache.SetAsync($"doc-{docId}", documentData);
// Signal carries a REFERENCE, not the data
emitter.Emit("document.chunked", key: docId); // Key references external data
}
// SignalSink is readonly - it cannot alter signals
// Signals persist until their operation evicts from the coordinator
سيگنالسينك يقدم نمطين من توازن TWO:
1. PushM SK1based (Subscribe):
// Subscribe to the sink for push notifications
sink.Subscribe(signal => {
if (signal.Is("document.chunked"))
{
// React immediately - signal includes OperationId
Console.WriteLine($"Op {signal.OperationId} chunked doc at {signal.Timestamp}");
}
});
// Returns IDisposable for cleanup
using var subscription = sink.Subscribe(HandleSignal);
2. Pull-based (QueryM SK3
// Get all signals for a specific operation
var opSignals = sink.GetOpSignals(operationId);
// Detect if any operation has emitted a signal
if (sink.Detect("embeddings.generated"))
{
// At least one operation has generated embeddings
}
// Sense all signals matching a condition
var recentErrors = sink.Sense(s =>
s.Signal.StartsWith("error.") &&
s.Timestamp > DateTimeOffset.UtcNow.AddMinutes(-5)
);
// Get operation summary from its signal history
var summary = sink.GetOp(operationId);
Console.WriteLine($"Operation ran for {summary?.Duration}");
لماذا يهم هذا؟
مبدأ التصميم الرئيسي: تخزين البيانات الضخمة (وثائق, الصورM SK2 векторات ) في المخازن أو قواعد البياناتMSC4 الإشارات تحمل فقط المراجع مثل "cache://doc-123" أو مفاتيح التشغيل.
كمثال coordinación:
// Operation emits signal via ISignalEmitter interface
public async Task ProcessAsync(Item item, ISignalEmitter emitter, CancellationToken ct)
{
// Emit to the sink
emitter.Emit("processing.started");
await DoWorkAsync(item, ct);
emitter.Emit("processing.completed");
}
// Wave checks if it should run by querying sink
public bool ShouldRun(string path, AnalysisContext ctx)
{
// Pull pattern: query the sink via context
return ctx.Detect("document.chunked");
}
// UI subscribes to sink for reactive updates
sink.Subscribe(signal => {
if (signal.Signal.StartsWith("document."))
{
// Push pattern: react immediately
UpdateProgressUI(signal);
}
});
التصاعد يحدث على مستوىين
// Pattern 1: Intra-coordinator escalation (wave checks signals)
public bool ShouldRun(string path, AnalysisContext ctx)
{
var quality = ctx.GetSignal("quality.score");
return quality?.Confidence < 0.7; // Only run if quality is low
}
// Pattern 2: Inter-coordinator escalation (atom routes to another coordinator)
// Option A: Explicit escalation signal
typed.Raise("escalate.to.expensive", payload, key: "doc-123");
// Option B: EscalatorAtom examines signals and decides
new EscalatorAtomOptions<T> {
ShouldEscalate = evt => evt.Payload.Confidence < 0.7
}
موصلات متعددة تعمل بشكل مستقل. المسارح الذاتي يراقب الإشارات من موصل واحد وينقل العمل إلى آخر عند الحاجة.
لنظرية وراء هذا , см. سحب السياق الخافت المقيد.
حرجة: الإشارات هي أحداث تنسيق, ليست نقل البيانات. بيانات كبيرة (وثائقM SK3 صورMSC4 مداخلاتMNK5 يجب أن تعيش في مخزن خارجيMRK6
// ❌ BAD: Carrying data in signals (memory pressure, boxing)
var imageBytes = await ProcessImageAsync(input);
emitter.Emit("image.processed", metadata: new { Data = imageBytes });
// ✅ GOOD: Store externally, signal the reference
var imageBytes = await ProcessImageAsync(input);
var cacheKey = $"processed/{docId}";
await cache.SetAsync(cacheKey, imageBytes);
emitter.Emit("image.processed", key: cacheKey);
// Later: Retrieve when needed
if (sink.Detect("image.processed"))
{
var signals = sink.GetOpSignals(operationId);
var imageKey = signals.FirstOrDefault(s => s.Signal == "image.processed")?.Key;
if (imageKey != null)
{
var bytes = await cache.GetAsync<byte[]>(imageKey);
}
}
أفضل الممارسات:
"cache://key", "blob://container/file", "db://table/id"توضح الميثاقات العقد ( ما الذي يثيرني , ما أصدره ,, , ما أكلفه .) منفصلة عن التنفيذ. هذا الفصل موجود بحيث يمكنك فهم تدفق العمل دون قراءة البرمجة, وتغيير ترتيب تنفيذ بدون إعادة التجميع
name: BotDetector
priority: 10 # Lower runs first
enabled: true
# What kind of component is this?
taxonomy:
kind: analyzer # sensor|analyzer|proposer|gatekeeper
determinism: probabilistic
persistence: ephemeral
# When should this run?
triggers:
requires:
- signal: http.request.received
condition: exists
# What does it produce?
emits:
on_complete:
- key: bot.detected
confidence_range: [0.0, 1.0]
conditional:
- key: bot.escalation.needed
when: confidence < 0.7
# Resource limits
lane:
name: fast # fast|normal|slow|llm
max_concurrency: 8
budget:
max_duration: 100ms
# Configuration values
defaults:
confidence:
bot_detected: 0.6
timing:
timeout_ms: 100
الفوائد:
بينما يمكنك كتابة الميثاقات YAML باليد

يقدم الواجهة
هذا يجعل من السهل تجريب أشكال تدفق العمل المختلفة دون كتابة YAML باليد
wave is a composable analysis stage. هذا الواجهة موجودة لجعل "هل يجب أن نشغل ?" قرار أول, ليس جزءاً من التنفيذ محصوراً في المنطق condicional.
public interface IContentAnalysisWave
{
string Name { get; }
int Priority { get; } // Higher runs first
bool Enabled { get; set; }
// Quick filter - avoid expensive work
bool ShouldRun(string contentPath, AnalysisContext context);
// Do the analysis
Task<IEnumerable<Signal>> AnalyzeAsync(
string contentPath,
AnalysisContext context,
CancellationToken ct);
}
مثال موجة بسيطة:
public class FileTypeWave : IContentAnalysisWave
{
public string Name => "FileType";
public int Priority => 100;
public bool Enabled { get; set; } = true;
public bool ShouldRun(string path, AnalysisContext ctx)
{
// Skip if we already know the type
return ctx.GetSignal("file.type") == null;
}
public async Task<IEnumerable<Signal>> AnalyzeAsync(
string path,
AnalysisContext ctx,
CancellationToken ct)
{
var extension = Path.GetExtension(path);
var mimeType = GetMimeType(extension);
return new[]
{
new Signal
{
Key = "file.type",
Value = mimeType,
Confidence = 1.0,
Source = Name
}
};
}
}
تنسيق الموجات:
الـ WaveCoordinator يحرك الأمواج في ترتيب أولي:
var coordinator = new WaveCoordinator(waves, profile);
var context = new AnalysisContext();
var results = await coordinator.ExecuteAsync(filePath, context, ct);
// All signals from all waves
foreach (var signal in context.GetAllSignals())
{
Console.WriteLine($"{signal.Key}: {signal.Value}");
}
مسارات المنافسة:
الأمواج تجري في مسارات مع حدود متطابقة مختلفة:
| الطريق | الهدف | التنافس | |||
|---|---|---|---|---|---|
fast |
التحققات السريعة | ||||
normal |
المعالجة القياسية ( التحليل, التجزئةM SK3 | \8 | |||
io |
I/O مقيد ( يقرأ ملفاًM SK3 مكالمات APIMSC4 | 32 | |||
llm |
إتصالات LLM مكلفة | 2 SMK3 |
هذا يمنع عمليات مكلفة من منع عمليات رخيصة.
هنا ' الصورة الكاملة :
graph TB
subgraph Input["Input Layer"]
REQ[HTTP Request]
FILE[File Upload]
JOB[Background Job]
end
subgraph Ephemeral["Ephemeral Layer"]
COORD[Work Coordinator]
OPS[Operations<br/>own signals]
SINK[SignalSink<br/>read-only view]
end
subgraph StyloFlow["StyloFlow Layer"]
MAN[Manifests]
WAVE[Wave Coordinator]
ATOMS[Atoms<br/>own signals]
end
subgraph Execution["Execution"]
FAST[Fast Lane]
NORM[Normal Lane]
LLM[LLM Lane]
end
subgraph Output["Output"]
RES[Results]
ESCAL[Escalation]
STORE[Persistence]
end
REQ --> COORD
FILE --> COORD
JOB --> COORD
COORD --> OPS
SINK -.queries.-> OPS
WAVE -.reads.-> SINK
MAN -.configures.-> WAVE
WAVE --> ATOMS
ATOMS --> FAST
ATOMS --> NORM
ATOMS --> LLM
SINK -.queries.-> FAST
SINK -.queries.-> NORM
SINK -.queries.-> LLM
SINK -.read for.-> RES
SINK -.read for.-> ESCAL
SINK -.read for.-> STORE
style COORD stroke:#339af0
style SINK stroke:#339af0
style WAVE stroke:#51cf66
style ATOMS stroke:#51cf66
التدفق:
نموذج الملكية: كل عملية../..تم يمتلك إشاراته.. ...signalSink يقدم رؤية قراءة.-..only view across all operations.M SK3..Signals can be escalated. (.
نموذج تنفيذي الحالي: واحد - العمليات , التطابقة المحدودة | , | عمليات قابلة للملاحظة مع التخلص من الـ LRU |.
نموذج تنفيذ المستقبلي: مسارات متوزعة عبر الآلات, أسئلة سيگنالSink عمليات عن بعد, أذرع تنفذ على مضيفين مختلفينM SK2 الإشارات تبقى الحدود المستقرة - إنهم'متوفرون بالفعل على التسلسل السلسليM SK2 مسجلون في وقتٍ محدد , ومكونون بأنفسهم - متضمنين M SK5 نموذج الملكية لا يتغير MSC6 لا يتغيّر
إن -التطبيق في العملية يتحقق من الدلالة. التوزيع هو حول توسيع substrate التنفيذM SK2 بدون تغيير نموذج الأوركستراشن .
دعونا نرى كيف lucidRAG يستخدم StyloFlow:
المرحلة 1: الكشف الأولي
public class FileTypeDetectorWave : IContentAnalysisWave
{
public int Priority => 100; // Run first
public async Task<IEnumerable<Signal>> AnalyzeAsync(...)
{
var extension = Path.GetExtension(path);
return new[]
{
new Signal
{
Key = "file.extension",
Value = extension,
Source = "FileTypeDetector"
}
};
}
}
المرحلة 2: تدوير ( تم استشعاره بواسطة الملف.متtensionM SK3
// In manifest:
// triggers:
// requires:
// - signal: file.extension
// condition: in
// value: [".pdf", ".docx", ".md"]
public class ChunkingWave : ConfiguredComponentBase, IContentAnalysisWave
{
public int Priority => 80;
public async Task<IEnumerable<Signal>> AnalyzeAsync(...)
{
var chunks = await ChunkDocumentAsync(path);
ctx.SetCached("chunks", chunks); // Share with other waves
return new[]
{
new Signal
{
Key = "document.chunked",
Value = chunks.Count,
Source = Name
}
};
}
}
المرحلة 3: الدمج ( تم توجيهه بواسطة الملفM SK2 تم وضعه على سطح البحر)
public class EmbeddingWave : ConfiguredComponentBase, IContentAnalysisWave
{
public int Priority => 60;
public bool ShouldRun(string path, AnalysisContext ctx)
{
// Only run if chunking succeeded
return ctx.GetSignal("document.chunked") != null;
}
public async Task<IEnumerable<Signal>> AnalyzeAsync(...)
{
var chunks = ctx.GetCached<List<Chunk>>("chunks");
var embeddings = await GenerateEmbeddingsAsync(chunks);
ctx.SetCached("embeddings", embeddings);
return new[]
{
new Signal
{
Key = "embeddings.generated",
Value = embeddings.Count,
Source = Name
}
};
}
}
المرحلة 4: إستخراج الكائنات ( متوازن مع الدمج)
public class EntityExtractionWave : ConfiguredComponentBase, IContentAnalysisWave
{
public int Priority => 60; // Same as embedding - runs in parallel
public async Task<IEnumerable<Signal>> AnalyzeAsync(...)
{
var chunks = ctx.GetCached<List<Chunk>>("chunks");
// Use deterministic IDF scoring, not LLM per chunk
// (See Reduced RAG pattern)
var entities = await ExtractEntitiesAsync(chunks);
return new[]
{
new Signal
{
Key = "entities.extracted",
Value = entities.Count,
Confidence = CalculateConfidence(entities),
Source = Name
}
};
}
}
المرحلة 5: التحقق من الجودة
public class QualityCheckWave : ConfiguredComponentBase, IContentAnalysisWave
{
public int Priority => 40; // After embedding + entities
public async Task<IEnumerable<Signal>> AnalyzeAsync(...)
{
var embeddingSignal = ctx.GetSignal("embeddings.generated");
var entitySignal = ctx.GetSignal("entities.extracted");
var embeddingCount = (int)embeddingSignal.Value;
var entityConfidence = entitySignal.Confidence;
var quality = CalculateQuality(embeddingCount, entityConfidence);
var signals = new List<Signal>
{
new Signal
{
Key = "quality.score",
Value = quality,
Source = Name
}
};
// Trigger escalation if quality is poor
if (quality < GetParam<double>("quality_threshold", 0.7))
{
signals.Add(new Signal
{
Key = "escalation.needed",
Value = "low_quality_document",
Source = Name
});
}
return signals;
}
}
فوائد هذه المقاربة:
هذا هو تقلل من RAG النمط في العمل: الاستخراج المعرفي في المقدمة, اللوحات فقط للsynthesisM SK2
ستيلوبوت هو نظام إكتشاف الروبوتات المتقدم الذي يستخدم "ستيلوفلو" لتحليل التهديدات المتعددة.
النمط 1: ميناء-خارج
إشارة واحدة تثير موجات متعددة:
graph LR
S1[document.uploaded] --> W1[ChunkingWave]
S1 --> W2[MetadataWave]
S1 --> W3[LanguageDetectionWave]
W1 -.signal.-> S2[document.chunked]
W2 -.signal.-> S3[metadata.extracted]
W3 -.signal.-> S4[language.detected]
style S1 stroke:#339af0
style S2 stroke:#339af0
style S3 stroke:#339af0
style S4 stroke:#339af0
style W1 stroke:#51cf66
style W2 stroke:#51cf66
style W3 stroke:#51cf66
النمط 2: إعتماد متسلسل
الأمواج تنتظر الإشارات السابقة:
graph LR
W1[ExtractWave] -.signal.-> S1[text.extracted]
S1 --> W2[ChunkWave]
W2 -.signal.-> S2[text.chunked]
S2 --> W3[EmbedWave]
W3 -.signal.-> S3[embeddings.generated]
style S1 stroke:#339af0
style S2 stroke:#339af0
style S3 stroke:#339af0
style W1 stroke:#51cf66
style W2 stroke:#51cf66
style W3 stroke:#51cf66
النمط 3: قسم محدد
موجات مختلفة تعمل على أساس الإشارات:
graph TD
W1[DetectorWave] -.signal.-> S1{confidence}
S1 -->|< 0.4| W2[RejectWave]
S1 -->|0.4-0.7| W3[EscalateWave]
S1 -->|> 0.7| W4[AcceptWave]
W2 -.signal.-> S2[rejected]
W3 -.signal.-> S3[escalated]
W4 -.signal.-> S4[accepted]
style S1 stroke:#ffd43b
style S2 stroke:#ff6b6b
style S3 stroke:#ff922b
style S4 stroke:#51cf66
style W1 stroke:#339af0
style W2 stroke:#ff6b6b
style W3 stroke:#ff922b
style W4 stroke:#51cf66
نمط 4: التجميع
إشارات متعددة تثير موجة واحدة:
graph LR
W1[Wave A] -.signal.-> S1[a.complete]
W2[Wave B] -.signal.-> S2[b.complete]
W3[Wave C] -.signal.-> S3[c.complete]
S1 --> T{All Ready?}
S2 --> T
S3 --> T
T -->|Yes| W4[AggregatorWave]
W4 -.signal.-> S4[aggregation.complete]
style S1 stroke:#339af0
style S2 stroke:#339af0
style S3 stroke:#339af0
style S4 stroke:#51cf66
style T stroke:#ffd43b
style W4 stroke:#51cf66
StyloFlow يدعم التدرج على مستوىين:
مثال من lucidRAG: يتم استخراج الكائنات السريعة أولاً. إذا كانت الجودة M SK2 0.7, ينقل المسار الذاتي للوثيقة إلى مخطط تكرير LLM مكلفMSC4 هذا يوفر 20x في التكلفة من خلال تجنب مكالمات LLM باهظة الثمن من أجل extractions ذات جودة عاليةMST6Mst7
هذا ليس دليلاً سريعاً
الinstallation:
dotnet add package StyloFlow.Complete
نقطة دخول مفهومة:
// 1. Define a wave
public class MyAnalysisWave : IContentAnalysisWave
{
public string Name => "MyAnalysis";
public int Priority => 50;
public bool Enabled { get; set; } = true;
public bool ShouldRun(string path, AnalysisContext ctx) => true;
public async Task<IEnumerable<Signal>> AnalyzeAsync(
string path,
AnalysisContext ctx,
CancellationToken ct)
{
// Your analysis logic here
var result = await AnalyzeAsync(path);
return new[]
{
new Signal
{
Key = "my.signal",
Value = result,
Confidence = 1.0,
Source = Name
}
};
}
}
// 2. Register waves
var waves = new List<IContentAnalysisWave>
{
new MyAnalysisWave(),
new AnotherWave(),
};
// 3. Create coordinator
var coordinator = new WaveCoordinator(
waves,
CoordinatorProfile.Default);
// 4. Execute
var context = new AnalysisContext();
var results = await coordinator.ExecuteAsync(filePath, context);
// 5. Read signals
foreach (var signal in context.GetAllSignals())
{
Console.WriteLine($"{signal.Key}: {signal.Value} ({signal.Confidence})");
}
مع الميثاقات:
// Load manifests from directory
var loader = new FileSystemManifestLoader("./manifests");
var manifests = await loader.LoadAllAsync();
// Build waves from manifests
var waves = manifests
.Where(m => m.Enabled)
.OrderBy(m => m.Priority)
.Select(m => WaveFactory.Create(m))
.ToList();
var coordinator = new WaveCoordinator(waves, profile);
لنرى الأمثلة الكاملة, في مخزن StyloFlow GitHub.
واحدة من خصائص StyloFlow' الأساسية هي قابلية لاكتشاف تدفق العمل - يمكنك أن تفهم خط الأنابيب بأكمله فقط من خلال قراءة الميثاقات. لا يتوجب عليك الغوص في الرمز
هنا ' هي الهيكل الفعلي للمجلد الموضح لـ lucidRAG :
manifests/
├── 01-file-type-detector.yaml
├── 02-chunking.yaml
├── 03-embedding.yaml
├── 04-entity-extraction.yaml
├── 05-quality-check.yaml
└── 06-escalation.yaml
01-file-type -detectorM SK3yamlMSC4
name: FileTypeDetector
priority: 100
enabled: true
description: Detects file type from extension
taxonomy:
kind: sensor
determinism: deterministic
persistence: ephemeral
triggers:
requires:
- signal: document.uploaded
condition: exists
emits:
on_start:
- file.detection.started
on_complete:
- key: file.extension
type: string
confidence_range: [1.0, 1.0]
- key: file.mime_type
type: string
confidence_range: [1.0, 1.0]
lane:
name: fast
max_concurrency: 16
budget:
max_duration: 10ms
02-chunkingM SK1yaml:
name: ChunkingWave
priority: 80
enabled: true
description: Splits documents into semantic chunks
taxonomy:
kind: extractor
determinism: deterministic
persistence: ephemeral
input:
accepts:
- document.pdf
- document.docx
- document.markdown
required_signals:
- file.extension
triggers:
requires:
- signal: file.extension
condition: in
value: [".pdf", ".docx", ".md", ".txt"]
emits:
on_complete:
- key: document.chunked
type: integer
confidence_range: [1.0, 1.0]
- key: chunks.cached
type: boolean
lane:
name: normal
max_concurrency: 8
budget:
max_duration: 30s
defaults:
chunking:
max_chunk_size: 512
overlap: 50
respect_boundaries: true
03-embeddingM SK1yaml:
name: EmbeddingWave
priority: 60
ires:
- signal: file.extension
condition: in
value: [".pdf", ".docx", ".md", ".txt"]
emits:
on_complete:
- key: document.chunked
type: integer
confidence_range: [1.0, 1.0]
- key: chunks.cached
type: boolean
lane:
name: normal
max_concurrency: 8
budget:
max_duration: 30s
defaults:
chunking:
max_chunk_size: 512
overlap: 50
respect_boundaries: true
03-embeddingM SK1yaml:
name: EmbeddingWave
priority: 60
enabled: true
description: Generates ONNX embeddings for chunks
taxonomy:
kind: embedder
determinism: deterministic
persistence: cached
input:
required_signals:
- document.chunked
- chunks.cached
triggers:
requires:
- signal: document.chunked
condition: ">"
value: 0
emits:
on_complete:
- key: embeddings.generated
type: integer
confidence_range: [1.0, 1.0]
lane:
name: normal
max_concurrency: 4
budget:
max_duration: 2m
max_cost: 0.0 # Local ONNX model
defaults:
embedding:
model: all-MiniLM-L6-v2
batch_size: 32
04-entity-extraction .yamlM SK3
name: EntityExtractionWave
priority: 60 # Same as embedding - runs in parallel
enabled: true
description: Extracts entities using IDF scoring
taxonomy:
kind: extractor
determinism: deterministic
persistence: persisted
input:
required_signals:
- document.chunked
triggers:
requires:
- signal: document.chunked
condition: ">"
value: 0
emits:
on_complete:
- key: entities.extracted
type: integer
confidence_range: [0.0, 1.0] # Confidence varies
lane:
name: normal
max_concurrency: 8
budget:
max_duration: 1m
defaults:
entity:
min_idf_score: 2.5
min_frequency: 2
max_entities: 100
05-QualityM SK1check.yamlMSC3
name: QualityCheckWave
priority: 40
enabled: true
description: Validates extraction quality
taxonomy:
kind: gatekeeper
determinism: deterministic
persistence: ephemeral
input:
required_signals:
- embeddings.generated
- entities.extracted
triggers:
requires:
- signal: embeddings.generated
condition: ">"
value: 0
- signal: entities.extracted
condition: exists
emits:
on_complete:
- key: quality.score
type: double
confidence_range: [0.0, 1.0]
conditional:
- key: escalation.needed
when: quality.score < 0.7
lane:
name: fast
max_concurrency: 16
defaults:
quality:
min_embeddings: 5
min_entity_confidence: 0.5
threshold: 0.7
06-استنخفاضM SK1yaml:
name: EscalationWave
priority: 20
enabled: true
description: Improves low-quality extractions using LLM
taxonomy:
kind: proposer
determinism: probabilistic
persistence: persisted
input:
required_signals:
- escalation.needed
triggers:
requires:
- signal: escalation.needed
condition: exists
skip_when:
- signal: budget.exhausted
emits:
on_complete:
- key: escalation.complete
type: boolean
- key: entities.improved
type: integer
confidence_range: [0.7, 1.0]
lane:
name: llm
max_concurrency: 2 # Expensive
budget:
max_duration: 30s
max_tokens: 4000
max_cost: 0.05
defaults:
llm:
model: gpt-4o-mini
temperature: 0.1
prompt_template: entity_extraction
بالنظر إلى هذه الملفات, تعرفون فوراً:
لا نحتاج لقراءة الرمز. تدفق العمل هو ذاتي-documenting.
في حين أن الأمثلة السابقة تظهر موجات YAML , معلنة بالكامل يمكن أن تكون كود-أذرات مبنية على تشير في الميثاقات:
name: CustomAnalyzer
priority: 50
enabled: true
description: Custom analysis logic
# Reference a code-based atom implementation
implementation:
assembly: MyProject.Analyzers
type: MyProject.Analyzers.CustomAnalyzerWave
method: AnalyzeAsync
# The manifest still declares the contract
taxonomy:
kind: analyzer
determinism: probabilistic
triggers:
requires:
- signal: data.ready
emits:
on_complete:
- key: analysis.complete
confidence_range: [0.0, 1.0]
lane:
name: normal
max_concurrency: 4
# Configuration values passed to the atom
defaults:
threshold: 0.75
max_iterations: 10
تطبيق C#
public class CustomAnalyzerWave : ConfiguredComponentBase, IContentAnalysisWave
{
public async Task<IEnumerable<Signal>> AnalyzeAsync(
string path,
AnalysisContext ctx,
CancellationToken ct)
{
// Access manifest config
var threshold = GetParam<double>("threshold", 0.75);
var maxIterations = GetParam<int>("max_iterations", 10);
// Custom logic here
var result = await PerformComplexAnalysis(path, threshold, maxIterations);
return new[]
{
new Signal
{
Key = "analysis.complete",
Value = result.Score,
Confidence = result.Confidence,
Source = Name
}
};
}
}
الفوائد:
هذا المقاربة الهجينة تعطيك إكتشاف تدفق العمل الإفتراضي بينما تحافظ على المنطق المعقد في C#. قابل للحفاظ
الهيكل الموضح يجعل من البسيط صنع التصورات
graph TD
DOC[document.uploaded] --> FT[FileTypeDetector<br/>Priority: 100<br/>Lane: fast]
FT --> EXT[file.extension]
EXT --> CH[ChunkingWave<br/>Priority: 80<br/>Lane: normal]
CH --> CHUNKED[document.chunked]
CHUNKED --> EMB[EmbeddingWave<br/>Priority: 60<br/>Lane: normal]
CHUNKED --> ENT[EntityExtractionWave<br/>Priority: 60<br/>Lane: normal]
EMB --> EMBGEN[embeddings.generated]
ENT --> ENTEX[entities.extracted]
EMBGEN --> QC[QualityCheckWave<br/>Priority: 40<br/>Lane: fast]
ENTEX --> QC
QC --> QSCORE[quality.score]
QC -.conditional.-> ESC_NEED[escalation.needed]
ESC_NEED -.-> ESC[EscalationWave<br/>Priority: 20<br/>Lane: llm]
ESC --> ESC_DONE[escalation.complete]
style DOC stroke:#339af0
style FT stroke:#51cf66
style CH stroke:#51cf66
style EMB stroke:#51cf66
style ENT stroke:#51cf66
style QC stroke:#ffd43b
style ESC stroke:#ff922b
هذا الرسم البياني تم إنشاؤه بطريقة برمجية من بيانات YAML - لا رسمة يدوية.
أحد خصائص StyloFlow الغير متوقعة هو أنه يخلق نظام يمكن لـ LLM أن تفكر بشكل آمن.
أغلب المحاولات لإستخدام LLMs للحل الخطأ أو التوصيل فشلت لأن النظام الذي سقطوا فيه هو غير مرئي
StyloFlow يفعل العكس. إنه يكشف الحقيقة الغير قابلة للتغيير عن ما حدث , عندما , ومع أي ثقة .
هذا يجعل برمجيات الـ LLM مفيدة حقاً — ليس كفاعلين, لكن كـ الخبراء.
في StyloFlow, لا يوجد LLM
بدلاً من , يُعطى نظرة SignalSink و طرحت أسئلة مثل:
مدخل مثال لرمز LLM:
{
"operation": "doc-123",
"signals": [
{ "key": "document.chunked", "value": 12, "confidence": 1.0, "source": "ChunkingWave" },
{ "key": "entities.extracted", "value": 4, "confidence": 0.42, "source": "EntityWave" },
{ "key": "quality.score", "value": 0.39, "source": "QualityCheckWave" },
{ "key": "escalation.needed", "source": "QualityCheckWave" }
]
}
ذلك' ليس تدفقاً لسجلات أساس المنطق.
يمكن لـ LLM الآن :
كل شيء دون أن يثق به أفعل أي شيء.
تقليديا "LLM تفكيك " يحاول إعادة تشغيل العالم:
" ها هو ' هناك الشفرة وبعض الملاحظات
فك الأخطاء في StyloFlow أكثر بساطة:
"هذه هي الحالة المحددة للنظام الذي تم ملاحظته
لأن الإشارات غير قابلة للتغيير و مملوكة
أسباب LLM حول الحقائق التي تثق بها بالفعل.
هذا يعمل فقط بسبب الحدود الصارمة:
لا يوجد حلقة ردود الفعل حيث أن الـ LLM " يحدد ـ " الخطوة التالية . على الأغلب ــ , يقترح تفسيرات أو إقتراحات تركيبية يمكن أن تطبق ـ human (or deterministic policy) later
أن عدم التناظر هو مقصود
بمجرد إشارة , وثقة , ونتائجها واضحة "M SK2" فأنت يمكن بعد ذلك:
لا يتطلب أي من ذلك أن يسمح لـ LLM بتشغيل النظام.
أصبح الـ LLM عدسة التشخيص, ليس سطحاً للتحكم
StyloFlow لا يجعل فقط الأنظمة الإفتراضية آمنة
إنها تجعلهم قابلة للقراءة — للبشر , لاختبارات ,, و للمرضى المصابين بمرض نقص المناعة المكتسبة .
أن' هو الفرق بين :
واحد فقط من تلك المقياس
1. تركيب بياني
المكونات تعلن عن عقودهم (لتحريكات,إشاراتM SK2ميزانية ), ليست إعتماداتهمMSC4 يحدد النظام ترتيب تنفيذهاMST5 هذا ليس MST6 ليس خاصية MSC7 إنه MSC8 ما يحدث عندما تقوم بصنع الإشارات أولاً MSc9طبقة MScsk10
2. قابلة للملاحظة بالលំនាំដើម
كل فعل هو إشارة . لا تضيفون ' لا يضيفون قابلية للملاحظة - إنها ' هي ذاتية . ردة الفعل الكاملة | , | متابعة الثقة | , | مسارات التسارع |, | و انخفض استهلاك الميزانية طبيعيا |.
3. تنفيذ ملائم
تقييمات الثقة تقود التفريغ دون منطق توجيه واضح. تجاوز مراحل مكلفة عندما تكون غير ضرورية, يتصاعد عند عدم التأكدM SK2 يتوقف مبكراً عند ارتفاعٍٍ عاليًا - فشلات الثقةMSC4تدفق التحكم يظهر من أنماط الإشارات
4. قابلية للاختبار دون تقليد الهياكل
إشارات مزحة, لا أجزاء:
var context = new AnalysisContext();
context.AddSignal(new Signal
{
Key = "document.chunked",
Value = 10,
Confidence = 1.0,
Source = "Test"
});
var wave = new EmbeddingWave();
var results = await wave.AnalyzeAsync(path, context, ct);
Assert.Single(results);
Assert.Equal("embeddings.generated", results.First().Key);
5. التعقيد المتزايد
أبدأ ببساطة:
var coordinator = new EphemeralWorkCoordinator<Job>(ProcessAsync);
أضف إشارات عند الحاجة:
new EphemeralOptions { Signals = signalSink }
أضف موجات لعدة -رحلة:
var waveCoordinator = new WaveCoordinator(waves, profile);
أضف الميثاقات للconfig التصريحي:
name: MyWave
triggers: [...]
emits: [...]
هنا ' هو النموذج الكامل lucidRAG خط أنابيب في لمحة (انظر إلى أمثلة البرمجة الدقيقة في "Use Case: lucidRAG Document Processing
document.uploaded إشارةfile.extension إشارةtext.extracted إشارةdocument.chunked إشارةembeddings.generated إشارةentities.extracted إشارةquality.score إشارةescalation.complete إشارةstorage.complete إشارةيsubscribe UI to the SignalSink for real-time progress updates M SK1push pattern):
// Subscribe to sink for push notifications
signalSink.Subscribe(signal => {
if (signal.Key.StartsWith("document."))
{
await _hub.Clients.User(userId)
.SendAsync("DocumentProgress", new
{
stage = signal.Key,
progress = CalculateProgress(signal),
operationId = signal.OperationId
});
}
});
أو استخدم نمط السحب إذا كنت تفضل التصويت:
// Query SignalSink for document progress (pull pattern)
var documentSignals = signalSink.GetSignals()
.Where(s => s.Key.StartsWith("document.") &&
s.Timestamp > lastCheck);
foreach (var signal in documentSignals)
{
UpdateProgressUI(signal);
}
النقطة الرئيسية: تsubscribe to the SINK (which views all atoms), not individual operations . Atoms own signals; the sink provides push
هكذا lucidRAG يعالج الوثائق , البيانات , وصور من خلال إشارة موحدة DocSummarizer, المزيج للبيانات, و ImageSummarizer تحت طبقة عزف واحدة.
هنا ' هو النموذج الكامل ستيلوبوت خط أنابيب في لمحة (انظروا إلى الرمز التفصيلي في "استقلال: من السرعة إلى البساطةM SK3
bot.detected إشارة بثقةbot.detected إشارةbot.detected إشارةالفوائد الرئيسية MSC0 التضخم المبني على الثقة MSC1
// ❌ Traditional: Every request gets expensive analysis
var reputation = await CheckIpAsync(ip);
var behavior = await AnalyzeBehaviorAsync(session); // Even if IP is known bad
var llmScore = await LlmAnalysisAsync(conversation); // Always expensive
// ✅ StyloFlow: Waves run based on confidence signals
// BehaviorAnalysis only runs if confidence is ambiguous (0.4-0.7)
// LLM analysis only runs if still unsure after behavior check
breakdown Cost: تكاليف الفحص IP $0 وتجري 100% من الوقت . تجري تحليل السلوك 30% S( حالات غامضة ). تجرى تحليل الـ LLM 5% ( لا تزال غامضة ). كلفة لكل طلب مسك9 $0.0001 ضد ساذج "LLM كل شيء" في $0.002 (20x المدخراتM SK1
| الميزة | StyloFlow | Temporal | Airflow | МSK4 | Step Functions | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| لتنسيق | إشارة - مدفوعة | RPC | - | بناء على | 4 | 5 | مبنى على ـ | 6 | الآلة الحكومية | 7 | |||
| التصريح | ✅ بيانات YAML | ❌ الرمز S-أول M | \✅ DAGs МSK7 | ✅ | JSON | / | YAML | ||||||
| شرطية | ✅ كاشفات الإشارات | ✅ الظروف | ♫ ✅ التفريغ ♫ | ♫ | ✅ ♫ حالات الاختيار ♫ | ♫ | |||||||
| التسارع | ✅ بنيت- في | ❌ | دليل | ||||||||||
| قابلة للملاحظة | ✅ ردة فعل إشارات | ✅ | تاريخ التدفق العملي | ✅ | سجلات المهام | ماسك6 | مسك7 | History of the execution | |||||
| مراقبة الميزانية | ✅ टोकن/محدودة التكلفة | \❌ دليل S | ❌ دليل | ||||||||||
| تنفيذ محلي | ✅ في -العملية МSK3 \❌ تحتاج إلى مجموعة | ❌ | تحتاج إلى المجموعة | МSK7 | ❌ | AWS فقط | |||||||
| مسارات التنافس | ✅ أسرع/معتادM SK3LLM | ♫❌ دليل | ✅ حوض |
أين يلائم هذا النموذج طبيعيا:
أين لا ينجح
هذه تطوّر طبيعية للنموذج , وليست إلتزامات بتنفيذ معين .
مع التوازن في الدلالية من خلال تطور lucidRAG و Stylobot, تصبح هذه الأنماط قابلة للتطبيق:
1. التعلم من الإشارات
تتبع أي مسارات التدرج تعمل بشكل أفضل:
// Did the LLM escalation improve accuracy?
// Learn to skip it if behavioral analysis is sufficient
2. تحسين التكلفة
تعيين مسارات تلقائياً على أساس الأداء التاريخي:
// If a "slow" wave completes quickly, promote to "normal"
3. إعادة تشغيل الإشارة
فك الخطأ بإعادة تشغيل تسلسلات الإشارات:
var replay = SignalReplay.FromFile("trace.jsonl");
await coordinator.ReplayAsync(replay);
4. متعددة- توازن الآلة
توزيع الممرات عبر الآلات بينما تبقي الإشارات مركزية.
المنظور الأساسي هو هذا في أنظمة الذكاء الصناعي،,، كل جزء لديه ثقة.
تدفقات العمل التقليدية تفترض النجاح
الإشارات توفر هذا طبيعيا:
// Multiple detectors vote
var signals = context.GetSignals("bot.detected");
// Aggregate by confidence
var verdict = signals
.OrderByDescending(s => s.Confidence)
.First();
// Or majority vote
var isBot = signals
.Count(s => (bool)s.Value) > signals.Count() / 2;
// Or weighted average
var score = signals
.Sum(s => (bool)s.Value ? s.Confidence : -s.Confidence)
/ signals.Count();
هذا هو السبب في أن StyloFlow يعمل بشكل جيد تقلل من RAG - كل مرحلة استخراج تنتج درجة الثقة , وتحصل على التركيب فقط عندما يكون الثقة مرتفعة بما فيه الكفاية
نموذج التنفيذ:
لماذا الإشارات مهمة:
تطبيقات العمل:
المقالات الأخرى:
شفرة المصدر: GitHub - StyloFlow
محركات تدفق العمل التقليدية تطلب منك الإعلان ماذا سيحدث بعد ذلك. هذا النموذج يطلب من المكونات أن declare ما ينتجونه و ما يحتاجونه, عندها يسمح لمؤشرات أن تنسق تنفيذها.
التحول الرئيسي: إختلاف المؤشرات , مرشدات الثقة , تحمي مسارات.
لا يتعلق الأمر بـ' بإختيار "StyloFlow" بدلاً من "Airflow" أو "Temporal- تلك تحل مشاكل مختلفة |( |التنفيذ المستدام | , |تعديل التدفق العملي |, | التوصيل الموزع بين مراكز البيانات | ). | يتعلق الأمر بت articulating a different orchestration model |مسك6 | one where control flow emerges from signal patterns rather than being explicitly programmed |
إذا كنت تُبنى أنابيب "AI"
... عندها قد يتناسب مع طريقة تفكيرك في هذه الترجمة
الـ مكتبة مؤقتة هو أساس مستقر . StyloFlow يضيف الإشارة - طبقة الأوركستراشن المدفوعة في الأعلى | . كلاهما يتطور من خلال الاستخدام الحقيقي في lucidRAG و Stylobot |
من أجل الأسئلة أو ردود الفعل, consulte the مخزن GitHub.
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.