[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6J188SPKYTCWNMY17KDQJNT":3,"skill-same:01M6J188SPKYTCWNMY17KDQJNT":71},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":41,"commitSha":42,"skillDirectory":43,"forksCount":44,"repositoryHtmlUrl":45,"repositoryHomepageUrl":46,"ownerHtmlUrl":47,"ownerBlogUrl":48,"ownerDescription":49,"updatedAt":50,"install":51,"resources":64},"01M6J188SPKYTCWNMY17KDQJNT","liter-llm-tool-calling",null,"Use when defining functions\u002Ftools for an LLM to call through liter-llm, or requesting structured JSON outputs. Covers tool schemas, tool_calls handling, and response formats.","xberg-io\u002Fliter-llm","xberg-io","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F241328462?v=4","01M6BYYMACFMK5WNT338Y71K58","Xberg.io","01M6J160RA8VS7XVE01W9305F3",265,"MIT","https:\u002F\u002Fgithub.com\u002Fxberg-io\u002Fliter-llm\u002Fblob\u002Fmain\u002Fplugin\u002F.cursor-plugin\u002Fskills\u002Fliter-llm-tool-calling\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"tool","llm tool","liter llm","calling","tool calling","liter llm tool calling","when","Tools","outputs","for","formats","calls","structured","call","functions","use","json","2026-11-10 10:12:30",false,"---\ndescription: Use when defining functions\u002Ftools for an LLM to call through liter-llm, or requesting structured JSON outputs. Covers tool schemas, tool_calls handling, and response formats.\nname: liter-llm-tool-calling\n---\n\n\u003C!--\nAI-RULEZ :: GENERATED FILE — DO NOT EDIT\nContent-Hash: blake3:f26049693a8fa3229f675eefc4097cfa0aeb669a5744967a7ab3614009a80310\nSource-Hash: blake3:725e6663621cbc5ffbaf9dbb2141fe5f9b95aee234fe9f7ece2d2b6e63dc5a66\nSchema-Version: v1\n-->\n\n# Tool Calling\n\nPass a `tools` array of function definitions; the model may respond with\n`tool_calls` instead of (or alongside) text. Execute the named function and feed\nthe result back as a `tool` message.\n\n## Python\n\n```python\nimport asyncio, json, os\nfrom liter_llm import create_client\nfrom liter_llm._internal_bindings import ChatCompletionRequest\n\npayload = {\n    \"model\": \"openai\u002Fgpt-4o\",\n    \"messages\": [{\"role\": \"user\", \"content\": \"What is the weather in Berlin?\"}],\n    \"tools\": [\n        {\n            \"type\": \"function\",\n            \"function\": {\n                \"name\": \"get_weather\",\n                \"description\": \"Get the current weather for a location\",\n                \"parameters\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                        \"location\": {\"type\": \"string\", \"description\": \"City name\"},\n                    },\n                    \"required\": [\"location\"],\n                },\n            },\n        }\n    ],\n    \"tool_choice\": \"auto\",\n}\n\nasync def main() -> None:\n    client = create_client(api_key=os.environ[\"OPENAI_API_KEY\"])\n    request = ChatCompletionRequest.from_json(json.dumps(payload))\n    response = await client.chat(request)\n    for call in response.choices[0].message.tool_calls or []:\n        print(call.function.name, call.function.arguments)  # arguments is a JSON string\n\nasyncio.run(main())\n```\n\n## Structured outputs\n\nRequest strict JSON with `response_format`:\n\n```python\nrequest = ChatCompletionRequest.from_json(json.dumps({\n    \"model\": \"openai\u002Fgpt-4o\",\n    \"messages\": [{\"role\": \"user\", \"content\": \"Extract name and age as JSON.\"}],\n    \"response_format\": {\"type\": \"json_object\"},\n}))\nresponse = await client.chat(request)\n```\n\n## Notes\n\n- `function.arguments` is a JSON **string** — parse it before use.\n- Append each tool result as a message with `role=\"tool\"` and the matching\n  `tool_call_id`, then call `chat` again to let the model continue.\n- Tool support and JSON-mode availability vary by provider; check the provider\n  reference if a model ignores `tools`.\n","\u003C!--\nAI-RULEZ :: GENERATED FILE — DO NOT EDIT\nContent-Hash: blake3:f26049693a8fa3229f675eefc4097cfa0aeb669a5744967a7ab3614009a80310\nSource-Hash: blake3:725e6663621cbc5ffbaf9dbb2141fe5f9b95aee234fe9f7ece2d2b6e63dc5a66\nSchema-Version: v1\n-->\n\n# Tool Calling\n\nPass a `tools` array of function definitions; the model may respond with\n`tool_calls` instead of (or alongside) text. Execute the named function and feed\nthe result back as a `tool` message.\n\n## Python\n\n```python\nimport asyncio, json, os\nfrom liter_llm import create_client\nfrom liter_llm._internal_bindings import ChatCompletionRequest\n\npayload = {\n    \"model\": \"openai\u002Fgpt-4o\",\n    \"messages\": [{\"role\": \"user\", \"content\": \"What is the weather in Berlin?\"}],\n    \"tools\": [\n        {\n            \"type\": \"function\",\n            \"function\": {\n                \"name\": \"get_weather\",\n                \"description\": \"Get the current weather for a location\",\n                \"parameters\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                        \"location\": {\"type\": \"string\", \"description\": \"City name\"},\n                    },\n                    \"required\": [\"location\"],\n                },\n            },\n        }\n    ],\n    \"tool_choice\": \"auto\",\n}\n\nasync def main() -> None:\n    client = create_client(api_key=os.environ[\"OPENAI_API_KEY\"])\n    request = ChatCompletionRequest.from_json(json.dumps(payload))\n    response = await client.chat(request)\n    for call in response.choices[0].message.tool_calls or []:\n        print(call.function.name, call.function.arguments)  # arguments is a JSON string\n\nasyncio.run(main())\n```\n\n## Structured outputs\n\nRequest strict JSON with `response_format`:\n\n```python\nrequest = ChatCompletionRequest.from_json(json.dumps({\n    \"model\": \"openai\u002Fgpt-4o\",\n    \"messages\": [{\"role\": \"user\", \"content\": \"Extract name and age as JSON.\"}],\n    \"response_format\": {\"type\": \"json_object\"},\n}))\nresponse = await client.chat(request)\n```\n\n## Notes\n\n- `function.arguments` is a JSON **string** — parse it before use.\n- Append each tool result as a message with `role=\"tool\"` and the matching\n  `tool_call_id`, then call `chat` again to let the model continue.\n- Tool support and JSON-mode availability vary by provider; check the provider\n  reference if a model ignores `tools`.\n",{"name":5,"description":7},"main","2bc4403def694d18143810aa54dc8522a45705ca","plugin\u002F.cursor-plugin\u002Fskills\u002Fliter-llm-tool-calling",27,"https:\u002F\u002Fgithub.com\u002Fxberg-io\u002Fliter-llm","https:\u002F\u002Fdocs.liter-llm.xberg.io","https:\u002F\u002Fgithub.com\u002Fxberg-io","https:\u002F\u002Fxberg.io","Open-source content intelligence with a Rust core: documents, web, LLMs and code, with native bindings for every major language.","2026-11-12 21:51:28",{"source":8,"skillName":5,"commands":52,"prompt":62,"zipAvailable":63},[53,56,59],{"tool":54,"command":55},"npx","npx skills add xberg-io\u002Fliter-llm --skill liter-llm-tool-calling",{"tool":57,"command":58},"bunx","bunx skills add xberg-io\u002Fliter-llm --skill liter-llm-tool-calling",{"tool":60,"command":61},"pnpm","pnpm dlx skills add xberg-io\u002Fliter-llm --skill liter-llm-tool-calling","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fxberg-io\u002Fliter-llm\u002Fblob\u002Fmain\u002Fplugin\u002F.cursor-plugin\u002Fskills\u002Fliter-llm-tool-calling\u002FSKILL.md",true,[65],{"path":66,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":69,"sourceHtmlUrl":70},"index.md","REFERENCE","参考文档",459,"https:\u002F\u002Fgithub.com\u002Fxberg-io\u002Fliter-llm\u002Fblob\u002Fmain\u002Fplugin\u002F.cursor-plugin\u002Fskills\u002Fliter-llm-tool-calling\u002Findex.md",[72,110,126,131,148,171],{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":91,"publishedAt":36},"01M6J1DRP0968S21HH1C4HR9RK","liter-llm","Universal LLM API client for 174 providers with native bindings for 14 languages. Use when writing code that calls LLM APIs via liter-llm in Python, TypeScript, Rust, Go, Java, C#, Ruby, PHP, Elixir, WASM, or C, when running the OpenAI-compatible proxy, or when calling LLMs through the MCP server. Covers chat, streaming, tool calling, embeddings, image generation, speech, transcription, moderation, web search, OCR, reranking, provider routing, middleware, and configuration.","https:\u002F\u002Fgithub.com\u002Fxberg-io\u002Fliter-llm\u002Fblob\u002Fmain\u002Fskills\u002Fliter-llm\u002FSKILL.md",[78,83,86],{"categoryNo":79,"categoryName":80,"taxonomyType":81,"taxonomyTypeDesc":82},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":84,"categoryName":85,"taxonomyType":81,"taxonomyTypeDesc":82},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":87,"categoryName":88,"taxonomyType":89,"taxonomyTypeDesc":90},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[21,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,25],"ocr","web search","search","rust","middleware","ruby","MCP","writing","image","mcp server","code","api","io","streaming","llms","server","native","elixir",{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":118,"publishedAt":36},"01M6J1DK94H9KDPW62F1E96VRR","liter-llm-using-the-mcp-server","Use when calling LLM APIs through the liter-llm MCP server's 22 tools, and to decide when MCP beats the CLI or SDK. Covers the tool surface, the auto-installing launcher, and authentication.","https:\u002F\u002Fgithub.com\u002Fxberg-io\u002Fliter-llm\u002Fblob\u002Fmain\u002Fskills\u002Fliter-llm-using-the-mcp-server\u002FSKILL.md",[116,117],{"categoryNo":79,"categoryName":80,"taxonomyType":81,"taxonomyTypeDesc":82},{"categoryNo":84,"categoryName":85,"taxonomyType":81,"taxonomyTypeDesc":82},[98,101,119,107,21,120,121,122,19,22,123,34,124,125,26,25],"liter llm using the mcp server","launcher","decide","authentication","auto","cli","sdk",{"skillNo":127,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":130,"publishedAt":36},"01M6J1DEEPNVQ3E5CX5ZF69416","https:\u002F\u002Fgithub.com\u002Fxberg-io\u002Fliter-llm\u002Fblob\u002Fmain\u002Fskills\u002Fliter-llm-tool-calling\u002FSKILL.md",[],[23,19,22,24,21,20,28,30,32,34,33,35,29,26,31,27,25],{"skillNo":132,"name":133,"nameZh":6,"description":134,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":137,"publishedAt":36},"01M6J1DBN4XD93NN04WA8ZP75H","liter-llm-streaming-responses","Use when streaming tokens incrementally from an LLM via liter-llm over SSE or async iterators. Covers chat_stream, delta handling, and null-content chunks.","https:\u002F\u002Fgithub.com\u002Fxberg-io\u002Fliter-llm\u002Fblob\u002Fmain\u002Fskills\u002Fliter-llm-streaming-responses\u002FSKILL.md",[],[138,21,105,139,140,141,142,143,34,144,145,146,147,25],"liter llm streaming responses","chat","delta","via","tokens","async","content","sse","chunks","stream",{"skillNo":149,"name":150,"nameZh":6,"description":151,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":152,"categories":153,"keywords":154,"publishedAt":36},"01M6J1D76FTYTKSPWNNRVZ2PX3","liter-llm-running-the-proxy","Use when running the `liter-llm api` OpenAI-compatible gateway — virtual keys, per-key rate limits, budgets, cost tracking, and model routing. Covers the TOML config and the 22 REST endpoints.","https:\u002F\u002Fgithub.com\u002Fxberg-io\u002Fliter-llm\u002Fblob\u002Fmain\u002Fskills\u002Fliter-llm-running-the-proxy\u002FSKILL.md",[],[155,156,21,157,158,159,160,161,162,34,103,163,164,165,166,167,168,169,170,25],"proxy","liter llm running the proxy","running","openai-compatible","virtual","gateway","model","toml","cost","routing","REST","endpoints","keys","config","limits","llm api",{"skillNo":172,"name":173,"nameZh":6,"description":174,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":175,"categories":176,"keywords":177,"publishedAt":36},"01M6J1D2W434JGGHXR8SP91PZ3","liter-llm-embeddings-and-search","Use when generating embeddings, calling the 12 web-search providers, or running OCR over documents with the 4 OCR providers through liter-llm. Covers embed, search, and ocr methods plus reranking.","https:\u002F\u002Fgithub.com\u002Fxberg-io\u002Fliter-llm\u002Fblob\u002Fmain\u002Fskills\u002Fliter-llm-embeddings-and-search\u002FSKILL.md",[],[94,178,21,179,92,180,22,34,181,182,183,184,185,186,187,157,25],"liter llm embeddings and search","embeddings","methods","documents","embed","with","web","web-search","Providers","reranking"]