[{"data":1,"prerenderedAt":690},["ShallowReactive",2],{"navigation_docs_en":3,"-en-api-chat":78,"-en-api-chat-surround":685},[4,25,42,58],{"title":5,"path":6,"stem":7,"children":8,"page":24},"Quick Start","/en/quick-start","en/1.quick-start",[9,12,16,20],{"title":5,"path":10,"stem":11},"/en/quick-start/overview","en/1.quick-start/0.overview",{"title":13,"path":14,"stem":15},"Install and Download","/en/quick-start/install","en/1.quick-start/1.install",{"title":17,"path":18,"stem":19},"First Launch and First Message","/en/quick-start/first-run","en/1.quick-start/2.first-run",{"title":21,"path":22,"stem":23},"macOS Install Guide","/en/quick-start/macos-install","en/1.quick-start/3.macos-install",false,{"title":26,"path":27,"stem":28,"children":29,"page":24},"Manual","/en/manual","en/2.manual",[30,34,38],{"title":31,"path":32,"stem":33},"User Manual","/en/manual/overview","en/2.manual/0.overview",{"title":35,"path":36,"stem":37},"Provider and Model Configuration","/en/manual/providers","en/2.manual/1.providers",{"title":39,"path":40,"stem":41},"Conversation and Context Management","/en/manual/chat-and-context","en/2.manual/2.chat-and-context",{"title":43,"path":44,"stem":45,"children":46,"page":24},"FAQ","/en/faq","en/3.faq",[47,50,54],{"title":43,"path":48,"stem":49},"/en/faq/overview","en/3.faq/0.overview",{"title":51,"path":52,"stem":53},"Privacy Policy","/en/faq/privacy-policy","en/3.faq/1.privacy-policy",{"title":55,"path":56,"stem":57},"Account Deletion","/en/faq/account-deletion","en/3.faq/2.account-deletion",{"title":59,"path":60,"stem":61,"children":62,"page":24},"Developer API","/en/api","en/4.api",[63,66,70,74],{"title":59,"path":64,"stem":65},"/en/api/overview","en/4.api/0.overview",{"title":67,"path":68,"stem":69},"Chat and embeddings","/en/api/chat","en/4.api/1.chat",{"title":71,"path":72,"stem":73},"Images and video","/en/api/images","en/4.api/2.images",{"title":75,"path":76,"stem":77},"Errors, limits and billing","/en/api/errors","en/4.api/3.errors",{"id":79,"title":67,"body":80,"description":678,"extension":679,"links":680,"meta":681,"navigation":682,"path":68,"seo":683,"stem":69,"__hash__":684},"docs_en/en/4.api/1.chat.md",{"type":81,"value":82,"toc":669},"minimark",[83,88,108,220,225,232,274,282,286,289,481,488,492,499,503,515,566,573,577,583,647,665],[84,85,87],"h2",{"id":86},"chat-completions","Chat Completions",[89,90,91,95,96,99,100,103,104,107],"p",{},[92,93,94],"code",{},"POST /v1/chat/completions"," behaves exactly like OpenAI's endpoint of the same name. The request\nbody is forwarded to the upstream model as-is, so ",[92,97,98],{},"tools",", vision input, ",[92,101,102],{},"temperature",",\n",[92,105,106],{},"max_tokens"," and friends work whenever the model itself supports them.",[109,110,115],"pre",{"className":111,"code":112,"language":113,"meta":114,"style":114},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl https://bothub-api.bookab.info/v1/chat/completions \\\n  -H \"Authorization: Bearer $BOTHUB_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"model\": \"gpt-5.4\",\n    \"messages\": [\n      {\"role\": \"system\", \"content\": \"You are a concise assistant.\"},\n      {\"role\": \"user\", \"content\": \"Explain vector databases in one sentence\"}\n    ]\n  }'\n","bash","",[92,116,117,134,155,169,181,187,193,199,205,211],{"__ignoreMap":114},[118,119,122,126,130],"span",{"class":120,"line":121},"line",1,[118,123,125],{"class":124},"sBMFI","curl",[118,127,129],{"class":128},"sfazB"," https://bothub-api.bookab.info/v1/chat/completions",[118,131,133],{"class":132},"sTEyZ"," \\\n",[118,135,137,140,144,147,150,153],{"class":120,"line":136},2,[118,138,139],{"class":128},"  -H",[118,141,143],{"class":142},"sMK4o"," \"",[118,145,146],{"class":128},"Authorization: Bearer ",[118,148,149],{"class":132},"$BOTHUB_API_KEY",[118,151,152],{"class":142},"\"",[118,154,133],{"class":132},[118,156,158,160,162,165,167],{"class":120,"line":157},3,[118,159,139],{"class":128},[118,161,143],{"class":142},[118,163,164],{"class":128},"Content-Type: application/json",[118,166,152],{"class":142},[118,168,133],{"class":132},[118,170,172,175,178],{"class":120,"line":171},4,[118,173,174],{"class":128},"  -d",[118,176,177],{"class":142}," '",[118,179,180],{"class":128},"{\n",[118,182,184],{"class":120,"line":183},5,[118,185,186],{"class":128},"    \"model\": \"gpt-5.4\",\n",[118,188,190],{"class":120,"line":189},6,[118,191,192],{"class":128},"    \"messages\": [\n",[118,194,196],{"class":120,"line":195},7,[118,197,198],{"class":128},"      {\"role\": \"system\", \"content\": \"You are a concise assistant.\"},\n",[118,200,202],{"class":120,"line":201},8,[118,203,204],{"class":128},"      {\"role\": \"user\", \"content\": \"Explain vector databases in one sentence\"}\n",[118,206,208],{"class":120,"line":207},9,[118,209,210],{"class":128},"    ]\n",[118,212,214,217],{"class":120,"line":213},10,[118,215,216],{"class":128},"  }",[118,218,219],{"class":142},"'\n",[221,222,224],"h3",{"id":223},"streaming","Streaming",[89,226,227,228,231],{},"Pass ",[92,229,230],{},"\"stream\": true"," for standard SSE:",[109,233,237],{"className":234,"code":235,"language":236,"meta":114,"style":114},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","stream = client.chat.completions.create(\n    model=\"gpt-5.4\",\n    messages=[{\"role\": \"user\", \"content\": \"Write a short poem\"}],\n    stream=True,\n)\nfor chunk in stream:\n    print(chunk.choices[0].delta.content or \"\", end=\"\")\n","python",[92,238,239,244,249,254,259,264,269],{"__ignoreMap":114},[118,240,241],{"class":120,"line":121},[118,242,243],{},"stream = client.chat.completions.create(\n",[118,245,246],{"class":120,"line":136},[118,247,248],{},"    model=\"gpt-5.4\",\n",[118,250,251],{"class":120,"line":157},[118,252,253],{},"    messages=[{\"role\": \"user\", \"content\": \"Write a short poem\"}],\n",[118,255,256],{"class":120,"line":171},[118,257,258],{},"    stream=True,\n",[118,260,261],{"class":120,"line":183},[118,262,263],{},")\n",[118,265,266],{"class":120,"line":189},[118,267,268],{},"for chunk in stream:\n",[118,270,271],{"class":120,"line":195},[118,272,273],{},"    print(chunk.choices[0].delta.content or \"\", end=\"\")\n",[275,276,277,278,281],"note",{},"Usage numbers arrive in the final chunk of a stream. You don't need to set ",[92,279,280],{},"stream_options","\nyourself — the server adds it.",[221,283,285],{"id":284},"vision-input","Vision input",[89,287,288],{},"When the model supports it, pass images in OpenAI's format:",[109,290,294],{"className":291,"code":292,"language":293,"meta":114,"style":114},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"model\": \"gpt-5.4\",\n  \"messages\": [{\n    \"role\": \"user\",\n    \"content\": [\n      {\"type\": \"text\", \"text\": \"What is in this image?\"},\n      {\"type\": \"image_url\", \"image_url\": {\"url\": \"https://example.com/cat.jpg\"}}\n    ]\n  }]\n}\n","json",[92,295,296,300,323,337,358,372,415,467,471,476],{"__ignoreMap":114},[118,297,298],{"class":120,"line":121},[118,299,180],{"class":142},[118,301,302,305,309,311,314,316,319,321],{"class":120,"line":136},[118,303,304],{"class":142},"  \"",[118,306,308],{"class":307},"spNyl","model",[118,310,152],{"class":142},[118,312,313],{"class":142},":",[118,315,143],{"class":142},[118,317,318],{"class":128},"gpt-5.4",[118,320,152],{"class":142},[118,322,103],{"class":142},[118,324,325,327,330,332,334],{"class":120,"line":157},[118,326,304],{"class":142},[118,328,329],{"class":307},"messages",[118,331,152],{"class":142},[118,333,313],{"class":142},[118,335,336],{"class":142}," [{\n",[118,338,339,342,345,347,349,351,354,356],{"class":120,"line":171},[118,340,341],{"class":142},"    \"",[118,343,344],{"class":124},"role",[118,346,152],{"class":142},[118,348,313],{"class":142},[118,350,143],{"class":142},[118,352,353],{"class":128},"user",[118,355,152],{"class":142},[118,357,103],{"class":142},[118,359,360,362,365,367,369],{"class":120,"line":183},[118,361,341],{"class":142},[118,363,364],{"class":124},"content",[118,366,152],{"class":142},[118,368,313],{"class":142},[118,370,371],{"class":142}," [\n",[118,373,374,377,379,383,385,387,389,392,394,397,399,401,403,405,407,410,412],{"class":120,"line":189},[118,375,376],{"class":142},"      {",[118,378,152],{"class":142},[118,380,382],{"class":381},"sbssI","type",[118,384,152],{"class":142},[118,386,313],{"class":142},[118,388,143],{"class":142},[118,390,391],{"class":128},"text",[118,393,152],{"class":142},[118,395,396],{"class":142},",",[118,398,143],{"class":142},[118,400,391],{"class":381},[118,402,152],{"class":142},[118,404,313],{"class":142},[118,406,143],{"class":142},[118,408,409],{"class":128},"What is in this image?",[118,411,152],{"class":142},[118,413,414],{"class":142},"},\n",[118,416,417,419,421,423,425,427,429,432,434,436,438,440,442,444,447,449,453,455,457,459,462,464],{"class":120,"line":195},[118,418,376],{"class":142},[118,420,152],{"class":142},[118,422,382],{"class":381},[118,424,152],{"class":142},[118,426,313],{"class":142},[118,428,143],{"class":142},[118,430,431],{"class":128},"image_url",[118,433,152],{"class":142},[118,435,396],{"class":142},[118,437,143],{"class":142},[118,439,431],{"class":381},[118,441,152],{"class":142},[118,443,313],{"class":142},[118,445,446],{"class":142}," {",[118,448,152],{"class":142},[118,450,452],{"class":451},"swJcz","url",[118,454,152],{"class":142},[118,456,313],{"class":142},[118,458,143],{"class":142},[118,460,461],{"class":128},"https://example.com/cat.jpg",[118,463,152],{"class":142},[118,465,466],{"class":142},"}}\n",[118,468,469],{"class":120,"line":201},[118,470,210],{"class":142},[118,472,473],{"class":120,"line":207},[118,474,475],{"class":142},"  }]\n",[118,477,478],{"class":120,"line":213},[118,479,480],{"class":142},"}\n",[89,482,483,484,487],{},"The image reference must be something the upstream model can fetch itself: a public URL or a\n",[92,485,486],{},"data:"," URI. Local file paths do not work.",[221,489,491],{"id":490},"message-count-limit","Message count limit",[89,493,494,495,498],{},"A single request carries at most 500 messages. A long session that keeps calling tools reaches\nthat ceiling faster than you'd expect — compact the history instead of appending forever. Going\nover returns 400, and the ",[92,496,497],{},"message"," names the offending field.",[84,500,502],{"id":501},"responses","Responses",[89,504,505,508,509,512,513,313],{},[92,506,507],{},"POST /v1/responses"," is OpenAI's newer protocol. It takes ",[92,510,511],{},"input"," instead of ",[92,514,329],{},[109,516,518],{"className":111,"code":517,"language":113,"meta":114,"style":114},"curl https://bothub-api.bookab.info/v1/responses \\\n  -H \"Authorization: Bearer $BOTHUB_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\": \"gpt-5.4\", \"input\": \"Hello\"}'\n",[92,519,520,529,543,555],{"__ignoreMap":114},[118,521,522,524,527],{"class":120,"line":121},[118,523,125],{"class":124},[118,525,526],{"class":128}," https://bothub-api.bookab.info/v1/responses",[118,528,133],{"class":132},[118,530,531,533,535,537,539,541],{"class":120,"line":136},[118,532,139],{"class":128},[118,534,143],{"class":142},[118,536,146],{"class":128},[118,538,149],{"class":132},[118,540,152],{"class":142},[118,542,133],{"class":132},[118,544,545,547,549,551,553],{"class":120,"line":157},[118,546,139],{"class":128},[118,548,143],{"class":142},[118,550,164],{"class":128},[118,552,152],{"class":142},[118,554,133],{"class":132},[118,556,557,559,561,564],{"class":120,"line":171},[118,558,174],{"class":128},[118,560,177],{"class":142},[118,562,563],{"class":128},"{\"model\": \"gpt-5.4\", \"input\": \"Hello\"}",[118,565,219],{"class":142},[275,567,568,569,572],{},"BotHub forces ",[92,570,571],{},"store: false"," on every forwarded request — upstream providers never persist your\nprompts.",[84,574,576],{"id":575},"embeddings","Embeddings",[89,578,579,582],{},[92,580,581],{},"POST /v1/embeddings"," takes a single string or an array of up to 256 strings.",[109,584,586],{"className":111,"code":585,"language":113,"meta":114,"style":114},"curl https://bothub-api.bookab.info/v1/embeddings \\\n  -H \"Authorization: Bearer $BOTHUB_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"model\": \"text-embedding-4\",\n    \"input\": [\"first passage\", \"second passage\"]\n  }'\n",[92,587,588,597,611,623,631,636,641],{"__ignoreMap":114},[118,589,590,592,595],{"class":120,"line":121},[118,591,125],{"class":124},[118,593,594],{"class":128}," https://bothub-api.bookab.info/v1/embeddings",[118,596,133],{"class":132},[118,598,599,601,603,605,607,609],{"class":120,"line":136},[118,600,139],{"class":128},[118,602,143],{"class":142},[118,604,146],{"class":128},[118,606,149],{"class":132},[118,608,152],{"class":142},[118,610,133],{"class":132},[118,612,613,615,617,619,621],{"class":120,"line":157},[118,614,139],{"class":128},[118,616,143],{"class":142},[118,618,164],{"class":128},[118,620,152],{"class":142},[118,622,133],{"class":132},[118,624,625,627,629],{"class":120,"line":171},[118,626,174],{"class":128},[118,628,177],{"class":142},[118,630,180],{"class":128},[118,632,633],{"class":120,"line":183},[118,634,635],{"class":128},"    \"model\": \"text-embedding-4\",\n",[118,637,638],{"class":120,"line":189},[118,639,640],{"class":128},"    \"input\": [\"first passage\", \"second passage\"]\n",[118,642,643,645],{"class":120,"line":195},[118,644,216],{"class":128},[118,646,219],{"class":142},[89,648,649,652,653,656,657,660,661,664],{},[92,650,651],{},"dimensions"," and ",[92,654,655],{},"encoding_format"," (",[92,658,659],{},"float"," or ",[92,662,663],{},"base64",") are supported when the model supports them.",[666,667,668],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":114,"searchDepth":136,"depth":136,"links":670},[671,676,677],{"id":86,"depth":136,"text":87,"children":672},[673,674,675],{"id":223,"depth":157,"text":224},{"id":284,"depth":157,"text":285},{"id":490,"depth":157,"text":491},{"id":501,"depth":136,"text":502},{"id":575,"depth":136,"text":576},"The Chat Completions, Responses and Embeddings endpoints.","md",null,{},true,{"title":67,"description":678},"YpXJQUotY_L-ALSH1tpiZcz4KqFbsLpYrkF8lwg5ECg",[686,688],{"title":59,"path":64,"stem":65,"description":687,"children":-1},"Use your BotHub balance to call chat, image, video and embedding models from your own code.",{"title":71,"path":72,"stem":73,"description":689,"children":-1},"Synchronous image generation, async tasks, editing and video.",1790522405773]