mixpeek 0.6.2__py3-none-any.whl → 0.6.5__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 (40) hide show
  1. mixpeek/__init__.py +12 -8
  2. mixpeek/base_client.py +857 -23
  3. mixpeek/client.py +7 -7
  4. mixpeek/core/client_wrapper.py +1 -1
  5. mixpeek/{pipelines → pipeline}/client.py +26 -20
  6. mixpeek/storage/__init__.py +3 -0
  7. mixpeek/storage/client.py +7 -112
  8. mixpeek/{embed → storage/sample}/client.py +61 -129
  9. mixpeek/types/__init__.py +8 -0
  10. mixpeek/types/configs_response.py +14 -3
  11. mixpeek/types/destination.py +14 -3
  12. mixpeek/types/embedding_response.py +6 -2
  13. mixpeek/types/extract_response.py +39 -0
  14. mixpeek/types/generation_response.py +6 -4
  15. mixpeek/types/message.py +9 -2
  16. mixpeek/types/metadata.py +0 -2
  17. mixpeek/types/modality.py +1 -1
  18. mixpeek/types/model.py +9 -2
  19. mixpeek/types/pipeline_response.py +49 -0
  20. mixpeek/types/pipeline_task_response.py +32 -0
  21. mixpeek/types/source.py +14 -3
  22. mixpeek/types/source_destination_mapping.py +14 -3
  23. mixpeek/types/workflow_code_response.py +29 -0
  24. mixpeek/{users → user}/client.py +10 -10
  25. mixpeek/{workflows → workflow}/client.py +14 -15
  26. {mixpeek-0.6.2.dist-info → mixpeek-0.6.5.dist-info}/METADATA +1 -1
  27. {mixpeek-0.6.2.dist-info → mixpeek-0.6.5.dist-info}/RECORD +33 -36
  28. mixpeek/extract/client.py +0 -347
  29. mixpeek/generators/client.py +0 -237
  30. mixpeek/parse/client.py +0 -111
  31. mixpeek/parse_client.py +0 -14
  32. mixpeek/pipelines/__init__.py +0 -2
  33. mixpeek/users/__init__.py +0 -2
  34. mixpeek/workflows/__init__.py +0 -2
  35. /mixpeek/{embed → pipeline}/__init__.py +0 -0
  36. /mixpeek/{extract → storage/sample}/__init__.py +0 -0
  37. /mixpeek/{generators → user}/__init__.py +0 -0
  38. /mixpeek/{parse → workflow}/__init__.py +0 -0
  39. {mixpeek-0.6.2.dist-info → mixpeek-0.6.5.dist-info}/LICENSE +0 -0
  40. {mixpeek-0.6.2.dist-info → mixpeek-0.6.5.dist-info}/WHEEL +0 -0
mixpeek/base_client.py CHANGED
@@ -2,20 +2,56 @@
2
2
 
3
3
  import os
4
4
  import typing
5
+ import urllib.parse
6
+ from json.decoder import JSONDecodeError
5
7
 
6
8
  import httpx
7
9
 
8
10
  from .core.api_error import ApiError
9
11
  from .core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
10
- from .embed.client import AsyncEmbedClient, EmbedClient
12
+ from .core.jsonable_encoder import jsonable_encoder
13
+ from .core.remove_none_from_dict import remove_none_from_dict
14
+ from .core.request_options import RequestOptions
11
15
  from .environment import MixpeekEnvironment
12
- from .extract.client import AsyncExtractClient, ExtractClient
13
- from .generators.client import AsyncGeneratorsClient, GeneratorsClient
14
- from .parse.client import AsyncParseClient, ParseClient
15
- from .pipelines.client import AsyncPipelinesClient, PipelinesClient
16
+ from .errors.bad_request_error import BadRequestError
17
+ from .errors.forbidden_error import ForbiddenError
18
+ from .errors.internal_server_error import InternalServerError
19
+ from .errors.not_found_error import NotFoundError
20
+ from .errors.unauthorized_error import UnauthorizedError
21
+ from .errors.unprocessable_entity_error import UnprocessableEntityError
22
+ from .pipeline.client import AsyncPipelineClient, PipelineClient
16
23
  from .storage.client import AsyncStorageClient, StorageClient
17
- from .users.client import AsyncUsersClient, UsersClient
18
- from .workflows.client import AsyncWorkflowsClient, WorkflowsClient
24
+ from .types.audio_params import AudioParams
25
+ from .types.configs_response import ConfigsResponse
26
+ from .types.csv_params import CsvParams
27
+ from .types.embedding_response import EmbeddingResponse
28
+ from .types.error_response import ErrorResponse
29
+ from .types.extract_response import ExtractResponse
30
+ from .types.generation_response import GenerationResponse
31
+ from .types.html_params import HtmlParams
32
+ from .types.http_validation_error import HttpValidationError
33
+ from .types.image_params import ImageParams
34
+ from .types.message import Message
35
+ from .types.modality import Modality
36
+ from .types.model import Model
37
+ from .types.models import Models
38
+ from .types.pdf_params import PdfParams
39
+ from .types.ppt_params import PptParams
40
+ from .types.pptx_params import PptxParams
41
+ from .types.settings import Settings
42
+ from .types.txt_params import TxtParams
43
+ from .types.video_params import VideoParams
44
+ from .types.xlsx_params import XlsxParams
45
+ from .user.client import AsyncUserClient, UserClient
46
+ from .workflow.client import AsyncWorkflowClient, WorkflowClient
47
+
48
+ try:
49
+ import pydantic.v1 as pydantic # type: ignore
50
+ except ImportError:
51
+ import pydantic # type: ignore
52
+
53
+ # this is used as the default value for optional parameters
54
+ OMIT = typing.cast(typing.Any, ...)
19
55
 
20
56
 
21
57
  class BaseMixpeek:
@@ -57,7 +93,7 @@ class BaseMixpeek:
57
93
  index_id: typing.Optional[str] = None,
58
94
  api_key: typing.Optional[typing.Union[str, typing.Callable[[], str]]] = os.getenv("MIXPEEK_API_KEY"),
59
95
  timeout: typing.Optional[float] = None,
60
- httpx_client: typing.Optional[httpx.Client] = None
96
+ httpx_client: typing.Optional[httpx.Client] = None,
61
97
  ):
62
98
  _defaulted_timeout = timeout if timeout is not None else 60 if httpx_client is None else None
63
99
  if api_key is None:
@@ -72,14 +108,413 @@ class BaseMixpeek:
72
108
  httpx_client=httpx.Client(timeout=_defaulted_timeout) if httpx_client is None else httpx_client,
73
109
  timeout=_defaulted_timeout,
74
110
  )
75
- self.users = UsersClient(client_wrapper=self._client_wrapper)
76
- self.extract = ExtractClient(client_wrapper=self._client_wrapper)
77
- self.generators = GeneratorsClient(client_wrapper=self._client_wrapper)
78
- self.embed = EmbedClient(client_wrapper=self._client_wrapper)
79
- self.pipelines = PipelinesClient(client_wrapper=self._client_wrapper)
80
- self.workflows = WorkflowsClient(client_wrapper=self._client_wrapper)
111
+ self.user = UserClient(client_wrapper=self._client_wrapper)
112
+ self.pipeline = PipelineClient(client_wrapper=self._client_wrapper)
113
+ self.workflow = WorkflowClient(client_wrapper=self._client_wrapper)
81
114
  self.storage = StorageClient(client_wrapper=self._client_wrapper)
82
- self.parse = ParseClient(client_wrapper=self._client_wrapper)
115
+
116
+ def extract(
117
+ self,
118
+ *,
119
+ file_url: typing.Optional[str] = OMIT,
120
+ contents: typing.Optional[str] = OMIT,
121
+ should_chunk: typing.Optional[bool] = OMIT,
122
+ clean_text: typing.Optional[bool] = OMIT,
123
+ max_characters_per_chunk: typing.Optional[int] = OMIT,
124
+ extract_tags: typing.Optional[bool] = OMIT,
125
+ summarize: typing.Optional[bool] = OMIT,
126
+ pdf_settings: typing.Optional[PdfParams] = OMIT,
127
+ html_settings: typing.Optional[HtmlParams] = OMIT,
128
+ csv_settings: typing.Optional[CsvParams] = OMIT,
129
+ ppt_settings: typing.Optional[PptParams] = OMIT,
130
+ pptx_settings: typing.Optional[PptxParams] = OMIT,
131
+ xlsx_settings: typing.Optional[XlsxParams] = OMIT,
132
+ txt_settings: typing.Optional[TxtParams] = OMIT,
133
+ audio_settings: typing.Optional[AudioParams] = OMIT,
134
+ image_settings: typing.Optional[ImageParams] = OMIT,
135
+ video_settings: typing.Optional[VideoParams] = OMIT,
136
+ request_options: typing.Optional[RequestOptions] = None,
137
+ ) -> ExtractResponse:
138
+ """
139
+ Parameters:
140
+ - file_url: typing.Optional[str].
141
+
142
+ - contents: typing.Optional[str].
143
+
144
+ - should_chunk: typing.Optional[bool].
145
+
146
+ - clean_text: typing.Optional[bool].
147
+
148
+ - max_characters_per_chunk: typing.Optional[int].
149
+
150
+ - extract_tags: typing.Optional[bool].
151
+
152
+ - summarize: typing.Optional[bool].
153
+
154
+ - pdf_settings: typing.Optional[PdfParams].
155
+
156
+ - html_settings: typing.Optional[HtmlParams].
157
+
158
+ - csv_settings: typing.Optional[CsvParams].
159
+
160
+ - ppt_settings: typing.Optional[PptParams].
161
+
162
+ - pptx_settings: typing.Optional[PptxParams].
163
+
164
+ - xlsx_settings: typing.Optional[XlsxParams].
165
+
166
+ - txt_settings: typing.Optional[TxtParams].
167
+
168
+ - audio_settings: typing.Optional[AudioParams].
169
+
170
+ - image_settings: typing.Optional[ImageParams].
171
+
172
+ - video_settings: typing.Optional[VideoParams].
173
+
174
+ - request_options: typing.Optional[RequestOptions]. Request-specific configuration.
175
+ ---
176
+ from mixpeek.client import Mixpeek
177
+
178
+ client = Mixpeek(
179
+ authorization="YOUR_AUTHORIZATION",
180
+ index_id="YOUR_INDEX_ID",
181
+ api_key="YOUR_API_KEY",
182
+ )
183
+ client.extract()
184
+ """
185
+ _request: typing.Dict[str, typing.Any] = {}
186
+ if file_url is not OMIT:
187
+ _request["file_url"] = file_url
188
+ if contents is not OMIT:
189
+ _request["contents"] = contents
190
+ if should_chunk is not OMIT:
191
+ _request["should_chunk"] = should_chunk
192
+ if clean_text is not OMIT:
193
+ _request["clean_text"] = clean_text
194
+ if max_characters_per_chunk is not OMIT:
195
+ _request["max_characters_per_chunk"] = max_characters_per_chunk
196
+ if extract_tags is not OMIT:
197
+ _request["extract_tags"] = extract_tags
198
+ if summarize is not OMIT:
199
+ _request["summarize"] = summarize
200
+ if pdf_settings is not OMIT:
201
+ _request["pdf_settings"] = pdf_settings
202
+ if html_settings is not OMIT:
203
+ _request["html_settings"] = html_settings
204
+ if csv_settings is not OMIT:
205
+ _request["csv_settings"] = csv_settings
206
+ if ppt_settings is not OMIT:
207
+ _request["ppt_settings"] = ppt_settings
208
+ if pptx_settings is not OMIT:
209
+ _request["pptx_settings"] = pptx_settings
210
+ if xlsx_settings is not OMIT:
211
+ _request["xlsx_settings"] = xlsx_settings
212
+ if txt_settings is not OMIT:
213
+ _request["txt_settings"] = txt_settings
214
+ if audio_settings is not OMIT:
215
+ _request["audio_settings"] = audio_settings
216
+ if image_settings is not OMIT:
217
+ _request["image_settings"] = image_settings
218
+ if video_settings is not OMIT:
219
+ _request["video_settings"] = video_settings
220
+ _response = self._client_wrapper.httpx_client.request(
221
+ "POST",
222
+ urllib.parse.urljoin(f"{self._client_wrapper.get_base_url()}/", "extract"),
223
+ params=jsonable_encoder(
224
+ request_options.get("additional_query_parameters") if request_options is not None else None
225
+ ),
226
+ json=jsonable_encoder(_request)
227
+ if request_options is None or request_options.get("additional_body_parameters") is None
228
+ else {
229
+ **jsonable_encoder(_request),
230
+ **(jsonable_encoder(remove_none_from_dict(request_options.get("additional_body_parameters", {})))),
231
+ },
232
+ headers=jsonable_encoder(
233
+ remove_none_from_dict(
234
+ {
235
+ **self._client_wrapper.get_headers(),
236
+ **(request_options.get("additional_headers", {}) if request_options is not None else {}),
237
+ }
238
+ )
239
+ ),
240
+ timeout=request_options.get("timeout_in_seconds")
241
+ if request_options is not None and request_options.get("timeout_in_seconds") is not None
242
+ else self._client_wrapper.get_timeout(),
243
+ retries=0,
244
+ max_retries=request_options.get("max_retries") if request_options is not None else 0, # type: ignore
245
+ )
246
+ if 200 <= _response.status_code < 300:
247
+ return pydantic.parse_obj_as(ExtractResponse, _response.json()) # type: ignore
248
+ if _response.status_code == 400:
249
+ raise BadRequestError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
250
+ if _response.status_code == 401:
251
+ raise UnauthorizedError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
252
+ if _response.status_code == 403:
253
+ raise ForbiddenError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
254
+ if _response.status_code == 404:
255
+ raise NotFoundError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
256
+ if _response.status_code == 422:
257
+ raise UnprocessableEntityError(pydantic.parse_obj_as(HttpValidationError, _response.json())) # type: ignore
258
+ if _response.status_code == 500:
259
+ raise InternalServerError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
260
+ try:
261
+ _response_json = _response.json()
262
+ except JSONDecodeError:
263
+ raise ApiError(status_code=_response.status_code, body=_response.text)
264
+ raise ApiError(status_code=_response.status_code, body=_response_json)
265
+
266
+ def base_generate(
267
+ self,
268
+ *,
269
+ model: Model,
270
+ response_format: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
271
+ context: typing.Optional[str] = OMIT,
272
+ messages: typing.Sequence[Message],
273
+ settings: typing.Optional[Settings] = OMIT,
274
+ request_options: typing.Optional[RequestOptions] = None,
275
+ ) -> GenerationResponse:
276
+ """
277
+ Parameters:
278
+ - model: Model. The model to be used.
279
+
280
+ - response_format: typing.Optional[typing.Dict[str, typing.Any]].
281
+
282
+ - context: typing.Optional[str].
283
+
284
+ - messages: typing.Sequence[Message]. The messages for the generation.
285
+
286
+ - settings: typing.Optional[Settings].
287
+
288
+ - request_options: typing.Optional[RequestOptions]. Request-specific configuration.
289
+ ---
290
+ from mixpeek import Message, Model
291
+ from mixpeek.client import Mixpeek
292
+
293
+ client = Mixpeek(
294
+ authorization="YOUR_AUTHORIZATION",
295
+ index_id="YOUR_INDEX_ID",
296
+ api_key="YOUR_API_KEY",
297
+ )
298
+ client.base_generate(
299
+ model=Model(
300
+ provider="provider",
301
+ model="gpt-3.5-turbo",
302
+ ),
303
+ messages=[
304
+ Message(
305
+ role="role",
306
+ content="content",
307
+ )
308
+ ],
309
+ )
310
+ """
311
+ _request: typing.Dict[str, typing.Any] = {"model": model, "messages": messages}
312
+ if response_format is not OMIT:
313
+ _request["response_format"] = response_format
314
+ if context is not OMIT:
315
+ _request["context"] = context
316
+ if settings is not OMIT:
317
+ _request["settings"] = settings
318
+ _response = self._client_wrapper.httpx_client.request(
319
+ "POST",
320
+ urllib.parse.urljoin(f"{self._client_wrapper.get_base_url()}/", "generate/text"),
321
+ params=jsonable_encoder(
322
+ request_options.get("additional_query_parameters") if request_options is not None else None
323
+ ),
324
+ json=jsonable_encoder(_request)
325
+ if request_options is None or request_options.get("additional_body_parameters") is None
326
+ else {
327
+ **jsonable_encoder(_request),
328
+ **(jsonable_encoder(remove_none_from_dict(request_options.get("additional_body_parameters", {})))),
329
+ },
330
+ headers=jsonable_encoder(
331
+ remove_none_from_dict(
332
+ {
333
+ **self._client_wrapper.get_headers(),
334
+ **(request_options.get("additional_headers", {}) if request_options is not None else {}),
335
+ }
336
+ )
337
+ ),
338
+ timeout=request_options.get("timeout_in_seconds")
339
+ if request_options is not None and request_options.get("timeout_in_seconds") is not None
340
+ else self._client_wrapper.get_timeout(),
341
+ retries=0,
342
+ max_retries=request_options.get("max_retries") if request_options is not None else 0, # type: ignore
343
+ )
344
+ if 200 <= _response.status_code < 300:
345
+ return pydantic.parse_obj_as(GenerationResponse, _response.json()) # type: ignore
346
+ if _response.status_code == 400:
347
+ raise BadRequestError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
348
+ if _response.status_code == 401:
349
+ raise UnauthorizedError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
350
+ if _response.status_code == 403:
351
+ raise ForbiddenError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
352
+ if _response.status_code == 404:
353
+ raise NotFoundError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
354
+ if _response.status_code == 422:
355
+ raise UnprocessableEntityError(pydantic.parse_obj_as(HttpValidationError, _response.json())) # type: ignore
356
+ if _response.status_code == 500:
357
+ raise InternalServerError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
358
+ try:
359
+ _response_json = _response.json()
360
+ except JSONDecodeError:
361
+ raise ApiError(status_code=_response.status_code, body=_response.text)
362
+ raise ApiError(status_code=_response.status_code, body=_response_json)
363
+
364
+ def get_model_config(
365
+ self,
366
+ *,
367
+ modality: typing.Optional[Modality] = OMIT,
368
+ model: typing.Optional[Models] = OMIT,
369
+ request_options: typing.Optional[RequestOptions] = None,
370
+ ) -> ConfigsResponse:
371
+ """
372
+ Parameters:
373
+ - modality: typing.Optional[Modality].
374
+
375
+ - model: typing.Optional[Models].
376
+
377
+ - request_options: typing.Optional[RequestOptions]. Request-specific configuration.
378
+ ---
379
+ from mixpeek.client import Mixpeek
380
+
381
+ client = Mixpeek(
382
+ authorization="YOUR_AUTHORIZATION",
383
+ index_id="YOUR_INDEX_ID",
384
+ api_key="YOUR_API_KEY",
385
+ )
386
+ client.get_model_config()
387
+ """
388
+ _request: typing.Dict[str, typing.Any] = {}
389
+ if modality is not OMIT:
390
+ _request["modality"] = modality
391
+ if model is not OMIT:
392
+ _request["model"] = model
393
+ _response = self._client_wrapper.httpx_client.request(
394
+ "POST",
395
+ urllib.parse.urljoin(f"{self._client_wrapper.get_base_url()}/", "embed/config"),
396
+ params=jsonable_encoder(
397
+ request_options.get("additional_query_parameters") if request_options is not None else None
398
+ ),
399
+ json=jsonable_encoder(_request)
400
+ if request_options is None or request_options.get("additional_body_parameters") is None
401
+ else {
402
+ **jsonable_encoder(_request),
403
+ **(jsonable_encoder(remove_none_from_dict(request_options.get("additional_body_parameters", {})))),
404
+ },
405
+ headers=jsonable_encoder(
406
+ remove_none_from_dict(
407
+ {
408
+ **self._client_wrapper.get_headers(),
409
+ **(request_options.get("additional_headers", {}) if request_options is not None else {}),
410
+ }
411
+ )
412
+ ),
413
+ timeout=request_options.get("timeout_in_seconds")
414
+ if request_options is not None and request_options.get("timeout_in_seconds") is not None
415
+ else self._client_wrapper.get_timeout(),
416
+ retries=0,
417
+ max_retries=request_options.get("max_retries") if request_options is not None else 0, # type: ignore
418
+ )
419
+ if 200 <= _response.status_code < 300:
420
+ return pydantic.parse_obj_as(ConfigsResponse, _response.json()) # type: ignore
421
+ if _response.status_code == 400:
422
+ raise BadRequestError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
423
+ if _response.status_code == 401:
424
+ raise UnauthorizedError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
425
+ if _response.status_code == 403:
426
+ raise ForbiddenError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
427
+ if _response.status_code == 404:
428
+ raise NotFoundError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
429
+ if _response.status_code == 422:
430
+ raise UnprocessableEntityError(pydantic.parse_obj_as(HttpValidationError, _response.json())) # type: ignore
431
+ if _response.status_code == 500:
432
+ raise InternalServerError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
433
+ try:
434
+ _response_json = _response.json()
435
+ except JSONDecodeError:
436
+ raise ApiError(status_code=_response.status_code, body=_response.text)
437
+ raise ApiError(status_code=_response.status_code, body=_response_json)
438
+
439
+ def embed(
440
+ self,
441
+ *,
442
+ input: str,
443
+ modality: typing.Optional[Modality] = OMIT,
444
+ model: typing.Optional[str] = OMIT,
445
+ request_options: typing.Optional[RequestOptions] = None,
446
+ ) -> EmbeddingResponse:
447
+ """
448
+ Parameters:
449
+ - input: str. The input data to be processed.
450
+
451
+ - modality: typing.Optional[Modality].
452
+
453
+ - model: typing.Optional[str].
454
+
455
+ - request_options: typing.Optional[RequestOptions]. Request-specific configuration.
456
+ ---
457
+ from mixpeek.client import Mixpeek
458
+
459
+ client = Mixpeek(
460
+ authorization="YOUR_AUTHORIZATION",
461
+ index_id="YOUR_INDEX_ID",
462
+ api_key="YOUR_API_KEY",
463
+ )
464
+ client.embed(
465
+ input="input",
466
+ )
467
+ """
468
+ _request: typing.Dict[str, typing.Any] = {"input": input}
469
+ if modality is not OMIT:
470
+ _request["modality"] = modality
471
+ if model is not OMIT:
472
+ _request["model"] = model
473
+ _response = self._client_wrapper.httpx_client.request(
474
+ "POST",
475
+ urllib.parse.urljoin(f"{self._client_wrapper.get_base_url()}/", "embed"),
476
+ params=jsonable_encoder(
477
+ request_options.get("additional_query_parameters") if request_options is not None else None
478
+ ),
479
+ json=jsonable_encoder(_request)
480
+ if request_options is None or request_options.get("additional_body_parameters") is None
481
+ else {
482
+ **jsonable_encoder(_request),
483
+ **(jsonable_encoder(remove_none_from_dict(request_options.get("additional_body_parameters", {})))),
484
+ },
485
+ headers=jsonable_encoder(
486
+ remove_none_from_dict(
487
+ {
488
+ **self._client_wrapper.get_headers(),
489
+ **(request_options.get("additional_headers", {}) if request_options is not None else {}),
490
+ }
491
+ )
492
+ ),
493
+ timeout=request_options.get("timeout_in_seconds")
494
+ if request_options is not None and request_options.get("timeout_in_seconds") is not None
495
+ else self._client_wrapper.get_timeout(),
496
+ retries=0,
497
+ max_retries=request_options.get("max_retries") if request_options is not None else 0, # type: ignore
498
+ )
499
+ if 200 <= _response.status_code < 300:
500
+ return pydantic.parse_obj_as(EmbeddingResponse, _response.json()) # type: ignore
501
+ if _response.status_code == 400:
502
+ raise BadRequestError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
503
+ if _response.status_code == 401:
504
+ raise UnauthorizedError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
505
+ if _response.status_code == 403:
506
+ raise ForbiddenError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
507
+ if _response.status_code == 404:
508
+ raise NotFoundError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
509
+ if _response.status_code == 422:
510
+ raise UnprocessableEntityError(pydantic.parse_obj_as(HttpValidationError, _response.json())) # type: ignore
511
+ if _response.status_code == 500:
512
+ raise InternalServerError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
513
+ try:
514
+ _response_json = _response.json()
515
+ except JSONDecodeError:
516
+ raise ApiError(status_code=_response.status_code, body=_response.text)
517
+ raise ApiError(status_code=_response.status_code, body=_response_json)
83
518
 
84
519
 
85
520
  class AsyncBaseMixpeek:
@@ -121,7 +556,7 @@ class AsyncBaseMixpeek:
121
556
  index_id: typing.Optional[str] = None,
122
557
  api_key: typing.Optional[typing.Union[str, typing.Callable[[], str]]] = os.getenv("MIXPEEK_API_KEY"),
123
558
  timeout: typing.Optional[float] = None,
124
- httpx_client: typing.Optional[httpx.AsyncClient] = None
559
+ httpx_client: typing.Optional[httpx.AsyncClient] = None,
125
560
  ):
126
561
  _defaulted_timeout = timeout if timeout is not None else 60 if httpx_client is None else None
127
562
  if api_key is None:
@@ -136,14 +571,413 @@ class AsyncBaseMixpeek:
136
571
  httpx_client=httpx.AsyncClient(timeout=_defaulted_timeout) if httpx_client is None else httpx_client,
137
572
  timeout=_defaulted_timeout,
138
573
  )
139
- self.users = AsyncUsersClient(client_wrapper=self._client_wrapper)
140
- self.extract = AsyncExtractClient(client_wrapper=self._client_wrapper)
141
- self.generators = AsyncGeneratorsClient(client_wrapper=self._client_wrapper)
142
- self.embed = AsyncEmbedClient(client_wrapper=self._client_wrapper)
143
- self.pipelines = AsyncPipelinesClient(client_wrapper=self._client_wrapper)
144
- self.workflows = AsyncWorkflowsClient(client_wrapper=self._client_wrapper)
574
+ self.user = AsyncUserClient(client_wrapper=self._client_wrapper)
575
+ self.pipeline = AsyncPipelineClient(client_wrapper=self._client_wrapper)
576
+ self.workflow = AsyncWorkflowClient(client_wrapper=self._client_wrapper)
145
577
  self.storage = AsyncStorageClient(client_wrapper=self._client_wrapper)
146
- self.parse = AsyncParseClient(client_wrapper=self._client_wrapper)
578
+
579
+ async def extract(
580
+ self,
581
+ *,
582
+ file_url: typing.Optional[str] = OMIT,
583
+ contents: typing.Optional[str] = OMIT,
584
+ should_chunk: typing.Optional[bool] = OMIT,
585
+ clean_text: typing.Optional[bool] = OMIT,
586
+ max_characters_per_chunk: typing.Optional[int] = OMIT,
587
+ extract_tags: typing.Optional[bool] = OMIT,
588
+ summarize: typing.Optional[bool] = OMIT,
589
+ pdf_settings: typing.Optional[PdfParams] = OMIT,
590
+ html_settings: typing.Optional[HtmlParams] = OMIT,
591
+ csv_settings: typing.Optional[CsvParams] = OMIT,
592
+ ppt_settings: typing.Optional[PptParams] = OMIT,
593
+ pptx_settings: typing.Optional[PptxParams] = OMIT,
594
+ xlsx_settings: typing.Optional[XlsxParams] = OMIT,
595
+ txt_settings: typing.Optional[TxtParams] = OMIT,
596
+ audio_settings: typing.Optional[AudioParams] = OMIT,
597
+ image_settings: typing.Optional[ImageParams] = OMIT,
598
+ video_settings: typing.Optional[VideoParams] = OMIT,
599
+ request_options: typing.Optional[RequestOptions] = None,
600
+ ) -> ExtractResponse:
601
+ """
602
+ Parameters:
603
+ - file_url: typing.Optional[str].
604
+
605
+ - contents: typing.Optional[str].
606
+
607
+ - should_chunk: typing.Optional[bool].
608
+
609
+ - clean_text: typing.Optional[bool].
610
+
611
+ - max_characters_per_chunk: typing.Optional[int].
612
+
613
+ - extract_tags: typing.Optional[bool].
614
+
615
+ - summarize: typing.Optional[bool].
616
+
617
+ - pdf_settings: typing.Optional[PdfParams].
618
+
619
+ - html_settings: typing.Optional[HtmlParams].
620
+
621
+ - csv_settings: typing.Optional[CsvParams].
622
+
623
+ - ppt_settings: typing.Optional[PptParams].
624
+
625
+ - pptx_settings: typing.Optional[PptxParams].
626
+
627
+ - xlsx_settings: typing.Optional[XlsxParams].
628
+
629
+ - txt_settings: typing.Optional[TxtParams].
630
+
631
+ - audio_settings: typing.Optional[AudioParams].
632
+
633
+ - image_settings: typing.Optional[ImageParams].
634
+
635
+ - video_settings: typing.Optional[VideoParams].
636
+
637
+ - request_options: typing.Optional[RequestOptions]. Request-specific configuration.
638
+ ---
639
+ from mixpeek.client import AsyncMixpeek
640
+
641
+ client = AsyncMixpeek(
642
+ authorization="YOUR_AUTHORIZATION",
643
+ index_id="YOUR_INDEX_ID",
644
+ api_key="YOUR_API_KEY",
645
+ )
646
+ await client.extract()
647
+ """
648
+ _request: typing.Dict[str, typing.Any] = {}
649
+ if file_url is not OMIT:
650
+ _request["file_url"] = file_url
651
+ if contents is not OMIT:
652
+ _request["contents"] = contents
653
+ if should_chunk is not OMIT:
654
+ _request["should_chunk"] = should_chunk
655
+ if clean_text is not OMIT:
656
+ _request["clean_text"] = clean_text
657
+ if max_characters_per_chunk is not OMIT:
658
+ _request["max_characters_per_chunk"] = max_characters_per_chunk
659
+ if extract_tags is not OMIT:
660
+ _request["extract_tags"] = extract_tags
661
+ if summarize is not OMIT:
662
+ _request["summarize"] = summarize
663
+ if pdf_settings is not OMIT:
664
+ _request["pdf_settings"] = pdf_settings
665
+ if html_settings is not OMIT:
666
+ _request["html_settings"] = html_settings
667
+ if csv_settings is not OMIT:
668
+ _request["csv_settings"] = csv_settings
669
+ if ppt_settings is not OMIT:
670
+ _request["ppt_settings"] = ppt_settings
671
+ if pptx_settings is not OMIT:
672
+ _request["pptx_settings"] = pptx_settings
673
+ if xlsx_settings is not OMIT:
674
+ _request["xlsx_settings"] = xlsx_settings
675
+ if txt_settings is not OMIT:
676
+ _request["txt_settings"] = txt_settings
677
+ if audio_settings is not OMIT:
678
+ _request["audio_settings"] = audio_settings
679
+ if image_settings is not OMIT:
680
+ _request["image_settings"] = image_settings
681
+ if video_settings is not OMIT:
682
+ _request["video_settings"] = video_settings
683
+ _response = await self._client_wrapper.httpx_client.request(
684
+ "POST",
685
+ urllib.parse.urljoin(f"{self._client_wrapper.get_base_url()}/", "extract"),
686
+ params=jsonable_encoder(
687
+ request_options.get("additional_query_parameters") if request_options is not None else None
688
+ ),
689
+ json=jsonable_encoder(_request)
690
+ if request_options is None or request_options.get("additional_body_parameters") is None
691
+ else {
692
+ **jsonable_encoder(_request),
693
+ **(jsonable_encoder(remove_none_from_dict(request_options.get("additional_body_parameters", {})))),
694
+ },
695
+ headers=jsonable_encoder(
696
+ remove_none_from_dict(
697
+ {
698
+ **self._client_wrapper.get_headers(),
699
+ **(request_options.get("additional_headers", {}) if request_options is not None else {}),
700
+ }
701
+ )
702
+ ),
703
+ timeout=request_options.get("timeout_in_seconds")
704
+ if request_options is not None and request_options.get("timeout_in_seconds") is not None
705
+ else self._client_wrapper.get_timeout(),
706
+ retries=0,
707
+ max_retries=request_options.get("max_retries") if request_options is not None else 0, # type: ignore
708
+ )
709
+ if 200 <= _response.status_code < 300:
710
+ return pydantic.parse_obj_as(ExtractResponse, _response.json()) # type: ignore
711
+ if _response.status_code == 400:
712
+ raise BadRequestError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
713
+ if _response.status_code == 401:
714
+ raise UnauthorizedError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
715
+ if _response.status_code == 403:
716
+ raise ForbiddenError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
717
+ if _response.status_code == 404:
718
+ raise NotFoundError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
719
+ if _response.status_code == 422:
720
+ raise UnprocessableEntityError(pydantic.parse_obj_as(HttpValidationError, _response.json())) # type: ignore
721
+ if _response.status_code == 500:
722
+ raise InternalServerError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
723
+ try:
724
+ _response_json = _response.json()
725
+ except JSONDecodeError:
726
+ raise ApiError(status_code=_response.status_code, body=_response.text)
727
+ raise ApiError(status_code=_response.status_code, body=_response_json)
728
+
729
+ async def base_generate(
730
+ self,
731
+ *,
732
+ model: Model,
733
+ response_format: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
734
+ context: typing.Optional[str] = OMIT,
735
+ messages: typing.Sequence[Message],
736
+ settings: typing.Optional[Settings] = OMIT,
737
+ request_options: typing.Optional[RequestOptions] = None,
738
+ ) -> GenerationResponse:
739
+ """
740
+ Parameters:
741
+ - model: Model. The model to be used.
742
+
743
+ - response_format: typing.Optional[typing.Dict[str, typing.Any]].
744
+
745
+ - context: typing.Optional[str].
746
+
747
+ - messages: typing.Sequence[Message]. The messages for the generation.
748
+
749
+ - settings: typing.Optional[Settings].
750
+
751
+ - request_options: typing.Optional[RequestOptions]. Request-specific configuration.
752
+ ---
753
+ from mixpeek import Message, Model
754
+ from mixpeek.client import AsyncMixpeek
755
+
756
+ client = AsyncMixpeek(
757
+ authorization="YOUR_AUTHORIZATION",
758
+ index_id="YOUR_INDEX_ID",
759
+ api_key="YOUR_API_KEY",
760
+ )
761
+ await client.base_generate(
762
+ model=Model(
763
+ provider="provider",
764
+ model="gpt-3.5-turbo",
765
+ ),
766
+ messages=[
767
+ Message(
768
+ role="role",
769
+ content="content",
770
+ )
771
+ ],
772
+ )
773
+ """
774
+ _request: typing.Dict[str, typing.Any] = {"model": model, "messages": messages}
775
+ if response_format is not OMIT:
776
+ _request["response_format"] = response_format
777
+ if context is not OMIT:
778
+ _request["context"] = context
779
+ if settings is not OMIT:
780
+ _request["settings"] = settings
781
+ _response = await self._client_wrapper.httpx_client.request(
782
+ "POST",
783
+ urllib.parse.urljoin(f"{self._client_wrapper.get_base_url()}/", "generate/text"),
784
+ params=jsonable_encoder(
785
+ request_options.get("additional_query_parameters") if request_options is not None else None
786
+ ),
787
+ json=jsonable_encoder(_request)
788
+ if request_options is None or request_options.get("additional_body_parameters") is None
789
+ else {
790
+ **jsonable_encoder(_request),
791
+ **(jsonable_encoder(remove_none_from_dict(request_options.get("additional_body_parameters", {})))),
792
+ },
793
+ headers=jsonable_encoder(
794
+ remove_none_from_dict(
795
+ {
796
+ **self._client_wrapper.get_headers(),
797
+ **(request_options.get("additional_headers", {}) if request_options is not None else {}),
798
+ }
799
+ )
800
+ ),
801
+ timeout=request_options.get("timeout_in_seconds")
802
+ if request_options is not None and request_options.get("timeout_in_seconds") is not None
803
+ else self._client_wrapper.get_timeout(),
804
+ retries=0,
805
+ max_retries=request_options.get("max_retries") if request_options is not None else 0, # type: ignore
806
+ )
807
+ if 200 <= _response.status_code < 300:
808
+ return pydantic.parse_obj_as(GenerationResponse, _response.json()) # type: ignore
809
+ if _response.status_code == 400:
810
+ raise BadRequestError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
811
+ if _response.status_code == 401:
812
+ raise UnauthorizedError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
813
+ if _response.status_code == 403:
814
+ raise ForbiddenError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
815
+ if _response.status_code == 404:
816
+ raise NotFoundError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
817
+ if _response.status_code == 422:
818
+ raise UnprocessableEntityError(pydantic.parse_obj_as(HttpValidationError, _response.json())) # type: ignore
819
+ if _response.status_code == 500:
820
+ raise InternalServerError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
821
+ try:
822
+ _response_json = _response.json()
823
+ except JSONDecodeError:
824
+ raise ApiError(status_code=_response.status_code, body=_response.text)
825
+ raise ApiError(status_code=_response.status_code, body=_response_json)
826
+
827
+ async def get_model_config(
828
+ self,
829
+ *,
830
+ modality: typing.Optional[Modality] = OMIT,
831
+ model: typing.Optional[Models] = OMIT,
832
+ request_options: typing.Optional[RequestOptions] = None,
833
+ ) -> ConfigsResponse:
834
+ """
835
+ Parameters:
836
+ - modality: typing.Optional[Modality].
837
+
838
+ - model: typing.Optional[Models].
839
+
840
+ - request_options: typing.Optional[RequestOptions]. Request-specific configuration.
841
+ ---
842
+ from mixpeek.client import AsyncMixpeek
843
+
844
+ client = AsyncMixpeek(
845
+ authorization="YOUR_AUTHORIZATION",
846
+ index_id="YOUR_INDEX_ID",
847
+ api_key="YOUR_API_KEY",
848
+ )
849
+ await client.get_model_config()
850
+ """
851
+ _request: typing.Dict[str, typing.Any] = {}
852
+ if modality is not OMIT:
853
+ _request["modality"] = modality
854
+ if model is not OMIT:
855
+ _request["model"] = model
856
+ _response = await self._client_wrapper.httpx_client.request(
857
+ "POST",
858
+ urllib.parse.urljoin(f"{self._client_wrapper.get_base_url()}/", "embed/config"),
859
+ params=jsonable_encoder(
860
+ request_options.get("additional_query_parameters") if request_options is not None else None
861
+ ),
862
+ json=jsonable_encoder(_request)
863
+ if request_options is None or request_options.get("additional_body_parameters") is None
864
+ else {
865
+ **jsonable_encoder(_request),
866
+ **(jsonable_encoder(remove_none_from_dict(request_options.get("additional_body_parameters", {})))),
867
+ },
868
+ headers=jsonable_encoder(
869
+ remove_none_from_dict(
870
+ {
871
+ **self._client_wrapper.get_headers(),
872
+ **(request_options.get("additional_headers", {}) if request_options is not None else {}),
873
+ }
874
+ )
875
+ ),
876
+ timeout=request_options.get("timeout_in_seconds")
877
+ if request_options is not None and request_options.get("timeout_in_seconds") is not None
878
+ else self._client_wrapper.get_timeout(),
879
+ retries=0,
880
+ max_retries=request_options.get("max_retries") if request_options is not None else 0, # type: ignore
881
+ )
882
+ if 200 <= _response.status_code < 300:
883
+ return pydantic.parse_obj_as(ConfigsResponse, _response.json()) # type: ignore
884
+ if _response.status_code == 400:
885
+ raise BadRequestError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
886
+ if _response.status_code == 401:
887
+ raise UnauthorizedError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
888
+ if _response.status_code == 403:
889
+ raise ForbiddenError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
890
+ if _response.status_code == 404:
891
+ raise NotFoundError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
892
+ if _response.status_code == 422:
893
+ raise UnprocessableEntityError(pydantic.parse_obj_as(HttpValidationError, _response.json())) # type: ignore
894
+ if _response.status_code == 500:
895
+ raise InternalServerError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
896
+ try:
897
+ _response_json = _response.json()
898
+ except JSONDecodeError:
899
+ raise ApiError(status_code=_response.status_code, body=_response.text)
900
+ raise ApiError(status_code=_response.status_code, body=_response_json)
901
+
902
+ async def embed(
903
+ self,
904
+ *,
905
+ input: str,
906
+ modality: typing.Optional[Modality] = OMIT,
907
+ model: typing.Optional[str] = OMIT,
908
+ request_options: typing.Optional[RequestOptions] = None,
909
+ ) -> EmbeddingResponse:
910
+ """
911
+ Parameters:
912
+ - input: str. The input data to be processed.
913
+
914
+ - modality: typing.Optional[Modality].
915
+
916
+ - model: typing.Optional[str].
917
+
918
+ - request_options: typing.Optional[RequestOptions]. Request-specific configuration.
919
+ ---
920
+ from mixpeek.client import AsyncMixpeek
921
+
922
+ client = AsyncMixpeek(
923
+ authorization="YOUR_AUTHORIZATION",
924
+ index_id="YOUR_INDEX_ID",
925
+ api_key="YOUR_API_KEY",
926
+ )
927
+ await client.embed(
928
+ input="input",
929
+ )
930
+ """
931
+ _request: typing.Dict[str, typing.Any] = {"input": input}
932
+ if modality is not OMIT:
933
+ _request["modality"] = modality
934
+ if model is not OMIT:
935
+ _request["model"] = model
936
+ _response = await self._client_wrapper.httpx_client.request(
937
+ "POST",
938
+ urllib.parse.urljoin(f"{self._client_wrapper.get_base_url()}/", "embed"),
939
+ params=jsonable_encoder(
940
+ request_options.get("additional_query_parameters") if request_options is not None else None
941
+ ),
942
+ json=jsonable_encoder(_request)
943
+ if request_options is None or request_options.get("additional_body_parameters") is None
944
+ else {
945
+ **jsonable_encoder(_request),
946
+ **(jsonable_encoder(remove_none_from_dict(request_options.get("additional_body_parameters", {})))),
947
+ },
948
+ headers=jsonable_encoder(
949
+ remove_none_from_dict(
950
+ {
951
+ **self._client_wrapper.get_headers(),
952
+ **(request_options.get("additional_headers", {}) if request_options is not None else {}),
953
+ }
954
+ )
955
+ ),
956
+ timeout=request_options.get("timeout_in_seconds")
957
+ if request_options is not None and request_options.get("timeout_in_seconds") is not None
958
+ else self._client_wrapper.get_timeout(),
959
+ retries=0,
960
+ max_retries=request_options.get("max_retries") if request_options is not None else 0, # type: ignore
961
+ )
962
+ if 200 <= _response.status_code < 300:
963
+ return pydantic.parse_obj_as(EmbeddingResponse, _response.json()) # type: ignore
964
+ if _response.status_code == 400:
965
+ raise BadRequestError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
966
+ if _response.status_code == 401:
967
+ raise UnauthorizedError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
968
+ if _response.status_code == 403:
969
+ raise ForbiddenError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
970
+ if _response.status_code == 404:
971
+ raise NotFoundError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
972
+ if _response.status_code == 422:
973
+ raise UnprocessableEntityError(pydantic.parse_obj_as(HttpValidationError, _response.json())) # type: ignore
974
+ if _response.status_code == 500:
975
+ raise InternalServerError(pydantic.parse_obj_as(ErrorResponse, _response.json())) # type: ignore
976
+ try:
977
+ _response_json = _response.json()
978
+ except JSONDecodeError:
979
+ raise ApiError(status_code=_response.status_code, body=_response.text)
980
+ raise ApiError(status_code=_response.status_code, body=_response_json)
147
981
 
148
982
 
149
983
  def _get_base_url(*, base_url: typing.Optional[str] = None, environment: MixpeekEnvironment) -> str: