Opt-in persistent cross-session user modeling via Honcho. Reads ~/.honcho/config.json as single source of truth (shared with Claude Code, Cursor, and other Honcho-enabled tools). Zero impact when disabled or unconfigured. - honcho_integration/ package (client, session manager, peer resolution) - Host-based config resolution matching claude-honcho/cursor-honcho pattern - Prefetch user context into system prompt per conversation turn - Sync user/assistant messages to Honcho after each exchange - query_user_context tool for mid-conversation dialectic reasoning - Gated activation: requires ~/.honcho/config.json with enabled=true
103 lines
3.2 KiB
Python
103 lines
3.2 KiB
Python
"""Honcho tool for querying user context via dialectic reasoning.
|
|
|
|
Registers ``query_user_context`` -- an LLM-callable tool that asks Honcho
|
|
about the current user's history, preferences, goals, and communication
|
|
style. The session key is injected at runtime by the agent loop via
|
|
``set_session_context()``.
|
|
"""
|
|
|
|
import json
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
# ── Module-level state (injected by AIAgent at init time) ──
|
|
|
|
_session_manager = None # HonchoSessionManager instance
|
|
_session_key: str | None = None # Current session key (e.g., "telegram:123456")
|
|
|
|
|
|
def set_session_context(session_manager, session_key: str) -> None:
|
|
"""Register the active Honcho session manager and key.
|
|
|
|
Called by AIAgent.__init__ when Honcho is enabled.
|
|
"""
|
|
global _session_manager, _session_key
|
|
_session_manager = session_manager
|
|
_session_key = session_key
|
|
|
|
|
|
def clear_session_context() -> None:
|
|
"""Clear session context (for testing or shutdown)."""
|
|
global _session_manager, _session_key
|
|
_session_manager = None
|
|
_session_key = None
|
|
|
|
|
|
# ── Tool schema ──
|
|
|
|
HONCHO_TOOL_SCHEMA = {
|
|
"name": "query_user_context",
|
|
"description": (
|
|
"Query Honcho to retrieve relevant context about the user based on their "
|
|
"history and preferences. Use this when you need to understand the user's "
|
|
"background, preferences, past interactions, or goals. This helps you "
|
|
"personalize your responses and provide more relevant assistance."
|
|
),
|
|
"parameters": {
|
|
"type": "object",
|
|
"properties": {
|
|
"query": {
|
|
"type": "string",
|
|
"description": (
|
|
"A natural language question about the user. Examples: "
|
|
"'What are this user's main goals?', "
|
|
"'What communication style does this user prefer?', "
|
|
"'What topics has this user discussed recently?', "
|
|
"'What is this user's technical expertise level?'"
|
|
),
|
|
}
|
|
},
|
|
"required": ["query"],
|
|
},
|
|
}
|
|
|
|
|
|
# ── Tool handler ──
|
|
|
|
def _handle_query_user_context(args: dict, **kw) -> str:
|
|
"""Execute the Honcho context query."""
|
|
query = args.get("query", "")
|
|
if not query:
|
|
return json.dumps({"error": "Missing required parameter: query"})
|
|
|
|
if not _session_manager or not _session_key:
|
|
return json.dumps({"error": "Honcho is not active for this session."})
|
|
|
|
try:
|
|
result = _session_manager.get_user_context(_session_key, query)
|
|
return json.dumps({"result": result})
|
|
except Exception as e:
|
|
logger.error("Error querying Honcho user context: %s", e)
|
|
return json.dumps({"error": f"Failed to query user context: {e}"})
|
|
|
|
|
|
# ── Availability check ──
|
|
|
|
def _check_honcho_available() -> bool:
|
|
"""Tool is only available when Honcho is active."""
|
|
return _session_manager is not None and _session_key is not None
|
|
|
|
|
|
# ── Registration ──
|
|
|
|
from tools.registry import registry
|
|
|
|
registry.register(
|
|
name="query_user_context",
|
|
toolset="honcho",
|
|
schema=HONCHO_TOOL_SCHEMA,
|
|
handler=_handle_query_user_context,
|
|
check_fn=_check_honcho_available,
|
|
)
|