Files
manual_slop/src/tool_bias.py

67 lines
2.1 KiB
Python

from typing import List, Dict, Any, Optional
from src.models import Tool, ToolPreset, BiasProfile
class ToolBiasEngine:
def apply_semantic_nudges(self, tool_definitions: List[Dict[str, Any]], preset: ToolPreset) -> List[Dict[str, Any]]:
weight_map = {
5: "[HIGH PRIORITY] ",
4: "[PREFERRED] ",
2: "[NOT RECOMMENDED] ",
1: "[LOW PRIORITY] "
}
preset_tools: Dict[str, Tool] = {}
for cat_tools in preset.categories.values():
for t in cat_tools:
if isinstance(t, Tool):
preset_tools[t.name] = t
for defn in tool_definitions:
name = defn.get("name")
if name in preset_tools:
tool = preset_tools[name]
prefix = weight_map.get(tool.weight, "")
if prefix:
defn["description"] = prefix + defn.get("description", "")
if tool.parameter_bias:
params = defn.get("parameters") or defn.get("input_schema")
if params and "properties" in params:
props = params["properties"]
for p_name, bias in tool.parameter_bias.items():
if p_name in props:
p_desc = props[p_name].get("description", "")
props[p_name]["description"] = f"[{bias}] {p_desc}".strip()
return tool_definitions
def generate_tooling_strategy(self, preset: ToolPreset, global_bias: BiasProfile) -> str:
lines = ["### Tooling Strategy"]
preferred = []
low_priority = []
for cat_tools in preset.categories.values():
for t in cat_tools:
if not isinstance(t, Tool): continue
if t.weight >= 5:
preferred.append(f"{t.name} [HIGH PRIORITY]")
elif t.weight == 4:
preferred.append(f"{t.name} [PREFERRED]")
elif t.weight == 2:
low_priority.append(f"{t.name} [NOT RECOMMENDED]")
elif t.weight <= 1:
low_priority.append(f"{t.name} [LOW PRIORITY]")
if preferred:
lines.append(f"Preferred tools: {', '.join(preferred)}.")
if low_priority:
lines.append(f"Low-priority tools: {', '.join(low_priority)}.")
if global_bias.category_multipliers:
lines.append("Category focus multipliers:")
for cat, mult in global_bias.category_multipliers.items():
lines.append(f"- {cat}: {mult}x")
return "\n\n".join(lines)