The 3-File Format
Every skill needs three files (plus an optional test file):Step-by-Step: Build a Weather Skill
1. Create the directory
2. Write SKILL.md
name, description) is used by the tool registry. The markdown body is injected into the LLM prompt as instructions.
3. Write fliiq.yaml
input_schema — JSON Schema defining what the LLM passes to the handler. Must be type: object.
output_schema — Documents the return format. Used by the LLM to understand the response.
credentials — List of environment variable names. Fliiq loads these from .env before calling the handler.
4. Write main.py
5. Add the API key
.env
6. Test it
~/.fliiq/skills/weather/ and makes it available to the agent.
Handler Contract
The handler function must follow these rules:| Rule | Detail |
|---|---|
| Function name | Must be handler |
| Signature | async def handler(params: dict) -> dict |
| Async | Must be an async function |
| Params | Dict matching input_schema from fliiq.yaml |
| Return | Dict matching output_schema from fliiq.yaml |
| HTTP client | Use httpx (not requests) for async compatibility |
| Errors | Raise ValueError with a clear message — never fail silently |
| Credentials | Read from os.environ (loaded from .env by the skill runtime) |
Real Example: web_search
Here’s the actualweb_search skill that ships with Fliiq:
Promoting to Core
Once you’ve validated a local skill, promote it so it ships with your project:.fliiq/skills/weather/ to skills/core/weather/. See Promoting Skills for details.