Files
OmniRoute/docs/diagrams/exported/request-pipeline.svg
diegosouzapw 519fdf41b8 chore(docs): add npm run docs:render-diagrams and export SVGs
Add scripts/docs/render-diagrams.mjs as a thin wrapper around
@mermaid-js/mermaid-cli (mmdc):

- Renders every docs/diagrams/*.mmd into docs/diagrams/exported/*.svg
- Writes a Puppeteer config with --no-sandbox for Ubuntu 23.10+/WSL
- Exits non-zero on first failure so CI can gate on rendering

Expose it as `npm run docs:render-diagrams` and commit the initial
8 rendered SVGs so reviewers see the diagrams without having to install
the renderer locally.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 13:54:09 -03:00

1 line
40 KiB
XML

<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="flowchart" style="max-width: 4194.58px; background-color: white;" viewBox="0 0 4194.578125 268.125" role="graphics-document document" aria-roledescription="flowchart-v2"><style>#my-svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#my-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#my-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#my-svg .error-icon{fill:#552222;}#my-svg .error-text{fill:#552222;stroke:#552222;}#my-svg .edge-thickness-normal{stroke-width:1px;}#my-svg .edge-thickness-thick{stroke-width:3.5px;}#my-svg .edge-pattern-solid{stroke-dasharray:0;}#my-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#my-svg .edge-pattern-dashed{stroke-dasharray:3;}#my-svg .edge-pattern-dotted{stroke-dasharray:2;}#my-svg .marker{fill:#333333;stroke:#333333;}#my-svg .marker.cross{stroke:#333333;}#my-svg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#my-svg p{margin:0;}#my-svg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#my-svg .cluster-label text{fill:#333;}#my-svg .cluster-label span{color:#333;}#my-svg .cluster-label span p{background-color:transparent;}#my-svg .label text,#my-svg span{fill:#333;color:#333;}#my-svg .node rect,#my-svg .node circle,#my-svg .node ellipse,#my-svg .node polygon,#my-svg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#my-svg .rough-node .label text,#my-svg .node .label text,#my-svg .image-shape .label,#my-svg .icon-shape .label{text-anchor:middle;}#my-svg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#my-svg .rough-node .label,#my-svg .node .label,#my-svg .image-shape .label,#my-svg .icon-shape .label{text-align:center;}#my-svg .node.clickable{cursor:pointer;}#my-svg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#my-svg .arrowheadPath{fill:#333333;}#my-svg .edgePath .path{stroke:#333333;stroke-width:1px;}#my-svg .flowchart-link{stroke:#333333;fill:none;}#my-svg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#my-svg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#my-svg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#my-svg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#my-svg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#my-svg .cluster text{fill:#333;}#my-svg .cluster span{color:#333;}#my-svg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#my-svg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#my-svg rect.text{fill:none;stroke-width:0;}#my-svg .icon-shape,#my-svg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#my-svg .icon-shape p,#my-svg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#my-svg .icon-shape .label rect,#my-svg .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#my-svg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#my-svg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#my-svg .node .neo-node{stroke:#9370DB;}#my-svg [data-look="neo"].node rect,#my-svg [data-look="neo"].cluster rect,#my-svg [data-look="neo"].node polygon{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#my-svg [data-look="neo"].node path{stroke:#9370DB;stroke-width:1px;}#my-svg [data-look="neo"].node .outer-path{filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#my-svg [data-look="neo"].node .neo-line path{stroke:#9370DB;filter:none;}#my-svg [data-look="neo"].node circle{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#my-svg [data-look="neo"].node circle .state-start{fill:#000000;}#my-svg [data-look="neo"].icon-shape .icon{fill:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#my-svg [data-look="neo"].icon-shape .icon-neo path{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#my-svg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g><marker id="my-svg_flowchart-v2-pointEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-pointStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="4.5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 5 L 10 10 L 10 0 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-pointEnd-margin" class="marker flowchart-v2" viewBox="0 0 11.5 14" refX="11.5" refY="7" markerUnits="userSpaceOnUse" markerWidth="10.5" markerHeight="14" orient="auto"><path d="M 0 0 L 11.5 7 L 0 14 z" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-pointStart-margin" class="marker flowchart-v2" viewBox="0 0 11.5 14" refX="1" refY="7" markerUnits="userSpaceOnUse" markerWidth="11.5" markerHeight="14" orient="auto"><polygon points="0,7 11.5,14 11.5,0" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="11" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="-1" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleEnd-margin" class="marker flowchart-v2" viewBox="0 0 10 10" refY="5" refX="12.25" markerUnits="userSpaceOnUse" markerWidth="14" markerHeight="14" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleStart-margin" class="marker flowchart-v2" viewBox="0 0 10 10" refX="-2" refY="5" markerUnits="userSpaceOnUse" markerWidth="14" markerHeight="14" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-crossEnd" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="12" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-crossStart" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="-1" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-crossEnd-margin" class="marker cross flowchart-v2" viewBox="0 0 15 15" refX="17.7" refY="7.5" markerUnits="userSpaceOnUse" markerWidth="12" markerHeight="12" orient="auto"><path d="M 1,1 L 14,14 M 1,14 L 14,1" class="arrowMarkerPath" style="stroke-width: 2.5;"/></marker><marker id="my-svg_flowchart-v2-crossStart-margin" class="marker cross flowchart-v2" viewBox="0 0 15 15" refX="-3.5" refY="7.5" markerUnits="userSpaceOnUse" markerWidth="12" markerHeight="12" orient="auto"><path d="M 1,1 L 14,14 M 1,14 L 14,1" class="arrowMarkerPath" style="stroke-width: 2.5; stroke-dasharray: 1, 0;"/></marker><g class="root"><g class="clusters"/><g class="edgePaths"><path d="M172.016,104.711L176.182,102.759C180.349,100.807,188.682,96.904,196.349,94.952C204.016,93,211.016,93,214.516,93L218.016,93" id="my-svg-L_Client_Route_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Client_Route_0" data-points="W3sieCI6MTcyLjAxNTYyNSwieSI6MTA0LjcxMDU5MzU2MDYzMzczfSx7IngiOjE5Ny4wMTU2MjUsInkiOjkzfSx7IngiOjIyMi4wMTU2MjUsInkiOjkzfV0=" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M427.875,93L432.042,93C436.208,93,444.542,93,452.208,93C459.875,93,466.875,93,470.375,93L473.875,93" id="my-svg-L_Route_CORS_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Route_CORS_0" data-points="W3sieCI6NDI3Ljg3NSwieSI6OTN9LHsieCI6NDUyLjg3NSwieSI6OTN9LHsieCI6NDc3Ljg3NSwieSI6OTN9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M645.469,93L649.635,93C653.802,93,662.135,93,669.802,93C677.469,93,684.469,93,687.969,93L691.469,93" id="my-svg-L_CORS_Validate_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_CORS_Validate_0" data-points="W3sieCI6NjQ1LjQ2ODc1LCJ5Ijo5M30seyJ4Ijo2NzAuNDY4NzUsInkiOjkzfSx7IngiOjY5NS40Njg3NSwieSI6OTN9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M858.641,93L862.807,93C866.974,93,875.307,93,882.974,93C890.641,93,897.641,93,901.141,93L904.641,93" id="my-svg-L_Validate_Authz_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Validate_Authz_0" data-points="W3sieCI6ODU4LjY0MDYyNSwieSI6OTN9LHsieCI6ODgzLjY0MDYyNSwieSI6OTN9LHsieCI6OTA4LjY0MDYyNSwieSI6OTN9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M1086.469,93L1090.635,93C1094.802,93,1103.135,93,1110.802,93C1118.469,93,1125.469,93,1128.969,93L1132.469,93" id="my-svg-L_Authz_Policy_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Authz_Policy_0" data-points="W3sieCI6MTA4Ni40Njg3NSwieSI6OTN9LHsieCI6MTExMS40Njg3NSwieSI6OTN9LHsieCI6MTEzNi40Njg3NSwieSI6OTN9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M1332.078,93L1336.245,93C1340.411,93,1348.745,93,1356.411,93C1364.078,93,1371.078,93,1374.578,93L1378.078,93" id="my-svg-L_Policy_Guard_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Policy_Guard_0" data-points="W3sieCI6MTMzMi4wNzgxMjUsInkiOjkzfSx7IngiOjEzNTcuMDc4MTI1LCJ5Ijo5M30seyJ4IjoxMzgyLjA3ODEyNSwieSI6OTN9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M1557.688,93L1561.854,93C1566.021,93,1574.354,93,1582.021,93C1589.688,93,1596.688,93,1600.188,93L1603.688,93" id="my-svg-L_Guard_ChatCore_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Guard_ChatCore_0" data-points="W3sieCI6MTU1Ny42ODc1LCJ5Ijo5M30seyJ4IjoxNTgyLjY4NzUsInkiOjkzfSx7IngiOjE2MDcuNjg3NSwieSI6OTN9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M1784.219,93L1788.385,93C1792.552,93,1800.885,93,1808.552,93C1816.219,93,1823.219,93,1826.719,93L1830.219,93" id="my-svg-L_ChatCore_Cache_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_ChatCore_Cache_0" data-points="W3sieCI6MTc4NC4yMTg3NSwieSI6OTN9LHsieCI6MTgwOS4yMTg3NSwieSI6OTN9LHsieCI6MTgzNC4yMTg3NSwieSI6OTN9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M1941.169,69.45L1951.336,63.709C1961.503,57.967,1981.838,46.483,1998.515,40.742C2015.193,35,2028.214,35,2034.724,35L2041.234,35" id="my-svg-L_Cache_Return_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Cache_Return_0" data-points="W3sieCI6MTk0MS4xNjkxMTQ2MDg2NTM0LCJ5Ijo2OS40NTAzNjQ2MDg2NTMzN30seyJ4IjoyMDAyLjE3MTg3NSwieSI6MzV9LHsieCI6MjA0NS4yMzQzNzUsInkiOjM1fV0=" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M1941.169,116.55L1951.336,122.291C1961.503,128.033,1981.838,139.517,1997.58,145.258C2013.323,151,2024.474,151,2030.049,151L2035.625,151" id="my-svg-L_Cache_Rate_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Cache_Rate_0" data-points="W3sieCI6MTk0MS4xNjkxMTQ2MDg2NTM0LCJ5IjoxMTYuNTQ5NjM1MzkxMzQ2NjN9LHsieCI6MjAwMi4xNzE4NzUsInkiOjE1MX0seyJ4IjoyMDM5LjYyNSwieSI6MTUxfV0=" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M2214.906,151L2219.073,151C2223.24,151,2231.573,151,2239.24,151C2246.906,151,2253.906,151,2257.406,151L2260.906,151" id="my-svg-L_Rate_Combo_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Rate_Combo_0" data-points="W3sieCI6MjIxNC45MDYyNSwieSI6MTUxfSx7IngiOjIyMzkuOTA2MjUsInkiOjE1MX0seyJ4IjoyMjY0LjkwNjI1LCJ5IjoxNTF9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M2376.717,133.233L2387.848,129.028C2398.978,124.822,2421.239,116.411,2439.872,112.206C2458.505,108,2473.51,108,2481.013,108L2488.516,108" id="my-svg-L_Combo_Resolve_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Combo_Resolve_0" data-points="W3sieCI6MjM3Ni43MTc0OTc0MTU0MjU0LCJ5IjoxMzMuMjMzMTIyNDE1NDI1MjR9LHsieCI6MjQ0My41LCJ5IjoxMDh9LHsieCI6MjQ5Mi41MTU2MjUsInkiOjEwOH1d" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M2708.141,108L2712.307,108C2716.474,108,2724.807,108,2732.511,109.236C2740.215,110.472,2747.29,112.944,2750.827,114.18L2754.365,115.416" id="my-svg-L_Resolve_Single_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Resolve_Single_0" data-points="W3sieCI6MjcwOC4xNDA2MjUsInkiOjEwOH0seyJ4IjoyNzMzLjE0MDYyNSwieSI6MTA4fSx7IngiOjI3NTguMTQwNjI1LCJ5IjoxMTYuNzM1OTUzMjcyODA4MDh9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M2376.717,168.767L2387.848,172.972C2398.978,177.178,2421.239,185.589,2458.508,189.794C2495.776,194,2548.052,194,2596.326,194C2644.599,194,2688.87,194,2714.543,192.764C2740.215,191.528,2747.29,189.056,2750.827,187.82L2754.365,186.584" id="my-svg-L_Combo_Single_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Combo_Single_0" data-points="W3sieCI6MjM3Ni43MTc0OTc0MTU0MjU0LCJ5IjoxNjguNzY2ODc3NTg0NTc0NzZ9LHsieCI6MjQ0My41LCJ5IjoxOTR9LHsieCI6MjYwMC4zMjgxMjUsInkiOjE5NH0seyJ4IjoyNzMzLjE0MDYyNSwieSI6MTk0fSx7IngiOjI3NTguMTQwNjI1LCJ5IjoxODUuMjY0MDQ2NzI3MTkxOTJ9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M2954.25,151L2958.417,151C2962.583,151,2970.917,151,2978.583,151C2986.25,151,2993.25,151,2996.75,151L3000.25,151" id="my-svg-L_Single_Translate_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Single_Translate_0" data-points="W3sieCI6Mjk1NC4yNSwieSI6MTUxfSx7IngiOjI5NzkuMjUsInkiOjE1MX0seyJ4IjozMDA0LjI1LCJ5IjoxNTF9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M3262.547,151L3266.714,151C3270.88,151,3279.214,151,3286.88,151C3294.547,151,3301.547,151,3305.047,151L3308.547,151" id="my-svg-L_Translate_Exec_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Translate_Exec_0" data-points="W3sieCI6MzI2Mi41NDY4NzUsInkiOjE1MX0seyJ4IjozMjg3LjU0Njg3NSwieSI6MTUxfSx7IngiOjMzMTIuNTQ2ODc1LCJ5IjoxNTF9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M3474.813,151L3478.979,151C3483.146,151,3491.479,151,3499.146,151C3506.813,151,3513.813,151,3517.313,151L3520.813,151" id="my-svg-L_Exec_Upstream_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Exec_Upstream_0" data-points="W3sieCI6MzQ3NC44MTI1LCJ5IjoxNTF9LHsieCI6MzQ5OS44MTI1LCJ5IjoxNTF9LHsieCI6MzUyNC44MTI1LCJ5IjoxNTF9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M3718.188,151L3722.354,151C3726.521,151,3734.854,151,3742.521,151C3750.188,151,3757.188,151,3760.688,151L3764.188,151" id="my-svg-L_Upstream_Stream_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Upstream_Stream_0" data-points="W3sieCI6MzcxOC4xODc1LCJ5IjoxNTF9LHsieCI6Mzc0My4xODc1LCJ5IjoxNTF9LHsieCI6Mzc2OC4xODc1LCJ5IjoxNTF9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M3916.219,151L3920.385,151C3924.552,151,3932.885,151,3941.427,152.622C3949.969,154.245,3958.72,157.49,3963.095,159.112L3967.471,160.734" id="my-svg-L_Stream_Transformer_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Stream_Transformer_0" data-points="W3sieCI6MzkxNi4yMTg3NSwieSI6MTUxfSx7IngiOjM5NDEuMjE4NzUsInkiOjE1MX0seyJ4IjozOTcxLjIyMTIyNDI4MzA0MjQsInkiOjE2Mi4xMjV9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M3987.042,240.125L3979.405,243.458C3971.768,246.792,3956.493,253.458,3932.353,256.792C3908.214,260.125,3875.208,260.125,3842.203,260.125C3809.198,260.125,3776.193,260.125,3739.409,260.125C3702.625,260.125,3662.063,260.125,3621.5,260.125C3580.938,260.125,3540.375,260.125,3502.405,260.125C3464.435,260.125,3429.057,260.125,3393.68,260.125C3358.302,260.125,3322.924,260.125,3279.544,260.125C3236.164,260.125,3184.781,260.125,3133.398,260.125C3082.016,260.125,3030.633,260.125,2984.432,260.125C2938.232,260.125,2897.214,260.125,2856.195,260.125C2815.177,260.125,2774.159,260.125,2731.514,260.125C2688.87,260.125,2644.599,260.125,2596.326,260.125C2548.052,260.125,2495.776,260.125,2450.671,260.125C2405.565,260.125,2367.63,260.125,2333.698,260.125C2299.766,260.125,2269.836,260.125,2236.098,260.125C2202.359,260.125,2164.813,260.125,2125.19,260.125C2085.568,260.125,2043.87,260.125,2005.904,260.125C1967.938,260.125,1933.703,260.125,1901.544,260.125C1869.385,260.125,1839.302,260.125,1805.383,260.125C1771.464,260.125,1733.708,260.125,1695.953,260.125C1658.198,260.125,1620.443,260.125,1582.764,260.125C1545.086,260.125,1507.484,260.125,1469.883,260.125C1432.281,260.125,1394.68,260.125,1355.411,260.125C1316.143,260.125,1275.208,260.125,1234.273,260.125C1193.339,260.125,1152.404,260.125,1112.951,260.125C1073.497,260.125,1035.526,260.125,997.555,260.125C959.583,260.125,921.612,260.125,884.862,260.125C848.112,260.125,812.583,260.125,777.055,260.125C741.526,260.125,705.997,260.125,670.1,260.125C634.203,260.125,597.938,260.125,561.672,260.125C525.406,260.125,489.141,260.125,449.686,260.125C410.232,260.125,367.589,260.125,324.945,260.125C282.302,260.125,239.659,260.125,206.897,247.617C174.136,235.109,151.256,210.093,139.816,197.585L128.377,185.077" id="my-svg-L_Transformer_Client_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Transformer_Client_0" data-points="W3sieCI6Mzk4Ny4wNDIzNzI4ODEzNTU3LCJ5IjoyNDAuMTI1fSx7IngiOjM5NDEuMjE4NzUsInkiOjI2MC4xMjV9LHsieCI6Mzg0Mi4yMDMxMjUsInkiOjI2MC4xMjV9LHsieCI6Mzc0My4xODc1LCJ5IjoyNjAuMTI1fSx7IngiOjM2MjEuNSwieSI6MjYwLjEyNX0seyJ4IjozNDk5LjgxMjUsInkiOjI2MC4xMjV9LHsieCI6MzM5My42Nzk2ODc1LCJ5IjoyNjAuMTI1fSx7IngiOjMyODcuNTQ2ODc1LCJ5IjoyNjAuMTI1fSx7IngiOjMxMzMuMzk4NDM3NSwieSI6MjYwLjEyNX0seyJ4IjoyOTc5LjI1LCJ5IjoyNjAuMTI1fSx7IngiOjI4NTYuMTk1MzEyNSwieSI6MjYwLjEyNX0seyJ4IjoyNzMzLjE0MDYyNSwieSI6MjYwLjEyNX0seyJ4IjoyNjAwLjMyODEyNSwieSI6MjYwLjEyNX0seyJ4IjoyNDQzLjUsInkiOjI2MC4xMjV9LHsieCI6MjMyOS42OTUzMTI1LCJ5IjoyNjAuMTI1fSx7IngiOjIyMzkuOTA2MjUsInkiOjI2MC4xMjV9LHsieCI6MjEyNy4yNjU2MjUsInkiOjI2MC4xMjV9LHsieCI6MjAwMi4xNzE4NzUsInkiOjI2MC4xMjV9LHsieCI6MTg5OS40Njg3NSwieSI6MjYwLjEyNX0seyJ4IjoxODA5LjIxODc1LCJ5IjoyNjAuMTI1fSx7IngiOjE2OTUuOTUzMTI1LCJ5IjoyNjAuMTI1fSx7IngiOjE1ODIuNjg3NSwieSI6MjYwLjEyNX0seyJ4IjoxNDY5Ljg4MjgxMjUsInkiOjI2MC4xMjV9LHsieCI6MTM1Ny4wNzgxMjUsInkiOjI2MC4xMjV9LHsieCI6MTIzNC4yNzM0Mzc1LCJ5IjoyNjAuMTI1fSx7IngiOjExMTEuNDY4NzUsInkiOjI2MC4xMjV9LHsieCI6OTk3LjU1NDY4NzUsInkiOjI2MC4xMjV9LHsieCI6ODgzLjY0MDYyNSwieSI6MjYwLjEyNX0seyJ4Ijo3NzcuMDU0Njg3NSwieSI6MjYwLjEyNX0seyJ4Ijo2NzAuNDY4NzUsInkiOjI2MC4xMjV9LHsieCI6NTYxLjY3MTg3NSwieSI6MjYwLjEyNX0seyJ4Ijo0NTIuODc1LCJ5IjoyNjAuMTI1fSx7IngiOjMyNC45NDUzMTI1LCJ5IjoyNjAuMTI1fSx7IngiOjE5Ny4wMTU2MjUsInkiOjI2MC4xMjV9LHsieCI6MTI1LjY3NzA4MzMzMzMzMzM0LCJ5IjoxODIuMTI1fV0=" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/></g><g class="edgeLabels"><g class="edgeLabel"><g class="label" data-id="L_Client_Route_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Route_CORS_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_CORS_Validate_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Validate_Authz_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Authz_Policy_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Policy_Guard_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Guard_ChatCore_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_ChatCore_Cache_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(2002.171875, 35)"><g class="label" data-id="L_Cache_Return_0" transform="translate(-12.453125, -12)"><foreignObject width="24.90625" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>yes</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(2002.171875, 151)"><g class="label" data-id="L_Cache_Rate_0" transform="translate(-8.8984375, -12)"><foreignObject width="17.796875" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>no</p></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Rate_Combo_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(2443.5, 108)"><g class="label" data-id="L_Combo_Resolve_0" transform="translate(-24.015625, -12)"><foreignObject width="48.03125" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>combo</p></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Resolve_Single_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(2600.328125, 194)"><g class="label" data-id="L_Combo_Single_0" transform="translate(-20.90625, -12)"><foreignObject width="41.8125" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>single</p></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Single_Translate_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Translate_Exec_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Exec_Upstream_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Upstream_Stream_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Stream_Transformer_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Transformer_Client_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g></g><g class="nodes"><g class="node default" id="my-svg-flowchart-Client-0" data-look="classic" transform="translate(90.0078125, 143.125)"><rect class="basic label-container" style="" x="-82.0078125" y="-39" width="164.015625" height="78"/><g class="label" style="" transform="translate(-52.0078125, -24)"><rect/><foreignObject width="104.015625" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>Client<br />(IDE/CLI/SDK)</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Route-1" data-look="classic" transform="translate(324.9453125, 93)"><rect class="basic label-container" style="" x="-102.9296875" y="-39" width="205.859375" height="78"/><g class="label" style="" transform="translate(-72.9296875, -24)"><rect/><foreignObject width="145.859375" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>Next.js Route<br />/v1/chat/completions</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-CORS-3" data-look="classic" transform="translate(561.671875, 93)"><rect class="basic label-container" style="" x="-83.796875" y="-27" width="167.59375" height="54"/><g class="label" style="" transform="translate(-53.796875, -12)"><rect/><foreignObject width="107.59375" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>CORS preflight</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Validate-5" data-look="classic" transform="translate(777.0546875, 93)"><rect class="basic label-container" style="" x="-81.5859375" y="-39" width="163.171875" height="78"/><g class="label" style="" transform="translate(-51.5859375, -24)"><rect/><foreignObject width="103.171875" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>Zod validation<br />(request body)</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Authz-7" data-look="classic" transform="translate(997.5546875, 93)"><rect class="basic label-container" style="" x="-88.9140625" y="-51" width="177.828125" height="102"/><g class="label" style="" transform="translate(-58.9140625, -36)"><rect/><foreignObject width="117.828125" height="72"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>AuthZ pipeline<br />(extractApiKey +<br />isValidApiKey)</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Policy-9" data-look="classic" transform="translate(1234.2734375, 93)"><rect class="basic label-container" style="" x="-97.8046875" y="-39" width="195.609375" height="78"/><g class="label" style="" transform="translate(-67.8046875, -24)"><rect/><foreignObject width="135.609375" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>API key policy<br />(allowlist + scopes)</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Guard-11" data-look="classic" transform="translate(1469.8828125, 93)"><rect class="basic label-container" style="" x="-87.8046875" y="-39" width="175.609375" height="78"/><g class="label" style="" transform="translate(-57.8046875, -24)"><rect/><foreignObject width="115.609375" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>Prompt-injection<br />guardrail</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-ChatCore-13" data-look="classic" transform="translate(1695.953125, 93)"><rect class="basic label-container" style="" x="-88.265625" y="-27" width="176.53125" height="54"/><g class="label" style="" transform="translate(-58.265625, -12)"><rect/><foreignObject width="116.53125" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>handleChatCore</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Cache-15" data-look="classic" transform="translate(1899.46875, 93)"><polygon points="65.25,0 130.5,-65.25 65.25,-130.5 0,-65.25" class="label-container" transform="translate(-64.75, 65.25)"/><g class="label" style="" transform="translate(-38.25, -12)"><rect/><foreignObject width="76.5" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>Cache hit?</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Return-17" data-look="classic" transform="translate(2127.265625, 35)"><rect class="basic label-container" style="" x="-82.03125" y="-27" width="164.0625" height="54"/><g class="label" style="" transform="translate(-52.03125, -12)"><rect/><foreignObject width="104.0625" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>Return cached</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Rate-19" data-look="classic" transform="translate(2127.265625, 151)"><rect class="basic label-container" style="" x="-87.640625" y="-39" width="175.28125" height="78"/><g class="label" style="" transform="translate(-57.640625, -24)"><rect/><foreignObject width="115.28125" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>Rate limit<br />(per-key, per-IP)</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Combo-21" data-look="classic" transform="translate(2329.6953125, 151)"><polygon points="64.7890625,0 129.578125,-64.7890625 64.7890625,-129.578125 0,-64.7890625" class="label-container" transform="translate(-64.2890625, 64.7890625)"/><g class="label" style="" transform="translate(-25.7890625, -24)"><rect/><foreignObject width="51.578125" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>Combo<br />target?</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Resolve-23" data-look="classic" transform="translate(2600.328125, 108)"><rect class="basic label-container" style="" x="-107.8125" y="-39" width="215.625" height="78"/><g class="label" style="" transform="translate(-77.8125, -24)"><rect/><foreignObject width="155.625" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>resolveComboTargets<br />(14 strategies)</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Single-25" data-look="classic" transform="translate(2856.1953125, 151)"><rect class="basic label-container" style="" x="-98.0546875" y="-39" width="196.109375" height="78"/><g class="label" style="" transform="translate(-68.0546875, -24)"><rect/><foreignObject width="136.109375" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>handleSingleModel<br />(per target)</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Translate-29" data-look="classic" transform="translate(3133.3984375, 151)"><rect class="basic label-container" style="" x="-129.1484375" y="-39" width="258.296875" height="78"/><g class="label" style="" transform="translate(-99.1484375, -24)"><rect/><foreignObject width="198.296875" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>translateRequest<br />(OpenAI↔Claude↔Gemini)</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Exec-31" data-look="classic" transform="translate(3393.6796875, 151)"><rect class="basic label-container" style="" x="-81.1328125" y="-39" width="162.265625" height="78"/><g class="label" style="" transform="translate(-51.1328125, -24)"><rect/><foreignObject width="102.265625" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>getExecutor<br />(31 executors)</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Upstream-33" data-look="classic" transform="translate(3621.5, 151)"><rect class="basic label-container" style="" x="-96.6875" y="-39" width="193.375" height="78"/><g class="label" style="" transform="translate(-66.6875, -24)"><rect/><foreignObject width="133.375" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>Upstream Provider<br />(177 providers)</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Stream-35" data-look="classic" transform="translate(3842.203125, 151)"><rect class="basic label-container" style="" x="-74.015625" y="-27" width="148.03125" height="54"/><g class="label" style="" transform="translate(-44.015625, -12)"><rect/><foreignObject width="88.03125" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>SSE / JSON</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Transformer-37" data-look="classic" transform="translate(4076.3984375, 201.125)"><rect class="basic label-container" style="" x="-110.1796875" y="-39" width="220.359375" height="78"/><g class="label" style="" transform="translate(-80.1796875, -24)"><rect/><foreignObject width="160.359375" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>responsesTransformer<br />(Responses↔Chat)</p></span></div></foreignObject></g></g></g></g></g><defs><filter id="my-svg-drop-shadow" height="130%" width="130%"><feDropShadow dx="4" dy="4" stdDeviation="0" flood-opacity="0.06" flood-color="#000000"/></filter></defs><defs><filter id="my-svg-drop-shadow-small" height="150%" width="150%"><feDropShadow dx="2" dy="2" stdDeviation="0" flood-opacity="0.06" flood-color="#000000"/></filter></defs></svg>