Ironbees.AgentFramework
0.1.5
dotnet add package Ironbees.AgentFramework --version 0.1.5
NuGet\Install-Package Ironbees.AgentFramework -Version 0.1.5
<PackageReference Include="Ironbees.AgentFramework" Version="0.1.5" />
<PackageVersion Include="Ironbees.AgentFramework" Version="0.1.5" />
<PackageReference Include="Ironbees.AgentFramework" />
paket add Ironbees.AgentFramework --version 0.1.5
#r "nuget: Ironbees.AgentFramework, 0.1.5"
#:package Ironbees.AgentFramework@0.1.5
#addin nuget:?package=Ironbees.AgentFramework&version=0.1.5
#tool nuget:?package=Ironbees.AgentFramework&version=0.1.5
π Ironbees
νμΌμμ€ν 컨벀μ κΈ°λ° LLM μμ΄μ νΈ κ΄λ¦¬ λνΌ
Ironbeesλ .NET νκ²½μμ LLM μμ΄μ νΈμ λ°λ³΅λλ ν¨ν΄μ κ°μννλ κ²½λ λνΌμ λλ€. Microsoft Agent Framework, Semantic Kernel, LangChain, ironhive λ±μ νλ μμν¬λ₯Ό λ체νλ κ²μ΄ μλλΌ, κ·Έ μμμ μλνλ©° νμΌμμ€ν 컨벀μ μΌλ‘ μμ΄μ νΈ κ΄λ¦¬λ₯Ό λ¨μνν©λλ€.
π― ν΅μ¬ κ°μΉ μ μ
Ironbeesκ° νλ κ²:
- β
νμΌμμ€ν
컨벀μ
μΌλ‘ μμ΄μ νΈ μλ λ‘λ© (
agents/{name}/agent.yaml) - β κ°λ¨ν ν€μλ κΈ°λ° μμ΄μ νΈ λΌμ°ν
- β λ€μ€ νλ μμν¬ ν΅ν© (Microsoft Agent Framework, ironhive λ±)
- β 보μΌλ¬νλ μ΄νΈ μ€μ μ½λ μ κ±°
Ironbeesκ° νμ§ μλ κ²:
- β 볡μ‘ν μν¬νλ‘μ° μ€μΌμ€νΈλ μ΄μ β κΈ°λ³Έ νλ μμν¬ κΈ°λ₯ μ¬μ©
- β λν κ΄λ¦¬ λ° μ»¨ν μ€νΈ β κΈ°λ³Έ νλ μμν¬ κΈ°λ₯ μ¬μ©
- β λꡬ ν΅ν© λ° MCP β κΈ°λ³Έ νλ μμν¬ κΈ°λ₯ μ¬μ©
- β κ³ κΈ νμ ν¨ν΄ β κΈ°λ³Έ νλ μμν¬ κΈ°λ₯ μ¬μ©
π‘ μ IronbeesμΈκ°?
μΌλ°μ μΈ LLM μ± κ°λ° μ:
// λ§€λ² λ°λ³΅λλ ν¨ν΄
// 1. μμ΄μ νΈ μ€μ νμΌ νμ±
// 2. ν둬ννΈ λ‘λ©
// 3. LLM ν΄λΌμ΄μΈνΈ μ΄κΈ°ν
// 4. μμ΄μ νΈ μμ±
// 5. μμ‘΄μ± μ£Όμ
μ€μ
Ironbees μ¬μ© μ:
// νμΌ κ΅¬μ‘°λ§ λ§μΆλ©΄ λ
services.AddIronbees(options => {
options.AzureOpenAIEndpoint = "...";
options.AgentsDirectory = "./agents";
});
await orchestrator.LoadAgentsAsync();
var result = await orchestrator.ProcessAsync("μμ²", "agent-name");
π¦ μ€μΉ
dotnet add package Ironbees.Core
dotnet add package Ironbees.AgentFramework # Azure OpenAI + Microsoft Agent Frameworkμ©
π λΉ λ₯Έ μμ
1. μμ΄μ νΈ μ μ (νμΌμμ€ν 컨벀μ )
agents/
βββ coding-agent/
βββ agent.yaml # νμ: μμ΄μ νΈ λ©νλ°μ΄ν°
βββ system-prompt.md # νμ: μμ€ν
ν둬ννΈ
agents/coding-agent/agent.yaml:
name: coding-agent
description: Expert software developer
capabilities: [code-generation, code-review]
tags: [programming, development]
model:
deployment: gpt-4
temperature: 0.7
agents/coding-agent/system-prompt.md:
You are an expert software developer specializing in C# and .NET...
2. μλΉμ€ ꡬμ±
κΈ°λ³Έ κ΅¬μ± (Azure.AI.OpenAI ChatClient):
services.AddIronbees(options =>
{
options.AzureOpenAIEndpoint = "https://your-resource.openai.azure.com";
options.AzureOpenAIKey = Environment.GetEnvironmentVariable("AZURE_OPENAI_KEY");
options.AgentsDirectory = "./agents";
});
Microsoft Agent Framework μ¬μ©:
services.AddIronbees(options =>
{
options.AzureOpenAIEndpoint = "https://your-resource.openai.azure.com";
options.AzureOpenAIKey = Environment.GetEnvironmentVariable("AZURE_OPENAI_KEY");
options.AgentsDirectory = "./agents";
options.UseMicrosoftAgentFramework = true; // π νλ μμν¬ μ ν
});
3. μμ΄μ νΈ μ¬μ©
var orchestrator = serviceProvider.GetRequiredService<IAgentOrchestrator>();
// μμ΄μ νΈ λ‘λ (νμΌμμ€ν
μμ μλ)
await orchestrator.LoadAgentsAsync();
// λ°©λ² 1: λͺ
μμ μμ΄μ νΈ μ ν
var response = await orchestrator.ProcessAsync(
"Write a C# method to calculate fibonacci numbers",
agentName: "coding-agent");
// λ°©λ² 2: μλ λΌμ°ν
(ν€μλ κΈ°λ°)
var response = await orchestrator.ProcessAsync(
"fibonacci numbers in C#"); // "coding" ν€μλλ‘ μλ λΌμ°ν
// λ°©λ² 3: μ€νΈλ¦¬λ° μλ΅ (λͺ
μμ μμ΄μ νΈ) π
await foreach (var chunk in orchestrator.StreamAsync(
"Write a blog post about AI",
agentName: "writing-agent"))
{
Console.Write(chunk); // μ€μκ° μ€νΈλ¦¬λ°
}
// λ°©λ² 4: μ€νΈλ¦¬λ° + μλ λΌμ°ν
(v0.1.6+) π
await foreach (var chunk in orchestrator.StreamAsync(
"fibonacci in Python")) // μλμΌλ‘ coding-agent μ ν
{
Console.Write(chunk); // μ€μκ° μ€νΈλ¦¬λ°
}
ποΈ μν€ν μ²
βββββββββββββββββββββββββββββββββββββββββββββββ
β Ironbees (μμ λνΌ) β
β β
FileSystemAgentLoader β
β - agents/ λλ ν°λ¦¬ μ€μΊ β
β - agent.yaml νμ± β
β - system-prompt.md λ‘λ© β
β β
KeywordAgentSelector β
β - ν€μλ κΈ°λ° λΌμ°ν
β
β β
ILLMFrameworkAdapter β
β - λ€μ€ νλ μμν¬ ν΅ν© β
βββββββββββββββββββββββββββββββββββββββββββββββ€
β Microsoft Agent Framework / Semantic Kernelβ
β β‘οΈ μ€μ μμ΄μ νΈ μ€ν β
β β‘οΈ μν¬νλ‘μ° μ€μΌμ€νΈλ μ΄μ
β
β β‘οΈ λꡬ ν΅ν©, MCP, λν κ΄λ¦¬ β
βββββββββββββββββββββββββββββββββββββββββββββββ
π νλ‘μ νΈ κ΅¬μ‘°
ironbees/
βββ src/
β βββ Ironbees.Core/ # νμΌμμ€ν
λ‘λ, λΌμ°ν
β βββ Ironbees.AgentFramework/ # Azure OpenAI + MS Agent Framework μ΄λν°
βββ agents/ # μμ΄μ νΈ μ μ (9κ° μμ )
βββ docs/ # μμΈ λ¬Έμ
βββ samples/ # μ€ν κ°λ₯ν μμ
βββ tests/ # λ¨μ ν
μ€νΈ (67κ°)
π λ€μ€ νλ μμν¬ μ§μ
Ironbeesλ ILLMFrameworkAdapter μΈν°νμ΄μ€λ₯Ό ν΅ν΄ λ€μν LLM νλ μμν¬μ ν΅ν©ν μ μμ΅λλ€:
| νλ μμν¬ | μν | ν¨ν€μ§ |
|---|---|---|
| Azure.AI.OpenAI ChatClient | β μ§μ | Ironbees.AgentFramework |
| Microsoft Agent Framework | β μ§μ | Ironbees.AgentFramework |
| OpenAI API | β μ§μ | Ironbees.Samples.Shared |
| GPU-Stack (OpenAI Compatible) | β μ§μ | Ironbees.Samples.Shared |
| Anthropic Claude | π κ³νλ¨ | - |
| Semantic Kernel | π κ³νλ¨ | - |
| LangChain | π κ³νλ¨ | - |
νλ μμν¬ μ νμ μ€μ νλκ·Έ νλλ‘:
options.UseMicrosoftAgentFramework = true; // or false
π λ¬Έμ
- μμ κ°μ΄λ - μμΈν μ€μΉ λ° κ΅¬μ±
- Microsoft Agent Framework ν΅ν©
- λ΄μ₯ μμ΄μ νΈ - 5κ°μ§ λ΄μ₯ μμ΄μ νΈ
- μν€ν μ² - μ€κ³ λ° νμ₯μ±
π― μ€κ³ μμΉ
Convention over Configuration
- νμΌ κ΅¬μ‘°μ λͺ λͺ κ·μΉμ λ°λ₯΄λ©΄ μ΅μ μ½λλ‘ λμ
agents/{name}/agent.yaml+system-prompt.md= μλ λ‘λ©
Thin Wrapper Philosophy
- LLM νλ μμν¬μ κΈ°λ₯μ μ¨κΈ°μ§ μκ³ λ³΄μ
- 볡μ‘ν μ€μΌμ€νΈλ μ΄μ μ κΈ°λ³Έ νλ μμν¬μ μμ
- 보μΌλ¬νλ μ΄νΈ μ κ±°μλ§ μ§μ€
Framework Agnostic
- Microsoft Agent Framework, Semantic Kernel, LangChain λ±κ³Ό ν΅ν©
ILLMFrameworkAdapterλ‘ μ νλ μμν¬ μΆκ° κ°λ₯
Extensibility First
- λͺ¨λ ν΅μ¬ μ»΄ν¬λνΈ κ΅μ²΄ κ°λ₯
IAgentLoader,IAgentSelector,ILLMFrameworkAdapter
π μμ
- OpenAISample - κΈ°λ³Έ μ¬μ©λ² (OpenAI API)
- GpuStackSample - λ‘컬 GPU μΈνλΌ (GPU-Stack) π
- WebApiSample - RESTful API μλ²
- EmbeddingSample - λ‘컬 ONNX μλ² λ© λ° μλ§¨ν± λΌμ°ν
β¨ μ΅μ κΈ°λ₯
v0.1.6 - StreamAsync μλ λΌμ°ν π
μ€μκ° μ€νΈλ¦¬λ°κ³Ό μλ μμ΄μ νΈ μ νμ κ²°ν©! API μΌκ΄μ± κ°μ .
μ£Όμ κΈ°λ₯:
- μ€νΈλ¦¬λ° + μλ μ ν:
ProcessAsyncμ λμΌν ν¨ν΄μΌλ‘StreamAsyncμλ λΌμ°ν μ§μ - API μΌκ΄μ±: λͺ¨λ μ£Όμ λ©μλμμ λͺ μμ /μλ μ ν μ€λ²λ‘λ μ 곡
- κ°μνλ μ½λ: 2λ¨κ³ νΈμΆ(μ ν β μ€νΈλ¦¬λ°)μ 1λ¨κ³λ‘ ν΅ν©
// μ΄μ : μλ μ ν νμ
var selection = await orchestrator.SelectAgentAsync(input);
await foreach (var chunk in orchestrator.StreamAsync(input, selection.SelectedAgent.Name))
{
Console.Write(chunk);
}
// μ΄μ : μλ μ ν ν΅ν© (v0.1.6+)
await foreach (var chunk in orchestrator.StreamAsync(input))
{
Console.Write(chunk); // μλμΌλ‘ μ΅μ μμ΄μ νΈ μ ν ν μ€νΈλ¦¬λ°
}
κΈ°μ μμΈ:
- λ΄λΆμ μΌλ‘
SelectAgentAsyncμ¬μ¬μ©μΌλ‘ μΌκ΄λ μ ν λ‘μ§ - μμ΄μ νΈλ₯Ό μ°Ύμ§ λͺ»ν κ²½μ° λͺ νν μλ¬ λ©μμ§ μ€νΈλ¦¬λ°
[EnumeratorCancellation]μμ±μΌλ‘ μ μ ν μ·¨μ μ²λ¦¬
v0.1.5 - Local ONNX Embeddings
λ‘컬 ONNX λͺ¨λΈλ‘ μμ λ¬΄λ£ μλ² λ© μ§μ! API ν€ λΆνμ, μμ ν μ€νλΌμΈ λμ.
μ£Όμ κΈ°λ₯:
- μλ λͺ¨λΈ λ€μ΄λ‘λ: 첫 μ€ν μ Hugging Faceμμ μλ λ€μ΄λ‘λ (~23-45MB)
- 2κ°μ§ λͺ¨λΈ μ§μ:
all-MiniLM-L6-v2: λΉ λ₯Έ μλ (κΈ°λ³Έκ°, ~14K sent/sec, 84-85% μ νλ)all-MiniLM-L12-v2: λμ μ νλ (~4K sent/sec, 87-88% μ νλ)
- ν¬λ‘μ€ νλ«νΌ: Windows, Linux, macOS μ§μ
- μλ§¨ν± μμ΄μ νΈ μ ν: EmbeddingAgentSelectorλ‘ μλ―Έ κΈ°λ° λΌμ°ν
- νμ΄λΈλ¦¬λ μ ν: ν€μλ(40%) + μλ² λ©(60%) κ²°ν©
// λ‘컬 ONNX μλ² λ© νλ‘λ°μ΄λ μμ± (첫 μ€ν μ μλ λ€μ΄λ‘λ)
var provider = await OnnxEmbeddingProvider.CreateAsync(
OnnxEmbeddingProvider.ModelType.MiniLML6V2);
// ν
μ€νΈλ₯Ό 384μ°¨μ 벑ν°λ‘ λ³ν
var embedding = await provider.GenerateEmbeddingAsync("Write Python code");
// μλ² λ© κΈ°λ° μμ΄μ νΈ μ ν
var selector = new EmbeddingAgentSelector(provider);
var result = await selector.SelectAgentAsync("secure my web app", agents);
// β Security Specialist μ ν (ν€μλ μμ΄λ μλ§¨ν± λ§€μΉ)
// νμ΄λΈλ¦¬λ μ ν (ν€μλ + μλ² λ©)
var hybridSelector = new HybridAgentSelector(
new KeywordAgentSelector(),
new EmbeddingAgentSelector(provider));
var result = await hybridSelector.SelectAgentAsync("python security", agents);
// β ν€μλμ μλ―Έλ₯Ό λͺ¨λ κ³ λ €ν μ΅μ μ ν
λͺ¨λΈ λΉκ΅: | λͺ¨λΈ | ν¬κΈ° | μλ | μ νλ | μ©λ | |------|------|------|--------|------| | L6-v2 (κΈ°λ³Έκ°) | ~23MB | ~14K sent/sec | 84-85% | μ€μκ° μ±, 리μμ€ μ ν νκ²½ | | L12-v2 | ~45MB | ~4K sent/sec | 87-88% | λ²λ₯ λ¬Έμ, νμ λ Όλ¬Έ, κ³ νμ§ μꡬ |
μν μ½λ: EmbeddingSample
v0.1.1 - ν₯μλ KeywordAgentSelector
- TF-IDF κ°μ€μΉ: μ©μ΄ κ΄λ ¨μ± κΈ°λ° μ€μ½μ΄λ§μΌλ‘ μ νλ ν₯μ
- μ€λ§νΈ μ κ·ν: 50+ λμμ΄ κ·Έλ£Ή, 100+ μ΄κ° μΆμΆ κ·μΉ (codeβprogramming, dbβdatabase)
- μ±λ₯ μΊμ±: λ°λ³΅ 쿼리 ~50% μλ ν₯μ
- νμ₯λ λΆμ©μ΄: 80+ λΆμ©μ΄, .NET κΈ°μ μ©μ΄ 보쑴
- μ νλ: 88% (50κ° ν μ€νΈ μΌμ΄μ€)
- μλ: < 1ms λ¨μΌ μ ν, 1000ν < 100ms
// λμΌν API, ν₯μλ μ±λ₯κ³Ό μ νλ
var result = await orchestrator.ProcessAsync("Write C# code", "coding-agent");
// μ΄μ "code", "coding", "programming" λͺ¨λ λ§€μΉ
// TF-IDFλ‘ λ κ΄λ ¨μ± λμ μμ΄μ νΈ μ ν
πΊοΈ λ‘λλ§΅
v0.1.6 - νμ¬ β
- StreamAsync μλ λΌμ°ν
- API μΌκ΄μ± κ°μ
- GpuStackAdapter μμ±
v0.1.5 - ONNX Embeddings β
- λ‘컬 ONNX μλ² λ© νλ‘λ°μ΄λ (all-MiniLM-L6-v2, L12-v2)
- μλ λͺ¨λΈ λ€μ΄λ‘λ λ° μΊμ±
- EmbeddingAgentSelector (μλ§¨ν± μμ΄μ νΈ μ ν)
- HybridAgentSelector (ν€μλ + μλ² λ©)
- μμ 무λ£, API ν€ λΆνμ
v0.1.4 - μλ² λ© κΈ°λ° λΌμ°ν β
- IEmbeddingProvider μΈν°νμ΄μ€
- VectorSimilarity μ νΈλ¦¬ν°
- μ½μ¬μΈ μ μ¬λ κ³μ°
- μλ² λ© μΊμ± μ΅μ ν
v0.1.1 - TF-IDF ν€μλ μ ν β
- TF-IDF κ°μ€μΉ μκ³ λ¦¬μ¦
- ν€μλ μ κ·ν (λμμ΄, μ΄κ° μΆμΆ)
- μ±λ₯ μΊμ±
- νμ₯λ λΆμ©μ΄ μ¬μ
- 88% μ ν μ νλ
v0.1.0 - μ΄κΈ° λ¦΄λ¦¬μ€ β
- νμΌμμ€ν 컨벀μ κΈ°λ° λ‘λ
- Azure OpenAI ν΅ν©
- Microsoft Agent Framework ν΅ν©
- ν€μλ κΈ°λ° λΌμ°ν
- λ€μ€ νλ μμν¬ μ΄λν°
v0.2.0 - κ³ν
- Semantic Kernel μ΄λν°
- OpenAI/Azure OpenAI μλ² λ© νλ‘λ°μ΄λ
- μ±λ₯ μ΅μ ν
- μΆκ° μμ λ° λ¬Έμ
v0.3.0 - κ³ν
- LangChain μ΄λν°
- CLI λꡬ
- λ²‘ν° DB ν΅ν© (μ νμ )
π§ͺ ν μ€νΈ
ν μ€νΈ μΉ΄ν κ³ λ¦¬
Ironbeesλ ν μ€νΈλ₯Ό μΉ΄ν κ³ λ¦¬λ‘ κ΅¬λΆνμ¬ ν¨μ¨μ μΈ ν μ€νΈ μ€νμ μ§μν©λλ€:
| μΉ΄ν κ³ λ¦¬ | μ€λͺ | CI μ€ν | λ‘컬 μ€ν |
|---|---|---|---|
| Unit | λΉ λ₯Έ λ¨μ ν μ€νΈ (mock μ¬μ©) | β νμ | β κΆμ₯ |
| Performance | λ©λͺ¨λ¦¬/μ±λ₯ ν μ€νΈ (GC, λμμ±) | β μ μΈ | β κΆμ₯ |
| Integration | μΈλΆ μλΉμ€ ν μ€νΈ (API ν€ νμ) | βΈοΈ μ νμ | β οΈ νκ²½ νμ |
λΉ λ₯Έ μ€ν
# λͺ¨λ ν
μ€νΈ (λ‘컬 κΆμ₯)
dotnet test
# CI ν
μ€νΈλ§ (Performance μ μΈ)
dotnet test --filter "Category!=Performance"
# Unit ν
μ€νΈλ§
dotnet test --filter "Category!=Performance&Category!=Integration"
ν μ€νΈ μ€ν¬λ¦½νΈ μ¬μ©
Windows (PowerShell):
# μ 체 ν
μ€νΈ (Performance ν¬ν¨)
.\run-tests.ps1 -Category all
# CI ν
μ€νΈ (Performance μ μΈ)
.\run-tests.ps1 -Category ci
# Unit ν
μ€νΈλ§
.\run-tests.ps1 -Category unit
# Performance ν
μ€νΈλ§
.\run-tests.ps1 -Category performance
# 컀λ²λ¦¬μ§ ν¬ν¨
.\run-tests.ps1 -Category all -Coverage
Linux/macOS (Bash):
# μ€ν¬λ¦½νΈ μ€ν κΆν λΆμ¬
chmod +x run-tests.sh
# μ 체 ν
μ€νΈ
./run-tests.sh --category all
# CI ν
μ€νΈ
./run-tests.sh --category ci
# Unit ν
μ€νΈλ§
./run-tests.sh --category unit
# 컀λ²λ¦¬μ§ ν¬ν¨
./run-tests.sh --category all --coverage
ν μ€νΈ ν΅κ³ (v0.1.6)
Total: 169 tests
ββ Unit: 166 tests β
ββ Performance: 3 tests β
(λ‘컬 μ μ©)
ββ Integration: 3 tests βΈοΈ (νκ²½ νμ)
CI Status: 166/166 passed (100%)
Local Status: 169/169 passed (100%)
π€ κΈ°μ¬
μ΄μμ PRμ νμν©λλ€.
ν΅μ¬ μ² ν μ μ§:
- μμ λνΌλ‘ μ μ§
- κ³Όλν κΈ°λ₯ μΆκ° μ§μ
- νμΌμμ€ν 컨벀μ μ€μ¬
π λΌμ΄μ μ€
MIT License - LICENSE μ°Έμ‘°
Ironbees - Filesystem convention-based LLM agent wrapper for .NET π
λ²μ : 0.1.6 | .NET: 9.0+ | μν: μ€νμ
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Azure.AI.OpenAI (>= 2.5.0-beta.1)
- Azure.Identity (>= 1.17.0)
- Ironbees.Core (>= 0.1.5)
- Microsoft.Agents.AI (>= 1.0.0-preview.251114.1)
- Microsoft.Agents.AI.OpenAI (>= 1.0.0-preview.251114.1)
- Microsoft.Extensions.AI (>= 10.0.0)
- Microsoft.Extensions.AI.Abstractions (>= 10.0.0)
- Microsoft.Extensions.AI.OpenAI (>= 10.0.0-preview.1.25560.10)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.0)
- Microsoft.ML.OnnxRuntime (>= 1.23.2)
- OpenAI (>= 2.7.0)
- YamlDotNet (>= 16.3.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.1.5 | 329 | 11/18/2025 |
| 0.1.2 | 226 | 11/11/2025 |
| 0.1.0-preview | 139 | 10/30/2025 |
See CHANGELOG.md for release notes