hindsight-client 0.2.1__py3-none-any.whl → 0.4.0__py3-none-any.whl

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 (60) hide show
  1. hindsight_client/__init__.py +9 -8
  2. hindsight_client/hindsight_client.py +396 -59
  3. {hindsight_client-0.2.1.dist-info → hindsight_client-0.4.0.dist-info}/METADATA +1 -1
  4. hindsight_client-0.4.0.dist-info/RECORD +89 -0
  5. hindsight_client_api/__init__.py +27 -0
  6. hindsight_client_api/api/__init__.py +2 -0
  7. hindsight_client_api/api/banks_api.py +1012 -131
  8. hindsight_client_api/api/directives_api.py +1619 -0
  9. hindsight_client_api/api/entities_api.py +29 -9
  10. hindsight_client_api/api/memory_api.py +713 -73
  11. hindsight_client_api/api/mental_models_api.py +1897 -0
  12. hindsight_client_api/api/monitoring_api.py +246 -0
  13. hindsight_client_api/api/operations_api.py +350 -4
  14. hindsight_client_api/models/__init__.py +25 -0
  15. hindsight_client_api/models/add_background_request.py +2 -2
  16. hindsight_client_api/models/async_operation_submit_response.py +89 -0
  17. hindsight_client_api/models/background_response.py +10 -3
  18. hindsight_client_api/models/bank_list_item.py +6 -6
  19. hindsight_client_api/models/bank_profile_response.py +11 -4
  20. hindsight_client_api/models/bank_stats_response.py +15 -4
  21. hindsight_client_api/models/consolidation_response.py +89 -0
  22. hindsight_client_api/models/create_bank_request.py +8 -1
  23. hindsight_client_api/models/create_directive_request.py +95 -0
  24. hindsight_client_api/models/create_mental_model_request.py +100 -0
  25. hindsight_client_api/models/create_mental_model_response.py +87 -0
  26. hindsight_client_api/models/directive_list_response.py +95 -0
  27. hindsight_client_api/models/directive_response.py +113 -0
  28. hindsight_client_api/models/document_response.py +5 -3
  29. hindsight_client_api/models/entity_list_response.py +9 -3
  30. hindsight_client_api/models/features_info.py +91 -0
  31. hindsight_client_api/models/graph_data_response.py +4 -2
  32. hindsight_client_api/models/list_tags_response.py +101 -0
  33. hindsight_client_api/models/memory_item.py +9 -2
  34. hindsight_client_api/models/mental_model_list_response.py +95 -0
  35. hindsight_client_api/models/mental_model_response.py +126 -0
  36. hindsight_client_api/models/mental_model_trigger.py +87 -0
  37. hindsight_client_api/models/operation_response.py +1 -1
  38. hindsight_client_api/models/operation_status_response.py +131 -0
  39. hindsight_client_api/models/operations_list_response.py +8 -2
  40. hindsight_client_api/models/recall_request.py +22 -3
  41. hindsight_client_api/models/recall_result.py +9 -2
  42. hindsight_client_api/models/reflect_based_on.py +115 -0
  43. hindsight_client_api/models/reflect_directive.py +91 -0
  44. hindsight_client_api/models/reflect_include_options.py +13 -2
  45. hindsight_client_api/models/reflect_llm_call.py +89 -0
  46. hindsight_client_api/models/reflect_mental_model.py +96 -0
  47. hindsight_client_api/models/reflect_request.py +22 -3
  48. hindsight_client_api/models/reflect_response.py +34 -11
  49. hindsight_client_api/models/reflect_tool_call.py +100 -0
  50. hindsight_client_api/models/reflect_trace.py +105 -0
  51. hindsight_client_api/models/retain_request.py +10 -3
  52. hindsight_client_api/models/retain_response.py +21 -3
  53. hindsight_client_api/models/tag_item.py +89 -0
  54. hindsight_client_api/models/token_usage.py +91 -0
  55. hindsight_client_api/models/tool_calls_include_options.py +87 -0
  56. hindsight_client_api/models/update_directive_request.py +120 -0
  57. hindsight_client_api/models/update_mental_model_request.py +125 -0
  58. hindsight_client_api/models/version_response.py +93 -0
  59. hindsight_client-0.2.1.dist-info/RECORD +0 -62
  60. {hindsight_client-0.2.1.dist-info → hindsight_client-0.4.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,96 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Hindsight HTTP API
5
+
6
+ HTTP API for Hindsight
7
+
8
+ The version of the OpenAPI document: 0.1.0
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from pydantic import BaseModel, ConfigDict, Field, StrictStr
21
+ from typing import Any, ClassVar, Dict, List, Optional
22
+ from typing import Optional, Set
23
+ from typing_extensions import Self
24
+
25
+ class ReflectMentalModel(BaseModel):
26
+ """
27
+ A mental model used during reflect.
28
+ """ # noqa: E501
29
+ id: StrictStr = Field(description="Mental model ID")
30
+ text: StrictStr = Field(description="Mental model content")
31
+ context: Optional[StrictStr] = None
32
+ __properties: ClassVar[List[str]] = ["id", "text", "context"]
33
+
34
+ model_config = ConfigDict(
35
+ populate_by_name=True,
36
+ validate_assignment=True,
37
+ protected_namespaces=(),
38
+ )
39
+
40
+
41
+ def to_str(self) -> str:
42
+ """Returns the string representation of the model using alias"""
43
+ return pprint.pformat(self.model_dump(by_alias=True))
44
+
45
+ def to_json(self) -> str:
46
+ """Returns the JSON representation of the model using alias"""
47
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
48
+ return json.dumps(self.to_dict())
49
+
50
+ @classmethod
51
+ def from_json(cls, json_str: str) -> Optional[Self]:
52
+ """Create an instance of ReflectMentalModel from a JSON string"""
53
+ return cls.from_dict(json.loads(json_str))
54
+
55
+ def to_dict(self) -> Dict[str, Any]:
56
+ """Return the dictionary representation of the model using alias.
57
+
58
+ This has the following differences from calling pydantic's
59
+ `self.model_dump(by_alias=True)`:
60
+
61
+ * `None` is only added to the output dict for nullable fields that
62
+ were set at model initialization. Other fields with value `None`
63
+ are ignored.
64
+ """
65
+ excluded_fields: Set[str] = set([
66
+ ])
67
+
68
+ _dict = self.model_dump(
69
+ by_alias=True,
70
+ exclude=excluded_fields,
71
+ exclude_none=True,
72
+ )
73
+ # set to None if context (nullable) is None
74
+ # and model_fields_set contains the field
75
+ if self.context is None and "context" in self.model_fields_set:
76
+ _dict['context'] = None
77
+
78
+ return _dict
79
+
80
+ @classmethod
81
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
82
+ """Create an instance of ReflectMentalModel from a dict"""
83
+ if obj is None:
84
+ return None
85
+
86
+ if not isinstance(obj, dict):
87
+ return cls.model_validate(obj)
88
+
89
+ _obj = cls.model_validate({
90
+ "id": obj.get("id"),
91
+ "text": obj.get("text"),
92
+ "context": obj.get("context")
93
+ })
94
+ return _obj
95
+
96
+
@@ -17,7 +17,7 @@ import pprint
17
17
  import re # noqa: F401
18
18
  import json
19
19
 
20
- from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr
20
+ from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr, field_validator
21
21
  from typing import Any, ClassVar, Dict, List, Optional
22
22
  from hindsight_client_api.models.budget import Budget
23
23
  from hindsight_client_api.models.reflect_include_options import ReflectIncludeOptions
@@ -34,7 +34,19 @@ class ReflectRequest(BaseModel):
34
34
  max_tokens: Optional[StrictInt] = Field(default=4096, description="Maximum tokens for the response")
35
35
  include: Optional[ReflectIncludeOptions] = Field(default=None, description="Options for including additional data (disabled by default)")
36
36
  response_schema: Optional[Dict[str, Any]] = None
37
- __properties: ClassVar[List[str]] = ["query", "budget", "context", "max_tokens", "include", "response_schema"]
37
+ tags: Optional[List[StrictStr]] = None
38
+ tags_match: Optional[StrictStr] = Field(default='any', description="How to match tags: 'any' (OR, includes untagged), 'all' (AND, includes untagged), 'any_strict' (OR, excludes untagged), 'all_strict' (AND, excludes untagged).")
39
+ __properties: ClassVar[List[str]] = ["query", "budget", "context", "max_tokens", "include", "response_schema", "tags", "tags_match"]
40
+
41
+ @field_validator('tags_match')
42
+ def tags_match_validate_enum(cls, value):
43
+ """Validates the enum"""
44
+ if value is None:
45
+ return value
46
+
47
+ if value not in set(['any', 'all', 'any_strict', 'all_strict']):
48
+ raise ValueError("must be one of enum values ('any', 'all', 'any_strict', 'all_strict')")
49
+ return value
38
50
 
39
51
  model_config = ConfigDict(
40
52
  populate_by_name=True,
@@ -88,6 +100,11 @@ class ReflectRequest(BaseModel):
88
100
  if self.response_schema is None and "response_schema" in self.model_fields_set:
89
101
  _dict['response_schema'] = None
90
102
 
103
+ # set to None if tags (nullable) is None
104
+ # and model_fields_set contains the field
105
+ if self.tags is None and "tags" in self.model_fields_set:
106
+ _dict['tags'] = None
107
+
91
108
  return _dict
92
109
 
93
110
  @classmethod
@@ -105,7 +122,9 @@ class ReflectRequest(BaseModel):
105
122
  "context": obj.get("context"),
106
123
  "max_tokens": obj.get("max_tokens") if obj.get("max_tokens") is not None else 4096,
107
124
  "include": ReflectIncludeOptions.from_dict(obj["include"]) if obj.get("include") is not None else None,
108
- "response_schema": obj.get("response_schema")
125
+ "response_schema": obj.get("response_schema"),
126
+ "tags": obj.get("tags"),
127
+ "tags_match": obj.get("tags_match") if obj.get("tags_match") is not None else 'any'
109
128
  })
