[{"data":1,"prerenderedAt":607},["ShallowReactive",2],{"navigation_docs":3,"-data-ops-llm-ops-espi-architecture":279,"-data-ops-llm-ops-espi-architecture-surround":603},[4,8,67,96,162,186,199,216,275],{"title":5,"path":6,"stem":7},"Introduction","\u002Fintroduction","0.introduction",{"title":9,"path":10,"stem":11,"children":12,"page":62},"Company","\u002Fcompany","1.company",[13,17,21,25,29,33,37,41,45,49,63],{"title":14,"path":15,"stem":16},"About","\u002Fcompany\u002Fabout","1.company\u002F0.about",{"title":18,"path":19,"stem":20},"Values","\u002Fcompany\u002Fvalues","1.company\u002F1.values",{"title":22,"path":23,"stem":24},"Communication","\u002Fcompany\u002Fcommunication","1.company\u002Fcommunication",{"title":26,"path":27,"stem":28},"Competition","\u002Fcompany\u002Fcompetition","1.company\u002Fcompetition",{"title":30,"path":31,"stem":32},"Hybrid Working","\u002Fcompany\u002Fhybrid-working","1.company\u002Fhybrid-working",{"title":34,"path":35,"stem":36},"Manchester Office","\u002Fcompany\u002Foffice","1.company\u002Foffice",{"title":38,"path":39,"stem":40},"Operations","\u002Fcompany\u002Foperations","1.company\u002Foperations",{"title":42,"path":43,"stem":44},"Policies","\u002Fcompany\u002Fpolicies","1.company\u002Fpolicies",{"title":46,"path":47,"stem":48},"Product Strategy","\u002Fcompany\u002Fproduct-strategy","1.company\u002Fproduct-strategy",{"title":50,"path":51,"stem":52,"children":53,"page":62},"Products","\u002Fcompany\u002Fproducts","1.company\u002Fproducts",[54,58],{"title":55,"path":56,"stem":57},"Capability Exchange","\u002Fcompany\u002Fproducts\u002Fcapability-exchange","1.company\u002Fproducts\u002Fcapability-exchange",{"title":59,"path":60,"stem":61},"ESProfiler Platform","\u002Fcompany\u002Fproducts\u002Fesprofiler","1.company\u002Fproducts\u002Fesprofiler",false,{"title":64,"path":65,"stem":66},"Security","\u002Fcompany\u002Fsecurity","1.company\u002Fsecurity",{"title":68,"path":69,"stem":70,"children":71,"page":62},"People Ops","\u002Fpeople-ops","2.people-ops",[72,76,80,84,88,92],{"title":73,"path":74,"stem":75},"Compensation","\u002Fpeople-ops\u002Fcompensation","2.people-ops\u002Fcompensation",{"title":77,"path":78,"stem":79},"Education","\u002Fpeople-ops\u002Feducation","2.people-ops\u002Feducation",{"title":81,"path":82,"stem":83},"Expenses","\u002Fpeople-ops\u002Fexpenses","2.people-ops\u002Fexpenses",{"title":85,"path":86,"stem":87},"Holiday & Leave","\u002Fpeople-ops\u002Fleave","2.people-ops\u002Fleave",{"title":89,"path":90,"stem":91},"Onboarding","\u002Fpeople-ops\u002Fonboarding","2.people-ops\u002Fonboarding",{"title":93,"path":94,"stem":95},"Recruitment","\u002Fpeople-ops\u002Frecruitment","2.people-ops\u002Frecruitment",{"title":97,"path":98,"stem":99,"children":100,"page":62},"Engineering","\u002Fengineering","3.engineering",[101,105,109,113,125,146,150,154,158],{"title":102,"path":103,"stem":104},"Development Setup","\u002Fengineering\u002Fdevelopment-setup","3.engineering\u002F1.development-setup",{"title":106,"path":107,"stem":108},"Contributing","\u002Fengineering\u002Fcontributing","3.engineering\u002Fcontributing",{"title":110,"path":111,"stem":112},"Production Database","\u002Fengineering\u002Fdatabase-connection","3.engineering\u002Fdatabase-connection",{"title":114,"path":115,"stem":116,"children":117},"Deployment","\u002Fengineering\u002Fdeployment","3.engineering\u002Fdeployment",[118,121],{"title":55,"path":119,"stem":120},"\u002Fengineering\u002Fdeployment\u002Fcapability-exchange","3.engineering\u002Fdeployment\u002Fcapability-exchange",{"title":122,"path":123,"stem":124},"Platform","\u002Fengineering\u002Fdeployment\u002Fplatform","3.engineering\u002Fdeployment\u002Fplatform",{"title":126,"path":127,"stem":128,"children":129,"page":62},"Github","\u002Fengineering\u002Fgithub","3.engineering\u002Fgithub",[130,134,138,142],{"title":131,"path":132,"stem":133},"Packages","\u002Fengineering\u002Fgithub\u002Fpackages","3.engineering\u002Fgithub\u002Fpackages",{"title":135,"path":136,"stem":137},"Personal Access Token","\u002Fengineering\u002Fgithub\u002Fpersonal-access-token","3.engineering\u002Fgithub\u002Fpersonal-access-token",{"title":139,"path":140,"stem":141},"Troubleshooting","\u002Fengineering\u002Fgithub\u002Ftroubleshooting","3.engineering\u002Fgithub\u002Ftroubleshooting",{"title":143,"path":144,"stem":145},"Workflows","\u002Fengineering\u002Fgithub\u002Fworkflows","3.engineering\u002Fgithub\u002Fworkflows",{"title":147,"path":148,"stem":149},"Platform Ops","\u002Fengineering\u002Fplatform-ops","3.engineering\u002Fplatform-ops",{"title":151,"path":152,"stem":153},"Project Management","\u002Fengineering\u002Fproject-management","3.engineering\u002Fproject-management",{"title":155,"path":156,"stem":157},"Releases","\u002Fengineering\u002Frelease","3.engineering\u002Frelease",{"title":159,"path":160,"stem":161},"Tools","\u002Fengineering\u002Ftools","3.engineering\u002Ftools",{"title":163,"path":164,"stem":165,"children":166,"page":62},"Design","\u002Fdesign","4.design",[167,171,175,179,182],{"title":168,"path":169,"stem":170},"Branding","\u002Fdesign\u002Fbranding","4.design\u002Fbranding",{"title":172,"path":173,"stem":174},"Design Thinking","\u002Fdesign\u002Fdesign-thinking","4.design\u002Fdesign-thinking",{"title":176,"path":177,"stem":178},"Figma","\u002Fdesign\u002Ffigma-structure","4.design\u002Ffigma-structure",{"title":159,"path":180,"stem":181},"\u002Fdesign\u002Ftools","4.design\u002Ftools",{"title":183,"path":184,"stem":185},"Customer Success","\u002Fdesign\u002Fworking-with-customers","4.design\u002Fworking-with-customers",{"title":187,"path":188,"stem":189,"children":190,"page":62},"Sales","\u002Fsales","4.sales",[191,195],{"title":192,"path":193,"stem":194},"Customer Onboarding","\u002Fsales\u002Fonboarding","4.sales\u002Fonboarding",{"title":196,"path":197,"stem":198},"Sales Tools","\u002Fsales\u002Ftools","4.sales\u002Ftools",{"title":200,"path":201,"stem":202,"children":203,"page":62},"Marketing","\u002Fmarketing","5.marketing",[204,208,212],{"title":205,"path":206,"stem":207},"Content","\u002Fmarketing\u002Fcontent","5.marketing\u002Fcontent",{"title":209,"path":210,"stem":211},"Messaging","\u002Fmarketing\u002Fmessaging","5.marketing\u002Fmessaging",{"title":213,"path":214,"stem":215},"Website","\u002Fmarketing\u002Fwebsite","5.marketing\u002Fwebsite",{"title":217,"path":218,"stem":219,"children":220,"page":62},"AI & Data Ops","\u002Fdata-ops","6.data-ops",[221,229,233,258,271],{"title":55,"path":222,"stem":223,"children":224,"page":62},"\u002Fdata-ops\u002Fcapability-exchange","6.data-ops\u002FCapability Exchange",[225],{"title":226,"path":227,"stem":228},"Leaderboard Calculation","\u002Fdata-ops\u002Fcapability-exchange\u002Fleaderboard-calculation","6.data-ops\u002FCapability Exchange\u002Fleaderboard-calculation",{"title":230,"path":231,"stem":232},"Account Portal (CAS)","\u002Fdata-ops\u002Faccount-portal","6.data-ops\u002Faccount-portal",{"title":234,"path":235,"stem":236,"children":237,"page":62},"Data Management","\u002Fdata-ops\u002Fdata-management","6.data-ops\u002Fdata-management",[238,242,246,250,254],{"title":239,"path":240,"stem":241},"Adding Products","\u002Fdata-ops\u002Fdata-management\u002Fadding-products","6.data-ops\u002Fdata-management\u002Fadding-products",{"title":243,"path":244,"stem":245},"Adding Vendors","\u002Fdata-ops\u002Fdata-management\u002Fadding-vendors","6.data-ops\u002Fdata-management\u002Fadding-vendors",{"title":247,"path":248,"stem":249},"Framework Mapping","\u002Fdata-ops\u002Fdata-management\u002Fframework-mapping","6.data-ops\u002Fdata-management\u002Fframework-mapping",{"title":251,"path":252,"stem":253},"Refreshing Vendors","\u002Fdata-ops\u002Fdata-management\u002Frefreshing-vendors","6.data-ops\u002Fdata-management\u002Frefreshing-vendors",{"title":255,"path":256,"stem":257},"Reviewing Draft Vendors","\u002Fdata-ops\u002Fdata-management\u002Freviewing-draft-vendors","6.data-ops\u002Fdata-management\u002Freviewing-draft-vendors",{"title":259,"path":260,"stem":261,"children":262,"page":62},"LLM Ops","\u002Fdata-ops\u002Fllm-ops","6.data-ops\u002Fllm-ops",[263,267],{"title":264,"path":265,"stem":266},"Agents","\u002Fdata-ops\u002Fllm-ops\u002Fagents","6.data-ops\u002Fllm-ops\u002F1.agents",{"title":268,"path":269,"stem":270},"ESPi Architecture & Query Flow","\u002Fdata-ops\u002Fllm-ops\u002Fespi-architecture","6.data-ops\u002Fllm-ops\u002F2.espi-architecture",{"title":272,"path":273,"stem":274},"Message Queues","\u002Fdata-ops\u002Fmessage-queues","6.data-ops\u002Fmessage-queues",{"title":276,"path":277,"stem":278},"Glossary","\u002Fglossary","glossary",{"id":280,"title":268,"body":281,"description":596,"extension":597,"links":598,"meta":599,"navigation":600,"path":269,"seo":601,"stem":270,"__hash__":602},"docs\u002F6.data-ops\u002Fllm-ops\u002F2.espi-architecture.md",{"type":282,"value":283,"toc":585},"minimark",[284,289,298,303,348,351,355,366,371,378,458,461,463,467,470,557,559,563,582],[285,286,288],"h2",{"id":287},"espi-architecture-flow","ESPi Architecture & Flow",[290,291,292,293,297],"p",{},"For non-technical stakeholders, this functional flowchart shows the end-to-end journey of a user query in ",[294,295,296],"strong",{},"6 simple steps",", highlighting how the agent dynamically loads capabilities to build interactive responses:",[299,300],"mermaid",{"code":301,":zoom":302},"graph TD\n    A(\"1. User Submission\"):::client --> B(\"2. Context Analysis\"):::agent\n    B --> C{\"Is Tool Needed?\"}:::agent\n    \n    C -- \"No\" --> F(\"5. Stream Markdown Response\"):::client\n    C -- \"Yes\" --> D(\"3. On-Demand Tool Search\"):::infra\n    \n    D --> E(\"4. Execute Backend APIs\"):::domain\n    E --> G(\"Load Citations & Resources\"):::infra\n    G --> F\n    \n    F --> H(\"6. Rich Interactive UI\"):::client\n","0.25",[304,305,306,313,319,330,336,342],"ol",{},[307,308,309,312],"li",{},[294,310,311],{},"User Submission:"," The user submits a question (e.g., \"Compare CrowdStrike and Wiz licenses\") along with what screen they are currently looking at on the platform.",[307,314,315,318],{},[294,316,317],{},"Context Analysis:"," ESPi analyzes the request and uses previous chat memory and viewport context to determine user intent.",[307,320,321,324,325,329],{},[294,322,323],{},"On-Demand Tool Search:"," If the query requires platform data, ESPi dynamically searches the ",[326,327,328],"code",{},"Vector Tool Index"," for relevant skills (like contract summaries or capability metrics).",[307,331,332,335],{},[294,333,334],{},"Execute Backend APIs:"," ESPi runs the matched tools to fetch live database records, calculate priorities, or render visual HTML reports.",[307,337,338,341],{},[294,339,340],{},"Stream Markdown Response:"," The agent streams the response tokens in real-time, including thinking progress.",[307,343,344,347],{},[294,345,346],{},"Rich Interactive UI:"," The browser renders the finalized text alongside live checklists, interactive citation cards, and actionable next steps.",[349,350],"hr",{},[285,352,354],{"id":353},"high-level-overview","High-Level Overview",[290,356,357,358,361,362,365],{},"ESPi is built on top of ",[294,359,360],{},"Spring AI"," and is backed by the Google Gemini model family (utilizing advanced reasoning capabilities). It acts as an ",[294,363,364],{},"agent orchestrator",", meaning it doesn't just answer questions statically—it dynamically plans, reasons, searches the internal\u002Fexternal platform data, and delegates tasks to specialized sub-agents or rendering systems (like the stand-alone HTML Notebooks).",[367,368,370],"h3",{"id":369},"on-demand-tool-discovery-the-tool-search-tool-pattern","On-Demand Tool Discovery (The \"Tool Search Tool\" Pattern)",[290,372,373,374,377],{},"Rather than sending the entire library of available tools (contracts, capability colliders, notebooks, email, search, etc.) to the Gemini model on every request—which would bloat the context window, raise costs, and degrade model reasoning—ESPi implements Spring AI's ",[294,375,376],{},"Tool Search Tool"," pattern for on-demand discovery.",[304,379,380,402,415,428,449],{},[307,381,382,385,386,389,390,393,394,397,398,401],{},[294,383,384],{},"Minimal Initial Context:"," When the ",[326,387,388],{},"ChatClient"," request is built, the ",[326,391,392],{},"ToolSearchToolCallingAdvisor"," injects only ",[294,395,396],{},"one primary tool"," upfront: the ",[326,399,400],{},"toolSearchTool"," itself. This keeps initial token usage extremely low and avoids model confusion.",[307,403,404,407,408,410,411,414],{},[294,405,406],{},"On-Demand Call:"," When the LLM starts reasoning and realizes it needs a specific platform capability (e.g., searching contracts or viewing a capability collider), it calls the ",[326,409,400],{}," with a natural language query (e.g., ",[326,412,413],{},"toolSearchTool(query=\"commercial skills\")",").",[307,416,417,420,421,423,424,427],{},[294,418,419],{},"Dynamic Expansion:"," The ",[326,422,400],{}," executes under the hood, querying the ",[326,425,426],{},"Vector Store (Tool Index)"," to locate matching tool definitions.",[307,429,430,433,434,437,438,437,441,444,445,448],{},[294,431,432],{},"Context Injection:"," The tool definitions that match (e.g., ",[326,435,436],{},"contractSummary",", ",[326,439,440],{},"contractList",[326,442,443],{},"contractGet",") are ",[294,446,447],{},"dynamically expanded and registered"," directly into the active prompt's tool options.",[307,450,451,454,455,457],{},[294,452,453],{},"Execution of Discovered Tools:"," The LLM receives the newly discovered tools and is now able to invoke them directly (e.g., calling ",[326,456,436],{},") to get the actual platform business data.",[290,459,460],{},"This achieves massive token savings while maintaining access to a huge catalog of custom tools, allowing the agent to dynamically load capabilities on-the-fly.",[349,462],{},[285,464,466],{"id":465},"connector-legend","Connector Legend",[290,468,469],{},"To help you read the sequence diagram, here is what each line style and connector represents:",[471,472,473,490],"table",{},[474,475,476],"thead",{},[477,478,479,484,487],"tr",{},[480,481,483],"th",{"align":482},"left","Connector Style",[480,485,486],{"align":482},"Diagram Symbol",[480,488,489],{"align":482},"Meaning \u002F Flow Type",[491,492,493,510,526,542],"tbody",{},[477,494,495,501,507],{},[496,497,498],"td",{"align":482},[294,499,500],{},"Synchronous Call",[496,502,503,506],{"align":482},[326,504,505],{},"->>"," (Solid line, filled arrow)",[496,508,509],{"align":482},"A blocking request or direct method call expecting an immediate return.",[477,511,512,517,523],{},[496,513,514],{"align":482},[294,515,516],{},"Response \u002F Return",[496,518,519,522],{"align":482},[326,520,521],{},"-->>"," (Dashed line, open arrow)",[496,524,525],{"align":482},"A returned payload, data stream chunk, or asynchronous response.",[477,527,528,533,539],{},[496,529,530],{"align":482},[294,531,532],{},"Async Notification",[496,534,535,538],{"align":482},[326,536,537],{},"->"," (Solid line, open arrow)",[496,540,541],{"align":482},"An asynchronous event, signal, or message push (non-blocking).",[477,543,544,549,554],{},[496,545,546],{"align":482},[294,547,548],{},"Self Processing",[496,550,551,553],{"align":482},[326,552,505],{}," to self (Loop arrow)",[496,555,556],{"align":482},"An internal operation, state change, or self-method execution.",[349,558],{},[285,560,562],{"id":561},"espi-sequence-diagram","ESPi Sequence Diagram",[290,564,565,566,569,570,573,574,577,578,581],{},"This diagram separates ",[294,567,568],{},"Infrastructure & Storage"," (like the ",[326,571,572],{},"Vector Store"," and ",[326,575,576],{},"ESPChatMemory",") from high-level ",[294,579,580],{},"Platform Business Services",".",[299,583],{"code":584},"%%{init: { 'config': { 'sequence': { 'actorMargin': 150, 'boxMargin': 20, 'boxTextMargin': 10 } } }%%\nsequenceDiagram\n    autonumber\n\n    box \"Client Tier\" #f0f7ff\n        actor User\n        participant UI as Chat UI (Frontend)\n    end\n    \n    box \"API Gateway & Orchestration\" #f3faf1\n        participant CC as ConversationController\n        participant CS as ChatService\n    end\n    \n    box \"Intelligence Core (Spring AI)\" #fefbf0\n        participant Adv as Advisor Chain\n        participant ESPi as ChatClient (ESPi Orchestrator)\n        participant Tools as Skills & Tools\n    end\n    \n    box \"Infrastructure & Storage\" #f5f5f5\n        participant DB as ESPChatMemory \u002F DB\n        participant VS as Vector Store (Tool Index)\n    end\n    \n    box \"Platform Business Services\" #fff0f0\n        participant Plat as Platform APIs & Renderer\n    end\n\n    %% PHASE 1: QUERY ENTRY\n    Note over User, UI: === PHASE 1: USER QUERY SUBMISSION ===\n    \n    User->>UI: Types query & submits\n    activate UI\n    \n    UI->>CC: POST \u002Fapi\u002Fv1\u002Fintelligence\u002Fconversations\u002F{id}\u003Cbr\u002F>(Includes query & UI Screen Context)\n    activate CC\n\n\n    %% PHASE 2: ORCHESTRATION SETUP\n    Note over CC, CS: === PHASE 2: CONTEXT & ORCHESTRATION SETUP ===\n    \n    CC->>CS: aiChatMessageCreate(id, chatMessage)\n    activate CS\n    \n    CS->>CS: Initialize Thread-Safe Context Maps:\u003Cbr\u002F>GLOBAL_RESOURCES, ESPI_QUESTIONS,\u003Cbr\u002F>ESPI_TODO, GLOBAL_TOOL_EVENTS (Sink)\n    \n    CS->>DB: Persist incoming User Message\n    activate DB\n    DB-->>CS: Save complete\n    deactivate DB\n    \n\n\n    %% PHASE 3: ADVISOR PROCESSING\n    Note over CS, Adv: === PHASE 3: PRE-PROCESSING ADVISORS ===\n    \n    CS->>Adv: Trigger Advisor Chain (before request)\n    activate Adv\n    \n    Adv->>DB: [SummaryChatMemoryAdvisor] Load chat history\n    activate DB\n    DB-->>Adv: Return history\n    deactivate DB\n    \n    Note over Adv: If >20 messages since last summary,\u003Cbr\u002F>summarize history via GEMINI_3_1_FLASH_LITE\u003Cbr\u002F>to save token budget.\n    \n    Adv->>Adv: [UIContextAdvisor]\u003Cbr\u002F>Check if viewport changed. If yes,\u003Cbr\u002F>inject a hidden UI-context message to memory.\n    \n    Adv->>Adv: [ToolSearchToolCallingAdvisor]\u003Cbr\u002F>Registers ONLY the single 'toolSearchTool' upfront\u003Cbr\u002F>to prompt request.\n    \n    Adv-->>CS: Return enriched request (with history & ONLY 'toolSearchTool' available)\n    deactivate Adv\n\n\n    %% PHASE 4: ON-DEMAND TOOL DISCOVERY LOOP\n    Note over CS, ESPi: === PHASE 4: ON-DEMAND TOOL DISCOVERY LOOP ===\n    \n    CS->>ESPi: Stream Chat Response (System Prompt: agent-copilot.st)\n    activate ESPi\n    \n    ESPi->>ESPi: Reason on query & realize tools are needed\n    \n    ESPi->>Tools: Call toolSearchTool(query=\"commercial skills\")\n    activate Tools\n    \n    Tools->>VS: Query Vector Store with semantic term\n    activate VS\n    VS-->>Tools: Return matching tool definitions (e.g. contractSummary)\n    deactivate VS\n    \n    Tools->>Tools: Dynamically register\u002Fexpand matched tools\u003Cbr\u002F>into current ChatOptions context\n    \n    Tools-->>ESPi: Return discovery success (Discovered tools are now active)\n    deactivate Tools\n\n\n    %% PHASE 5: DOMAIN TOOL EXECUTION LOOP\n    Note over ESPi, Tools: === PHASE 5: DOMAIN TOOL EXECUTION LOOP ===\n    \n    ESPi->>Tools: Invoke discovered tool (e.g., contractSummary)\n    activate Tools\n    \n    opt Skill Plan Execution (e.g. Vendor Briefing \u002F Market Scout)\n        Tools->>Tools: Write research checklist\u002Ftodos to ESPI_TODO context\n    end\n    \n    Tools->CS: Emit status progress event to GLOBAL_TOOL_EVENTS (Sink)\n    CS-->>UI: Stream Live Tool Progress (Subagent Events)\n    \n    Tools->>Plat: Invoke underlying system (SearchService, ContractController, etc.)\n    activate Plat\n    Plat-->>Tools: Return raw data \u002F generated HTML Notebook URL\n    deactivate Plat\n    \n    Tools->>Tools: Append result reference to GLOBAL_RESOURCES (Citations)\n    \n    Tools-->>ESPi: Return tool output to LLM\n    deactivate Tools\n\n\n    %% PHASE 6: STREAMING RESPONSE & CONSOLIDATION\n    Note over ESPi, CS: === PHASE 6: STREAMING RESPONSE & FINALIZATION ===\n    \n    ESPi-->>CS: Stream Response Chunks (Text Tokens & Thinking States)\n    activate CS\n    CS-->>UI: Stream Active Chunks (Text Delta & Thinking State)\n    deactivate CS\n    \n    ESPi-->>CS: Stream Complete (Closes eventSink)\n    deactivate ESPi\n    \n    CS->>CS: getResourcesChunk()\u003Cbr\u002F>(Consolidates completed Citations, Todos, Questions, Next Steps)\n    \n    CS-->>UI: Stream Final Metadata Chunk (Citations, Questions, Next Steps)\n    deactivate CC\n    deactivate UI\n    \n    CS->>DB: Attach citations\u002Fresources to assistant message record\n    activate DB\n    DB-->>CS: Save complete\n    deactivate DB\n    \n    deactivate CS\n    \n    Note over UI, User: UI renders complete response (rich markdown, thinking blocks,\u003Cbr\u002F>interactive resource cards & checklist)\n",{"title":586,"searchDepth":587,"depth":587,"links":588},"",2,[589,590,594,595],{"id":287,"depth":587,"text":288},{"id":353,"depth":587,"text":354,"children":591},[592],{"id":369,"depth":593,"text":370},3,{"id":465,"depth":587,"text":466},{"id":561,"depth":587,"text":562},"This document provides a high-level overview, a component breakdown, and detailed diagrams of how ESPi (ESPROFILER Intelligence), the AI co-pilot and agent orchestrator built into ESPROFILER, handles and processes user queries.","md",null,{},true,{"title":268,"description":596},"rae-9YMOYO1g4NAxbTW9nb_DgrWsohfYNlo-0_UUeMA",[604,606],{"title":264,"path":265,"stem":266,"description":605,"children":-1},"Inventory of Spring AI ChatClient agents in platform-api.",{"title":272,"path":273,"stem":274,"description":586,"children":-1},1784892026381]