[{"data":1,"prerenderedAt":845},["ShallowReactive",2],{"\u002Fdocs\u002Fapi-reference\u002Fllm-service":3},{"id":4,"title":5,"body":6,"description":838,"extension":839,"meta":840,"navigation":80,"path":841,"seo":842,"stem":843,"__hash__":844},"docs\u002Fdocs\u002F4.api-reference\u002F2.llm-service.md","LLMService",{"type":7,"value":8,"toc":826},"minimark",[9,13,42,46,51,180,184,189,254,258,296,300,392,396,499,503,560,564,620,624,822],[10,11,5],"h1",{"id":12},"llmservice",[14,15,20],"pre",{"className":16,"code":17,"language":18,"meta":19,"style":19},"language-python shiki shiki-themes github-dark","from mango.llm import LLMService\n","python","",[21,22,23],"code",{"__ignoreMap":19},[24,25,28,32,36,39],"span",{"class":26,"line":27},"line",1,[24,29,31],{"class":30},"snl16","from",[24,33,35],{"class":34},"s95oV"," mango.llm ",[24,37,38],{"class":30},"import",[24,40,41],{"class":34}," LLMService\n",[43,44,45],"p",{},"Abstract base class for all LLM providers. Implement this to add any LLM with tool\u002Ffunction calling support.",[47,48,50],"h2",{"id":49},"interface","Interface",[14,52,54],{"className":16,"code":53,"language":18,"meta":19,"style":19},"class LLMService(ABC):\n\n    @abstractmethod\n    def chat(\n        self,\n        messages: list[Message],\n        tools: list[ToolDef],\n        system_prompt: str = \"\",\n    ) -> LLMResponse:\n        ...\n\n    @abstractmethod\n    def get_model_name(self) -> str:\n        ...\n",[21,55,56,75,82,88,100,106,112,118,137,143,149,154,159,175],{"__ignoreMap":19},[24,57,58,61,65,68,72],{"class":26,"line":27},[24,59,60],{"class":30},"class",[24,62,64],{"class":63},"svObZ"," LLMService",[24,66,67],{"class":34},"(",[24,69,71],{"class":70},"sDLfK","ABC",[24,73,74],{"class":34},"):\n",[24,76,78],{"class":26,"line":77},2,[24,79,81],{"emptyLinePlaceholder":80},true,"\n",[24,83,85],{"class":26,"line":84},3,[24,86,87],{"class":63},"    @abstractmethod\n",[24,89,91,94,97],{"class":26,"line":90},4,[24,92,93],{"class":30},"    def",[24,95,96],{"class":63}," chat",[24,98,99],{"class":34},"(\n",[24,101,103],{"class":26,"line":102},5,[24,104,105],{"class":34},"        self,\n",[24,107,109],{"class":26,"line":108},6,[24,110,111],{"class":34},"        messages: list[Message],\n",[24,113,115],{"class":26,"line":114},7,[24,116,117],{"class":34},"        tools: list[ToolDef],\n",[24,119,121,124,127,130,134],{"class":26,"line":120},8,[24,122,123],{"class":34},"        system_prompt: ",[24,125,126],{"class":70},"str",[24,128,129],{"class":30}," =",[24,131,133],{"class":132},"sU2Wk"," \"\"",[24,135,136],{"class":34},",\n",[24,138,140],{"class":26,"line":139},9,[24,141,142],{"class":34},"    ) -> LLMResponse:\n",[24,144,146],{"class":26,"line":145},10,[24,147,148],{"class":70},"        ...\n",[24,150,152],{"class":26,"line":151},11,[24,153,81],{"emptyLinePlaceholder":80},[24,155,157],{"class":26,"line":156},12,[24,158,87],{"class":63},[24,160,162,164,167,170,172],{"class":26,"line":161},13,[24,163,93],{"class":30},[24,165,166],{"class":63}," get_model_name",[24,168,169],{"class":34},"(self) -> ",[24,171,126],{"class":70},[24,173,174],{"class":34},":\n",[24,176,178],{"class":26,"line":177},14,[24,179,148],{"class":70},[47,181,183],{"id":182},"data-types","Data types",[185,186,188],"h3",{"id":187},"message","Message",[14,190,192],{"className":16,"code":191,"language":18,"meta":19,"style":19},"@dataclass\nclass Message:\n    role: str           # \"user\" | \"assistant\" | \"tool\"\n    content: str | list # text or structured content blocks\n    tool_call_id: str | None = None  # required when role=\"tool\"\n",[21,193,194,199,208,219,235],{"__ignoreMap":19},[24,195,196],{"class":26,"line":27},[24,197,198],{"class":63},"@dataclass\n",[24,200,201,203,206],{"class":26,"line":77},[24,202,60],{"class":30},[24,204,205],{"class":63}," Message",[24,207,174],{"class":34},[24,209,210,213,215],{"class":26,"line":84},[24,211,212],{"class":34},"    role: ",[24,214,126],{"class":70},[24,216,218],{"class":217},"sAwPA","           # \"user\" | \"assistant\" | \"tool\"\n",[24,220,221,224,226,229,232],{"class":26,"line":90},[24,222,223],{"class":34},"    content: ",[24,225,126],{"class":70},[24,227,228],{"class":30}," |",[24,230,231],{"class":70}," list",[24,233,234],{"class":217}," # text or structured content blocks\n",[24,236,237,240,242,244,247,249,251],{"class":26,"line":102},[24,238,239],{"class":34},"    tool_call_id: ",[24,241,126],{"class":70},[24,243,228],{"class":30},[24,245,246],{"class":70}," None",[24,248,129],{"class":30},[24,250,246],{"class":70},[24,252,253],{"class":217},"  # required when role=\"tool\"\n",[185,255,257],{"id":256},"tooldef","ToolDef",[14,259,261],{"className":16,"code":260,"language":18,"meta":19,"style":19},"@dataclass\nclass ToolDef:\n    name: str\n    description: str\n    params: list[ToolParam]\n",[21,262,263,267,276,284,291],{"__ignoreMap":19},[24,264,265],{"class":26,"line":27},[24,266,198],{"class":63},[24,268,269,271,274],{"class":26,"line":77},[24,270,60],{"class":30},[24,272,273],{"class":63}," ToolDef",[24,275,174],{"class":34},[24,277,278,281],{"class":26,"line":84},[24,279,280],{"class":34},"    name: ",[24,282,283],{"class":70},"str\n",[24,285,286,289],{"class":26,"line":90},[24,287,288],{"class":34},"    description: ",[24,290,283],{"class":70},[24,292,293],{"class":26,"line":102},[24,294,295],{"class":34},"    params: list[ToolParam]\n",[185,297,299],{"id":298},"toolparam","ToolParam",[14,301,303],{"className":16,"code":302,"language":18,"meta":19,"style":19},"@dataclass\nclass ToolParam:\n    name: str\n    type: str           # \"string\" | \"integer\" | \"number\" | \"boolean\" | \"array\" | \"object\"\n    description: str\n    required: bool = True\n    enum: list | None = None\n    items: dict | None = None   # for array types\n",[21,304,305,309,318,324,337,343,356,373],{"__ignoreMap":19},[24,306,307],{"class":26,"line":27},[24,308,198],{"class":63},[24,310,311,313,316],{"class":26,"line":77},[24,312,60],{"class":30},[24,314,315],{"class":63}," ToolParam",[24,317,174],{"class":34},[24,319,320,322],{"class":26,"line":84},[24,321,280],{"class":34},[24,323,283],{"class":70},[24,325,326,329,332,334],{"class":26,"line":90},[24,327,328],{"class":70},"    type",[24,330,331],{"class":34},": ",[24,333,126],{"class":70},[24,335,336],{"class":217},"           # \"string\" | \"integer\" | \"number\" | \"boolean\" | \"array\" | \"object\"\n",[24,338,339,341],{"class":26,"line":102},[24,340,288],{"class":34},[24,342,283],{"class":70},[24,344,345,348,351,353],{"class":26,"line":108},[24,346,347],{"class":34},"    required: ",[24,349,350],{"class":70},"bool",[24,352,129],{"class":30},[24,354,355],{"class":70}," True\n",[24,357,358,361,364,366,368,370],{"class":26,"line":114},[24,359,360],{"class":34},"    enum: ",[24,362,363],{"class":70},"list",[24,365,228],{"class":30},[24,367,246],{"class":70},[24,369,129],{"class":30},[24,371,372],{"class":70}," None\n",[24,374,375,378,381,383,385,387,389],{"class":26,"line":120},[24,376,377],{"class":34},"    items: ",[24,379,380],{"class":70},"dict",[24,382,228],{"class":30},[24,384,246],{"class":70},[24,386,129],{"class":30},[24,388,246],{"class":70},[24,390,391],{"class":217},"   # for array types\n",[185,393,395],{"id":394},"llmresponse","LLMResponse",[14,397,399],{"className":16,"code":398,"language":18,"meta":19,"style":19},"@dataclass\nclass LLMResponse:\n    text: str | None\n    tool_calls: list[ToolCall]\n    model: str\n    input_tokens: int\n    output_tokens: int\n\n    @property\n    def has_tool_calls(self) -> bool:\n        return len(self.tool_calls) > 0\n",[21,400,401,405,414,425,430,437,445,452,456,464,477],{"__ignoreMap":19},[24,402,403],{"class":26,"line":27},[24,404,198],{"class":63},[24,406,407,409,412],{"class":26,"line":77},[24,408,60],{"class":30},[24,410,411],{"class":63}," LLMResponse",[24,413,174],{"class":34},[24,415,416,419,421,423],{"class":26,"line":84},[24,417,418],{"class":34},"    text: ",[24,420,126],{"class":70},[24,422,228],{"class":30},[24,424,372],{"class":70},[24,426,427],{"class":26,"line":90},[24,428,429],{"class":34},"    tool_calls: list[ToolCall]\n",[24,431,432,435],{"class":26,"line":102},[24,433,434],{"class":34},"    model: ",[24,436,283],{"class":70},[24,438,439,442],{"class":26,"line":108},[24,440,441],{"class":34},"    input_tokens: ",[24,443,444],{"class":70},"int\n",[24,446,447,450],{"class":26,"line":114},[24,448,449],{"class":34},"    output_tokens: ",[24,451,444],{"class":70},[24,453,454],{"class":26,"line":120},[24,455,81],{"emptyLinePlaceholder":80},[24,457,458,461],{"class":26,"line":139},[24,459,460],{"class":63},"    @",[24,462,463],{"class":70},"property\n",[24,465,466,468,471,473,475],{"class":26,"line":145},[24,467,93],{"class":30},[24,469,470],{"class":63}," has_tool_calls",[24,472,169],{"class":34},[24,474,350],{"class":70},[24,476,174],{"class":34},[24,478,479,482,485,487,490,493,496],{"class":26,"line":151},[24,480,481],{"class":30},"        return",[24,483,484],{"class":70}," len",[24,486,67],{"class":34},[24,488,489],{"class":70},"self",[24,491,492],{"class":34},".tool_calls) ",[24,494,495],{"class":30},">",[24,497,498],{"class":70}," 0\n",[185,500,502],{"id":501},"toolcall","ToolCall",[14,504,506],{"className":16,"code":505,"language":18,"meta":19,"style":19},"@dataclass\nclass ToolCall:\n    tool_name: str\n    tool_args: dict\n    tool_call_id: str\n    thought_signature: str | None = None   # Gemini 3 round-trip requirement\n",[21,507,508,512,521,528,536,542],{"__ignoreMap":19},[24,509,510],{"class":26,"line":27},[24,511,198],{"class":63},[24,513,514,516,519],{"class":26,"line":77},[24,515,60],{"class":30},[24,517,518],{"class":63}," ToolCall",[24,520,174],{"class":34},[24,522,523,526],{"class":26,"line":84},[24,524,525],{"class":34},"    tool_name: ",[24,527,283],{"class":70},[24,529,530,533],{"class":26,"line":90},[24,531,532],{"class":34},"    tool_args: ",[24,534,535],{"class":70},"dict\n",[24,537,538,540],{"class":26,"line":102},[24,539,239],{"class":34},[24,541,283],{"class":70},[24,543,544,547,549,551,553,555,557],{"class":26,"line":108},[24,545,546],{"class":34},"    thought_signature: ",[24,548,126],{"class":70},[24,550,228],{"class":30},[24,552,246],{"class":70},[24,554,129],{"class":30},[24,556,246],{"class":70},[24,558,559],{"class":217},"   # Gemini 3 round-trip requirement\n",[47,561,563],{"id":562},"built-in-implementations","Built-in implementations",[565,566,567,580],"table",{},[568,569,570],"thead",{},[571,572,573,577],"tr",{},[574,575,576],"th",{},"Class",[574,578,579],{},"Import",[581,582,583,596,608],"tbody",{},[571,584,585,591],{},[586,587,588],"td",{},[21,589,590],{},"AnthropicLlmService",[586,592,593],{},[21,594,595],{},"mango.integrations.anthropic",[571,597,598,603],{},[586,599,600],{},[21,601,602],{},"OpenAiLlmService",[586,604,605],{},[21,606,607],{},"mango.integrations.openai",[571,609,610,615],{},[586,611,612],{},[21,613,614],{},"GeminiLlmService",[586,616,617],{},[21,618,619],{},"mango.integrations.google",[47,621,623],{"id":622},"custom-implementation","Custom implementation",[14,625,627],{"className":16,"code":626,"language":18,"meta":19,"style":19},"from mango.llm import LLMService, LLMResponse, Message, ToolDef, ToolCall\n\nclass MyLlmService(LLMService):\n\n    def chat(\n        self,\n        messages: list[Message],\n        tools: list[ToolDef],\n        system_prompt: str = \"\",\n    ) -> LLMResponse:\n        # Convert to your provider's format\n        # Call API\n        # Parse response\n        return LLMResponse(\n            text=\"...\",\n            tool_calls=[ToolCall(...)],\n            model=\"my-model\",\n            input_tokens=100,\n            output_tokens=50,\n        )\n\n    def get_model_name(self) -> str:\n        return \"my-model-v1\"\n",[21,628,629,640,644,657,661,669,673,677,681,693,697,702,707,712,719,734,751,764,777,790,796,801,814],{"__ignoreMap":19},[24,630,631,633,635,637],{"class":26,"line":27},[24,632,31],{"class":30},[24,634,35],{"class":34},[24,636,38],{"class":30},[24,638,639],{"class":34}," LLMService, LLMResponse, Message, ToolDef, ToolCall\n",[24,641,642],{"class":26,"line":77},[24,643,81],{"emptyLinePlaceholder":80},[24,645,646,648,651,653,655],{"class":26,"line":84},[24,647,60],{"class":30},[24,649,650],{"class":63}," MyLlmService",[24,652,67],{"class":34},[24,654,5],{"class":63},[24,656,74],{"class":34},[24,658,659],{"class":26,"line":90},[24,660,81],{"emptyLinePlaceholder":80},[24,662,663,665,667],{"class":26,"line":102},[24,664,93],{"class":30},[24,666,96],{"class":63},[24,668,99],{"class":34},[24,670,671],{"class":26,"line":108},[24,672,105],{"class":34},[24,674,675],{"class":26,"line":114},[24,676,111],{"class":34},[24,678,679],{"class":26,"line":120},[24,680,117],{"class":34},[24,682,683,685,687,689,691],{"class":26,"line":139},[24,684,123],{"class":34},[24,686,126],{"class":70},[24,688,129],{"class":30},[24,690,133],{"class":132},[24,692,136],{"class":34},[24,694,695],{"class":26,"line":145},[24,696,142],{"class":34},[24,698,699],{"class":26,"line":151},[24,700,701],{"class":217},"        # Convert to your provider's format\n",[24,703,704],{"class":26,"line":156},[24,705,706],{"class":217},"        # Call API\n",[24,708,709],{"class":26,"line":161},[24,710,711],{"class":217},"        # Parse response\n",[24,713,714,716],{"class":26,"line":177},[24,715,481],{"class":30},[24,717,718],{"class":34}," LLMResponse(\n",[24,720,722,726,729,732],{"class":26,"line":721},15,[24,723,725],{"class":724},"s9osk","            text",[24,727,728],{"class":30},"=",[24,730,731],{"class":132},"\"...\"",[24,733,136],{"class":34},[24,735,737,740,742,745,748],{"class":26,"line":736},16,[24,738,739],{"class":724},"            tool_calls",[24,741,728],{"class":30},[24,743,744],{"class":34},"[ToolCall(",[24,746,747],{"class":70},"...",[24,749,750],{"class":34},")],\n",[24,752,754,757,759,762],{"class":26,"line":753},17,[24,755,756],{"class":724},"            model",[24,758,728],{"class":30},[24,760,761],{"class":132},"\"my-model\"",[24,763,136],{"class":34},[24,765,767,770,772,775],{"class":26,"line":766},18,[24,768,769],{"class":724},"            input_tokens",[24,771,728],{"class":30},[24,773,774],{"class":70},"100",[24,776,136],{"class":34},[24,778,780,783,785,788],{"class":26,"line":779},19,[24,781,782],{"class":724},"            output_tokens",[24,784,728],{"class":30},[24,786,787],{"class":70},"50",[24,789,136],{"class":34},[24,791,793],{"class":26,"line":792},20,[24,794,795],{"class":34},"        )\n",[24,797,799],{"class":26,"line":798},21,[24,800,81],{"emptyLinePlaceholder":80},[24,802,804,806,808,810,812],{"class":26,"line":803},22,[24,805,93],{"class":30},[24,807,166],{"class":63},[24,809,169],{"class":34},[24,811,126],{"class":70},[24,813,174],{"class":34},[24,815,817,819],{"class":26,"line":816},23,[24,818,481],{"class":30},[24,820,821],{"class":132}," \"my-model-v1\"\n",[823,824,825],"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 .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 .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}",{"title":19,"searchDepth":77,"depth":77,"links":827},[828,829,836,837],{"id":49,"depth":77,"text":50},{"id":182,"depth":77,"text":183,"children":830},[831,832,833,834,835],{"id":187,"depth":84,"text":188},{"id":256,"depth":84,"text":257},{"id":298,"depth":84,"text":299},{"id":394,"depth":84,"text":395},{"id":501,"depth":84,"text":502},{"id":562,"depth":77,"text":563},{"id":622,"depth":77,"text":623},"Abstract interface for LLM backends.","md",{},"\u002Fdocs\u002Fapi-reference\u002Fllm-service",{"title":5,"description":838},"docs\u002F4.api-reference\u002F2.llm-service","RWnAAU-wDcrntNZzemcxF8wkb9eTRzv_uIsnxziqA0Y",1776189332104]