47 lines
1.9 KiB
Python
47 lines
1.9 KiB
Python
from sqlalchemy import select
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.db import AuditLogORM, SettingORM, ToolStateORM
|
|
from app.llm.planner import build_prompt_context
|
|
from app.memory.store import MemoryService
|
|
from app.models import RuntimeSettings
|
|
from app.telegram.auth import is_authorized
|
|
|
|
|
|
class WiseClawOrchestrator:
|
|
def __init__(self, session: Session) -> None:
|
|
self.session = session
|
|
self.memory = MemoryService(session)
|
|
|
|
def get_runtime_settings(self) -> RuntimeSettings:
|
|
settings = {
|
|
item.key: item.value for item in self.session.scalars(select(SettingORM))
|
|
}
|
|
tools = list(self.session.scalars(select(ToolStateORM).order_by(ToolStateORM.name.asc())))
|
|
return RuntimeSettings(
|
|
terminal_mode=int(settings["terminal_mode"]),
|
|
search_provider=settings["search_provider"],
|
|
ollama_base_url=settings["ollama_base_url"],
|
|
default_model=settings["default_model"],
|
|
tools=[{"name": tool.name, "enabled": tool.enabled} for tool in tools],
|
|
)
|
|
|
|
def handle_text_message(self, telegram_user_id: int, text: str) -> str:
|
|
if not is_authorized(self.session, telegram_user_id):
|
|
return "This Telegram user is not authorized for WiseClaw."
|
|
|
|
self.memory.add_item(f"user:{telegram_user_id}:{text}")
|
|
context = build_prompt_context(
|
|
message=text,
|
|
runtime=self.get_runtime_settings(),
|
|
memory=self.memory.latest_items(limit=5),
|
|
)
|
|
response = (
|
|
"WiseClaw scaffold received your message.\n\n"
|
|
f"Prompt context prepared for model `{context['model']}` with "
|
|
f"{len(context['memory'])} memory items."
|
|
)
|
|
self.session.add(AuditLogORM(category="telegram", message=f"telegram:{telegram_user_id}:{text}"))
|
|
self.session.commit()
|
|
return response
|