orq-ai-sdk 4.2.0rc28__py3-none-any.whl → 4.2.6__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 (167) hide show
  1. orq_ai_sdk/_hooks/globalhook.py +0 -1
  2. orq_ai_sdk/_version.py +3 -3
  3. orq_ai_sdk/audio.py +30 -0
  4. orq_ai_sdk/basesdk.py +20 -6
  5. orq_ai_sdk/chat.py +22 -0
  6. orq_ai_sdk/completions.py +332 -0
  7. orq_ai_sdk/contacts.py +43 -855
  8. orq_ai_sdk/deployments.py +61 -0
  9. orq_ai_sdk/edits.py +258 -0
  10. orq_ai_sdk/embeddings.py +238 -0
  11. orq_ai_sdk/generations.py +272 -0
  12. orq_ai_sdk/identities.py +1037 -0
  13. orq_ai_sdk/images.py +28 -0
  14. orq_ai_sdk/models/__init__.py +5341 -737
  15. orq_ai_sdk/models/actionreviewedstreamingevent.py +18 -1
  16. orq_ai_sdk/models/actionreviewrequestedstreamingevent.py +44 -1
  17. orq_ai_sdk/models/agenterroredstreamingevent.py +18 -1
  18. orq_ai_sdk/models/agentinactivestreamingevent.py +168 -70
  19. orq_ai_sdk/models/agentmessagecreatedstreamingevent.py +18 -2
  20. orq_ai_sdk/models/agentresponsemessage.py +18 -2
  21. orq_ai_sdk/models/agentstartedstreamingevent.py +127 -2
  22. orq_ai_sdk/models/agentthoughtstreamingevent.py +178 -211
  23. orq_ai_sdk/models/conversationresponse.py +31 -20
  24. orq_ai_sdk/models/conversationwithmessagesresponse.py +31 -20
  25. orq_ai_sdk/models/createagentrequestop.py +1922 -384
  26. orq_ai_sdk/models/createagentresponse.py +147 -91
  27. orq_ai_sdk/models/createagentresponserequestop.py +111 -2
  28. orq_ai_sdk/models/createchatcompletionop.py +1375 -861
  29. orq_ai_sdk/models/createchunkop.py +46 -19
  30. orq_ai_sdk/models/createcompletionop.py +1890 -0
  31. orq_ai_sdk/models/createcontactop.py +45 -56
  32. orq_ai_sdk/models/createconversationop.py +61 -39
  33. orq_ai_sdk/models/createconversationresponseop.py +68 -4
  34. orq_ai_sdk/models/createdatasetitemop.py +424 -80
  35. orq_ai_sdk/models/createdatasetop.py +19 -2
  36. orq_ai_sdk/models/createdatasourceop.py +92 -26
  37. orq_ai_sdk/models/createembeddingop.py +384 -0
  38. orq_ai_sdk/models/createevalop.py +552 -24
  39. orq_ai_sdk/models/createidentityop.py +176 -0
  40. orq_ai_sdk/models/createimageeditop.py +504 -0
  41. orq_ai_sdk/models/createimageop.py +208 -117
  42. orq_ai_sdk/models/createimagevariationop.py +486 -0
  43. orq_ai_sdk/models/createknowledgeop.py +186 -121
  44. orq_ai_sdk/models/creatememorydocumentop.py +50 -1
  45. orq_ai_sdk/models/creatememoryop.py +34 -21
  46. orq_ai_sdk/models/creatememorystoreop.py +34 -1
  47. orq_ai_sdk/models/createmoderationop.py +521 -0
  48. orq_ai_sdk/models/createpromptop.py +2748 -1252
  49. orq_ai_sdk/models/creatererankop.py +416 -0
  50. orq_ai_sdk/models/createresponseop.py +2567 -0
  51. orq_ai_sdk/models/createspeechop.py +316 -0
  52. orq_ai_sdk/models/createtoolop.py +537 -12
  53. orq_ai_sdk/models/createtranscriptionop.py +562 -0
  54. orq_ai_sdk/models/createtranslationop.py +540 -0
  55. orq_ai_sdk/models/datapart.py +18 -1
  56. orq_ai_sdk/models/deletechunksop.py +34 -1
  57. orq_ai_sdk/models/{deletecontactop.py → deleteidentityop.py} +9 -9
  58. orq_ai_sdk/models/deletepromptop.py +26 -0
  59. orq_ai_sdk/models/deploymentcreatemetricop.py +362 -76
  60. orq_ai_sdk/models/deploymentgetconfigop.py +635 -194
  61. orq_ai_sdk/models/deploymentinvokeop.py +168 -173
  62. orq_ai_sdk/models/deploymentsop.py +195 -58
  63. orq_ai_sdk/models/deploymentstreamop.py +652 -304
  64. orq_ai_sdk/models/errorpart.py +18 -1
  65. orq_ai_sdk/models/filecontentpartschema.py +18 -1
  66. orq_ai_sdk/models/filegetop.py +19 -2
  67. orq_ai_sdk/models/filelistop.py +35 -2
  68. orq_ai_sdk/models/filepart.py +50 -1
  69. orq_ai_sdk/models/fileuploadop.py +51 -2
  70. orq_ai_sdk/models/generateconversationnameop.py +31 -20
  71. orq_ai_sdk/models/get_v2_evaluators_id_versionsop.py +34 -1
  72. orq_ai_sdk/models/get_v2_tools_tool_id_versions_version_id_op.py +18 -1
  73. orq_ai_sdk/models/get_v2_tools_tool_id_versionsop.py +34 -1
  74. orq_ai_sdk/models/getallmemoriesop.py +34 -21
  75. orq_ai_sdk/models/getallmemorydocumentsop.py +42 -1
  76. orq_ai_sdk/models/getallmemorystoresop.py +34 -1
  77. orq_ai_sdk/models/getallpromptsop.py +1690 -230
  78. orq_ai_sdk/models/getalltoolsop.py +325 -8
  79. orq_ai_sdk/models/getchunkscountop.py +34 -1
  80. orq_ai_sdk/models/getevalsop.py +395 -43
  81. orq_ai_sdk/models/getonechunkop.py +14 -19
  82. orq_ai_sdk/models/getoneknowledgeop.py +116 -96
  83. orq_ai_sdk/models/getonepromptop.py +1673 -230
  84. orq_ai_sdk/models/getpromptversionop.py +1670 -216
  85. orq_ai_sdk/models/imagecontentpartschema.py +50 -1
  86. orq_ai_sdk/models/internal/globals.py +18 -1
  87. orq_ai_sdk/models/invokeagentop.py +140 -2
  88. orq_ai_sdk/models/invokedeploymentrequest.py +418 -80
  89. orq_ai_sdk/models/invokeevalop.py +160 -131
  90. orq_ai_sdk/models/listagentsop.py +793 -166
  91. orq_ai_sdk/models/listchunksop.py +32 -19
  92. orq_ai_sdk/models/listchunkspaginatedop.py +46 -19
  93. orq_ai_sdk/models/listconversationsop.py +18 -1
  94. orq_ai_sdk/models/listdatasetdatapointsop.py +252 -42
  95. orq_ai_sdk/models/listdatasetsop.py +35 -2
  96. orq_ai_sdk/models/listdatasourcesop.py +35 -26
  97. orq_ai_sdk/models/{listcontactsop.py → listidentitiesop.py} +89 -79
  98. orq_ai_sdk/models/listknowledgebasesop.py +132 -96
  99. orq_ai_sdk/models/listmodelsop.py +1 -0
  100. orq_ai_sdk/models/listpromptversionsop.py +1684 -216
  101. orq_ai_sdk/models/parseop.py +161 -17
  102. orq_ai_sdk/models/partdoneevent.py +19 -2
  103. orq_ai_sdk/models/post_v2_router_ocrop.py +408 -0
  104. orq_ai_sdk/models/publiccontact.py +27 -4
  105. orq_ai_sdk/models/publicidentity.py +62 -0
  106. orq_ai_sdk/models/reasoningpart.py +19 -2
  107. orq_ai_sdk/models/refusalpartschema.py +18 -1
  108. orq_ai_sdk/models/remoteconfigsgetconfigop.py +34 -1
  109. orq_ai_sdk/models/responsedoneevent.py +114 -84
  110. orq_ai_sdk/models/responsestartedevent.py +18 -1
  111. orq_ai_sdk/models/retrieveagentrequestop.py +787 -166
  112. orq_ai_sdk/models/retrievedatapointop.py +236 -42
  113. orq_ai_sdk/models/retrievedatasetop.py +19 -2
  114. orq_ai_sdk/models/retrievedatasourceop.py +17 -26
  115. orq_ai_sdk/models/{retrievecontactop.py → retrieveidentityop.py} +38 -41
  116. orq_ai_sdk/models/retrievememorydocumentop.py +18 -1
  117. orq_ai_sdk/models/retrievememoryop.py +18 -21
  118. orq_ai_sdk/models/retrievememorystoreop.py +18 -1
  119. orq_ai_sdk/models/retrievetoolop.py +309 -8
  120. orq_ai_sdk/models/runagentop.py +1451 -197
  121. orq_ai_sdk/models/searchknowledgeop.py +108 -1
  122. orq_ai_sdk/models/security.py +18 -1
  123. orq_ai_sdk/models/streamagentop.py +93 -2
  124. orq_ai_sdk/models/streamrunagentop.py +1428 -195
  125. orq_ai_sdk/models/textcontentpartschema.py +34 -1
  126. orq_ai_sdk/models/thinkingconfigenabledschema.py +18 -1
  127. orq_ai_sdk/models/toolcallpart.py +18 -1
  128. orq_ai_sdk/models/tooldoneevent.py +18 -1
  129. orq_ai_sdk/models/toolexecutionfailedstreamingevent.py +50 -1
  130. orq_ai_sdk/models/toolexecutionfinishedstreamingevent.py +34 -1
  131. orq_ai_sdk/models/toolexecutionstartedstreamingevent.py +34 -1
  132. orq_ai_sdk/models/toolresultpart.py +18 -1
  133. orq_ai_sdk/models/toolreviewrequestedevent.py +18 -1
  134. orq_ai_sdk/models/toolstartedevent.py +18 -1
  135. orq_ai_sdk/models/updateagentop.py +1951 -404
  136. orq_ai_sdk/models/updatechunkop.py +46 -19
  137. orq_ai_sdk/models/updateconversationop.py +61 -39
  138. orq_ai_sdk/models/updatedatapointop.py +424 -80
  139. orq_ai_sdk/models/updatedatasetop.py +51 -2
  140. orq_ai_sdk/models/updatedatasourceop.py +17 -26
  141. orq_ai_sdk/models/updateevalop.py +577 -16
  142. orq_ai_sdk/models/{updatecontactop.py → updateidentityop.py} +78 -68
  143. orq_ai_sdk/models/updateknowledgeop.py +234 -190
  144. orq_ai_sdk/models/updatememorydocumentop.py +50 -1
  145. orq_ai_sdk/models/updatememoryop.py +50 -21
  146. orq_ai_sdk/models/updatememorystoreop.py +66 -1
  147. orq_ai_sdk/models/updatepromptop.py +2844 -1450
  148. orq_ai_sdk/models/updatetoolop.py +592 -9
  149. orq_ai_sdk/models/usermessagerequest.py +18 -2
  150. orq_ai_sdk/moderations.py +218 -0
  151. orq_ai_sdk/orq_completions.py +660 -0
  152. orq_ai_sdk/orq_responses.py +398 -0
  153. orq_ai_sdk/prompts.py +28 -36
  154. orq_ai_sdk/rerank.py +232 -0
  155. orq_ai_sdk/router.py +89 -641
  156. orq_ai_sdk/sdk.py +3 -0
  157. orq_ai_sdk/speech.py +251 -0
  158. orq_ai_sdk/transcriptions.py +326 -0
  159. orq_ai_sdk/translations.py +298 -0
  160. orq_ai_sdk/utils/__init__.py +13 -1
  161. orq_ai_sdk/variations.py +254 -0
  162. orq_ai_sdk-4.2.6.dist-info/METADATA +888 -0
  163. orq_ai_sdk-4.2.6.dist-info/RECORD +263 -0
  164. {orq_ai_sdk-4.2.0rc28.dist-info → orq_ai_sdk-4.2.6.dist-info}/WHEEL +2 -1
  165. orq_ai_sdk-4.2.6.dist-info/top_level.txt +1 -0
  166. orq_ai_sdk-4.2.0rc28.dist-info/METADATA +0 -867
  167. orq_ai_sdk-4.2.0rc28.dist-info/RECORD +0 -233
