senti-beta / senti /backend /api /write_layer.py
joseph njoroge kariuki
Deploy Senti AI to Hugging Face Spaces
021e065
from backend.database.postgres.models import RequestLog, Conversation, ResponseLawLog, AuditLog
from core.state_machine import state_machine
from core.payment_gateway import payment_gateway
from core.sms_gateway import sms_gateway
from layers.layer_4_logic.invoicing_engine import invoicing_engine
from layers.layer_4_logic.inventory_manager import inventory_manager
from layers.layer_4_logic.dataset_builder import dataset_builder
from core.legal_intelligence import legal_intelligence
import uuid
import hashlib
from datetime import datetime
async def execute(query: str, user_hash: str, user_name: str, jurisdiction: str, language: str, db):
"""
Refactored execute method for write layer.
"""
return {"sms_sent": False, "invoice": None, "sms_confirmation": ""}
async def execute_actions(actions: list, context: dict, db):
results = []
for action in actions:
if action['type'] == "record_sale":
sale = action['data']
inventory_manager.update_stock(
sale['item'], sale['quantity'],
user_id=context['user_address']
)
invoice = invoicing_engine.generate_invoice(
seller_name=f"{context['user_address']}'s Shop",
items=sale['items'],
total=sale['revenue'],
user_id=context['user_address']
)
results.append({"type": "invoice", "data": invoice})
elif action['type'] == "request_payment":
data = action['data']
res = await payment_gateway.request_payment(
from_phone=data['phone'],
amount=data['amount'],
reference=str(uuid.uuid4())[:8],
description="Payment Request",
seller_name=context['user_address']
)
results.append({"type": "payment_request", "data": res})
elif action['type'] == "send_receipt":
data = action['data']
# We would typically need the receipt text here
# For now, placeholder
res = sms_gateway.send_receipt(
phone_number=data['phone'],
receipt_text="Receipt from Senti"
)
results.append({"type": "sms", "data": res})
return results
async def log_audit(query, domain_info, analysis, laws_applied, db, user_address, response_text, response_id):
# Log to RequestLog
req_log = RequestLog(
api_key_id=0,
endpoint="/process",
country_code=domain_info.get('country_code', 'KE'),
intent_detected=domain_info['primary_domain'],
response_time_ms=0, # updated later
status_code=200,
timestamp=datetime.utcnow()
)
db.add(req_log)
# Log to Conversation
conv = Conversation(
user_id=user_address,
query=query,
response=response_text,
intent=domain_info['primary_domain'],
country_code=domain_info.get('country_code', 'KE'),
timestamp=datetime.utcnow()
)
db.add(conv)
# Log to ResponseLawLog
for rule in laws_applied:
law_log = ResponseLawLog(
id=str(uuid.uuid4()),
response_id=response_id,
rule_id=rule.rule_id,
jurisdiction=rule.jurisdiction,
domain=rule.domain,
rule_version="1.0",
source_url=rule.source_url,
applied_at=datetime.utcnow(),
disclaimer_applied=rule.requires_disclaimer,
advice_restricted=rule.restricts_advice,
calculation_used=domain_info['primary_domain'] in ["TAXATION", "LENDING"]
)
db.add(law_log)
db.commit()
def record_consent(user_hash, language, db):
from core.consent_engine import consent_engine
return consent_engine.record_consent(user_hash, language, db)