feat: Add presence heartbeat for Matrix online status
- 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
This commit is contained in:
74
services/agent-runtime/llm_client.py
Normal file
74
services/agent-runtime/llm_client.py
Normal file
@@ -0,0 +1,74 @@
|
||||
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. Що вас цікавить?"
|
||||
|
||||
Reference in New Issue
Block a user