Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add xberg-io/liter-llm --skill liter-llm-tool-callinggit clone --depth 1 https://github.com/xberg-io/liter-llmWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/xberg-io/liter-llm/liter-llm-tool-calling)<a href="https://agentmods.dev/skills/xberg-io/liter-llm/liter-llm-tool-calling"><img src="https://agentmods.dev/badge/skills/xberg-io/liter-llm/liter-llm-tool-calling/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/xberg-io/liter-llm/liter-llm-tool-calling"><img src="https://agentmods.dev/badge/skills/xberg-io/liter-llm/liter-llm-tool-calling.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00035 | $0.00551 |
| Opus 5.5 | $0.00014 | $0.00220 |
| Sonnet 5.5 | $0.00007 | $0.00110 |
| Haiku 4.5 | $0.00003 | $0.00055 |
Grade A, and why
liter-llm-tool-calling scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 5d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 77 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Tool Calling
Pass a tools array of function definitions; the model may respond with
tool_calls instead of (or alongside) text. Execute the named function and feed
the result back as a tool message.
Python
import asyncio, json, os
from liter_llm import create_client
from liter_llm._internal_bindings import ChatCompletionRequest
payload = {
"model": "openai/gpt-4o",
"messages": [{"role": "user", "content": "What is the weather in Berlin?"}],
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get the current weather for a location",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string", "description": "City name"},
},
"required": ["location"],
},
},
}
],
"tool_choice": "auto",
}
async def main() -> None:
client = create_client(api_key=os.environ["OPENAI_API_KEY"])
request = ChatCompletionRequest.from_json(json.dumps(payload))
response = await client.chat(request)
for call in response.choices[0].message.tool_calls or []:
print(call.function.name, call.function.arguments) # arguments is a JSON string
asyncio.run(main())
Structured outputs
Request strict JSON with response_format:
request = ChatCompletionRequest.from_json(json.dumps({
"model": "openai/gpt-4o",
"messages": [{"role": "user", "content": "Extract name and age as JSON."}],
"response_format": {"type": "json_object"},
}))
response = await client.chat(request)
Notes
function.argumentsis a JSON string — parse it before use.- Append each tool result as a message with
role="tool"and the matchingtool_call_id, then callchatagain to let the model continue. - Tool support and JSON-mode availability vary by provider; check the provider
reference if a model ignores
tools.
What ships with it
1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 5d ago First seen · 77 lines · 35 tokens per session scan A 0a5c294b7622
liter-llm-tool-calling is a skill published in the GitHub repository xberg-io/liter-llm (261 stars, last pushed today), licensed MIT. It adds 35 tokens to every session and 551 once invoked, about $0.0001 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-10-15.
Other skills, from other repositories
openai-patterns
Production OpenAI API patterns — model selection, prompt engineering, function calling, streaming, error handling, cost control, and structured outputs.
outlines
Outlines: structured JSON/regex/Pydantic LLM generation.
instructor
Structured LLM outputs validated with Pydantic.
guidance
Constrain LLM output with grammars; guarantee valid JSON.
dspy
DSPy: declarative LM programs, auto-optimize prompts, RAG.
pydantic-ai
Build production-ready AI agents with PydanticAI — type-safe tool use, structured outputs, dependency injection, and multi-model support.