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.
- goodmem-0.1.2/PKG-INFO +86 -0
- goodmem-0.1.2/README.md +54 -0
- goodmem-0.1.2/goodmem/__init__.py +28 -0
- goodmem-0.1.2/goodmem/_base.py +156 -0
- goodmem-0.1.2/goodmem/_generated/__init__.py +2 -0
- goodmem-0.1.2/goodmem/_generated/models/__init__.py +116 -0
- goodmem-0.1.2/goodmem/_generated/models/abstract_reply.py +97 -0
- goodmem-0.1.2/goodmem/_generated/models/active_license_metadata.py +95 -0
- goodmem-0.1.2/goodmem/_generated/models/admin_drain_request.py +92 -0
- goodmem-0.1.2/goodmem/_generated/models/admin_drain_response.py +92 -0
- goodmem-0.1.2/goodmem/_generated/models/admin_purge_jobs_request.py +94 -0
- goodmem-0.1.2/goodmem/_generated/models/admin_purge_jobs_response.py +94 -0
- goodmem-0.1.2/goodmem/_generated/models/admin_reload_license_response.py +96 -0
- goodmem-0.1.2/goodmem/_generated/models/api_key_auth.py +113 -0
- goodmem-0.1.2/goodmem/_generated/models/api_key_response.py +128 -0
- goodmem-0.1.2/goodmem/_generated/models/background_job_attempt.py +162 -0
- goodmem-0.1.2/goodmem/_generated/models/background_job_summary.py +131 -0
- goodmem-0.1.2/goodmem/_generated/models/batch_delete_memory_selector_request.py +99 -0
- goodmem-0.1.2/goodmem/_generated/models/batch_memory_creation_request.py +96 -0
- goodmem-0.1.2/goodmem/_generated/models/batch_memory_deletion_request.py +96 -0
- goodmem-0.1.2/goodmem/_generated/models/batch_memory_response.py +96 -0
- goodmem-0.1.2/goodmem/_generated/models/batch_memory_result.py +107 -0
- goodmem-0.1.2/goodmem/_generated/models/batch_memory_retrieval_request.py +102 -0
- goodmem-0.1.2/goodmem/_generated/models/binary_content.py +90 -0
- goodmem-0.1.2/goodmem/_generated/models/bounding_box.py +94 -0
- goodmem-0.1.2/goodmem/_generated/models/chunk_reference.py +98 -0
- goodmem-0.1.2/goodmem/_generated/models/chunking_configuration.py +100 -0
- goodmem-0.1.2/goodmem/_generated/models/context_item.py +101 -0
- goodmem-0.1.2/goodmem/_generated/models/create_api_key_request.py +107 -0
- goodmem-0.1.2/goodmem/_generated/models/create_api_key_response.py +94 -0
- goodmem-0.1.2/goodmem/_generated/models/create_llm_response.py +102 -0
- goodmem-0.1.2/goodmem/_generated/models/credential_kind.py +39 -0
- goodmem-0.1.2/goodmem/_generated/models/distribution_type.py +38 -0
- goodmem-0.1.2/goodmem/_generated/models/document_timings.py +96 -0
- goodmem-0.1.2/goodmem/_generated/models/embedder_creation_request.py +170 -0
- goodmem-0.1.2/goodmem/_generated/models/embedder_response.py +163 -0
- goodmem-0.1.2/goodmem/_generated/models/embedder_weight.py +90 -0
- goodmem-0.1.2/goodmem/_generated/models/endpoint_authentication.py +108 -0
- goodmem-0.1.2/goodmem/_generated/models/error_detail.py +90 -0
- goodmem-0.1.2/goodmem/_generated/models/filtered_delete_memory_selector_request.py +102 -0
- goodmem-0.1.2/goodmem/_generated/models/gcp_adc_auth.py +100 -0
- goodmem-0.1.2/goodmem/_generated/models/good_mem_status.py +90 -0
- goodmem-0.1.2/goodmem/_generated/models/image_info.py +92 -0
- goodmem-0.1.2/goodmem/_generated/models/length_measurement.py +39 -0
- goodmem-0.1.2/goodmem/_generated/models/list_api_keys_response.py +96 -0
- goodmem-0.1.2/goodmem/_generated/models/list_embedders_response.py +96 -0
- goodmem-0.1.2/goodmem/_generated/models/list_llms_response.py +96 -0
- goodmem-0.1.2/goodmem/_generated/models/list_rerankers_response.py +96 -0
- goodmem-0.1.2/goodmem/_generated/models/list_spaces_response.py +103 -0
- goodmem-0.1.2/goodmem/_generated/models/llm_capabilities.py +128 -0
- goodmem-0.1.2/goodmem/_generated/models/llm_creation_request.py +184 -0
- goodmem-0.1.2/goodmem/_generated/models/llm_provider_type.py +43 -0
- goodmem-0.1.2/goodmem/_generated/models/llm_response.py +177 -0
- goodmem-0.1.2/goodmem/_generated/models/llm_sampling_params.py +135 -0
- goodmem-0.1.2/goodmem/_generated/models/llm_update_request.py +189 -0
- goodmem-0.1.2/goodmem/_generated/models/memory.py +149 -0
- goodmem-0.1.2/goodmem/_generated/models/memory_chunk_response.py +118 -0
- goodmem-0.1.2/goodmem/_generated/models/memory_creation_request.py +138 -0
- goodmem-0.1.2/goodmem/_generated/models/memory_list_response.py +103 -0
- goodmem-0.1.2/goodmem/_generated/models/modality.py +40 -0
- goodmem-0.1.2/goodmem/_generated/models/ocr_category.py +50 -0
- goodmem-0.1.2/goodmem/_generated/models/ocr_cell.py +99 -0
- goodmem-0.1.2/goodmem/_generated/models/ocr_document_request.py +124 -0
- goodmem-0.1.2/goodmem/_generated/models/ocr_document_response.py +107 -0
- goodmem-0.1.2/goodmem/_generated/models/ocr_input_format.py +42 -0
- goodmem-0.1.2/goodmem/_generated/models/ocr_layout.py +96 -0
- goodmem-0.1.2/goodmem/_generated/models/ocr_page.py +118 -0
- goodmem-0.1.2/goodmem/_generated/models/ocr_page_result.py +100 -0
- goodmem-0.1.2/goodmem/_generated/models/page_timings.py +94 -0
- goodmem-0.1.2/goodmem/_generated/models/ping_endpoint_info.py +97 -0
- goodmem-0.1.2/goodmem/_generated/models/ping_event.py +104 -0
- goodmem-0.1.2/goodmem/_generated/models/ping_notice.py +97 -0
- goodmem-0.1.2/goodmem/_generated/models/ping_once_request.py +115 -0
- goodmem-0.1.2/goodmem/_generated/models/ping_payload_type.py +40 -0
- goodmem-0.1.2/goodmem/_generated/models/ping_result.py +124 -0
- goodmem-0.1.2/goodmem/_generated/models/ping_stream_request.py +150 -0
- goodmem-0.1.2/goodmem/_generated/models/ping_summary.py +125 -0
- goodmem-0.1.2/goodmem/_generated/models/ping_target_type.py +40 -0
- goodmem-0.1.2/goodmem/_generated/models/ping_timing.py +94 -0
- goodmem-0.1.2/goodmem/_generated/models/post_processor.py +95 -0
- goodmem-0.1.2/goodmem/_generated/models/processing_history.py +107 -0
- goodmem-0.1.2/goodmem/_generated/models/provider_type.py +43 -0
- goodmem-0.1.2/goodmem/_generated/models/recursive_chunking_configuration.py +110 -0
- goodmem-0.1.2/goodmem/_generated/models/reranker_creation_request.py +158 -0
- goodmem-0.1.2/goodmem/_generated/models/reranker_response.py +151 -0
- goodmem-0.1.2/goodmem/_generated/models/result_set_boundary.py +99 -0
- goodmem-0.1.2/goodmem/_generated/models/retrieve_memory_event.py +116 -0
- goodmem-0.1.2/goodmem/_generated/models/retrieve_memory_request.py +140 -0
- goodmem-0.1.2/goodmem/_generated/models/retrieved_item.py +98 -0
- goodmem-0.1.2/goodmem/_generated/models/rpc_status.py +95 -0
- goodmem-0.1.2/goodmem/_generated/models/secret_reference.py +95 -0
- goodmem-0.1.2/goodmem/_generated/models/sentence_chunking_configuration.py +100 -0
- goodmem-0.1.2/goodmem/_generated/models/separator_keep_strategy.py +39 -0
- goodmem-0.1.2/goodmem/_generated/models/space.py +125 -0
- goodmem-0.1.2/goodmem/_generated/models/space_creation_request.py +137 -0
- goodmem-0.1.2/goodmem/_generated/models/space_embedder.py +100 -0
- goodmem-0.1.2/goodmem/_generated/models/space_embedder_config.py +95 -0
- goodmem-0.1.2/goodmem/_generated/models/space_key.py +110 -0
- goodmem-0.1.2/goodmem/_generated/models/system_info_response.py +105 -0
- goodmem-0.1.2/goodmem/_generated/models/system_init_response.py +104 -0
- goodmem-0.1.2/goodmem/_generated/models/update_api_key_request.py +109 -0
- goodmem-0.1.2/goodmem/_generated/models/update_embedder_request.py +179 -0
- goodmem-0.1.2/goodmem/_generated/models/update_reranker_request.py +165 -0
- goodmem-0.1.2/goodmem/_generated/models/update_space_request.py +122 -0
- goodmem-0.1.2/goodmem/_generated/models/user_response.py +98 -0
- goodmem-0.1.2/goodmem/_registries.py +22 -0
- goodmem-0.1.2/goodmem/_schema_bridge.py +46 -0
- goodmem-0.1.2/goodmem/api/__init__.py +1 -0
- goodmem-0.1.2/goodmem/api/administration.py +81 -0
- goodmem-0.1.2/goodmem/api/api_keys.py +27 -0
- goodmem-0.1.2/goodmem/api/embedders.py +70 -0
- goodmem-0.1.2/goodmem/api/llms.py +86 -0
- goodmem-0.1.2/goodmem/api/memories.py +385 -0
- goodmem-0.1.2/goodmem/api/ocr.py +46 -0
- goodmem-0.1.2/goodmem/api/rerankers.py +64 -0
- goodmem-0.1.2/goodmem/api/spaces.py +55 -0
- goodmem-0.1.2/goodmem/api/system.py +55 -0
- goodmem-0.1.2/goodmem/api/users.py +59 -0
- goodmem-0.1.2/goodmem/client.py +118 -0
- goodmem-0.1.2/goodmem/errors.py +88 -0
- goodmem-0.1.2/goodmem/pagination.py +93 -0
- goodmem-0.1.2/goodmem/py.typed +0 -0
- goodmem-0.1.2/goodmem/streaming.py +106 -0
- goodmem-0.1.2/goodmem.egg-info/PKG-INFO +86 -0
- goodmem-0.1.2/goodmem.egg-info/SOURCES.txt +140 -0
- goodmem-0.1.2/goodmem.egg-info/dependency_links.txt +1 -0
- goodmem-0.1.2/goodmem.egg-info/requires.txt +11 -0
- goodmem-0.1.2/goodmem.egg-info/top_level.txt +1 -0
- goodmem-0.1.2/pyproject.toml +72 -0
- goodmem-0.1.2/setup.cfg +4 -0
- goodmem-0.1.2/tests/test_all_params.py +559 -0
- goodmem-0.1.2/tests/test_auth.py +32 -0
- goodmem-0.1.2/tests/test_crud_ops.py +514 -0
- goodmem-0.1.2/tests/test_embedders.py +120 -0
- goodmem-0.1.2/tests/test_errors.py +112 -0
- goodmem-0.1.2/tests/test_list_models_next_token.py +212 -0
- goodmem-0.1.2/tests/test_llms.py +98 -0
- goodmem-0.1.2/tests/test_memories.py +297 -0
- goodmem-0.1.2/tests/test_pagination.py +121 -0
- goodmem-0.1.2/tests/test_registries.py +57 -0
- goodmem-0.1.2/tests/test_rerankers.py +66 -0
- 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.
|
goodmem-0.1.2/README.md
ADDED
|
@@ -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,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
|
+
|