Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 18 additions & 9 deletions src/sap_cloud_sdk/agent_memory/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,10 @@

from typing import Optional

from sap_cloud_sdk.agent_memory._http_transport import HttpTransport
from sap_cloud_sdk.agent_memory.client import AgentMemoryClient
from sap_cloud_sdk.agent_memory.config import (
AgentMemoryConfig,
_load_config_for_instance,
_load_config_from_env,
_make_agent_memory_factory,
)
from sap_cloud_sdk.agent_memory.exceptions import (
AgentMemoryConfigError,
Expand All @@ -40,6 +38,19 @@
SearchResult,
)
from sap_cloud_sdk.agent_memory.utils._odata import FilterDefinition
from sap_cloud_sdk.core._http_client import HttpClient, XsuaaAuthProvider


def _build_agent_memory_http(
instance: str, config: Optional[AgentMemoryConfig]
) -> HttpClient:
if config is not None:
auth = XsuaaAuthProvider(lambda: config) if config.token_url else None
return HttpClient(config.base_url, auth, timeout=config.timeout)
factory = _make_agent_memory_factory(instance)
cfg = factory()
auth = XsuaaAuthProvider(factory) if cfg.token_url else None
return HttpClient(cfg.base_url, auth, timeout=cfg.timeout)


def create_client(
Expand Down Expand Up @@ -78,15 +89,13 @@ def create_client(
"""
try:
if config is not None:
resolved_config = config
http = _build_agent_memory_http("default", config)
elif access_strategy is AccessStrategy.SUBSCRIBER and tenant:
resolved_config = _load_config_for_instance(tenant)
http = _build_agent_memory_http(tenant, None)
else:
resolved_config = _load_config_from_env()

transport = HttpTransport(resolved_config)
http = _build_agent_memory_http("default", None)
return AgentMemoryClient(
transport,
http,
access_strategy=access_strategy,
tenant=tenant,
)
Expand Down
71 changes: 71 additions & 0 deletions src/sap_cloud_sdk/agent_memory/_http.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
"""Low-level HTTP helper for the Agent Memory service."""

from __future__ import annotations

import logging
from typing import Any, Optional
from urllib.parse import quote, urlencode

from requests.exceptions import RequestException, Timeout

from sap_cloud_sdk.agent_memory.exceptions import (
AgentMemoryHttpError,
AgentMemoryNotFoundError,
)
from sap_cloud_sdk.core._http_client import HttpClient, HttpMethod

logger = logging.getLogger(__name__)


def _request(
http: HttpClient,
method: HttpMethod,
path: str,
*,
params: Optional[dict[str, Any]] = None,
tenant_subdomain: Optional[str] = None,
**kwargs: Any,
) -> dict[str, Any]:
"""Execute an Agent Memory HTTP request and map errors to domain exceptions."""
logger.debug("%s %s (tenant=%r)", method.value, path, tenant_subdomain)

if params:
path = f"{path}?{urlencode(params, quote_via=quote)}"

try:
response = http.request(
method,
path,
tenant_subdomain=tenant_subdomain,
headers={"Content-Type": "application/json"},
**kwargs,
)
except Timeout as exc:
raise AgentMemoryHttpError(f"Request timed out: {method.value} {path}") from exc
except RequestException as exc:
raise AgentMemoryHttpError(
f"Request failed: {method.value} {path} — {exc}"
) from exc
except Exception as exc:
raise AgentMemoryHttpError(str(exc)) from exc

if response.status_code == 204 or not response.content:
return {}

if response.status_code == 404:
raise AgentMemoryNotFoundError(
f"Resource not found: {method.value} {path}",
status_code=404,
response_text=response.text,
)

if not response.ok:
raise AgentMemoryHttpError(
f"Agent Memory service request failed. "
f"Method: {method.value}, Path: {path}, "
f"Status: {response.status_code}, Response: {response.text}",
status_code=response.status_code,
response_text=response.text,
)

return response.json()
267 changes: 0 additions & 267 deletions src/sap_cloud_sdk/agent_memory/_http_transport.py

This file was deleted.

Loading
Loading