[{"data":1,"prerenderedAt":717},["ShallowReactive",2],{"\u002Fdocs\u002Fadvanced\u002Ffastapi-server":3},{"id":4,"title":5,"body":6,"description":710,"extension":711,"meta":712,"navigation":56,"path":713,"seo":714,"stem":715,"__hash__":716},"docs\u002Fdocs\u002F5.advanced\u002F5.fastapi-server.md","FastAPI Server",{"type":7,"value":8,"toc":702},"minimark",[9,13,17,22,80,84,91,94,100,143,149,157,164,168,317,321,698],[10,11,5],"h1",{"id":12},"fastapi-server",[14,15,16],"p",{},"Mango ships with a ready-made FastAPI server that exposes your agent over HTTP with Server-Sent Events streaming.",[18,19,21],"h2",{"id":20},"setup","Setup",[23,24,29],"pre",{"className":25,"code":26,"language":27,"meta":28,"style":28},"language-python shiki shiki-themes github-dark","from mango.servers.fastapi import MangoFastAPIServer\n\nserver = MangoFastAPIServer(agent)\nserver.run()  # http:\u002F\u002Flocalhost:8000\n","python","",[30,31,32,51,58,70],"code",{"__ignoreMap":28},[33,34,37,41,45,48],"span",{"class":35,"line":36},"line",1,[33,38,40],{"class":39},"snl16","from",[33,42,44],{"class":43},"s95oV"," mango.servers.fastapi ",[33,46,47],{"class":39},"import",[33,49,50],{"class":43}," MangoFastAPIServer\n",[33,52,54],{"class":35,"line":53},2,[33,55,57],{"emptyLinePlaceholder":56},true,"\n",[33,59,61,64,67],{"class":35,"line":60},3,[33,62,63],{"class":43},"server ",[33,65,66],{"class":39},"=",[33,68,69],{"class":43}," MangoFastAPIServer(agent)\n",[33,71,73,76],{"class":35,"line":72},4,[33,74,75],{"class":43},"server.run()  ",[33,77,79],{"class":78},"sAwPA","# http:\u002F\u002Flocalhost:8000\n",[18,81,83],{"id":82},"endpoints","Endpoints",[85,86,88],"h3",{"id":87},"post-apiv1askstream",[30,89,90],{},"POST \u002Fapi\u002Fv1\u002Fask\u002Fstream",[14,92,93],{},"Stream a question as SSE events.",[14,95,96],{},[97,98,99],"strong",{},"Request:",[23,101,105],{"className":102,"code":103,"language":104,"meta":28,"style":28},"language-json shiki shiki-themes github-dark","{\n  \"question\": \"How many users signed up last month?\",\n  \"session_id\": \"optional-session-id\"\n}\n","json",[30,106,107,112,128,138],{"__ignoreMap":28},[33,108,109],{"class":35,"line":36},[33,110,111],{"class":43},"{\n",[33,113,114,118,121,125],{"class":35,"line":53},[33,115,117],{"class":116},"sDLfK","  \"question\"",[33,119,120],{"class":43},": ",[33,122,124],{"class":123},"sU2Wk","\"How many users signed up last month?\"",[33,126,127],{"class":43},",\n",[33,129,130,133,135],{"class":35,"line":60},[33,131,132],{"class":116},"  \"session_id\"",[33,134,120],{"class":43},[33,136,137],{"class":123},"\"optional-session-id\"\n",[33,139,140],{"class":35,"line":72},[33,141,142],{"class":43},"}\n",[14,144,145,148],{},[97,146,147],{},"Response"," (SSE stream):",[23,150,155],{"className":151,"code":153,"language":154},[152],"language-text","data: {\"type\": \"tool_call\", \"tool_name\": \"run_mql\", \"tool_args\": {...}}\ndata: {\"type\": \"tool_result\", \"tool_name\": \"run_mql\", \"success\": true, \"preview\": \"[{\\\"count\\\": 1247}]\"}\ndata: {\"type\": \"answer\", \"text\": \"1,247 users signed up last month.\"}\ndata: {\"type\": \"done\", \"iterations\": 2, \"input_tokens\": 1820, \"output_tokens\": 94, \"memory_hits\": 1, \"tool_calls_made\": [\"run_mql\"]}\n","text",[30,156,153],{"__ignoreMap":28},[14,158,159,160,163],{},"Pass the same ",[30,161,162],{},"session_id"," across requests to maintain conversation history.",[18,165,167],{"id":166},"custom-configuration","Custom configuration",[23,169,171],{"className":25,"code":170,"language":27,"meta":28,"style":28},"from fastapi import FastAPI\nfrom mango.servers.fastapi import MangoFastAPIServer\n\nserver = MangoFastAPIServer(\n    agent=agent,\n    host=\"0.0.0.0\",\n    port=8000,\n    cors_origins=[\"https:\u002F\u002Fmyapp.com\"],\n)\n\n# Access the underlying FastAPI app\napp: FastAPI = server.app\napp.add_middleware(...)  # add your own middleware\n\nserver.run()\n",[30,172,173,185,195,199,208,220,233,246,263,269,274,280,291,306,311],{"__ignoreMap":28},[33,174,175,177,180,182],{"class":35,"line":36},[33,176,40],{"class":39},[33,178,179],{"class":43}," fastapi ",[33,181,47],{"class":39},[33,183,184],{"class":43}," FastAPI\n",[33,186,187,189,191,193],{"class":35,"line":53},[33,188,40],{"class":39},[33,190,44],{"class":43},[33,192,47],{"class":39},[33,194,50],{"class":43},[33,196,197],{"class":35,"line":60},[33,198,57],{"emptyLinePlaceholder":56},[33,200,201,203,205],{"class":35,"line":72},[33,202,63],{"class":43},[33,204,66],{"class":39},[33,206,207],{"class":43}," MangoFastAPIServer(\n",[33,209,211,215,217],{"class":35,"line":210},5,[33,212,214],{"class":213},"s9osk","    agent",[33,216,66],{"class":39},[33,218,219],{"class":43},"agent,\n",[33,221,223,226,228,231],{"class":35,"line":222},6,[33,224,225],{"class":213},"    host",[33,227,66],{"class":39},[33,229,230],{"class":123},"\"0.0.0.0\"",[33,232,127],{"class":43},[33,234,236,239,241,244],{"class":35,"line":235},7,[33,237,238],{"class":213},"    port",[33,240,66],{"class":39},[33,242,243],{"class":116},"8000",[33,245,127],{"class":43},[33,247,249,252,254,257,260],{"class":35,"line":248},8,[33,250,251],{"class":213},"    cors_origins",[33,253,66],{"class":39},[33,255,256],{"class":43},"[",[33,258,259],{"class":123},"\"https:\u002F\u002Fmyapp.com\"",[33,261,262],{"class":43},"],\n",[33,264,266],{"class":35,"line":265},9,[33,267,268],{"class":43},")\n",[33,270,272],{"class":35,"line":271},10,[33,273,57],{"emptyLinePlaceholder":56},[33,275,277],{"class":35,"line":276},11,[33,278,279],{"class":78},"# Access the underlying FastAPI app\n",[33,281,283,286,288],{"class":35,"line":282},12,[33,284,285],{"class":43},"app: FastAPI ",[33,287,66],{"class":39},[33,289,290],{"class":43}," server.app\n",[33,292,294,297,300,303],{"class":35,"line":293},13,[33,295,296],{"class":43},"app.add_middleware(",[33,298,299],{"class":116},"...",[33,301,302],{"class":43},")  ",[33,304,305],{"class":78},"# add your own middleware\n",[33,307,309],{"class":35,"line":308},14,[33,310,57],{"emptyLinePlaceholder":56},[33,312,314],{"class":35,"line":313},15,[33,315,316],{"class":43},"server.run()\n",[18,318,320],{"id":319},"consuming-sse-in-javascript","Consuming SSE in JavaScript",[23,322,326],{"className":323,"code":324,"language":325,"meta":28,"style":28},"language-javascript shiki shiki-themes github-dark","const response = await fetch('\u002Fapi\u002Fv1\u002Fask\u002Fstream', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application\u002Fjson' },\n  body: JSON.stringify({ question: 'How many orders last week?' }),\n})\n\nconst reader = response.body.getReader()\nconst decoder = new TextDecoder()\n\nwhile (true) {\n  const { done, value } = await reader.read()\n  if (done) break\n\n  const lines = decoder.decode(value).split('\\n')\n  for (const line of lines) {\n    if (!line.startsWith('data: ')) continue\n    const event = JSON.parse(line.slice(6))\n\n    if (event.type === 'answer') console.log(event.text)\n    if (event.type === 'done') console.log(`Used ${event.input_tokens} tokens`)\n  }\n}\n","javascript",[30,327,328,355,365,381,404,409,413,431,448,452,466,498,509,513,546,564,592,625,630,653,687,693],{"__ignoreMap":28},[33,329,330,333,336,339,342,346,349,352],{"class":35,"line":36},[33,331,332],{"class":39},"const",[33,334,335],{"class":116}," response",[33,337,338],{"class":39}," =",[33,340,341],{"class":39}," await",[33,343,345],{"class":344},"svObZ"," fetch",[33,347,348],{"class":43},"(",[33,350,351],{"class":123},"'\u002Fapi\u002Fv1\u002Fask\u002Fstream'",[33,353,354],{"class":43},", {\n",[33,356,357,360,363],{"class":35,"line":53},[33,358,359],{"class":43},"  method: ",[33,361,362],{"class":123},"'POST'",[33,364,127],{"class":43},[33,366,367,370,373,375,378],{"class":35,"line":60},[33,368,369],{"class":43},"  headers: { ",[33,371,372],{"class":123},"'Content-Type'",[33,374,120],{"class":43},[33,376,377],{"class":123},"'application\u002Fjson'",[33,379,380],{"class":43}," },\n",[33,382,383,386,389,392,395,398,401],{"class":35,"line":72},[33,384,385],{"class":43},"  body: ",[33,387,388],{"class":116},"JSON",[33,390,391],{"class":43},".",[33,393,394],{"class":344},"stringify",[33,396,397],{"class":43},"({ question: ",[33,399,400],{"class":123},"'How many orders last week?'",[33,402,403],{"class":43}," }),\n",[33,405,406],{"class":35,"line":210},[33,407,408],{"class":43},"})\n",[33,410,411],{"class":35,"line":222},[33,412,57],{"emptyLinePlaceholder":56},[33,414,415,417,420,422,425,428],{"class":35,"line":235},[33,416,332],{"class":39},[33,418,419],{"class":116}," reader",[33,421,338],{"class":39},[33,423,424],{"class":43}," response.body.",[33,426,427],{"class":344},"getReader",[33,429,430],{"class":43},"()\n",[33,432,433,435,438,440,443,446],{"class":35,"line":248},[33,434,332],{"class":39},[33,436,437],{"class":116}," decoder",[33,439,338],{"class":39},[33,441,442],{"class":39}," new",[33,444,445],{"class":344}," TextDecoder",[33,447,430],{"class":43},[33,449,450],{"class":35,"line":265},[33,451,57],{"emptyLinePlaceholder":56},[33,453,454,457,460,463],{"class":35,"line":271},[33,455,456],{"class":39},"while",[33,458,459],{"class":43}," (",[33,461,462],{"class":116},"true",[33,464,465],{"class":43},") {\n",[33,467,468,471,474,477,480,483,486,488,490,493,496],{"class":35,"line":276},[33,469,470],{"class":39},"  const",[33,472,473],{"class":43}," { ",[33,475,476],{"class":116},"done",[33,478,479],{"class":43},", ",[33,481,482],{"class":116},"value",[33,484,485],{"class":43}," } ",[33,487,66],{"class":39},[33,489,341],{"class":39},[33,491,492],{"class":43}," reader.",[33,494,495],{"class":344},"read",[33,497,430],{"class":43},[33,499,500,503,506],{"class":35,"line":282},[33,501,502],{"class":39},"  if",[33,504,505],{"class":43}," (done) ",[33,507,508],{"class":39},"break\n",[33,510,511],{"class":35,"line":293},[33,512,57],{"emptyLinePlaceholder":56},[33,514,515,517,520,522,525,528,531,534,536,539,542,544],{"class":35,"line":308},[33,516,470],{"class":39},[33,518,519],{"class":116}," lines",[33,521,338],{"class":39},[33,523,524],{"class":43}," decoder.",[33,526,527],{"class":344},"decode",[33,529,530],{"class":43},"(value).",[33,532,533],{"class":344},"split",[33,535,348],{"class":43},[33,537,538],{"class":123},"'",[33,540,541],{"class":116},"\\n",[33,543,538],{"class":123},[33,545,268],{"class":43},[33,547,548,551,553,555,558,561],{"class":35,"line":313},[33,549,550],{"class":39},"  for",[33,552,459],{"class":43},[33,554,332],{"class":39},[33,556,557],{"class":116}," line",[33,559,560],{"class":39}," of",[33,562,563],{"class":43}," lines) {\n",[33,565,567,570,572,575,578,581,583,586,589],{"class":35,"line":566},16,[33,568,569],{"class":39},"    if",[33,571,459],{"class":43},[33,573,574],{"class":39},"!",[33,576,577],{"class":43},"line.",[33,579,580],{"class":344},"startsWith",[33,582,348],{"class":43},[33,584,585],{"class":123},"'data: '",[33,587,588],{"class":43},")) ",[33,590,591],{"class":39},"continue\n",[33,593,595,598,601,603,606,608,611,614,617,619,622],{"class":35,"line":594},17,[33,596,597],{"class":39},"    const",[33,599,600],{"class":116}," event",[33,602,338],{"class":39},[33,604,605],{"class":116}," JSON",[33,607,391],{"class":43},[33,609,610],{"class":344},"parse",[33,612,613],{"class":43},"(line.",[33,615,616],{"class":344},"slice",[33,618,348],{"class":43},[33,620,621],{"class":116},"6",[33,623,624],{"class":43},"))\n",[33,626,628],{"class":35,"line":627},18,[33,629,57],{"emptyLinePlaceholder":56},[33,631,633,635,638,641,644,647,650],{"class":35,"line":632},19,[33,634,569],{"class":39},[33,636,637],{"class":43}," (event.type ",[33,639,640],{"class":39},"===",[33,642,643],{"class":123}," 'answer'",[33,645,646],{"class":43},") console.",[33,648,649],{"class":344},"log",[33,651,652],{"class":43},"(event.text)\n",[33,654,656,658,660,662,665,667,669,671,674,677,679,682,685],{"class":35,"line":655},20,[33,657,569],{"class":39},[33,659,637],{"class":43},[33,661,640],{"class":39},[33,663,664],{"class":123}," 'done'",[33,666,646],{"class":43},[33,668,649],{"class":344},[33,670,348],{"class":43},[33,672,673],{"class":123},"`Used ${",[33,675,676],{"class":43},"event",[33,678,391],{"class":123},[33,680,681],{"class":43},"input_tokens",[33,683,684],{"class":123},"} tokens`",[33,686,268],{"class":43},[33,688,690],{"class":35,"line":689},21,[33,691,692],{"class":43},"  }\n",[33,694,696],{"class":35,"line":695},22,[33,697,142],{"class":43},[699,700,701],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}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 pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}",{"title":28,"searchDepth":53,"depth":53,"links":703},[704,705,708,709],{"id":20,"depth":53,"text":21},{"id":82,"depth":53,"text":83,"children":706},[707],{"id":87,"depth":60,"text":90},{"id":166,"depth":53,"text":167},{"id":319,"depth":53,"text":320},"Expose Mango as an HTTP API with SSE streaming.","md",{},"\u002Fdocs\u002Fadvanced\u002Ffastapi-server",{"title":5,"description":710},"docs\u002F5.advanced\u002F5.fastapi-server","-j6tUERllqbHzSO_BVGWJ9yirFgaWcjKc--ZvLlKnq0",1776189332274]