- matrix-gateway: POST /internal/matrix/presence/online endpoint - usePresenceHeartbeat hook with activity tracking - Auto away after 5 min inactivity - Offline on page close/visibility change - Integrated in MatrixChatRoom component
75 lines
3.7 KiB
Python
75 lines
3.7 KiB
Python
import httpx
|
||
import os
|
||
|
||
LLM_PROXY_URL = os.getenv("LLM_PROXY_URL", "http://llm-proxy:7007")
|
||
|
||
async def generate_response(model: str, messages: list[dict], max_tokens: int = 1000) -> str:
|
||
"""
|
||
Call LLM Proxy to generate response
|
||
|
||
Falls back to mock response if LLM Proxy is not available
|
||
"""
|
||
try:
|
||
async with httpx.AsyncClient(timeout=30.0) as client:
|
||
response = await client.post(
|
||
f"{LLM_PROXY_URL}/internal/llm/proxy",
|
||
headers={
|
||
"X-Internal-Secret": os.getenv("LLM_PROXY_SECRET", "dev-secret-token"),
|
||
"Content-Type": "application/json"
|
||
},
|
||
json={
|
||
"model": model,
|
||
"messages": messages,
|
||
"max_tokens": max_tokens,
|
||
"metadata": {
|
||
"agent_id": "agent:runtime",
|
||
"microdao_id": "microdao:daarion"
|
||
}
|
||
}
|
||
)
|
||
response.raise_for_status()
|
||
data = response.json()
|
||
return data.get("content", "")
|
||
except httpx.HTTPStatusError as e:
|
||
print(f"⚠️ LLM Proxy HTTP error: {e.response.status_code}")
|
||
return await generate_mock_response(messages)
|
||
except httpx.ConnectError:
|
||
print(f"⚠️ LLM Proxy not available, using mock response")
|
||
return await generate_mock_response(messages)
|
||
except Exception as e:
|
||
print(f"⚠️ LLM error: {e}")
|
||
return await generate_mock_response(messages)
|
||
|
||
async def generate_mock_response(messages: list[dict]) -> str:
|
||
"""
|
||
Generate mock response based on user message
|
||
|
||
This is used when LLM Proxy is not available (Phase 2 testing)
|
||
"""
|
||
# Extract last user message
|
||
user_message = ""
|
||
for msg in reversed(messages):
|
||
if msg.get("role") == "user":
|
||
user_message = msg.get("content", "").lower()
|
||
break
|
||
|
||
# Simple keyword-based responses
|
||
if "привіт" in user_message or "hello" in user_message or "hi" in user_message:
|
||
return "Привіт! Я Sofia, асистент команди DAARION. Як можу допомогти?"
|
||
|
||
if "допомож" in user_message or "help" in user_message:
|
||
return "Звичайно! Я можу допомогти з:\n- Плануванням задач\n- Підсумуванням обговорень\n- Організацією проєктів\n- Відповідями на питання про систему\n\nПро що хочете поговорити?"
|
||
|
||
if "дяку" in user_message or "thank" in user_message:
|
||
return "Завжди радий допомогти! 😊"
|
||
|
||
if "phase 2" in user_message or "фаза 2" in user_message:
|
||
return "Phase 2 — це інтеграція агентів у Messenger! Я вже працюю через agent-runtime, agent-filter та DAGI Router. Це дозволяє мені автоматично відповідати на повідомлення в каналах. 🚀"
|
||
|
||
if "?" in user_message:
|
||
return "Це цікаве питання! На даний момент я використовую mock LLM (Phase 2 testing mode). Коли буде підключено справжній LLM Proxy, я зможу давати більш розгорнуті відповіді."
|
||
|
||
# Default response
|
||
return "Дякую за повідомлення! Я Sofia, і я тут щоб допомогти. Зараз працюю в тестовому режимі (Phase 2), але скоро буду підключена до повноцінного LLM. Що вас цікавить?"
|
||
|