110
129
  return _obj
111
130
 
@@ -19,7 +19,9 @@ import json
19
19
 
20
20
  from pydantic import BaseModel, ConfigDict, StrictStr
21
21
  from typing import Any, ClassVar, Dict, List, Optional
22
- from hindsight_client_api.models.reflect_fact import ReflectFact
22
+ from hindsight_client_api.models.reflect_based_on import ReflectBasedOn
23
+ from hindsight_client_api.models.reflect_trace import ReflectTrace
24
+ from hindsight_client_api.models.token_usage import TokenUsage
23
25
  from typing import Optional, Set
24
26
  from typing_extensions import Self
25
27
 
@@ -28,9 +30,11 @@ class ReflectResponse(BaseModel):
28
30
  Response model for think endpoint.
29
31
  """ # noqa: E501
30
32
  text: StrictStr
31
- based_on: Optional[List[ReflectFact]] = None
33
+ based_on: Optional[ReflectBasedOn] = None
32
34
  structured_output: Optional[Dict[str, Any]] = None
33
- __properties: ClassVar[List[str]] = ["text", "based_on", "structured_output"]
35
+ usage: Optional[TokenUsage] = None
36
+ trace: Optional[ReflectTrace] = None
37
+ __properties: ClassVar[List[str]] = ["text", "based_on", "structured_output", "usage", "trace"]
34
38
 
35
39
  model_config = ConfigDict(
36
40
  populate_by_name=True,
@@ -71,18 +75,35 @@ class ReflectResponse(BaseModel):
71
75
  exclude=excluded_fields,
72
76
  exclude_none=True,
73
77
  )
74
- # override the default output from pydantic by calling `to_dict()` of each item in based_on (list)
75
- _items = []
78
+ # override the default output from pydantic by calling `to_dict()` of based_on
76
79
  if self.based_on:
77
- for _item_based_on in self.based_on:
78
- if _item_based_on:
79
- _items.append(_item_based_on.to_dict())
80
- _dict['based_on'] = _items
80
+ _dict['based_on'] = self.based_on.to_dict()
81
+ # override the default output from pydantic by calling `to_dict()` of usage
82
+ if self.usage:
83
+ _dict['usage'] = self.usage.to_dict()
84
+ # override the default output from pydantic by calling `to_dict()` of trace
85
+ if self.trace:
86
+ _dict['trace'] = self.trace.to_dict()
87
+ # set to None if based_on (nullable) is None
88
+ # and model_fields_set contains the field
89
+ if self.based_on is None and "based_on" in self.model_fields_set:
90
+ _dict['based_on'] = None
91
+
81
92
  # set to None if structured_output (nullable) is None
82
93
  # and model_fields_set contains the field
83
94
  if self.structured_output is None and "structured_output" in self.model_fields_set:
84
95
  _dict['structured_output'] = None
85
96
 
97
+ # set to None if usage (nullable) is None
98
+ # and model_fields_set contains the field
99
+ if self.usage is None and "usage" in self.model_fields_set:
100
+ _dict['usage'] = None
101
+
102
+ # set to None if trace (nullable) is None
103
+ # and model_fields_set contains the field
104
+ if self.trace is None and "trace" in self.model_fields_set:
105
+ _dict['trace'] = None
106
+
86
107
  return _dict
87
108
 
88
109
  @classmethod
@@ -96,8 +117,10 @@ class ReflectResponse(BaseModel):
96
117
 
97
118
  _obj = cls.model_validate({
98
119
  "text": obj.get("text"),
99
- "based_on": [ReflectFact.from_dict(_item) for _item in obj["based_on"]] if obj.get("based_on") is not None else None,
100
- "structured_output": obj.get("structured_output")
120
+ "based_on": ReflectBasedOn.from_dict(obj["based_on"]) if obj.get("based_on") is not None else None,
121
+ "structured_output": obj.get("structured_output"),
122
+ "usage": TokenUsage.from_dict(obj["usage"]) if obj.get("usage") is not None else None,
123
+ "trace": ReflectTrace.from_dict(obj["trace"]) if obj.get("trace") is not None else None
101
124
  })
102
125
  return _obj
103
126
 
@@ -0,0 +1,100 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Hindsight HTTP API
5
+
6
+ HTTP API for Hindsight
7
+
8
+ The version of the OpenAPI document: 0.1.0
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr
21
+ from typing import Any, ClassVar, Dict, List, Optional
22
+ from typing import Optional, Set
23
+ from typing_extensions import Self
24
+
25
+ class ReflectToolCall(BaseModel):
26
+ """
27
+ A tool call made during reflect agent execution.
28
+ """ # noqa: E501
29
+ tool: StrictStr = Field(description="Tool name: lookup, recall, learn, expand")
30
+ input: Dict[str, Any] = Field(description="Tool input parameters")
31
+ output: Optional[Dict[str, Any]] = None
32
+ duration_ms: StrictInt = Field(description="Execution time in milliseconds")
33
+ iteration: Optional[StrictInt] = Field(default=0, description="Iteration number (1-based) when this tool was called")
34
+ __properties: ClassVar[List[str]] = ["tool", "input", "output", "duration_ms", "iteration"]
35
+
36
+ model_config = ConfigDict(
37
+ populate_by_name=True,
38
+ validate_assignment=True,
39
+ protected_namespaces=(),
40
+ )
41
+
42
+
43
+ def to_str(self) -> str:
44
+ """Returns the string representation of the model using alias"""
45
+ return pprint.pformat(self.model_dump(by_alias=True))
46
+
47
+ def to_json(self) -> str:
48
+ """Returns the JSON representation of the model using alias"""
49
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
50
+ return json.dumps(self.to_dict())
51
+
52
+ @classmethod
53
+ def from_json(cls, json_str: str) -> Optional[Self]:
54
+ """Create an instance of ReflectToolCall from a JSON string"""
55
+ return cls.from_dict(json.loads(json_str))
56
+
57
+ def to_dict(self) -> Dict[str, Any]:
58
+ """Return the dictionary representation of the model using alias.
59
+
60
+ This has the following differences from calling pydantic's
61
+ `self.model_dump(by_alias=True)`:
62
+
63
+ * `None` is only added to the output dict for nullable fields that
64
+ were set at model initialization. Other fields with value `None`
65
+ are ignored.
66
+ """
67
+ excluded_fields: Set[str] = set([
68
+ ])
69
+
70
+ _dict = self.model_dump(
71
+ by_alias=True,
72
+ exclude=excluded_fields,
73
+ exclude_none=True,
74
+ )
75
+ # set to None if output (nullable) is None
76
+ # and model_fields_set contains the field
77
+ if self.output is None and "output" in self.model_fields_set:
78
+ _dict['output'] = None
79
+
80
+ return _dict
81
+
82
+ @classmethod
83
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
84
+ """Create an instance of ReflectToolCall from a dict"""
85
+ if obj is None:
86
+ return None
87
+
88
+ if not isinstance(obj, dict):
89
+ return cls.model_validate(obj)
90
+
91
+ _obj = cls.model_validate({
92
+ "tool": obj.get("tool"),
93
+ "input": obj.get("input"),
94
+ "output": obj.get("output"),
95
+ "duration_ms": obj.get("duration_ms"),
96
+ "iteration": obj.get("iteration") if obj.get("iteration") is not None else 0
97
+ })
98
+ return _obj
99
+
100
+
@@ -0,0 +1,105 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Hindsight HTTP API
5
+
6
+ HTTP API for Hindsight
7
+
8
+ The version of the OpenAPI document: 0.1.0
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from pydantic import BaseModel, ConfigDict, Field
21
+ from typing import Any, ClassVar, Dict, List, Optional
22
+ from hindsight_client_api.models.reflect_llm_call import ReflectLLMCall
23
+ from hindsight_client_api.models.reflect_tool_call import ReflectToolCall
24
+ from typing import Optional, Set
25
+ from typing_extensions import Self
26
+
27
+ class ReflectTrace(BaseModel):
28
+ """
29
+ Execution trace of LLM and tool calls during reflection.
30
+ """ # noqa: E501
31
+ tool_calls: Optional[List[ReflectToolCall]] = Field(default=None, description="Tool calls made during reflection")
32
+ llm_calls: Optional[List[ReflectLLMCall]] = Field(default=None, description="LLM calls made during reflection")
33
+ __properties: ClassVar[List[str]] = ["tool_calls", "llm_calls"]
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 ReflectTrace 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
+ # override the default output from pydantic by calling `to_dict()` of each item in tool_calls (list)
75
+ _items = []
76
+ if self.tool_calls:
77
+ for _item_tool_calls in self.tool_calls:
78
+ if _item_tool_calls:
79
+ _items.append(_item_tool_calls.to_dict())
80
+ _dict['tool_calls'] = _items
81
+ # override the default output from pydantic by calling `to_dict()` of each item in llm_calls (list)
82
+ _items = []
83
+ if self.llm_calls:
84
+ for _item_llm_calls in self.llm_calls:
85
+ if _item_llm_calls:
86
+ _items.append(_item_llm_calls.to_dict())
87
+ _dict['llm_calls'] = _items
88
+ return _dict
89
+
90
+ @classmethod
91
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
92
+ """Create an instance of ReflectTrace from a dict"""
93
+ if obj is None:
94
+ return None
95
+
96
+ if not isinstance(obj, dict):
97
+ return cls.model_validate(obj)
98
+
99
+ _obj = cls.model_validate({
100
+ "tool_calls": [ReflectToolCall.from_dict(_item) for _item in obj["tool_calls"]] if obj.get("tool_calls") is not None else None,
101
+ "llm_calls": [ReflectLLMCall.from_dict(_item) for _item in obj["llm_calls"]] if obj.get("llm_calls") is not None else None
102
+ })
103
+ return _obj
104
+
105
+
@@ -17,7 +17,7 @@ import pprint
17
17
  import re # noqa: F401
18
18
  import json
19
19
 
20
- from pydantic import BaseModel, ConfigDict, Field, StrictBool
20
+ from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictStr
21
21
  from typing import Any, ClassVar, Dict, List, Optional
22
22
  from hindsight_client_api.models.memory_item import MemoryItem
23
23
  from typing import Optional, Set
@@ -29,7 +29,8 @@ class RetainRequest(BaseModel):
29
29
  """ # noqa: E501
