goodmem 0.1.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. goodmem-0.1.2/PKG-INFO +86 -0
  2. goodmem-0.1.2/README.md +54 -0
  3. goodmem-0.1.2/goodmem/__init__.py +28 -0
  4. goodmem-0.1.2/goodmem/_base.py +156 -0
  5. goodmem-0.1.2/goodmem/_generated/__init__.py +2 -0
  6. goodmem-0.1.2/goodmem/_generated/models/__init__.py +116 -0
  7. goodmem-0.1.2/goodmem/_generated/models/abstract_reply.py +97 -0
  8. goodmem-0.1.2/goodmem/_generated/models/active_license_metadata.py +95 -0
  9. goodmem-0.1.2/goodmem/_generated/models/admin_drain_request.py +92 -0
  10. goodmem-0.1.2/goodmem/_generated/models/admin_drain_response.py +92 -0
  11. goodmem-0.1.2/goodmem/_generated/models/admin_purge_jobs_request.py +94 -0
  12. goodmem-0.1.2/goodmem/_generated/models/admin_purge_jobs_response.py +94 -0
  13. goodmem-0.1.2/goodmem/_generated/models/admin_reload_license_response.py +96 -0
  14. goodmem-0.1.2/goodmem/_generated/models/api_key_auth.py +113 -0
  15. goodmem-0.1.2/goodmem/_generated/models/api_key_response.py +128 -0
  16. goodmem-0.1.2/goodmem/_generated/models/background_job_attempt.py +162 -0
  17. goodmem-0.1.2/goodmem/_generated/models/background_job_summary.py +131 -0
  18. goodmem-0.1.2/goodmem/_generated/models/batch_delete_memory_selector_request.py +99 -0
  19. goodmem-0.1.2/goodmem/_generated/models/batch_memory_creation_request.py +96 -0
  20. goodmem-0.1.2/goodmem/_generated/models/batch_memory_deletion_request.py +96 -0
  21. goodmem-0.1.2/goodmem/_generated/models/batch_memory_response.py +96 -0
  22. goodmem-0.1.2/goodmem/_generated/models/batch_memory_result.py +107 -0
  23. goodmem-0.1.2/goodmem/_generated/models/batch_memory_retrieval_request.py +102 -0
  24. goodmem-0.1.2/goodmem/_generated/models/binary_content.py +90 -0
  25. goodmem-0.1.2/goodmem/_generated/models/bounding_box.py +94 -0
  26. goodmem-0.1.2/goodmem/_generated/models/chunk_reference.py +98 -0
  27. goodmem-0.1.2/goodmem/_generated/models/chunking_configuration.py +100 -0
  28. goodmem-0.1.2/goodmem/_generated/models/context_item.py +101 -0
  29. goodmem-0.1.2/goodmem/_generated/models/create_api_key_request.py +107 -0
  30. goodmem-0.1.2/goodmem/_generated/models/create_api_key_response.py +94 -0
  31. goodmem-0.1.2/goodmem/_generated/models/create_llm_response.py +102 -0
  32. goodmem-0.1.2/goodmem/_generated/models/credential_kind.py +39 -0
  33. goodmem-0.1.2/goodmem/_generated/models/distribution_type.py +38 -0
  34. goodmem-0.1.2/goodmem/_generated/models/document_timings.py +96 -0
  35. goodmem-0.1.2/goodmem/_generated/models/embedder_creation_request.py +170 -0
  36. goodmem-0.1.2/goodmem/_generated/models/embedder_response.py +163 -0
  37. goodmem-0.1.2/goodmem/_generated/models/embedder_weight.py +90 -0
  38. goodmem-0.1.2/goodmem/_generated/models/endpoint_authentication.py +108 -0
  39. goodmem-0.1.2/goodmem/_generated/models/error_detail.py +90 -0
  40. goodmem-0.1.2/goodmem/_generated/models/filtered_delete_memory_selector_request.py +102 -0
  41. goodmem-0.1.2/goodmem/_generated/models/gcp_adc_auth.py +100 -0
  42. goodmem-0.1.2/goodmem/_generated/models/good_mem_status.py +90 -0
  43. goodmem-0.1.2/goodmem/_generated/models/image_info.py +92 -0
  44. goodmem-0.1.2/goodmem/_generated/models/length_measurement.py +39 -0
  45. goodmem-0.1.2/goodmem/_generated/models/list_api_keys_response.py +96 -0
  46. goodmem-0.1.2/goodmem/_generated/models/list_embedders_response.py +96 -0
  47. goodmem-0.1.2/goodmem/_generated/models/list_llms_response.py +96 -0
  48. goodmem-0.1.2/goodmem/_generated/models/list_rerankers_response.py +96 -0
  49. goodmem-0.1.2/goodmem/_generated/models/list_spaces_response.py +103 -0
  50. goodmem-0.1.2/goodmem/_generated/models/llm_capabilities.py +128 -0
  51. goodmem-0.1.2/goodmem/_generated/models/llm_creation_request.py +184 -0
  52. goodmem-0.1.2/goodmem/_generated/models/llm_provider_type.py +43 -0
  53. goodmem-0.1.2/goodmem/_generated/models/llm_response.py +177 -0
  54. goodmem-0.1.2/goodmem/_generated/models/llm_sampling_params.py +135 -0
  55. goodmem-0.1.2/goodmem/_generated/models/llm_update_request.py +189 -0
  56. goodmem-0.1.2/goodmem/_generated/models/memory.py +149 -0
  57. goodmem-0.1.2/goodmem/_generated/models/memory_chunk_response.py +118 -0
  58. goodmem-0.1.2/goodmem/_generated/models/memory_creation_request.py +138 -0
  59. goodmem-0.1.2/goodmem/_generated/models/memory_list_response.py +103 -0
  60. goodmem-0.1.2/goodmem/_generated/models/modality.py +40 -0
  61. goodmem-0.1.2/goodmem/_generated/models/ocr_category.py +50 -0
  62. goodmem-0.1.2/goodmem/_generated/models/ocr_cell.py +99 -0
  63. goodmem-0.1.2/goodmem/_generated/models/ocr_document_request.py +124 -0
  64. goodmem-0.1.2/goodmem/_generated/models/ocr_document_response.py +107 -0
  65. goodmem-0.1.2/goodmem/_generated/models/ocr_input_format.py +42 -0
  66. goodmem-0.1.2/goodmem/_generated/models/ocr_layout.py +96 -0
  67. goodmem-0.1.2/goodmem/_generated/models/ocr_page.py +118 -0
  68. goodmem-0.1.2/goodmem/_generated/models/ocr_page_result.py +100 -0
  69. goodmem-0.1.2/goodmem/_generated/models/page_timings.py +94 -0
  70. goodmem-0.1.2/goodmem/_generated/models/ping_endpoint_info.py +97 -0
  71. goodmem-0.1.2/goodmem/_generated/models/ping_event.py +104 -0
  72. goodmem-0.1.2/goodmem/_generated/models/ping_notice.py +97 -0
  73. goodmem-0.1.2/goodmem/_generated/models/ping_once_request.py +115 -0
  74. goodmem-0.1.2/goodmem/_generated/models/ping_payload_type.py +40 -0
  75. goodmem-0.1.2/goodmem/_generated/models/ping_result.py +124 -0
  76. goodmem-0.1.2/goodmem/_generated/models/ping_stream_request.py +150 -0
  77. goodmem-0.1.2/goodmem/_generated/models/ping_summary.py +125 -0
  78. goodmem-0.1.2/goodmem/_generated/models/ping_target_type.py +40 -0
  79. goodmem-0.1.2/goodmem/_generated/models/ping_timing.py +94 -0
  80. goodmem-0.1.2/goodmem/_generated/models/post_processor.py +95 -0
  81. goodmem-0.1.2/goodmem/_generated/models/processing_history.py +107 -0
  82. goodmem-0.1.2/goodmem/_generated/models/provider_type.py +43 -0
  83. goodmem-0.1.2/goodmem/_generated/models/recursive_chunking_configuration.py +110 -0
  84. goodmem-0.1.2/goodmem/_generated/models/reranker_creation_request.py +158 -0
  85. goodmem-0.1.2/goodmem/_generated/models/reranker_response.py +151 -0
  86. goodmem-0.1.2/goodmem/_generated/models/result_set_boundary.py +99 -0
  87. goodmem-0.1.2/goodmem/_generated/models/retrieve_memory_event.py +116 -0
  88. goodmem-0.1.2/goodmem/_generated/models/retrieve_memory_request.py +140 -0
  89. goodmem-0.1.2/goodmem/_generated/models/retrieved_item.py +98 -0
  90. goodmem-0.1.2/goodmem/_generated/models/rpc_status.py +95 -0
  91. goodmem-0.1.2/goodmem/_generated/models/secret_reference.py +95 -0
  92. goodmem-0.1.2/goodmem/_generated/models/sentence_chunking_configuration.py +100 -0
  93. goodmem-0.1.2/goodmem/_generated/models/separator_keep_strategy.py +39 -0
  94. goodmem-0.1.2/goodmem/_generated/models/space.py +125 -0
  95. goodmem-0.1.2/goodmem/_generated/models/space_creation_request.py +137 -0
  96. goodmem-0.1.2/goodmem/_generated/models/space_embedder.py +100 -0
  97. goodmem-0.1.2/goodmem/_generated/models/space_embedder_config.py +95 -0
  98. goodmem-0.1.2/goodmem/_generated/models/space_key.py +110 -0
  99. goodmem-0.1.2/goodmem/_generated/models/system_info_response.py +105 -0
  100. goodmem-0.1.2/goodmem/_generated/models/system_init_response.py +104 -0
  101. goodmem-0.1.2/goodmem/_generated/models/update_api_key_request.py +109 -0
  102. goodmem-0.1.2/goodmem/_generated/models/update_embedder_request.py +179 -0
  103. goodmem-0.1.2/goodmem/_generated/models/update_reranker_request.py +165 -0
  104. goodmem-0.1.2/goodmem/_generated/models/update_space_request.py +122 -0
  105. goodmem-0.1.2/goodmem/_generated/models/user_response.py +98 -0
  106. goodmem-0.1.2/goodmem/_registries.py +22 -0
  107. goodmem-0.1.2/goodmem/_schema_bridge.py +46 -0
  108. goodmem-0.1.2/goodmem/api/__init__.py +1 -0
  109. goodmem-0.1.2/goodmem/api/administration.py +81 -0
  110. goodmem-0.1.2/goodmem/api/api_keys.py +27 -0
  111. goodmem-0.1.2/goodmem/api/embedders.py +70 -0
  112. goodmem-0.1.2/goodmem/api/llms.py +86 -0
  113. goodmem-0.1.2/goodmem/api/memories.py +385 -0
  114. goodmem-0.1.2/goodmem/api/ocr.py +46 -0
  115. goodmem-0.1.2/goodmem/api/rerankers.py +64 -0
  116. goodmem-0.1.2/goodmem/api/spaces.py +55 -0
  117. goodmem-0.1.2/goodmem/api/system.py +55 -0
  118. goodmem-0.1.2/goodmem/api/users.py +59 -0
  119. goodmem-0.1.2/goodmem/client.py +118 -0
  120. goodmem-0.1.2/goodmem/errors.py +88 -0
  121. goodmem-0.1.2/goodmem/pagination.py +93 -0
  122. goodmem-0.1.2/goodmem/py.typed +0 -0
  123. goodmem-0.1.2/goodmem/streaming.py +106 -0
  124. goodmem-0.1.2/goodmem.egg-info/PKG-INFO +86 -0
  125. goodmem-0.1.2/goodmem.egg-info/SOURCES.txt +140 -0
  126. goodmem-0.1.2/goodmem.egg-info/dependency_links.txt +1 -0
  127. goodmem-0.1.2/goodmem.egg-info/requires.txt +11 -0
  128. goodmem-0.1.2/goodmem.egg-info/top_level.txt +1 -0
  129. goodmem-0.1.2/pyproject.toml +72 -0
  130. goodmem-0.1.2/setup.cfg +4 -0
  131. goodmem-0.1.2/tests/test_all_params.py +559 -0
  132. goodmem-0.1.2/tests/test_auth.py +32 -0
  133. goodmem-0.1.2/tests/test_crud_ops.py +514 -0
  134. goodmem-0.1.2/tests/test_embedders.py +120 -0
  135. goodmem-0.1.2/tests/test_errors.py +112 -0
  136. goodmem-0.1.2/tests/test_list_models_next_token.py +212 -0
  137. goodmem-0.1.2/tests/test_llms.py +98 -0
  138. goodmem-0.1.2/tests/test_memories.py +297 -0
  139. goodmem-0.1.2/tests/test_pagination.py +121 -0
  140. goodmem-0.1.2/tests/test_registries.py +57 -0
  141. goodmem-0.1.2/tests/test_rerankers.py +66 -0
  142. goodmem-0.1.2/tests/test_spaces.py +78 -0
