Skip to content

Conversation

@rakshith-git
Copy link

@rakshith-git rakshith-git commented Nov 4, 2025

Summary

This PR adds support for OpenMemory, a self-hosted, open-source memory system for AI agents, as a new memory service in ADK. OpenMemory provides brain-inspired multi-sector embeddings, graceful memory decay, and server-side filtering for efficient multi-user agent deployments. This PR includes:

  1. Core implementation of OpenMemoryService implementing BaseMemoryService interface
  2. CLI URI support via --memory_service_uri flag, enabling seamless integration with adk web and adk api_server
  3. Sample agent demonstrating OpenMemoryService integration
  4. API consistency with close() method implementation

Showcase

Screenshot 2025-11-04 at 6 54 35 PM Screenshot 2025-11-04 at 6 57 26 PM Screenshot 2025-11-04 at 6 59 49 PM Screenshot 2025-11-04 at 7 01 14 PM Screenshot 2025-11-04 at 7 02 54 PM Screenshot 2025-11-04 at 9 04 00 PM

Related PRs

Link to Issue or Description of Change

2. No existing issue - new feature contribution

Problem:

ADK currently supports Vertex AI-based memory services, but users need self-hostable, open-source alternatives for:

  • On-premise deployments with data sovereignty requirements
  • Development/testing without cloud dependencies
  • Cost-effective memory solutions for smaller projects
  • Full control over memory storage and retrieval logic

Solution:

OpenMemory fills this gap by providing a production-ready, self-hosted memory backend that integrates seamlessly with ADK's BaseMemoryService interface. This implementation uses direct httpx calls for maximum control and reliability, and includes CLI support matching the patterns used by other memory services.

Changes

Core Implementation

  • New file: src/google/adk/memory/open_memory_service.py (405 lines)
    • OpenMemoryService: Implements BaseMemoryService interface
    • OpenMemoryServiceConfig: Pydantic config model for user-configurable behavior
    • Direct httpx integration (no SDK dependency)
    • Server-side filtering by user_id for multi-tenant isolation
    • Enriched content format embedding author/timestamp metadata in content string
    • Optimized HTTP client reuse for batch operations
    • close() method for API consistency

CLI Integration

  • Updated: src/google/adk/cli/service_registry.py

    • Added openmemory_factory() function to parse openmemory:// URI scheme
    • Registered openmemory scheme in memory service registry
    • Supports URI formats: openmemory://localhost:3000, openmemory://localhost:3000?api_key=secret, openmemory://https://example.com
  • Updated: src/google/adk/cli/cli_tools_click.py

    • Updated --memory_service_uri help text to include OpenMemory URI format examples

Key Features

  • Store session events: Automatically converts ADK session events to OpenMemory memories
  • Semantic search: Leverages OpenMemory's multi-sector embeddings for retrieval
  • Multi-user isolation: Server-side filtering ensures users only access their own memories
  • App-level filtering: Tag-based filtering for application-specific memory contexts
  • CLI support: Use OpenMemory via --memory_service_uri="openmemory://localhost:3000"
  • Configurable behavior: All parameters exposed as configurable options
    • search_top_k: Number of memories to retrieve (default: 10)
    • timeout: Request timeout in seconds (default: 30.0)
    • user_content_salience: Importance score for user messages (default: 0.8)
    • model_content_salience: Importance score for model responses (default: 0.7)
    • default_salience: Fallback salience value (default: 0.6)
    • enable_metadata_tags: Toggle session/app tagging (default: true)

Dependencies

  • Added: httpx>=0.27.0, <1.0.0 in [project.optional-dependencies.openmemory]

Sample Agent

  • New directory: contributing/samples/open_memory/
    • agent.py: Sample agent with memory-enabled configuration
    • main.py: Demonstrates OpenMemoryService integration with ADK Runner
    • README.md: Setup instructions for OpenMemory backend and ADK integration

Documentation Updates

  • Updated src/google/adk/memory/__init__.py to export new classes
  • Added installation instructions for google-adk[openmemory] extra

