Skip to content

Commit 0833ba1

Browse files
Merge pull request #13 from bbednarski9/fix/issue-9-plugin-api-imports
Route NAT plugin imports through public API facade
2 parents 3a4bf77 + 7dc453a commit 0833ba1

11 files changed

Lines changed: 235 additions & 34 deletions

File tree

src/nat/plugins/redis/memory.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,18 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515

16-
from nat.builder.builder import Builder
17-
from nat.cli.register_workflow import register_memory
18-
from nat.data_models.common import OptionalSecretStr, get_secret_value
19-
from nat.data_models.component_ref import EmbedderRef
20-
from nat.data_models.memory import MemoryBaseConfig
2116
from pydantic import Field
2217

18+
from nvidia_nat_redis._nat_api import (
19+
Builder,
20+
EmbedderRef,
21+
LLMFrameworkEnum,
22+
MemoryBaseConfig,
23+
OptionalSecretStr,
24+
get_secret_value,
25+
register_memory,
26+
)
27+
2328

2429
class RedisMemoryClientConfig(MemoryBaseConfig, name="redis_memory"):
2530
host: str = Field(default="localhost", description="Redis server host")
@@ -35,8 +40,6 @@ class RedisMemoryClientConfig(MemoryBaseConfig, name="redis_memory"):
3540
@register_memory(config_type=RedisMemoryClientConfig)
3641
async def redis_memory_client(config: RedisMemoryClientConfig, builder: Builder):
3742

38-
from nat.builder.framework_enum import LLMFrameworkEnum
39-
4043
import redis.asyncio as redis
4144

4245
from .redis_editor import RedisEditor

src/nat/plugins/redis/object_store.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,10 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515

16-
from nat.builder.builder import Builder
17-
from nat.cli.register_workflow import register_object_store
18-
from nat.data_models.common import OptionalSecretStr
19-
from nat.data_models.object_store import ObjectStoreBaseConfig
2016
from pydantic import Field, field_validator
2117

18+
from nvidia_nat_redis._nat_api import Builder, ObjectStoreBaseConfig, OptionalSecretStr, register_object_store
19+
2220

