| 196 | |
| 197 | |
| 198 | class MemosApiOnlineClient: |
| 199 | def __init__(self): |
| 200 | self.memos_url = os.getenv("MEMOS_ONLINE_URL") |
| 201 | self.headers = {"Content-Type": "application/json", "Authorization": os.getenv("MEMOS_KEY")} |
| 202 | |
| 203 | def add(self, messages, user_id, conv_id=None, batch_size: int = 9999): |
| 204 | url = f"{self.memos_url}/add/message" |
| 205 | for i in range(0, len(messages), batch_size): |
| 206 | batch_messages = messages[i : i + batch_size] |
| 207 | payload = json.dumps( |
| 208 | { |
| 209 | "messages": batch_messages, |
| 210 | "user_id": user_id, |
| 211 | "conversation_id": conv_id, |
| 212 | } |
| 213 | ) |
| 214 | |
| 215 | max_retries = 5 |
| 216 | for attempt in range(max_retries): |
| 217 | try: |
| 218 | response = requests.request("POST", url, data=payload, headers=self.headers) |
| 219 | assert response.status_code == 200, response.text |
| 220 | assert json.loads(response.text)["message"] == "ok", response.text |
| 221 | break |
| 222 | except Exception as e: |
| 223 | if attempt < max_retries - 1: |
| 224 | time.sleep(2**attempt) |
| 225 | else: |
| 226 | raise e |
| 227 | |
| 228 | def search(self, query, user_id, top_k): |
| 229 | """Search memories.""" |
| 230 | url = f"{self.memos_url}/search/memory" |
| 231 | payload = json.dumps( |
| 232 | { |
| 233 | "query": query, |
| 234 | "user_id": user_id, |
| 235 | "memory_limit_number": top_k, |
| 236 | "mode": os.getenv("SEARCH_MODE", "fast"), |
| 237 | "include_preference": True, |
| 238 | "pref_top_k": 6, |
| 239 | } |
| 240 | ) |
| 241 | |
| 242 | max_retries = 5 |
| 243 | for attempt in range(max_retries): |
| 244 | try: |
| 245 | response = requests.request("POST", url, data=payload, headers=self.headers) |
| 246 | assert response.status_code == 200, response.text |
| 247 | assert json.loads(response.text)["message"] == "ok", response.text |
| 248 | text_mem_res = json.loads(response.text)["data"]["memory_detail_list"] |
| 249 | pref_mem_res = json.loads(response.text)["data"]["preference_detail_list"] |
| 250 | preference_note = json.loads(response.text)["data"]["preference_note"] |
| 251 | for i in text_mem_res: |
| 252 | i.update({"memory": i.pop("memory_value")}) |
| 253 | explicit_pref_string = "Explicit Preference:" |
| 254 | implicit_pref_string = "\n\nImplicit Preference:" |
| 255 | explicit_idx = 0 |
no outgoing calls
no test coverage detected