Add Function
Guide for adding new functions to the library. Use this when implementing new API wrappers or utility functions.
Install
Quick install
npx skills add https://github.com/microsoft/semantic-link-labs/tree/HEAD/.claude/skills/add-functionnpx skills add microsoft/semantic-link-labs --skill add-function --agent claude-codenpx skills add microsoft/semantic-link-labs --skill add-function --agent cursornpx skills add microsoft/semantic-link-labs --skill add-function --agent codexnpx skills add microsoft/semantic-link-labs --skill add-function --agent opencodenpx skills add microsoft/semantic-link-labs --skill add-function --agent github-copilotnpx skills add microsoft/semantic-link-labs --skill add-function --agent windsurfMore install options
Shorthand — useful for multi-skill repos:
npx skills add microsoft/semantic-link-labs --skill add-functionManual — clone the repo and drop the folder into your agent's skills directory:
git clone https://github.com/microsoft/semantic-link-labs.gitcp -r semantic-link-labs/.claude/skills/add-function ~/.claude/skills/add-function
Guide for adding new functions to the library. Use this when implementing new API wrappers or utility functions.
add-functionby microsoft
Guide for adding new functions to the library. Use this when implementing new API wrappers or utility functions.npx skills add https://github.com/microsoft/semantic-link-labs --skill add-functionDownload ZIPGitHub
Adding New Functions
This skill covers the workflow for adding new functions to the Semantic Link Labs library.
When to Use This Skill
Use this skill when you need to:
- Add a new API wrapper function
- Create a new utility function
- Extend existing functionality with new features
- Add functions to submodules (admin, report, lakehouse, etc.)
Function Categories
CategoryLocationPurposeTop-level functionssrc/sempy_labs/_*.pyMain library exportsAdmin functionssrc/sempy_labs/admin/Admin API operationsReport functionssrc/sempy_labs/report/Report operationsLakehouse functionssrc/sempy_labs/lakehouse/Lakehouse operationsDirect Lake functionssrc/sempy_labs/directlake/Direct Lake model operationsTOM methodssrc/sempy_labs/tom/_model.pyTOMWrapper class methods
Step 0: Find the API Documentation
Before implementing an API wrapper, find the relevant API documentation:
`# Use the API search tool
cd .claude/skills/rest-api-patterns/scripts
python search_public_api_doc.py "your search query"
# Examples:
python search_public_api_doc.py "workspace users" --source fabric
python search_public_api_doc.py "dataset refresh" --source powerbi
`
See the REST API Patterns skill for more details.
Step 1: Choose the Right Location
Top-Level Function
For general-purpose functions exported from sempy_labs:
`# src/sempy_labs/_my_feature.py
`
Submodule Function
For functions belonging to a specific domain:
`# src/sempy_labs/admin/_my_admin_function.py
# src/sempy_labs/lakehouse/_my_lakehouse_function.py
# src/sempy_labs/report/_my_report_function.py
`
Step 2: Create the Function
Required Imports
`import pandas as pd
from typing import Optional, List
from uuid import UUID
# Logging decorator from sempy
from sempy._utils._log import log
# Helper functions
from sempy_labs._helper_functions import (
resolve_workspace_name_and_id,
resolve_workspace_id,
_base_api,
_create_dataframe,
)
# Icons for user messages
import sempy_labs._icons as icons
`
Function Template
`@log
def my_new_function(
item: str | UUID,
workspace: Optional[str | UUID] = None,
option: str = "default",
) -> pd.DataFrame:
"""
Short description of what the function does.
Extended description with more details about the function's behavior,
use cases, and any important notes.
This is a wrapper function for the following API: `API Name <https://learn.microsoft.com/rest/api/...>`_.
Service Principal Authentication is supported (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
Parameters
----------
item : str | uuid.UUID
The name or ID of the item.
workspace : str | uuid.UUID, default=None
The Fabric workspace name or ID.
Defaults to None which resolves to the workspace of the attached lakehouse
or if no lakehouse attached, resolves to the workspace of the notebook.
option : str, default="default"
An option that controls function behavior.
Returns
-------
pandas.DataFrame
A pandas dataframe showing the results.
Columns include: 'Column1', 'Column2', 'Column3'.
Raises
------
ValueError
If the item does not exist.
FabricHTTPException
If the API request fails.
"""
# Resolve workspace
(workspace_name, workspace_id) = resolve_workspace_name_and_id(workspace)
# Define result DataFrame structure
columns = {
"Column1": "string",
"Column2": "string",
"Column3": "int",
}
df = _create_dataframe(columns=columns)
# Make API call
responses = _base_api(
request=f"/v1/workspaces/{workspace_id}/items",
uses_pagination=True,
client="fabric_sp",
)
# Process responses
rows = []
for r in responses:
for item in r.get("value", []):
rows.append({
"Column1": item.get("id"),
"Column2": item.get("name"),
"Column3": item.get("count", 0),
})
if rows:
df = pd.DataFrame(rows)
return df
`
Step 3: Export the Function
From Module File
Add to the module's __init__.py:
`# src/sempy_labs/admin/__init__.py (example for admin submodule)
from ._my_admin_function import my_new_function
__all__ = [
...,
"my_new_function",
]
`
From Main Package
For top-level functions, add to src/sempy_labs/__init__.py:
`from ._my_feature import my_new_function
__all__ = [
...,
"my_new_function",
]
`
Common Patterns
Functions That Modify Resources
`@log
def create_item(
name: str,
workspace: Optional[str | UUID] = None,
) -> None:
"""
Creates a new item.
...
"""
(workspace_name, workspace_id) = resolve_workspace_name_and_id(workspace)
payload = {
"displayName": name,
}
_base_api(
request=f"/v1/workspaces/{workspace_id}/items",
method="post",
payload=payload,
status_codes=[201, 202],
client="fabric_sp",
)
print(
f"{icons.green_dot} The '{name}' item has been successfully created "
f"in the '{workspace_name}' workspace."
)
`
Functions That Delete Resources
`@log
def delete_item(
item: str | UUID,
workspace: Optional[str | UUID] = None,
) -> None:
"""
Deletes an item.
...
"""
(workspace_name, workspace_id) = resolve_workspace_name_and_id(workspace)
item_id = resolve_item_id(item=item, type="ItemType", workspace=workspace_id)
_base_api(
request=f"/v1/workspaces/{workspace_id}/items/{item_id}",
method="delete",
client="fabric_sp",
)
print(
f"{icons.green_dot} The item has been successfully deleted "
f"from the '{workspace_name}' workspace."
)
`
Functions With Long-Running Operations
`@log
def long_running_operation(
item: str | UUID,
workspace: Optional[str | UUID] = None,
) -> dict:
"""
Performs a long-running operation.
...
"""
workspace_id = resolve_workspace_id(workspace)
item_id = resolve_item_id(item=item, type="ItemType", workspace=workspace_id)
# lro_return_json handles polling for completion
result = _base_api(
request=f"/v1/workspaces/{workspace_id}/items/{item_id}/operation",
method="post",
lro_return_json=True,
client="fabric_sp",
)
return result
`
Step 4: Add Tests
Create tests for the new function:
`# tests/test_my_feature.py
import pytest
import pandas as pd
def test_my_new_function_returns_dataframe():
"""Test that my_new_function returns a DataFrame."""
from sempy_labs import my_new_function
# This might require mocking for unit tests
result = my_new_function()
assert isinstance(result, pd.DataFrame)
def test_my_new_function_with_workspace():
"""Test my_new_function with specific workspace."""
from sempy_labs import my_new_function
result = my_new_function(workspace="Test Workspace")
assert isinstance(result, pd.DataFrame)
`
Step 5: Document the Function
Ensure the docstring follows numpydoc style:
- ✅ Short description (one line)
- ✅ Extended description (if needed)
- ✅ API reference link (for wrapper functions)
- ✅ Service Principal note (if supported)
- ✅ All parameters documented with types
- ✅ Return value documented
- ✅ Exceptions documented (if applicable)
Checklist Before Committing
- Function follows naming conventions (
list_,get_,create_, etc.)
@logdecorator is applied
- Complete docstring with numpydoc style
- Type hints for all parameters and return value
Uses standard helper functions (_base_api, resolve_, etc.)
- Function exported in
__init__.py
- Tests written for the new function
- Code formatted with black
- No linting errors
- Documentation builds without warnings
Example: Complete New Function
See _workspaces.py for well-implemented examples:
list_workspace_users— List function returning DataFrame
update_workspace_user— Update function with parameters
delete_user_from_workspace— Delete function with confirmation message
API Documentation Resources
When wrapping REST APIs, reference the official documentation:
APIDocumentationFabric Core APIhttps://learn.microsoft.com/rest/api/fabric/core/Fabric Admin APIhttps://learn.microsoft.com/rest/api/fabric/admin/Power BI REST APIhttps://learn.microsoft.com/rest/api/power-bi/Azure Management APIhttps://learn.microsoft.com/rest/api/resources/
More skills from microsoft
oss-growthby microsoftOSS growth hacker personapr-description-skillby microsoftTrigger this skill on any of the following intents:python-architectureby microsoftPython architect personasupply-chain-securityby microsoftSupply chain security expert personaskill-nameby microsoftDescription of what the skill does and when to use itwork-iterationsby microsoftList, create, and assign iterations for Azure DevOps projects and teams.djangoby microsoftBest practices for Django web development including models, views, templates, and testing.flaskby microsoftBest practices for Flask web development including routing, blueprints, and testing.---
Source: https://github.com/microsoft/semantic-link-labs/tree/HEAD/.claude/skills/add-function
Author: microsoft
Discovered via: mcpservers.org
SKILL.md source
---
name: add-function
description: Guide for adding new functions to the library. Use this when implementing new API wrappers or utility functions.
---
# add-function
Guide for adding new functions to the library. Use this when implementing new API wrappers or utility functions.
# add-functionby microsoft
Guide for adding new functions to the library. Use this when implementing new API wrappers or utility functions.
`npx skills add https://github.com/microsoft/semantic-link-labs --skill add-function`Download ZIPGitHub
## Adding New Functions
This skill covers the workflow for adding new functions to the Semantic Link Labs library.
## When to Use This Skill
Use this skill when you need to:
* Add a new API wrapper function
* Create a new utility function
* Extend existing functionality with new features
* Add functions to submodules (admin, report, lakehouse, etc.)
## Function Categories
CategoryLocationPurposeTop-level functions`src/sempy_labs/_*.py`Main library exportsAdmin functions`src/sempy_labs/admin/`Admin API operationsReport functions`src/sempy_labs/report/`Report operationsLakehouse functions`src/sempy_labs/lakehouse/`Lakehouse operationsDirect Lake functions`src/sempy_labs/directlake/`Direct Lake model operationsTOM methods`src/sempy_labs/tom/_model.py`TOMWrapper class methods
## Step 0: Find the API Documentation
Before implementing an API wrapper, find the relevant API documentation:
```
`# Use the API search tool
cd .claude/skills/rest-api-patterns/scripts
python search_public_api_doc.py "your search query"
# Examples:
python search_public_api_doc.py "workspace users" --source fabric
python search_public_api_doc.py "dataset refresh" --source powerbi
`
```
See the REST API Patterns skill for more details.
## Step 1: Choose the Right Location
### Top-Level Function
For general-purpose functions exported from `sempy_labs`:
```
`# src/sempy_labs/_my_feature.py
`
```
### Submodule Function
For functions belonging to a specific domain:
```
`# src/sempy_labs/admin/_my_admin_function.py
# src/sempy_labs/lakehouse/_my_lakehouse_function.py
# src/sempy_labs/report/_my_report_function.py
`
```
## Step 2: Create the Function
### Required Imports
```
`import pandas as pd
from typing import Optional, List
from uuid import UUID
# Logging decorator from sempy
from sempy._utils._log import log
# Helper functions
from sempy_labs._helper_functions import (
resolve_workspace_name_and_id,
resolve_workspace_id,
_base_api,
_create_dataframe,
)
# Icons for user messages
import sempy_labs._icons as icons
`
```
### Function Template
```
`@log
def my_new_function(
item: str | UUID,
workspace: Optional[str | UUID] = None,
option: str = "default",
) -> pd.DataFrame:
"""
Short description of what the function does.
Extended description with more details about the function's behavior,
use cases, and any important notes.
This is a wrapper function for the following API: `API Name <https://learn.microsoft.com/rest/api/...>`_.
Service Principal Authentication is supported (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
Parameters
----------
item : str | uuid.UUID
The name or ID of the item.
workspace : str | uuid.UUID, default=None
The Fabric workspace name or ID.
Defaults to None which resolves to the workspace of the attached lakehouse
or if no lakehouse attached, resolves to the workspace of the notebook.
option : str, default="default"
An option that controls function behavior.
Returns
-------
pandas.DataFrame
A pandas dataframe showing the results.
Columns include: 'Column1', 'Column2', 'Column3'.
Raises
------
ValueError
If the item does not exist.
FabricHTTPException
If the API request fails.
"""
# Resolve workspace
(workspace_name, workspace_id) = resolve_workspace_name_and_id(workspace)
# Define result DataFrame structure
columns = {
"Column1": "string",
"Column2": "string",
"Column3": "int",
}
df = _create_dataframe(columns=columns)
# Make API call
responses = _base_api(
request=f"/v1/workspaces/{workspace_id}/items",
uses_pagination=True,
client="fabric_sp",
)
# Process responses
rows = []
for r in responses:
for item in r.get("value", []):
rows.append({
"Column1": item.get("id"),
"Column2": item.get("name"),
"Column3": item.get("count", 0),
})
if rows:
df = pd.DataFrame(rows)
return df
`
```
## Step 3: Export the Function
### From Module File
Add to the module's `__init__.py`:
```
`# src/sempy_labs/admin/__init__.py (example for admin submodule)
from ._my_admin_function import my_new_function
__all__ = [
...,
"my_new_function",
]
`
```
### From Main Package
For top-level functions, add to `src/sempy_labs/__init__.py`:
```
`from ._my_feature import my_new_function
__all__ = [
...,
"my_new_function",
]
`
```
## Common Patterns
### Functions That Modify Resources
```
`@log
def create_item(
name: str,
workspace: Optional[str | UUID] = None,
) -> None:
"""
Creates a new item.
...
"""
(workspace_name, workspace_id) = resolve_workspace_name_and_id(workspace)
payload = {
"displayName": name,
}
_base_api(
request=f"/v1/workspaces/{workspace_id}/items",
method="post",
payload=payload,
status_codes=[201, 202],
client="fabric_sp",
)
print(
f"{icons.green_dot} The '{name}' item has been successfully created "
f"in the '{workspace_name}' workspace."
)
`
```
### Functions That Delete Resources
```
`@log
def delete_item(
item: str | UUID,
workspace: Optional[str | UUID] = None,
) -> None:
"""
Deletes an item.
...
"""
(workspace_name, workspace_id) = resolve_workspace_name_and_id(workspace)
item_id = resolve_item_id(item=item, type="ItemType", workspace=workspace_id)
_base_api(
request=f"/v1/workspaces/{workspace_id}/items/{item_id}",
method="delete",
client="fabric_sp",
)
print(
f"{icons.green_dot} The item has been successfully deleted "
f"from the '{workspace_name}' workspace."
)
`
```
### Functions With Long-Running Operations
```
`@log
def long_running_operation(
item: str | UUID,
workspace: Optional[str | UUID] = None,
) -> dict:
"""
Performs a long-running operation.
...
"""
workspace_id = resolve_workspace_id(workspace)
item_id = resolve_item_id(item=item, type="ItemType", workspace=workspace_id)
# lro_return_json handles polling for completion
result = _base_api(
request=f"/v1/workspaces/{workspace_id}/items/{item_id}/operation",
method="post",
lro_return_json=True,
client="fabric_sp",
)
return result
`
```
## Step 4: Add Tests
Create tests for the new function:
```
`# tests/test_my_feature.py
import pytest
import pandas as pd
def test_my_new_function_returns_dataframe():
"""Test that my_new_function returns a DataFrame."""
from sempy_labs import my_new_function
# This might require mocking for unit tests
result = my_new_function()
assert isinstance(result, pd.DataFrame)
def test_my_new_function_with_workspace():
"""Test my_new_function with specific workspace."""
from sempy_labs import my_new_function
result = my_new_function(workspace="Test Workspace")
assert isinstance(result, pd.DataFrame)
`
```
## Step 5: Document the Function
Ensure the docstring follows numpydoc style:
* ✅ Short description (one line)
* ✅ Extended description (if needed)
* ✅ API reference link (for wrapper functions)
* ✅ Service Principal note (if supported)
* ✅ All parameters documented with types
* ✅ Return value documented
* ✅ Exceptions documented (if applicable)
## Checklist Before Committing
* Function follows naming conventions (`list_`, `get_`, `create_`, etc.)
* `@log` decorator is applied
* Complete docstring with numpydoc style
* Type hints for all parameters and return value
* Uses standard helper functions (`_base_api`, `resolve_*`, etc.)
* Function exported in `__init__.py`
* Tests written for the new function
* Code formatted with black
* No linting errors
* Documentation builds without warnings
## Example: Complete New Function
See _workspaces.py for well-implemented examples:
* `list_workspace_users` — List function returning DataFrame
* `update_workspace_user` — Update function with parameters
* `delete_user_from_workspace` — Delete function with confirmation message
## API Documentation Resources
When wrapping REST APIs, reference the official documentation:
APIDocumentationFabric Core APIhttps://learn.microsoft.com/rest/api/fabric/core/Fabric Admin APIhttps://learn.microsoft.com/rest/api/fabric/admin/Power BI REST APIhttps://learn.microsoft.com/rest/api/power-bi/Azure Management APIhttps://learn.microsoft.com/rest/api/resources/
## More skills from microsoft
oss-growthby microsoftOSS growth hacker personapr-description-skillby microsoftTrigger this skill on any of the following intents:python-architectureby microsoftPython architect personasupply-chain-securityby microsoftSupply chain security expert personaskill-nameby microsoftDescription of what the skill does and when to use itwork-iterationsby microsoftList, create, and assign iterations for Azure DevOps projects and teams.djangoby microsoftBest practices for Django web development including models, views, templates, and testing.flaskby microsoftBest practices for Flask web development including routing, blueprints, and testing.
---
**Source**: https://github.com/microsoft/semantic-link-labs/tree/HEAD/.claude/skills/add-function
**Author**: microsoft
**Discovered via**: mcpservers.org
Related skills 6
caveman
Ultra-compressed communication mode. Cuts token usage ~75% by speaking like caveman while keeping full technical accuracy. Supports intensity levels: lite, full (default), ultra, wenyan-lite, wenyan-full, wenyan-ultra. Use when user says "caveman mode", "talk like caveman", "use caveman", "less tokens", "be brief", or invokes /caveman. Also auto-triggers when token efficiency is requested.
secure-linux-web-hosting
Use when setting up, hardening, or reviewing a cloud server for self-hosting, including DNS, SSH, firewalls, Nginx, static-site hosting, reverse-proxying an app, HTTPS with Let's Encrypt or ACME clients, safe HTTP-to-HTTPS redirects, or optional post-launch network tuning such as BBR.
readme-i18n
Use when the user wants to translate a repository README, make a repo multilingual, localize docs, add a language switcher, internationalize the README, or update localized README variants in a GitHub-style repository.
lark-shared
Use when first setting up lark-cli, running auth login, switching user/bot identity (--as), handling permission denied or scope errors, needing to update lark-cli, or seeing _notice in JSON output.
improve-codebase-architecture
Find deepening opportunities in a codebase, informed by the domain language in CONTEXT.md and the decisions in docs/adr/. Use when the user wants to improve architecture, find refactoring opportunities, consolidate tightly-coupled modules, or make a codebase more testable and AI-navigable.
paper-context-resolver
Optional RigorPilot helper for README-first deep learning repo reproduction. Use only when the README and repository files leave a narrow reproduction-critical gap and the task is to resolve a specific paper detail such as dataset split, preprocessing, evaluation protocol, checkpoint mapping, or runtime assumption from primary paper sources while recording conflicts. Do not use for general paper summary, repo scanning, environment setup, command execution, title-only paper lookup, or replacin...