vellum-ai 0.7.3__py3-none-any.whl → 0.7.5__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- vellum/__init__.py +142 -94
- vellum/client.py +1051 -1097
- vellum/core/__init__.py +4 -1
- vellum/core/client_wrapper.py +7 -3
- vellum/core/http_client.py +365 -20
- vellum/core/jsonable_encoder.py +3 -0
- vellum/core/pydantic_utilities.py +16 -0
- vellum/core/query_encoder.py +33 -0
- vellum/core/remove_none_from_dict.py +2 -2
- vellum/core/request_options.py +2 -2
- vellum/resources/__init__.py +2 -0
- vellum/resources/deployments/client.py +349 -377
- vellum/resources/document_indexes/client.py +542 -610
- vellum/resources/documents/client.py +327 -399
- vellum/resources/folder_entities/client.py +56 -72
- vellum/{types/map_enum.py → resources/ml_models/__init__.py} +0 -3
- vellum/resources/ml_models/client.py +837 -0
- vellum/resources/sandboxes/client.py +204 -242
- vellum/resources/test_suite_runs/client.py +183 -213
- vellum/resources/test_suites/client.py +307 -311
- vellum/resources/workflow_deployments/client.py +230 -268
- vellum/resources/workflow_sandboxes/client.py +82 -96
- vellum/terraform/_jsii/vellum-ai_vellum@0.0.0.jsii.tgz +0 -0
- vellum/terraform/data_vellum_document_index/__init__.py +10 -10
- vellum/terraform/document_index/__init__.py +17 -17
- vellum/terraform/provider/__init__.py +57 -12
- vellum/terraform/versions.json +1 -1
- vellum/types/__init__.py +148 -96
- vellum/types/api_node_result.py +7 -3
- vellum/types/api_node_result_data.py +7 -3
- vellum/types/array_chat_message_content.py +7 -3
- vellum/types/array_chat_message_content_item.py +53 -12
- vellum/types/array_chat_message_content_item_request.py +53 -12
- vellum/types/array_chat_message_content_request.py +7 -3
- vellum/types/array_parameter_config.py +50 -0
- vellum/types/array_parameter_config_request.py +50 -0
- vellum/types/array_variable_value_item.py +102 -24
- vellum/types/array_vellum_value_item.py +102 -24
- vellum/types/array_vellum_value_item_request.py +102 -24
- vellum/types/basic_vectorizer_intfloat_multilingual_e_5_large.py +7 -3
- vellum/types/basic_vectorizer_intfloat_multilingual_e_5_large_request.py +7 -3
- vellum/types/basic_vectorizer_sentence_transformers_multi_qa_mpnet_base_cos_v_1.py +7 -3
- vellum/types/basic_vectorizer_sentence_transformers_multi_qa_mpnet_base_cos_v_1_request.py +7 -3
- vellum/types/basic_vectorizer_sentence_transformers_multi_qa_mpnet_base_dot_v_1.py +7 -3
- vellum/types/basic_vectorizer_sentence_transformers_multi_qa_mpnet_base_dot_v_1_request.py +7 -3
- vellum/types/boolean_parameter_config.py +35 -0
- vellum/types/boolean_parameter_config_request.py +35 -0
- vellum/types/chat_history_input_request.py +7 -3
- vellum/types/chat_message.py +7 -3
- vellum/types/chat_message_content.py +70 -16
- vellum/types/chat_message_content_request.py +70 -16
- vellum/types/chat_message_request.py +7 -3
- vellum/types/code_execution_node_array_result.py +7 -3
- vellum/types/code_execution_node_chat_history_result.py +7 -3
- vellum/types/code_execution_node_error_result.py +7 -3
- vellum/types/code_execution_node_function_call_result.py +7 -3
- vellum/types/code_execution_node_json_result.py +7 -3
- vellum/types/code_execution_node_number_result.py +7 -3
- vellum/types/code_execution_node_result.py +7 -3
- vellum/types/code_execution_node_result_data.py +7 -3
- vellum/types/code_execution_node_result_output.py +144 -32
- vellum/types/code_execution_node_search_results_result.py +7 -3
- vellum/types/code_execution_node_string_result.py +7 -3
- vellum/types/compile_prompt_deployment_expand_meta_request.py +7 -3
- vellum/types/compile_prompt_meta.py +7 -3
- vellum/types/conditional_node_result.py +7 -3
- vellum/types/conditional_node_result_data.py +7 -3
- vellum/types/const_parameter_config.py +35 -0
- vellum/types/const_parameter_config_request.py +35 -0
- vellum/types/create_test_suite_test_case_request.py +7 -3
- vellum/types/deployment_provider_payload_response.py +7 -3
- vellum/types/deployment_read.py +12 -3
- vellum/types/deployment_release_tag_deployment_history_item.py +7 -3
- vellum/types/deployment_release_tag_read.py +7 -3
- vellum/types/document_document_to_document_index.py +7 -3
- vellum/types/document_index_chunking.py +54 -12
- vellum/types/document_index_chunking_request.py +54 -12
- vellum/types/document_index_indexing_config.py +7 -3
- vellum/types/document_index_indexing_config_request.py +7 -3
- vellum/types/document_index_read.py +7 -3
- vellum/types/document_read.py +7 -3
- vellum/types/enriched_normalized_completion.py +7 -3
- vellum/types/error_variable_value.py +7 -3
- vellum/types/error_vellum_value.py +7 -3
- vellum/types/error_vellum_value_request.py +7 -3
- vellum/types/execute_prompt_event.py +82 -16
- vellum/types/execute_prompt_response.py +44 -8
- vellum/types/execute_workflow_response.py +7 -3
- vellum/types/execute_workflow_workflow_result_event.py +41 -8
- vellum/types/execution_array_vellum_value.py +7 -3
- vellum/types/execution_chat_history_vellum_value.py +7 -3
- vellum/types/execution_error_vellum_value.py +7 -3
- vellum/types/execution_function_call_vellum_value.py +7 -3
- vellum/types/execution_json_vellum_value.py +7 -3
- vellum/types/execution_number_vellum_value.py +7 -3
- vellum/types/execution_search_results_vellum_value.py +7 -3
- vellum/types/execution_string_vellum_value.py +7 -3
- vellum/types/execution_vellum_value.py +152 -32
- vellum/types/external_test_case_execution.py +7 -3
- vellum/types/external_test_case_execution_request.py +7 -3
- vellum/types/fulfilled_execute_prompt_event.py +7 -3
- vellum/types/fulfilled_execute_prompt_response.py +7 -3
- vellum/types/fulfilled_execute_workflow_workflow_result_event.py +7 -3
- vellum/types/fulfilled_prompt_execution_meta.py +7 -3
- vellum/types/fulfilled_workflow_node_result_event.py +7 -3
- vellum/types/function_call.py +7 -3
- vellum/types/function_call_chat_message_content.py +7 -3
- vellum/types/function_call_chat_message_content_request.py +7 -3
- vellum/types/function_call_chat_message_content_value.py +7 -3
- vellum/types/function_call_chat_message_content_value_request.py +7 -3
- vellum/types/function_call_request.py +7 -3
- vellum/types/function_call_variable_value.py +7 -3
- vellum/types/function_call_vellum_value.py +7 -3
- vellum/types/function_call_vellum_value_request.py +7 -3
- vellum/types/generate_options_request.py +7 -3
- vellum/types/generate_request.py +7 -3
- vellum/types/generate_result.py +7 -3
- vellum/types/generate_result_data.py +7 -3
- vellum/types/generate_result_error.py +7 -3
- vellum/types/generate_stream_response.py +7 -3
- vellum/types/generate_stream_result.py +7 -3
- vellum/types/generate_stream_result_data.py +7 -3
- vellum/types/hkunlp_instructor_xl_vectorizer.py +7 -3
- vellum/types/hkunlp_instructor_xl_vectorizer_request.py +7 -3
- vellum/types/hosted_by_enum.py +26 -0
- vellum/types/hugging_face_tokenizer_config.py +34 -0
- vellum/types/hugging_face_tokenizer_config_request.py +34 -0
- vellum/types/image_chat_message_content.py +7 -3
- vellum/types/image_chat_message_content_request.py +7 -3
- vellum/types/image_variable_value.py +7 -3
- vellum/types/image_vellum_value.py +7 -3
- vellum/types/image_vellum_value_request.py +7 -3
- vellum/types/indexing_config_vectorizer.py +117 -36
- vellum/types/indexing_config_vectorizer_request.py +117 -36
- vellum/types/initiated_execute_prompt_event.py +7 -3
- vellum/types/initiated_prompt_execution_meta.py +7 -3
- vellum/types/initiated_workflow_node_result_event.py +7 -3
- vellum/types/instructor_vectorizer_config.py +7 -3
- vellum/types/instructor_vectorizer_config_request.py +7 -3
- vellum/types/integer_parameter_config.py +39 -0
- vellum/types/integer_parameter_config_request.py +39 -0
- vellum/types/json_input_request.py +7 -3
- vellum/types/json_variable_value.py +7 -3
- vellum/types/json_vellum_value.py +7 -3
- vellum/types/json_vellum_value_request.py +7 -3
- vellum/types/map_node_result.py +7 -3
- vellum/types/map_node_result_data.py +7 -3
- vellum/types/merge_node_result.py +7 -3
- vellum/types/merge_node_result_data.py +7 -3
- vellum/types/metadata_filter_config_request.py +7 -3
- vellum/types/metadata_filter_rule_request.py +7 -3
- vellum/types/metric_node_result.py +7 -3
- vellum/types/{execute_workflow_stream_error_response.py → ml_model_build_config.py} +9 -8
- vellum/types/{execute_prompt_api_error_response.py → ml_model_build_config_request.py} +9 -8
- vellum/types/ml_model_developer.py +27 -0
- vellum/types/ml_model_developer_enum_value_label.py +31 -0
- vellum/types/ml_model_display_config_labelled.py +33 -0
- vellum/types/ml_model_display_config_request.py +33 -0
- vellum/types/ml_model_display_tag.py +7 -0
- vellum/types/ml_model_display_tag_enum_value_label.py +31 -0
- vellum/types/ml_model_exec_config.py +40 -0
- vellum/types/ml_model_exec_config_request.py +40 -0
- vellum/types/ml_model_family.py +29 -0
- vellum/types/ml_model_family_enum_value_label.py +31 -0
- vellum/types/ml_model_feature.py +18 -0
- vellum/types/ml_model_parameter_config.py +42 -0
- vellum/types/ml_model_parameter_config_request.py +42 -0
- vellum/types/ml_model_read.py +108 -0
- vellum/types/ml_model_request_authorization_config.py +30 -0
- vellum/types/ml_model_request_authorization_config_request.py +30 -0
- vellum/types/ml_model_request_authorization_config_type_enum.py +5 -0
- vellum/types/ml_model_request_config.py +32 -0
- vellum/types/ml_model_request_config_request.py +32 -0
- vellum/types/ml_model_response_config.py +31 -0
- vellum/types/ml_model_response_config_request.py +31 -0
- vellum/types/ml_model_tokenizer_config.py +59 -0
- vellum/types/ml_model_tokenizer_config_request.py +61 -0
- vellum/types/ml_model_usage.py +7 -3
- vellum/types/named_scenario_input_chat_history_variable_value_request.py +7 -3
- vellum/types/named_scenario_input_request.py +38 -8
- vellum/types/named_scenario_input_string_variable_value_request.py +7 -3
- vellum/types/named_test_case_array_variable_value.py +7 -3
- vellum/types/named_test_case_array_variable_value_request.py +7 -3
- vellum/types/named_test_case_chat_history_variable_value.py +7 -3
- vellum/types/named_test_case_chat_history_variable_value_request.py +7 -3
- vellum/types/named_test_case_error_variable_value.py +7 -3
- vellum/types/named_test_case_error_variable_value_request.py +7 -3
- vellum/types/named_test_case_function_call_variable_value.py +7 -3
- vellum/types/named_test_case_function_call_variable_value_request.py +7 -3
- vellum/types/named_test_case_json_variable_value.py +7 -3
- vellum/types/named_test_case_json_variable_value_request.py +7 -3
- vellum/types/named_test_case_number_variable_value.py +7 -3
- vellum/types/named_test_case_number_variable_value_request.py +7 -3
- vellum/types/named_test_case_search_results_variable_value.py +7 -3
- vellum/types/named_test_case_search_results_variable_value_request.py +7 -3
- vellum/types/named_test_case_string_variable_value.py +7 -3
- vellum/types/named_test_case_string_variable_value_request.py +7 -3
- vellum/types/named_test_case_variable_value.py +144 -32
- vellum/types/named_test_case_variable_value_request.py +144 -32
- vellum/types/node_input_compiled_array_value.py +7 -3
- vellum/types/node_input_compiled_chat_history_value.py +7 -3
- vellum/types/node_input_compiled_error_value.py +7 -3
- vellum/types/node_input_compiled_function_call.py +7 -3
- vellum/types/node_input_compiled_json_value.py +7 -3
- vellum/types/node_input_compiled_number_value.py +7 -3
- vellum/types/node_input_compiled_search_results_value.py +7 -3
- vellum/types/node_input_compiled_string_value.py +7 -3
- vellum/types/node_input_variable_compiled_value.py +152 -32
- vellum/types/node_output_compiled_array_value.py +7 -3
- vellum/types/node_output_compiled_chat_history_value.py +7 -3
- vellum/types/node_output_compiled_error_value.py +7 -3
- vellum/types/node_output_compiled_function_call_value.py +7 -3
- vellum/types/node_output_compiled_json_value.py +7 -3
- vellum/types/node_output_compiled_number_value.py +7 -3
- vellum/types/node_output_compiled_search_results_value.py +7 -3
- vellum/types/node_output_compiled_string_value.py +7 -3
- vellum/types/node_output_compiled_value.py +153 -32
- vellum/types/normalized_log_probs.py +7 -3
- vellum/types/normalized_token_log_probs.py +7 -3
- vellum/types/number_parameter_config.py +40 -0
- vellum/types/number_parameter_config_request.py +40 -0
- vellum/types/number_variable_value.py +7 -3
- vellum/types/number_vellum_value.py +7 -3
- vellum/types/number_vellum_value_request.py +7 -3
- vellum/types/object_parameter_config.py +49 -0
- vellum/types/object_parameter_config_request.py +49 -0
- vellum/types/one_of_parameter_config.py +44 -0
- vellum/types/one_of_parameter_config_request.py +44 -0
- vellum/types/open_ai_vectorizer_config.py +7 -3
- vellum/types/open_ai_vectorizer_config_request.py +7 -3
- vellum/types/open_ai_vectorizer_text_embedding_3_large.py +7 -3
- vellum/types/open_ai_vectorizer_text_embedding_3_large_request.py +7 -3
- vellum/types/open_ai_vectorizer_text_embedding_3_small.py +7 -3
- vellum/types/open_ai_vectorizer_text_embedding_3_small_request.py +7 -3
- vellum/types/open_ai_vectorizer_text_embedding_ada_002.py +7 -3
- vellum/types/open_ai_vectorizer_text_embedding_ada_002_request.py +7 -3
- vellum/types/paginated_document_index_read_list.py +7 -3
- vellum/types/paginated_ml_model_read_list.py +33 -0
- vellum/types/paginated_slim_deployment_read_list.py +7 -3
- vellum/types/paginated_slim_document_list.py +7 -3
- vellum/types/paginated_slim_workflow_deployment_list.py +7 -3
- vellum/types/paginated_test_suite_run_execution_list.py +7 -3
- vellum/types/paginated_test_suite_test_case_list.py +7 -3
- vellum/types/parameter_config.py +251 -0
- vellum/types/parameter_config_request.py +251 -0
- vellum/types/pdf_search_result_meta_source.py +7 -3
- vellum/types/pdf_search_result_meta_source_request.py +7 -3
- vellum/types/prompt_deployment_expand_meta_request_request.py +7 -3
- vellum/types/prompt_deployment_input_request.py +55 -12
- vellum/types/prompt_execution_meta.py +7 -3
- vellum/types/prompt_node_execution_meta.py +7 -3
- vellum/types/prompt_node_result.py +7 -3
- vellum/types/prompt_node_result_data.py +7 -3
- vellum/types/prompt_output.py +69 -16
- vellum/types/raw_prompt_execution_overrides_request.py +7 -3
- vellum/types/reducto_chunker_config.py +7 -3
- vellum/types/reducto_chunker_config_request.py +7 -3
- vellum/types/reducto_chunking.py +7 -3
- vellum/types/reducto_chunking_request.py +7 -3
- vellum/types/rejected_execute_prompt_event.py +7 -3
- vellum/types/rejected_execute_prompt_response.py +7 -3
- vellum/types/rejected_execute_workflow_workflow_result_event.py +7 -3
- vellum/types/rejected_prompt_execution_meta.py +7 -3
- vellum/types/rejected_workflow_node_result_event.py +7 -3
- vellum/types/replace_test_suite_test_case_request.py +7 -3
- vellum/types/sandbox_scenario.py +7 -3
- vellum/types/scenario_input.py +38 -8
- vellum/types/scenario_input_chat_history_variable_value.py +7 -3
- vellum/types/scenario_input_string_variable_value.py +7 -3
- vellum/types/search_filters_request.py +7 -3
- vellum/types/search_node_result.py +7 -3
- vellum/types/search_node_result_data.py +7 -3
- vellum/types/search_request_options_request.py +7 -3
- vellum/types/search_response.py +7 -3
- vellum/types/search_result.py +7 -3
- vellum/types/search_result_document.py +7 -3
- vellum/types/search_result_document_request.py +7 -3
- vellum/types/search_result_merging_request.py +7 -3
- vellum/types/search_result_meta.py +7 -3
- vellum/types/search_result_meta_request.py +7 -3
- vellum/types/search_result_meta_source.py +21 -5
- vellum/types/search_result_meta_source_request.py +21 -5
- vellum/types/search_result_request.py +7 -3
- vellum/types/search_weights_request.py +7 -3
- vellum/types/sentence_chunker_config.py +7 -3
- vellum/types/sentence_chunker_config_request.py +7 -3
- vellum/types/sentence_chunking.py +7 -3
- vellum/types/sentence_chunking_request.py +7 -3
- vellum/types/slim_deployment_read.py +11 -3
- vellum/types/slim_document.py +7 -3
- vellum/types/slim_workflow_deployment.py +12 -3
- vellum/types/streaming_execute_prompt_event.py +7 -3
- vellum/types/streaming_prompt_execution_meta.py +7 -3
- vellum/types/streaming_workflow_node_result_event.py +7 -3
- vellum/types/string_chat_message_content.py +7 -3
- vellum/types/string_chat_message_content_request.py +7 -3
- vellum/types/string_input_request.py +7 -3
- vellum/types/string_parameter_config.py +39 -0
- vellum/types/string_parameter_config_request.py +39 -0
- vellum/types/string_variable_value.py +7 -3
- vellum/types/string_vellum_value.py +7 -3
- vellum/types/string_vellum_value_request.py +7 -3
- vellum/types/submit_completion_actual_request.py +7 -3
- vellum/types/submit_workflow_execution_actual_request.py +67 -12
- vellum/types/subworkflow_node_result.py +7 -3
- vellum/types/subworkflow_node_result_data.py +7 -3
- vellum/types/templating_node_array_result.py +7 -3
- vellum/types/templating_node_chat_history_result.py +7 -3
- vellum/types/templating_node_error_result.py +7 -3
- vellum/types/templating_node_function_call_result.py +7 -3
- vellum/types/templating_node_json_result.py +7 -3
- vellum/types/templating_node_number_result.py +7 -3
- vellum/types/templating_node_result.py +7 -3
- vellum/types/templating_node_result_data.py +7 -3
- vellum/types/templating_node_result_output.py +144 -32
- vellum/types/templating_node_search_results_result.py +7 -3
- vellum/types/templating_node_string_result.py +7 -3
- vellum/types/terminal_node_array_result.py +7 -3
- vellum/types/terminal_node_chat_history_result.py +7 -3
- vellum/types/terminal_node_error_result.py +7 -3
- vellum/types/terminal_node_function_call_result.py +7 -3
- vellum/types/terminal_node_json_result.py +7 -3
- vellum/types/terminal_node_number_result.py +7 -3
- vellum/types/terminal_node_result.py +7 -3
- vellum/types/terminal_node_result_data.py +7 -3
- vellum/types/terminal_node_result_output.py +152 -32
- vellum/types/terminal_node_search_results_result.py +7 -3
- vellum/types/terminal_node_string_result.py +7 -3
- vellum/types/test_case_array_variable_value.py +7 -3
- vellum/types/test_case_chat_history_variable_value.py +7 -3
- vellum/types/test_case_error_variable_value.py +7 -3
- vellum/types/test_case_function_call_variable_value.py +7 -3
- vellum/types/test_case_json_variable_value.py +8 -4
- vellum/types/test_case_number_variable_value.py +7 -3
- vellum/types/test_case_search_results_variable_value.py +7 -3
- vellum/types/test_case_string_variable_value.py +7 -3
- vellum/types/test_case_variable_value.py +152 -32
- vellum/types/test_suite_run_deployment_release_tag_exec_config.py +7 -3
- vellum/types/test_suite_run_deployment_release_tag_exec_config_data.py +7 -3
- vellum/types/test_suite_run_deployment_release_tag_exec_config_data_request.py +7 -3
- vellum/types/test_suite_run_deployment_release_tag_exec_config_request.py +7 -3
- vellum/types/test_suite_run_exec_config.py +57 -12
- vellum/types/test_suite_run_exec_config_request.py +61 -12
- vellum/types/test_suite_run_execution.py +7 -3
- vellum/types/test_suite_run_execution_array_output.py +7 -3
- vellum/types/test_suite_run_execution_chat_history_output.py +7 -3
- vellum/types/test_suite_run_execution_error_output.py +7 -3
- vellum/types/test_suite_run_execution_function_call_output.py +7 -3
- vellum/types/test_suite_run_execution_json_output.py +7 -3
- vellum/types/test_suite_run_execution_metric_definition.py +7 -3
- vellum/types/test_suite_run_execution_metric_result.py +7 -3
- vellum/types/test_suite_run_execution_number_output.py +7 -3
- vellum/types/test_suite_run_execution_output.py +152 -32
- vellum/types/test_suite_run_execution_search_results_output.py +7 -3
- vellum/types/test_suite_run_execution_string_output.py +7 -3
- vellum/types/test_suite_run_external_exec_config.py +7 -3
- vellum/types/test_suite_run_external_exec_config_data.py +7 -3
- vellum/types/test_suite_run_external_exec_config_data_request.py +7 -3
- vellum/types/test_suite_run_external_exec_config_request.py +7 -3
- vellum/types/test_suite_run_metric_error_output.py +7 -3
- vellum/types/test_suite_run_metric_number_output.py +7 -3
- vellum/types/test_suite_run_metric_output.py +55 -12
- vellum/types/test_suite_run_metric_string_output.py +7 -3
- vellum/types/test_suite_run_read.py +7 -3
- vellum/types/test_suite_run_test_suite.py +7 -3
- vellum/types/test_suite_run_workflow_release_tag_exec_config.py +7 -3
- vellum/types/test_suite_run_workflow_release_tag_exec_config_data.py +7 -3
- vellum/types/test_suite_run_workflow_release_tag_exec_config_data_request.py +7 -3
- vellum/types/test_suite_run_workflow_release_tag_exec_config_request.py +7 -3
- vellum/types/test_suite_test_case.py +7 -3
- vellum/types/test_suite_test_case_bulk_operation_request.py +75 -16
- vellum/types/test_suite_test_case_bulk_result.py +74 -16
- vellum/types/test_suite_test_case_create_bulk_operation_request.py +7 -3
- vellum/types/test_suite_test_case_created_bulk_result.py +7 -3
- vellum/types/test_suite_test_case_created_bulk_result_data.py +7 -3
- vellum/types/test_suite_test_case_delete_bulk_operation_data_request.py +7 -3
- vellum/types/test_suite_test_case_delete_bulk_operation_request.py +7 -3
- vellum/types/test_suite_test_case_deleted_bulk_result.py +7 -3
- vellum/types/test_suite_test_case_deleted_bulk_result_data.py +7 -3
- vellum/types/test_suite_test_case_rejected_bulk_result.py +7 -3
- vellum/types/test_suite_test_case_replace_bulk_operation_request.py +7 -3
- vellum/types/test_suite_test_case_replaced_bulk_result.py +7 -3
- vellum/types/test_suite_test_case_replaced_bulk_result_data.py +7 -3
- vellum/types/test_suite_test_case_upsert_bulk_operation_request.py +7 -3
- vellum/types/{execute_workflow_error_response.py → tik_token_tokenizer_config.py} +11 -6
- vellum/types/{generate_error_response.py → tik_token_tokenizer_config_request.py} +11 -6
- vellum/types/token_overlapping_window_chunker_config.py +7 -3
- vellum/types/token_overlapping_window_chunker_config_request.py +7 -3
- vellum/types/token_overlapping_window_chunking.py +7 -3
- vellum/types/token_overlapping_window_chunking_request.py +7 -3
- vellum/types/upload_document_response.py +7 -3
- vellum/types/upsert_test_suite_test_case_request.py +7 -3
- vellum/types/vellum_error.py +7 -3
- vellum/types/vellum_error_request.py +7 -3
- vellum/types/vellum_image.py +7 -3
- vellum/types/vellum_image_request.py +7 -3
- vellum/types/vellum_variable.py +7 -3
- vellum/types/visibility_enum.py +5 -0
- vellum/types/workflow_deployment_read.py +12 -3
- vellum/types/workflow_event_error.py +7 -3
- vellum/types/workflow_execution_actual_chat_history_request.py +7 -3
- vellum/types/workflow_execution_actual_json_request.py +7 -3
- vellum/types/workflow_execution_actual_string_request.py +7 -3
- vellum/types/workflow_execution_node_result_event.py +7 -3
- vellum/types/workflow_execution_workflow_result_event.py +7 -3
- vellum/types/workflow_expand_meta_request.py +7 -3
- vellum/types/workflow_node_result_data.py +189 -45
- vellum/types/workflow_node_result_event.py +101 -20
- vellum/types/workflow_output.py +171 -36
- vellum/types/workflow_output_array.py +7 -3
- vellum/types/workflow_output_chat_history.py +7 -3
- vellum/types/workflow_output_error.py +7 -3
- vellum/types/workflow_output_function_call.py +7 -3
- vellum/types/workflow_output_image.py +7 -3
- vellum/types/workflow_output_json.py +7 -3
- vellum/types/workflow_output_number.py +7 -3
- vellum/types/workflow_output_search_results.py +7 -3
- vellum/types/workflow_output_string.py +7 -3
- vellum/types/workflow_release_tag_read.py +7 -3
- vellum/types/workflow_release_tag_workflow_deployment_history_item.py +7 -3
- vellum/types/workflow_request_chat_history_input_request.py +7 -3
- vellum/types/workflow_request_input_request.py +72 -16
- vellum/types/workflow_request_json_input_request.py +7 -3
- vellum/types/workflow_request_number_input_request.py +7 -3
- vellum/types/workflow_request_string_input_request.py +7 -3
- vellum/types/workflow_result_event.py +7 -3
- vellum/types/workflow_result_event_output_data.py +178 -33
- vellum/types/workflow_result_event_output_data_array.py +7 -3
- vellum/types/workflow_result_event_output_data_chat_history.py +7 -3
- vellum/types/workflow_result_event_output_data_error.py +7 -3
- vellum/types/workflow_result_event_output_data_function_call.py +7 -3
- vellum/types/workflow_result_event_output_data_json.py +7 -3
- vellum/types/workflow_result_event_output_data_number.py +7 -3
- vellum/types/workflow_result_event_output_data_search_results.py +7 -3
- vellum/types/workflow_result_event_output_data_string.py +7 -3
- vellum/types/workflow_stream_event.py +43 -8
- {vellum_ai-0.7.3.dist-info → vellum_ai-0.7.5.dist-info}/METADATA +13 -1
- vellum_ai-0.7.5.dist-info/RECORD +502 -0
- vellum/types/array_enum.py +0 -5
- vellum/types/chat_history_enum.py +0 -5
- vellum/types/create_enum.py +0 -5
- vellum/types/created_enum.py +0 -5
- vellum/types/delete_enum.py +0 -5
- vellum/types/deleted_enum.py +0 -5
- vellum/types/error_enum.py +0 -5
- vellum/types/function_call_enum.py +0 -5
- vellum/types/hkunlp_instructor_xl_enum.py +0 -5
- vellum/types/image_enum.py +0 -5
- vellum/types/initiated_enum.py +0 -5
- vellum/types/intfloat_multilingual_e_5_large_enum.py +0 -5
- vellum/types/json_enum.py +0 -5
- vellum/types/merge_enum.py +0 -5
- vellum/types/metric_enum.py +0 -5
- vellum/types/number_enum.py +0 -5
- vellum/types/pdf_enum.py +0 -5
- vellum/types/reducto_chunker_enum.py +0 -5
- vellum/types/rejected_enum.py +0 -5
- vellum/types/replace_enum.py +0 -5
- vellum/types/replaced_enum.py +0 -5
- vellum/types/search_error_response.py +0 -28
- vellum/types/search_results_enum.py +0 -5
- vellum/types/sentence_chunker_enum.py +0 -5
- vellum/types/sentence_transformers_multi_qa_mpnet_base_cos_v_1_enum.py +0 -5
- vellum/types/sentence_transformers_multi_qa_mpnet_base_dot_v_1_enum.py +0 -5
- vellum/types/streaming_enum.py +0 -5
- vellum/types/string_enum.py +0 -5
- vellum/types/submit_completion_actuals_error_response.py +0 -25
- vellum/types/subworkflow_enum.py +0 -5
- vellum/types/test_suite_run_deployment_release_tag_exec_config_type_enum.py +0 -5
- vellum/types/test_suite_run_external_exec_config_type_enum.py +0 -5
- vellum/types/test_suite_run_metric_error_output_type_enum.py +0 -5
- vellum/types/test_suite_run_metric_number_output_type_enum.py +0 -5
- vellum/types/test_suite_run_metric_string_output_type_enum.py +0 -5
- vellum/types/test_suite_run_workflow_release_tag_exec_config_type_enum.py +0 -5
- vellum/types/text_embedding_3_large_enum.py +0 -5
- vellum/types/text_embedding_3_small_enum.py +0 -5
- vellum/types/text_embedding_ada_002_enum.py +0 -5
- vellum/types/token_overlapping_window_chunker_enum.py +0 -5
- vellum/types/upload_document_error_response.py +0 -25
- vellum/types/upsert_enum.py +0 -5
- vellum_ai-0.7.3.dist-info/RECORD +0 -496
- {vellum_ai-0.7.3.dist-info → vellum_ai-0.7.5.dist-info}/LICENSE +0 -0
- {vellum_ai-0.7.3.dist-info → vellum_ai-0.7.5.dist-info}/WHEEL +0 -0
vellum/core/__init__.py
CHANGED
@@ -6,7 +6,8 @@ from .datetime_utils import serialize_datetime
|
|
6
6
|
from .file import File, convert_file_dict_to_httpx_tuples
|
7
7
|
from .http_client import AsyncHttpClient, HttpClient
|
8
8
|
from .jsonable_encoder import jsonable_encoder
|
9
|
-
from .pydantic_utilities import pydantic_v1
|
9
|
+
from .pydantic_utilities import deep_union_pydantic_dicts, pydantic_v1
|
10
|
+
from .query_encoder import encode_query
|
10
11
|
from .remove_none_from_dict import remove_none_from_dict
|
11
12
|
from .request_options import RequestOptions
|
12
13
|
|
@@ -20,6 +21,8 @@ __all__ = [
|
|
20
21
|
"RequestOptions",
|
21
22
|
"SyncClientWrapper",
|
22
23
|
"convert_file_dict_to_httpx_tuples",
|
24
|
+
"deep_union_pydantic_dicts",
|
25
|
+
"encode_query",
|
23
26
|
"jsonable_encoder",
|
24
27
|
"pydantic_v1",
|
25
28
|
"remove_none_from_dict",
|
vellum/core/client_wrapper.py
CHANGED
@@ -18,7 +18,7 @@ class BaseClientWrapper:
|
|
18
18
|
headers: typing.Dict[str, str] = {
|
19
19
|
"X-Fern-Language": "Python",
|
20
20
|
"X-Fern-SDK-Name": "vellum-ai",
|
21
|
-
"X-Fern-SDK-Version": "0.7.
|
21
|
+
"X-Fern-SDK-Version": "0.7.5",
|
22
22
|
}
|
23
23
|
headers["X_API_KEY"] = self.api_key
|
24
24
|
return headers
|
@@ -40,7 +40,9 @@ class SyncClientWrapper(BaseClientWrapper):
|
|
40
40
|
httpx_client: httpx.Client
|
41
41
|
):
|
42
42
|
super().__init__(api_key=api_key, environment=environment, timeout=timeout)
|
43
|
-
self.httpx_client = HttpClient(
|
43
|
+
self.httpx_client = HttpClient(
|
44
|
+
httpx_client=httpx_client, base_headers=self.get_headers(), base_timeout=self.get_timeout()
|
45
|
+
)
|
44
46
|
|
45
47
|
|
46
48
|
class AsyncClientWrapper(BaseClientWrapper):
|
@@ -53,4 +55,6 @@ class AsyncClientWrapper(BaseClientWrapper):
|
|
53
55
|
httpx_client: httpx.AsyncClient
|
54
56
|
):
|
55
57
|
super().__init__(api_key=api_key, environment=environment, timeout=timeout)
|
56
|
-
self.httpx_client = AsyncHttpClient(
|
58
|
+
self.httpx_client = AsyncHttpClient(
|
59
|
+
httpx_client=httpx_client, base_headers=self.get_headers(), base_timeout=self.get_timeout()
|
60
|
+
)
|
vellum/core/http_client.py
CHANGED
@@ -2,15 +2,22 @@
|
|
2
2
|
|
3
3
|
import asyncio
|
4
4
|
import email.utils
|
5
|
+
import json
|
5
6
|
import re
|
6
7
|
import time
|
7
8
|
import typing
|
9
|
+
import urllib.parse
|
8
10
|
from contextlib import asynccontextmanager, contextmanager
|
9
|
-
from functools import wraps
|
10
11
|
from random import random
|
11
12
|
|
12
13
|
import httpx
|
13
14
|
|
15
|
+
from .file import File, convert_file_dict_to_httpx_tuples
|
16
|
+
from .jsonable_encoder import jsonable_encoder
|
17
|
+
from .query_encoder import encode_query
|
18
|
+
from .remove_none_from_dict import remove_none_from_dict
|
19
|
+
from .request_options import RequestOptions
|
20
|
+
|
14
21
|
INITIAL_RETRY_DELAY_SECONDS = 0.5
|
15
22
|
MAX_RETRY_DELAY_SECONDS = 10
|
16
23
|
MAX_RETRY_DELAY_SECONDS_FROM_HEADER = 30
|
@@ -82,49 +89,387 @@ def _should_retry(response: httpx.Response) -> bool:
|
|
82
89
|
return response.status_code >= 500 or response.status_code in retriable_400s
|
83
90
|
|
84
91
|
|
92
|
+
def remove_omit_from_dict(
|
93
|
+
original: typing.Dict[str, typing.Optional[typing.Any]], omit: typing.Optional[typing.Any]
|
94
|
+
) -> typing.Dict[str, typing.Any]:
|
95
|
+
if omit is None:
|
96
|
+
return original
|
97
|
+
new: typing.Dict[str, typing.Any] = {}
|
98
|
+
for key, value in original.items():
|
99
|
+
if value is not omit:
|
100
|
+
new[key] = value
|
101
|
+
return new
|
102
|
+
|
103
|
+
|
104
|
+
def maybe_filter_request_body(
|
105
|
+
data: typing.Optional[typing.Any],
|
106
|
+
request_options: typing.Optional[RequestOptions],
|
107
|
+
omit: typing.Optional[typing.Any],
|
108
|
+
) -> typing.Optional[typing.Any]:
|
109
|
+
if data is None:
|
110
|
+
return (
|
111
|
+
jsonable_encoder(request_options.get("additional_body_parameters", {})) or {}
|
112
|
+
if request_options is not None
|
113
|
+
else None
|
114
|
+
)
|
115
|
+
elif not isinstance(data, typing.Mapping):
|
116
|
+
data_content = jsonable_encoder(data)
|
117
|
+
else:
|
118
|
+
data_content = {
|
119
|
+
**(jsonable_encoder(remove_omit_from_dict(data, omit))), # type: ignore
|
120
|
+
**(
|
121
|
+
jsonable_encoder(request_options.get("additional_body_parameters", {})) or {}
|
122
|
+
if request_options is not None
|
123
|
+
else {}
|
124
|
+
),
|
125
|
+
}
|
126
|
+
return data_content
|
127
|
+
|
128
|
+
|
129
|
+
# Abstracted out for testing purposes
|
130
|
+
def get_request_body(
|
131
|
+
*,
|
132
|
+
json: typing.Optional[typing.Any],
|
133
|
+
data: typing.Optional[typing.Any],
|
134
|
+
request_options: typing.Optional[RequestOptions],
|
135
|
+
omit: typing.Optional[typing.Any],
|
136
|
+
) -> typing.Tuple[typing.Optional[typing.Any], typing.Optional[typing.Any]]:
|
137
|
+
json_body = None
|
138
|
+
data_body = None
|
139
|
+
if data is not None:
|
140
|
+
data_body = maybe_filter_request_body(data, request_options, omit)
|
141
|
+
else:
|
142
|
+
# If both data and json are None, we send json data in the event extra properties are specified
|
143
|
+
json_body = maybe_filter_request_body(json, request_options, omit)
|
144
|
+
|
145
|
+
return json_body, data_body
|
146
|
+
|
147
|
+
|
85
148
|
class HttpClient:
|
86
|
-
def __init__(
|
149
|
+
def __init__(
|
150
|
+
self,
|
151
|
+
*,
|
152
|
+
httpx_client: httpx.Client,
|
153
|
+
base_timeout: typing.Optional[float],
|
154
|
+
base_headers: typing.Dict[str, str],
|
155
|
+
base_url: typing.Optional[str] = None,
|
156
|
+
):
|
157
|
+
self.base_url = base_url
|
158
|
+
self.base_timeout = base_timeout
|
159
|
+
self.base_headers = base_headers
|
87
160
|
self.httpx_client = httpx_client
|
88
161
|
|
89
|
-
|
90
|
-
|
162
|
+
def get_base_url(self, maybe_base_url: typing.Optional[str]) -> str:
|
163
|
+
base_url = self.base_url if maybe_base_url is None else maybe_base_url
|
164
|
+
if base_url is None:
|
165
|
+
raise ValueError("A base_url is required to make this request, please provide one and try again.")
|
166
|
+
return base_url
|
167
|
+
|
91
168
|
def request(
|
92
|
-
self,
|
169
|
+
self,
|
170
|
+
path: typing.Optional[str] = None,
|
171
|
+
*,
|
172
|
+
method: str,
|
173
|
+
base_url: typing.Optional[str] = None,
|
174
|
+
params: typing.Optional[typing.Dict[str, typing.Any]] = None,
|
175
|
+
json: typing.Optional[typing.Any] = None,
|
176
|
+
data: typing.Optional[typing.Any] = None,
|
177
|
+
content: typing.Optional[typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]]] = None,
|
178
|
+
files: typing.Optional[typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]]] = None,
|
179
|
+
headers: typing.Optional[typing.Dict[str, typing.Any]] = None,
|
180
|
+
request_options: typing.Optional[RequestOptions] = None,
|
181
|
+
retries: int = 0,
|
182
|
+
omit: typing.Optional[typing.Any] = None,
|
93
183
|
) -> httpx.Response:
|
94
|
-
|
184
|
+
base_url = self.get_base_url(base_url)
|
185
|
+
timeout = (
|
186
|
+
request_options.get("timeout_in_seconds")
|
187
|
+
if request_options is not None and request_options.get("timeout_in_seconds") is not None
|
188
|
+
else self.base_timeout
|
189
|
+
)
|
190
|
+
|
191
|
+
json_body, data_body = get_request_body(json=json, data=data, request_options=request_options, omit=omit)
|
192
|
+
|
193
|
+
response = self.httpx_client.request(
|
194
|
+
method=method,
|
195
|
+
url=urllib.parse.urljoin(f"{base_url}/", path),
|
196
|
+
headers=jsonable_encoder(
|
197
|
+
remove_none_from_dict(
|
198
|
+
{
|
199
|
+
**self.base_headers,
|
200
|
+
**(headers if headers is not None else {}),
|
201
|
+
**(request_options.get("additional_headers", {}) or {} if request_options is not None else {}),
|
202
|
+
}
|
203
|
+
)
|
204
|
+
),
|
205
|
+
params=encode_query(
|
206
|
+
jsonable_encoder(
|
207
|
+
remove_none_from_dict(
|
208
|
+
remove_omit_from_dict(
|
209
|
+
{
|
210
|
+
**(params if params is not None else {}),
|
211
|
+
**(
|
212
|
+
request_options.get("additional_query_parameters", {}) or {}
|
213
|
+
if request_options is not None
|
214
|
+
else {}
|
215
|
+
),
|
216
|
+
},
|
217
|
+
omit,
|
218
|
+
)
|
219
|
+
)
|
220
|
+
)
|
221
|
+
),
|
222
|
+
json=json_body,
|
223
|
+
data=data_body,
|
224
|
+
content=content,
|
225
|
+
files=convert_file_dict_to_httpx_tuples(remove_none_from_dict(files)) if files is not None else None,
|
226
|
+
timeout=timeout,
|
227
|
+
)
|
228
|
+
|
229
|
+
max_retries: int = request_options.get("max_retries", 0) if request_options is not None else 0
|
95
230
|
if _should_retry(response=response):
|
96
231
|
if max_retries > retries:
|
97
232
|
time.sleep(_retry_timeout(response=response, retries=retries))
|
98
|
-
return self.request(
|
233
|
+
return self.request(
|
234
|
+
path=path,
|
235
|
+
method=method,
|
236
|
+
base_url=base_url,
|
237
|
+
params=params,
|
238
|
+
json=json,
|
239
|
+
content=content,
|
240
|
+
files=files,
|
241
|
+
headers=headers,
|
242
|
+
request_options=request_options,
|
243
|
+
retries=retries + 1,
|
244
|
+
omit=omit,
|
245
|
+
)
|
246
|
+
|
99
247
|
return response
|
100
248
|
|
101
|
-
@wraps(httpx.Client.stream)
|
102
249
|
@contextmanager
|
103
|
-
def stream(
|
104
|
-
|
250
|
+
def stream(
|
251
|
+
self,
|
252
|
+
path: typing.Optional[str] = None,
|
253
|
+
*,
|
254
|
+
method: str,
|
255
|
+
base_url: typing.Optional[str] = None,
|
256
|
+
params: typing.Optional[typing.Dict[str, typing.Any]] = None,
|
257
|
+
json: typing.Optional[typing.Any] = None,
|
258
|
+
data: typing.Optional[typing.Any] = None,
|
259
|
+
content: typing.Optional[typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]]] = None,
|
260
|
+
files: typing.Optional[typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]]] = None,
|
261
|
+
headers: typing.Optional[typing.Dict[str, typing.Any]] = None,
|
262
|
+
request_options: typing.Optional[RequestOptions] = None,
|
263
|
+
retries: int = 0,
|
264
|
+
omit: typing.Optional[typing.Any] = None,
|
265
|
+
) -> typing.Iterator[httpx.Response]:
|
266
|
+
base_url = self.get_base_url(base_url)
|
267
|
+
timeout = (
|
268
|
+
request_options.get("timeout_in_seconds")
|
269
|
+
if request_options is not None and request_options.get("timeout_in_seconds") is not None
|
270
|
+
else self.base_timeout
|
271
|
+
)
|
272
|
+
|
273
|
+
json_body, data_body = get_request_body(json=json, data=data, request_options=request_options, omit=omit)
|
274
|
+
|
275
|
+
with self.httpx_client.stream(
|
276
|
+
method=method,
|
277
|
+
url=urllib.parse.urljoin(f"{base_url}/", path),
|
278
|
+
headers=jsonable_encoder(
|
279
|
+
remove_none_from_dict(
|
280
|
+
{
|
281
|
+
**self.base_headers,
|
282
|
+
**(headers if headers is not None else {}),
|
283
|
+
**(request_options.get("additional_headers", {}) if request_options is not None else {}),
|
284
|
+
}
|
285
|
+
)
|
286
|
+
),
|
287
|
+
params=encode_query(
|
288
|
+
jsonable_encoder(
|
289
|
+
remove_none_from_dict(
|
290
|
+
remove_omit_from_dict(
|
291
|
+
{
|
292
|
+
**(params if params is not None else {}),
|
293
|
+
**(
|
294
|
+
request_options.get("additional_query_parameters", {})
|
295
|
+
if request_options is not None
|
296
|
+
else {}
|
297
|
+
),
|
298
|
+
},
|
299
|
+
omit,
|
300
|
+
)
|
301
|
+
)
|
302
|
+
)
|
303
|
+
),
|
304
|
+
json=json_body,
|
305
|
+
data=data_body,
|
306
|
+
content=content,
|
307
|
+
files=convert_file_dict_to_httpx_tuples(remove_none_from_dict(files)) if files is not None else None,
|
308
|
+
timeout=timeout,
|
309
|
+
) as stream:
|
105
310
|
yield stream
|
106
311
|
|
107
312
|
|
108
313
|
class AsyncHttpClient:
|
109
|
-
def __init__(
|
314
|
+
def __init__(
|
315
|
+
self,
|
316
|
+
*,
|
317
|
+
httpx_client: httpx.AsyncClient,
|
318
|
+
base_timeout: typing.Optional[float],
|
319
|
+
base_headers: typing.Dict[str, str],
|
320
|
+
base_url: typing.Optional[str] = None,
|
321
|
+
):
|
322
|
+
self.base_url = base_url
|
323
|
+
self.base_timeout = base_timeout
|
324
|
+
self.base_headers = base_headers
|
110
325
|
self.httpx_client = httpx_client
|
111
326
|
|
112
|
-
|
113
|
-
|
327
|
+
def get_base_url(self, maybe_base_url: typing.Optional[str]) -> str:
|
328
|
+
base_url = self.base_url if maybe_base_url is None else maybe_base_url
|
329
|
+
if base_url is None:
|
330
|
+
raise ValueError("A base_url is required to make this request, please provide one and try again.")
|
331
|
+
return base_url
|
332
|
+
|
114
333
|
async def request(
|
115
|
-
self,
|
334
|
+
self,
|
335
|
+
path: typing.Optional[str] = None,
|
336
|
+
*,
|
337
|
+
method: str,
|
338
|
+
base_url: typing.Optional[str] = None,
|
339
|
+
params: typing.Optional[typing.Dict[str, typing.Any]] = None,
|
340
|
+
json: typing.Optional[typing.Any] = None,
|
341
|
+
data: typing.Optional[typing.Any] = None,
|
342
|
+
content: typing.Optional[typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]]] = None,
|
343
|
+
files: typing.Optional[typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]]] = None,
|
344
|
+
headers: typing.Optional[typing.Dict[str, typing.Any]] = None,
|
345
|
+
request_options: typing.Optional[RequestOptions] = None,
|
346
|
+
retries: int = 0,
|
347
|
+
omit: typing.Optional[typing.Any] = None,
|
116
348
|
) -> httpx.Response:
|
117
|
-
|
349
|
+
base_url = self.get_base_url(base_url)
|
350
|
+
timeout = (
|
351
|
+
request_options.get("timeout_in_seconds")
|
352
|
+
if request_options is not None and request_options.get("timeout_in_seconds") is not None
|
353
|
+
else self.base_timeout
|
354
|
+
)
|
355
|
+
|
356
|
+
json_body, data_body = get_request_body(json=json, data=data, request_options=request_options, omit=omit)
|
357
|
+
|
358
|
+
# Add the input to each of these and do None-safety checks
|
359
|
+
response = await self.httpx_client.request(
|
360
|
+
method=method,
|
361
|
+
url=urllib.parse.urljoin(f"{base_url}/", path),
|
362
|
+
headers=jsonable_encoder(
|
363
|
+
remove_none_from_dict(
|
364
|
+
{
|
365
|
+
**self.base_headers,
|
366
|
+
**(headers if headers is not None else {}),
|
367
|
+
**(request_options.get("additional_headers", {}) or {} if request_options is not None else {}),
|
368
|
+
}
|
369
|
+
)
|
370
|
+
),
|
371
|
+
params=encode_query(
|
372
|
+
jsonable_encoder(
|
373
|
+
remove_none_from_dict(
|
374
|
+
remove_omit_from_dict(
|
375
|
+
{
|
376
|
+
**(params if params is not None else {}),
|
377
|
+
**(
|
378
|
+
request_options.get("additional_query_parameters", {}) or {}
|
379
|
+
if request_options is not None
|
380
|
+
else {}
|
381
|
+
),
|
382
|
+
},
|
383
|
+
omit,
|
384
|
+
)
|
385
|
+
)
|
386
|
+
)
|
387
|
+
),
|
388
|
+
json=json_body,
|
389
|
+
data=data_body,
|
390
|
+
content=content,
|
391
|
+
files=convert_file_dict_to_httpx_tuples(remove_none_from_dict(files)) if files is not None else None,
|
392
|
+
timeout=timeout,
|
393
|
+
)
|
394
|
+
|
395
|
+
max_retries: int = request_options.get("max_retries", 0) if request_options is not None else 0
|
118
396
|
if _should_retry(response=response):
|
119
397
|
if max_retries > retries:
|
120
398
|
await asyncio.sleep(_retry_timeout(response=response, retries=retries))
|
121
|
-
return await self.request(
|
399
|
+
return await self.request(
|
400
|
+
path=path,
|
401
|
+
method=method,
|
402
|
+
base_url=base_url,
|
403
|
+
params=params,
|
404
|
+
json=json,
|
405
|
+
content=content,
|
406
|
+
files=files,
|
407
|
+
headers=headers,
|
408
|
+
request_options=request_options,
|
409
|
+
retries=retries + 1,
|
410
|
+
omit=omit,
|
411
|
+
)
|
122
412
|
return response
|
123
413
|
|
124
|
-
@wraps(httpx.AsyncClient.stream)
|
125
414
|
@asynccontextmanager
|
126
415
|
async def stream(
|
127
|
-
self,
|
128
|
-
|
129
|
-
|
416
|
+
self,
|
417
|
+
path: typing.Optional[str] = None,
|
418
|
+
*,
|
419
|
+
method: str,
|
420
|
+
base_url: typing.Optional[str] = None,
|
421
|
+
params: typing.Optional[typing.Dict[str, typing.Any]] = None,
|
422
|
+
json: typing.Optional[typing.Any] = None,
|
423
|
+
data: typing.Optional[typing.Any] = None,
|
424
|
+
content: typing.Optional[typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]]] = None,
|
425
|
+
files: typing.Optional[typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]]] = None,
|
426
|
+
headers: typing.Optional[typing.Dict[str, typing.Any]] = None,
|
427
|
+
request_options: typing.Optional[RequestOptions] = None,
|
428
|
+
retries: int = 0,
|
429
|
+
omit: typing.Optional[typing.Any] = None,
|
430
|
+
) -> typing.AsyncIterator[httpx.Response]:
|
431
|
+
base_url = self.get_base_url(base_url)
|
432
|
+
timeout = (
|
433
|
+
request_options.get("timeout_in_seconds")
|
434
|
+
if request_options is not None and request_options.get("timeout_in_seconds") is not None
|
435
|
+
else self.base_timeout
|
436
|
+
)
|
437
|
+
|
438
|
+
json_body, data_body = get_request_body(json=json, data=data, request_options=request_options, omit=omit)
|
439
|
+
|
440
|
+
async with self.httpx_client.stream(
|
441
|
+
method=method,
|
442
|
+
url=urllib.parse.urljoin(f"{base_url}/", path),
|
443
|
+
headers=jsonable_encoder(
|
444
|
+
remove_none_from_dict(
|
445
|
+
{
|
446
|
+
**self.base_headers,
|
447
|
+
**(headers if headers is not None else {}),
|
448
|
+
**(request_options.get("additional_headers", {}) if request_options is not None else {}),
|
449
|
+
}
|
450
|
+
)
|
451
|
+
),
|
452
|
+
params=encode_query(
|
453
|
+
jsonable_encoder(
|
454
|
+
remove_none_from_dict(
|
455
|
+
remove_omit_from_dict(
|
456
|
+
{
|
457
|
+
**(params if params is not None else {}),
|
458
|
+
**(
|
459
|
+
request_options.get("additional_query_parameters", {})
|
460
|
+
if request_options is not None
|
461
|
+
else {}
|
462
|
+
),
|
463
|
+
},
|
464
|
+
omit=omit,
|
465
|
+
)
|
466
|
+
)
|
467
|
+
)
|
468
|
+
),
|
469
|
+
json=json_body,
|
470
|
+
data=data_body,
|
471
|
+
content=content,
|
472
|
+
files=convert_file_dict_to_httpx_tuples(remove_none_from_dict(files)) if files is not None else None,
|
473
|
+
timeout=timeout,
|
474
|
+
) as stream:
|
130
475
|
yield stream
|
vellum/core/jsonable_encoder.py
CHANGED
@@ -8,6 +8,7 @@ Taken from FastAPI, and made a bit simpler
|
|
8
8
|
https://github.com/tiangolo/fastapi/blob/master/fastapi/encoders.py
|
9
9
|
"""
|
10
10
|
|
11
|
+
import base64
|
11
12
|
import dataclasses
|
12
13
|
import datetime as dt
|
13
14
|
from collections import defaultdict
|
@@ -55,6 +56,8 @@ def jsonable_encoder(obj: Any, custom_encoder: Optional[Dict[Any, Callable[[Any]
|
|
55
56
|
if dataclasses.is_dataclass(obj):
|
56
57
|
obj_dict = dataclasses.asdict(obj)
|
57
58
|
return jsonable_encoder(obj_dict, custom_encoder=custom_encoder)
|
59
|
+
if isinstance(obj, bytes):
|
60
|
+
return base64.b64encode(obj).decode("utf-8")
|
58
61
|
if isinstance(obj, Enum):
|
59
62
|
return obj.value
|
60
63
|
if isinstance(obj, PurePath):
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# This file was auto-generated by Fern from our API Definition.
|
2
2
|
|
3
|
+
import typing
|
4
|
+
|
3
5
|
import pydantic
|
4
6
|
|
5
7
|
IS_PYDANTIC_V2 = pydantic.VERSION.startswith("2.")
|
@@ -9,4 +11,18 @@ if IS_PYDANTIC_V2:
|
|
9
11
|
else:
|
10
12
|
import pydantic as pydantic_v1 # type: ignore # nopycln: import
|
11
13
|
|
14
|
+
|
15
|
+
def deep_union_pydantic_dicts(
|
16
|
+
source: typing.Dict[str, typing.Any], destination: typing.Dict[str, typing.Any]
|
17
|
+
) -> typing.Dict[str, typing.Any]:
|
18
|
+
for key, value in source.items():
|
19
|
+
if isinstance(value, dict):
|
20
|
+
node = destination.setdefault(key, {})
|
21
|
+
deep_union_pydantic_dicts(value, node)
|
22
|
+
else:
|
23
|
+
destination[key] = value
|
24
|
+
|
25
|
+
return destination
|
26
|
+
|
27
|
+
|
12
28
|
__all__ = ["pydantic_v1"]
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# This file was auto-generated by Fern from our API Definition.
|
2
|
+
|
3
|
+
from collections import ChainMap
|
4
|
+
from typing import Any, Dict, Optional
|
5
|
+
|
6
|
+
from .pydantic_utilities import pydantic_v1
|
7
|
+
|
8
|
+
|
9
|
+
# Flattens dicts to be of the form {"key[subkey][subkey2]": value} where value is not a dict
|
10
|
+
def traverse_query_dict(dict_flat: Dict[str, Any], key_prefix: Optional[str] = None) -> Dict[str, Any]:
|
11
|
+
result = {}
|
12
|
+
for k, v in dict_flat.items():
|
13
|
+
key = f"{key_prefix}[{k}]" if key_prefix is not None else k
|
14
|
+
if isinstance(v, dict):
|
15
|
+
result.update(traverse_query_dict(v, key))
|
16
|
+
else:
|
17
|
+
result[key] = v
|
18
|
+
return result
|
19
|
+
|
20
|
+
|
21
|
+
def single_query_encoder(query_key: str, query_value: Any) -> Dict[str, Any]:
|
22
|
+
if isinstance(query_value, pydantic_v1.BaseModel) or isinstance(query_value, dict):
|
23
|
+
if isinstance(query_value, pydantic_v1.BaseModel):
|
24
|
+
obj_dict = query_value.dict(by_alias=True)
|
25
|
+
else:
|
26
|
+
obj_dict = query_value
|
27
|
+
return traverse_query_dict(obj_dict, query_key)
|
28
|
+
|
29
|
+
return {query_key: query_value}
|
30
|
+
|
31
|
+
|
32
|
+
def encode_query(query: Optional[Dict[str, Any]]) -> Optional[Dict[str, Any]]:
|
33
|
+
return dict(ChainMap(*[single_query_encoder(k, v) for k, v in query.items()])) if query is not None else None
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# This file was auto-generated by Fern from our API Definition.
|
2
2
|
|
3
|
-
from typing import Any, Dict, Optional
|
3
|
+
from typing import Any, Dict, Mapping, Optional
|
4
4
|
|
5
5
|
|
6
|
-
def remove_none_from_dict(original:
|
6
|
+
def remove_none_from_dict(original: Mapping[str, Optional[Any]]) -> Dict[str, Any]:
|
7
7
|
new: Dict[str, Any] = {}
|
8
8
|
for key, value in original.items():
|
9
9
|
if value is not None:
|
vellum/core/request_options.py
CHANGED
@@ -5,10 +5,10 @@ import typing
|
|
5
5
|
try:
|
6
6
|
from typing import NotRequired # type: ignore
|
7
7
|
except ImportError:
|
8
|
-
from typing_extensions import NotRequired
|
8
|
+
from typing_extensions import NotRequired
|
9
9
|
|
10
10
|
|
11
|
-
class RequestOptions(typing.TypedDict):
|
11
|
+
class RequestOptions(typing.TypedDict, total=False):
|
12
12
|
"""
|
13
13
|
Additional options for request-specific configuration when calling APIs via the SDK.
|
14
14
|
This is used primarily as an optional final parameter for service functions.
|
vellum/resources/__init__.py
CHANGED
@@ -5,6 +5,7 @@ from . import (
|
|
5
5
|
document_indexes,
|
6
6
|
documents,
|
7
7
|
folder_entities,
|
8
|
+
ml_models,
|
8
9
|
sandboxes,
|
9
10
|
test_suite_runs,
|
10
11
|
test_suites,
|
@@ -23,6 +24,7 @@ __all__ = [
|
|
23
24
|
"document_indexes",
|
24
25
|
"documents",
|
25
26
|
"folder_entities",
|
27
|
+
"ml_models",
|
26
28
|
"sandboxes",
|
27
29
|
"test_suite_runs",
|
28
30
|
"test_suites",
|