Files
nova/docs/graphs/system_architecture.svg
2026-04-12 07:19:48 -03:00

300 lines
22 KiB
XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.2 (0)
-->
<!-- Title: system_architecture Pages: 1 -->
<svg width="1298pt" height="662pt"
viewBox="0.00 0.00 1298.00 662.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 657.85)">
<title>system_architecture</title>
<polygon fill="#0a0e17" stroke="none" points="-4,4 -4,-657.85 1294,-657.85 1294,4 -4,4"/>
<text xml:space="preserve" text-anchor="middle" x="645" y="-634.65" font-family="Helvetica,sans-Serif" font-size="16.00" fill="#0066ff">System Architecture</text>
<g id="clust1" class="cluster">
<title>cluster_external</title>
<polygon fill="#0a0e17" stroke="#1e2a4a" stroke-dasharray="5,2" points="561,-13.27 561,-110.35 1282,-110.35 1282,-13.27 561,-13.27"/>
<text xml:space="preserve" text-anchor="middle" x="921.5" y="-91.15" font-family="Helvetica,sans-Serif" font-size="16.00" fill="#8892a8">External</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_app</title>
<polygon fill="#0a0e17" stroke="#1e2a4a" stroke-dasharray="5,2" points="8,-8 8,-618.35 553,-618.35 553,-8 8,-8"/>
<text xml:space="preserve" text-anchor="middle" x="280.5" y="-599.15" font-family="Helvetica,sans-Serif" font-size="16.00" fill="#8892a8">Application (EC2 / Kind Cluster)</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_frontend</title>
<polygon fill="#0a0e17" stroke="#1e2a4a" stroke-dasharray="5,2" points="449,-490.85 449,-582.85 536,-582.85 536,-490.85 449,-490.85"/>
<text xml:space="preserve" text-anchor="middle" x="492.5" y="-563.65" font-family="Helvetica,sans-Serif" font-size="16.00" fill="#4a5568">Frontend</text>
</g>
<g id="clust4" class="cluster">
<title>cluster_api</title>
<polygon fill="#0a0e17" stroke="#1e2a4a" stroke-dasharray="5,2" points="428,-369.6 428,-461.6 534,-461.6 534,-369.6 428,-369.6"/>
<text xml:space="preserve" text-anchor="middle" x="481" y="-442.4" font-family="Helvetica,sans-Serif" font-size="16.00" fill="#4a5568">API Layer</text>
</g>
<g id="clust5" class="cluster">
<title>cluster_agents</title>
<polygon fill="#0a0e17" stroke="#1e2a4a" stroke-dasharray="5,2" points="183,-260.85 183,-340.35 404,-340.35 404,-260.85 183,-260.85"/>
<text xml:space="preserve" text-anchor="middle" x="293.5" y="-321.15" font-family="Helvetica,sans-Serif" font-size="16.00" fill="#4a5568">Agent Clients</text>
</g>
<g id="clust6" class="cluster">
<title>cluster_mcp</title>
<polygon fill="#0a0e17" stroke="#0066ff" stroke-dasharray="5,2" points="16,-139.6 16,-231.6 414,-231.6 414,-139.6 16,-139.6"/>
<text xml:space="preserve" text-anchor="middle" x="215" y="-212.4" font-family="Helvetica,sans-Serif" font-size="16.00" fill="#0066ff">MCP Servers (stdio)</text>
</g>
<g id="clust7" class="cluster">
<title>cluster_data</title>
<polygon fill="#0a0e17" stroke="#1e2a4a" stroke-dasharray="5,2" points="19,-16 19,-107.62 284,-107.62 284,-16 19,-16"/>
<text xml:space="preserve" text-anchor="middle" x="151.5" y="-88.42" font-family="Helvetica,sans-Serif" font-size="16.00" fill="#4a5568">Data Layer</text>
</g>
<g id="clust8" class="cluster">
<title>cluster_obs</title>
<polygon fill="#0a0e17" stroke="#1e2a4a" stroke-dasharray="5,2" points="422,-145.85 422,-340.35 545,-340.35 545,-145.85 422,-145.85"/>
<text xml:space="preserve" text-anchor="middle" x="483.5" y="-321.15" font-family="Helvetica,sans-Serif" font-size="16.00" fill="#4a5568">Observability</text>
</g>
<!-- kong -->
<g id="node1" class="node">
<title>kong</title>
<polygon fill="#243056" stroke="#1e2a4a" points="1273.52,-36.97 1273.52,-59.16 1231.04,-74.85 1170.96,-74.85 1128.48,-59.16 1128.48,-36.97 1170.96,-21.27 1231.04,-21.27 1273.52,-36.97"/>
<text xml:space="preserve" text-anchor="middle" x="1201" y="-51.11" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">Kong Konnect</text>
<text xml:space="preserve" text-anchor="middle" x="1201" y="-37.61" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">(API Gateway)</text>
</g>
<!-- fastapi -->
<g id="node6" class="node">
<title>fastapi</title>
<polygon fill="#121829" stroke="#1e2a4a" points="525.75,-426.1 436.25,-426.1 436.25,-377.6 525.75,-377.6 525.75,-426.1"/>
<text xml:space="preserve" text-anchor="middle" x="481" y="-411.65" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">FastAPI</text>
<text xml:space="preserve" text-anchor="middle" x="481" y="-398.15" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">+ WebSocket</text>
<text xml:space="preserve" text-anchor="middle" x="481" y="-384.65" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">Port 8000</text>
</g>
<!-- kong&#45;&gt;fastapi -->
<g id="edge2" class="edge">
<title>kong&#45;&gt;fastapi</title>
<path fill="none" stroke="#4a5568" d="M1174.51,-75.16C1159.72,-88.07 1140.23,-102.52 1120,-110.35 1083.37,-124.52 1069.72,-107.41 1032,-118.35 830.03,-176.91 614.99,-310.93 524.79,-370.89"/>
<polygon fill="#4a5568" stroke="#4a5568" points="523.06,-367.84 516.69,-376.3 526.95,-373.66 523.06,-367.84"/>
<text xml:space="preserve" text-anchor="middle" x="752.89" y="-242.3" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8892a8">proxy</text>
</g>
<!-- bedrock -->
<g id="node2" class="node">
<title>bedrock</title>
<polygon fill="#243056" stroke="#1e2a4a" points="896.98,-36.97 896.98,-59.16 850.13,-74.85 783.87,-74.85 737.02,-59.16 737.02,-36.97 783.87,-21.27 850.13,-21.27 896.98,-36.97"/>
<text xml:space="preserve" text-anchor="middle" x="817" y="-51.11" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">AWS Bedrock</text>
<text xml:space="preserve" text-anchor="middle" x="817" y="-37.61" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">(Claude Sonnet)</text>
</g>
<!-- openmeteo -->
<g id="node3" class="node">
<title>openmeteo</title>
<polygon fill="#1a3a1a" stroke="#1e2a4a" points="718.81,-36.97 718.81,-59.16 674.99,-74.85 613.01,-74.85 569.19,-59.16 569.19,-36.97 613.01,-21.27 674.99,-21.27 718.81,-36.97"/>
<text xml:space="preserve" text-anchor="middle" x="644" y="-51.11" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#00c853">OpenMeteo</text>
<text xml:space="preserve" text-anchor="middle" x="644" y="-37.61" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#00c853">(Live Weather)</text>
</g>
<!-- faa -->
<g id="node4" class="node">
<title>faa</title>
<polygon fill="#1a3a1a" stroke="#1e2a4a" points="1110.78,-36.97 1110.78,-59.16 1053.5,-74.85 972.5,-74.85 915.22,-59.16 915.22,-36.97 972.5,-21.27 1053.5,-21.27 1110.78,-36.97"/>
<text xml:space="preserve" text-anchor="middle" x="1013" y="-51.11" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#00c853">FAA NASSTATUS</text>
<text xml:space="preserve" text-anchor="middle" x="1013" y="-37.61" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#00c853">(Live Airport Status)</text>
</g>
<!-- ui -->
<g id="node5" class="node">
<title>ui</title>
<polygon fill="#121829" stroke="#1e2a4a" points="527.38,-547.35 456.62,-547.35 456.62,-498.85 527.38,-498.85 527.38,-547.35"/>
<text xml:space="preserve" text-anchor="middle" x="492" y="-532.9" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">Vue 3 SPA</text>
<text xml:space="preserve" text-anchor="middle" x="492" y="-519.4" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">(NOVA UI)</text>
<text xml:space="preserve" text-anchor="middle" x="492" y="-505.9" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">Port 8040</text>
</g>
<!-- ui&#45;&gt;kong -->
<g id="edge1" class="edge">
<title>ui&#45;&gt;kong</title>
<path fill="none" stroke="#4a5568" stroke-dasharray="5,2" d="M527.5,-522.07C649.77,-521 1046,-509.35 1046,-402.85 1046,-402.85 1046,-402.85 1046,-170.85 1046,-167.26 1112.7,-115.97 1158.59,-81.11"/>
<polygon fill="#4a5568" stroke="#4a5568" points="1160.69,-83.91 1166.54,-75.08 1156.46,-78.33 1160.69,-83.91"/>
<text xml:space="preserve" text-anchor="middle" x="1057.25" y="-283.93" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8892a8">HTTP</text>
</g>
<!-- ui&#45;&gt;fastapi -->
<g id="edge3" class="edge">
<title>ui&#45;&gt;fastapi</title>
<path fill="none" stroke="#0066ff" d="M489.83,-498.54C488.22,-481.15 486.01,-457.19 484.21,-437.6"/>
<polygon fill="#0066ff" stroke="#0066ff" points="487.71,-437.5 483.31,-427.87 480.74,-438.15 487.71,-437.5"/>
<text xml:space="preserve" text-anchor="middle" x="513.25" y="-472.3" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8892a8">WebSocket</text>
</g>
<!-- efhas -->
<g id="node7" class="node">
<title>efhas</title>
<polygon fill="#1a1a3a" stroke="#1e2a4a" points="395.62,-304.85 314.38,-304.85 314.38,-268.85 395.62,-268.85 395.62,-304.85"/>
<text xml:space="preserve" text-anchor="middle" x="355" y="-289.9" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">FCE Agent</text>
<text xml:space="preserve" text-anchor="middle" x="355" y="-276.4" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">(Passenger)</text>
</g>
<!-- fastapi&#45;&gt;efhas -->
<g id="edge4" class="edge">
<title>fastapi&#45;&gt;efhas</title>
<path fill="none" stroke="#4a5568" d="M454.59,-377.16C433.53,-358.28 404.13,-331.91 382.73,-312.72"/>
<polygon fill="#4a5568" stroke="#4a5568" points="385.3,-310.32 375.51,-306.25 380.62,-315.53 385.3,-310.32"/>
<text xml:space="preserve" text-anchor="middle" x="448.37" y="-351.05" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8892a8">trigger</text>
</g>
<!-- handover -->
<g id="node8" class="node">
<title>handover</title>
<polygon fill="#1a1a3a" stroke="#1e2a4a" points="296.62,-304.85 191.38,-304.85 191.38,-268.85 296.62,-268.85 296.62,-304.85"/>
<text xml:space="preserve" text-anchor="middle" x="244" y="-289.9" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">Handover Agent</text>
<text xml:space="preserve" text-anchor="middle" x="244" y="-276.4" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">(Ops)</text>
</g>
<!-- fastapi&#45;&gt;handover -->
<g id="edge5" class="edge">
<title>fastapi&#45;&gt;handover</title>
<path fill="none" stroke="#4a5568" d="M435.98,-390.44C399.18,-380.76 346.62,-364.23 305,-340.35 292.03,-332.91 279.24,-322.51 268.75,-312.93"/>
<polygon fill="#4a5568" stroke="#4a5568" points="271.3,-310.52 261.63,-306.2 266.49,-315.61 271.3,-310.52"/>
<text xml:space="preserve" text-anchor="middle" x="356.75" y="-351.05" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8892a8">trigger</text>
</g>
<!-- langfuse -->
<g id="node14" class="node">
<title>langfuse</title>
<polygon fill="#121829" stroke="#1e2a4a" points="515.25,-304.85 446.75,-304.85 446.75,-268.85 515.25,-268.85 515.25,-304.85"/>
<text xml:space="preserve" text-anchor="middle" x="481" y="-289.9" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">Langfuse</text>
<text xml:space="preserve" text-anchor="middle" x="481" y="-276.4" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">Port 3000</text>
</g>
<!-- fastapi&#45;&gt;langfuse -->
<g id="edge19" class="edge">
<title>fastapi&#45;&gt;langfuse</title>
<path fill="none" stroke="#8892a8" stroke-dasharray="1,5" d="M481,-377.16C481,-359.54 481,-335.39 481,-316.65"/>
<polygon fill="#8892a8" stroke="#8892a8" points="484.5,-316.75 481,-306.75 477.5,-316.75 484.5,-316.75"/>
<text xml:space="preserve" text-anchor="middle" x="494.88" y="-351.05" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8892a8">traces</text>
</g>
<!-- shared -->
<g id="node9" class="node">
<title>shared</title>
<polygon fill="#0d1a33" stroke="#1e2a4a" points="310,-196.1 156,-196.1 156,-192.1 152,-192.1 152,-188.1 156,-188.1 156,-155.6 152,-155.6 152,-151.6 156,-151.6 156,-147.6 310,-147.6 310,-196.1"/>
<polyline fill="none" stroke="#1e2a4a" points="156,-192.1 160,-192.1 160,-188.1 156,-188.1"/>
<polyline fill="none" stroke="#1e2a4a" points="156,-155.6 160,-155.6 160,-151.6 156,-151.6"/>
<text xml:space="preserve" text-anchor="middle" x="233" y="-181.65" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">shared</text>
<text xml:space="preserve" text-anchor="middle" x="233" y="-168.15" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">flights · weather · airport</text>
<text xml:space="preserve" text-anchor="middle" x="233" y="-154.65" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">maintenance</text>
</g>
<!-- efhas&#45;&gt;shared -->
<g id="edge6" class="edge">
<title>efhas&#45;&gt;shared</title>
<path fill="none" stroke="#0066ff" d="M336.2,-268.44C317.71,-251.31 289.07,-224.79 266.65,-204.02"/>
<polygon fill="#0066ff" stroke="#0066ff" points="269.22,-201.63 259.5,-197.4 264.46,-206.76 269.22,-201.63"/>
<text xml:space="preserve" text-anchor="middle" x="324.91" y="-242.3" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8892a8">MCP</text>
</g>
<!-- passenger -->
<g id="node11" class="node">
<title>passenger</title>
<polygon fill="#0d1a33" stroke="#1e2a4a" points="405.75,-189.85 328.25,-189.85 328.25,-185.85 324.25,-185.85 324.25,-181.85 328.25,-181.85 328.25,-161.85 324.25,-161.85 324.25,-157.85 328.25,-157.85 328.25,-153.85 405.75,-153.85 405.75,-189.85"/>
<polyline fill="none" stroke="#1e2a4a" points="328.25,-185.85 332.25,-185.85 332.25,-181.85 328.25,-181.85"/>
<polyline fill="none" stroke="#1e2a4a" points="328.25,-161.85 332.25,-161.85 332.25,-157.85 328.25,-157.85"/>
<text xml:space="preserve" text-anchor="middle" x="367" y="-174.9" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">passenger</text>
<text xml:space="preserve" text-anchor="middle" x="367" y="-161.4" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">notification</text>
</g>
<!-- efhas&#45;&gt;passenger -->
<g id="edge7" class="edge">
<title>efhas&#45;&gt;passenger</title>
<path fill="none" stroke="#0066ff" d="M356.82,-268.69C358.72,-250.85 361.71,-222.63 363.97,-201.42"/>
<polygon fill="#0066ff" stroke="#0066ff" points="367.42,-201.99 365,-191.68 360.46,-201.25 367.42,-201.99"/>
<text xml:space="preserve" text-anchor="middle" x="368.95" y="-242.3" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8892a8">MCP</text>
</g>
<!-- handover&#45;&gt;shared -->
<g id="edge8" class="edge">
<title>handover&#45;&gt;shared</title>
<path fill="none" stroke="#0066ff" d="M242.33,-268.69C240.76,-252.59 238.37,-228.02 236.4,-207.79"/>
<polygon fill="#0066ff" stroke="#0066ff" points="239.9,-207.6 235.45,-197.99 232.93,-208.28 239.9,-207.6"/>
<text xml:space="preserve" text-anchor="middle" x="249.82" y="-242.3" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8892a8">MCP</text>
</g>
<!-- ops -->
<g id="node10" class="node">
<title>ops</title>
<polygon fill="#0d1a33" stroke="#1e2a4a" points="137.75,-196.1 24.25,-196.1 24.25,-192.1 20.25,-192.1 20.25,-188.1 24.25,-188.1 24.25,-155.6 20.25,-155.6 20.25,-151.6 24.25,-151.6 24.25,-147.6 137.75,-147.6 137.75,-196.1"/>
<polyline fill="none" stroke="#1e2a4a" points="24.25,-192.1 28.25,-192.1 28.25,-188.1 24.25,-188.1"/>
<polyline fill="none" stroke="#1e2a4a" points="24.25,-155.6 28.25,-155.6 28.25,-151.6 24.25,-151.6"/>
<text xml:space="preserve" text-anchor="middle" x="81" y="-181.65" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">ops</text>
<text xml:space="preserve" text-anchor="middle" x="81" y="-168.15" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">crew · rebookings</text>
<text xml:space="preserve" text-anchor="middle" x="81" y="-154.65" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">narrative</text>
</g>
<!-- handover&#45;&gt;ops -->
<g id="edge9" class="edge">
<title>handover&#45;&gt;ops</title>
<path fill="none" stroke="#0066ff" d="M208.77,-268.52C189.86,-258.64 166.49,-245.48 147,-231.6 135.48,-223.4 123.7,-213.49 113.34,-204.16"/>
<polygon fill="#0066ff" stroke="#0066ff" points="115.85,-201.72 106.12,-197.53 111.12,-206.87 115.85,-201.72"/>
<text xml:space="preserve" text-anchor="middle" x="184.55" y="-242.3" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8892a8">MCP</text>
</g>
<!-- shared&#45;&gt;openmeteo -->
<g id="edge10" class="edge">
<title>shared&#45;&gt;openmeteo</title>
<path fill="none" stroke="#00c853" d="M291.6,-147.2C300.66,-144.23 310,-141.56 319,-139.6 373.9,-127.68 390.33,-142.51 445,-129.6 496.17,-117.52 551.37,-94.3 590.62,-75.88"/>
<polygon fill="#00c853" stroke="#00c853" points="592.11,-79.05 599.64,-71.6 589.1,-72.73 592.11,-79.05"/>
<text xml:space="preserve" text-anchor="middle" x="495.7" y="-121.05" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8892a8">HTTP</text>
</g>
<!-- shared&#45;&gt;faa -->
<g id="edge11" class="edge">
<title>shared&#45;&gt;faa</title>
<path fill="none" stroke="#00c853" d="M291.08,-147.13C300.3,-144.13 309.81,-141.47 319,-139.6 402.74,-122.6 426.12,-139.41 511,-129.6 539.04,-126.36 545.42,-121.2 573.5,-118.35 610.27,-114.62 870.4,-120.28 906,-110.35 927.85,-104.25 949.94,-92.7 968.33,-81.26"/>
<polygon fill="#00c853" stroke="#00c853" points="970.07,-84.3 976.59,-75.95 966.29,-78.41 970.07,-84.3"/>
<text xml:space="preserve" text-anchor="middle" x="584.75" y="-121.05" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8892a8">HTTP</text>
</g>
<!-- scenarios -->
<g id="node12" class="node">
<title>scenarios</title>
<path fill="#121829" stroke="#1e2a4a" d="M142.5,-67.75C142.5,-70.16 116.73,-72.12 85,-72.12 53.27,-72.12 27.5,-70.16 27.5,-67.75 27.5,-67.75 27.5,-28.38 27.5,-28.38 27.5,-25.96 53.27,-24 85,-24 116.73,-24 142.5,-25.96 142.5,-28.38 142.5,-28.38 142.5,-67.75 142.5,-67.75"/>
<path fill="none" stroke="#1e2a4a" d="M142.5,-67.75C142.5,-65.34 116.73,-63.38 85,-63.38 53.27,-63.38 27.5,-65.34 27.5,-67.75"/>
<text xml:space="preserve" text-anchor="middle" x="85" y="-51.11" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">Scenario Manager</text>
<text xml:space="preserve" text-anchor="middle" x="85" y="-37.61" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">4 scenarios</text>
</g>
<!-- shared&#45;&gt;scenarios -->
<g id="edge12" class="edge">
<title>shared&#45;&gt;scenarios</title>
<path fill="none" stroke="#4a5568" d="M199.23,-147.25C184.17,-136.39 166.39,-123.11 151,-110.35 139.6,-100.9 127.6,-90.06 117.01,-80.15"/>
<polygon fill="#4a5568" stroke="#4a5568" points="119.63,-77.8 109.96,-73.48 114.82,-82.89 119.63,-77.8"/>
</g>
<!-- mock -->
<g id="node13" class="node">
<title>mock</title>
<path fill="#121829" stroke="#1e2a4a" d="M275.88,-67.75C275.88,-70.16 249.93,-72.12 218,-72.12 186.07,-72.12 160.12,-70.16 160.12,-67.75 160.12,-67.75 160.12,-28.38 160.12,-28.38 160.12,-25.96 186.07,-24 218,-24 249.93,-24 275.88,-25.96 275.88,-28.38 275.88,-28.38 275.88,-67.75 275.88,-67.75"/>
<path fill="none" stroke="#1e2a4a" d="M275.88,-67.75C275.88,-65.34 249.93,-63.38 218,-63.38 186.07,-63.38 160.12,-65.34 160.12,-67.75"/>
<text xml:space="preserve" text-anchor="middle" x="218" y="-51.11" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">Mock Data</text>
<text xml:space="preserve" text-anchor="middle" x="218" y="-37.61" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">(Pydantic models)</text>
</g>
<!-- shared&#45;&gt;mock -->
<g id="edge13" class="edge">
<title>shared&#45;&gt;mock</title>
<path fill="none" stroke="#4a5568" d="M230.11,-147.37C227.89,-129.34 224.79,-104.17 222.28,-83.81"/>
<polygon fill="#4a5568" stroke="#4a5568" points="225.76,-83.47 221.07,-73.97 218.82,-84.33 225.76,-83.47"/>
</g>
<!-- ops&#45;&gt;bedrock -->
<g id="edge16" class="edge">
<title>ops&#45;&gt;bedrock</title>
<path fill="none" stroke="#4a5568" stroke-dasharray="5,2" d="M125.64,-147.16C132.64,-144.2 139.91,-141.53 147,-139.6 248.39,-111.96 277.58,-124.29 382.5,-118.35 420.84,-116.18 691.47,-122.18 728,-110.35 746.48,-104.37 764.56,-93.2 779.55,-82.03"/>
<polygon fill="#4a5568" stroke="#4a5568" points="781.51,-84.93 787.27,-76.04 777.22,-79.4 781.51,-84.93"/>
<text xml:space="preserve" text-anchor="middle" x="411.75" y="-121.05" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8892a8">Converse API</text>
</g>
<!-- ops&#45;&gt;scenarios -->
<g id="edge15" class="edge">
<title>ops&#45;&gt;scenarios</title>
<path fill="none" stroke="#4a5568" d="M81.77,-147.37C82.36,-129.34 83.19,-104.17 83.86,-83.81"/>
<polygon fill="#4a5568" stroke="#4a5568" points="87.35,-84.09 84.18,-73.99 80.35,-83.86 87.35,-84.09"/>
</g>
<!-- ops&#45;&gt;mock -->
<g id="edge14" class="edge">
<title>ops&#45;&gt;mock</title>
<path fill="none" stroke="#4a5568" d="M109.23,-147.27C122.34,-136.19 138.09,-122.73 152,-110.35 162.88,-100.67 174.57,-89.93 185.05,-80.17"/>
<polygon fill="#4a5568" stroke="#4a5568" points="187.14,-83.02 192.05,-73.63 182.36,-77.9 187.14,-83.02"/>
</g>
<!-- passenger&#45;&gt;bedrock -->
<g id="edge17" class="edge">
<title>passenger&#45;&gt;bedrock</title>
<path fill="none" stroke="#4a5568" stroke-dasharray="5,2" d="M389.94,-153.46C398.34,-148.03 408.19,-142.66 418,-139.6 456.67,-127.54 560.16,-136.89 600,-129.6 616.28,-126.62 619.27,-121.58 635.5,-118.35 675.97,-110.29 689.16,-124.29 728,-110.35 745.99,-103.89 763.75,-92.87 778.62,-81.94"/>
<polygon fill="#4a5568" stroke="#4a5568" points="780.44,-84.95 786.28,-76.11 776.2,-79.38 780.44,-84.95"/>
<text xml:space="preserve" text-anchor="middle" x="664.75" y="-121.05" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8892a8">Converse API</text>
</g>
<!-- postgres -->
<g id="node15" class="node">
<title>postgres</title>
<path fill="#121829" stroke="#1e2a4a" d="M520.5,-186.58C520.5,-188.38 502.8,-189.85 481,-189.85 459.2,-189.85 441.5,-188.38 441.5,-186.58 441.5,-186.58 441.5,-157.12 441.5,-157.12 441.5,-155.32 459.2,-153.85 481,-153.85 502.8,-153.85 520.5,-155.32 520.5,-157.12 520.5,-157.12 520.5,-186.58 520.5,-186.58"/>
<path fill="none" stroke="#1e2a4a" d="M520.5,-186.58C520.5,-184.77 502.8,-183.3 481,-183.3 459.2,-183.3 441.5,-184.77 441.5,-186.58"/>
<text xml:space="preserve" text-anchor="middle" x="481" y="-168.15" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e8eaf0">PostgreSQL</text>
</g>
<!-- langfuse&#45;&gt;postgres -->
<g id="edge18" class="edge">
<title>langfuse&#45;&gt;postgres</title>
<path fill="none" stroke="#4a5568" d="M481,-268.69C481,-250.85 481,-222.63 481,-201.42"/>
<polygon fill="#4a5568" stroke="#4a5568" points="484.5,-201.69 481,-191.69 477.5,-201.69 484.5,-201.69"/>
</g>
</g>
</svg>