[{"data":1,"prerenderedAt":535},["ShallowReactive",2],{"\u002Fdocs\u002Fadvanced\u002Fmulti-turn":3},{"id":4,"title":5,"body":6,"description":528,"extension":529,"meta":530,"navigation":84,"path":531,"seo":532,"stem":533,"__hash__":534},"docs\u002Fdocs\u002F5.advanced\u002F4.multi-turn.md","Multi-turn Conversations",{"type":7,"value":8,"toc":520},"minimark",[9,13,22,27,153,156,160,167,202,205,209,224,228,241,245,252,315,318,322,516],[10,11,5],"h1",{"id":12},"multi-turn-conversations",[14,15,16,17,21],"p",{},"Mango preserves conversation history across ",[18,19,20],"code",{},"ask()"," calls. Follow-up questions work without repeating context.",[23,24,26],"h2",{"id":25},"example","Example",[28,29,34],"pre",{"className":30,"code":31,"language":32,"meta":33,"style":33},"language-python shiki shiki-themes github-dark","r1 = await agent.ask(\"How many orders were placed last week?\")\nprint(r1.answer)\n# → \"1,247 orders were placed in the last 7 days.\"\n\nr2 = await agent.ask(\"And how many of those were delivered?\")\nprint(r2.answer)\n# → \"Of last week's 1,247 orders, 891 (71%) have been delivered.\"\n\nr3 = await agent.ask(\"Which customer placed the most?\")\nprint(r3.answer)\n# → \"Alice Johnson placed 8 orders last week, the highest of any customer.\"\n","python","",[18,35,36,62,72,79,86,103,111,117,122,139,147],{"__ignoreMap":33},[37,38,41,45,49,52,55,59],"span",{"class":39,"line":40},"line",1,[37,42,44],{"class":43},"s95oV","r1 ",[37,46,48],{"class":47},"snl16","=",[37,50,51],{"class":47}," await",[37,53,54],{"class":43}," agent.ask(",[37,56,58],{"class":57},"sU2Wk","\"How many orders were placed last week?\"",[37,60,61],{"class":43},")\n",[37,63,65,69],{"class":39,"line":64},2,[37,66,68],{"class":67},"sDLfK","print",[37,70,71],{"class":43},"(r1.answer)\n",[37,73,75],{"class":39,"line":74},3,[37,76,78],{"class":77},"sAwPA","# → \"1,247 orders were placed in the last 7 days.\"\n",[37,80,82],{"class":39,"line":81},4,[37,83,85],{"emptyLinePlaceholder":84},true,"\n",[37,87,89,92,94,96,98,101],{"class":39,"line":88},5,[37,90,91],{"class":43},"r2 ",[37,93,48],{"class":47},[37,95,51],{"class":47},[37,97,54],{"class":43},[37,99,100],{"class":57},"\"And how many of those were delivered?\"",[37,102,61],{"class":43},[37,104,106,108],{"class":39,"line":105},6,[37,107,68],{"class":67},[37,109,110],{"class":43},"(r2.answer)\n",[37,112,114],{"class":39,"line":113},7,[37,115,116],{"class":77},"# → \"Of last week's 1,247 orders, 891 (71%) have been delivered.\"\n",[37,118,120],{"class":39,"line":119},8,[37,121,85],{"emptyLinePlaceholder":84},[37,123,125,128,130,132,134,137],{"class":39,"line":124},9,[37,126,127],{"class":43},"r3 ",[37,129,48],{"class":47},[37,131,51],{"class":47},[37,133,54],{"class":43},[37,135,136],{"class":57},"\"Which customer placed the most?\"",[37,138,61],{"class":43},[37,140,142,144],{"class":39,"line":141},10,[37,143,68],{"class":67},[37,145,146],{"class":43},"(r3.answer)\n",[37,148,150],{"class":39,"line":149},11,[37,151,152],{"class":77},"# → \"Alice Johnson placed 8 orders last week, the highest of any customer.\"\n",[14,154,155],{},"The agent remembers that \"those\" refers to last week's orders and \"the most\" refers to the same context.",[23,157,159],{"id":158},"conversation-pruning","Conversation pruning",[14,161,162,163,166],{},"History is automatically trimmed to ",[18,164,165],{},"max_turns"," complete turns to keep token usage stable:",[28,168,170],{"className":30,"code":169,"language":32,"meta":33,"style":33},"agent = MangoAgent(..., max_turns=5)  # keep last 5 turns (default)\n",[18,171,172],{"__ignoreMap":33},[37,173,174,177,179,182,185,188,191,193,196,199],{"class":39,"line":40},[37,175,176],{"class":43},"agent ",[37,178,48],{"class":47},[37,180,181],{"class":43}," MangoAgent(",[37,183,184],{"class":67},"...",[37,186,187],{"class":43},", ",[37,189,165],{"class":190},"s9osk",[37,192,48],{"class":47},[37,194,195],{"class":67},"5",[37,197,198],{"class":43},")  ",[37,200,201],{"class":77},"# keep last 5 turns (default)\n",[14,203,204],{},"Pruning always removes complete turns — never splits a tool call from its result, which would cause API errors.",[23,206,208],{"id":207},"check-conversation-length","Check conversation length",[28,210,212],{"className":30,"code":211,"language":32,"meta":33,"style":33},"print(agent.conversation_length)   # number of messages in history\n",[18,213,214],{"__ignoreMap":33},[37,215,216,218,221],{"class":39,"line":40},[37,217,68],{"class":67},[37,219,220],{"class":43},"(agent.conversation_length)   ",[37,222,223],{"class":77},"# number of messages in history\n",[23,225,227],{"id":226},"reset-conversation","Reset conversation",[28,229,231],{"className":30,"code":230,"language":32,"meta":33,"style":33},"agent.reset_conversation()   # clear history, start fresh\n",[18,232,233],{"__ignoreMap":33},[37,234,235,238],{"class":39,"line":40},[37,236,237],{"class":43},"agent.reset_conversation()   ",[37,239,240],{"class":77},"# clear history, start fresh\n",[23,242,244],{"id":243},"multiple-sessions-from-one-agent","Multiple sessions from one agent",[14,246,247,248,251],{},"Use ",[18,249,250],{},"new_session()"," to get independent conversation threads that share the same schema and configuration:",[28,253,255],{"className":30,"code":254,"language":32,"meta":33,"style":33},"# One agent, two independent sessions\nsession_a = agent.new_session()\nsession_b = agent.new_session()\n\nawait session_a.ask(\"How many users are in the EU?\")\nawait session_b.ask(\"What is the average order value?\")\n# session_a and session_b have separate histories\n",[18,256,257,262,272,281,285,298,310],{"__ignoreMap":33},[37,258,259],{"class":39,"line":40},[37,260,261],{"class":77},"# One agent, two independent sessions\n",[37,263,264,267,269],{"class":39,"line":64},[37,265,266],{"class":43},"session_a ",[37,268,48],{"class":47},[37,270,271],{"class":43}," agent.new_session()\n",[37,273,274,277,279],{"class":39,"line":74},[37,275,276],{"class":43},"session_b ",[37,278,48],{"class":47},[37,280,271],{"class":43},[37,282,283],{"class":39,"line":81},[37,284,85],{"emptyLinePlaceholder":84},[37,286,287,290,293,296],{"class":39,"line":88},[37,288,289],{"class":47},"await",[37,291,292],{"class":43}," session_a.ask(",[37,294,295],{"class":57},"\"How many users are in the EU?\"",[37,297,61],{"class":43},[37,299,300,302,305,308],{"class":39,"line":105},[37,301,289],{"class":47},[37,303,304],{"class":43}," session_b.ask(",[37,306,307],{"class":57},"\"What is the average order value?\"",[37,309,61],{"class":43},[37,311,312],{"class":39,"line":113},[37,313,314],{"class":77},"# session_a and session_b have separate histories\n",[14,316,317],{},"This is efficient — schema introspection and system prompt are computed once and shared.",[23,319,321],{"id":320},"session-management-in-a-server","Session management in a server",[28,323,325],{"className":30,"code":324,"language":32,"meta":33,"style":33},"from fastapi import FastAPI\nimport uuid\n\napp = FastAPI()\nsessions: dict[str, MangoAgent] = {}\n\n@app.post(\"\u002Fask\")\nasync def ask(body: dict):\n    session_id = body.get(\"session_id\") or str(uuid.uuid4())\n\n    if session_id not in sessions:\n        sessions[session_id] = agent.new_session()\n\n    response = await sessions[session_id].ask(body[\"question\"])\n    return {\"answer\": response.answer, \"session_id\": session_id}\n",[18,326,327,341,348,352,362,378,382,396,416,441,445,462,472,477,496],{"__ignoreMap":33},[37,328,329,332,335,338],{"class":39,"line":40},[37,330,331],{"class":47},"from",[37,333,334],{"class":43}," fastapi ",[37,336,337],{"class":47},"import",[37,339,340],{"class":43}," FastAPI\n",[37,342,343,345],{"class":39,"line":64},[37,344,337],{"class":47},[37,346,347],{"class":43}," uuid\n",[37,349,350],{"class":39,"line":74},[37,351,85],{"emptyLinePlaceholder":84},[37,353,354,357,359],{"class":39,"line":81},[37,355,356],{"class":43},"app ",[37,358,48],{"class":47},[37,360,361],{"class":43}," FastAPI()\n",[37,363,364,367,370,373,375],{"class":39,"line":88},[37,365,366],{"class":43},"sessions: dict[",[37,368,369],{"class":67},"str",[37,371,372],{"class":43},", MangoAgent] ",[37,374,48],{"class":47},[37,376,377],{"class":43}," {}\n",[37,379,380],{"class":39,"line":105},[37,381,85],{"emptyLinePlaceholder":84},[37,383,384,388,391,394],{"class":39,"line":113},[37,385,387],{"class":386},"svObZ","@app.post",[37,389,390],{"class":43},"(",[37,392,393],{"class":57},"\"\u002Fask\"",[37,395,61],{"class":43},[37,397,398,401,404,407,410,413],{"class":39,"line":119},[37,399,400],{"class":47},"async",[37,402,403],{"class":47}," def",[37,405,406],{"class":386}," ask",[37,408,409],{"class":43},"(body: ",[37,411,412],{"class":67},"dict",[37,414,415],{"class":43},"):\n",[37,417,418,421,423,426,429,432,435,438],{"class":39,"line":124},[37,419,420],{"class":43},"    session_id ",[37,422,48],{"class":47},[37,424,425],{"class":43}," body.get(",[37,427,428],{"class":57},"\"session_id\"",[37,430,431],{"class":43},") ",[37,433,434],{"class":47},"or",[37,436,437],{"class":67}," str",[37,439,440],{"class":43},"(uuid.uuid4())\n",[37,442,443],{"class":39,"line":141},[37,444,85],{"emptyLinePlaceholder":84},[37,446,447,450,453,456,459],{"class":39,"line":149},[37,448,449],{"class":47},"    if",[37,451,452],{"class":43}," session_id ",[37,454,455],{"class":47},"not",[37,457,458],{"class":47}," in",[37,460,461],{"class":43}," sessions:\n",[37,463,465,468,470],{"class":39,"line":464},12,[37,466,467],{"class":43},"        sessions[session_id] ",[37,469,48],{"class":47},[37,471,271],{"class":43},[37,473,475],{"class":39,"line":474},13,[37,476,85],{"emptyLinePlaceholder":84},[37,478,480,483,485,487,490,493],{"class":39,"line":479},14,[37,481,482],{"class":43},"    response ",[37,484,48],{"class":47},[37,486,51],{"class":47},[37,488,489],{"class":43}," sessions[session_id].ask(body[",[37,491,492],{"class":57},"\"question\"",[37,494,495],{"class":43},"])\n",[37,497,499,502,505,508,511,513],{"class":39,"line":498},15,[37,500,501],{"class":47},"    return",[37,503,504],{"class":43}," {",[37,506,507],{"class":57},"\"answer\"",[37,509,510],{"class":43},": response.answer, ",[37,512,428],{"class":57},[37,514,515],{"class":43},": session_id}\n",[517,518,519],"style",{},"html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}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 .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 .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}",{"title":33,"searchDepth":64,"depth":64,"links":521},[522,523,524,525,526,527],{"id":25,"depth":64,"text":26},{"id":158,"depth":64,"text":159},{"id":207,"depth":64,"text":208},{"id":226,"depth":64,"text":227},{"id":243,"depth":64,"text":244},{"id":320,"depth":64,"text":321},"Follow-up questions and conversation management.","md",{},"\u002Fdocs\u002Fadvanced\u002Fmulti-turn",{"title":5,"description":528},"docs\u002F5.advanced\u002F4.multi-turn","7JG4HyqtDNgTm7MH3_vSTW7cSBcKSqWGndcELvTElQM",1776189332251]