[{"data":1,"prerenderedAt":1035},["ShallowReactive",2],{"\u002Fdocs\u002Fcore-concepts\u002Fagent":3},{"id":4,"title":5,"body":6,"description":1028,"extension":1029,"meta":1030,"navigation":58,"path":1031,"seo":1032,"stem":1033,"__hash__":1034},"docs\u002Fdocs\u002F2.core-concepts\u002F1.agent.md","MangoAgent",{"type":7,"value":8,"toc":1014},"minimark",[9,13,20,25,218,223,418,422,427,438,447,459,465,468,500,511,592,598,604,716,719,800,806,809,839,845,848,857,861,942,946,952,1004,1010],[10,11,5],"h1",{"id":12},"mangoagent",[14,15,16,19],"p",{},[17,18,5],"code",{}," is the central class that orchestrates the LLM ↔ tool loop. Every question goes through it.",[21,22,24],"h2",{"id":23},"constructor","Constructor",[26,27,32],"pre",{"className":28,"code":29,"language":30,"meta":31,"style":31},"language-python shiki shiki-themes github-dark","from mango.agent import MangoAgent\n\nagent = MangoAgent(\n    llm_service=llm,         # required\n    tool_registry=tools,     # required\n    db=db,                   # required\n    agent_memory=memory,     # optional\n    schema=None,             # optional — pre-introspected schema\n    introspect=False,        # whether setup() runs introspection\n    max_iterations=8,        # safety cap on tool calls per question\n    memory_top_k=3,          # how many memory examples to inject\n    max_turns=5,             # conversation turns to keep in history\n)\n","python","",[17,33,34,53,60,72,88,101,114,128,146,163,179,196,212],{"__ignoreMap":31},[35,36,39,43,47,50],"span",{"class":37,"line":38},"line",1,[35,40,42],{"class":41},"snl16","from",[35,44,46],{"class":45},"s95oV"," mango.agent ",[35,48,49],{"class":41},"import",[35,51,52],{"class":45}," MangoAgent\n",[35,54,56],{"class":37,"line":55},2,[35,57,59],{"emptyLinePlaceholder":58},true,"\n",[35,61,63,66,69],{"class":37,"line":62},3,[35,64,65],{"class":45},"agent ",[35,67,68],{"class":41},"=",[35,70,71],{"class":45}," MangoAgent(\n",[35,73,75,79,81,84],{"class":37,"line":74},4,[35,76,78],{"class":77},"s9osk","    llm_service",[35,80,68],{"class":41},[35,82,83],{"class":45},"llm,         ",[35,85,87],{"class":86},"sAwPA","# required\n",[35,89,91,94,96,99],{"class":37,"line":90},5,[35,92,93],{"class":77},"    tool_registry",[35,95,68],{"class":41},[35,97,98],{"class":45},"tools,     ",[35,100,87],{"class":86},[35,102,104,107,109,112],{"class":37,"line":103},6,[35,105,106],{"class":77},"    db",[35,108,68],{"class":41},[35,110,111],{"class":45},"db,                   ",[35,113,87],{"class":86},[35,115,117,120,122,125],{"class":37,"line":116},7,[35,118,119],{"class":77},"    agent_memory",[35,121,68],{"class":41},[35,123,124],{"class":45},"memory,     ",[35,126,127],{"class":86},"# optional\n",[35,129,131,134,136,140,143],{"class":37,"line":130},8,[35,132,133],{"class":77},"    schema",[35,135,68],{"class":41},[35,137,139],{"class":138},"sDLfK","None",[35,141,142],{"class":45},",             ",[35,144,145],{"class":86},"# optional — pre-introspected schema\n",[35,147,149,152,154,157,160],{"class":37,"line":148},9,[35,150,151],{"class":77},"    introspect",[35,153,68],{"class":41},[35,155,156],{"class":138},"False",[35,158,159],{"class":45},",        ",[35,161,162],{"class":86},"# whether setup() runs introspection\n",[35,164,166,169,171,174,176],{"class":37,"line":165},10,[35,167,168],{"class":77},"    max_iterations",[35,170,68],{"class":41},[35,172,173],{"class":138},"8",[35,175,159],{"class":45},[35,177,178],{"class":86},"# safety cap on tool calls per question\n",[35,180,182,185,187,190,193],{"class":37,"line":181},11,[35,183,184],{"class":77},"    memory_top_k",[35,186,68],{"class":41},[35,188,189],{"class":138},"3",[35,191,192],{"class":45},",          ",[35,194,195],{"class":86},"# how many memory examples to inject\n",[35,197,199,202,204,207,209],{"class":37,"line":198},12,[35,200,201],{"class":77},"    max_turns",[35,203,68],{"class":41},[35,205,206],{"class":138},"5",[35,208,142],{"class":45},[35,210,211],{"class":86},"# conversation turns to keep in history\n",[35,213,215],{"class":37,"line":214},13,[35,216,217],{"class":45},")\n",[219,220,222],"h3",{"id":221},"parameters","Parameters",[224,225,226,245],"table",{},[227,228,229],"thead",{},[230,231,232,236,239,242],"tr",{},[233,234,235],"th",{},"Parameter",[233,237,238],{},"Type",[233,240,241],{},"Default",[233,243,244],{},"Description",[246,247,248,267,284,303,322,341,363,382,400],"tbody",{},[230,249,250,256,261,264],{},[251,252,253],"td",{},[17,254,255],{},"llm_service",[251,257,258],{},[17,259,260],{},"LLMService",[251,262,263],{},"—",[251,265,266],{},"LLM backend to use",[230,268,269,274,279,281],{},[251,270,271],{},[17,272,273],{},"tool_registry",[251,275,276],{},[17,277,278],{},"ToolRegistry",[251,280,263],{},[251,282,283],{},"Registered tools",[230,285,286,291,296,300],{},[251,287,288],{},[17,289,290],{},"db",[251,292,293],{},[17,294,295],{},"NoSQLRunner | None",[251,297,298],{},[17,299,139],{},[251,301,302],{},"Connected database",[230,304,305,310,315,319],{},[251,306,307],{},[17,308,309],{},"agent_memory",[251,311,312],{},[17,313,314],{},"MemoryService | None",[251,316,317],{},[17,318,139],{},[251,320,321],{},"Vector store for memory",[230,323,324,329,334,338],{},[251,325,326],{},[17,327,328],{},"schema",[251,330,331],{},[17,332,333],{},"dict | None",[251,335,336],{},[17,337,139],{},[251,339,340],{},"Pre-computed schema (skips introspection)",[230,342,343,348,353,357],{},[251,344,345],{},[17,346,347],{},"introspect",[251,349,350],{},[17,351,352],{},"bool",[251,354,355],{},[17,356,156],{},[251,358,359,360],{},"Run schema introspection on ",[17,361,362],{},"setup()",[230,364,365,370,375,379],{},[251,366,367],{},[17,368,369],{},"max_iterations",[251,371,372],{},[17,373,374],{},"int",[251,376,377],{},[17,378,173],{},[251,380,381],{},"Max tool calls before forcing a final answer",[230,383,384,389,393,397],{},[251,385,386],{},[17,387,388],{},"memory_top_k",[251,390,391],{},[17,392,374],{},[251,394,395],{},[17,396,189],{},[251,398,399],{},"Memory examples to inject per question",[230,401,402,407,411,415],{},[251,403,404],{},[17,405,406],{},"max_turns",[251,408,409],{},[17,410,374],{},[251,412,413],{},[17,414,206],{},[251,416,417],{},"Conversation history turns to keep",[21,419,421],{"id":420},"methods","Methods",[219,423,425],{"id":424},"setup",[17,426,362],{},[14,428,429,430,433,434,437],{},"Initializes the agent: runs schema introspection (if ",[17,431,432],{},"introspect=True",") and builds the system prompt. Call once after connecting the database, before the first ",[17,435,436],{},"ask()",".",[26,439,441],{"className":28,"code":440,"language":30,"meta":31,"style":31},"agent.setup()\n",[17,442,443],{"__ignoreMap":31},[35,444,445],{"class":37,"line":38},[35,446,440],{"class":45},[14,448,449,450,452,453,455,456,458],{},"If ",[17,451,290],{}," is ",[17,454,139],{},", ",[17,457,362],{}," is a no-op.",[219,460,462],{"id":461},"askquestion-on_tool_callnone",[17,463,464],{},"ask(question, on_tool_call=None)",[14,466,467],{},"Ask a question and get a complete answer.",[26,469,471],{"className":28,"code":470,"language":30,"meta":31,"style":31},"response = await agent.ask(\"How many orders were placed last week?\")\nprint(response.answer)\n",[17,472,473,492],{"__ignoreMap":31},[35,474,475,478,480,483,486,490],{"class":37,"line":38},[35,476,477],{"class":45},"response ",[35,479,68],{"class":41},[35,481,482],{"class":41}," await",[35,484,485],{"class":45}," agent.ask(",[35,487,489],{"class":488},"sU2Wk","\"How many orders were placed last week?\"",[35,491,217],{"class":45},[35,493,494,497],{"class":37,"line":55},[35,495,496],{"class":138},"print",[35,498,499],{"class":45},"(response.answer)\n",[14,501,502,503,506,507,510],{},"Optional ",[17,504,505],{},"on_tool_call"," callback receives ",[17,508,509],{},"(tool_name, tool_args, result_text)"," after each tool execution:",[26,512,514],{"className":28,"code":513,"language":30,"meta":31,"style":31},"def log_tool(name, args, result):\n    print(f\"Tool: {name} | Args: {args}\")\n\nresponse = await agent.ask(\"...\", on_tool_call=log_tool)\n",[17,515,516,528,566,570],{"__ignoreMap":31},[35,517,518,521,525],{"class":37,"line":38},[35,519,520],{"class":41},"def",[35,522,524],{"class":523},"svObZ"," log_tool",[35,526,527],{"class":45},"(name, args, result):\n",[35,529,530,533,536,539,542,545,548,551,554,556,559,561,564],{"class":37,"line":55},[35,531,532],{"class":138},"    print",[35,534,535],{"class":45},"(",[35,537,538],{"class":41},"f",[35,540,541],{"class":488},"\"Tool: ",[35,543,544],{"class":138},"{",[35,546,547],{"class":45},"name",[35,549,550],{"class":138},"}",[35,552,553],{"class":488}," | Args: ",[35,555,544],{"class":138},[35,557,558],{"class":45},"args",[35,560,550],{"class":138},[35,562,563],{"class":488},"\"",[35,565,217],{"class":45},[35,567,568],{"class":37,"line":62},[35,569,59],{"emptyLinePlaceholder":58},[35,571,572,574,576,578,580,583,585,587,589],{"class":37,"line":74},[35,573,477],{"class":45},[35,575,68],{"class":41},[35,577,482],{"class":41},[35,579,485],{"class":45},[35,581,582],{"class":488},"\"...\"",[35,584,455],{"class":45},[35,586,505],{"class":77},[35,588,68],{"class":41},[35,590,591],{"class":45},"log_tool)\n",[219,593,595],{"id":594},"ask_streamquestion",[17,596,597],{},"ask_stream(question)",[14,599,600,601,603],{},"Same as ",[17,602,436],{}," but streams events as they happen via an async generator. Useful for real-time UIs.",[26,605,607],{"className":28,"code":606,"language":30,"meta":31,"style":31},"async for event in agent.ask_stream(\"What are the top 10 products by revenue?\"):\n    if event[\"type\"] == \"tool_call\":\n        print(f\"Calling {event['tool_name']}...\")\n    elif event[\"type\"] == \"answer\":\n        print(event[\"text\"])\n",[17,608,609,632,655,685,703],{"__ignoreMap":31},[35,610,611,614,617,620,623,626,629],{"class":37,"line":38},[35,612,613],{"class":41},"async",[35,615,616],{"class":41}," for",[35,618,619],{"class":45}," event ",[35,621,622],{"class":41},"in",[35,624,625],{"class":45}," agent.ask_stream(",[35,627,628],{"class":488},"\"What are the top 10 products by revenue?\"",[35,630,631],{"class":45},"):\n",[35,633,634,637,640,643,646,649,652],{"class":37,"line":55},[35,635,636],{"class":41},"    if",[35,638,639],{"class":45}," event[",[35,641,642],{"class":488},"\"type\"",[35,644,645],{"class":45},"] ",[35,647,648],{"class":41},"==",[35,650,651],{"class":488}," \"tool_call\"",[35,653,654],{"class":45},":\n",[35,656,657,660,662,664,667,669,672,675,678,680,683],{"class":37,"line":62},[35,658,659],{"class":138},"        print",[35,661,535],{"class":45},[35,663,538],{"class":41},[35,665,666],{"class":488},"\"Calling ",[35,668,544],{"class":138},[35,670,671],{"class":45},"event[",[35,673,674],{"class":488},"'tool_name'",[35,676,677],{"class":45},"]",[35,679,550],{"class":138},[35,681,682],{"class":488},"...\"",[35,684,217],{"class":45},[35,686,687,690,692,694,696,698,701],{"class":37,"line":74},[35,688,689],{"class":41},"    elif",[35,691,639],{"class":45},[35,693,642],{"class":488},[35,695,645],{"class":45},[35,697,648],{"class":41},[35,699,700],{"class":488}," \"answer\"",[35,702,654],{"class":45},[35,704,705,707,710,713],{"class":37,"line":90},[35,706,659],{"class":138},[35,708,709],{"class":45},"(event[",[35,711,712],{"class":488},"\"text\"",[35,714,715],{"class":45},"])\n",[14,717,718],{},"Event types:",[224,720,721,730],{},[227,722,723],{},[230,724,725,727],{},[233,726,238],{},[233,728,729],{},"Fields",[246,731,732,747,764,776],{},[230,733,734,739],{},[251,735,736],{},[17,737,738],{},"tool_call",[251,740,741,455,744],{},[17,742,743],{},"tool_name",[17,745,746],{},"tool_args",[230,748,749,754],{},[251,750,751],{},[17,752,753],{},"tool_result",[251,755,756,455,758,455,761],{},[17,757,743],{},[17,759,760],{},"success",[17,762,763],{},"preview",[230,765,766,771],{},[251,767,768],{},[17,769,770],{},"answer",[251,772,773],{},[17,774,775],{},"text",[230,777,778,783],{},[251,779,780],{},[17,781,782],{},"done",[251,784,785,455,788,455,791,455,794,455,797],{},[17,786,787],{},"iterations",[17,789,790],{},"input_tokens",[17,792,793],{},"output_tokens",[17,795,796],{},"memory_hits",[17,798,799],{},"tool_calls_made",[219,801,803],{"id":802},"new_session",[17,804,805],{},"new_session()",[14,807,808],{},"Returns a new agent with the same configuration but a fresh conversation history. Schema and system prompt are shared — no re-introspection.",[26,810,812],{"className":28,"code":811,"language":30,"meta":31,"style":31},"session = agent.new_session()\nresponse = await session.ask(\"...\")\n",[17,813,814,824],{"__ignoreMap":31},[35,815,816,819,821],{"class":37,"line":38},[35,817,818],{"class":45},"session ",[35,820,68],{"class":41},[35,822,823],{"class":45}," agent.new_session()\n",[35,825,826,828,830,832,835,837],{"class":37,"line":55},[35,827,477],{"class":45},[35,829,68],{"class":41},[35,831,482],{"class":41},[35,833,834],{"class":45}," session.ask(",[35,836,582],{"class":488},[35,838,217],{"class":45},[219,840,842],{"id":841},"reset_conversation",[17,843,844],{},"reset_conversation()",[14,846,847],{},"Clears the conversation history in place.",[26,849,851],{"className":28,"code":850,"language":30,"meta":31,"style":31},"agent.reset_conversation()\n",[17,852,853],{"__ignoreMap":31},[35,854,855],{"class":37,"line":38},[35,856,850],{"class":45},[21,858,860],{"id":859},"properties","Properties",[224,862,863,874],{},[227,864,865],{},[230,866,867,870,872],{},[233,868,869],{},"Property",[233,871,238],{},[233,873,244],{},[246,875,876,889,902,915,928],{},[230,877,878,882,886],{},[251,879,880],{},[17,881,255],{},[251,883,884],{},[17,885,260],{},[251,887,888],{},"The configured LLM",[230,890,891,895,899],{},[251,892,893],{},[17,894,273],{},[251,896,897],{},[17,898,278],{},[251,900,901],{},"The tool registry",[230,903,904,908,912],{},[251,905,906],{},[17,907,290],{},[251,909,910],{},[17,911,295],{},[251,913,914],{},"The connected database",[230,916,917,921,925],{},[251,918,919],{},[17,920,309],{},[251,922,923],{},[17,924,314],{},[251,926,927],{},"The memory service",[230,929,930,935,939],{},[251,931,932],{},[17,933,934],{},"conversation_length",[251,936,937],{},[17,938,374],{},[251,940,941],{},"Number of messages in history",[21,943,945],{"id":944},"multi-turn-conversations","Multi-turn conversations",[14,947,948,949,951],{},"Conversation history is preserved across ",[17,950,436],{}," calls. Follow-up questions work naturally:",[26,953,955],{"className":28,"code":954,"language":30,"meta":31,"style":31},"r1 = await agent.ask(\"How many orders were placed last week?\")\nr2 = await agent.ask(\"And how many of those were delivered?\")\nr3 = await agent.ask(\"Which customer placed the most?\")\n",[17,956,957,972,988],{"__ignoreMap":31},[35,958,959,962,964,966,968,970],{"class":37,"line":38},[35,960,961],{"class":45},"r1 ",[35,963,68],{"class":41},[35,965,482],{"class":41},[35,967,485],{"class":45},[35,969,489],{"class":488},[35,971,217],{"class":45},[35,973,974,977,979,981,983,986],{"class":37,"line":55},[35,975,976],{"class":45},"r2 ",[35,978,68],{"class":41},[35,980,482],{"class":41},[35,982,485],{"class":45},[35,984,985],{"class":488},"\"And how many of those were delivered?\"",[35,987,217],{"class":45},[35,989,990,993,995,997,999,1002],{"class":37,"line":62},[35,991,992],{"class":45},"r3 ",[35,994,68],{"class":41},[35,996,482],{"class":41},[35,998,485],{"class":45},[35,1000,1001],{"class":488},"\"Which customer placed the most?\"",[35,1003,217],{"class":45},[14,1005,1006,1007,1009],{},"History is automatically pruned to ",[17,1008,406],{}," complete turns to keep token usage stable.",[1011,1012,1013],"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 .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}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 .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}",{"title":31,"searchDepth":55,"depth":55,"links":1015},[1016,1019,1026,1027],{"id":23,"depth":55,"text":24,"children":1017},[1018],{"id":221,"depth":62,"text":222},{"id":420,"depth":55,"text":421,"children":1020},[1021,1022,1023,1024,1025],{"id":424,"depth":62,"text":362},{"id":461,"depth":62,"text":464},{"id":594,"depth":62,"text":597},{"id":802,"depth":62,"text":805},{"id":841,"depth":62,"text":844},{"id":859,"depth":55,"text":860},{"id":944,"depth":55,"text":945},"The central orchestrator — all configuration options explained.","md",{},"\u002Fdocs\u002Fcore-concepts\u002Fagent",{"title":5,"description":1028},"docs\u002F2.core-concepts\u002F1.agent","esfPwYqum-pWwJh6kaF81JqK1X30JoE8CuyQcCPF3j0",1776189331965]