File size: 4,950 Bytes
e91e2b4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
import os
from datetime import datetime

import requests

# Backend server URL - can be set via environment variable
# For Hugging Face Spaces: Set MEMORY_SERVER_URL in Space settings (Repository secrets)
# For local development: Set MEMORY_SERVER_URL in your .env file
# Default: http://3.232.95.65:8080 (MemMachine backend)
EXAMPLE_SERVER_PORT = os.getenv("MEMORY_SERVER_URL")



def ingest_and_rewrite(user_id: str, query: str, model_type: str = "openai") -> str:
    """Pass a raw user message through the memory server and get context-aware response."""
    print("entered ingest_and_rewrite")

    # First, store the message in memory
    session_data = {
        "group_id": user_id,
        "agent_id": ["assistant"],
        "user_id": [user_id],
        "session_id": f"session_{user_id}",
    }
    episode_data = {
        "session": session_data,
        "producer": user_id,
        "produced_for": "assistant",
        "episode_content": query,
        "episode_type": "message",
        "metadata": {
            "speaker": user_id,
            "timestamp": datetime.now().isoformat(),
            "type": "message",
        },
    }

    # Store the episode
    store_resp = requests.post(
        f"{EXAMPLE_SERVER_PORT}/memory",
        json=episode_data,
        timeout=1000,
    )
    store_resp.raise_for_status()

    # Then search for relevant context
    search_data = {
        "session": session_data,
        "query": query,
        "limit": 5,
        "filter": {"producer_id": user_id},
    }

    search_resp = requests.post(
        f"{EXAMPLE_SERVER_PORT}/memory/search",
        json=search_data,
        timeout=1000,
    )
    search_resp.raise_for_status()

    search_results = search_resp.json()
    content = search_results.get("content", {})
    episodic_memory = content.get("episodic_memory", [])
    profile_memory = content.get("profile_memory", [])

    # Format the response similar to example_server.py
    if profile_memory and episodic_memory:
        profile_str = "\n".join([str(p) for p in profile_memory]) if isinstance(profile_memory, list) else str(profile_memory)
        context_str = "\n".join([str(c) for c in episodic_memory]) if isinstance(episodic_memory, list) else str(episodic_memory)
        return f"Profile: {profile_str}\n\nContext: {context_str}\n\nQuery: {query}"
    elif profile_memory:
        profile_str = "\n".join([str(p) for p in profile_memory]) if isinstance(profile_memory, list) else str(profile_memory)
        return f"Profile: {profile_str}\n\nQuery: {query}"
    elif episodic_memory:
        context_str = "\n".join([str(c) for c in episodic_memory]) if isinstance(episodic_memory, list) else str(episodic_memory)
        return f"Context: {context_str}\n\nQuery: {query}"
    else:
        return f"Message ingested successfully. No relevant context found yet.\n\nQuery: {query}"


def add_session_message(user_id: str, msg: str) -> None:
    """Add a raw message into memory via memory server."""
    session_data = {
        "group_id": user_id,
        "agent_id": ["assistant"],
        "user_id": [user_id],
        "session_id": f"session_{user_id}",
    }
    episode_data = {
        "session": session_data,
        "producer": user_id,
        "produced_for": "assistant",
        "episode_content": msg,
        "episode_type": "message",
        "metadata": {
            "speaker": user_id,
            "timestamp": datetime.now().isoformat(),
            "type": "message",
        },
    }
    requests.post(
        f"{EXAMPLE_SERVER_PORT}/memory",
        json=episode_data,
        timeout=5,
    )


def create_persona_query(user_id: str, query: str) -> str:
    """Create a persona-aware query by searching memory context via memory server."""
    session_data = {
        "group_id": user_id,
        "agent_id": ["assistant"],
        "user_id": [user_id],
        "session_id": f"session_{user_id}",
    }
    search_data = {
        "session": session_data,
        "query": query,
        "limit": 5,
        "filter": {"producer_id": user_id},
    }

    resp = requests.post(
        f"{EXAMPLE_SERVER_PORT}/memory/search",
        json=search_data,
        timeout=1000,
    )
    resp.raise_for_status()

    search_results = resp.json()
    content = search_results.get("content", {})
    profile_memory = content.get("profile_memory", [])

    if profile_memory:
        profile_str = "\n".join([str(p) for p in profile_memory]) if isinstance(profile_memory, list) else str(profile_memory)
        return f"Based on your profile: {profile_str}\n\nQuery: {query}"
    else:
        return f"Query: {query}"


def add_new_session_message(user_id: str, msg: str) -> None:
    """Alias for add_session_message for backward compatibility."""
    add_session_message(user_id, msg)


def delete_profile(user_id: str) -> bool:
    """Delete all memory for the given user_id via the CRM server."""
    # NOT IMPLEMENTED
    return False