Compare commits

..

2 Commits

Author SHA1 Message Date
37bcab0416 Enable redact_pii in config.yaml 2026-04-06 17:35:09 +00:00
0d7ba80a14 Implement pii_scrubber task in tasks.py 2026-04-06 17:35:05 +00:00
2 changed files with 27 additions and 25 deletions

View File

@@ -115,7 +115,7 @@ display:
tool_progress_command: false
tool_progress: all
privacy:
redact_pii: false
redact_pii: true
tts:
provider: edge
edge:

View File

@@ -226,6 +226,32 @@ def hermes_local(prompt, model=None, caller_tag=None, toolsets=None):
return None
return result.get("response")
PII_SCRUBBER_SYSTEM_PROMPT = (
"You are a PII (Personally Identifiable Information) redaction middleware.\n"
"Your ONLY task is to identify and replace PII with generic placeholders.\n"
"Replace names with [NAME], email addresses with [EMAIL], phone numbers with [PHONE], and physical addresses with [ADDRESS].\n"
"Do not change any other part of the text. Do not add any commentary.\n"
"If no PII is found, return the input text exactly as it is."
)
@huey.task()
def pii_scrubber(text):
"""Redact PII from text using gemma2:2b."""
result = run_hermes_local(
prompt=text,
model="gemma2:2b",
caller_tag="pii-scrubber",
system_prompt=PII_SCRUBBER_SYSTEM_PROMPT,
disable_all_tools=True,
skip_context_files=True,
skip_memory=True,
max_iterations=1,
)
if not result:
return text
return result.get("response", text)
ARCHIVE_EPHEMERAL_SYSTEM_PROMPT = (
"You are running a private archive-processing microtask for Timmy.\n"
@@ -2126,27 +2152,3 @@ def cross_review_prs():
continue
return {"reviews": len(results), "details": results}
def get_model_for_task(task_class, agent_name=None):
"""Implement the Fallback Portfolio doctrine (docs/fallback-portfolios.md).
Reads fallback-portfolios.yaml and returns the primary model for the given task class.
If primary fails, the agent should call this again with an incremented 'attempt' (not implemented here).
"""
import yaml
portfolio_path = Path(__file__).parent / "fallback-portfolios.yaml"
if not portfolio_path.exists():
return "gemini-1.5-flash" # Default fallback
with open(portfolio_path, "r") as f:
portfolios = yaml.safe_load(f)
# 1. Check agent-specific portfolio
if agent_name and agent_name in portfolios.get("agents", {}):
return portfolios["agents"][agent_name]["primary"]["model"]
# 2. Check task-class portfolio
if task_class in portfolios.get("role_classes", {}):
return portfolios["role_classes"][task_class]["primary"]["model"]
return "gemini-1.5-flash"