PageSourceSearch

https://big-agi.com/_next/static/chunks/pages/docs/self-host-issues-17b31b6b9ccbd5c9.js

js big-agi.com collected 2026-10-06 22:38:48 UTC 24,289 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3206],{50624:(e,s,n)=>{"use strict";n.r(s),n.d(s,{default:()=>l});var i=n(37876),r=n(17756);function t(e){let s={a:"a",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components},{Callout:n,DocImage:t}=s;return n||o("Callout",!0),t||o("DocImage",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.p,{children:"Your instance reports its own state in two places."}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Where"}),(0,i.jsx)(s.th,{children:"What it reports"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"the boot line, at build and at start, in the container log"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"\uD83E\uDDE0 big-AGI v<pkgVersion> (@<buildHash>, N:<nodeEnv>)"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"/dev/debug"})," -> the Backend card"]}),(0,i.jsx)(s.td,{children:"the live capability list the server computed - booleans only, key values never sent to the browser"})]})]})]}),"\n",(0,i.jsx)(n,{kind:"note",children:(0,i.jsxs)(s.p,{children:["Everything here happens on an instance somebody runs. ",(0,i.jsx)(s.a,{href:"/docs/self-host",children:"Run it yourself"})," carries the configuration and deploy procedures; the symptoms are here. ",(0,i.jsx)(s.code,{children:"/dev/*"})," is not covered by the shipped basic-auth matcher."]})}),"\n",(0,i.jsx)(s.h2,{id:"error-messages-map",children:"Error messages map"}),"\n",(0,i.jsx)(s.p,{children:"The exact string, its meaning, and the section that fixes it:"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"What you see"}),(0,i.jsx)(s.th,{children:"What it means"}),(0,i.jsx)(s.th,{children:"Fix"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"❌ Invalid environment variables:"})," and the build stops"]}),(0,i.jsx)(s.td,{children:"A variable holds a malformed URL"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.a,{href:"/docs/self-host-issues#invalid-environment-variables",children:"below"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"A variable is set and nothing changed"}),(0,i.jsxs)(s.td,{children:["A ",(0,i.jsx)(s.code,{children:"NEXT_PUBLIC_*"})," name, an empty value, or a name that never reached the process"]}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.a,{href:"/docs/self-host-issues#i-set-the-variable-and-nothing-changed",children:"below"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"Missing <Vendor> API Key"})," although the variable is set"]}),(0,i.jsx)(s.td,{children:"The server did not read it, or the UI is overriding it"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.a,{href:"/docs/self-host-issues#missing-vendor-api-key-and-the-variable-is-set",children:"below"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"[<Vendor> network issue]: Could not connect:"})," + ",(0,i.jsx)(s.code,{children:"Please make sure the Server can access -> <url>"})]}),(0,i.jsx)(s.td,{children:"Your server cannot reach that address"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.a,{href:"/docs/self-host-issues#could-not-connect",children:"below"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"Unauthorized"})," \xb7 ",(0,i.jsx)(s.code,{children:"Unauthorized/Unconfigured"})," before the app loads"]}),(0,i.jsx)(s.td,{children:"Basic auth is compiled in, and its variables are unset"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.a,{href:"/docs/self-host-issues#unauthorizedunconfigured",children:"below"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Answers arrive all at once, or long generations die"}),(0,i.jsx)(s.td,{children:"The proxy in front is buffering or timing out"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.a,{href:"/docs/self-host-issues#answers-arrive-all-at-once-or-a-stream-dies",children:"below"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"**Request too large**"})," on your own deployment"]}),(0,i.jsx)(s.td,{children:"Your proxy's body limit, not Big-AGI's"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.a,{href:"/docs/self-host-issues#request-too-large-from-my-proxy",children:"below"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"The microphone does nothing on a LAN address"}),(0,i.jsx)(s.td,{children:"Not a secure context, so the browser withholds the API"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.a,{href:"/docs/self-host-issues#the-microphone-does-nothing-on-my-lan-address",children:"below"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"Invalid WSS browser endpoint"})," \xb7 ",(0,i.jsx)(s.code,{children:"Missing API Key or Custom Search Engine ID"})," \xb7 ",(0,i.jsx)(s.code,{children:"Missing ElevenLabs API key"})]}),(0,i.jsx)(s.td,{children:"An optional service is half-configured"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.a,{href:"/docs/self-host-issues#a-capability-is-configured-and-does-nothing",children:"below"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:["Ollama's ",(0,i.jsx)(s.strong,{children:"Pull"})," times out part-way"]}),(0,i.jsx)(s.td,{children:"Expected on an edge function; the download resumes"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.a,{href:"/docs/self-host-issues#ollama-pull-times-out",children:"below"})})]})]})]}),"\n",(0,i.jsx)(s.h2,{id:"invalid-environment-variables",children:(0,i.jsx)(s.code,{children:"Invalid environment variables"})}),"\n",(0,i.jsx)(s.p,{children:"The build stopped, not the server: validation runs at build time and prints the offending names. Every variable in the schema is optional, so what fails is a malformed value."}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{children:"❌ Invalid environment variables:\n\nURL-checked names   the *_API_HOST family, AZURE_OPENAI_API_ENDPOINT,\n                    PUPPETEER_WSS_ENDPOINT, NEXT_PUBLIC_PLANTUML_SERVER_URL\nOPENAI_API_HOST=api.openai.com           fails\nOPENAI_API_HOST=https://api.openai.com   passes\n"})}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsx)(s.li,{children:"Give each of those a scheme, then rebuild."}),"\n",(0,i.jsxs)(s.li,{children:["Removing a variable entirely is always valid, because nothing is required (",(0,i.jsx)(s.a,{href:"/docs/self-host-configuration#where-to-set-them",children:"configure your instance"}),")."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"i-set-the-variable-and-nothing-changed",children:"I set the variable and nothing changed"}),"\n",(0,i.jsx)(s.p,{children:"Three causes produce the same result: nothing changes."}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Cause"}),(0,i.jsx)(s.th,{children:"What is happening"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:["a ",(0,i.jsx)(s.code,{children:"NEXT_PUBLIC_*"})," name"]}),(0,i.jsxs)(s.td,{children:["compiled into the browser bundle at build time, so ",(0,i.jsx)(s.code,{children:"docker run -e"})," on a prebuilt image does nothing"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"an empty value"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"OPENAI_API_KEY="})," is treated as absent, deliberately, so a half-filled secrets file is predictable"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"the name never reached the process"}),(0,i.jsxs)(s.td,{children:["the Backend card at ",(0,i.jsx)(s.code,{children:"/dev/debug"})," - the capability boolean is the proof"]})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:["The message of the day, Drive import, analytics and the PlantUML server are all ",(0,i.jsx)(s.code,{children:"NEXT_PUBLIC_*"}),": rebuild with the value set. Cerebras, Sakana and Modular do not surface as booleans, and ",(0,i.jsx)(s.code,{children:"AIX_STRICT_PARSING"})," is not reported at all."]}),"\n",(0,i.jsxs)(s.p,{children:["When a release moves a vendor's model definitions, or the server holds a key for a service the browser has not created yet, that browser refreshes the affected services once on its next load. A failure logs ",(0,i.jsx)(s.code,{children:"Auto-configuration failed for service:"})," and does not stop the others (",(0,i.jsx)(s.a,{href:"/docs/self-host-configuration#build-time-and-run-time",children:"build time and run time"}),")."]}),"\n",(0,i.jsxs)(s.h2,{id:"missing-vendor-api-key-and-the-variable-is-set",children:[(0,i.jsx)(s.code,{children:"Missing <Vendor> API Key"})," and the variable is set"]}),"\n",(0,i.jsx)(s.p,{children:"The guard fires when no key reached the request, which is not the same as no key being configured. Precedence is identical at every AI service: UI setting, then server environment variable, then in-code default."}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Confirm the server read it - ",(0,i.jsx)(s.code,{children:"/dev/debug"}),", or a key field showing ",(0,i.jsx)(s.code,{children:"Already set on server"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["A key typed into the UI takes precedence over the server's; clear that field to fall back to the deployment's (",(0,i.jsx)(s.a,{href:"/docs/self-host-configuration#keys-and-access-control",children:"keys and access control"}),")."]}),"\n",(0,i.jsx)(s.li,{children:"One inversion exists, for security: the Bedrock regi
1on comes from the server and the client's value is ignored."}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"could-not-connect",children:(0,i.jsx)(s.code,{children:"Could not connect:"})}),"\n",(0,i.jsx)(s.p,{children:"Your server could not reach the address it was given."}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{children:"[<Vendor> network issue]: Could not connect: <reason>.\nPlease make sure the Server can access -> <url>\n"})}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsx)(s.li,{children:"Test reachability from inside the container or pod, not from your laptop - egress rules differ."}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"localhost"})," inside a container is the container; point at the host's address. A model runtime on ",(0,i.jsx)(s.code,{children:"127.0.0.1"})," is a different problem with a different fix (",(0,i.jsx)(s.a,{href:"/docs/issue-messages",children:"my local models don't show up"}),")."]}),"\n",(0,i.jsxs)(s.li,{children:["That reachability line is appended to 404 and 502 responses as well, and to 403. On a 403 it misleads: the request arrived and was refused (",(0,i.jsx)(s.a,{href:"/docs/issue-key-and-access#upstream-responded-with-http-403-forbidden",children:"403 Forbidden"}),")."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"unauthorizedunconfigured",children:(0,i.jsx)(s.code,{children:"Unauthorized/Unconfigured"})}),"\n",(0,i.jsx)(s.p,{children:"HTTP basic auth is compiled in and its credentials are unset. The shipped middleware is inactive until you rename it and rebuild, so this state means the rename happened and the environment did not follow."}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"What you see"}),(0,i.jsx)(s.th,{children:"What it means"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"Unauthorized/Unconfigured"})}),(0,i.jsx)(s.td,{children:"the credentials are unset"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"Unauthorized"})}),(0,i.jsx)(s.td,{children:"credentials were sent and did not match"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"server log:"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"HTTP Basic Authentication is enabled but not configured"})})]})]})]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Basic auth"}),(0,i.jsx)(s.th,{children:"Paths"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"the matcher protects"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"/"}),", the API, a few app routes"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"it does not protect"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"/workspace"}),", ",(0,i.jsx)(s.code,{children:"/draw"}),", ",(0,i.jsx)(s.code,{children:"/diff"}),", ",(0,i.jsx)(s.code,{children:"/tokens"}),", ",(0,i.jsx)(s.code,{children:"/dev/*"})]})]})]})]}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsx)(s.li,{children:"Set the two credential variables and rebuild."}),"\n",(0,i.jsx)(s.li,{children:"To back it out, restore the middleware's original filename and rebuild."}),"\n",(0,i.jsxs)(s.li,{children:["Know what it covers. Nobody can spend your keys through the app, but the unprotected pages, ",(0,i.jsx)(s.code,{children:"/dev/debug"})," among them, load for anyone. Authentication in front of the app covers the rest, with no rebuild (",(0,i.jsx)(s.a,{href:"/docs/self-host-configuration#keys-and-access-control",children:"keys and access control"}),")."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"answers-arrive-all-at-once-or-a-stream-dies",children:"Answers arrive all at once, or a stream dies"}),"\n",(0,i.jsxs)(s.p,{children:["The proxy in front is buffering or timing out. The transport is a long-lived chunked JSON response on ",(0,i.jsx)(s.code,{children:"/api/edge"})," and ",(0,i.jsx)(s.code,{children:"/api/cloud"}),", not SSE. A proxy that buffers holds the whole answer until generation finishes."]}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Stop buffering and caching on ",(0,i.jsx)(s.code,{children:"/api/*"}),"."]}),"\n",(0,i.jsx)(s.li,{children:"Raise read, send and connect timeouts well past a long generation, and the request body limit with them."}),"\n",(0,i.jsxs)(s.li,{children:["Pass ",(0,i.jsx)(s.code,{children:"Upgrade"})," and ",(0,i.jsx)(s.code,{children:"Connection"})," only if you want the dev-tools websocket."]}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["The directives are on ",(0,i.jsx)(s.a,{href:"/docs/self-host-configuration#behind-a-reverse-proxy",children:"behind a reverse proxy"}),". A gateway answering with its own HTML page produces a different string: ",(0,i.jsx)(s.a,{href:"/docs/issue-messages",children:(0,i.jsx)(s.code,{children:"**Network issue**"})}),"."]}),"\n",(0,i.jsxs)(s.h2,{id:"request-too-large-from-my-proxy",children:[(0,i.jsx)(s.code,{children:"Request too large"})," from my proxy"]}),"\n",(0,i.jsxs)(s.p,{children:["A 413 from a layer in front of the application - your reverse proxy or your platform's ingress, not Big-AGI. Off the hosted build the card says so, suggesting ",(0,i.jsx)(s.em,{children:'"If self
1-hosting, raise the request size limit on your server or proxy"'}),"."]}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsx)(s.li,{children:"Raise the body limit on the proxy that fronts the app, and on the platform ingress where there is one."}),"\n",(0,i.jsx)(s.li,{children:"Restart and resend; nothing retries a 413 automatically, because a retry cannot succeed."}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"the-microphone-does-nothing-on-my-lan-address",children:"The microphone does nothing on my LAN address"}),"\n",(0,i.jsxs)(s.p,{children:["Microphone, clipboard and screen capture are secure-context browser APIs. ",(0,i.jsx)(s.code,{children:"http://localhost"})," counts as secure and ",(0,i.jsx)(s.code,{children:"http://192.168.x.x"})," does not, so on a LAN address the browser withholds them and shows nothing."]}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Put the instance behind HTTPS (",(0,i.jsx)(s.a,{href:"/docs/self-host-configuration#https",children:"HTTPS"}),")."]}),"\n",(0,i.jsxs)(s.li,{children:["Or reach it as ",(0,i.jsx)(s.code,{children:"localhost"})," from the machine that runs it. For local development the repository ships ",(0,i.jsx)(s.code,{children:"npm run dev-https"}),"."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"a-capability-is-configured-and-does-nothing",children:"A capability is configured and does nothing"}),"\n",(0,i.jsx)(s.p,{children:"Each optional service refuses in its own words, and the string names which one."}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"What you see"}),(0,i.jsx)(s.th,{children:"Which service"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"Invalid WSS browser endpoint"})}),(0,i.jsx)(s.td,{children:"Page fetching"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"Missing API Key or Custom Search Engine ID"})}),(0,i.jsxs)(s.td,{children:["Web search - failures from Google come back as ",(0,i.jsx)(s.code,{children:"Google Custom Search API error: <message>"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"Missing ElevenLabs API key"})}),(0,i.jsx)(s.td,{children:"Voice"})]})]})]}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Configure the one that failed (",(0,i.jsx)(s.a,{href:"/docs/self-host-optional-services",children:"optional services"}),"), then confirm the server read it at ",(0,i.jsx)(s.code,{children:"/dev/debug"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["A ",(0,i.jsx)(s.code,{children:"static"})," build has no server at all, so server-side keys, page fetching and basic auth are absent by construction rather than misconfigured."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"ollama-pull-times-out",children:"Ollama Pull times out"}),"\n",(0,i.jsxs)(s.p,{children:["The in-app ",(0,i.jsx)(s.strong,{children:"Ollama Admin"})," pull runs against an edge function, which times out part-way through a large model."]}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Press ",(0,i.jsx)(s.strong,{children:"Pull"})," again until a green message appears - the model server keeps the partial download and resumes."]}),"\n",(0,i.jsx)(s.li,{children:"Or pull on the machine running Ollama, then refresh the list here."}),"\n"]}),"\n",(0,i.jsx)(t,{src:"/docs/legacy/config-ollama-2-admin-pull.png",alt:"The Ollama Admin pull dialog showing the green success line after a completed pull",caption:"The green line is the signal the pull finished.",spec:"Recapture on the current Ollama Admin dialog after a completed pull.",children:(0,i.jsxs)(s.p,{children:["The pull dialog ends in a green ",(0,i.jsx)(s.code,{children:"success"})," line when the model finished downloading."]})}),"\n",(0,i.jsx)(s.h2,{id:"none-of-these-match",children:"None of these match"}),"\n",(0,i.jsxs)(s.p,{children:["Attach ",(0,i.jsx)(s.code,{children:"/dev/debug"})," -> ",(0,i.jsx)(s.strong,{children:"Download debug JSON"}),": it carries capability booleans and build info, and no key values. The client-side log is ",(0,i.jsx)(s.strong,{children:"Settings > Tools > Logs Viewer"}),", under ",(0,i.jsx)(s.strong,{children:"Diagnostics"}),". Never paste an env file, a key or conversation content. ",(0,i.jsx)(s.a,{href:"/docs/issue-messages#where-to-send-new-error-messages",children:"Where to send it"}),"."]}),"\n",(0,i.jsx)(s.h2,{id:"update-required",children:(0,i.jsx)(s.code,{children:"Update Required"})}),"\n",(0,i.jsx)(s.p,{children:"Big-AGI was redeployed while this tab kept running. The loaded app no longer matches the deployed files. Nothing is broken and there is nothing to report."}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Press ",(0,i.jsx)(s.strong,{children:"Reload Big-AGI"}),". The screen says as much: ",(0,i.jsx)(s.em,{children:'"Reloading should fetch the current version."'})]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"oops-we-hit-a-snag",children:(0,i.jsx)(s.code,{children:"Oops, we hit a snag"})}),"\n",(0,i.jsx)(s.p,{children:"Anything else that stopped the app. This is the one worth sending in."}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Expand ",(0,i.jsx)(s.strong,{children:"Error Details (Dev)"})," and copy the message and stack."]}),"\n",(0,i.jsx)(s.li,{children:"Remove anything of yours from what you copied."}),"\n",(0,i.jsxs)(s.li,{children:["Send it through ",(0,i.jsx)(s.strong,{children:"Contact Support"})," on that same screen. On the hosted app it opens a message to the builder; on a build you deployed it opens the GitHub form."]}),"\n",(0,i.jsxs)(s.li,{children:["Press ",(0,i.jsx)(s.strong,{children:"Reload Big-AGI"}),"."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"where-to-send-new-error-messages",children:"Where to send new error messages"}),"\n",(0,i.jsxs)(s.p,{children:["A string that is not here is a gap in the documentation - report it and the row gets added. The GitHub form is ",(0,i.jsx)(s.a,{href:"https://github.com/enricoros/big-AGI/issues/new?template=ai-triage.yml",children:"\uD83D\uDD25 Make AI Fix This"}),", the same form the app opens as ",(0,i.jsx)(s.strong,{children:"Auto-Fix Issue"}),". Paste the ",(0,i.jsx)(s.strong,{children:"exact string"})," rather than a paraphrase, and attach ",(0,i.jsx)(s.code,{children:"/dev/debug"})," -> ",(0,i.jsx)(s.strong,{children:"Download debug JSON"})," - capability booleans and build info, no key values."]}),"\n",(0,i.jsx)(n,{kind:"warn",children:(0,i.jsx)(s.p,{children:"Never paste an env file, an API key, or the content you were working on. The GitHub issue form is world-readable and permanent."})}),"\n",(0,i.jsx)(s.h2,{id:"related",children:"Related"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"/docs/self-host-configuration",children:"Configure your instance"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"/docs/self-host-configuration#keys-and-access-control",children:"Keys and access control"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"/docs/self-host-optional-services",children:"Optional services"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"/docs/issue-messages",children:"Fix a problem"})}),"\n"]})]})}function d(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(t,{...e})}):t(e)}function o(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}var a=n(6707);let h={slug:"self-host-issues",title:"My self-hosted instance is broken",description:"Symptoms on an instance you run: a build that stops, a variable that does nothing, egress that fails, a proxy that buffers, and a lockout you built yourself.",status:"stable",tier:"open",qualifier:null,cta:null,tierBadge:!0,toc:[{text:"Error messages map",id:"error-messages-map"},{text:"`Invalid environment variables`",id:"invalid-environment-variables"},{text:"I set the variable and nothing changed",id:"i-set-the-variable-and-nothing-changed"},{text:"`Missing <Vendor> API Key` and the variable is set",id:"missing-vendor-api-key-and-the-variable-is-set"}
1,{text:"`Could not connect:`",id:"could-not-connect"},{text:"`Unauthorized/Unconfigured`",id:"unauthorizedunconfigured"},{text:"Answers arrive all at once, or a stream dies",id:"answers-arrive-all-at-once-or-a-stream-dies"},{text:"`Request too large` from my proxy",id:"request-too-large-from-my-proxy"},{text:"The microphone does nothing on my LAN address",id:"the-microphone-does-nothing-on-my-lan-address"},{text:"A capability is configured and does nothing",id:"a-capability-is-configured-and-does-nothing"},{text:"Ollama Pull times out",id:"ollama-pull-times-out"},{text:"None of these match",id:"none-of-these-match"},{text:"`Update Required`",id:"update-required"},{text:"`Oops, we hit a snag`",id:"oops-we-hit-a-snag"},{text:"Where to send new error messages",id:"where-to-send-new-error-messages"},{text:"Related",id:"related"}],missingImages:[]};function l(){return(0,i.jsx)(a.w,{meta:h,Body:d})}},50828:(e,s,n)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/docs/self-host-issues",function(){return n(50624)}])}},e=>{e.O(0,[9173,8745,9084,9079,6284,636,6593,8792],()=>e(e.s=50828)),_N_E=e.O()}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.