goodmem-0.1.2/PKG-INFO ADDED
@@ -0,0 +1,86 @@
1
+ Metadata-Version: 2.4
2
+ Name: goodmem
3
+ Version: 0.1.2
4
+ Summary: GoodMem's Convenient SDK for Python
5
+ Author-email: Forrest Bao <forrest@goodmem.ai>
6
+ License: Apache-2.0
7
+ Project-URL: Homepage, https://github.com/PAIR-Systems-Inc/goodmem
8
+ Project-URL: Repository, https://github.com/PAIR-Systems-Inc/goodmem
9
+ Project-URL: Documentation, https://docs.goodmem.ai
10
+ Keywords: goodmem,memory,vector,embeddings,RAG,AI,Agents,LLMs,Rerankers,Embedders
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: Apache Software License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Typing :: Typed
20
+ Requires-Python: >=3.10
21
+ Description-Content-Type: text/markdown
22
+ Requires-Dist: httpx>=0.27
23
+ Requires-Dist: pydantic>=2
24
+ Requires-Dist: python-dateutil>=2.8.2
25
+ Requires-Dist: typing-extensions>=4.7.1
26
+ Provides-Extra: dev
27
+ Requires-Dist: pytest>=7.2.1; extra == "dev"
28
+ Requires-Dist: pytest-cov>=2.8.1; extra == "dev"
29
+ Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
30
+ Requires-Dist: mypy>=1.5; extra == "dev"
31
+ Requires-Dist: ruff>=0.4; extra == "dev"
32
+
33
+ # GoodMem Python SDK II
34
+
35
+ A Python SDK designed to be easy to use and easy to maintain. OpenAI-style API with auto-inference of model parameters, streaming retrieval, async support, and auto-pagination.
36
+
37
+ To see how this SDK compares to the previous `goodmem-client` SDK, see [Then vs Now](docs/then_vs_now.md).
38
+
39
+ ## Installation
40
+
41
+ At this point, we only publish to TestPyPI.
42
+ ```bash
43
+ pip install --index-url https://test.pypi.org/simple/ goodmem
44
+ ```
45
+
46
+ ## Usage
47
+
48
+ ```python
49
+ from goodmem import GoodMemClient
50
+
51
+ client = GoodMemClient(
52
+ base_url="http://localhost:8080",
53
+ token="your-api-token"
54
+ )
55
+
56
+ embedder = client.embedders.create(
57
+ display_name="OpenAI Embedder",
58
+ model_identifier="text-embedding-3-large",
59
+ api_key="sk-your-openai-key",
60
+ )
61
+
62
+ print(f"Created: {embedder.embedder_id}")
63
+ ```
64
+
65
+ ## How It Works
66
+
67
+ The SDK has two layers:
68
+
69
+ - **Generated layer** (`goodmem/_generated/models/`) — Pydantic v2 models auto-generated from the server's OpenAPI spec via `openapi-generator`. These define request/response schemas.
70
+ - **Convenience layer** (`goodmem/api/`, `goodmem/client.py`, etc.) — Hand-written wrapper that adds model registry auto-inference, parameter forwarding, streaming, pagination, and a clean client interface. Users never directly import from `_generated/`.
71
+
72
+ The convenience layer transforms the raw generated SDK into something pleasant to use: `client.embedders.create(model_identifier="...", api_key="...")` instead of manually constructing nested request objects.
73
+
74
+ ## Documentation
75
+
76
+ * [Build a basic RAG agent](docs/getting_started.md)
77
+ * [API reference](docs/manual.md)
78
+ * [Old vs new SDK](docs/then_vs_now.md)
79
+ * [Design and maintenance guide](docs/design_and_maintenance.md) — for developers understanding the architecture and re-generation workflows
80
+
81
+
82
+ ## TODO
83
+
84
+ 1. Add CI/CD pipeline to publish to PyPI. Integrate into ../build_all.sh and build_client.sh.
85
+ 2. Add `gemini-embedding-001` to embedder registry once backend adds `OPENAI_COMPATIBLE` to `ProviderType`.
86
+ 3. Add Anthropic, Google, Cohere, and Mistral LLMs to registry once backend adds matching `LLMProviderType` values.
@@ -0,0 +1,54 @@
1
+ # GoodMem Python SDK II
2
+
3
+ A Python SDK designed to be easy to use and easy to maintain. OpenAI-style API with auto-inference of model parameters, streaming retrieval, async support, and auto-pagination.
4
+
5
+ To see how this SDK compares to the previous `goodmem-client` SDK, see [Then vs Now](docs/then_vs_now.md).
6
+
7
+ ## Installation
8
+
9
+ At this point, we only publish to TestPyPI.
10
+ ```bash
11
+ pip install --index-url https://test.pypi.org/simple/ goodmem
12
+ ```
13
+
14
+ ## Usage
15
+
16
+ ```python
17
+ from goodmem import GoodMemClient
18
+
19
+ client = GoodMemClient(
20
+ base_url="http://localhost:8080",
21
+ token="your-api-token"
22
+ )
23
+
24
+ embedder = client.embedders.create(
25
+ display_name="OpenAI Embedder",
26
+ model_identifier="text-embedding-3-large",
27
+ api_key="sk-your-openai-key",
28
+ )
29
+
30
+ print(f"Created: {embedder.embedder_id}")
31
+ ```
32
+
33
+ ## How It Works
34
+
35
+ The SDK has two layers:
36
+
37
+ - **Generated layer** (`goodmem/_generated/models/`) — Pydantic v2 models auto-generated from the server's OpenAPI spec via `openapi-generator`. These define request/response schemas.
38
+ - **Convenience layer** (`goodmem/api/`, `goodmem/client.py`, etc.) — Hand-written wrapper that adds model registry auto-inference, parameter forwarding, streaming, pagination, and a clean client interface. Users never directly import from `_generated/`.
39
+
40
+ The convenience layer transforms the raw generated SDK into something pleasant to use: `client.embedders.create(model_identifier="...", api_key="...")` instead of manually constructing nested request objects.
41
+
42
+ ## Documentation
43
+
44
+ * [Build a basic RAG agent](docs/getting_started.md)
45
+ * [API reference](docs/manual.md)
46
+ * [Old vs new SDK](docs/then_vs_now.md)
47
+ * [Design and maintenance guide](docs/design_and_maintenance.md) — for developers understanding the architecture and re-generation workflows
48
+
49
+
50
+ ## TODO
51
+
52
+ 1. Add CI/CD pipeline to publish to PyPI. Integrate into ../build_all.sh and build_client.sh.
53
+ 2. Add `gemini-embedding-001` to embedder registry once backend adds `OPENAI_COMPATIBLE` to `ProviderType`.
54
+ 3. Add Anthropic, Google, Cohere, and Mistral LLMs to registry once backend adds matching `LLMProviderType` values.
@@ -0,0 +1,28 @@
1
+ """GoodMem Python SDK."""
2
+
3
+ from goodmem.client import AsyncGoodMemClient, GoodMemClient
4
+ from goodmem.errors import (
5
+ APIError,
6
+ AuthenticationError,
7
+ ConflictError,
8
+ GoodMemError,
9
+ NotFoundError,
10
+ PermissionError,
11
+ RateLimitError,
12
+ ServerError,
13
+ ValidationError,
14
+ )
15
+
16
+ __all__ = [
17
+ "GoodMemClient",
18
+ "AsyncGoodMemClient",
19
+ "GoodMemError",
20
+ "APIError",
21
+ "AuthenticationError",
22
+ "PermissionError",
23
+ "NotFoundError",
24
+ "ConflictError",
25
+ "ValidationError",
26
+ "RateLimitError",
27
+ "ServerError",
28
+ ]
@@ -0,0 +1,156 @@
1
+ """CRUDNamespace base class — eliminates repetition across CRUD API namespaces."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any, Generic, TypeVar
6
+
7
+ import httpx
8
+
9
+ from goodmem.errors import raise_for_status
10
+ from goodmem.pagination import AsyncPaginator, Paginator
11
+
12
+ T = TypeVar("T")
13
+
14
+
15
+ class CRUDNamespace:
16
+ """Base class for standard CRUD API namespaces.
17
+
18
+ Subclasses set class-level attributes to define the resource type:
19
+
20
+ class EmbeddersAPI(CRUDNamespace):
21
+ _base_path = "/v1/embedders"
22
+ _create_model = EmbedderCreationRequest
23
+ _update_model = UpdateEmbedderRequest
24
+ _response_model = EmbedderResponse
25
+ _list_response_model = ListEmbeddersResponse
26
+ """
27
+
28
+ _base_path: str
29
+ _create_model: type | None = None
30
+ _update_model: type | None = None
31
+ _response_model: type | None = None
32
+ _list_response_model: type | None = None
33
+ _list_items_field: str = "items"
34
+
35
+ def __init__(self, http: httpx.Client, headers: dict[str, str]) -> None:
36
+ self._http = http
37
+ self._headers = headers
38
+
39
+ def create(self, **kwargs: Any) -> Any:
40
+ """Create a resource. Accepts model fields as kwargs."""
41
+ body = self._create_model.model_validate(kwargs)
42
+ resp = self._http.post(
43
+ self._base_path,
44
+ json=body.model_dump(by_alias=True, exclude_unset=True),
45
+ headers=self._headers,
46
+ )
47
+ return self._handle_response(resp, self._response_model)
48
+
49
+ def get(self, id: str) -> Any:
50
+ """Get a resource by ID."""
51
+ resp = self._http.get(
52
+ f"{self._base_path}/{id}",
53
+ headers=self._headers,
54
+ )
55
+ return self._handle_response(resp, self._response_model)
56
+
57
+ def list(self, **kwargs: Any) -> Paginator:
58
+ """List resources. Returns an auto-paginating iterator."""
59
+ return Paginator(
60
+ fetch_fn=lambda token: self._http.get(
61
+ self._base_path,
62
+ params={**kwargs, "nextToken": token} if token else kwargs or None,
63
+ headers=self._headers,
64
+ ),
65
+ response_model=self._list_response_model,
66
+ items_field=self._list_items_field,
67
+ )
68
+
69
+ def update(self, id: str, **kwargs: Any) -> Any:
70
+ """Update a resource by ID."""
71
+ body = self._update_model.model_validate(kwargs)
72
+ resp = self._http.put(
73
+ f"{self._base_path}/{id}",
74
+ json=body.model_dump(by_alias=True, exclude_unset=True),
75
+ headers=self._headers,
76
+ )
77
+ return self._handle_response(resp, self._response_model)
78
+
79
+ def delete(self, id: str) -> None:
80
+ """Delete a resource by ID."""
81
+ resp = self._http.delete(
82
+ f"{self._base_path}/{id}",
83
+ headers=self._headers,
84
+ )
85
+ raise_for_status(resp)
86
+
87
+ def _handle_response(self, resp: httpx.Response, model_cls: type | None) -> Any:
88
+ """Check status, raise typed exceptions, parse response."""
89
+ raise_for_status(resp)
90
+ if model_cls is None:
91
+ return None
92
+ return model_cls.model_validate(resp.json())
93
+
94
+
95
+ class AsyncCRUDNamespace:
96
+ """Async base class for standard CRUD API namespaces."""
97
+
98
+ _base_path: str
99
+ _create_model: type | None = None
100
+ _update_model: type | None = None
101
+ _response_model: type | None = None
102
+ _list_response_model: type | None = None
103
+ _list_items_field: str = "items"
104
+
105
+ def __init__(self, http: httpx.AsyncClient, headers: dict[str, str]) -> None:
106
+ self._http = http
107
+ self._headers = headers
108
+
109
+ async def create(self, **kwargs: Any) -> Any:
110
+ body = self._create_model.model_validate(kwargs)
111
+ resp = await self._http.post(
112
+ self._base_path,
113
+ json=body.model_dump(by_alias=True, exclude_unset=True),
114
+ headers=self._headers,
115
+ )
116
+ return self._handle_response(resp, self._response_model)
117
+
118
+ async def get(self, id: str) -> Any:
119
+ resp = await self._http.get(
120
+ f"{self._base_path}/{id}",
121
+ headers=self._headers,
122
+ )
123
+ return self._handle_response(resp, self._response_model)
124
+
125
+ def list(self, **kwargs: Any) -> AsyncPaginator:
126
+ return AsyncPaginator(
127
+ fetch_fn=lambda token: self._http.get(
128
+ self._base_path,
129
+ params={**kwargs, "nextToken": token} if token else kwargs or None,
130
+ headers=self._headers,
131
+ ),
132
+ response_model=self._list_response_model,
133
+ items_field=self._list_items_field,
134
+ )
135
+
136
+ async def update(self, id: str, **kwargs: Any) -> Any:
137
+ body = self._update_model.model_validate(kwargs)
138
+ resp = await self._http.put(
139
+ f"{self._base_path}/{id}",
140
+ json=body.model_dump(by_alias=True, exclude_unset=True),
141
+ headers=self._headers,
142
+ )
143
+ return self._handle_response(resp, self._response_model)
144
+
145
+ async def delete(self, id: str) -> None:
146
+ resp = await self._http.delete(
147
+ f"{self._base_path}/{id}",
148
+ headers=self._headers,
149
+ )
150
+ raise_for_status(resp)
151
+
152
+ def _handle_response(self, resp: httpx.Response, model_cls: type | None) -> Any:
153
+ raise_for_status(resp)
154
+ if model_cls is None:
155
+ return None
156
+ return model_cls.model_validate(resp.json())
@@ -0,0 +1,2 @@
1
+ # Auto-generated code from openapi-generator. DO NOT EDIT.
2
+ # Re-generate with: library=httpx, --package-name goodmem._generated
@@ -0,0 +1,116 @@
1
+ # coding: utf-8
2
+
3
+ # flake8: noqa
4
+ """
5
+ GoodMem API
6
+
7
+ API for interacting with the GoodMem service, providing vector-based memory storage and retrieval with multiple embedder support. The service enables creation of memory spaces, storing memories with vector representations, and efficient similarity-based retrieval.
8
+
9
+ The version of the OpenAPI document: v1
10
+ Contact: support@goodmem.io
11
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
12
+
13
+ Do not edit the class manually.
14
+ """ # noqa: E501
15
+
16
+
17
+ # import models into model package
18
+ from goodmem._generated.models.abstract_reply import AbstractReply
19
+ from goodmem._generated.models.active_license_metadata import ActiveLicenseMetadata
20
+ from goodmem._generated.models.admin_drain_request import AdminDrainRequest
21
+ from goodmem._generated.models.admin_drain_response import AdminDrainResponse
22
+ from goodmem._generated.models.admin_purge_jobs_request import AdminPurgeJobsRequest
23
+ from goodmem._generated.models.admin_purge_jobs_response import AdminPurgeJobsResponse
24
+ from goodmem._generated.models.admin_reload_license_response import AdminReloadLicenseResponse
25
+ from goodmem._generated.models.api_key_auth import ApiKeyAuth
26
+ from goodmem._generated.models.api_key_response import ApiKeyResponse
27
+ from goodmem._generated.models.background_job_attempt import BackgroundJobAttempt
28
+ from goodmem._generated.models.background_job_summary import BackgroundJobSummary
29
+ from goodmem._generated.models.batch_delete_memory_selector_request import BatchDeleteMemorySelectorRequest
30
+ from goodmem._generated.models.batch_memory_creation_request import BatchMemoryCreationRequest
31
+ from goodmem._generated.models.batch_memory_deletion_request import BatchMemoryDeletionRequest
32
+ from goodmem._generated.models.batch_memory_response import BatchMemoryResponse
33
+ from goodmem._generated.models.batch_memory_result import BatchMemoryResult
34
+ from goodmem._generated.models.batch_memory_retrieval_request import BatchMemoryRetrievalRequest
35
+ from goodmem._generated.models.binary_content import BinaryContent
36
+ from goodmem._generated.models.bounding_box import BoundingBox
37
+ from goodmem._generated.models.chunk_reference import ChunkReference
38
+ from goodmem._generated.models.chunking_configuration import ChunkingConfiguration
39
+ from goodmem._generated.models.context_item import ContextItem
40
+ from goodmem._generated.models.create_api_key_request import CreateApiKeyRequest
41
+ from goodmem._generated.models.create_api_key_response import CreateApiKeyResponse
42
+ from goodmem._generated.models.create_llm_response import CreateLLMResponse
43
+ from goodmem._generated.models.credential_kind import CredentialKind
44
+ from goodmem._generated.models.distribution_type import DistributionType
45
+ from goodmem._generated.models.document_timings import DocumentTimings
46
+ from goodmem._generated.models.embedder_creation_request import EmbedderCreationRequest
47
+ from goodmem._generated.models.embedder_response import EmbedderResponse
48
+ from goodmem._generated.models.embedder_weight import EmbedderWeight
49
+ from goodmem._generated.models.endpoint_authentication import EndpointAuthentication
50
+ from goodmem._generated.models.error_detail import ErrorDetail
51
+ from goodmem._generated.models.filtered_delete_memory_selector_request import FilteredDeleteMemorySelectorRequest
52
+ from goodmem._generated.models.gcp_adc_auth import GcpAdcAuth
53
+ from goodmem._generated.models.good_mem_status import GoodMemStatus
54
+ from goodmem._generated.models.image_info import ImageInfo
55
+ from goodmem._generated.models.llm_capabilities import LLMCapabilities
56
+ from goodmem._generated.models.llm_creation_request import LLMCreationRequest
57
+ from goodmem._generated.models.llm_provider_type import LLMProviderType
58
+ from goodmem._generated.models.llm_response import LLMResponse
59
+ from goodmem._generated.models.llm_sampling_params import LLMSamplingParams
60
+ from goodmem._generated.models.llm_update_request import LLMUpdateRequest
61
+ from goodmem._generated.models.length_measurement import LengthMeasurement
62
+ from goodmem._generated.models.list_api_keys_response import ListApiKeysResponse
63
+ from goodmem._generated.models.list_embedders_response import ListEmbeddersResponse
64
+ from goodmem._generated.models.list_llms_response import ListLLMsResponse
65
+ from goodmem._generated.models.list_rerankers_response import ListRerankersResponse
66
+ from goodmem._generated.models.list_spaces_response import ListSpacesResponse
67
+ from goodmem._generated.models.memory import Memory
68
+ from goodmem._generated.models.memory_chunk_response import MemoryChunkResponse
69
+ from goodmem._generated.models.memory_creation_request import MemoryCreationRequest
70
+ from goodmem._generated.models.memory_list_response import MemoryListResponse
71
+ from goodmem._generated.models.modality import Modality
72
+ from goodmem._generated.models.ocr_category import OcrCategory
73
+ from goodmem._generated.models.ocr_cell import OcrCell
74
+ from goodmem._generated.models.ocr_document_request import OcrDocumentRequest
75
+ from goodmem._generated.models.ocr_document_response import OcrDocumentResponse
76
+ from goodmem._generated.models.ocr_input_format import OcrInputFormat
77
+ from goodmem._generated.models.ocr_layout import OcrLayout
78
+ from goodmem._generated.models.ocr_page import OcrPage
79
+ from goodmem._generated.models.ocr_page_result import OcrPageResult
80
+ from goodmem._generated.models.page_timings import PageTimings
81
+ from goodmem._generated.models.ping_endpoint_info import PingEndpointInfo
82
+ from goodmem._generated.models.ping_event import PingEvent
83
+ from goodmem._generated.models.ping_notice import PingNotice
84
+ from goodmem._generated.models.ping_once_request import PingOnceRequest
85
+ from goodmem._generated.models.ping_payload_type import PingPayloadType
86
+ from goodmem._generated.models.ping_result import PingResult
87
+ from goodmem._generated.models.ping_stream_request import PingStreamRequest
88
+ from goodmem._generated.models.ping_summary import PingSummary
89
+ from goodmem._generated.models.ping_target_type import PingTargetType
90
+ from goodmem._generated.models.ping_timing import PingTiming
91
+ from goodmem._generated.models.post_processor import PostProcessor
92
+ from goodmem._generated.models.processing_history import ProcessingHistory
93
+ from goodmem._generated.models.provider_type import ProviderType
94
+ from goodmem._generated.models.recursive_chunking_configuration import RecursiveChunkingConfiguration
95
+ from goodmem._generated.models.reranker_creation_request import RerankerCreationRequest
96
+ from goodmem._generated.models.reranker_response import RerankerResponse
97
+ from goodmem._generated.models.result_set_boundary import ResultSetBoundary
98
+ from goodmem._generated.models.retrieve_memory_event import RetrieveMemoryEvent
99
+ from goodmem._generated.models.retrieve_memory_request import RetrieveMemoryRequest
100
+ from goodmem._generated.models.retrieved_item import RetrievedItem
101
+ from goodmem._generated.models.rpc_status import RpcStatus
102
+ from goodmem._generated.models.secret_reference import SecretReference
103
+ from goodmem._generated.models.sentence_chunking_configuration import SentenceChunkingConfiguration
104
+ from goodmem._generated.models.separator_keep_strategy import SeparatorKeepStrategy
105
+ from goodmem._generated.models.space import Space
106
+ from goodmem._generated.models.space_creation_request import SpaceCreationRequest
107
+ from goodmem._generated.models.space_embedder import SpaceEmbedder
108
+ from goodmem._generated.models.space_embedder_config import SpaceEmbedderConfig
109
+ from goodmem._generated.models.space_key import SpaceKey
110
+ from goodmem._generated.models.system_info_response import SystemInfoResponse
111
+ from goodmem._generated.models.system_init_response import SystemInitResponse
112
+ from goodmem._generated.models.update_api_key_request import UpdateApiKeyRequest
113
+ from goodmem._generated.models.update_embedder_request import UpdateEmbedderRequest
114
+ from goodmem._generated.models.update_reranker_request import UpdateRerankerRequest
115
+ from goodmem._generated.models.update_space_request import UpdateSpaceRequest
116
+ from goodmem._generated.models.user_response import UserResponse
@@ -0,0 +1,97 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ GoodMem API
5
+
6
+ API for interacting with the GoodMem service, providing vector-based memory storage and retrieval with multiple embedder support. The service enables creation of memory spaces, storing memories with vector representations, and efficient similarity-based retrieval.
7
+
8
+ The version of the OpenAPI document: v1
9
+ Contact: support@goodmem.io
10
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
11
+
12
+ Do not edit the class manually.
13
+ """ # noqa: E501
14
+
15
+
16
+ from __future__ import annotations
17
+ import pprint
18
+ import re # noqa: F401
19
+ import json
20
+
21
+ from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr
22
+ from typing import Any, ClassVar, Dict, List, Optional, Union
23
+ from typing import Optional, Set
24
+ from typing_extensions import Self
25
+
26
+ class AbstractReply(BaseModel):
27
+ """
28
+ Generated abstractive reply with relevance information
29
+ """ # noqa: E501
30
+ text: StrictStr = Field(description="Generated abstractive reply text")
31
+ relevance_score: Union[StrictFloat, StrictInt] = Field(description="Relevance score for this reply (0.0 to 1.0)", alias="relevanceScore")
32
+ result_set_id: Optional[StrictStr] = Field(default=None, description="Optional result set ID linking this abstract to a specific result set", alias="resultSetId")
33
+ __properties: ClassVar[List[str]] = ["text", "relevanceScore", "resultSetId"]
34
+
35
+ model_config = ConfigDict(
36
+ populate_by_name=True,
37
+ validate_assignment=True,
38
+ protected_namespaces=(),
39
+ )
40
+
41
+
42
+ def to_str(self) -> str:
43
+ """Returns the string representation of the model using alias"""
44
+ return pprint.pformat(self.model_dump(by_alias=True))
45
+
46
+ def to_json(self) -> str:
47
+ """Returns the JSON representation of the model using alias"""
48
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
49
+ return json.dumps(self.to_dict())
50
+
51
+ @classmethod
52
+ def from_json(cls, json_str: str) -> Optional[Self]:
53
+ """Create an instance of AbstractReply from a JSON string"""
54
+ return cls.from_dict(json.loads(json_str))
55
+
56
+ def to_dict(self) -> Dict[str, Any]:
57
+ """Return the dictionary representation of the model using alias.
58
+
59
+ This has the following differences from calling pydantic's
60
+ `self.model_dump(by_alias=True)`:
61
+
62
+ * `None` is only added to the output dict for nullable fields that
63
+ were set at model initialization. Other fields with value `None`
64
+ are ignored.
65
+ """
66
+ excluded_fields: Set[str] = set([
67
+ ])
68
+
69
+ _dict = self.model_dump(
70
+ by_alias=True,
71
+ exclude=excluded_fields,
72
+ exclude_none=True,
73
+ )
74
+ # set to None if result_set_id (nullable) is None
75
+ # and model_fields_set contains the field
76
+ if self.result_set_id is None and "result_set_id" in self.model_fields_set:
77
+ _dict['resultSetId'] = None
78
+
79
+ return _dict
80
+
81
+ @classmethod
82
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
83
+ """Create an instance of AbstractReply from a dict"""
84
+ if obj is None:
85
+ return None
86
+
87
+ if not isinstance(obj, dict):
88
+ return cls.model_validate(obj)
89
+
90
+ _obj = cls.model_validate({
91
+ "text": obj.get("text"),
92
+ "relevanceScore": obj.get("relevanceScore"),
93
+ "resultSetId": obj.get("resultSetId")
94
+ })
95
+ return _obj
96
+
97
+
@@ -0,0 +1,95 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ GoodMem API
5
+
6
+ API for interacting with the GoodMem service, providing vector-based memory storage and retrieval with multiple embedder support. The service enables creation of memory spaces, storing memories with vector representations, and efficient similarity-based retrieval.
7
+
8
+ The version of the OpenAPI document: v1
9
+ Contact: support@goodmem.io
10
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
11
+
12
+ Do not edit the class manually.
13
+ """ # noqa: E501
14
+
15
+
16
+ from __future__ import annotations
17
+ import pprint
18
+ import re # noqa: F401
19
+ import json
20
+
21
+ from datetime import datetime
22
+ from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr
23
+ from typing import Any, ClassVar, Dict, List, Optional
24
+ from typing import Optional, Set
25
+ from typing_extensions import Self
26
+
27
+ class ActiveLicenseMetadata(BaseModel):
28
+ """
29
+ ActiveLicenseMetadata
30
+ """ # noqa: E501
31
+ filename: Optional[StrictStr] = None
32
+ sha256: Optional[StrictStr] = None
33
+ size_bytes: StrictInt = Field(alias="sizeBytes")
34
+ modified_at: Optional[datetime] = Field(default=None, alias="modifiedAt")
35
+ __properties: ClassVar[List[str]] = ["filename", "sha256", "sizeBytes", "modifiedAt"]
36
+
37
+ model_config = ConfigDict(
38
+ populate_by_name=True,
39
+ validate_assignment=True,
40
+ protected_namespaces=(),
41
+ )
42
+
43
+
44
+ def to_str(self) -> str:
45
+ """Returns the string representation of the model using alias"""
46
+ return pprint.pformat(self.model_dump(by_alias=True))
47
+
48
+ def to_json(self) -> str:
49
+ """Returns the JSON representation of the model using alias"""
50
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
51
+ return json.dumps(self.to_dict())
52
+
53
+ @classmethod
54
+ def from_json(cls, json_str: str) -> Optional[Self]:
55
+ """Create an instance of ActiveLicenseMetadata from a JSON string"""
56
+ return cls.from_dict(json.loads(json_str))
57
+
58
+ def to_dict(self) -> Dict[str, Any]:
59
+ """Return the dictionary representation of the model using alias.
60
+
61
+ This has the following differences from calling pydantic's
62
+ `self.model_dump(by_alias=True)`:
63
+
64
+ * `None` is only added to the output dict for nullable fields that
65
+ were set at model initialization. Other fields with value `None`
66
+ are ignored.
67
+ """
68
+ excluded_fields: Set[str] = set([
69
+ ])
70
+
71
+ _dict = self.model_dump(
72
+ by_alias=True,
73
+ exclude=excluded_fields,
74
+ exclude_none=True,
75
+ )
76
+ return _dict
77
+
78
+ @classmethod
79
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
80
+ """Create an instance of ActiveLicenseMetadata from a dict"""
81
+ if obj is None:
82
+ return None
83
+
84
+ if not isinstance(obj, dict):
85
+ return cls.model_validate(obj)
86
+
87
+ _obj = cls.model_validate({
88
+ "filename": obj.get("filename"),
89
+ "sha256": obj.get("sha256"),
90
+ "sizeBytes": obj.get("sizeBytes"),
91
+ "modifiedAt": obj.get("modifiedAt")
92
+ })
93
+ return _obj
94
+
95
+