DEV Community

Cover image for Skillware 0.4.3 — Gemini Tool Calling, CLI, Refined

Skillware 0.4.3 — Gemini Tool Calling, CLI, Refined

Skillware 0.4.3 tightens how skills plug into Google Gemini: clearer tool objects, automatic name sanitization, and docs/examples that all tell the same story. If you are building agent loops on top of the registry, this release is mostly about making the happy path shorter and more predictable.

Gemini adapter: from dict to types.Tool

Earlier releases exposed Gemini tools as a plain Python dict — name, description, parameters. That worked for some quick experiments, or if you wrote your own sanitization scripts, but the google-genai SDK expects a types.Tool when you pass tools=[...] into GenerateContentConfig. In practice, copy-paste from the README or examples could fail depending on SDK version and how you wired the call.

0.4.3 changes the contract: SkillLoader.to_gemini_tool() now returns a ready-to-use google.genai.types.Tool.

Before — manual assembly in some setups

decl = SkillLoader.to_gemini_tool(bundle)
decl["name"] = SkillLoader._sanitize_function_tool_name(decl["name"])
tool = types.Tool(function_declarations=[decl])

client.models.generate_content(
    model="gemini-2.5-flash",
    contents="Screen wallet 0xd8dA...",
    config=types.GenerateContentConfig(tools=[tool]),
)
Enter fullscreen mode Exit fullscreen mode

Fine when you knew the SDK shape. Extra steps when you did not.

Now — one call, pass straight through

tool = SkillLoader.to_gemini_tool(bundle)

client.models.generate_content(
    model="gemini-2.5-flash",
    contents="Screen wallet 0xd8dA...",
    config=types.GenerateContentConfig(tools=[tool]),
)
Enter fullscreen mode Exit fullscreen mode

Same mental model as the docs always showed — load skill, adapt, call Gemini — with the adapter doing the wrapping for you.

Automatic name sanitization

Registry skills use human-readable IDs with slashes: finance/wallet_screening, office/pdf_form_filler. OpenAI and DeepSeek adapters already mapped those to underscore names. Gemini now follows the same rule.

0.4.3 sanitizes inside the loader:

  • finance/wallet_screeningfinance_wallet_screening
  • office/pdf_form_filleroffice_pdf_form_filler

Claude still uses slash IDs — that is by design. Gemini, OpenAI, and DeepSeek share sanitized dispatch.

When you match tool calls in a loop:

TOOL_NAME = SkillLoader._sanitize_gemini_tool_name(bundle["manifest"]["name"])

if part.function_call.name == TOOL_NAME:
    result = skill.execute(dict(part.function_call.args))
Enter fullscreen mode Exit fullscreen mode

Single-tool examples that execute on any function_call keep working unchanged.

Examples, tests, and docs — aligned

Nothing under skills/ changed. The integration layer did:

  • Examples — All examples/gemini_*.py scripts use to_gemini_tool() directly; manual types.Tool(...) wrapping removed.
  • Tests — Coverage for return type, sanitization, and a catalog doc lint so Gemini snippets do not drift back to old patterns.
  • Docsgemini.md, skill catalog pages, agent_loops.md, cli.md, and introduction.md describe sanitized Gemini names consistently.

Root README quick start matches runtime behavior — load, adapt, loop.

Also in 0.4.3

Contributor docs — Category selection guidance in CONTRIBUTING.md (#204).

GitHub project — Refreshed issue templates, PR template, label taxonomy, and CI sync from .github/labels.json (#227).

CLI — Same interactive experience as 0.4.2 (splash, menu, list, examples, test). Handy for browsing what ships with the package:

Skillware CLI — interactive menu and skill list

pip install -U skillware
skillware
Enter fullscreen mode Exit fullscreen mode

Upgrade

pip install -U skillware
Enter fullscreen mode Exit fullscreen mode

For Gemini:

pip install -U "skillware[gemini]"
Enter fullscreen mode Exit fullscreen mode

Note for advanced callers: if you indexed the old dict return (tool["name"]), use the SDK object instead (tool.function_declarations[0].name). Standard pass-through usage is simpler after upgrade.

Links

Thanks to @Areen-09 (#223, #229), @syed7-crypto (#205), and the maintainers who landed doc follow-ups (#245). Feedback and skill proposals welcome on GitHub.

Top comments (0)