@@ -1,7 +1,8 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
3
  from __future__ import annotations
4
- from orq_ai_sdk.types import BaseModel
4
+ from orq_ai_sdk.types import BaseModel, UNSET_SENTINEL
5
+ from pydantic import model_serializer
5
6
  from typing import Literal, Optional
6
7
  from typing_extensions import NotRequired, TypedDict
7
8
 
@@ -31,6 +32,22 @@ class ImageURL(BaseModel):
31
32
  detail: Optional[Detail] = None
32
33
  r"""Specifies the detail level of the image."""
33
34
 
35
+ @model_serializer(mode="wrap")
36
+ def serialize_model(self, handler):
37
+ optional_fields = set(["detail"])
38
+ serialized = handler(self)
39
+ m = {}
40
+
41
+ for n, f in type(self).model_fields.items():
42
+ k = f.alias or n
43
+ val = serialized.get(k)
44
+
45
+ if val != UNSET_SENTINEL:
46
+ if val is not None or k not in optional_fields:
47
+ m[k] = val
48
+
49
+ return m
50
+
34
51
 
35
52
  ImageContentPartSchemaCacheControlType = Literal["ephemeral",]
36
53
  r"""Create a cache control breakpoint at this content block. Accepts only the value \"ephemeral\"."""
@@ -75,6 +92,22 @@ class ImageContentPartSchemaCacheControl(BaseModel):
75
92
  Defaults to `5m`. Only supported by `Anthropic` Claude models.
