[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"documentation:page:\u002Fdocumentation\u002Fai\u002Fknowledge":3,"documentation:nav":673},{"id":4,"title":5,"body":6,"category":663,"description":664,"extension":665,"meta":666,"navigation":667,"order":643,"path":668,"seo":669,"stem":670,"updated":671,"__hash__":672},"documentation\u002Fdocumentation\u002Fai\u002Fknowledge.md","AI knowledge base",{"type":7,"value":8,"toc":641},"minimark",[9,19,43,46,51,54,107,110,115,166,170,177,180,187,194,198,205,219,223,234,253,263,278,282,285,304,307,311,317,321,328,335,349,360,364,371,390,396,407,411,417,464,468,474,494,498,511,517,561,564,568,574,602,606,609,626,629,633],[10,11,12,13,18],"p",{},"The knowledge base is what makes the ",[14,15,17],"a",{"href":16},"\u002Fdocumentation\u002Fai\u002Fassistant","AI assistant"," accurate. It has two layers:",[20,21,22,34],"ul",{},[23,24,25,29,30,33],"li",{},[26,27,28],"strong",{},"Curated facts"," — short, verifiable statements your staff teaches the AI (Teach AI, manual entries). Actively managed in the ",[26,31,32],{},"Knowledge"," tab.",[23,35,36,39,40,33],{},[26,37,38],{},"Indexed documentation"," — web pages you import are cleaned and indexed as verbatim sections the AI reads from directly. Managed at page granularity in the ",[26,41,42],{},"Sources",[10,44,45],{},"When both cover the same topic, the curated facts win: staff knowledge always outranks documentation excerpts.",[47,48,50],"h2",{"id":49},"facts","Facts",[10,52,53],{},"Each curated fact has:",[20,55,56,62,89,95,101],{},[23,57,58,61],{},[26,59,60],{},"Content",": up to 2,000 characters",[23,63,64,67,68,72,73,72,76,72,79,72,82,85,86],{},[26,65,66],{},"Type",": ",[69,70,71],"code",{},"feature",", ",[69,74,75],{},"config",[69,77,78],{},"command",[69,80,81],{},"requirement",[69,83,84],{},"troubleshooting",", or ",[69,87,88],{},"other",[23,90,91,94],{},[26,92,93],{},"Scope",": global (applies to every ticket) or linked to one Tebex package",[23,96,97,100],{},[26,98,99],{},"Source",": where it came from (manual entry or a ticket conversation)",[23,102,103,106],{},[26,104,105],{},"Confidence",": how certain the AI was when it extracted the fact",[10,108,109],{},"There is no cap on the number of facts or indexed pages, on any plan.",[111,112,114],"h3",{"id":113},"permissions","Permissions",[116,117,118,131],"table",{},[119,120,121],"thead",{},[122,123,124,128],"tr",{},[125,126,127],"th",{},"Permission",[125,129,130],{},"Allows",[132,133,134,146,156],"tbody",{},[122,135,136,143],{},[137,138,139],"td",{},[140,141],"permission-label",{"permission":142},"ai.view",[137,144,145],{},"Browse facts, see which facts an AI reply used",[122,147,148,153],{},[137,149,150],{},[140,151],{"permission":152},"ai.teach",[137,154,155],{},"Extract facts from ticket conversations (Teach AI)",[122,157,158,163],{},[137,159,160],{},[140,161],{"permission":162},"ai.knowledge.manage",[137,164,165],{},"Add, delete, import, and revoke facts",[47,167,169],{"id":168},"how-the-ai-picks-its-context","How the AI picks its context",[10,171,172,173,176],{},"When generating a reply, the AI retrieves the entries most relevant to the customer's question from ",[26,174,175],{},"both layers",": curated facts first (the priority layer), then the most relevant documentation sections, grouped with their page title and link so the AI can cite the doc. When they conflict, the curated facts win.",[10,178,179],{},"Package scoping applies to both layers: if the ticket is linked to one or more Tebex packages, only those packages' entries plus the global ones are considered (a ticket about several scripts sees the union of their knowledge). A fact or a documentation page about script A is never used to answer a ticket that is only about script B.",[10,181,182,183,186],{},"Retrieval is ",[26,184,185],{},"cross-language",": if your documentation is written in one language and the customer writes in another, the question is automatically reformulated into the documentation's language before searching, so the right sections are found either way.",[10,188,189,190,193],{},"Every AI reply records which facts it used. Staff can open the ",[26,191,192],{},"facts used"," popover on any AI message to see them, along with the AI's confidence score.",[47,195,197],{"id":196},"package-documentation-in-the-ticket-sidebar","Package documentation in the ticket sidebar",[10,199,200,201,204],{},"The same package scoping powers a ",[26,202,203],{},"Documentation"," row in the ticket details sidebar. When a ticket is linked to one or more Tebex packages, the row shows how many documentation pages those packages have; opening it lists every page with its title and address, grouped by package when the ticket covers more than one.",[10,206,207,208,211,212,214,215,218],{},"The row appears in the staff dashboard ",[26,209,210],{},"and"," in the customer portal, so the customer can reach the right guide without asking. Staff can also drop a ",[26,213,203],{}," button straight into a reply from the composer's ",[69,216,217],{},"\u002F"," menu: it opens the same list from inside the conversation, and is refused when the ticket has no documentation to show. It is hidden entirely when none of the ticket's packages has an imported documentation page. Pasted-text knowledge is never listed: it has no public address to link to. Revoking a page from the Sources tab also removes it from the sidebar.",[47,220,222],{"id":221},"testing-the-knowledge-base","Testing the knowledge base",[10,224,225,226,229,230,233],{},"You do not have to wait for a real customer ticket to check whether the AI answers well. The ",[26,227,228],{},"Test knowledge"," button, next to ",[26,231,232],{},"Add Knowledge",", opens a playground where you:",[20,235,236,243,250],{},[23,237,238,239,242],{},"pick a ",[26,240,241],{},"package scope"," (or leave it on Global),",[23,244,245,246,249],{},"type a ",[26,247,248],{},"question",", and",[23,251,252],{},"get the reply the AI would send.",[10,254,255,256,259,260,262],{},"The test uses the ",[26,257,258],{},"exact same"," retrieval, prompt, model, and post-processing as a real ticket auto-reply, so what you see is what a customer would get. The reply shows the ",[26,261,192],{}," popover and the confidence score, just like a real message.",[20,264,265,271],{},[23,266,267,268,270],{},"Anyone with ",[140,269],{"permission":142}," can run a test.",[23,272,273,274,277],{},"Each test counts as ",[26,275,276],{},"one of your monthly AI responses",", so Joely asks you to confirm the first test of each session. Tests stop when your monthly response quota is reached.",[47,279,281],{"id":280},"teach-ai","Teach AI",[10,283,284],{},"Teach AI extracts facts from a ticket conversation:",[20,286,287,294,297],{},[23,288,289,290,293],{},"The conversation needs at least ",[26,291,292],{},"2 human messages",". Internal notes, AI-generated messages, and system messages do not count.",[23,295,296],{},"The last 20 human messages are analyzed.",[23,298,299,300,303],{},"The AI proposes a list of facts; ",[26,301,302],{},"nothing is saved automatically",". You review, edit, or discard each fact before saving.",[10,305,306],{},"Facts saved from a ticket keep a reference to it. If the ticket is later deleted, the facts survive.",[47,308,310],{"id":309},"adding-facts-manually","Adding facts manually",[10,312,313,314,316],{},"Staff with ",[140,315],{"permission":162}," can write facts directly. When you submit one, Joely compares it semantically against existing facts: if a near-identical fact exists (around 90% similarity), you get a warning showing the match. The warning is not blocking, you can save anyway.",[47,318,320],{"id":319},"writing-assistance-in-the-text-editor","Writing assistance in the text editor",[10,322,323,324,327],{},"When you write a knowledge entry as plain text (",[26,325,326],{},"Add Knowledge → plain text",", or editing an existing text source), two buttons sit next to the character counter:",[10,329,330,331,334],{},"Both require the ",[26,332,333],{},"Team"," plan:",[20,336,337,343],{},[23,338,339,342],{},[26,340,341],{},"Fix with AI"," — rewrites the text for grammar, spelling, tone and clarity, in its original language.",[23,344,345,348],{},[26,346,347],{},"Translate"," — translates the text into any supported language.",[10,350,351,352,355,356,359],{},"Both act on your current ",[26,353,354],{},"selection"," when there is one, and on the whole entry otherwise, and both offer an ",[26,357,358],{},"Undo"," in the confirmation toast that restores your original text in full. Because a single request is capped at 10,000 characters, a longer entry can only be processed passage by passage: select the part you want, and the button explains this when it is unavailable. Nothing is indexed until you save.",[47,361,363],{"id":362},"web-import","Web import",[10,365,366,367,370],{},"Import any public documentation page — its content is indexed for the AI directly, with ",[26,368,369],{},"no review step",":",[372,373,374,377,380,383],"ol",{},[23,375,376],{},"Submit a URL (one per import). Only public HTTP\u002FHTTPS addresses are accepted; private and internal hosts are blocked.",[23,378,379],{},"Optionally provide CSS selectors to target specific page areas or remove noise (up to 10 selectors each).",[23,381,382],{},"A background job fetches the page (content capped at 100,000 characters), strips navigation and boilerplate, splits the text into sections, and indexes them.",[23,384,385,386,389],{},"The page serves AI replies ",[26,387,388],{},"immediately",". The import modal shows the live progress (fetch, clean & chunk, embed, save) and ends on a summary showing the page and the Tebex package it was scoped to. If that scope is wrong, change it right there — the correction applies instantly, without re-importing.",[10,391,392,393,395],{},"While a page imports, its row in the ",[26,394,42],{}," tab shows a live state (queued, fetching, indexing). A failed import shows a retry button on the same row. A page that yields no indexable content after cleanup is flagged with a \"No content\" badge; any previously indexed content is kept.",[10,397,398,399,402,403,406],{},"Re-importing the ",[26,400,401],{},"same URL"," behaves as a refresh: if the page content has not changed since the last import, the job is skipped for free with a \"page unchanged\" message. If the page changed, its indexed sections are ",[26,404,405],{},"replaced wholesale"," by the new capture — unchanged sections reuse their existing index so only the changes cost anything.",[47,408,410],{"id":409},"sitemap-import-and-refresh","Sitemap import and refresh",[10,412,413,414,416],{},"Available on the ",[26,415,333],{}," plan, sitemap import seeds the knowledge base from a whole documentation site at once instead of one URL at a time.",[372,418,419,441,452,455,458],{},[23,420,421,422,425,426,429,430,72,433,436,437,440],{},"Paste a ",[69,423,424],{},"sitemap.xml"," URL — or ",[26,427,428],{},"any page of the site"," (the site root or a deep documentation page both work). Joely discovers the sitemap via ",[69,431,432],{},"robots.txt",[69,434,435],{},"\u002Fsitemap.xml",", and, for docs hosted under a subpath, the page's parent directories (for example ",[69,438,439],{},"\u002Fdocs\u002Fsitemap.xml","). Sitemap index files are followed one level deep. Only public HTTP\u002FHTTPS addresses are accepted; private and internal hosts are blocked.",[23,442,443,444,447,448,451],{},"Joely lists every page it finds. Filter by path prefix (for example ",[69,445,446],{},"\u002Fdocs\u002F",") and select up to ",[26,449,450],{},"100 pages"," per import.",[23,453,454],{},"Pick a package scope and optional CSS selectors once; they apply to every selected page.",[23,456,457],{},"Each page becomes its own standard web-import job, processed one at a time. Pages are indexed directly — there is nothing to review.",[23,459,460,461,463],{},"A progress panel then shows one square per selected page, filling in as each page finishes: indexed, unchanged, no readable content, or failed. You can close it at any time — the import keeps running, and the ",[26,462,42],{}," tab shows the same per-page states.",[111,465,467],{"id":466},"refresh-semantics","Refresh semantics",[10,469,470,471,370],{},"Re-running the same sitemap is a safe, cheap ",[26,472,473],{},"refresh",[20,475,476,482,488],{},[23,477,478,481],{},[26,479,480],{},"Unchanged pages"," are skipped without spending anything. Joely detects this with a quick content fingerprint before doing any heavy work.",[23,483,484,487],{},[26,485,486],{},"Changed pages"," have their indexed sections replaced by the new capture.",[23,489,490,493],{},[26,491,492],{},"New pages"," are imported normally.",[47,495,497],{"id":496},"knowledge-sources-and-re-sync","Knowledge sources and re-sync",[10,499,500,501,503,504,507,508,510],{},"The ",[26,502,42],{}," tab on the knowledge page lists every imported web page, grouped by website (one group per hostname). Each page row shows how many sections are indexed, its freshness, and — while an import runs — its live state (queued, fetching, indexing, or failed with a retry button). A warning badge appears on a source after ",[26,505,506],{},"30 days"," without a sync. The list is available on every plan; the re-sync actions require the ",[26,509,333],{}," plan (same gate as sitemap import).",[10,512,513,516],{},[26,514,515],{},"Re-sync"," refreshes a whole source in one click:",[372,518,519,526,541,548,558],{},[23,520,521,522,525],{},"Joely first runs a free ",[26,523,524],{},"diagnostic",": it re-discovers the site's sitemap from one of the imported pages and fingerprints every known page, classifying each as unchanged, changed, new, missing, or errored.",[23,527,528,529,532,533,536,537,540],{},"You then confirm the re-import. Only ",[26,530,531],{},"changed"," and selected ",[26,534,535],{},"new"," pages are fetched; ",[26,538,539],{},"unchanged pages"," cost nothing. If the diagnostic finds nothing new and nothing changed, the re-sync completes on its own — there is nothing to confirm.",[23,542,543,544,547],{},"A changed page is simply ",[26,545,546],{},"re-indexed",": its stored sections are replaced by the new capture (unchanged sections reuse their existing index).",[23,549,550,553,554,557],{},[26,551,552],{},"Pages missing from the sitemap"," are flagged as possibly removed. Their indexed content is ",[26,555,556],{},"never deleted automatically"," — you decide, using the per-page delete action.",[23,559,560],{},"Pages that fail to fetch (for example a 404) are marked with an error badge. The marker is informational and clears on the next successful sync; the indexed content is kept.",[10,562,563],{},"When the re-sync finishes, the source shows an aggregated summary: how many pages were unchanged, updated, failed, and newly imported.",[47,565,567],{"id":566},"exporting-the-knowledge-base","Exporting the knowledge base",[10,569,413,570,573],{},[26,571,572],{},"Plus"," plan, export downloads your facts as a file for backup, offline review, or reuse outside Joely.",[20,575,576,581,592,599],{},[23,577,267,578,580],{},[140,579],{"permission":142}," can export.",[23,582,583,584,587,588,591],{},"Choose ",[26,585,586],{},"JSON"," (a structured file with export metadata and every fact's full content) or ",[26,589,590],{},"CSV"," (one row per fact, ready for a spreadsheet).",[23,593,594,595,598],{},"The export contains the ",[26,596,597],{},"full, untruncated content"," of every fact, not the shortened preview shown in the list.",[23,600,601],{},"It respects the package filter currently applied to the list: filter to a package (or to global facts) first to export only that scope, or leave it on \"All entries\" to export everything.",[47,603,605],{"id":604},"provenance-and-source-revocation","Provenance and source revocation",[10,607,608],{},"Because every entry tracks its source, you can clean up in bulk when a source turns out to be unreliable:",[20,610,611,617],{},[23,612,613,616],{},[26,614,615],{},"Revoking a ticket source"," deletes every fact extracted from that conversation. This is permanent.",[23,618,619,622,623,625],{},[26,620,621],{},"Deleting a web page, a folder, or a whole website"," from the ",[26,624,42],{}," tab removes its indexed content from the AI immediately and hides the pages from the list. Re-importing the same URL later brings the page back — and if its content has not changed, the restore is free (the stored sections are reused as-is).",[10,627,628],{},"Joely shows you what will be removed before you confirm.",[47,630,632],{"id":631},"the-documentation-suggestion","The documentation suggestion",[10,634,635,636,640],{},"If staff reject 3 AI drafts in a row (see ",[14,637,639],{"href":638},"\u002Fdocumentation\u002Fai\u002Fassistant#approval-mode","approval mode","), Joely surfaces a one-time suggestion to import documentation, since repeated rejections usually mean the AI lacks knowledge rather than judgment. Approving any draft resets the counter; each staff member can dismiss the suggestion permanently.",{"title":642,"searchDepth":643,"depth":643,"links":644},"",2,[645,649,650,651,652,653,654,655,656,659,660,661,662],{"id":49,"depth":643,"text":50,"children":646},[647],{"id":113,"depth":648,"text":114},3,{"id":168,"depth":643,"text":169},{"id":196,"depth":643,"text":197},{"id":221,"depth":643,"text":222},{"id":280,"depth":643,"text":281},{"id":309,"depth":643,"text":310},{"id":319,"depth":643,"text":320},{"id":362,"depth":643,"text":363},{"id":409,"depth":643,"text":410,"children":657},[658],{"id":466,"depth":648,"text":467},{"id":496,"depth":643,"text":497},{"id":566,"depth":643,"text":567},{"id":604,"depth":643,"text":605},{"id":631,"depth":643,"text":632},"ai","How curated knowledge facts and indexed documentation work together, Teach AI, web imports, sitemap import and refresh, knowledge sources and re-sync, per-package scoping, and source revocation.","md",{},true,"\u002Fdocumentation\u002Fai\u002Fknowledge",{"title":5,"description":664},"documentation\u002Fai\u002Fknowledge","2026-07-17","AubqD98b_mV-skyZc0POhmuCwvOI9d0Qs778i3oSTKw",[674,678,681,686,687,691,695,699,703,707,710,711,714,717,721,724,727,730,733,737,740],{"title":675,"path":676,"category":677,"order":677},"Customer portal","\u002Fdocumentation\u002Fportal\u002Foverview",null,{"title":679,"path":680,"category":677,"order":677},"Ticket lifecycle","\u002Fdocumentation\u002Ftickets\u002Flifecycle",{"title":682,"path":683,"category":684,"order":685},"Account & security","\u002Fdocumentation\u002Faccount\u002Fsecurity","account",1,{"title":17,"path":16,"category":663,"order":685},{"title":688,"path":689,"category":690,"order":685},"CSAT surveys","\u002Fdocumentation\u002Fcsat","csat",{"title":692,"path":693,"category":694,"order":685},"Getting started","\u002Fdocumentation\u002Fgetting-started","getting-started",{"title":696,"path":697,"category":698,"order":685},"Tebex integration","\u002Fdocumentation\u002Fintegrations\u002Ftebex","integrations",{"title":700,"path":701,"category":702,"order":685},"Roles & permissions","\u002Fdocumentation\u002Fteam\u002Froles-permissions","team",{"title":704,"path":705,"category":706,"order":685},"Ticket statuses","\u002Fdocumentation\u002Ftickets\u002Fstatuses","tickets",{"title":708,"path":709,"category":684,"order":643},"Notifications","\u002Fdocumentation\u002Faccount\u002Fnotifications",{"title":5,"path":668,"category":663,"order":643},{"title":712,"path":713,"category":698,"order":643},"Discord integration","\u002Fdocumentation\u002Fintegrations\u002Fdiscord",{"title":715,"path":716,"category":694,"order":643},"Plans & limits","\u002Fdocumentation\u002Fplans-limits",{"title":718,"path":719,"category":720,"order":643},"Portal customization","\u002Fdocumentation\u002Fportal\u002Fbranding","portal",{"title":722,"path":723,"category":702,"order":643},"Members & invitations","\u002Fdocumentation\u002Fteam\u002Fmembers-invitations",{"title":725,"path":726,"category":663,"order":648},"Writing AI-ready documentation","\u002Fdocumentation\u002Fai\u002Fwriting-ai-ready-docs",{"title":728,"path":729,"category":698,"order":648},"GitHub integration","\u002Fdocumentation\u002Fintegrations\u002Fgithub",{"title":731,"path":732,"category":706,"order":648},"Messages & conversation","\u002Fdocumentation\u002Ftickets\u002Fmessages",{"title":734,"path":735,"category":698,"order":736},"Tebex keys & security","\u002Fdocumentation\u002Fintegrations\u002Ftebex-keys",4,{"title":738,"path":739,"category":706,"order":736},"Configuring the ticket form","\u002Fdocumentation\u002Ftickets\u002Fconfiguration",{"title":741,"path":742,"category":698,"order":743},"Self-hosted Tebex Bridge","\u002Fdocumentation\u002Fintegrations\u002Ftebex-bridge",5]