[{"data":1,"prerenderedAt":1820},["ShallowReactive",2],{"doc:\u002Fdocs\u002Fintegrations\u002Fai":3,"docs-nav":1595},{"id":4,"title":5,"body":6,"description":16,"extension":1587,"meta":1588,"navigation":1590,"path":1591,"seo":1592,"stem":1593,"__hash__":1594},"docs\u002Fdocs\u002Fintegrations\u002Fai.md","AI in Tabularia",{"type":7,"value":8,"toc":1567},"minimark",[9,13,17,22,125,129,295,298,319,328,334,341,356,360,367,410,413,471,483,525,530,537,562,565,568,590,594,646,650,656,662,667,671,675,690,742,745,751,759,765,840,853,859,885,889,901,907,914,918,921,1054,1057,1061,1067,1132,1135,1142,1145,1152,1156,1195,1198,1275,1280,1284,1304,1314,1393,1404,1410,1497,1500,1533,1537,1563],[10,11,5],"h1",{"id":12},"ai-in-tabularia",[14,15,16],"p",{},"Tabularia can use a language model in five places: a chat that answers questions on the\ndatasources, an assistant that builds flows in the editor, one that writes Python and R\nscripts, the naming of conversations, and the descriptions and SQL translations of the\ndbt export. All of it is optional, off until an administrator adds a model provider,\nand limited to the models the administrator enables. This page says,\nfor each use, what goes to the model and what does not, and how to configure, cap and\naudit it.",[18,19,21],"h2",{"id":20},"at-a-glance","At a glance",[23,24,25,36],"table",{},[26,27,28],"thead",{},[29,30,31,34],"tr",{},[32,33],"th",{},[32,35],{},[37,38,39,52,60,76,84,96,104,112],"tbody",{},[29,40,41,45],{},[42,43,44],"td",{},"Providers",[42,46,47,48],{},"any number: Anthropic, through its own SDK, and any endpoint that speaks the OpenAI chat-completions protocol, with tool calls, and lists its models at ",[49,50,51],"code",{},"GET \u002Fmodels",[29,53,54,57],{},[42,55,56],{},"Who talks to them",[42,58,59],{},"the gateway only; the engine and the workers never call a provider",[29,61,62,65],{},[42,63,64],{},"On",[42,66,67,68,71,72,75],{},"when a provider is added in Administration → AI models, or ",[49,69,70],{},"AI__BASE_URL"," and ",[49,73,74],{},"AI__SECRET_KEY"," are set, and at least one model is enabled",[29,77,78,81],{},[42,79,80],{},"Models",[42,82,83],{},"chosen by the administrator from each provider's catalog; none enabled by default",[29,85,86,89],{},[42,87,88],{},"Instructions",[42,90,91,92],{},"six system prompts, editable in Administration → AI models → ",[93,94,95],"strong",{},"Agent instructions",[29,97,98,101],{},[42,99,100],{},"Costs",[42,102,103],{},"estimated per answer; caps per answer, per person per day, per installation per day",[29,105,106,109],{},[42,107,108],{},"Audit",[42,110,111],{},"every query on data, every provider changed, every model enabled or disabled, every instruction changed",[29,113,114,117],{},[42,115,116],{},"Sending no data",[42,118,119,124],{},[120,121,123],"a",{"href":122},"#metadata-only-mode","metadata-only mode",": two switches, one for these uses and one for MCP",[18,126,128],{"id":127},"where-the-ai-is-used","Where the AI is used",[23,130,131,147],{},[26,132,133],{},[29,134,135,138,141,144],{},[32,136,137],{},"Use",[32,139,140],{},"Where",[32,142,143],{},"Sends to the model",[32,145,146],{},"Never sends",[37,148,149,177,196,223,239,259,275],{},[29,150,151,156,167,174],{},[42,152,153],{},[93,154,155],{},"Data assistant",[42,157,158,161,162,166],{},[93,159,160],{},"Assistant"," page (",[120,163,165],{"href":164},"\u002Fdocs\u002Fcapabilities\u002Fask-your-data","Ask your data",")",[42,168,169,170,173],{},"the question and the conversation; names, folders, row counts and descriptions of the datasources the person can read; columns, types and field descriptions; 5 sample rows of each datasource it describes; the rows its queries return, up to ",[49,171,172],{},"AI__MAX_RESULT_ROWS"," (200), text cut at 300 characters; when it builds, what the flow assistant gets (the first rows of every step) and the names, types and folders of the connections the person may use",[42,175,176],{},"datasources the person cannot read; storage paths and credentials; a connection's address, user or secret",[29,178,179,184,190,193],{},[42,180,181],{},[93,182,183],{},"Flow assistant",[42,185,186,187,189],{},"flow editor, right panel, ",[93,188,160],{}," tab",[42,191,192],{},"the request; the flow on the canvas (its nodes and their settings) and the selected node; the same catalogue tools as the data assistant (sample rows included); the first 5 rows of every step it adds or changes, and up to 30 rows when it previews a node",[42,194,195],{},"data the person cannot read; the flow's saved versions",[29,197,198,203,209,220],{},[42,199,200],{},[93,201,202],{},"Script assistant",[42,204,205,206,208],{},"Script node and saved script editor, ",[93,207,160],{}," (Kubernetes only)",[42,210,211,212,215,216,219],{},"the request; the code; the environment's language, version and packages; the ",[93,213,214],{},"names"," of the variables the script finds; names and types of its inputs' columns; after a failed run, ",[93,217,218],{},"only the error of its log"," (the Python traceback, the R error)",[42,221,222],{},"any row of data; the values of variables; what the script printed",[29,224,225,230,233,236],{},[42,226,227],{},[93,228,229],{},"Conversation titles",[42,231,232],{},"data assistant",[42,234,235],{},"the first question of a conversation (up to 1,000 characters), once",[42,237,238],{},"anything else",[29,240,241,246,253,256],{},[42,242,243],{},[93,244,245],{},"dbt descriptions",[42,247,248,249,166],{},"the dbt export dialog, when ticked (",[120,250,252],{"href":251},"\u002Fdocs\u002Fdbt-export","dbt export",[42,254,255],{},"each flow's structure (sources, steps with their settings cut at 300 characters, outputs); the columns without a description, with their type and up to 3 sample values of up to 40 characters each",[42,257,258],{},"full rows; columns that already have a description",[29,260,261,266,269,272],{},[42,262,263],{},[93,264,265],{},"dbt SQL translations",[42,267,268],{},"the dbt export, when a query does not translate to the target dialect",[42,270,271],{},"the query (up to 20,000 characters), the two dialects and the output columns; on a second attempt, why the engine rejected the first",[42,273,274],{},"data",[29,276,277,282,289,292],{},[42,278,279],{},[93,280,281],{},"AI comments",[42,283,284,285,288],{},"a dashboard or a report, on an ",[93,286,287],{},"AI comment"," element",[42,290,291],{},"the instruction of whoever built it; the title and the numbers of the KPIs, charts and tables it reads, as the screen writes them, with a table's groups and totals and a matrix's page. Never a row: a table's detail rows and a scatter that is not aggregated stay out",[42,293,294],{},"anything else: it has no tool to query with",[14,296,297],{},"The SQL script editor has no assistant.",[14,299,300,303,304,307,308,311,312,71,315,318],{},[93,301,302],{},"The script assistant sees no data."," Its tools cannot read a datasource. When it\nfixes a failed run, Tabularia extracts from the log only what the interpreter writes for\nan error (the frames and the exception line of the last Python traceback; the last R\n",[49,305,306],{},"Error…"," line, rlang's ",[49,309,310],{},"!"," lines, ",[49,313,314],{},"Calls:",[49,316,317],{},"Execution halted",") and drops everything\nthe script printed, even lines shaped like errors. The error message itself may quote a\nvalue, as errors do («could not convert 'abc'»). Without such an error, the model is\ntold the exit code only. The editor says so under the input: «The model gets the code,\nthe names and types of the columns and the error of a failed run: never a row of data.»",[14,320,321,324,325,327],{},[93,322,323],{},"The data and flow assistants do send rows."," As many as a query or a preview returns,\nwithin the caps above, to the provider of the model the person chose. Pick the providers\naccordingly, and keep personal data out of the datasources whose readers use the assistant,\nor turn on ",[120,326,123],{"href":122},".",[14,329,330,333],{},[93,331,332],{},"What the assistants can change."," The assistant of the Assistant page changes nothing\nby itself: what it builds — flows, their runs and schedules, and the other objects its\ntools offer — becomes a plan that the person reads in a card under the answer and applies\nwith its «Confirm» button (or on the plan's page); the assistant has no way to confirm it,\nand the person's permissions are checked again when it is applied. The flow\nassistant changes only the canvas in the browser: what it built comes back as one Undo\nstep, and it never saves, runs or schedules the flow. The script assistant proposes\nwhole files that the person applies or discards; it never saves or runs the script.",[14,335,336],{},[337,338],"img",{"alt":339,"src":340},"A plan card on the Assistant page: create a flow with its steps and first rows, then schedule it, with Confirm, Change and Cancel","\u002Fmedia\u002Fguide\u002Fai\u002Fagent-plan-card.png",[14,342,343],{},[344,345,346,347,350,351,355],"em",{},"A plan waiting for ",[93,348,349],{},"Confirm"," on the Assistant page: nothing has changed yet (",[120,352,354],{"href":353},"\u002Fdocs\u002Fcapabilities\u002Fask-your-data#asking-it-to-build","the example",").",[18,357,359],{"id":358},"metadata-only-mode","Metadata-only mode",[14,361,362,363,366],{},"With this mode on, ",[93,364,365],{},"no value of a row of data goes to a model",". There are two switches,\nboth off by default and both changed live in Administration → Settings, with a line in the\naudit log; every gateway replica applies a change within 10 seconds:",[23,368,369,382],{},[26,370,371],{},[29,372,373,376,379],{},[32,374,375],{},"Variable",[32,377,378],{},"Covers",[32,380,381],{},"Whose model",[37,383,384,397],{},[29,385,386,391,394],{},[42,387,388],{},[49,389,390],{},"AI__METADATA_ONLY",[42,392,393],{},"the chat, the flow assistant, the script assistant, the dbt export, the AI comments",[42,395,396],{},"those configured in Tabularia, whichever the provider",[29,398,399,404,407],{},[42,400,401],{},[49,402,403],{},"MCP__METADATA_ONLY",[42,405,406],{},"the MCP server",[42,408,409],{},"the client's, outside the administrator's control",[14,411,412],{},"Administration → AI models shows the state of both.",[23,414,415,425],{},[26,416,417],{},[29,418,419,422],{},[32,420,421],{},"Goes to the model",[32,423,424],{},"Does not",[37,426,427,435,443,455,463],{},[29,428,429,432],{},[42,430,431],{},"names of datasources, folders, columns, flows, connections, tables and files",[42,433,434],{},"sample rows, query results, previews",[29,436,437,440],{},[42,438,439],{},"types, row counts, the descriptions people wrote",[42,441,442],{},"aggregates and charts: a total is a value of the data",[29,444,445,448],{},[42,446,447],{},"the structure of flows, flow groups, SQL scripts and notebooks, with their schedules",[42,449,450,451,454],{},"the text of errors of the engine, of runs and of connections: ",[49,452,453],{},"could not convert 'abc'"," quotes one",[29,456,457,460],{},[42,458,459],{},"the SQL saved in a script or a datasource",[42,461,462],{},"a refresh's notes (the values it did not find; their count goes)",[29,464,465,468],{},[42,466,467],{},"for the script assistant, the code and the exit code of a failed run",[42,469,470],{},"for the script assistant, the error of a failed run",[14,472,473,474,478,479,482],{},"The barrier is in the tools, not in a prompt, so no ",[120,475,477],{"href":476},"#the-agents-instructions","agent's instructions","\ncan open it. Each tool declares whether it returns values of the data: those that do are not\noffered, and calling one over MCP anyway is refused; those that hold both, such as\n",[49,480,481],{},"describe_datasource",", leave the data out. Here is what changes for each use:",[484,485,486,493,498,503,508,513,519],"ul",{},[487,488,489,492],"li",{},[93,490,491],{},"Chat",": the dialog at the start says the mode is on, and asks to be read again when an\nadministrator changes the mode. The model is told it cannot read data, so it says so instead\nof inventing figures. It can still explain what a datasource holds from its descriptions,\nwrite SQL for the person to run, and build. There are no result tables under its answers.\nA plan's card still shows the person the first rows: they never go to the model, nor does\nwhether the query of a planned SQL script fails.",[487,494,495,497],{},[93,496,183],{},": it adds and changes steps without any preview, neither rows nor columns\nnor the preview's error come back (the columns of a pivot are values, and whether a step\nfails can be made to depend on one). The person checks the result on the canvas.",[487,499,500,502],{},[93,501,202],{},": it loses the help on a failed run: the editor says so, and the person\ndescribes the problem in their own words.",[487,504,505,507],{},[93,506,252],{},": columns are described from their name and type. Descriptions already written\nfrom sample values before the mode came on stay in the project: they are not sent again.",[487,509,510,512],{},[93,511,281],{},": a total is a value, so nothing is sent and no number is read for one: the element\nsays it is off, in a PDF, an image or an email too, which go out all the same, and what was written\nbefore the mode came on is not shown.",[487,514,515,518],{},[93,516,517],{},"Conversations",": the turns of a conversation made outside the mode stop going to the model,\nwhole (a tool's result, the SQL the model wrote after reading it, what it answered, the\nchoices of a card), so the model does not remember them, and says so. The person still reads\nthem on the page and can still download a past result. Turns made in the mode go back as usual.\nTurning the mode off sends everything back again.",[487,520,521,524],{},[93,522,523],{},"A turn in progress"," when the mode comes on stops before its next request to the model,\nwith a message saying so. One begun in the mode stays in it to its end.",[526,527,529],"h3",{"id":528},"what-stays-visible","What stays visible",[14,531,532,533,536],{},"The mode keeps the values of your rows from the model. It cannot keep from it what people\n",[93,534,535],{},"wrote into the structure",", which is what the model needs in order to work on it:",[484,538,539,550,553,556,559],{},[487,540,541,542,545,546,549],{},"constants in the settings of a flow: ",[49,543,544],{},"country = 'IT'"," in a filter, a value in a ",[49,547,548],{},"fill_null",",\nthe literals of a computed column;",[487,551,552],{},"constants in SQL: a saved script, the query of a datasource, a post-SQL;",[487,554,555],{},"the text of descriptions, of a note on the canvas, of a Pushmail or an email Output (subject,\nbody, recipients), the parameters saved with a report in a flow group, the names of the\nvariables of a script;",[487,557,558],{},"whatever the person types in the conversation;",[487,560,561],{},"names that are values: the column a pivot made out of a value and published in a datasource, a\nfile called after a customer, a table named after a client.",[14,563,564],{},"If those hold something confidential, the mode does not protect it.",[14,566,567],{},"It does not close every side door either, and these are decisions, not oversights:",[484,569,570,576,587],{},[487,571,572,575],{},[93,573,574],{},"Row counts and the state of a run go",", on purpose. A flow that filters on a guessed value,\nor fails only when a value is there, and is run after the person confirms its plan, will show\nhow many rows it wrote and whether it failed.",[487,577,578,586],{},[93,579,580,582,583,327],{},[49,581,403],{}," covers ",[49,584,585],{},"\u002Fmcp"," An API token also works on the rest of Tabularia's API,\nwhere it reads what its owner may read. A client that hands its model a generic HTTP tool and\nthe token is outside this barrier: give MCP clients a token only through their MCP\nconfiguration, and a service account with only the folders it needs.",[487,588,589],{},"A page opened before an administrator changes the mode keeps showing the old state until it is\nreloaded. The gateway applies the mode in force, whatever the page says.",[526,591,593],{"id":592},"permissions-of-each-use","Permissions of each use",[23,595,596,605],{},[26,597,598],{},[29,599,600,602],{},[32,601,137],{},[32,603,604],{},"Who",[37,606,607,614,621,628,638],{},[29,608,609,611],{},[42,610,155],{},[42,612,613],{},"anyone signed in; it reads what the person can read (VIEW) and builds only where they may (EDIT, RUN, CONNECT), checked at every call and again when a plan is applied. Observers can ask, reading only, but their conversations are not saved",[29,615,616,618],{},[42,617,183],{},[42,619,620],{},"EDIT on the flow's folder (any signed-in person on a flow not saved yet); not observers",[29,622,623,625],{},[42,624,202],{},[42,626,627],{},"the use of the script's environment; not observers",[29,629,630,633],{},[42,631,632],{},"dbt export with AI",[42,634,635,636,166],{},"whoever may export the flow (",[120,637,252],{"href":251},[29,639,640,643],{},[42,641,642],{},"Add and change providers, enable models, change the instructions",[42,644,645],{},"administrators; observers read them, without the providers' addresses or keys",[18,647,649],{"id":648},"telling-people-it-is-an-ai","Telling people it is an AI",[14,651,652,653,327],{},"The three assistants open with the same dialog, «You are writing to an automated\nassistant», and stay locked until «I understand». It names the providers of the models on\noffer, by the name the administrator gave them, and asks again when that list changes.\nEvery answer is labelled «AI assistant» with its model and its provider; under the input,\nthe provider of the model chosen («Your messages, and what the assistant reads for them, go\nto …») and «This is an AI: it can make mistakes. Always check the results.» A downloaded\nconversation opens with the same notice. The acceptance lives in the browser, so every new\nbrowser, or a shared account on another machine, asks again. Details: ",[120,654,165],{"href":655},"\u002Fdocs\u002Fcapabilities\u002Fask-your-data#telling-people-it-is-an-ai",[14,657,658],{},[337,659],{"alt":660,"src":661},"The dialog You are writing to an automated assistant, with its four points and the button I understand","\u002Fmedia\u002Fguide\u002Fai\u002Fai-disclosure.png",[14,663,664],{},[344,665,666],{},"The notice every assistant opens with, until «I understand».",[18,668,670],{"id":669},"configuration","Configuration",[526,672,674],{"id":673},"the-providers","The providers",[14,676,677,678,681,682,685,686,689],{},"Administration → ",[93,679,680],{},"AI models"," → ",[93,683,684],{},"AI providers"," lists them. An administrator adds one with\na name, a type, an address and an API key, tests it, turns it off or removes it. The name is\nwhat people read as who gets their data. The key is encrypted with ",[49,687,688],{},"SECURITY__FERNET_KEY","\nand never comes back, not in the page, the log, the audit or an error: an empty field keeps\nit. A new address needs the key typed again, so a saved key cannot be sent elsewhere. Every\nchange goes to the audit log, without the key.",[23,691,692,705],{},[26,693,694],{},[29,695,696,699,702],{},[32,697,698],{},"Type",[32,700,701],{},"Address",[32,703,704],{},"Models come from",[37,706,707,723],{},[29,708,709,714,720],{},[42,710,711],{},[93,712,713],{},"Anthropic",[42,715,716,717],{},"empty, for ",[49,718,719],{},"https:\u002F\u002Fapi.anthropic.com",[42,721,722],{},"the Models API, through Anthropic's SDK",[29,724,725,730,737],{},[42,726,727],{},[93,728,729],{},"OpenAI-compatible",[42,731,732,733,736],{},"the endpoint, ending in ",[49,734,735],{},"\u002Fv1",", hosted or inside your network",[42,738,739],{},[49,740,741],{},"GET {address}\u002Fmodels",[14,743,744],{},"Data leaves your network only if the address is outside it. An OpenAI-compatible endpoint\nmust also answer chat completions with tool calls, which is how the assistants use their\ntools.",[14,746,747],{},[337,748],{"alt":749,"src":750},"Administration, AI providers: a provider from the environment, read-only, and Anthropic, with its buttons to test, change, turn off and remove","\u002Fmedia\u002Fguide\u002Fai\u002Fai-providers-panel.png",[14,752,753],{},[344,754,755,758],{},[93,756,757],{},"Administration → AI models",": the providers. Only the environment's cannot be changed here.",[14,760,761,764],{},[93,762,763],{},"A provider from the environment"," stays what it always was, and appears in the list as\n«from the environment», named after its host; it is changed where it is set:",[23,766,767,778],{},[26,768,769],{},[29,770,771,773,776],{},[32,772,375],{},[32,774,775],{},"Helm value",[32,777],{},[37,779,780,796,810,825],{},[29,781,782,786,791],{},[42,783,784],{},[49,785,70],{},[42,787,788],{},[49,789,790],{},"ai.baseUrl",[42,792,793,794],{},"an OpenAI-compatible endpoint, ending in ",[49,795,735],{},[29,797,798,802,807],{},[42,799,800],{},[49,801,74],{},[42,803,804],{},[49,805,806],{},"secrets.aiSecretKey",[42,808,809],{},"its API key",[29,811,812,817,822],{},[42,813,814],{},[49,815,816],{},"AI__ACCESS_KEY",[42,818,819],{},[49,820,821],{},"ai.accessKey",[42,823,824],{},"the key's identifier, informational only",[29,826,827,832,837],{},[42,828,829],{},[49,830,831],{},"AI__DEFAULT_MODEL",[42,833,834],{},[49,835,836],{},"ai.defaultModel",[42,838,839],{},"offered first in the pickers, and used by the dbt export, when enabled",[14,841,842,843,846,847,849,850,327],{},"On Kubernetes, ",[49,844,845],{},"ai.enabled: true"," renders these variables; the chart refuses to render\nwithout ",[49,848,790],{}," and the secret. The full list, with the caps below, is in\n",[120,851,670],{"href":852},"\u002Fdocs\u002Fconfiguration#ai-assistant",[14,854,855,858],{},[93,856,857],{},"Turning a provider off, or removing it."," Its models can no longer be chosen, and a request\nfor one is refused with the reason. Its conversations stay readable, and go on with another\nmodel: the page says the next message goes to the model selected. Turned on again, its models\nare back as they were. Removed, its key and its enabled models are gone; the panel says first\nhow many conversations and models depend on it.",[14,860,861,864,865,868,869,872,873,876,877,880,881,884],{},[93,862,863],{},"Anthropic."," Tabularia sends no sampling settings and no ",[49,866,867],{},"thinking",", and never forces a tool\ncall: today's models refuse them. Effort is set to ",[49,870,871],{},"medium"," on the models that take it (",[49,874,875],{},"low","\nfor the titles), ",[49,878,879],{},"max_tokens"," to 32,000, and prompt caching is on for the assistants' turns.\nThinking blocks go back untouched. When the conversation before them has changed (the date,\nthe plans, the datasources in focus are in the system prompt) the API refuses them, and\nTabularia repeats the request asking it to drop them: the person sees nothing, and the refused\nrequest costs nothing. A history cut by ",[49,882,883],{},"AI__MAX_HISTORY_MESSAGES"," is cut between turns, and\ngoes without thinking blocks. A conversation can change model, and provider, at any question:\nthe new one gets the earlier messages, not the other model's reasoning. When a model declines\nto answer, the person is told, and what it had written is discarded. Server-side fallbacks to\nanother model are not on.",[526,886,888],{"id":887},"the-models","The models",[14,890,677,891,893,894,896,897,900],{},[93,892,680],{}," lists each provider's catalog; one that does not answer says\nso without hiding the others. Nothing is enabled by default: every message is billed by the\nprovider, so an administrator enables each model people may choose. Embedding, audio and\nreranker models are listed but cannot be enabled. A model the provider stops offering stays\nin the list, marked «no longer offered», so it can be disabled. The same name on two providers\nis two models, and the pickers show each model with its provider. The dbt export uses\n",[49,895,831],{}," when it is enabled, otherwise the first enabled model. That setting holds\na model's name, for instance ",[49,898,899],{},"claude-opus-5-5",": with the same name on two providers, the\nenvironment's wins, then the provider added first.",[14,902,903],{},[337,904],{"alt":905,"src":906},"Administration, AI models: the catalog of each provider, some models enabled, an embedding model marked not a chat model, one marked price unknown","\u002Fmedia\u002Fguide\u002Fai\u002Fai-models-panel.png",[14,908,909],{},[344,910,911,913],{},[93,912,757],{},": the catalog of each provider; only the enabled models can be picked.",[526,915,917],{"id":916},"costs-and-caps","Costs and caps",[14,919,920],{},"Under each answer the page shows the tokens and an estimated cost, computed from the\nmodel's public list price as published with the AI library: an estimate, not your\nprovider's invoice, with cached input at its own rates. A dash means the model could not be\npriced, which is not zero.",[23,922,923,935],{},[26,924,925],{},[29,926,927,929,932],{},[32,928,375],{},[32,930,931],{},"Default",[32,933,934],{},"Caps",[37,936,937,950,963,976,989,1002,1014,1026,1041],{},[29,938,939,944,947],{},[42,940,941],{},[49,942,943],{},"AI__MAX_REQUESTS",[42,945,946],{},"12",[42,948,949],{},"model round-trips per question of the data assistant",[29,951,952,957,960],{},[42,953,954],{},[49,955,956],{},"AI__MAX_FLOW_REQUESTS",[42,958,959],{},"30",[42,961,962],{},"the same for the assistants that build: the flow assistant, and the Assistant page for whoever may make changes",[29,964,965,970,973],{},[42,966,967],{},[49,968,969],{},"AI__MAX_COST_PER_TURN_USD",[42,971,972],{},"0.5",[42,974,975],{},"dollars per question",[29,977,978,983,986],{},[42,979,980],{},[49,981,982],{},"AI__MAX_INPUT_TOKENS_PER_TURN",[42,984,985],{},"400000",[42,987,988],{},"input tokens per question",[29,990,991,996,999],{},[42,992,993],{},[49,994,995],{},"AI__MAX_COST_PER_DAY_USD",[42,997,998],{},"0 (none)",[42,1000,1001],{},"dollars per person per day",[29,1003,1004,1009,1011],{},[42,1005,1006],{},[49,1007,1008],{},"AI__MAX_COST_PER_DAY_TOTAL_USD",[42,1010,998],{},[42,1012,1013],{},"dollars for the whole installation per day",[29,1015,1016,1020,1023],{},[42,1017,1018],{},[49,1019,172],{},[42,1021,1022],{},"200",[42,1024,1025],{},"rows of a data assistant query, to the model and to the chat",[29,1027,1028,1032,1035],{},[42,1029,1030],{},[49,1031,883],{},[42,1033,1034],{},"60",[42,1036,1037,1038,1040],{},"past messages replayed to the model at each question (",[120,1039,123],{"href":122},": only those of turns made in it)",[29,1042,1043,1048,1051],{},[42,1044,1045],{},[49,1046,1047],{},"AI__DBT_EXPORT_TIMEOUT_SECONDS",[42,1049,1050],{},"180",[42,1052,1053],{},"seconds for all the AI calls of one dbt export",[14,1055,1056],{},"The daily caps are checked before a question is sent; once reached, the person (or\neveryone, for the installation's cap) is told to try again the next day. The dbt\nexport's calls count in the same ledger and stop at the same caps. A model with no known\nprice, marked «price unknown» in the panel, is not free for the caps: they count it at $4 in\nand $20 out per million tokens, whatever it really costs. Set both daily caps\nwherever people you do not know can sign in. All of these can also be changed in\nAdministration → Settings, without a restart.",[526,1058,1060],{"id":1059},"the-agents-instructions","The agents' instructions",[14,1062,1063,1064,1066],{},"Administration → AI models → ",[93,1065,95],{}," shows the system prompt of each of\nthe seven agents:",[23,1068,1069,1079],{},[26,1070,1071],{},[29,1072,1073,1076],{},[32,1074,1075],{},"Agent",[32,1077,1078],{},"Purpose",[37,1080,1081,1088,1095,1102,1109,1117,1125],{},[29,1082,1083,1085],{},[42,1084,155],{},[42,1086,1087],{},"the chat on the Assistant page",[29,1089,1090,1092],{},[42,1091,183],{},[42,1093,1094],{},"builds and changes steps in the flow editor",[29,1096,1097,1099],{},[42,1098,202],{},[42,1100,1101],{},"writes and fixes Python or R in the script editor",[29,1103,1104,1106],{},[42,1105,229],{},[42,1107,1108],{},"names every new conversation",[29,1110,1111,1114],{},[42,1112,1113],{},"dbt export descriptions",[42,1115,1116],{},"writes the descriptions of flows and columns in the dbt project",[29,1118,1119,1122],{},[42,1120,1121],{},"dbt export SQL translations",[42,1123,1124],{},"translates the queries the engine does not convert",[29,1126,1127,1129],{},[42,1128,281],{},[42,1130,1131],{},"writes the comment on the numbers of a dashboard or a report",[14,1133,1134],{},"An administrator can rewrite a text (up to 20,000 characters) or restore the default.\nA change applies from the next request, on every gateway replica, and goes to the audit\nlog. Texts the AI already wrote for a version of a flow in a dbt export stay: the new\ntext applies to later versions.",[14,1136,1137,1138,1141],{},"What the administrator writes is only the agent's text. At every request Tabularia adds\na context that cannot be edited, shown in the panel with example values: today's date,\nthe engine's SQL dialect and the row cap, the flow or the script being edited, the\ndialects of a translation, and ",[93,1139,1140],{},"last, the language",": the answer is written in the\nlanguage of the person's interface (English, Italian, French, German or Spanish),\nwhatever the language of the question, the data or the instructions. The dbt\ndescriptions get no context and are written in English, as the rest of the dbt\nproject, unless the instructions say otherwise.",[526,1143,517],{"id":1144},"conversations",[14,1146,1147,1148,1151],{},"The conversations of the three assistants are saved in Tabularia's database, private to\ntheir author, and hold what was sent and returned, rows included. One untouched for\n",[49,1149,1150],{},"ORCHESTRATOR__AI_CHAT_RETENTION_DAYS"," (90 by default) is deleted; all of a person's go\nwith their account. Observers' conversations are never saved. The flow assistant's\nconversation reopens with its flow.",[18,1153,1155],{"id":1154},"turning-it-off","Turning it off",[484,1157,1158,1174,1180,1186],{},[487,1159,1160,1163,1164,1166,1167,1169,1170,1173],{},[93,1161,1162],{},"Entirely",": leave ",[49,1165,70],{}," or ",[49,1168,74],{}," empty (on Helm,\n",[49,1171,1172],{},"ai.enabled: false","), and add no provider. The Assistant page says «Assistant not configured», the editors\nshow no Assistant tab, and the dbt export offers no AI (it can still reuse the texts\nkept for a flow version).",[487,1175,1176,1179],{},[93,1177,1178],{},"For now",": disable every model in Administration → AI models. The Assistant page\nsays «No model enabled»; nothing is sent.",[487,1181,1182,1185],{},[93,1183,1184],{},"One use",": there is no switch per use or per group. Restricting what the data\nassistant can read is done with folder permissions, as for everything else.",[487,1187,1188,1191,1192,1194],{},[93,1189,1190],{},"Only the data",": ",[120,1193,123],{"href":122}," keeps the assistants on, with\nno value of a row going to the model.",[18,1196,108],{"id":1197},"audit",[23,1199,1200,1210],{},[26,1201,1202],{},[29,1203,1204,1207],{},[32,1205,1206],{},"Event",[32,1208,1209],{},"When",[37,1211,1212,1222,1232,1249,1262],{},[29,1213,1214,1219],{},[42,1215,1216],{},[49,1217,1218],{},"ai.query",[42,1220,1221],{},"every query of the data assistant and every preview of the flow assistant, with the SQL, the model and its provider, the engine and the rows returned",[29,1223,1224,1229],{},[42,1225,1226],{},[49,1227,1228],{},"export.download",[42,1230,1231],{},"a full result downloaded from a conversation, with the SQL",[29,1233,1234,1246],{},[42,1235,1236,1239,1240,1239,1243],{},[49,1237,1238],{},"ai.provider_create",", ",[49,1241,1242],{},"ai.provider_update",[49,1244,1245],{},"ai.provider_delete",[42,1247,1248],{},"a provider added, changed (which fields, whether the key changed; never the key) or removed",[29,1250,1251,1259],{},[42,1252,1253,1239,1256],{},[49,1254,1255],{},"ai.model_enable",[49,1257,1258],{},"ai.model_disable",[42,1260,1261],{},"a model enabled or disabled, with its provider",[29,1263,1264,1272],{},[42,1265,1266,1239,1269],{},[49,1267,1268],{},"ai.prompt_update",[49,1270,1271],{},"ai.prompt_reset",[42,1273,1274],{},"an agent's instructions changed or restored",[14,1276,1277,1278,355],{},"The dbt export's own audit entry names the AI models that wrote its texts\n(",[120,1279,252],{"href":251},[18,1281,1283],{"id":1282},"example-turning-it-on","Example: turning it on",[14,1285,1286,1289,1290,1293,1294,1239,1297,1300,1301,1303],{},[93,1287,1288],{},"From the panel",": Administration → AI models → ",[93,1291,1292],{},"Add a provider",": a name, the type, the API\nkey, ",[93,1295,1296],{},"Test",[93,1298,1299],{},"Save",". Enable a model in the list below it (",[49,1302,899],{},", for instance).",[14,1305,1306,1309,1310,1313],{},[93,1307,1308],{},"Docker Compose",", in ",[49,1311,1312],{},"infrastructure\u002F.env",":",[1315,1316,1321],"pre",{"className":1317,"code":1318,"language":1319,"meta":1320,"style":1320},"language-bash shiki shiki-themes github-dark-dimmed github-light","AI__BASE_URL=https:\u002F\u002Fapi.scaleway.ai\u002Fv1\nAI__SECRET_KEY=\u003Cyour API key>\nAI__DEFAULT_MODEL=gpt-oss-120b\nAI__MAX_COST_PER_DAY_USD=2\nAI__MAX_COST_PER_DAY_TOTAL_USD=50\n","bash","",[49,1322,1323,1339,1363,1373,1383],{"__ignoreMap":1320},[1324,1325,1328,1331,1335],"span",{"class":1326,"line":1327},"line",1,[1324,1329,70],{"class":1330},"ssh_m",[1324,1332,1334],{"class":1333},"s6PUj","=",[1324,1336,1338],{"class":1337},"sXfbr","https:\u002F\u002Fapi.scaleway.ai\u002Fv1\n",[1324,1340,1342,1344,1347,1350,1354,1357,1360],{"class":1326,"line":1341},2,[1324,1343,74],{"class":1330},[1324,1345,1346],{"class":1333},"=\u003C",[1324,1348,1349],{"class":1337},"your",[1324,1351,1353],{"class":1352},"sqRhv"," API",[1324,1355,1356],{"class":1337}," ke",[1324,1358,1359],{"class":1330},"y",[1324,1361,1362],{"class":1333},">\n",[1324,1364,1366,1368,1370],{"class":1326,"line":1365},3,[1324,1367,831],{"class":1330},[1324,1369,1334],{"class":1333},[1324,1371,1372],{"class":1337},"gpt-oss-120b\n",[1324,1374,1376,1378,1380],{"class":1326,"line":1375},4,[1324,1377,995],{"class":1330},[1324,1379,1334],{"class":1333},[1324,1381,1382],{"class":1337},"2\n",[1324,1384,1386,1388,1390],{"class":1326,"line":1385},5,[1324,1387,1008],{"class":1330},[1324,1389,1334],{"class":1333},[1324,1391,1392],{"class":1337},"50\n",[14,1394,1395,1396,1399,1400,1403],{},"Then ",[49,1397,1398],{},"docker compose up -d"," again, from ",[49,1401,1402],{},"infrastructure\u002F",": the gateway restarts with\nthe new settings.",[14,1405,1406,1409],{},[93,1407,1408],{},"Helm",", in your values:",[1315,1411,1415],{"className":1412,"code":1413,"language":1414,"meta":1320,"style":1320},"language-yaml shiki shiki-themes github-dark-dimmed github-light","ai:\n  enabled: true\n  baseUrl: https:\u002F\u002Fapi.scaleway.ai\u002Fv1\n  defaultModel: gpt-oss-120b\n  maxCostPerDayUsd: 2\n  maxCostPerDayTotalUsd: 50\nsecrets:\n  aiSecretKey: \"\"   # or AI__SECRET_KEY in the Secret named by existingSecret\n","yaml",[49,1416,1417,1426,1437,1446,1455,1464,1474,1482],{"__ignoreMap":1320},[1324,1418,1419,1423],{"class":1326,"line":1327},[1324,1420,1422],{"class":1421},"shb1k","ai",[1324,1424,1425],{"class":1330},":\n",[1324,1427,1428,1431,1433],{"class":1326,"line":1341},[1324,1429,1430],{"class":1421},"  enabled",[1324,1432,1191],{"class":1330},[1324,1434,1436],{"class":1435},"swcJU","true\n",[1324,1438,1439,1442,1444],{"class":1326,"line":1365},[1324,1440,1441],{"class":1421},"  baseUrl",[1324,1443,1191],{"class":1330},[1324,1445,1338],{"class":1337},[1324,1447,1448,1451,1453],{"class":1326,"line":1375},[1324,1449,1450],{"class":1421},"  defaultModel",[1324,1452,1191],{"class":1330},[1324,1454,1372],{"class":1337},[1324,1456,1457,1460,1462],{"class":1326,"line":1385},[1324,1458,1459],{"class":1421},"  maxCostPerDayUsd",[1324,1461,1191],{"class":1330},[1324,1463,1382],{"class":1435},[1324,1465,1467,1470,1472],{"class":1326,"line":1466},6,[1324,1468,1469],{"class":1421},"  maxCostPerDayTotalUsd",[1324,1471,1191],{"class":1330},[1324,1473,1392],{"class":1435},[1324,1475,1477,1480],{"class":1326,"line":1476},7,[1324,1478,1479],{"class":1421},"secrets",[1324,1481,1425],{"class":1330},[1324,1483,1485,1488,1490,1493],{"class":1326,"line":1484},8,[1324,1486,1487],{"class":1421},"  aiSecretKey",[1324,1489,1191],{"class":1330},[1324,1491,1492],{"class":1337},"\"\"",[1324,1494,1496],{"class":1495},"sgHix","   # or AI__SECRET_KEY in the Secret named by existingSecret\n",[14,1498,1499],{},"Then, as an administrator:",[1501,1502,1503,1512,1520,1526],"ol",{},[487,1504,677,1505,1507,1508,1511],{},[93,1506,680],{},": enable ",[49,1509,1510],{},"gpt-oss-120b"," (and any other model people\nmay pick).",[487,1513,1514,1515,1517,1518,327],{},"Optionally, ",[93,1516,95],{}," → Data assistant: add a line such as «Amounts\nare in euros, net of VAT. The fiscal year starts on 1 April.» and ",[93,1519,1299],{},[487,1521,1522,1523,1525],{},"Open ",[93,1524,160],{},", accept the notice and ask «Which datasources can I use and what\ndo they contain?».",[487,1527,1528,1529,327],{},"On the external ClickHouse, give the assistant its own read-only account:\n",[120,1530,1532],{"href":1531},"\u002Fdocs\u002Fengines\u002Fclickhouse-ai-user","the AI user",[18,1534,1536],{"id":1535},"related","Related",[484,1538,1539,1543,1549,1553,1558],{},[487,1540,1541],{},[120,1542,165],{"href":164},[487,1544,1545],{},[120,1546,1548],{"href":1547},"\u002Fdocs\u002Fscripting#the-assistant","Python and R: the assistant",[487,1550,1551],{},[120,1552,252],{"href":251},[487,1554,1555],{},[120,1556,1557],{"href":1531},"The AI user on ClickHouse",[487,1559,1560],{},[120,1561,1562],{"href":852},"Configuration: AI assistant",[1564,1565,1566],"style",{},"html pre.shiki code .ssh_m, html code.shiki .ssh_m{--shiki-default:#ADBAC7;--shiki-light:#24292E}html pre.shiki code .s6PUj, html code.shiki .s6PUj{--shiki-default:#F47067;--shiki-light:#D73A49}html pre.shiki code .sXfbr, html code.shiki .sXfbr{--shiki-default:#96D0FF;--shiki-light:#032F62}html pre.shiki code .sqRhv, html code.shiki .sqRhv{--shiki-default:#F69D50;--shiki-light:#6F42C1}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 .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 pre.shiki code .shb1k, html code.shiki .shb1k{--shiki-default:#8DDB8C;--shiki-light:#22863A}html pre.shiki code .swcJU, html code.shiki .swcJU{--shiki-default:#6CB6FF;--shiki-light:#005CC5}html pre.shiki code .sgHix, html code.shiki .sgHix{--shiki-default:#768390;--shiki-light:#6A737D}",{"title":1320,"searchDepth":1341,"depth":1365,"links":1568},[1569,1570,1571,1575,1576,1583,1584,1585,1586],{"id":20,"depth":1341,"text":21},{"id":127,"depth":1341,"text":128},{"id":358,"depth":1341,"text":359,"children":1572},[1573,1574],{"id":528,"depth":1365,"text":529},{"id":592,"depth":1365,"text":593},{"id":648,"depth":1341,"text":649},{"id":669,"depth":1341,"text":670,"children":1577},[1578,1579,1580,1581,1582],{"id":673,"depth":1365,"text":674},{"id":887,"depth":1365,"text":888},{"id":916,"depth":1365,"text":917},{"id":1059,"depth":1365,"text":1060},{"id":1144,"depth":1365,"text":517},{"id":1154,"depth":1341,"text":1155},{"id":1197,"depth":1341,"text":108},{"id":1282,"depth":1341,"text":1283},{"id":1535,"depth":1341,"text":1536},"md",{"source":1589},"docs\u002Fintegrations\u002Fai.md",true,"\u002Fdocs\u002Fintegrations\u002Fai",{"title":5,"description":16},"docs\u002Fintegrations\u002Fai","1l4JfmxD4Oywn88jfoak-3sJs4svzwvknsn85WmJV6Q",[1596,1615,1670,1702,1734,1761,1786,1812],{"title":1597,"icon":1598,"intro":1599,"items":1600},"Getting started","start","Install it on one machine, learn the few ideas everything else is built on, and run a first flow.",[1601,1603,1606,1609,1612],{"path":1602,"title":1597},"\u002Fdocs\u002Fgetting-started",{"path":1604,"title":1605},"\u002Fdocs\u002Fgetting-started-docker-compose","Walkthrough with Docker Compose",{"path":1607,"title":1608},"\u002Fdocs\u002Fdeploy\u002Fminikube","Try it on your computer (minikube)",{"path":1610,"title":1611},"\u002Fdocs\u002Fconcepts","Concepts",{"path":1613,"title":1614},"\u002Fdocs\u002Foverview","Overview (README)",{"title":1616,"icon":1617,"intro":1618,"items":1619},"Capabilities","capabilities","What you can build: visual flows, analysis on any step, AI questions, pixel-perfect reports, dashboards, Python, R and SQL scripts, containers and the orchestration that ties them together.",[1620,1623,1626,1629,1631,1634,1637,1640,1643,1646,1649,1652,1655,1658,1661,1664,1667],{"path":1621,"title":1622},"\u002Fdocs\u002Fcapabilities","All capabilities",{"path":1624,"title":1625},"\u002Fdocs\u002Fcapabilities\u002Fflows","Low-code flows",{"path":1627,"title":1628},"\u002Fdocs\u002Fcapabilities\u002Fpreview-and-analysis","Preview and analysis",{"path":164,"title":1630},"Ask your data with AI",{"path":1632,"title":1633},"\u002Fdocs\u002Fcapabilities\u002Freports","Pixel-perfect reports",{"path":1635,"title":1636},"\u002Fdocs\u002Fcapabilities\u002Freport-functions","Report functions",{"path":1638,"title":1639},"\u002Fdocs\u002Fcapabilities\u002Fdashboards","Dashboards",{"path":1641,"title":1642},"\u002Fdocs\u002Fscripting","Python and R",{"path":1644,"title":1645},"\u002Fdocs\u002Fsql-scripts","SQL scripts",{"path":1647,"title":1648},"\u002Fdocs\u002Fcapabilities\u002Fnotebooks","marimo notebooks as apps",{"path":1650,"title":1651},"\u002Fdocs\u002Fcontainer-node","Docker images in flows",{"path":1653,"title":1654},"\u002Fdocs\u002Fcapabilities\u002Fflow-groups","Flow groups: orchestration",{"path":1656,"title":1657},"\u002Fdocs\u002Fcapabilities\u002Fscheduling","Scheduling",{"path":1659,"title":1660},"\u002Fdocs\u002Fpushmail","Pushmail: datasources, reports and dashboards by email",{"path":1662,"title":1663},"\u002Fdocs\u002Fplaceholders","Dynamic dates",{"path":1665,"title":1666},"\u002Fdocs\u002Fcapabilities\u002Fengines","Engines",{"path":1668,"title":1669},"\u002Fdocs\u002Fengines\u002Fengine-differences","Engine differences",{"title":1671,"icon":1672,"intro":1673,"items":1674},"Sources","sources","Every way data comes in: files, databases, buckets, SFTP folders, HTTP APIs, SharePoint, Google Sheets, and the results of your own flows.",[1675,1678,1681,1684,1687,1690,1693,1696,1699],{"path":1676,"title":1677},"\u002Fdocs\u002Fsources","All sources",{"path":1679,"title":1680},"\u002Fdocs\u002Fsources\u002Ffiles","Uploaded files",{"path":1682,"title":1683},"\u002Fdocs\u002Fsources\u002Fdatabases","Database tables and queries",{"path":1685,"title":1686},"\u002Fdocs\u002Fs3-datasource","S3 buckets",{"path":1688,"title":1689},"\u002Fdocs\u002Fsftp","SFTP folders",{"path":1691,"title":1692},"\u002Fdocs\u002Fapi-datasource","HTTP APIs",{"path":1694,"title":1695},"\u002Fdocs\u002Fsources\u002Fsharepoint","Excel on SharePoint",{"path":1697,"title":1698},"\u002Fdocs\u002Fsources\u002Fgoogle-sheets","Google Sheets",{"path":1700,"title":1701},"\u002Fdocs\u002Fsources\u002Fflow-outputs","Results of flows and scripts",{"title":1703,"icon":1704,"intro":1705,"items":1706},"Connections","connections","The systems Tabularia reads from and writes to, how each connection is set up, and who may use it.",[1707,1710,1713,1716,1719,1721,1722,1724,1725,1728,1731],{"path":1708,"title":1709},"\u002Fdocs\u002Fconnections","All connections",{"path":1711,"title":1712},"\u002Fdocs\u002Fconnections\u002Fdatabases","Databases",{"path":1714,"title":1715},"\u002Fdocs\u002Fsqlserver","Microsoft SQL Server driver",{"path":1717,"title":1718},"\u002Fdocs\u002Fconnections\u002Fs3","S3 and compatible storage",{"path":1688,"title":1720},"SFTP servers",{"path":1691,"title":1692},{"path":1694,"title":1723},"SharePoint",{"path":1697,"title":1698},{"path":1726,"title":1727},"\u002Fdocs\u002Fconnections\u002Fsmtp","SMTP email",{"path":1729,"title":1730},"\u002Fdocs\u002Fcontainer-registries","Container registries",{"path":1732,"title":1733},"\u002Fdocs\u002Fconnections\u002Fdestinations","Writing data out",{"title":1735,"icon":1736,"intro":1737,"items":1738},"Integrations","integrations","How Tabularia fits your stack: AI providers, the REST API and webhooks, dbt, OpenLineage, single sign-on, SIEM and monitoring.",[1739,1742,1744,1747,1749,1752,1755,1758],{"path":1740,"title":1741},"\u002Fdocs\u002Fintegrations","All integrations",{"path":1591,"title":1743},"AI: where it is used",{"path":1745,"title":1746},"\u002Fdocs\u002Fapi","API, tokens and webhooks",{"path":251,"title":1748},"Export to dbt",{"path":1750,"title":1751},"\u002Fdocs\u002Fopenlineage","OpenLineage",{"path":1753,"title":1754},"\u002Fdocs\u002Fsso-keycloak","Single sign-on with Keycloak",{"path":1756,"title":1757},"\u002Fdocs\u002Fsiem-splunk","Audit log to Splunk",{"path":1759,"title":1760},"\u002Fdocs\u002Fintegrations\u002Fmonitoring","Monitoring",{"title":1762,"icon":1763,"intro":1764,"items":1765},"Security & governance","governance","Who may see and do what, what is recorded, and how data quality and personal data are kept in check.",[1766,1769,1772,1775,1778,1781,1784],{"path":1767,"title":1768},"\u002Fdocs\u002Fgovernance","Overview",{"path":1770,"title":1771},"\u002Fdocs\u002Fgovernance\u002Fpermissions","Permissions",{"path":1773,"title":1774},"\u002Fdocs\u002Fgovernance\u002Faudit-log","Audit log",{"path":1776,"title":1777},"\u002Fdocs\u002Fgovernance\u002Fdata-contracts","Data contracts",{"path":1779,"title":1780},"\u002Fdocs\u002Fdesign\u002Fsso-group-mapping","SSO and group mapping",{"path":1782,"title":1783},"\u002Fdocs\u002Fexamples\u002Fkeycloak","Keycloak example on a laptop",{"path":1531,"title":1785},"A ClickHouse user for the AI assistant",{"title":1787,"icon":1788,"intro":1789,"items":1790},"Install & operate","operate","Run it in production on Kubernetes, configure it, upgrade it and keep it healthy.",[1791,1794,1797,1800,1803,1806,1809],{"path":1792,"title":1793},"\u002Fdocs\u002Fdeploy\u002Fkubernetes","Kubernetes and Helm",{"path":1795,"title":1796},"\u002Fdocs\u002Fdeploy\u002Fkind","A company-like cluster on one computer (kind)",{"path":1798,"title":1799},"\u002Fdocs\u002Fdeploy\u002Fupgrading","Upgrading, backups and restore",{"path":1801,"title":1802},"\u002Fdocs\u002Fdeploy\u002Frelease-checklist","Install and upgrade checklist",{"path":1804,"title":1805},"\u002Fdocs\u002Fconfiguration","Configuration reference",{"path":1807,"title":1808},"\u002Fdocs\u002Fengine-settings","Settings from the panel",{"path":1810,"title":1811},"\u002Fdocs\u002Fdatabase-migrations","Database migrations",{"title":1813,"icon":1814,"intro":1815,"items":1816},"Reference","reference","Release process and the remaining reference pages.",[1817],{"path":1818,"title":1819},"\u002Fdocs\u002Frelease-process","Release process",1793656372079]