初始化提交
Some checks failed
CI / Check / macos-latest (push) Has been cancelled
CI / Check / ubuntu-latest (push) Has been cancelled
CI / Check / windows-latest (push) Has been cancelled
CI / Test / macos-latest (push) Has been cancelled
CI / Test / ubuntu-latest (push) Has been cancelled
CI / Test / windows-latest (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Format (push) Has been cancelled
CI / Security Audit (push) Has been cancelled
CI / Secrets Scan (push) Has been cancelled
CI / Install Script Smoke Test (push) Has been cancelled
Some checks failed
CI / Check / macos-latest (push) Has been cancelled
CI / Check / ubuntu-latest (push) Has been cancelled
CI / Check / windows-latest (push) Has been cancelled
CI / Test / macos-latest (push) Has been cancelled
CI / Test / ubuntu-latest (push) Has been cancelled
CI / Test / windows-latest (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Format (push) Has been cancelled
CI / Security Audit (push) Has been cancelled
CI / Secrets Scan (push) Has been cancelled
CI / Install Script Smoke Test (push) Has been cancelled
This commit is contained in:
164
docs/benchmarks/architecture-overview.svg
Normal file
164
docs/benchmarks/architecture-overview.svg
Normal file
@@ -0,0 +1,164 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 900 640" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif">
|
||||
<defs>
|
||||
<linearGradient id="kern" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#10b981"/>
|
||||
<stop offset="100%" stop-color="#059669"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="rt" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#3b82f6"/>
|
||||
<stop offset="100%" stop-color="#2563eb"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="api" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#8b5cf6"/>
|
||||
<stop offset="100%" stop-color="#7c3aed"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="ch" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#f59e0b"/>
|
||||
<stop offset="100%" stop-color="#d97706"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="mem" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#ec4899"/>
|
||||
<stop offset="100%" stop-color="#db2777"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="ext" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#06b6d4"/>
|
||||
<stop offset="100%" stop-color="#0891b2"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!-- Background -->
|
||||
<rect width="900" height="640" rx="12" fill="#0f172a"/>
|
||||
|
||||
<!-- Title -->
|
||||
<text x="450" y="32" text-anchor="middle" fill="#f1f5f9" font-size="18" font-weight="700">OpenFang — Agent Operating System Architecture</text>
|
||||
<text x="450" y="50" text-anchor="middle" fill="#64748b" font-size="11">14 crates | 137K lines of Rust | single binary</text>
|
||||
|
||||
<!-- === User Layer === -->
|
||||
<rect x="30" y="65" width="840" height="55" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1"/>
|
||||
<text x="50" y="82" fill="#94a3b8" font-size="9" font-weight="600" letter-spacing="1">USER SPACE</text>
|
||||
<rect x="50" y="90" width="120" height="24" rx="4" fill="#334155"/>
|
||||
<text x="110" y="106" text-anchor="middle" fill="#e2e8f0" font-size="10" font-weight="600">Desktop (Tauri)</text>
|
||||
<rect x="185" y="90" width="90" height="24" rx="4" fill="#334155"/>
|
||||
<text x="230" y="106" text-anchor="middle" fill="#e2e8f0" font-size="10" font-weight="600">CLI + TUI</text>
|
||||
<rect x="290" y="90" width="90" height="24" rx="4" fill="#334155"/>
|
||||
<text x="335" y="106" text-anchor="middle" fill="#e2e8f0" font-size="10" font-weight="600">Web Dashboard</text>
|
||||
<rect x="395" y="90" width="90" height="24" rx="4" fill="#334155"/>
|
||||
<text x="440" y="106" text-anchor="middle" fill="#e2e8f0" font-size="10" font-weight="600">JS/Python SDK</text>
|
||||
<rect x="500" y="90" width="130" height="24" rx="4" fill="#334155"/>
|
||||
<text x="565" y="106" text-anchor="middle" fill="#e2e8f0" font-size="10" font-weight="600">OpenAI-compat API</text>
|
||||
<rect x="645" y="90" width="70" height="24" rx="4" fill="#334155"/>
|
||||
<text x="680" y="106" text-anchor="middle" fill="#e2e8f0" font-size="10" font-weight="600">MCP</text>
|
||||
<rect x="730" y="90" width="60" height="24" rx="4" fill="#334155"/>
|
||||
<text x="760" y="106" text-anchor="middle" fill="#e2e8f0" font-size="10" font-weight="600">A2A</text>
|
||||
|
||||
<!-- Arrow down -->
|
||||
<line x1="450" y1="120" x2="450" y2="135" stroke="#475569" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
|
||||
<!-- === API Layer === -->
|
||||
<rect x="30" y="135" width="840" height="70" rx="8" fill="url(#api)" opacity="0.15" stroke="#8b5cf6" stroke-width="1"/>
|
||||
<text x="50" y="153" fill="#a78bfa" font-size="9" font-weight="600" letter-spacing="1">API GATEWAY — openfang-api</text>
|
||||
<text x="50" y="172" fill="#c4b5fd" font-size="10">140 REST endpoints | WebSocket streaming | SSE events | GCRA rate limiter</text>
|
||||
<text x="50" y="189" fill="#c4b5fd" font-size="10">Security headers (CSP/HSTS) | CORS | Health redaction | File uploads | Approval queue</text>
|
||||
|
||||
<!-- Arrow down -->
|
||||
<line x1="450" y1="205" x2="450" y2="218" stroke="#475569" stroke-width="2"/>
|
||||
|
||||
<!-- === Kernel Layer === -->
|
||||
<rect x="30" y="218" width="840" height="85" rx="8" fill="url(#kern)" opacity="0.15" stroke="#10b981" stroke-width="1.5"/>
|
||||
<text x="50" y="237" fill="#34d399" font-size="9" font-weight="600" letter-spacing="1">KERNEL — openfang-kernel</text>
|
||||
<rect x="50" y="245" width="95" height="20" rx="3" fill="#10b98133"/>
|
||||
<text x="97" y="259" text-anchor="middle" fill="#a7f3d0" font-size="9">Agent Registry</text>
|
||||
<rect x="152" y="245" width="75" height="20" rx="3" fill="#10b98133"/>
|
||||
<text x="189" y="259" text-anchor="middle" fill="#a7f3d0" font-size="9">Scheduler</text>
|
||||
<rect x="234" y="245" width="85" height="20" rx="3" fill="#10b98133"/>
|
||||
<text x="276" y="259" text-anchor="middle" fill="#a7f3d0" font-size="9">Capabilities</text>
|
||||
<rect x="326" y="245" width="85" height="20" rx="3" fill="#10b98133"/>
|
||||
<text x="368" y="259" text-anchor="middle" fill="#a7f3d0" font-size="9">Workflow Eng</text>
|
||||
<rect x="418" y="245" width="70" height="20" rx="3" fill="#10b98133"/>
|
||||
<text x="453" y="259" text-anchor="middle" fill="#a7f3d0" font-size="9">RBAC Auth</text>
|
||||
<rect x="495" y="245" width="75" height="20" rx="3" fill="#10b98133"/>
|
||||
<text x="532" y="259" text-anchor="middle" fill="#a7f3d0" font-size="9">Metering</text>
|
||||
<rect x="577" y="245" width="70" height="20" rx="3" fill="#10b98133"/>
|
||||
<text x="612" y="259" text-anchor="middle" fill="#a7f3d0" font-size="9">EventBus</text>
|
||||
<rect x="654" y="245" width="70" height="20" rx="3" fill="#10b98133"/>
|
||||
<text x="689" y="259" text-anchor="middle" fill="#a7f3d0" font-size="9">Heartbeat</text>
|
||||
<rect x="731" y="245" width="60" height="20" rx="3" fill="#10b98133"/>
|
||||
<text x="761" y="259" text-anchor="middle" fill="#a7f3d0" font-size="9">Wizard</text>
|
||||
|
||||
<rect x="50" y="272" width="95" height="20" rx="3" fill="#10b98133"/>
|
||||
<text x="97" y="286" text-anchor="middle" fill="#a7f3d0" font-size="9">Hot Reload</text>
|
||||
<rect x="152" y="272" width="95" height="20" rx="3" fill="#10b98133"/>
|
||||
<text x="199" y="286" text-anchor="middle" fill="#a7f3d0" font-size="9">Budget Manager</text>
|
||||
<rect x="254" y="272" width="85" height="20" rx="3" fill="#10b98133"/>
|
||||
<text x="296" y="286" text-anchor="middle" fill="#a7f3d0" font-size="9">Approvals</text>
|
||||
<rect x="346" y="272" width="100" height="20" rx="3" fill="#10b98133"/>
|
||||
<text x="396" y="286" text-anchor="middle" fill="#a7f3d0" font-size="9">Device Pairing</text>
|
||||
<rect x="453" y="272" width="105" height="20" rx="3" fill="#10b98133"/>
|
||||
<text x="505" y="286" text-anchor="middle" fill="#a7f3d0" font-size="9">Graceful Shutdown</text>
|
||||
<rect x="565" y="272" width="110" height="20" rx="3" fill="#10b98133"/>
|
||||
<text x="620" y="286" text-anchor="middle" fill="#a7f3d0" font-size="9">Circuit Breakers</text>
|
||||
|
||||
<!-- Arrow down to runtime and channels -->
|
||||
<line x1="300" y1="303" x2="300" y2="318" stroke="#475569" stroke-width="2"/>
|
||||
<line x1="600" y1="303" x2="600" y2="318" stroke="#475569" stroke-width="2"/>
|
||||
|
||||
<!-- === Runtime (left) === -->
|
||||
<rect x="30" y="318" width="420" height="110" rx="8" fill="url(#rt)" opacity="0.12" stroke="#3b82f6" stroke-width="1"/>
|
||||
<text x="50" y="337" fill="#60a5fa" font-size="9" font-weight="600" letter-spacing="1">RUNTIME — openfang-runtime</text>
|
||||
<text x="50" y="354" fill="#93c5fd" font-size="10">Agent loop (streaming) | 3 LLM drivers | 53 tools</text>
|
||||
<text x="50" y="369" fill="#93c5fd" font-size="10">WASM sandbox (dual metering) | MCP client/server</text>
|
||||
<text x="50" y="384" fill="#93c5fd" font-size="10">Loop guard | Session repair | Auth cooldown</text>
|
||||
<text x="50" y="399" fill="#93c5fd" font-size="10">Web search (4 engines) | Browser automation</text>
|
||||
<text x="50" y="414" fill="#93c5fd" font-size="10">TTS/STT | Image gen | Docker sandbox | Compactor</text>
|
||||
|
||||
<!-- === Channels + Skills (right) === -->
|
||||
<rect x="460" y="318" width="200" height="110" rx="8" fill="url(#ch)" opacity="0.12" stroke="#f59e0b" stroke-width="1"/>
|
||||
<text x="480" y="337" fill="#fbbf24" font-size="9" font-weight="600" letter-spacing="1">CHANNELS</text>
|
||||
<text x="480" y="354" fill="#fde68a" font-size="10">40 adapters</text>
|
||||
<text x="480" y="369" fill="#fde68a" font-size="10">Bridge + Router</text>
|
||||
<text x="480" y="384" fill="#fde68a" font-size="10">Rate limiter</text>
|
||||
<text x="480" y="399" fill="#fde68a" font-size="10">DM/group policy</text>
|
||||
<text x="480" y="414" fill="#fde68a" font-size="10">Formatter</text>
|
||||
|
||||
<rect x="670" y="318" width="200" height="110" rx="8" fill="url(#ext)" opacity="0.12" stroke="#06b6d4" stroke-width="1"/>
|
||||
<text x="690" y="337" fill="#22d3ee" font-size="9" font-weight="600" letter-spacing="1">SKILLS + HANDS</text>
|
||||
<text x="690" y="354" fill="#a5f3fc" font-size="10">60 bundled skills</text>
|
||||
<text x="690" y="369" fill="#a5f3fc" font-size="10">7 autonomous Hands</text>
|
||||
<text x="690" y="384" fill="#a5f3fc" font-size="10">SKILL.md parser</text>
|
||||
<text x="690" y="399" fill="#a5f3fc" font-size="10">FangHub marketplace</text>
|
||||
<text x="690" y="414" fill="#a5f3fc" font-size="10">Injection scanner</text>
|
||||
|
||||
<!-- Arrow down to memory -->
|
||||
<line x1="450" y1="428" x2="450" y2="443" stroke="#475569" stroke-width="2"/>
|
||||
|
||||
<!-- === Memory Layer === -->
|
||||
<rect x="30" y="443" width="540" height="60" rx="8" fill="url(#mem)" opacity="0.12" stroke="#ec4899" stroke-width="1"/>
|
||||
<text x="50" y="462" fill="#f472b6" font-size="9" font-weight="600" letter-spacing="1">MEMORY — openfang-memory</text>
|
||||
<text x="50" y="479" fill="#fbcfe8" font-size="10">SQLite (KV + relational) | Vector embeddings | Usage tracking | Canonical sessions | JSONL mirror</text>
|
||||
<text x="50" y="494" fill="#fbcfe8" font-size="10">Schema v7 | Session compaction | Knowledge graphs</text>
|
||||
|
||||
<!-- === Extensions Layer === -->
|
||||
<rect x="580" y="443" width="290" height="60" rx="8" fill="#1e293b" stroke="#475569" stroke-width="1"/>
|
||||
<text x="600" y="462" fill="#94a3b8" font-size="9" font-weight="600" letter-spacing="1">EXTENSIONS</text>
|
||||
<text x="600" y="479" fill="#cbd5e1" font-size="10">25 MCP templates | AES-256 vault</text>
|
||||
<text x="600" y="494" fill="#cbd5e1" font-size="10">OAuth2 PKCE | Health monitor</text>
|
||||
|
||||
<!-- === Foundation Layer === -->
|
||||
<rect x="30" y="515" width="840" height="55" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1"/>
|
||||
<text x="50" y="534" fill="#94a3b8" font-size="9" font-weight="600" letter-spacing="1">FOUNDATION</text>
|
||||
<rect x="50" y="541" width="110" height="22" rx="3" fill="#334155"/>
|
||||
<text x="105" y="556" text-anchor="middle" fill="#e2e8f0" font-size="9">openfang-types</text>
|
||||
<rect x="170" y="541" width="100" height="22" rx="3" fill="#334155"/>
|
||||
<text x="220" y="556" text-anchor="middle" fill="#e2e8f0" font-size="9">openfang-wire</text>
|
||||
<rect x="280" y="541" width="120" height="22" rx="3" fill="#334155"/>
|
||||
<text x="340" y="556" text-anchor="middle" fill="#e2e8f0" font-size="9">openfang-migrate</text>
|
||||
<rect x="410" y="541" width="110" height="22" rx="3" fill="#334155"/>
|
||||
<text x="465" y="556" text-anchor="middle" fill="#e2e8f0" font-size="9">openfang-hands</text>
|
||||
<rect x="530" y="541" width="130" height="22" rx="3" fill="#334155"/>
|
||||
<text x="595" y="556" text-anchor="middle" fill="#e2e8f0" font-size="9">openfang-extensions</text>
|
||||
|
||||
<!-- Footer -->
|
||||
<text x="450" y="598" text-anchor="middle" fill="#475569" font-size="10">Taint tracking | Ed25519 manifests | Merkle audit | SSRF protection | Zeroizing secrets</text>
|
||||
<text x="450" y="614" text-anchor="middle" fill="#475569" font-size="10">OFP mutual auth | Path traversal prevention | Subprocess sandbox | Prompt injection scanning</text>
|
||||
<text x="450" y="630" text-anchor="middle" fill="#334155" font-size="9">16 independent security systems woven through every layer</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 11 KiB |
116
docs/benchmarks/feature-coverage.svg
Normal file
116
docs/benchmarks/feature-coverage.svg
Normal file
@@ -0,0 +1,116 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 480" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif">
|
||||
<defs>
|
||||
<linearGradient id="of" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#10b981"/>
|
||||
<stop offset="100%" stop-color="#059669"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="oc" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#6366f1"/>
|
||||
<stop offset="100%" stop-color="#4f46e5"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="lc" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#f59e0b"/>
|
||||
<stop offset="100%" stop-color="#d97706"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!-- Background -->
|
||||
<rect width="800" height="480" rx="12" fill="#0f172a"/>
|
||||
|
||||
<!-- Title -->
|
||||
<text x="400" y="36" text-anchor="middle" fill="#f1f5f9" font-size="16" font-weight="700">Feature Coverage Comparison</text>
|
||||
<text x="400" y="54" text-anchor="middle" fill="#94a3b8" font-size="11">Counted from public documentation and source code analysis</text>
|
||||
|
||||
<!-- Legend -->
|
||||
<rect x="220" y="68" width="12" height="12" rx="2" fill="url(#of)"/>
|
||||
<text x="237" y="79" fill="#e2e8f0" font-size="11" font-weight="600">OpenFang</text>
|
||||
<rect x="320" y="68" width="12" height="12" rx="2" fill="url(#oc)"/>
|
||||
<text x="337" y="79" fill="#e2e8f0" font-size="11">OpenClaw</text>
|
||||
<rect x="420" y="68" width="12" height="12" rx="2" fill="url(#lc)"/>
|
||||
<text x="437" y="79" fill="#e2e8f0" font-size="11">LangChain</text>
|
||||
|
||||
<!-- Grid lines -->
|
||||
<line x1="100" y1="105" x2="760" y2="105" stroke="#1e293b" stroke-width="1"/>
|
||||
<line x1="100" y1="400" x2="760" y2="400" stroke="#334155" stroke-width="1"/>
|
||||
|
||||
<!-- Category labels (bottom) -->
|
||||
<text x="165" y="425" text-anchor="middle" fill="#94a3b8" font-size="10">Channels</text>
|
||||
<text x="275" y="425" text-anchor="middle" fill="#94a3b8" font-size="10">Skills</text>
|
||||
<text x="385" y="425" text-anchor="middle" fill="#94a3b8" font-size="10">Tools</text>
|
||||
<text x="495" y="425" text-anchor="middle" fill="#94a3b8" font-size="10">Providers</text>
|
||||
<text x="605" y="425" text-anchor="middle" fill="#94a3b8" font-size="10">API Endpoints</text>
|
||||
<text x="715" y="425" text-anchor="middle" fill="#94a3b8" font-size="10">Tests</text>
|
||||
|
||||
<!-- Scale markers -->
|
||||
<text x="95" y="403" text-anchor="end" fill="#475569" font-size="9">0</text>
|
||||
<text x="95" y="109" text-anchor="end" fill="#475569" font-size="9">max</text>
|
||||
|
||||
<!-- === Channels (max ~40) === -->
|
||||
<!-- OpenFang: 40 -->
|
||||
<rect x="130" y="112" width="24" height="284" rx="3" fill="url(#of)" opacity="0.95"/>
|
||||
<text x="142" y="107" text-anchor="middle" fill="#10b981" font-size="11" font-weight="700">40</text>
|
||||
<!-- OpenClaw: 38 -->
|
||||
<rect x="158" y="126" width="24" height="270" rx="3" fill="url(#oc)" opacity="0.85"/>
|
||||
<text x="170" y="121" text-anchor="middle" fill="#818cf8" font-size="10">38</text>
|
||||
<!-- LangChain: 0 -->
|
||||
<rect x="186" y="396" width="24" height="0" rx="3" fill="url(#lc)"/>
|
||||
<text x="198" y="393" text-anchor="middle" fill="#fbbf24" font-size="10">0</text>
|
||||
|
||||
<!-- === Skills (max ~60) === -->
|
||||
<!-- OpenFang: 60 -->
|
||||
<rect x="240" y="112" width="24" height="284" rx="3" fill="url(#of)" opacity="0.95"/>
|
||||
<text x="252" y="107" text-anchor="middle" fill="#10b981" font-size="11" font-weight="700">60</text>
|
||||
<!-- OpenClaw: 57 -->
|
||||
<rect x="268" y="126" width="24" height="270" rx="3" fill="url(#oc)" opacity="0.85"/>
|
||||
<text x="280" y="121" text-anchor="middle" fill="#818cf8" font-size="10">57</text>
|
||||
<!-- LangChain: 0 -->
|
||||
<rect x="296" y="396" width="24" height="0" rx="3" fill="url(#lc)"/>
|
||||
<text x="308" y="393" text-anchor="middle" fill="#fbbf24" font-size="10">0</text>
|
||||
|
||||
<!-- === Tools (max ~53) === -->
|
||||
<!-- OpenFang: 53 -->
|
||||
<rect x="350" y="112" width="24" height="284" rx="3" fill="url(#of)" opacity="0.95"/>
|
||||
<text x="362" y="107" text-anchor="middle" fill="#10b981" font-size="11" font-weight="700">53</text>
|
||||
<!-- OpenClaw: 15 -->
|
||||
<rect x="378" y="318" width="24" height="78" rx="3" fill="url(#oc)" opacity="0.85"/>
|
||||
<text x="390" y="313" text-anchor="middle" fill="#818cf8" font-size="10">15</text>
|
||||
<!-- LangChain: varies -->
|
||||
<rect x="406" y="352" width="24" height="44" rx="3" fill="url(#lc)" opacity="0.85"/>
|
||||
<text x="418" y="347" text-anchor="middle" fill="#fbbf24" font-size="10">~8</text>
|
||||
|
||||
<!-- === Providers (max ~27) === -->
|
||||
<!-- OpenFang: 27 -->
|
||||
<rect x="460" y="112" width="24" height="284" rx="3" fill="url(#of)" opacity="0.95"/>
|
||||
<text x="472" y="107" text-anchor="middle" fill="#10b981" font-size="11" font-weight="700">27</text>
|
||||
<!-- OpenClaw: 3 -->
|
||||
<rect x="488" y="365" width="24" height="31" rx="3" fill="url(#oc)" opacity="0.85"/>
|
||||
<text x="500" y="360" text-anchor="middle" fill="#818cf8" font-size="10">3</text>
|
||||
<!-- LangChain: many -->
|
||||
<rect x="516" y="195" width="24" height="201" rx="3" fill="url(#lc)" opacity="0.85"/>
|
||||
<text x="528" y="190" text-anchor="middle" fill="#fbbf24" font-size="10">~20</text>
|
||||
|
||||
<!-- === API Endpoints (max ~140) === -->
|
||||
<!-- OpenFang: 140 -->
|
||||
<rect x="570" y="112" width="24" height="284" rx="3" fill="url(#of)" opacity="0.95"/>
|
||||
<text x="582" y="107" text-anchor="middle" fill="#10b981" font-size="11" font-weight="700">140</text>
|
||||
<!-- OpenClaw: ~30 -->
|
||||
<rect x="598" y="339" width="24" height="57" rx="3" fill="url(#oc)" opacity="0.85"/>
|
||||
<text x="610" y="334" text-anchor="middle" fill="#818cf8" font-size="10">~30</text>
|
||||
<!-- LangChain: N/A -->
|
||||
<rect x="626" y="396" width="24" height="0" rx="3" fill="url(#lc)"/>
|
||||
<text x="638" y="393" text-anchor="middle" fill="#fbbf24" font-size="10">N/A</text>
|
||||
|
||||
<!-- === Tests (max ~1759) === -->
|
||||
<!-- OpenFang: 1759 -->
|
||||
<rect x="680" y="112" width="24" height="284" rx="3" fill="url(#of)" opacity="0.95"/>
|
||||
<text x="692" y="107" text-anchor="middle" fill="#10b981" font-size="10" font-weight="700">1759</text>
|
||||
<!-- OpenClaw: unknown -->
|
||||
<rect x="708" y="370" width="24" height="26" rx="3" fill="url(#oc)" opacity="0.5"/>
|
||||
<text x="720" y="365" text-anchor="middle" fill="#818cf8" font-size="10">?</text>
|
||||
<!-- LangChain: unknown -->
|
||||
<rect x="736" y="370" width="24" height="26" rx="3" fill="url(#lc)" opacity="0.5"/>
|
||||
<text x="748" y="365" text-anchor="middle" fill="#fbbf24" font-size="10">?</text>
|
||||
|
||||
<!-- Bottom note -->
|
||||
<text x="400" y="460" text-anchor="middle" fill="#64748b" font-size="10">All counts verified from source code. OpenClaw and LangChain counts from public documentation.</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.4 KiB |
58
docs/benchmarks/performance.svg
Normal file
58
docs/benchmarks/performance.svg
Normal file
@@ -0,0 +1,58 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 420" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif">
|
||||
<defs>
|
||||
<linearGradient id="pf" x1="0" y1="0" x2="1" y2="0">
|
||||
<stop offset="0%" stop-color="#10b981"/>
|
||||
<stop offset="100%" stop-color="#34d399"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pg" x1="0" y1="0" x2="1" y2="0">
|
||||
<stop offset="0%" stop-color="#6b7280"/>
|
||||
<stop offset="100%" stop-color="#9ca3af"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!-- Background -->
|
||||
<rect width="800" height="420" rx="12" fill="#0f172a"/>
|
||||
|
||||
<!-- Title -->
|
||||
<text x="400" y="36" text-anchor="middle" fill="#f1f5f9" font-size="16" font-weight="700">Runtime Performance — Cold Start & Resource Usage</text>
|
||||
<text x="400" y="54" text-anchor="middle" fill="#94a3b8" font-size="11">Native Rust binary vs. Python runtime overhead</text>
|
||||
|
||||
<!-- === Section 1: Startup Time === -->
|
||||
<text x="50" y="90" fill="#e2e8f0" font-size="13" font-weight="600">Cold Start Time</text>
|
||||
<text x="50" y="104" fill="#64748b" font-size="10">Time from process launch to first API response</text>
|
||||
|
||||
<text x="175" y="132" text-anchor="end" fill="#e2e8f0" font-size="11">OpenFang</text>
|
||||
<rect x="180" y="118" width="52" height="22" rx="3" fill="url(#pf)"/>
|
||||
<text x="238" y="133" fill="#10b981" font-size="12" font-weight="700"><200ms</text>
|
||||
|
||||
<text x="175" y="162" text-anchor="end" fill="#cbd5e1" font-size="11">OpenClaw</text>
|
||||
<rect x="180" y="148" width="320" height="22" rx="3" fill="url(#pg)"/>
|
||||
<text x="506" y="163" fill="#9ca3af" font-size="12" font-weight="600">~3.2s</text>
|
||||
|
||||
<text x="175" y="192" text-anchor="end" fill="#cbd5e1" font-size="11">AutoGPT</text>
|
||||
<rect x="180" y="178" width="520" height="22" rx="3" fill="url(#pg)"/>
|
||||
<text x="706" y="193" fill="#9ca3af" font-size="12" font-weight="600">~5.4s</text>
|
||||
|
||||
<!-- === Section 2: Binary / Install Size === -->
|
||||
<text x="50" y="240" fill="#e2e8f0" font-size="13" font-weight="600">Install Footprint</text>
|
||||
<text x="50" y="254" fill="#64748b" font-size="10">Total disk space required for full installation</text>
|
||||
|
||||
<text x="175" y="282" text-anchor="end" fill="#e2e8f0" font-size="11">OpenFang</text>
|
||||
<rect x="180" y="268" width="36" height="22" rx="3" fill="url(#pf)"/>
|
||||
<text x="222" y="283" fill="#10b981" font-size="12" font-weight="700">~32 MB</text>
|
||||
<text x="290" y="283" fill="#475569" font-size="10">(single binary)</text>
|
||||
|
||||
<text x="175" y="312" text-anchor="end" fill="#cbd5e1" font-size="11">OpenClaw</text>
|
||||
<rect x="180" y="298" width="230" height="22" rx="3" fill="url(#pg)"/>
|
||||
<text x="416" y="313" fill="#9ca3af" font-size="12" font-weight="600">~200 MB</text>
|
||||
<text x="490" y="313" fill="#475569" font-size="10">(Python + deps)</text>
|
||||
|
||||
<text x="175" y="342" text-anchor="end" fill="#cbd5e1" font-size="11">LangChain</text>
|
||||
<rect x="180" y="328" width="400" height="22" rx="3" fill="url(#pg)"/>
|
||||
<text x="586" y="343" fill="#9ca3af" font-size="12" font-weight="600">~350 MB</text>
|
||||
<text x="660" y="343" fill="#475569" font-size="10">(Python + deps)</text>
|
||||
|
||||
<!-- Bottom note -->
|
||||
<text x="400" y="390" text-anchor="middle" fill="#64748b" font-size="10">OpenFang compiled with Rust 1.93 (release profile, LTO enabled). Python frameworks measured with pip install + dependencies.</text>
|
||||
<text x="400" y="404" text-anchor="middle" fill="#64748b" font-size="10">Startup = time until HTTP health endpoint responds. Install size = du -sh after clean install.</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
55
docs/benchmarks/security-layers.svg
Normal file
55
docs/benchmarks/security-layers.svg
Normal file
@@ -0,0 +1,55 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 400" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif">
|
||||
<defs>
|
||||
<linearGradient id="sg" x1="0" y1="0" x2="1" y2="0">
|
||||
<stop offset="0%" stop-color="#10b981"/>
|
||||
<stop offset="100%" stop-color="#34d399"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="gg" x1="0" y1="0" x2="1" y2="0">
|
||||
<stop offset="0%" stop-color="#6b7280"/>
|
||||
<stop offset="100%" stop-color="#9ca3af"/>
|
||||
</linearGradient>
|
||||
<filter id="ds">
|
||||
<feDropShadow dx="0" dy="1" stdDeviation="2" flood-opacity="0.1"/>
|
||||
</filter>
|
||||
</defs>
|
||||
|
||||
<!-- Background -->
|
||||
<rect width="720" height="400" rx="12" fill="#0f172a"/>
|
||||
|
||||
<!-- Title -->
|
||||
<text x="360" y="38" text-anchor="middle" fill="#f1f5f9" font-size="16" font-weight="700">Security Defense Layers — Independent Systems Count</text>
|
||||
<text x="360" y="58" text-anchor="middle" fill="#94a3b8" font-size="11">Measured: discrete, independently testable security mechanisms per framework</text>
|
||||
|
||||
<!-- Y-axis labels -->
|
||||
<text x="145" y="108" text-anchor="end" fill="#e2e8f0" font-size="13" font-weight="600">OpenFang</text>
|
||||
<text x="145" y="158" text-anchor="end" fill="#cbd5e1" font-size="13">OpenClaw</text>
|
||||
<text x="145" y="208" text-anchor="end" fill="#cbd5e1" font-size="13">LangChain</text>
|
||||
<text x="145" y="258" text-anchor="end" fill="#cbd5e1" font-size="13">AutoGPT</text>
|
||||
<text x="145" y="308" text-anchor="end" fill="#cbd5e1" font-size="13">CrewAI</text>
|
||||
|
||||
<!-- Bars -->
|
||||
<!-- OpenFang: 16 layers -->
|
||||
<rect x="155" y="90" width="480" height="26" rx="4" fill="url(#sg)" filter="url(#ds)"/>
|
||||
<text x="642" y="108" fill="#10b981" font-size="14" font-weight="700">16</text>
|
||||
|
||||
<!-- OpenClaw: 3 (config-based ACL, basic auth, env isolation) -->
|
||||
<rect x="155" y="140" width="90" height="26" rx="4" fill="url(#gg)" filter="url(#ds)"/>
|
||||
<text x="252" y="158" fill="#9ca3af" font-size="14" font-weight="600">3</text>
|
||||
|
||||
<!-- LangChain: 1 (basic callbacks) -->
|
||||
<rect x="155" y="190" width="30" height="26" rx="4" fill="url(#gg)" filter="url(#ds)"/>
|
||||
<text x="192" y="208" fill="#9ca3af" font-size="14" font-weight="600">1</text>
|
||||
|
||||
<!-- AutoGPT: 2 (workspace sandbox, rate limits) -->
|
||||
<rect x="155" y="240" width="60" height="26" rx="4" fill="url(#gg)" filter="url(#ds)"/>
|
||||
<text x="222" y="258" fill="#9ca3af" font-size="14" font-weight="600">2</text>
|
||||
|
||||
<!-- CrewAI: 1 (role-based) -->
|
||||
<rect x="155" y="290" width="30" height="26" rx="4" fill="url(#gg)" filter="url(#ds)"/>
|
||||
<text x="192" y="308" fill="#9ca3af" font-size="14" font-weight="600">1</text>
|
||||
|
||||
<!-- Legend items -->
|
||||
<text x="155" y="352" fill="#94a3b8" font-size="10">Layers include: capability gates, WASM sandbox, taint tracking, Merkle audit, Ed25519 manifests, SSRF protection,</text>
|
||||
<text x="155" y="366" fill="#94a3b8" font-size="10">secret zeroization, OFP mutual auth, security headers, GCRA rate limiter, path traversal prevention,</text>
|
||||
<text x="155" y="380" fill="#94a3b8" font-size="10">subprocess sandbox, prompt injection scanner, loop guard, session repair, health redaction</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.1 KiB |
Reference in New Issue
Block a user