2321
class RedisObjectStoreClientConfig(ObjectStoreBaseConfig, name="redis"):
2422
"""

src/nat/plugins/redis/redis_editor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@
1616
import logging
1717
import secrets
1818

19-
from nat.memory.interfaces import MemoryEditor
20-
from nat.memory.models import MemoryItem
2119
from redisvl.index import AsyncSearchIndex
2220
from redisvl.query import VectorQuery
2321
from redisvl.query.filter import Tag
2422

23+
from nvidia_nat_redis._nat_api import MemoryEditor, MemoryItem
24+
2525
logger = logging.getLogger(__name__)
2626

2727

src/nat/plugins/redis/redis_object_store.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,8 @@
1515

1616
import logging
1717

18-
from nat.data_models.object_store import KeyAlreadyExistsError, NoSuchKeyError
19-
from nat.object_store.interfaces import ObjectStore
20-
from nat.object_store.models import ObjectStoreItem
21-
from nat.utils.type_utils import override
22-
2318
import redis.asyncio as redis
19+
from nvidia_nat_redis._nat_api import KeyAlreadyExistsError, NoSuchKeyError, ObjectStore, ObjectStoreItem
2420

2521
logger = logging.getLogger(__name__)
2622

@@ -88,7 +84,6 @@ async def __aexit__(self, exc_type, exc_value, traceback) -> None:
8884
def _make_key(self, key: str) -> str:
8985
return f"nat/object_store/{self._bucket_name}/{key}"
9086

91-
@override
9287
async def put_object(self, key: str, item: ObjectStoreItem):
9388

9489
if not self._client:
@@ -103,7 +98,6 @@ async def put_object(self, key: str, item: ObjectStoreItem):
10398
key=key, additional_message=f"Redis bucket {self._bucket_name} already has key {key}"
10499
)
105100

106-
@override
107101
async def upsert_object(self, key: str, item: ObjectStoreItem):
108102

109103
if not self._client:
@@ -113,7 +107,6 @@ async def upsert_object(self, key: str, item: ObjectStoreItem):
113107
item_json = item.model_dump_json()
114108
await self._client.set(full_key, item_json, ex=self._ttl)
115109

116-
@override
117110
async def get_object(self, key: str) -> ObjectStoreItem:
118111

119112
if not self._client:
@@ -127,7 +120,6 @@ async def get_object(self, key: str) -> ObjectStoreItem:
127120
)
128121
return ObjectStoreItem.model_validate_json(data)
129122

130-
@override
131123
async def delete_object(self, key: str):
132124

133125
if not self._client:

src/nvidia_nat_redis/_nat_api.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2026, Redis
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
"""NAT public plugin API imports with compatibility for older supported NAT releases.
5+
6+
NAT's third-party plugin guidance asks runtime plugin code to import plugin-authoring
7+
symbols from ``nat.plugin_api``. The current supported range also includes older NAT
8+
releases that do not ship that facade, so this module is the only compatibility
9+
fallback to implementation imports.
10+
"""
11+
12+
from __future__ import annotations
13+
14+
try:
15+
from nat.plugin_api import (
16+
Builder,
17+
EmbedderRef,
18+
Function,
19+
FunctionBaseConfig,
20+
FunctionInfo,
21+
FunctionRef,
22+
KeyAlreadyExistsError,
23+
LLMFrameworkEnum,
24+
MemoryBaseConfig,
25+
MemoryEditor,
26+
MemoryItem,
27+
MemoryRef,
28+
NoSuchKeyError,
29+
ObjectStore,
30+
ObjectStoreBaseConfig,
31+
ObjectStoreItem,
32+
OptionalSecretStr,
33+
get_secret_value,
34+
register_function,
35+
register_memory,
36+
register_object_store,
37+
)
38+
39+
USING_PLUGIN_API = True
40+
except ImportError: # pragma: no cover - exercised only on older or partial NAT releases
41+
from nat.builder.builder import Builder
42+
from nat.builder.framework_enum import LLMFrameworkEnum
43+
from nat.builder.function import Function
44+
from nat.builder.function_info import FunctionInfo
45+
from nat.cli.register_workflow import register_function, register_memory, register_object_store
46+
from nat.data_models.common import OptionalSecretStr, get_secret_value
47+
from nat.data_models.component_ref import EmbedderRef, FunctionRef, MemoryRef
48+
from nat.data_models.function import FunctionBaseConfig
49+
from nat.data_models.memory import MemoryBaseConfig
50+
from nat.data_models.object_store import KeyAlreadyExistsError, NoSuchKeyError, ObjectStoreBaseConfig
51+
from nat.memory.interfaces import MemoryEditor
52+
from nat.memory.models import MemoryItem
53+
from nat.object_store.interfaces import ObjectStore
54+
from nat.object_store.models import ObjectStoreItem
55+
56+
USING_PLUGIN_API = False
57+
58+
59+
__all__ = [
60+
"Builder",
61+
"EmbedderRef",
62+
"Function",
63+
"FunctionBaseConfig",
64+
"FunctionInfo",
65+
"FunctionRef",
66+
"KeyAlreadyExistsError",
67+
"LLMFrameworkEnum",
68+
"MemoryBaseConfig",
69+
"MemoryEditor",
70+
"MemoryItem",
71+
"MemoryRef",
72+
"NoSuchKeyError",
73+
"ObjectStore",
74+
"ObjectStoreBaseConfig",
75+
"ObjectStoreItem",
76+
"OptionalSecretStr",
77+
"USING_PLUGIN_API",
78+
"get_secret_value",
79+
"register_function",
80+
"register_memory",
81+
"register_object_store",
82+
]

src/nvidia_nat_redis/redis_agent_memory/auto_memory/config.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77

88
from typing import TYPE_CHECKING, Any, Literal
99

10-
from nat.data_models.component_ref import FunctionRef, MemoryRef
11-
from nat.data_models.function import FunctionBaseConfig
1210
from pydantic import BaseModel, Field, PositiveInt, field_validator
1311

12+
from nvidia_nat_redis._nat_api import FunctionBaseConfig, FunctionRef, MemoryRef
13+
1414
from .._text import normalize_optional_string
1515

1616
if TYPE_CHECKING:

src/nvidia_nat_redis/redis_agent_memory/auto_memory/register.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@
88
from collections.abc import AsyncGenerator
99

1010
from agent_memory_client import create_memory_client
11-
from nat.builder.builder import Builder
12-
from nat.builder.function_info import FunctionInfo
13-
from nat.cli.register_workflow import register_function
11+
12+
# Chat request models and retry patching are runtime helpers not exported by
13+
# nat.plugin_api in the currently supported NAT versions.
1414
from nat.data_models.api_server import ChatRequest, ChatRequestOrMessage, ChatResponse
1515
from nat.utils.exception_handlers.automatic_retries import patch_with_retry
1616

17+
from nvidia_nat_redis._nat_api import Builder, FunctionInfo, register_function
18+
1719
from ..memory import RedisAgentMemoryBackendConfig
1820
from .config import RedisAgentMemoryAutoMemoryConfig
1921
from .service import RedisAgentMemoryAutoMemoryService

src/nvidia_nat_redis/redis_agent_memory/auto_memory/service.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@
99
from datetime import UTC, datetime
1010
from typing import Any
1111

12+
# Context, chat request models, and type conversion are runtime helpers not
13+
# exported by nat.plugin_api in the currently supported NAT versions.
1214
from nat.builder.context import Context
13-
from nat.builder.function import Function
1415
from nat.data_models.api_server import (
1516
ChatRequest,
1617
ChatRequestOrMessage,
@@ -20,6 +21,8 @@
2021
)
2122
from nat.utils.type_converter import GlobalTypeConverter
2223

24+
from nvidia_nat_redis._nat_api import Function
25+
2326
from .._text import message_content_to_text, normalize_optional_string
2427
from .config import RedisAgentMemoryAutoMemoryConfig
2528

src/nvidia_nat_redis/redis_agent_memory/editor.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@
1111
from typing import TYPE_CHECKING, Any
1212

1313
from agent_memory_client import MemoryAPIClient
14+
15+
# Runtime request context is not exported by nat.plugin_api.
1416
from nat.builder.context import Context
15-
from nat.memory.interfaces import MemoryEditor
16-
from nat.memory.models import MemoryItem
17+
18+
from nvidia_nat_redis._nat_api import MemoryEditor, MemoryItem
1719

1820
from ._text import message_content_to_text
1921

src/nvidia_nat_redis/redis_agent_memory/memory.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@
88
from collections.abc import AsyncGenerator
99

1010
from agent_memory_client import create_memory_client
11-
from nat.builder.builder import Builder
12-
from nat.cli.register_workflow import register_memory
13-
from nat.data_models.memory import MemoryBaseConfig
11+
12+
# RetryMixin and patch_with_retry are retry implementation helpers not exported
13+
# by nat.plugin_api in the currently supported NAT versions.
1414
from nat.data_models.retry_mixin import RetryMixin
15-
from nat.memory.interfaces import MemoryEditor
1615
from nat.utils.exception_handlers.automatic_retries import patch_with_retry
1716
from pydantic import Field
1817

18+
from nvidia_nat_redis._nat_api import Builder, MemoryBaseConfig, MemoryEditor, register_memory
19+
1920
from .editor import RedisAgentMemoryEditor
2021

2122

0 commit comments

Comments
 (0)