Tool Modifiers
Tool modifiers intercept and modify tool inputs and outputs using decorators.
- Pre-modifiers: Modify tool inputs before execution
- Post-modifiers: Modify tool outputs after execution
Pre-Modifiers
Section titled “Pre-Modifiers”Pre-modifiers modify tool inputs before execution.
Use Cases
Section titled “Use Cases”- Enforce consistent filters or constraints
- Add security parameters or validate inputs
- Override LLM decisions with required behavior
- Set default configurations
Example: Gmail Unread Filter
Section titled “Example: Gmail Unread Filter”from scalekit.actions.models.tool_input_output import ToolInput
# For example, we can modify the query to only fetch unread emails# regardless of what the user asks for or what the LLM determines.@actions.pre_modifier(tool_names=["gmail_fetch_mails"])def gmail_pre_modifier(tool_input: ToolInput): tool_input['query'] = 'is:unread' return tool_inputThis modifier:
- Intercepts all calls to
gmail_fetch_mails - Forces the query to always search for unread emails only
- Ensures consistent behavior regardless of user input or LLM interpretation
Multiple Tools Example
Section titled “Multiple Tools Example”@actions.pre_modifier(tool_names=["gmail_fetch_mails", "gmail_search_emails"])def email_security_modifier(tool_input: ToolInput): # Add security constraints to all email operations tool_input['include_spam'] = False tool_input['max_results'] = min(tool_input.get('max_results', 10), 50) return tool_inputPost-Modifiers
Section titled “Post-Modifiers”Post-modifiers modify tool outputs after execution.
Use Cases
Section titled “Use Cases”- Reduce token usage by filtering large responses
- Transform formats for LLM consumption
- Extract specific data from responses
- Standardize output structure
Example: Gmail Response Filtering
Section titled “Example: Gmail Response Filtering”from scalekit.actions.models.tool_input_output import ToolOutput
# Sometimes, the tool output needs to be modified in a deterministic way after the tool is executed.# For example, we can modify the output to only return the first email snippet regardless of what the tool returns.# This is an effective way to reduce the amount of data that is returned to the LLM to save on tokens.@actions.post_modifier(tool_names=["gmail_fetch_mails"])def gmail_post_modifier(output: ToolOutput): # Only return the first email snippet # Should return a dict # Response should be a dict with a key 'response' for snippet in output['messages']: print(f"Email snippet: {snippet['snippet']}") return {"response": output['messages'][0]['snippet']}This modifier:
- Processes the response from
gmail_fetch_mails - Extracts only the first email snippet instead of returning all emails
- Reduces token usage by sending minimal data to the LLM