76
93
  """
77
94
 
95
+ @model_serializer(mode="wrap")
96
+ def serialize_model(self, handler):
97
+ optional_fields = set(["ttl"])
98
+ serialized = handler(self)
99
+ m = {}
100
+
101
+ for n, f in type(self).model_fields.items():
102
+ k = f.alias or n
103
+ val = serialized.get(k)
104
+
105
+ if val != UNSET_SENTINEL:
106
+ if val is not None or k not in optional_fields:
107
+ m[k] = val
108
+
109
+ return m
110
+
78
111
 
79
112
  class ImageContentPartSchemaTypedDict(TypedDict):
80
113
  r"""An image content part"""
@@ -92,3 +125,19 @@ class ImageContentPartSchema(BaseModel):
92
125
  image_url: ImageURL
93
126
 
94
127
  cache_control: Optional[ImageContentPartSchemaCacheControl] = None
128
+
129
+ @model_serializer(mode="wrap")
130
+ def serialize_model(self, handler):
131
+ optional_fields = set(["cache_control"])
132
+ serialized = handler(self)
133
+ m = {}
134
+
135
+ for n, f in type(self).model_fields.items():
136
+ k = f.alias or n
137
+ val = serialized.get(k)
138
+
139
+ if val != UNSET_SENTINEL:
140
+ if val is not None or k not in optional_fields:
141
+ m[k] = val
142
+
143
+ return m
@@ -1,9 +1,10 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
3
  from __future__ import annotations
4
- from orq_ai_sdk.types import BaseModel
4
+ from orq_ai_sdk.types import BaseModel, UNSET_SENTINEL
5
5
  from orq_ai_sdk.utils import FieldMetadata, HeaderMetadata
6
6
  import pydantic
7
+ from pydantic import model_serializer
7
8
  from typing import Optional
8
9
  from typing_extensions import Annotated, NotRequired, TypedDict
9
10
 
@@ -24,3 +25,19 @@ class Globals(BaseModel):
24
25
  Optional[str],
25
26
  FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
26
27
  ] = None
28
+
29
+ @model_serializer(mode="wrap")
30
+ def serialize_model(self, handler):
31
+ optional_fields = set(["contactId", "environment"])
32
+ serialized = handler(self)
33
+ m = {}
34
+
35
+ for n, f in type(self).model_fields.items():
36
+ k = f.alias or n
37
+ val = serialized.get(k)
38
+
39
+ if val != UNSET_SENTINEL:
40
+ if val is not None or k not in optional_fields:
41
+ m[k] = val
42
+
43
+ return m
@@ -7,7 +7,7 @@ from .filepart import FilePart, FilePartTypedDict
7
7
  from .textpart import TextPart, TextPartTypedDict
8
8
  from .toolcallpart import ToolCallPart, ToolCallPartTypedDict
9
9
  from .toolresultpart import ToolResultPart, ToolResultPartTypedDict
10
- from orq_ai_sdk.types import BaseModel
10
+ from orq_ai_sdk.types import BaseModel, UNSET_SENTINEL
11
11
  from orq_ai_sdk.utils import (
12
12
  FieldMetadata,
13
13
  PathParamMetadata,
@@ -15,7 +15,7 @@ from orq_ai_sdk.utils import (
15
15
  get_discriminator,
16
16
  )
17
17
  import pydantic
18
- from pydantic import Discriminator, Tag
18
+ from pydantic import Discriminator, Tag, model_serializer
19
19
  from typing import Any, Dict, List, Literal, Optional, Union
20
20
  from typing_extensions import (
21
21
  Annotated,
@@ -94,6 +94,22 @@ class InvokeAgentA2AMessage(BaseModel):
94
94
  message_id: Annotated[Optional[str], pydantic.Field(alias="messageId")] = None
95
95
  r"""Optional A2A message ID in ULID format"""
96
96
 
97
+ @model_serializer(mode="wrap")
98
+ def serialize_model(self, handler):
99
+ optional_fields = set(["messageId"])
100
+ serialized = handler(self)
101
+ m = {}
102
+
103
+ for n, f in type(self).model_fields.items():
104
+ k = f.alias or n
105
+ val = serialized.get(k)
106
+
107
+ if val != UNSET_SENTINEL:
108
+ if val is not None or k not in optional_fields:
109
+ m[k] = val
110
+
111
+ return m
112
+
97
113
 
98
114
  class InvokeAgentIdentityTypedDict(TypedDict):
99
115
  r"""Information about the identity making the request. If the identity does not exist, it will be created automatically."""
@@ -133,6 +149,22 @@ class InvokeAgentIdentity(BaseModel):
133
149
  tags: Optional[List[str]] = None
134
150
  r"""A list of tags associated with the contact"""
135
151
 
152
+ @model_serializer(mode="wrap")
153
+ def serialize_model(self, handler):
154
+ optional_fields = set(["display_name", "email", "metadata", "logo_url", "tags"])
155
+ serialized = handler(self)
156
+ m = {}
157
+
158
+ for n, f in type(self).model_fields.items():
159
+ k = f.alias or n
160
+ val = serialized.get(k)
161
+
162
+ if val != UNSET_SENTINEL:
163
+ if val is not None or k not in optional_fields:
164
+ m[k] = val
165
+
166
+ return m
167
+
136
168
 
137
169
  @deprecated(
138
170
  "warning: ** DEPRECATED ** - This will be removed in a future release, please migrate away from it as soon as possible."
@@ -178,6 +210,22 @@ class InvokeAgentContact(BaseModel):
178
210
  tags: Optional[List[str]] = None
179
211
  r"""A list of tags associated with the contact"""
180
212
 
213
+ @model_serializer(mode="wrap")
214
+ def serialize_model(self, handler):
215
+ optional_fields = set(["display_name", "email", "metadata", "logo_url", "tags"])
216
+ serialized = handler(self)
217
+ m = {}
218
+
219
+ for n, f in type(self).model_fields.items():
220
+ k = f.alias or n
221
+ val = serialized.get(k)
222
+
223
+ if val != UNSET_SENTINEL:
224
+ if val is not None or k not in optional_fields:
225
+ m[k] = val
226
+
227
+ return m
228
+
181
229
 
182
230
  class InvokeAgentThreadTypedDict(TypedDict):
183
231
  r"""Thread information to group related requests"""
@@ -197,6 +245,22 @@ class InvokeAgentThread(BaseModel):
197
245
  tags: Optional[List[str]] = None
198
246
  r"""Optional tags to differentiate or categorize threads"""
199
247
 
248
+ @model_serializer(mode="wrap")
249
+ def serialize_model(self, handler):
250
+ optional_fields = set(["tags"])
251
+ serialized = handler(self)
252
+ m = {}
253
+
254
+ for n, f in type(self).model_fields.items():
255
+ k = f.alias or n
256
+ val = serialized.get(k)
257
+
258
+ if val != UNSET_SENTINEL:
259
+ if val is not None or k not in optional_fields:
260
+ m[k] = val
261
+
262
+ return m
263
+
200
264
 
201
265
  class InvokeAgentMemoryTypedDict(TypedDict):
202
266
  r"""Memory configuration for the agent execution. Used to associate memory stores with specific entities like users or sessions."""
@@ -261,6 +325,32 @@ class InvokeAgentRequestBody(BaseModel):
261
325
  metadata: Optional[Dict[str, Any]] = None
262
326
  r"""Optional metadata for the agent invocation as key-value pairs that will be included in traces"""
263
327
 
328
+ @model_serializer(mode="wrap")
329
+ def serialize_model(self, handler):
330
+ optional_fields = set(
331
+ [
332
+ "task_id",
333
+ "variables",
334
+ "identity",
335
+ "contact",
336
+ "thread",
337
+ "memory",
338
+ "metadata",
339
+ ]
340
+ )
341
+ serialized = handler(self)
342
+ m = {}
343
+
344
+ for n, f in type(self).model_fields.items():
345
+ k = f.alias or n
346
+ val = serialized.get(k)
347
+
348
+ if val != UNSET_SENTINEL:
349
+ if val is not None or k not in optional_fields:
350
+ m[k] = val
351
+
352
+ return m
353
+
264
354
 
265
355
  class InvokeAgentRequestTypedDict(TypedDict):
266
356
  key: str
@@ -279,6 +369,22 @@ class InvokeAgentRequest(BaseModel):
279
369
  FieldMetadata(request=RequestMetadata(media_type="application/json")),
280
370
  ] = None
281
371
 
372
+ @model_serializer(mode="wrap")
373
+ def serialize_model(self, handler):
374
+ optional_fields = set(["RequestBody"])
375
+ serialized = handler(self)
376
+ m = {}
377
+
378
+ for n, f in type(self).model_fields.items():
379
+ k = f.alias or n
380
+ val = serialized.get(k)
381
+
382
+ if val != UNSET_SENTINEL:
383
+ if val is not None or k not in optional_fields:
384
+ m[k] = val
385
+
386
+ return m
387
+
282
388
 
283
389
  InvokeAgentKind = Literal["task",]
284
390
  r"""A2A entity type identifier"""
@@ -381,6 +487,22 @@ class TaskStatus(BaseModel):
381
487
  message: Optional[TaskStatusMessage] = None
382
488
  r"""Optional A2A message providing additional context about the current status"""
383
489
 
490
+ @model_serializer(mode="wrap")
491
+ def serialize_model(self, handler):
492
+ optional_fields = set(["timestamp", "message"])
493
+ serialized = handler(self)
494
+ m = {}
495
+
496
+ for n, f in type(self).model_fields.items():
497
+ k = f.alias or n
498
+ val = serialized.get(k)
499
+
500
+ if val != UNSET_SENTINEL:
501
+ if val is not None or k not in optional_fields:
502
+ m[k] = val
503
+
504
+ return m
505
+
384
506
 
385
507
  class InvokeAgentA2ATaskResponseTypedDict(TypedDict):
386
508
  r"""Response format following the Agent-to-Agent (A2A) protocol. Returned when starting or continuing an agent task execution."""
@@ -414,3 +536,19 @@ class InvokeAgentA2ATaskResponse(BaseModel):
414
536
 
415
537
  metadata: Optional[Dict[str, Any]] = None
416
538
  r"""Task metadata containing workspace_id and trace_id for feedback and tracking"""
539
+
540
+ @model_serializer(mode="wrap")
541
+ def serialize_model(self, handler):
542
+ optional_fields = set(["metadata"])
543
+ serialized = handler(self)
544
+ m = {}
545
+
546
+ for n, f in type(self).model_fields.items():
547
+ k = f.alias or n
548
+ val = serialized.get(k)
549
+
550
+ if val != UNSET_SENTINEL:
551
+ if val is not None or k not in optional_fields:
552
+ m[k] = val
553
+
554
+ return m