diff options
| author | Dhravya Shah <[email protected]> | 2026-01-18 16:55:32 -0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-01-18 16:55:32 -0800 |
| commit | 87b361c26bf5fc16049cd2727825891aa14b8e8b (patch) | |
| tree | c2f9f4f6223a7c1734578b772a16490ba2eb8b96 /packages/openai-sdk-python | |
| parent | Add Claude Code GitHub Workflow (#681) (diff) | |
| download | supermemory-87b361c26bf5fc16049cd2727825891aa14b8e8b.tar.xz supermemory-87b361c26bf5fc16049cd2727825891aa14b8e8b.zip | |
docs changes (#678)
Co-authored-by: Claude Opus 4.5 <[email protected]>
Diffstat (limited to 'packages/openai-sdk-python')
| -rw-r--r-- | packages/openai-sdk-python/src/supermemory_openai/middleware.py | 114 | ||||
| -rw-r--r-- | packages/openai-sdk-python/src/supermemory_openai/tools.py | 8 |
2 files changed, 73 insertions, 49 deletions
diff --git a/packages/openai-sdk-python/src/supermemory_openai/middleware.py b/packages/openai-sdk-python/src/supermemory_openai/middleware.py index e2399bb6..4f6dc8ec 100644 --- a/packages/openai-sdk-python/src/supermemory_openai/middleware.py +++ b/packages/openai-sdk-python/src/supermemory_openai/middleware.py @@ -1,31 +1,31 @@ """Supermemory middleware for OpenAI clients.""" -from dataclasses import dataclass -from typing import Optional, Union, Any, Literal, cast import asyncio import os +from dataclasses import dataclass +from typing import Any, Literal, Optional, Union, cast -from openai import OpenAI, AsyncOpenAI +import supermemory +from openai import AsyncOpenAI, OpenAI from openai.types.chat import ( ChatCompletionMessageParam, ChatCompletionSystemMessageParam, ) -import supermemory -from .utils import ( - Logger, - create_logger, - get_last_user_message, - get_conversation_content, - convert_profile_to_markdown, - deduplicate_memories, -) from .exceptions import ( - SupermemoryConfigurationError, SupermemoryAPIError, + SupermemoryConfigurationError, SupermemoryMemoryOperationError, SupermemoryNetworkError, ) +from .utils import ( + Logger, + convert_profile_to_markdown, + create_logger, + deduplicate_memories, + get_conversation_content, + get_last_user_message, +) @dataclass @@ -75,7 +75,7 @@ async def supermemory_profile_search( raise SupermemoryAPIError( "Supermemory profile search failed", status_code=response.status, - response_text=error_text + response_text=error_text, ) data = await response.json() @@ -98,7 +98,7 @@ async def supermemory_profile_search( raise SupermemoryAPIError( "Supermemory profile search failed", status_code=response.status_code, - response_text=response.text + response_text=response.text, ) return SupermemoryProfileSearch(response.json()) @@ -146,9 +146,18 @@ async def add_system_prompt( logger.debug( "Memory deduplication completed", { - "static": {"original": memory_count_static, "deduplicated": len(deduplicated.static)}, - "dynamic": {"original": memory_count_dynamic, "deduplicated": len(deduplicated.dynamic)}, - "search_results": {"original": memory_count_search, "deduplicated": len(deduplicated.search_results)}, + "static": { + "original": memory_count_static, + "deduplicated": len(deduplicated.static), + }, + "dynamic": { + "original": memory_count_dynamic, + "deduplicated": len(deduplicated.dynamic), + }, + "search_results": { + "original": memory_count_search, + "deduplicated": len(deduplicated.search_results), + }, }, ) @@ -217,10 +226,10 @@ async def add_memory_tool( # Handle both sync and async supermemory clients try: - response = await client.memories.add(**add_params) + response = await client.add(**add_params) except TypeError: # If it's not awaitable, call it synchronously - response = client.memories.add(**add_params) + response = client.add(**add_params) logger.info( "Memory saved successfully", @@ -237,18 +246,14 @@ async def add_memory_tool( {"error": str(network_error)}, ) raise SupermemoryNetworkError( - "Failed to save memory due to network error", - network_error + "Failed to save memory due to network error", network_error ) except Exception as error: logger.error( "Error saving memory", {"error": str(error)}, ) - raise SupermemoryMemoryOperationError( - "Failed to save memory", - error - ) + raise SupermemoryMemoryOperationError("Failed to save memory", error) class SupermemoryOpenAIWrapper: @@ -271,16 +276,17 @@ class SupermemoryOpenAIWrapper: if not hasattr(supermemory, "Supermemory"): raise SupermemoryConfigurationError( "supermemory package is required but not found", - ImportError("supermemory package not installed") + ImportError("supermemory package not installed"), ) api_key = self._get_api_key() try: - self._supermemory_client: supermemory.Supermemory = supermemory.Supermemory(api_key=api_key) + self._supermemory_client: supermemory.Supermemory = supermemory.Supermemory( + api_key=api_key + ) except Exception as e: raise SupermemoryConfigurationError( - f"Failed to initialize Supermemory client: {e}", - e + f"Failed to initialize Supermemory client: {e}", e ) # Wrap the chat completions create method @@ -359,15 +365,24 @@ class SupermemoryOpenAIWrapper: try: if task_obj.exception() is not None: exception = task_obj.exception() - if isinstance(exception, (SupermemoryNetworkError, SupermemoryAPIError)): + if isinstance( + exception, + (SupermemoryNetworkError, SupermemoryAPIError), + ): self._logger.warn( "Background memory storage failed", - {"error": str(exception), "type": type(exception).__name__} + { + "error": str(exception), + "type": type(exception).__name__, + }, ) else: self._logger.error( "Unexpected error in background memory storage", - {"error": str(exception), "type": type(exception).__name__} + { + "error": str(exception), + "type": type(exception).__name__, + }, ) except asyncio.CancelledError: self._logger.debug("Memory storage task was cancelled") @@ -440,7 +455,7 @@ class SupermemoryOpenAIWrapper: # We're in an async context, log warning and skip memory saving self._logger.warn( "Cannot save memory in sync client from async context", - {"error": str(e)} + {"error": str(e)}, ) else: raise @@ -454,7 +469,7 @@ class SupermemoryOpenAIWrapper: # Unexpected errors should be investigated self._logger.error( "Unexpected error saving memory", - {"error": str(e), "type": type(e).__name__} + {"error": str(e), "type": type(e).__name__}, ) # Handle memory search and injection @@ -464,11 +479,14 @@ class SupermemoryOpenAIWrapper: self._logger.debug("No user message found, skipping memory search") return original_create(**kwargs) - self._logger.info("Starting memory search", { - "container_tag": self._container_tag, - "conversation_id": self._options.conversation_id, - "mode": self._options.mode, - }) + self._logger.info( + "Starting memory search", + { + "container_tag": self._container_tag, + "conversation_id": self._options.conversation_id, + "mode": self._options.mode, + }, + ) # Use asyncio.run() for memory search and injection try: @@ -495,7 +513,7 @@ class SupermemoryOpenAIWrapper: self._logger, self._options.mode, self._get_api_key(), - ) + ), ) enhanced_messages = future.result() else: @@ -517,20 +535,24 @@ class SupermemoryOpenAIWrapper: if not self._background_tasks: return - self._logger.debug(f"Waiting for {len(self._background_tasks)} background tasks to complete") + self._logger.debug( + f"Waiting for {len(self._background_tasks)} background tasks to complete" + ) try: if timeout is not None: await asyncio.wait_for( asyncio.gather(*self._background_tasks, return_exceptions=True), - timeout=timeout + timeout=timeout, ) else: await asyncio.gather(*self._background_tasks, return_exceptions=True) self._logger.debug("All background tasks completed") except asyncio.TimeoutError: - self._logger.warn(f"Background tasks did not complete within {timeout}s timeout") + self._logger.warn( + f"Background tasks did not complete within {timeout}s timeout" + ) # Cancel remaining tasks for task in self._background_tasks: if not task.done(): @@ -580,7 +602,9 @@ class SupermemoryOpenAIWrapper: else: raise except asyncio.TimeoutError: - self._logger.warn("Some background memory tasks did not complete on exit") + self._logger.warn( + "Some background memory tasks did not complete on exit" + ) self.cancel_background_tasks() def __getattr__(self, name: str) -> Any: diff --git a/packages/openai-sdk-python/src/supermemory_openai/tools.py b/packages/openai-sdk-python/src/supermemory_openai/tools.py index 111253cd..87c19428 100644 --- a/packages/openai-sdk-python/src/supermemory_openai/tools.py +++ b/packages/openai-sdk-python/src/supermemory_openai/tools.py @@ -1,14 +1,14 @@ """Supermemory tools for OpenAI function calling.""" import json -from typing import Dict, List, Optional, Union, TypedDict +from typing import Dict, List, Optional, TypedDict, Union +import supermemory from openai.types.chat import ( + ChatCompletionFunctionToolParam, ChatCompletionMessageToolCall, ChatCompletionToolMessageParam, - ChatCompletionFunctionToolParam, ) -import supermemory from supermemory.types import ( MemoryAddResponse, MemoryGetResponse, @@ -230,7 +230,7 @@ class SupermemoryTools: if metadata: add_params["metadata"] = metadata - response: MemoryAddResponse = await self.client.memories.add(**add_params) + response: MemoryAddResponse = await self.client.add(**add_params) return MemoryAddResult( success=True, |