30
30
  items: List[MemoryItem]
31
31
  var_async: Optional[StrictBool] = Field(default=False, description="If true, process asynchronously in background. If false, wait for completion (default: false)", alias="async")
32
- __properties: ClassVar[List[str]] = ["items", "async"]
32
+ document_tags: Optional[List[StrictStr]] = None
33
+ __properties: ClassVar[List[str]] = ["items", "async", "document_tags"]
33
34
 
34
35
  model_config = ConfigDict(
35
36
  populate_by_name=True,
@@ -77,6 +78,11 @@ class RetainRequest(BaseModel):
77
78
  if _item_items:
78
79
  _items.append(_item_items.to_dict())
79
80
  _dict['items'] = _items
81
+ # set to None if document_tags (nullable) is None
82
+ # and model_fields_set contains the field
83
+ if self.document_tags is None and "document_tags" in self.model_fields_set:
84
+ _dict['document_tags'] = None
85
+
80
86
  return _dict
81
87
 
82
88
  @classmethod
@@ -90,7 +96,8 @@ class RetainRequest(BaseModel):
90
96
 
91
97
  _obj = cls.model_validate({
92
98
  "items": [MemoryItem.from_dict(_item) for _item in obj["items"]] if obj.get("items") is not None else None,
93
- "async": obj.get("async") if obj.get("async") is not None else False
99
+ "async": obj.get("async") if obj.get("async") is not None else False,
100
+ "document_tags": obj.get("document_tags")
94
101
  })
95
102
  return _obj
96
103
 
@@ -18,7 +18,8 @@ import re # noqa: F401
18
18
  import json
19
19
 
20
20
  from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictInt, StrictStr
21
- from typing import Any, ClassVar, Dict, List
21
+ from typing import Any, ClassVar, Dict, List, Optional
22
+ from hindsight_client_api.models.token_usage import TokenUsage
22
23
  from typing import Optional, Set
23
24
  from typing_extensions import Self
24
25
 
@@ -30,7 +31,9 @@ class RetainResponse(BaseModel):
30
31
  bank_id: StrictStr
31
32
  items_count: StrictInt
32
33
  var_async: StrictBool = Field(description="Whether the operation was processed asynchronously", alias="async")
33
- __properties: ClassVar[List[str]] = ["success", "bank_id", "items_count", "async"]
34
+ operation_id: Optional[StrictStr] = None
35
+ usage: Optional[TokenUsage] = None
36
+ __properties: ClassVar[List[str]] = ["success", "bank_id", "items_count", "async", "operation_id", "usage"]
34
37
 
35
38
  model_config = ConfigDict(
36
39
  populate_by_name=True,
@@ -71,6 +74,19 @@ class RetainResponse(BaseModel):
71
74
  exclude=excluded_fields,
72
75
  exclude_none=True,
73
76
  )
77
+ # override the default output from pydantic by calling `to_dict()` of usage
78
+ if self.usage:
79
+ _dict['usage'] = self.usage.to_dict()
80
+ # set to None if operation_id (nullable) is None
81
+ # and model_fields_set contains the field
82
+ if self.operation_id is None and "operation_id" in self.model_fields_set:
83
+ _dict['operation_id'] = None
84
+
85
+ # set to None if usage (nullable) is None
86
+ # and model_fields_set contains the field
87
+ if self.usage is None and "usage" in self.model_fields_set:
88
+ _dict['usage'] = None
89
+
74
90
  return _dict
75
91
 
76
92
  @classmethod
@@ -86,7 +102,9 @@ class RetainResponse(BaseModel):
86
102
  "success": obj.get("success"),
87
103
  "bank_id": obj.get("bank_id"),
88
104
  "items_count": obj.get("items_count"),
89
- "async": obj.get("async")
105
+ "async": obj.get("async"),
106
+ "operation_id": obj.get("operation_id"),
107
+ "usage": TokenUsage.from_dict(obj["usage"]) if obj.get("usage") is not None else None
90
108
  })
