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]),
)
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]),
)
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_screening→finance_wallet_screening -
office/pdf_form_filler→office_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))
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_*.pyscripts useto_gemini_tool()directly; manualtypes.Tool(...)wrapping removed. - Tests — Coverage for return type, sanitization, and a catalog doc lint so Gemini snippets do not drift back to old patterns.
-
Docs —
gemini.md, skill catalog pages,agent_loops.md,cli.md, andintroduction.mddescribe 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:
pip install -U skillware
skillware
Upgrade
pip install -U skillware
For Gemini:
pip install -U "skillware[gemini]"
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
- Repo: https://github.com/ARPAHLS/skillware
- Website: https://skillware.site
- Changelog: https://github.com/ARPAHLS/skillware/blob/main/CHANGELOG.md#043---2026-07-10
- Gemini guide: https://github.com/ARPAHLS/skillware/blob/main/docs/usage/gemini.md
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)