[{"data":1,"prerenderedAt":819},["ShallowReactive",2],{"navigation_docs":3,"-features-context-engine":107,"-features-context-engine-surround":814},[4,26,82],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":25},"Getting Started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Overview","\u002Fgetting-started\u002Foverview","1.getting-started\u002F1.overview","i-lucide-info",{"title":16,"path":17,"stem":18,"icon":19},"Platform Navigation","\u002Fgetting-started\u002Fplatform-navigation","1.getting-started\u002F2.platform-navigation","i-lucide-compass",{"title":21,"path":22,"stem":23,"icon":24},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F3.quickstart","i-lucide-play-circle",false,{"title":27,"icon":28,"path":29,"stem":30,"children":31,"page":25},"Features","i-lucide-star","\u002Ffeatures","2.features",[32,37,42,47,52,57,62,67,72,77],{"title":33,"path":34,"stem":35,"icon":36},"Feature Overview","\u002Ffeatures\u002Foverview","2.features\u002F1.overview","i-lucide-list",{"title":38,"path":39,"stem":40,"icon":41},"Context Engine","\u002Ffeatures\u002Fcontext-engine","2.features\u002F10.context-engine","i-lucide-layers",{"title":43,"path":44,"stem":45,"icon":46},"Company Setup","\u002Ffeatures\u002Fcompany-setup","2.features\u002F2.company-setup","i-lucide-building-2",{"title":48,"path":49,"stem":50,"icon":51},"Applications","\u002Ffeatures\u002Fapplications","2.features\u002F3.applications","i-lucide-box",{"title":53,"path":54,"stem":55,"icon":56},"Observability","\u002Ffeatures\u002Fobservability","2.features\u002F4.observability","i-lucide-activity",{"title":58,"path":59,"stem":60,"icon":61},"Guardrails","\u002Ffeatures\u002Fguardrails","2.features\u002F5.guardrails","i-lucide-shield-alert",{"title":63,"path":64,"stem":65,"icon":66},"Data Integrations","\u002Ffeatures\u002Fdata-integrations","2.features\u002F6.data-integrations","i-lucide-database",{"title":68,"path":69,"stem":70,"icon":71},"Models and Routing","\u002Ffeatures\u002Fmodels-and-routing","2.features\u002F7.models-and-routing","i-lucide-git-branch",{"title":73,"path":74,"stem":75,"icon":76},"Governance","\u002Ffeatures\u002Fgovernance","2.features\u002F8.governance","i-lucide-shield-check",{"title":78,"path":79,"stem":80,"icon":81},"Tools","\u002Ffeatures\u002Ftools","2.features\u002F9.tools","i-lucide-wrench",{"title":83,"icon":84,"path":85,"stem":86,"children":87,"page":25},"Integrations","i-lucide-plug","\u002Fintegrations","3.integrations",[88,93,97,102],{"title":89,"path":90,"stem":91,"icon":92},"Using the API","\u002Fintegrations\u002Fapi-usage","3.integrations\u002F3.api-usage","i-lucide-terminal-square",{"title":94,"path":95,"stem":96,"icon":84},"Test an MCP connection","\u002Fintegrations\u002Fmcp-gateway","3.integrations\u002F4.mcp-gateway",{"title":98,"path":99,"stem":100,"icon":101},"API Keys","\u002Fintegrations\u002Fapi-keys","3.integrations\u002Fapi-keys","i-lucide-key-round",{"title":103,"path":104,"stem":105,"icon":106},"Providers","\u002Fintegrations\u002Fproviders","3.integrations\u002Fproviders","i-lucide-cpu",{"id":108,"title":38,"body":109,"description":807,"extension":808,"links":809,"meta":810,"navigation":811,"path":39,"seo":812,"stem":40,"__hash__":813},"docs\u002F2.features\u002F10.context-engine.md",{"type":110,"value":111,"toc":798},"minimark",[112,121,124,139,142,186,190,193,196,222,233,236,250,257,260,267,281,290,296,344,347,350,353,356,382,385,393,396,402,412,420,426,429,432,434,460,468,473,525,549,554,557,560,566,568,605,614,640,643,646,649,657,673,698,709,732,735,738,748,750,763,766,769,772,775,778,789,794],[113,114,115,116,120],"p",{},"The Context Engine shapes what an application actually sends to a model. It is configured per application in ",[117,118,119],"strong",{},"Applications > your application > Modules > Context",". You can toggle on and off different components to suit what your application needs.",[113,122,123],{},"This module modifies the raw request you send to Optiak. It modifies the message or list of messages in several ways: it cuts input tokens, keeps long conversations inside the model context window, and measures the impact in token expenditure.",[125,126,129,132,133,138],"callout",{"color":127,"icon":128},"warning","i-lucide-triangle-alert",[117,130,131],{},"Lower cost can affect accuracy."," Every component reduces what the model sees. Fewer input tokens lower the cost of each request, but removing or compressing context can remove information the model needs to answer correctly. Start each component in ",[134,135,137],"a",{"href":136},"#optimize-and-audit","Audit",".",[113,140,141],{},"On this page:",[143,144,145,153,159,180],"ul",{},[146,147,148,152],"li",{},[134,149,151],{"href":150},"#how-it-works","How It Works"," - The pipeline, and what a message, item, and turn are.",[146,154,155,158],{},[134,156,157],{"href":136},"Optimize And Audit"," - Measure a component before it changes requests.",[146,160,161,162,166,167,166,171,175,176,138],{},"Components - ",[134,163,165],{"href":164},"#smart-compression","Smart Compression",", ",[134,168,170],{"href":169},"#context-compression","Context Compression",[134,172,174],{"href":173},"#sliding-window","Sliding Window",", and ",[134,177,179],{"href":178},"#context-budgeting","Context Budgeting",[146,181,182,185],{},[134,183,53],{"href":184},"#observability"," - Read the result of each component in request traces.",[187,188,151],"h2",{"id":189},"how-it-works",[113,191,192],{},"The Context Engine operates as a pipeline, making decisions at each step. When the request arrives, each enabled component runs in order, and the resulting context (the list of messages) is sent to the LLM:",[113,194,195],{},"Components work on the messages of the conversation:",[143,197,198,204,210,216],{},[146,199,200,203],{},[117,201,202],{},"System (S)"," - System and developer instructions.",[146,205,206,209],{},[117,207,208],{},"User (U)"," - A message from the user.",[146,211,212,215],{},[117,213,214],{},"Assistant (A)"," - A reply from the model.",[146,217,218,221],{},[117,219,220],{},"Tool exchange (A + T1 + T2 ... + A)"," - An assistant message that calls one or more tools, the tool results (T1, T2, ...), and the assistant reply that uses them.",[113,223,224,225,228,229,232],{},"Each message, or each complete tool exchange, is one ",[117,226,227],{},"item",". A user message plus every item that follows it until the next user message is one ",[117,230,231],{},"turn",". When this page says a component removes a whole unit, the unit is an item or a turn.",[113,234,235],{},"Two rules apply to every component:",[143,237,238,244],{},[146,239,240,243],{},[117,241,242],{},"The original request stays the source of truth."," Images, files, tool-call IDs, and provider metadata are rebuilt unchanged. Components only remove whole units or rewrite text.",[146,245,246,249],{},[117,247,248],{},"Some messages are never removed."," System and developer instructions, the active user message, incomplete tool exchanges, and data that Optiak cannot interpret safely are always kept.",[113,251,252,253,256],{},"Components are added from the ",[117,254,255],{},"Add components"," catalog and appear as steps in the pipeline view. Removing a component takes it out of the pipeline without changing the rest of the configuration.",[187,258,157],{"id":259},"optimize-and-audit",[113,261,262,263,266],{},"When you enable a component, you must choose an ",[117,264,265],{},"Action",":",[143,268,269,275],{},[146,270,271,274],{},[117,272,273],{},"Audit (no action)"," - The component runs and its result is recorded, but the request is unchanged. Use this to understand the impact of the component in token expenditure, and how the component works, before applying it.",[146,276,277,280],{},[117,278,279],{},"Optimize"," - The component runs and its result is applied to the request.",[113,282,283,284,286,287,289],{},"Some components are more aggressive modifying the context than others. Start in ",[117,285,137],{},", send real traffic, and read the measured savings. Then switch to ",[117,288,279],{}," once the numbers and the retained context look right. This matters most for Sliding Window and Context Budgeting, which entirely remove content rather than shorten it.",[113,291,292,293,295],{},"Also note that you only see the real impact on the responses of the model in ",[117,294,279],{}," mode. In Audit, the model still receives the original request.",[297,298,303],"pre",{"className":299,"code":300,"language":301,"meta":302,"style":302},"language-mermaid shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","flowchart TD\n  A{Component enabled?} -->|no| S[Step skipped]\n  A -->|yes| R[Run the component and measure it]\n  R --> D{Action}\n  D -->|Audit| K[Request unchanged, result recorded]\n  D -->|Optimize| U[Result applied to the request]\n","mermaid","",[304,305,306,314,320,326,332,338],"code",{"__ignoreMap":302},[307,308,311],"span",{"class":309,"line":310},"line",1,[307,312,313],{},"flowchart TD\n",[307,315,317],{"class":309,"line":316},2,[307,318,319],{},"  A{Component enabled?} -->|no| S[Step skipped]\n",[307,321,323],{"class":309,"line":322},3,[307,324,325],{},"  A -->|yes| R[Run the component and measure it]\n",[307,327,329],{"class":309,"line":328},4,[307,330,331],{},"  R --> D{Action}\n",[307,333,335],{"class":309,"line":334},5,[307,336,337],{},"  D -->|Audit| K[Request unchanged, result recorded]\n",[307,339,341],{"class":309,"line":340},6,[307,342,343],{},"  D -->|Optimize| U[Result applied to the request]\n",[187,345,165],{"id":346},"smart-compression",[113,348,349],{},"Smart Compression gets rid of redundant content to shorten the amount of content and tool results. User messages and instructions are never compressed.",[113,351,352],{},"It is lossless and structural: repeated content is folded, and every fold is verified to restore the original text. Nothing is summarized or reworded, so prose and source code come back unchanged.",[113,354,355],{},"It pays off most on verbose tool output:",[143,357,358,364,370,376],{},[146,359,360,363],{},[117,361,362],{},"Logs and build output"," - Terminal colors are stripped, and repeated lines collapse to a repetition marker.",[146,365,366,369],{},[117,367,368],{},"Search results"," - A file path repeated on every match becomes one heading above its matches.",[146,371,372,375],{},[117,373,374],{},"Repeated blocks"," - Compresses identical chunks in YAML, TOML, INI or plain text into a reference.",[146,377,378,381],{},[117,379,380],{},"Diffs"," - Compacted by dropping git bookkeeping the model does not need. The changed lines stay as they are, so the diff still applies.",[113,383,384],{},"Configure:",[143,386,387],{},[146,388,389,392],{},[117,390,391],{},"Minimum tokens to compress"," - Applied per message, history below this token count is left untouched. The default is 250 tokens, and the lowest accepted value is 20.",[113,394,395],{},"Use it as the low-risk first step: it reduces verbose tool output and structured payloads without dropping any message from the conversation.",[113,397,398,401],{},[117,399,400],{},"Measured impact"," - In internal benchmarks on SWE-bench agent trajectories, Smart Compression reduced the tool outputs that contain redundant content by between 6% and 18%, depending on the content type. Outputs with no repetition, such as a list of distinct file names, pass through unchanged, so the saving across a whole conversation depends on how repetitive its tool output is.",[113,403,404,407,408,411],{},[117,405,406],{},"Example"," - A ",[304,409,410],{},"grep -rn"," over a build directory returned many lines, but most of them were duplicates: a generated file repeated the same declaration dozens of times. Smart Compression folded the repeats into one line and a marker:",[297,413,418],{"className":414,"code":416,"language":417,"meta":302},[415],"language-text",".\u002Fmpy-cross\u002Fbuild\u002Fmpy-cross.map:mp_obj_int_get_checked          build\u002Fpy\u002Fobjint_mpz.o\n.\u002Fmpy-cross\u002Fbuild\u002Fgenhdr\u002Fqstr.i.last:mp_int_t mp_obj_int_get_checked(mp_const_obj_t self_in);\n... (repeated 39 times)\n","text",[304,419,416],{"__ignoreMap":302},[113,421,422,423,425],{},"These numbers vary with your use case. Run Smart Compression in ",[134,424,137],{"href":136}," first to measure its impact on your own traffic.",[187,427,170],{"id":428},"context-compression",[113,430,431],{},"Context Compression summarizes data retrieved by enrichment, such as vector search results and web search results, against the user's current question, so only the query-relevant part reaches the model. This allows to get rid of irrelevant information in the retrieved data and focus on what's important.",[113,433,384],{},[143,435,436,442],{},[146,437,438,441],{},[117,439,440],{},"Dynamic ratio"," - Let the engine choose how much to compress. This is set by default.",[146,443,444,447,448,451,452,455,456,459],{},[117,445,446],{},"Compression level"," - With dynamic ratio off, choose how much of the retrieved data to remove: ",[117,449,450],{},"Conservative"," (about 25%), ",[117,453,454],{},"Balanced"," (about 50%), or ",[117,457,458],{},"Aggressive"," (about 75%). Aggressive compression can remove important information, so use it carefully. Choose the level based on how dense your retrieved documents are: dense, information-rich documents need a lighter level, while verbose or repetitive ones can take a more aggressive one. A ratio saved before levels existed shows as a custom level until you pick one.",[113,461,462,463,465,466,138],{},"This component only affects retrieved data. Requests without enrichment pass through this component untouched. See ",[134,464,63],{"href":64}," and ",[134,467,78],{"href":79},[113,469,470,472],{},[117,471,400],{}," - In internal benchmarks on long-document question answering (10k to 1M tokens):",[474,475,476,492],"table",{},[477,478,479],"thead",{},[480,481,482,486,489],"tr",{},[483,484,485],"th",{},"Level",[483,487,488],{},"Input cost",[483,490,491],{},"Accuracy",[493,494,495,506,515],"tbody",{},[480,496,497,500,503],{},[498,499,450],"td",{},[498,501,502],{},"about 11% lower",[498,504,505],{},"unchanged",[480,507,508,510,513],{},[498,509,454],{},[498,511,512],{},"about 36% lower",[498,514,505],{},[480,516,517,519,522],{},[498,518,458],{},[498,520,521],{},"about 61% lower",[498,523,524],{},"about 4.5 points lower",[143,526,527,533,538,544],{},[146,528,529,532],{},[117,530,531],{},"Cost"," - Savings depend on the price of the model that receives the context. Compression has its own per-token cost, so the more expensive the model, the more each removed token saves. On cheap models, Conservative can cost more than it saves.",[146,534,535,537],{},[117,536,491],{}," - Losses with Aggressive come mostly from questions that combine information from several documents. Questions answered from a single document were unaffected.",[146,539,540,543],{},[117,541,542],{},"Latency"," - Compression runs before the model call, so responses were slower in every case tested. Heavily compressed context can also make reasoning models think longer.",[146,545,546,548],{},[117,547,440],{}," - Performed about the same as a fixed level that removes the same share.",[113,550,551,552,425],{},"Use it to lower cost, not response time. These numbers vary with your use case, so run Context Compression in ",[134,553,137],{"href":136},[187,555,174],{"id":556},"sliding-window",[113,558,559],{},"Sliding Window keeps a window of recent conversation and drops the history outside it.",[125,561,562,565],{"color":127,"icon":128},[117,563,564],{},"Messages may be removed."," Unlike compression, Sliding Window drops older history outright: what it removes is gone from the request. Run it in Audit first to see what would be removed.",[113,567,384],{},[143,569,570,593,599],{},[146,571,572,575,576,578,579],{},[117,573,574],{},"Retention unit"," - What counts as one unit. See ",[134,577,151],{"href":150}," for items and turns.\n",[143,580,581,587],{},[146,582,583,586],{},[117,584,585],{},"Conversation turns",": One unit is one turn: a user message and everything that follows it, until the next user message. A turn with many tool calls is still one unit.",[146,588,589,592],{},[117,590,591],{},"Context items",": One unit is one item: each user or assistant message, or complete tool exchange, is its own item. This can retain an assistant message without the user message that preceded it.",[146,594,595,598],{},[117,596,597],{},"Keep first units"," - Units retained from the start of the conversation. Keeping the opening turn preserves the task framing that started the conversation.",[146,600,601,604],{},[117,602,603],{},"Keep latest units"," - Units retained from the most recent history.",[113,606,607,608,610,611,613],{},"The sliding window does not interfere with critical history. The following is never removed, and does not count towards the ",[117,609,597],{}," or ",[117,612,603],{}," quota:",[143,615,616,622,628,634],{},[146,617,618,621],{},[117,619,620],{},"System and developer instructions"," - Including the application system prompt from Inference settings, wherever they sit in the conversation. In conversation-turn mode they stand outside the turns; an instruction in the middle of a conversation also closes the turn before it.",[146,623,624,627],{},[117,625,626],{},"The active user message and everything after it"," - The last user message plus any assistant message or tool exchange that follows it, up to the end of the request.",[146,629,630,633],{},[117,631,632],{},"Incomplete tool exchanges"," - A tool call whose results have not yet arrived.",[146,635,636,639],{},[117,637,638],{},"Protocol data that Optiak cannot interpret safely"," - Reasoning blocks, provider-specific items, and tool results with no matching call.",[113,641,642],{},"In conversation-turn mode, a turn that contains any of the above is kept whole, and so is an incomplete turn: a user message with no response yet, or response-side items with no user message before them.",[113,644,645],{},"In context-item mode, only the protected items themselves are kept. The items around them are still optional units and can be removed.",[113,647,648],{},"Two more rules keep the request valid:",[143,650,651,654],{},[146,652,653],{},"When there are no more optional units than the quotas allow, nothing is removed at all.",[146,655,656],{},"When a window would leave the request with instructions and nothing else, the latest unit is kept.",[113,658,659,661,662,664,665,668,669,672],{},[117,660,406],{}," - Retention unit ",[117,663,585],{},", keep first ",[117,666,667],{},"1",", keep latest ",[117,670,671],{},"2",". The turns in red are dropped; everything else reaches the model:",[297,674,676],{"className":299,"code":675,"language":301,"meta":302,"style":302},"flowchart LR\n  S[System prompt] --> T1[Turn 1] --> T2[Turn 2] --> T3[Turn 3] --> T4[Turn 4] --> T5[Turn 5] --> A[Active turn]\n  classDef dropped fill:none,stroke:#dc2626,color:#dc2626\n  class T2,T3 dropped\n",[304,677,678,683,688,693],{"__ignoreMap":302},[307,679,680],{"class":309,"line":310},[307,681,682],{},"flowchart LR\n",[307,684,685],{"class":309,"line":316},[307,686,687],{},"  S[System prompt] --> T1[Turn 1] --> T2[Turn 2] --> T3[Turn 3] --> T4[Turn 4] --> T5[Turn 5] --> A[Active turn]\n",[307,689,690],{"class":309,"line":322},[307,691,692],{},"  classDef dropped fill:none,stroke:#dc2626,color:#dc2626\n",[307,694,695],{"class":309,"line":328},[307,696,697],{},"  class T2,T3 dropped\n",[113,699,700,661,702,664,704,668,706,708],{},[117,701,406],{},[117,703,591],{},[117,705,667],{},[117,707,671],{},". Each item is its own unit, so the window can split a turn:",[297,710,712],{"className":299,"code":711,"language":301,"meta":302,"style":302},"flowchart LR\n  S[System prompt] --> U1[User] --> A1[Assistant] --> U2[User] --> A2[Assistant + tools] --> U3[User] --> A3[Assistant] --> U4[Active user message]\n  classDef dropped fill:none,stroke:#dc2626,color:#dc2626\n  class A1,U2,A2 dropped\n",[304,713,714,718,723,727],{"__ignoreMap":302},[307,715,716],{"class":309,"line":310},[307,717,682],{},[307,719,720],{"class":309,"line":316},[307,721,722],{},"  S[System prompt] --> U1[User] --> A1[Assistant] --> U2[User] --> A2[Assistant + tools] --> U3[User] --> A3[Assistant] --> U4[Active user message]\n",[307,724,725],{"class":309,"line":322},[307,726,692],{},[307,728,729],{"class":309,"line":328},[307,730,731],{},"  class A1,U2,A2 dropped\n",[187,733,179],{"id":734},"context-budgeting",[113,736,737],{},"Context Budgeting caps the number of context tokens sent to the model. It runs last, after the other components have already reduced the context.",[125,739,740,743,744,747],{"color":127,"icon":128},[117,741,742],{},"Context may be omitted or trimmed."," When the context still exceeds the budget, whole items are left out, oldest first, and with ",[117,745,746],{},"Allow partial content"," on a message can also be cut mid-text. Run it in Audit first to see how much a budget would remove.",[113,749,384],{},[143,751,752,758],{},[146,753,754,757],{},[117,755,756],{},"Max tokens"," - The application cap, between 8,192 and 2,000,000 tokens. Leave it empty to let Optiak derive the budget from the model: its input limit when the model catalog records one, otherwise its context window minus the room reserved for the response. That room is the request's max output tokens or, when the request does not set it, the model's max output tokens.",[146,759,760,762],{},[117,761,746],{}," - Trim a message to fit when the remaining budget is less than the whole message. With this off, a message that does not fit is omitted whole.",[113,764,765],{},"Adding the component pre-fills 8,192 tokens; clear the field to fall back to the model-derived budget. The effective budget is the lower of the configured cap and that model budget. Required context is kept and consumes budget first; the remaining context is added newest to oldest until the budget runs out. Tool calls and their results are atomic and are never split.",[113,767,768],{},"Requests that still exceed the model's own input limit are rejected before they reach the provider, with an explicit context-window error.",[187,770,53],{"id":771},"observability",[113,773,774],{},"Each request trace shows the Context Engine as its own stage, with one row per component. For every component the trace reports the action it ran under, items removed or modified, and the approximate token change.",[113,776,777],{},"Use it to:",[143,779,780,783,786],{},[146,781,782],{},"Compare Audit results against the current cost per request before enabling Optimize.",[146,784,785],{},"Confirm a component configuration keeps the history the application actually needs.",[146,787,788],{},"Check how many tokens each component removes before you tune its settings.",[113,790,791,792,138],{},"Read more in ",[134,793,53],{"href":54},[795,796,797],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":302,"searchDepth":316,"depth":316,"links":799},[800,801,802,803,804,805,806],{"id":189,"depth":316,"text":151},{"id":259,"depth":316,"text":157},{"id":346,"depth":316,"text":165},{"id":428,"depth":316,"text":170},{"id":556,"depth":316,"text":174},{"id":734,"depth":316,"text":179},{"id":771,"depth":316,"text":53},"Shape conversation history and retrieved data before a request reaches the model.","md",null,{},{"icon":41},{"title":38,"description":807},"6SqUqahsCbSJI-KXVtUc_TGjU1SBsVALCcecx05xDQc",[815,817],{"title":33,"path":34,"stem":35,"description":816,"icon":36,"children":-1},"Explore the core features of the Optiak platform.",{"title":43,"path":44,"stem":45,"description":818,"icon":46,"children":-1},"Organization-level setup for governance, tools, data, and models.",1791216917617]