91
109
  return _obj
92
110
 
@@ -0,0 +1,89 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Hindsight HTTP API
5
+
6
+ HTTP API for Hindsight
7
+
8
+ The version of the OpenAPI document: 0.1.0
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr
21
+ from typing import Any, ClassVar, Dict, List
22
+ from typing import Optional, Set
23
+ from typing_extensions import Self
24
+
25
+ class TagItem(BaseModel):
26
+ """
27
+ Single tag with usage count.
28
+ """ # noqa: E501
29
+ tag: StrictStr = Field(description="The tag value")
30
+ count: StrictInt = Field(description="Number of memories with this tag")
31
+ __properties: ClassVar[List[str]] = ["tag", "count"]
32
+
33
+ model_config = ConfigDict(
34
+ populate_by_name=True,
35
+ validate_assignment=True,
36
+ protected_namespaces=(),
37
+ )
38
+
39
+
40
+ def to_str(self) -> str:
41
+ """Returns the string representation of the model using alias"""
42
+ return pprint.pformat(self.model_dump(by_alias=True))
43
+
44
+ def to_json(self) -> str:
45
+ """Returns the JSON representation of the model using alias"""
46
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
47
+ return json.dumps(self.to_dict())
48
+
49
+ @classmethod
50
+ def from_json(cls, json_str: str) -> Optional[Self]:
51
+ """Create an instance of TagItem from a JSON string"""
52
+ return cls.from_dict(json.loads(json_str))
53
+
54
+ def to_dict(self) -> Dict[str, Any]:
55
+ """Return the dictionary representation of the model using alias.
56
+
57
+ This has the following differences from calling pydantic's
58
+ `self.model_dump(by_alias=True)`:
59
+
60
+ * `None` is only added to the output dict for nullable fields that
61
+ were set at model initialization. Other fields with value `None`
62
+ are ignored.
63
+ """
64
+ excluded_fields: Set[str] = set([
65
+ ])
66
+
67
+ _dict = self.model_dump(
68
+ by_alias=True,
69
+ exclude=excluded_fields,
70
+ exclude_none=True,
71
+ )
72
+ return _dict
73
+
74
+ @classmethod
75
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
76
+ """Create an instance of TagItem from a dict"""
77
+ if obj is None:
78
+ return None
79
+
80
+ if not isinstance(obj, dict):
81
+ return cls.model_validate(obj)
82
+
83
+ _obj = cls.model_validate({
84
+ "tag": obj.get("tag"),
85
+ "count": obj.get("count")
86
+ })
87
+ return _obj
88
+
89
+