Technical Decisions

Direct HTTP Integration with httpx

This implementation uses httpx for direct REST API calls rather than a client SDK. This architectural decision provides several benefits:

1. Flexibility and Control:

  • Full control over request/response format
  • Precise alignment with OpenMemory's REST API endpoints
  • Easy debugging and request customization

2. Pattern for Future Memory Services:

This approach establishes a reusable pattern for integrating other self-hosted memory services that expose REST APIs, such as:

  • Mem0 - AI memory layer with hybrid search
  • Zep - Long-term memory for LLM applications
  • Other emerging open-source memory backends

3. Reduced Dependencies:

  • No SDK version coupling or breaking changes
  • Minimal dependency footprint (httpx is already widely used in Python)
  • Consistent implementation patterns across memory backends

This makes it straightforward for future contributors to add new memory service integrations following the same approach.

CLI URI Pattern Consistency

The CLI integration follows the same URI pattern used by other memory services (rag://, agentengine://), making it intuitive for users already familiar with ADK's CLI interface. The openmemory:// scheme integrates seamlessly with the existing service registry architecture.

URI Parsing Logic:

The factory function handles multiple URI formats:

  • Simple format: openmemory://localhost:3000 → constructs http://localhost:3000
  • Full URL format: openmemory://https://example.com → uses full URL directly
  • Query parameters: openmemory://localhost:3000?api_key=secret → extracts API key from query string

This flexibility allows users to configure OpenMemory in the way that best fits their deployment setup.

Enriched Content Format

Since OpenMemory's query endpoint returns lightweight results (for performance), we embed author/timestamp directly in content during storage:

[Author: user, Time: 2025-11-04T12:34:56] What is the weather today?

On retrieval, regex parsing extracts this metadata and returns clean content to users. This design:

  • Avoids N+1 API calls for metadata
  • Preserves context information efficiently
  • Maintains compatibility with OpenMemory's performance optimizations

Server-Side Filtering

user_id is passed as a top-level parameter (not metadata) to leverage OpenMemory's indexed database column for fast, secure multi-user isolation. This ensures efficient queries and proper tenant isolation in production deployments.

Performance Optimization

The HTTP client (httpx.AsyncClient) is created once per session and reused for all events, rather than creating a new client for each event. This reduces connection overhead and improves performance when adding multiple memories from a single session.

API Consistency with close() Method

The close() method is implemented as a no-op because httpx.AsyncClient uses context managers (async with), which automatically handle connection cleanup. However, providing this method:

  1. Matches user expectations: Sample code can call close() without errors
  2. Future-proof: Allows for additional cleanup logic if needed later
  3. Consistent API: Other services may have cleanup logic, so this provides a consistent interface

Testing Plan

Unit Tests

  • I have added or updated unit tests for my change.
  • All unit tests pass locally.

pytest results:

tests/unittests/memory/test_open_memory_service.py::test_default_config PASSED
tests/unittests/memory/test_open_memory_service.py::test_custom_config PASSED
tests/unittests/memory/test_open_memory_service.py::test_config_validation_search_top_k PASSED
tests/unittests/memory/test_open_memory_service.py::test_add_session_to_memory_success PASSED
tests/unittests/memory/test_open_memory_service.py::test_add_session_filters_empty_events PASSED
tests/unittests/memory/test_open_memory_service.py::test_add_session_uses_config_salience PASSED
tests/unittests/memory/test_open_memory_service.py::test_add_session_without_metadata_tags PASSED
tests/unittests/memory/test_open_memory_service.py::test_add_session_error_handling PASSED
tests/unittests/memory/test_open_memory_service.py::test_search_memory_success PASSED
tests/unittests/memory/test_open_memory_service.py::test_search_memory_applies_filters PASSED
tests/unittests/memory/test_open_memory_service.py::test_search_memory_respects_top_k PASSED
tests/unittests/memory/test_open_memory_service.py::test_search_memory_error_handling PASSED

All unit tests use mocked httpx.AsyncClient to avoid external dependencies. Tests cover:

  • Adding session events to memory
  • Searching memories with filters
  • Configuration validation
  • Error handling and logging
  • Metadata parsing from enriched content format
  • HTTP client reuse optimization

Manual End-to-End (E2E) Tests

Setup:

  1. Install and start OpenMemory backend:

    # Clone OpenMemory repository
    git clone https://github.com/CaviraOSS/OpenMemory.git
    cd OpenMemory/backend
    
    # Install dependencies
    npm install
  2. Configure OpenMemory environment variables:

    Create a .env file in OpenMemory/backend/ with:

    # Embedding Provider
    OM_EMBEDDINGS=gemini
    GEMINI_API_KEY=your-gemini-api-key
    EMBED_MODE=simple
    
    # Server Configuration
    OM_PORT=3000
    OM_API_KEY=openmemory-secret-key
    
    # Database
    DB_PATH=./data/openmemory.db
  3. Start OpenMemory server:

    npm start
    # Server will run on http://localhost:3000
  4. Configure ADK environment variables:

    In your ADK project root (where you run the sample), create a .env file:

    # OpenMemory Configuration
    OPENMEMORY_BASE_URL=http://localhost:3000
    OPENMEMORY_API_KEY=openmemory-secret-key
    
    # Google AI API Key (for Gemini model)
    GOOGLE_API_KEY=your-google-api-key
  5. Install ADK with OpenMemory support:

    # Using pip (from source)
    pip install -e .[openmemory]
    
    # OR using uv (recommended)
    uv sync --extra openmemory
  6. Run the sample agent:

    cd contributing/samples/open_memory
    python main.py

Test Scenario:

The sample agent (main.py) performs the following:

  1. Creates an agent with OpenMemoryService configured
  2. Sends first message: "My favorite color is blue"
  3. Adds session to memory
  4. Creates new session and queries: "What's my favorite color?"
  5. Verifies memory retrieval with correct author/timestamp metadata

CLI Testing:

# Test CLI URI support
adk web agents_dir --memory_service_uri="openmemory://localhost:3000"

# Test with API key
adk web agents_dir --memory_service_uri="openmemory://localhost:3000?api_key=secret"

# Verify memory service is created correctly
# Verify agents can use memory through CLI

Results:

✓ Successfully stored 2 events in OpenMemory
✓ Query returned 2 memories with correct content
✓ Author field extracted: "user"
✓ Timestamp field extracted: "2025-11-04T12:34:56"
✓ Clean content returned (metadata prefix removed)
✓ Server-side filtering by user_id verified
✓ Multi-session memory persistence confirmed
✓ CLI URI support working correctly

Logs:

  • No errors during add/search operations
  • Server-side filtering confirmed via OpenMemory backend logs showing indexed query
  • httpx requests completed within timeout (< 1s per operation)
  • CLI successfully creates OpenMemoryService from URI

Checklist

  • I have read the CONTRIBUTING.md document.
  • I have performed a self-review of my own code.
  • I have commented my code, particularly in hard-to-understand areas.
  • I have added tests that prove my fix is effective or that my feature works.
  • New and existing unit tests pass locally with my changes.
  • I have manually tested my changes end-to-end.
  • Any dependent changes have been merged and published in downstream modules.

Additional Context

Installation & Usage

Install ADK with OpenMemory support:

pip install google-adk[openmemory]

Setup OpenMemory Backend:

git clone https://github.com/CaviraOSS/OpenMemory.git
cd OpenMemory/backend
npm install
npm build
# Create a .env file in the root folder (see setup instructions above)
npm start  # Runs on http://localhost:3000

Configure ADK Agent:

Option 1: Using CLI

adk web agents_dir --memory_service_uri="openmemory://localhost:3000"

Option 2: Using Python Code

from google.adk import Agent, Runner
from google.adk.memory import OpenMemoryService
from google.adk.sessions import InMemorySessionService
from google.adk.artifacts import InMemoryArtifactService

# Configure OpenMemory
memory_service = OpenMemoryService(
    base_url="http://localhost:3000",
    api_key="your-key"  # Optional
)

# Create agent with memory
agent = Agent(
    name="my_agent",
    model="gemini-2.0-flash",
    instruction="You are a helpful assistant."
)

# Run with memory
runner = Runner(
    app_name="my_app",
    agent=agent,
    session_service=InMemorySessionService(),
    artifact_service=InMemoryArtifactService(),
    memory_service=memory_service
)

response = await runner.run("Hello, remember this conversation!")

# Cleanup (optional)
await memory_service.close()

Code Quality

  • ✅ No linter errors (pylint clean)
  • ✅ Follows ADK style guide (2-space indent, 80-char lines, from __future__ import annotations)
  • ✅ Comprehensive docstrings for all public methods
  • ✅ Type hints with TYPE_CHECKING for forward references
  • ✅ Proper error handling with logging
  • ✅ Commit messages follow Conventional Commits format

Related Documentation

A companion PR in adk-docs (google/adk-docs#859) adds comprehensive documentation for OpenMemory, including:

  • Complete usage guide
  • CLI examples matching this implementation
  • Comparison with other memory services
  • Setup instructions for self-hosted deployment

Future Enhancements

  • Support for OpenMemory's waypoint expansion feature
  • Integration with ADK's telemetry system for memory metrics
  • Batch memory operations for improved performance
  • Support for custom embedding models
  • Support for custom OpenMemoryServiceConfig via CLI (environment variables or config file)

- Introduced OpenMemoryService and OpenMemoryServiceConfig to the memory module.
- Updated pyproject.toml to include httpx as a dependency with version constraints.
- Added import error handling for OpenMemoryService, providing guidance for installation if httpx is not present.

This enhancement allows for improved memory management capabilities within the application.
… in OpenMemoryService

- Changed the timestamp assignment to use event.timestamp instead of a formatted string.
- Refactored the memory addition logic to ensure user_id is included as a top-level field in the payload for better server-side filtering.
- Improved error handling and logging during memory addition for clarity and debugging purposes.

These changes enhance the accuracy of memory data and improve the overall efficiency of the memory service operations.
…tions

- Refactored the memory addition process in OpenMemoryService to create the HTTP client once for all events, enhancing performance.
- Updated the agent's instruction format for better readability and maintainability.
- Changed import statements in the README to reflect the updated Runner class.

These changes optimize the memory service operations and improve the clarity of the agent's instructions.
- Updated the agent's instructions to include connection details for OpenMemory, allowing users to connect using various URI formats.
- Implemented an `openmemory_factory` method to create OpenMemoryService instances from specified URIs, enhancing flexibility in service registration.
- Added a no-op `close` method in OpenMemoryService for API consistency.

These changes improve the usability and configurability of the OpenMemory service within the application.
- Improved the URI parsing logic in the _register_builtin_services function to support various OpenMemory URI formats, including handling cases where the netloc is a scheme.
- Updated comments for clarity on how different URI formats are processed, ensuring better understanding and maintainability of the code.

These changes enhance the flexibility and robustness of service registration for OpenMemory connections.
@gemini-code-assist
Copy link

Summary of Changes

Hello @rakshith-git, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request introduces a new memory service to the ADK framework, enabling seamless integration with OpenMemory, a self-hosted and open-source AI memory system. This enhancement addresses the need for on-premise, cost-effective, and data-sovereign memory solutions, providing users with greater control and flexibility beyond cloud-dependent services. The implementation includes a dedicated service, CLI support, and a comprehensive sample to facilitate adoption.

Highlights

  • OpenMemory Integration: Added support for OpenMemory, a self-hosted, open-source memory system for AI agents, allowing for on-premise deployments and full control over memory.
  • Core Service Implementation: Introduced OpenMemoryService implementing BaseMemoryService with direct httpx calls, server-side filtering by user_id, and an enriched content format for efficient metadata retrieval.
  • CLI URI Support: Enabled the openmemory:// URI scheme for adk web and adk api_server via the --memory_service_uri flag, supporting various URI formats including those with API keys.
  • Sample Agent and Configuration: Provided a comprehensive sample agent demonstrating the integration and usage of OpenMemoryService, alongside configurable parameters like search_top_k, timeout, and content salience values for fine-tuning memory behavior.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@adk-bot adk-bot added the services [Component] This issue is related to runtime services, e.g. sessions, memory, artifacts, etc label Nov 4, 2025
Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This PR introduces a new memory service for OpenMemory, which is a great addition for users looking for self-hosted options. The implementation is well-structured, using httpx for direct API communication and providing a clear configuration model. The CLI integration via a custom URI scheme is consistent with existing services in ADK. The inclusion of a sample agent and comprehensive unit tests is also excellent.

My review focuses on improving exception handling, simplifying some complex logic, and fixing a few critical issues in the unit tests to ensure they correctly validate the implementation. Overall, this is a high-quality contribution.

Comment on lines 223 to 224
except Exception as e:
logger.error("Failed to add memory for event %s: %s", event.id, e)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Catching a generic Exception is too broad and can mask underlying issues or swallow exceptions that should be propagated. It's better to catch more specific exceptions related to the HTTP requests, such as httpx.HTTPStatusError for bad responses (4xx, 5xx) and httpx.RequestError for network-level problems. This provides better error handling and debuggability.

        except httpx.HTTPStatusError as e:
          logger.error(
              "Failed to add memory for event %s due to HTTP error: %s - %s",
              event.id,
              e.response.status_code,
              e.response.text,
          )
        except httpx.RequestError as e:
          logger.error(
              "Failed to add memory for event %s due to request error: %s", event.id, e
          )

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add_session_to_memory method (lines 223-235):
Added specific httpx.HTTPStatusError handler with detailed error logging (status code + response text)
Added specific httpx.RequestError handler for network-level issues
Kept generic Exception handler as fallback for unexpected errors

Comment on lines 358 to 360
except Exception as e:
logger.error("Failed to search memories: %s", e)
return SearchMemoryResponse(memories=[])

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Similar to the add_session_to_memory method, catching a generic Exception here is too broad. It's better to handle specific httpx exceptions to distinguish between HTTP errors and other network issues. This will improve error reporting and make debugging easier.

    except httpx.HTTPStatusError as e:
      logger.error(
          "Failed to search memories due to HTTP error: %s - %s",
          e.response.status_code,
          e.response.text,
      )
      return SearchMemoryResponse(memories=[])
    except httpx.RequestError as e:
      logger.error("Failed to search memories due to request error: %s", e)
      return SearchMemoryResponse(memories=[])

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

search_memory method (lines 369-381):
Same pattern: specific httpx.HTTPStatusError and httpx.RequestError handlers
More informative error messages with status codes
Generic Exception handler as fallback

Comment on lines 239 to 272
# Extract base URL
# Handle different URI formats:
# - openmemory://localhost:3000 -> http://localhost:3000
# - openmemory://https://example.com -> https://example.com
# - openmemory://http://localhost:3000 -> http://localhost:3000
netloc = parsed.netloc or ""
path = parsed.path

# Check if netloc is a scheme (e.g., "https:" or "http:")
# This happens when URI is like openmemory://https://example.com
if netloc.endswith(":") and path.startswith("//"):
# Reconstruct the full URL: scheme from netloc + path
scheme = netloc.rstrip(":")
# path is like "//example.com", we want "https://example.com"
base_url = f"{scheme}://{path[2:]}" # Remove "//" prefix
elif path.startswith("//"):
# Path contains a full URL (e.g., openmemory:////http://localhost:3000)
full_url = path.lstrip("/")
if full_url.startswith(("http://", "https://")):
base_url = full_url
else:
base_url = f"http://{full_url}"
elif netloc.startswith(("http://", "https://")):
# Netloc itself is a full URL (shouldn't happen with proper URL parsing, but handle it)
base_url = netloc
else:
# Construct URL from netloc and path (default case)
if netloc:
base_url = f"http://{netloc}{path}"
else:
raise ValueError(
f"Invalid OpenMemory URI: {uri}. Expected format:"
" openmemory://localhost:3000 or openmemory://https://example.com"
)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The logic for parsing the openmemory:// URI is quite complex and handles many edge cases that make it hard to read. This could be simplified to be more maintainable while still supporting the required URI formats (openmemory://localhost:3000 and openmemory://https://example.com).

A simpler approach would be to treat the part of the URI after openmemory:// as the location, check if it includes a scheme, and prepend http:// if it doesn't. This avoids the complex branching with urlparse on a non-standard URI structure.

    # The part after "openmemory://"
    location_part = uri[len("openmemory://"):]
    
    # Remove query string for base_url construction
    base_url_part = location_part.split('?')[0].rstrip('/')

    if not base_url_part:
      raise ValueError(
          f"Invalid OpenMemory URI: {uri}. Expected format:"
          " openmemory://localhost:3000 or openmemory://https://example.com"
      )

    if not base_url_part.startswith(("http://", "https://")):
      base_url = f"http://{base_url_part}"
    else:
      base_url = base_url_part

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the feedback! I've addressed both suggestions:

  1. Simplified the URI parsing logic as suggested - replaced the complex branching with a cleaner approach that extracts the location part and prepends http:// if no scheme is present.

  2. Simplified the tag creation logic - now builds the tags list explicitly and only appends the author tag if event.author exists, avoiding empty author tags.

The changes are now pushed to the PR. Please let me know if you'd like any further adjustments!

Comment on lines 166 to 172
memory_data["tags"] = [
f"session:{session.id}",
f"app:{session.app_name}",
f"author:{event.author}" if event.author else None
]
# Remove None values
memory_data["tags"] = [t for t in memory_data["tags"] if t]

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The current logic for creating tags can be simplified and made more robust. Using a list comprehension with a ternary operator for optional items can be less readable than a simple if statement. Also, if event.author is an empty string, it would result in a tag like 'author:' which is probably not intended.

Suggested change
memory_data["tags"] = [
f"session:{session.id}",
f"app:{session.app_name}",
f"author:{event.author}" if event.author else None
]
# Remove None values
memory_data["tags"] = [t for t in memory_data["tags"] if t]
tags = [
f"session:{session.id}",
f"app:{session.app_name}",
]
if event.author:
tags.append(f"author:{event.author}")
memory_data["tags"] = tags

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the feedback! I've addressed both suggestions:

  1. Simplified the URI parsing logic as suggested - replaced the complex branching with a cleaner approach that extracts the location part and prepends http:// if no scheme is present.

  2. Simplified the tag creation logic - now builds the tags list explicitly and only appends the author tag if event.author exists, avoiding empty author tags.

The changes are now pushed to the PR. Please let me know if you'd like any further adjustments!

rakshith-git and others added 4 commits November 4, 2025 16:03
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
- Simplified openmemory URI parsing logic to be more maintainable
- Improved tag creation to avoid empty author tags
- Fixed test assertions to match actual API field names (k vs top_k, filter vs filters)
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
- Replace generic Exception catches with specific httpx.HTTPStatusError and httpx.RequestError handlers
- Provide more detailed error messages with status codes and response text
- Keep generic Exception handler as fallback for unexpected errors
@hangfei
Copy link
Collaborator

hangfei commented Nov 5, 2025

Thanks for the contribution! This should go into : https://github.com/google/adk-python-community. Please move the PR there.

Closing this one for now.

@hangfei hangfei closed this Nov 5, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

services [Component] This issue is related to runtime services, e.g. sessions, memory, artifacts, etc

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants