vellum-ai 1.1.1__py3-none-any.whl → 1.1.3__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 (85) hide show
  1. vellum/__init__.py +16 -0
  2. vellum/client/README.md +55 -0
  3. vellum/client/__init__.py +66 -507
  4. vellum/client/core/client_wrapper.py +2 -2
  5. vellum/client/core/pydantic_utilities.py +10 -3
  6. vellum/client/raw_client.py +844 -0
  7. vellum/client/reference.md +692 -19
  8. vellum/client/resources/ad_hoc/client.py +23 -180
  9. vellum/client/resources/ad_hoc/raw_client.py +276 -0
  10. vellum/client/resources/container_images/client.py +10 -36
  11. vellum/client/resources/deployments/client.py +16 -62
  12. vellum/client/resources/document_indexes/client.py +16 -72
  13. vellum/client/resources/documents/client.py +8 -30
  14. vellum/client/resources/folder_entities/client.py +4 -8
  15. vellum/client/resources/metric_definitions/client.py +4 -14
  16. vellum/client/resources/ml_models/client.py +2 -8
  17. vellum/client/resources/organizations/client.py +2 -6
  18. vellum/client/resources/prompts/client.py +2 -10
  19. vellum/client/resources/sandboxes/client.py +4 -20
  20. vellum/client/resources/test_suite_runs/client.py +4 -18
  21. vellum/client/resources/test_suites/client.py +11 -86
  22. vellum/client/resources/test_suites/raw_client.py +136 -0
  23. vellum/client/resources/workflow_deployments/client.py +20 -78
  24. vellum/client/resources/workflow_executions/client.py +2 -6
  25. vellum/client/resources/workflow_sandboxes/client.py +2 -10
  26. vellum/client/resources/workflows/client.py +7 -6
  27. vellum/client/resources/workflows/raw_client.py +58 -47
  28. vellum/client/resources/workspace_secrets/client.py +4 -20
  29. vellum/client/resources/workspaces/client.py +2 -6
  30. vellum/client/types/__init__.py +16 -0
  31. vellum/client/types/array_chat_message_content_item.py +4 -2
  32. vellum/client/types/array_chat_message_content_item_request.py +4 -2
  33. vellum/client/types/chat_message_content.py +4 -2
  34. vellum/client/types/chat_message_content_request.py +4 -2
  35. vellum/client/types/node_execution_span.py +2 -0
  36. vellum/client/types/prompt_block.py +4 -2
  37. vellum/client/types/vellum_value.py +4 -2
  38. vellum/client/types/vellum_value_request.py +4 -2
  39. vellum/client/types/vellum_variable_type.py +2 -1
  40. vellum/client/types/vellum_video.py +24 -0
  41. vellum/client/types/vellum_video_request.py +24 -0
  42. vellum/client/types/video_chat_message_content.py +25 -0
  43. vellum/client/types/video_chat_message_content_request.py +25 -0
  44. vellum/client/types/video_prompt_block.py +29 -0
  45. vellum/client/types/video_vellum_value.py +25 -0
  46. vellum/client/types/video_vellum_value_request.py +25 -0
  47. vellum/client/types/workflow_execution_span.py +2 -0
  48. vellum/client/types/workflow_execution_usage_calculation_fulfilled_body.py +22 -0
  49. vellum/prompts/blocks/compilation.py +22 -10
  50. vellum/types/vellum_video.py +3 -0
  51. vellum/types/vellum_video_request.py +3 -0
  52. vellum/types/video_chat_message_content.py +3 -0
  53. vellum/types/video_chat_message_content_request.py +3 -0
  54. vellum/types/video_prompt_block.py +3 -0
  55. vellum/types/video_vellum_value.py +3 -0
  56. vellum/types/video_vellum_value_request.py +3 -0
  57. vellum/types/workflow_execution_usage_calculation_fulfilled_body.py +3 -0
  58. vellum/workflows/events/workflow.py +11 -0
  59. vellum/workflows/graph/graph.py +103 -1
  60. vellum/workflows/graph/tests/test_graph.py +99 -0
  61. vellum/workflows/nodes/bases/base.py +9 -1
  62. vellum/workflows/nodes/displayable/bases/utils.py +4 -2
  63. vellum/workflows/nodes/displayable/tool_calling_node/node.py +19 -18
  64. vellum/workflows/nodes/displayable/tool_calling_node/tests/test_node.py +17 -7
  65. vellum/workflows/nodes/displayable/tool_calling_node/tests/test_utils.py +7 -7
  66. vellum/workflows/nodes/displayable/tool_calling_node/utils.py +47 -80
  67. vellum/workflows/references/environment_variable.py +10 -0
  68. vellum/workflows/runner/runner.py +18 -2
  69. vellum/workflows/state/context.py +101 -12
  70. vellum/workflows/types/definition.py +11 -1
  71. vellum/workflows/types/tests/test_definition.py +19 -0
  72. vellum/workflows/utils/vellum_variables.py +9 -5
  73. vellum/workflows/workflows/base.py +12 -5
  74. {vellum_ai-1.1.1.dist-info → vellum_ai-1.1.3.dist-info}/METADATA +1 -1
  75. {vellum_ai-1.1.1.dist-info → vellum_ai-1.1.3.dist-info}/RECORD +85 -69
  76. vellum_ee/workflows/display/nodes/vellum/code_execution_node.py +1 -1
  77. vellum_ee/workflows/display/nodes/vellum/tests/test_code_execution_node.py +55 -1
  78. vellum_ee/workflows/display/nodes/vellum/tests/test_tool_calling_node.py +15 -52
  79. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_mcp_serialization.py +15 -49
  80. vellum_ee/workflows/display/types.py +14 -1
  81. vellum_ee/workflows/display/utils/expressions.py +13 -4
  82. vellum_ee/workflows/display/workflows/base_workflow_display.py +6 -19
  83. {vellum_ai-1.1.1.dist-info → vellum_ai-1.1.3.dist-info}/LICENSE +0 -0
  84. {vellum_ai-1.1.1.dist-info → vellum_ai-1.1.3.dist-info}/WHEEL +0 -0
  85. {vellum_ai-1.1.1.dist-info → vellum_ai-1.1.3.dist-info}/entry_points.txt +0 -0
vellum/client/__init__.py CHANGED
@@ -5,6 +5,7 @@ from .environment import VellumEnvironment
5
5
  from .types.api_version_enum import ApiVersionEnum
6
6
  import os
7
7
  import httpx
8
+ from .core.api_error import ApiError
8
9
  from .core.client_wrapper import SyncClientWrapper
9
10
  from .raw_client import RawVellum
10
11
  from .resources.ad_hoc.client import AdHocClient
@@ -42,15 +43,6 @@ from .types.prompt_deployment_expand_meta_request import PromptDeploymentExpandM
42
43
  from .types.raw_prompt_execution_overrides_request import RawPromptExecutionOverridesRequest
43
44
  from .types.execute_prompt_response import ExecutePromptResponse
44
45
  from .types.execute_prompt_event import ExecutePromptEvent
45
- from .core.serialization import convert_and_respect_annotation_metadata
46
- from .core.pydantic_utilities import parse_obj_as
47
- import json
48
- from .errors.bad_request_error import BadRequestError
49
- from .errors.forbidden_error import ForbiddenError
50
- from .errors.not_found_error import NotFoundError
51
- from .errors.internal_server_error import InternalServerError
52
- from json.decoder import JSONDecodeError
53
- from .core.api_error import ApiError
54
46
  from .types.workflow_request_input_request import WorkflowRequestInputRequest
55
47
  from .types.workflow_expand_meta_request import WorkflowExpandMetaRequest
56
48
  from .types.execute_workflow_response import ExecuteWorkflowResponse
@@ -476,98 +468,19 @@ class Vellum:
476
468
  for chunk in response:
477
469
  yield chunk
478
470
  """
479
- with self._raw_client._client_wrapper.httpx_client.stream(
480
- "v1/execute-prompt-stream",
481
- base_url=self._raw_client._client_wrapper.get_environment().predict,
482
- method="POST",
483
- json={
484
- "inputs": convert_and_respect_annotation_metadata(
485
- object_=inputs, annotation=typing.Sequence[PromptDeploymentInputRequest], direction="write"
486
- ),
487
- "prompt_deployment_id": prompt_deployment_id,
488
- "prompt_deployment_name": prompt_deployment_name,
489
- "release_tag": release_tag,
490
- "external_id": external_id,
491
- "expand_meta": convert_and_respect_annotation_metadata(
492
- object_=expand_meta,
493
- annotation=typing.Optional[PromptDeploymentExpandMetaRequest],
494
- direction="write",
495
- ),
496
- "raw_overrides": convert_and_respect_annotation_metadata(
497
- object_=raw_overrides,
498
- annotation=typing.Optional[RawPromptExecutionOverridesRequest],
499
- direction="write",
500
- ),
501
- "expand_raw": expand_raw,
502
- "metadata": metadata,
503
- },
504
- headers={
505
- "content-type": "application/json",
506
- },
471
+ with self._raw_client.execute_prompt_stream(
472
+ inputs=inputs,
473
+ prompt_deployment_id=prompt_deployment_id,
474
+ prompt_deployment_name=prompt_deployment_name,
475
+ release_tag=release_tag,
476
+ external_id=external_id,
477
+ expand_meta=expand_meta,
478
+ raw_overrides=raw_overrides,
479
+ expand_raw=expand_raw,
480
+ metadata=metadata,
507
481
  request_options=request_options,
508
- omit=OMIT,
509
- ) as _response:
510
- try:
511
- if 200 <= _response.status_code < 300:
512
- for _text in _response.iter_lines():
513
- try:
514
- if len(_text) == 0:
515
- continue
516
- yield typing.cast(
517
- ExecutePromptEvent,
518
- parse_obj_as(
519
- type_=ExecutePromptEvent, # type: ignore
520
- object_=json.loads(_text),
521
- ),
522
- )
523
- except Exception:
524
- pass
525
- return
526
- _response.read()
527
- if _response.status_code == 400:
528
- raise BadRequestError(
529
- typing.cast(
530
- typing.Optional[typing.Any],
531
- parse_obj_as(
532
- type_=typing.Optional[typing.Any], # type: ignore
533
- object_=_response.json(),
534
- ),
535
- )
536
- )
537
- if _response.status_code == 403:
538
- raise ForbiddenError(
539
- typing.cast(
540
- typing.Optional[typing.Any],
541
- parse_obj_as(
542
- type_=typing.Optional[typing.Any], # type: ignore
543
- object_=_response.json(),
544
- ),
545
- )
546
- )
547
- if _response.status_code == 404:
548
- raise NotFoundError(
549
- typing.cast(
550
- typing.Optional[typing.Any],
551
- parse_obj_as(
552
- type_=typing.Optional[typing.Any], # type: ignore
553
- object_=_response.json(),
554
- ),
555
- )
556
- )
557
- if _response.status_code == 500:
558
- raise InternalServerError(
559
- typing.cast(
560
- typing.Optional[typing.Any],
561
- parse_obj_as(
562
- type_=typing.Optional[typing.Any], # type: ignore
563
- object_=_response.json(),
564
- ),
565
- )
566
- )
567
- _response_json = _response.json()
568
- except JSONDecodeError:
569
- raise ApiError(status_code=_response.status_code, body=_response.text)
570
- raise ApiError(status_code=_response.status_code, body=_response_json)
482
+ ) as r:
483
+ yield from r.data
571
484
 
572
485
  def execute_workflow(
573
486
  self,
@@ -721,81 +634,18 @@ class Vellum:
721
634
  for chunk in response:
722
635
  yield chunk
723
636
  """
724
- with self._raw_client._client_wrapper.httpx_client.stream(
725
- "v1/execute-workflow-stream",
726
- base_url=self._raw_client._client_wrapper.get_environment().predict,
727
- method="POST",
728
- json={
729
- "inputs": convert_and_respect_annotation_metadata(
730
- object_=inputs, annotation=typing.Sequence[WorkflowRequestInputRequest], direction="write"
731
- ),
732
- "expand_meta": convert_and_respect_annotation_metadata(
733
- object_=expand_meta, annotation=typing.Optional[WorkflowExpandMetaRequest], direction="write"
734
- ),
735
- "workflow_deployment_id": workflow_deployment_id,
736
- "workflow_deployment_name": workflow_deployment_name,
737
- "release_tag": release_tag,
738
- "external_id": external_id,
739
- "event_types": event_types,
740
- "metadata": metadata,
741
- },
742
- headers={
743
- "content-type": "application/json",
744
- },
637
+ with self._raw_client.execute_workflow_stream(
638
+ inputs=inputs,
639
+ expand_meta=expand_meta,
640
+ workflow_deployment_id=workflow_deployment_id,
641
+ workflow_deployment_name=workflow_deployment_name,
642
+ release_tag=release_tag,
643
+ external_id=external_id,
644
+ event_types=event_types,
645
+ metadata=metadata,
745
646
  request_options=request_options,
746
- omit=OMIT,
747
- ) as _response:
748
- try:
749
- if 200 <= _response.status_code < 300:
750
- for _text in _response.iter_lines():
751
- try:
752
- if len(_text) == 0:
753
- continue
754
- yield typing.cast(
755
- WorkflowStreamEvent,
756
- parse_obj_as(
757
- type_=WorkflowStreamEvent, # type: ignore
758
- object_=json.loads(_text),
759
- ),
760
- )
761
- except Exception:
762
- pass
763
- return
764
- _response.read()
765
- if _response.status_code == 400:
766
- raise BadRequestError(
767
- typing.cast(
768
- typing.Optional[typing.Any],
769
- parse_obj_as(
770
- type_=typing.Optional[typing.Any], # type: ignore
771
- object_=_response.json(),
772
- ),
773
- )
774
- )
775
- if _response.status_code == 404:
776
- raise NotFoundError(
777
- typing.cast(
778
- typing.Optional[typing.Any],
779
- parse_obj_as(
780
- type_=typing.Optional[typing.Any], # type: ignore
781
- object_=_response.json(),
782
- ),
783
- )
784
- )
785
- if _response.status_code == 500:
786
- raise InternalServerError(
787
- typing.cast(
788
- typing.Optional[typing.Any],
789
- parse_obj_as(
790
- type_=typing.Optional[typing.Any], # type: ignore
791
- object_=_response.json(),
792
- ),
793
- )
794
- )
795
- _response_json = _response.json()
796
- except JSONDecodeError:
797
- raise ApiError(status_code=_response.status_code, body=_response.text)
798
- raise ApiError(status_code=_response.status_code, body=_response_json)
647
+ ) as r:
648
+ yield from r.data
799
649
 
800
650
  def generate(
801
651
  self,
@@ -920,87 +770,14 @@ class Vellum:
920
770
  for chunk in response:
921
771
  yield chunk
922
772
  """
923
- with self._raw_client._client_wrapper.httpx_client.stream(
924
- "v1/generate-stream",
925
- base_url=self._raw_client._client_wrapper.get_environment().predict,
926
- method="POST",
927
- json={
928
- "deployment_id": deployment_id,
929
- "deployment_name": deployment_name,
930
- "requests": convert_and_respect_annotation_metadata(
931
- object_=requests, annotation=typing.Sequence[GenerateRequest], direction="write"
932
- ),
933
- "options": convert_and_respect_annotation_metadata(
934
- object_=options, annotation=typing.Optional[GenerateOptionsRequest], direction="write"
935
- ),
936
- },
937
- headers={
938
- "content-type": "application/json",
939
- },
773
+ with self._raw_client.generate_stream(
774
+ requests=requests,
775
+ deployment_id=deployment_id,
776
+ deployment_name=deployment_name,
777
+ options=options,
940
778
  request_options=request_options,
941
- omit=OMIT,
942
- ) as _response:
943
- try:
944
- if 200 <= _response.status_code < 300:
945
- for _text in _response.iter_lines():
946
- try:
947
- if len(_text) == 0:
948
- continue
949
- yield typing.cast(
950
- GenerateStreamResponse,
951
- parse_obj_as(
952
- type_=GenerateStreamResponse, # type: ignore
953
- object_=json.loads(_text),
954
- ),
955
- )
956
- except Exception:
957
- pass
958
- return
959
- _response.read()
960
- if _response.status_code == 400:
961
- raise BadRequestError(
962
- typing.cast(
963
- typing.Optional[typing.Any],
964
- parse_obj_as(
965
- type_=typing.Optional[typing.Any], # type: ignore
966
- object_=_response.json(),
967
- ),
968
- )
969
- )
970
- if _response.status_code == 403:
971
- raise ForbiddenError(
972
- typing.cast(
973
- typing.Optional[typing.Any],
974
- parse_obj_as(
975
- type_=typing.Optional[typing.Any], # type: ignore
976
- object_=_response.json(),
977
- ),
978
- )
979
- )
980
- if _response.status_code == 404:
981
- raise NotFoundError(
982
- typing.cast(
983
- typing.Optional[typing.Any],
984
- parse_obj_as(
985
- type_=typing.Optional[typing.Any], # type: ignore
986
- object_=_response.json(),
987
- ),
988
- )
989
- )
990
- if _response.status_code == 500:
991
- raise InternalServerError(
992
- typing.cast(
993
- typing.Optional[typing.Any],
994
- parse_obj_as(
995
- type_=typing.Optional[typing.Any], # type: ignore
996
- object_=_response.json(),
997
- ),
998
- )
999
- )
1000
- _response_json = _response.json()
1001
- except JSONDecodeError:
1002
- raise ApiError(status_code=_response.status_code, body=_response.text)
1003
- raise ApiError(status_code=_response.status_code, body=_response_json)
779
+ ) as r:
780
+ yield from r.data
1004
781
 
1005
782
  def search(
1006
783
  self,
@@ -1158,10 +935,7 @@ class Vellum:
1158
935
  )
1159
936
  """
1160
937
  response = self._raw_client.submit_workflow_execution_actuals(
1161
- actuals=actuals,
1162
- execution_id=execution_id,
1163
- external_id=external_id,
1164
- request_options=request_options,
938
+ actuals=actuals, execution_id=execution_id, external_id=external_id, request_options=request_options
1165
939
  )
1166
940
  return response.data
1167
941
 
@@ -1584,98 +1358,20 @@ class AsyncVellum:
1584
1358
 
1585
1359
  asyncio.run(main())
1586
1360
  """
1587
- async with self._raw_client._client_wrapper.httpx_client.stream(
1588
- "v1/execute-prompt-stream",
1589
- base_url=self._raw_client._client_wrapper.get_environment().predict,
1590
- method="POST",
1591
- json={
1592
- "inputs": convert_and_respect_annotation_metadata(
1593
- object_=inputs, annotation=typing.Sequence[PromptDeploymentInputRequest], direction="write"
1594
- ),
1595
- "prompt_deployment_id": prompt_deployment_id,
1596
- "prompt_deployment_name": prompt_deployment_name,
1597
- "release_tag": release_tag,
1598
- "external_id": external_id,
1599
- "expand_meta": convert_and_respect_annotation_metadata(
1600
- object_=expand_meta,
1601
- annotation=typing.Optional[PromptDeploymentExpandMetaRequest],
1602
- direction="write",
1603
- ),
1604
- "raw_overrides": convert_and_respect_annotation_metadata(
1605
- object_=raw_overrides,
1606
- annotation=typing.Optional[RawPromptExecutionOverridesRequest],
1607
- direction="write",
1608
- ),
1609
- "expand_raw": expand_raw,
1610
- "metadata": metadata,
1611
- },
1612
- headers={
1613
- "content-type": "application/json",
1614
- },
1361
+ async with self._raw_client.execute_prompt_stream(
1362
+ inputs=inputs,
1363
+ prompt_deployment_id=prompt_deployment_id,
1364
+ prompt_deployment_name=prompt_deployment_name,
1365
+ release_tag=release_tag,
1366
+ external_id=external_id,
1367
+ expand_meta=expand_meta,
1368
+ raw_overrides=raw_overrides,
1369
+ expand_raw=expand_raw,
1370
+ metadata=metadata,
1615
1371
  request_options=request_options,
1616
- omit=OMIT,
1617
- ) as _response:
1618
- try:
1619
- if 200 <= _response.status_code < 300:
1620
- async for _text in _response.aiter_lines():
1621
- try:
1622
- if len(_text) == 0:
1623
- continue
1624
- yield typing.cast(
1625
- ExecutePromptEvent,
1626
- parse_obj_as(
1627
- type_=ExecutePromptEvent, # type: ignore
1628
- object_=json.loads(_text),
1629
- ),
1630
- )
1631
- except Exception:
1632
- pass
1633
- return
1634
- await _response.aread()
1635
- if _response.status_code == 400:
1636
- raise BadRequestError(
1637
- typing.cast(
1638
- typing.Optional[typing.Any],
1639
- parse_obj_as(
1640
- type_=typing.Optional[typing.Any], # type: ignore
1641
- object_=_response.json(),
1642
- ),
1643
- )
1644
- )
1645
- if _response.status_code == 403:
1646
- raise ForbiddenError(
1647
- typing.cast(
1648
- typing.Optional[typing.Any],
1649
- parse_obj_as(
1650
- type_=typing.Optional[typing.Any], # type: ignore
1651
- object_=_response.json(),
1652
- ),
1653
- )
1654
- )
1655
- if _response.status_code == 404:
1656
- raise NotFoundError(
1657
- typing.cast(
1658
- typing.Optional[typing.Any],
1659
- parse_obj_as(
1660
- type_=typing.Optional[typing.Any], # type: ignore
1661
- object_=_response.json(),
1662
- ),
1663
- )
1664
- )
1665
- if _response.status_code == 500:
1666
- raise InternalServerError(
1667
- typing.cast(
1668
- typing.Optional[typing.Any],
1669
- parse_obj_as(
1670
- type_=typing.Optional[typing.Any], # type: ignore
1671
- object_=_response.json(),
1672
- ),
1673
- )
1674
- )
1675
- _response_json = _response.json()
1676
- except JSONDecodeError:
1677
- raise ApiError(status_code=_response.status_code, body=_response.text)
1678
- raise ApiError(status_code=_response.status_code, body=_response_json)
1372
+ ) as r:
1373
+ async for data in r.data:
1374
+ yield data
1679
1375
 
1680
1376
  async def execute_workflow(
1681
1377
  self,
@@ -1845,81 +1541,19 @@ class AsyncVellum:
1845
1541
 
1846
1542
  asyncio.run(main())
1847
1543
  """
1848
- async with self._raw_client._client_wrapper.httpx_client.stream(
1849
- "v1/execute-workflow-stream",
1850
- base_url=self._raw_client._client_wrapper.get_environment().predict,
1851
- method="POST",
1852
- json={
1853
- "inputs": convert_and_respect_annotation_metadata(
1854
- object_=inputs, annotation=typing.Sequence[WorkflowRequestInputRequest], direction="write"
1855
- ),
1856
- "expand_meta": convert_and_respect_annotation_metadata(
1857
- object_=expand_meta, annotation=typing.Optional[WorkflowExpandMetaRequest], direction="write"
1858
- ),
1859
- "workflow_deployment_id": workflow_deployment_id,
1860
- "workflow_deployment_name": workflow_deployment_name,
1861
- "release_tag": release_tag,
1862
- "external_id": external_id,
1863
- "event_types": event_types,
1864
- "metadata": metadata,
1865
- },
1866
- headers={
1867
- "content-type": "application/json",
1868
- },
1544
+ async with self._raw_client.execute_workflow_stream(
1545
+ inputs=inputs,
1546
+ expand_meta=expand_meta,
1547
+ workflow_deployment_id=workflow_deployment_id,
1548
+ workflow_deployment_name=workflow_deployment_name,
1549
+ release_tag=release_tag,
1550
+ external_id=external_id,
1551
+ event_types=event_types,
1552
+ metadata=metadata,
1869
1553
  request_options=request_options,
1870
- omit=OMIT,
1871
- ) as _response:
1872
- try:
1873
- if 200 <= _response.status_code < 300:
1874
- async for _text in _response.aiter_lines():
1875
- try:
1876
- if len(_text) == 0:
1877
- continue
1878
- yield typing.cast(
1879
- WorkflowStreamEvent,
1880
- parse_obj_as(
1881
- type_=WorkflowStreamEvent, # type: ignore
1882
- object_=json.loads(_text),
1883
- ),
1884
- )
1885
- except Exception:
1886
- pass
1887
- return
1888
- await _response.aread()
1889
- if _response.status_code == 400:
1890
- raise BadRequestError(
1891
- typing.cast(
1892
- typing.Optional[typing.Any],
1893
- parse_obj_as(
1894
- type_=typing.Optional[typing.Any], # type: ignore
1895
- object_=_response.json(),
1896
- ),
1897
- )
1898
- )
1899
- if _response.status_code == 404:
1900
- raise NotFoundError(
1901
- typing.cast(
1902
- typing.Optional[typing.Any],
1903
- parse_obj_as(
1904
- type_=typing.Optional[typing.Any], # type: ignore
1905
- object_=_response.json(),
1906
- ),
1907
- )
1908
- )
1909
- if _response.status_code == 500:
1910
- raise InternalServerError(
1911
- typing.cast(
1912
- typing.Optional[typing.Any],
1913
- parse_obj_as(
1914
- type_=typing.Optional[typing.Any], # type: ignore
1915
- object_=_response.json(),
1916
- ),
1917
- )
1918
- )
1919
- _response_json = _response.json()
1920
- except JSONDecodeError:
1921
- raise ApiError(status_code=_response.status_code, body=_response.text)
1922
- raise ApiError(status_code=_response.status_code, body=_response_json)
1554
+ ) as r:
1555
+ async for data in r.data:
1556
+ yield data
1923
1557
 
1924
1558
  async def generate(
1925
1559
  self,
@@ -2060,87 +1694,15 @@ class AsyncVellum:
2060
1694
 
2061
1695
  asyncio.run(main())
2062
1696
  """
2063
- async with self._raw_client._client_wrapper.httpx_client.stream(
2064
- "v1/generate-stream",
2065
- base_url=self._raw_client._client_wrapper.get_environment().predict,
2066
- method="POST",
2067
- json={
2068
- "deployment_id": deployment_id,
2069
- "deployment_name": deployment_name,
2070
- "requests": convert_and_respect_annotation_metadata(
2071
- object_=requests, annotation=typing.Sequence[GenerateRequest], direction="write"
2072
- ),
2073
- "options": convert_and_respect_annotation_metadata(
2074
- object_=options, annotation=typing.Optional[GenerateOptionsRequest], direction="write"
2075
- ),
2076
- },
2077
- headers={
2078
- "content-type": "application/json",
2079
- },
1697
+ async with self._raw_client.generate_stream(
1698
+ requests=requests,
1699
+ deployment_id=deployment_id,
1700
+ deployment_name=deployment_name,
1701
+ options=options,
2080
1702
  request_options=request_options,
2081
- omit=OMIT,
2082
- ) as _response:
2083
- try:
2084
- if 200 <= _response.status_code < 300:
2085
- async for _text in _response.aiter_lines():
2086
- try:
2087
- if len(_text) == 0:
2088
- continue
2089
- yield typing.cast(
2090
- GenerateStreamResponse,
2091
- parse_obj_as(
2092
- type_=GenerateStreamResponse, # type: ignore
2093
- object_=json.loads(_text),
2094
- ),
2095
- )
2096
- except Exception:
2097
- pass
2098
- return
2099
- await _response.aread()
2100
- if _response.status_code == 400:
2101
- raise BadRequestError(
2102
- typing.cast(
2103
- typing.Optional[typing.Any],
2104
- parse_obj_as(
2105
- type_=typing.Optional[typing.Any], # type: ignore
2106
- object_=_response.json(),
2107
- ),
2108
- )
2109
- )
2110
- if _response.status_code == 403:
2111
- raise ForbiddenError(
2112
- typing.cast(
2113
- typing.Optional[typing.Any],
2114
- parse_obj_as(
2115
- type_=typing.Optional[typing.Any], # type: ignore
2116
- object_=_response.json(),
2117
- ),
2118
- )
2119
- )
2120
- if _response.status_code == 404:
2121
- raise NotFoundError(
2122
- typing.cast(
2123
- typing.Optional[typing.Any],
2124
- parse_obj_as(
2125
- type_=typing.Optional[typing.Any], # type: ignore
2126
- object_=_response.json(),
2127
- ),
2128
- )
2129
- )
2130
- if _response.status_code == 500:
2131
- raise InternalServerError(
2132
- typing.cast(
2133
- typing.Optional[typing.Any],
2134
- parse_obj_as(
2135
- type_=typing.Optional[typing.Any], # type: ignore
2136
- object_=_response.json(),
2137
- ),
2138
- )
2139
- )
2140
- _response_json = _response.json()
2141
- except JSONDecodeError:
2142
- raise ApiError(status_code=_response.status_code, body=_response.text)
2143
- raise ApiError(status_code=_response.status_code, body=_response_json)
1703
+ ) as r:
1704
+ async for data in r.data:
1705
+ yield data
2144
1706
 
2145
1707
  async def search(
2146
1708
  self,
@@ -2325,9 +1887,6 @@ class AsyncVellum:
2325
1887
  asyncio.run(main())
2326
1888
  """
2327
1889
  response = await self._raw_client.submit_workflow_execution_actuals(
2328
- actuals=actuals,
2329
- execution_id=execution_id,
2330
- external_id=external_id,
2331
- request_options=request_options,
1890
+ actuals=actuals, execution_id=execution_id, external_id=external_id, request_options=request_options
2332
1891
  )
2333
1892
  return response.data
@@ -25,10 +25,10 @@ class BaseClientWrapper:
25
25
 
26
26
  def get_headers(self) -> typing.Dict[str, str]:
27
27
  headers: typing.Dict[str, str] = {
28
- "User-Agent": "vellum-ai/1.1.1",
28
+ "User-Agent": "vellum-ai/1.1.3",
29
29
  "X-Fern-Language": "Python",
30
30
  "X-Fern-SDK-Name": "vellum-ai",
31
- "X-Fern-SDK-Version": "1.1.1",
31
+ "X-Fern-SDK-Version": "1.1.3",
32
32
  }
33
33
  if self._api_version is not None:
34
34
  headers["X-API-Version"] = self._api_version
@@ -55,12 +55,19 @@ else:
55
55
 
56
56
  T = typing.TypeVar("T")
57
57
  Model = typing.TypeVar("Model", bound=pydantic.BaseModel)
58
+ type_adapter_cache: typing.Dict[typing.Type, pydantic.TypeAdapter] = {}
59
+ annotated_types = {"ExecuteApiResponse"}
58
60
 
59
61
 
60
- def parse_obj_as(type_: typing.Type[T], object_: typing.Any) -> T:
61
- dealiased_object = convert_and_respect_annotation_metadata(object_=object_, annotation=type_, direction="read")
62
+ def parse_obj_as(type_: typing.Type[T], object_: typing.Any, convert_metadata: bool = False) -> T:
63
+ if hasattr(type_, "__name__") and type_.__name__ in annotated_types:
64
+ dealiased_object = convert_and_respect_annotation_metadata(object_=object_, annotation=type_, direction="read")
65
+ else:
66
+ dealiased_object = object_
62
67
  if IS_PYDANTIC_V2:
63
- adapter = pydantic.TypeAdapter(type_) # type: ignore # Pydantic v2
68
+ adapter = pydantic.TypeAdapter(type_) if type_ not in type_adapter_cache else type_adapter_cache[type_] # type: ignore # Pydantic v2
69
+ if type_ not in type_adapter_cache:
70
+ type_adapter_cache[type_] = adapter
64
71
  return adapter.validate_python(dealiased_object)
65
72
  else:
66
73
  return pydantic.parse_obj_as(type_, dealiased_object)