From 0676540b8fd3eae416ee97928a7354a08e5441a5 Mon Sep 17 00:00:00 2001 From: Ikko Eltociear Ashimine Date: Sun, 10 Sep 2023 22:51:55 +0900 Subject: [PATCH 1/8] fix typo in event_stream.py (#363) # Description splited -> splitted # All Promptflow Contribution checklist: - [x] **The pull request does not introduce [breaking changes]** - [ ] **CHANGELOG is updated for new features, bug fixes or other significant changes.** - [x] **I have read the [contribution guidelines](../CONTRIBUTING.md).** ## General Guidelines and Best Practices - [x] Title of the pull request is clear and informative. - [x] There are a small number of commits, each of which have an informative message. This means that previously merged commits do not appear in the history of the PR. For more information on cleaning up the commits in your PR, [see this page](https://github.com/Azure/azure-powershell/blob/master/documentation/development-docs/cleaning-up-commits.md). ### Testing Guidelines - [ ] Pull request includes test coverage for the included changes. --- .../how-to-enable-streaming-mode/scripts/event_stream.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/media/how-to-guides/how-to-enable-streaming-mode/scripts/event_stream.py b/docs/media/how-to-guides/how-to-enable-streaming-mode/scripts/event_stream.py index 5f9b3866a39..cfa45ae6198 100644 --- a/docs/media/how-to-guides/how-to-enable-streaming-mode/scripts/event_stream.py +++ b/docs/media/how-to-guides/how-to-enable-streaming-mode/scripts/event_stream.py @@ -44,7 +44,7 @@ def append_line(self, line): parts = line.split(':', maxsplit=1) if len(parts) < 2: - raise ValueError("Bad format: Each line must could be splited into two parts by ':'.") + raise ValueError("Bad format: Each line must could be splitted into two parts by ':'.") prefix = parts[0] data = parts[1].strip() From 53d1a36d88f2a0865bdda403c281e12e37428d42 Mon Sep 17 00:00:00 2001 From: eniac871 Date: Wed, 13 Sep 2023 09:09:32 +0800 Subject: [PATCH 2/8] fix a few typo identify by GPT (#364) # Description Please add an informative description that covers that changes made by the pull request and link all relevant issues. # All Promptflow Contribution checklist: - [ ] **The pull request does not introduce [breaking changes]** - [ ] **CHANGELOG is updated for new features, bug fixes or other significant changes.** - [ ] **I have read the [contribution guidelines](../CONTRIBUTING.md).** ## General Guidelines and Best Practices - [ ] Title of the pull request is clear and informative. - [ ] There are a small number of commits, each of which have an informative message. This means that previously merged commits do not appear in the history of the PR. For more information on cleaning up the commits in your PR, [see this page](https://github.com/Azure/azure-powershell/blob/master/documentation/development-docs/cleaning-up-commits.md). ### Testing Guidelines - [ ] Pull request includes test coverage for the included changes. Co-authored-by: Anthony Hu --- examples/flows/chat/chat-with-wikipedia/get_wiki_url.py | 2 +- examples/flows/standard/basic/hello.py | 2 +- examples/flows/standard/web-classification/convert_to_dict.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/flows/chat/chat-with-wikipedia/get_wiki_url.py b/examples/flows/chat/chat-with-wikipedia/get_wiki_url.py index bc4578f1b21..e371fea6d17 100644 --- a/examples/flows/chat/chat-with-wikipedia/get_wiki_url.py +++ b/examples/flows/chat/chat-with-wikipedia/get_wiki_url.py @@ -35,7 +35,7 @@ def get_wiki_url(entity: str, count=2): if mw_divs: # mismatch result_titles = [decode_str(div.get_text().strip()) for div in mw_divs] result_titles = [remove_nested_parentheses(result_title) for result_title in result_titles] - print(f"Could not find {entity}. Similar ententity: {result_titles[:count]}.") + print(f"Could not find {entity}. Similar entity: {result_titles[:count]}.") url_list.extend( [f"https://en.wikipedia.org/w/index.php?search={result_title}" for result_title in result_titles] ) diff --git a/examples/flows/standard/basic/hello.py b/examples/flows/standard/basic/hello.py index 95cb1bc94e6..035df3ac801 100644 --- a/examples/flows/standard/basic/hello.py +++ b/examples/flows/standard/basic/hello.py @@ -38,7 +38,7 @@ def my_python_tool( load_dotenv() if "AZURE_OPENAI_API_KEY" not in os.environ: - raise Exception("Please sepecify environment variables: AZURE_OPENAI_API_KEY") + raise Exception("Please specify environment variables: AZURE_OPENAI_API_KEY") conn = dict( api_key=os.environ["AZURE_OPENAI_API_KEY"], diff --git a/examples/flows/standard/web-classification/convert_to_dict.py b/examples/flows/standard/web-classification/convert_to_dict.py index 3b287df5c65..8e9490b801a 100644 --- a/examples/flows/standard/web-classification/convert_to_dict.py +++ b/examples/flows/standard/web-classification/convert_to_dict.py @@ -8,5 +8,5 @@ def convert_to_dict(input_str: str): try: return json.loads(input_str) except Exception as e: - print("input is not valid, error: {}".format(e)) + print("The input is not valid, error: {}".format(e)) return {"category": "None", "evidence": "None"} From 2f87e584f2ab1a24f05cf75b8d779d8ff212e689 Mon Sep 17 00:00:00 2001 From: Zhengfei Wang <38847871+zhengfeiwang@users.noreply.github.com> Date: Wed, 13 Sep 2023 10:22:07 +0800 Subject: [PATCH 3/8] [promptflow][SDK/CLI] Add create_time in contract with visualize (#377) # Description Include `create_time` in contract with visualize. ![image](https://github.com/microsoft/promptflow/assets/38847871/8cb622e5-76ee-4035-af69-d56571103f7b) # All Promptflow Contribution checklist: - [x] **The pull request does not introduce [breaking changes]** - [ ] **CHANGELOG is updated for new features, bug fixes or other significant changes.** - [x] **I have read the [contribution guidelines](../CONTRIBUTING.md).** ## General Guidelines and Best Practices - [x] Title of the pull request is clear and informative. - [ ] There are a small number of commits, each of which have an informative message. This means that previously merged commits do not appear in the history of the PR. For more information on cleaning up the commits in your PR, [see this page](https://github.com/Azure/azure-powershell/blob/master/documentation/development-docs/cleaning-up-commits.md). ### Testing Guidelines - [ ] Pull request includes test coverage for the included changes. --- src/promptflow/promptflow/_sdk/operations/_run_operations.py | 1 + src/promptflow/promptflow/contracts/_run_management.py | 1 + .../tests/sdk_cli_azure_test/e2etests/test_run_operations.py | 1 + 3 files changed, 3 insertions(+) diff --git a/src/promptflow/promptflow/_sdk/operations/_run_operations.py b/src/promptflow/promptflow/_sdk/operations/_run_operations.py index c06811a6b12..b18758e16ad 100644 --- a/src/promptflow/promptflow/_sdk/operations/_run_operations.py +++ b/src/promptflow/promptflow/_sdk/operations/_run_operations.py @@ -232,6 +232,7 @@ def _visualize(self, runs: List[Run], html_path: Optional[str] = None) -> None: metadata = RunMetadata( name=run.name, display_name=run.display_name, + create_time=run.created_on, tags=run.tags, lineage=run.run, metrics=self.get_metrics(name=run.name), diff --git a/src/promptflow/promptflow/contracts/_run_management.py b/src/promptflow/promptflow/contracts/_run_management.py index 558570660a0..d2d974cffc5 100644 --- a/src/promptflow/promptflow/contracts/_run_management.py +++ b/src/promptflow/promptflow/contracts/_run_management.py @@ -19,6 +19,7 @@ class RunDetail: class RunMetadata: name: str display_name: str + create_time: str tags: Optional[List[Dict[str, str]]] lineage: Optional[str] metrics: Optional[Dict[str, Any]] diff --git a/src/promptflow/tests/sdk_cli_azure_test/e2etests/test_run_operations.py b/src/promptflow/tests/sdk_cli_azure_test/e2etests/test_run_operations.py index fa98392095c..75f17d69116 100644 --- a/src/promptflow/tests/sdk_cli_azure_test/e2etests/test_run_operations.py +++ b/src/promptflow/tests/sdk_cli_azure_test/e2etests/test_run_operations.py @@ -543,6 +543,7 @@ def submit(*args, **kwargs): data=f"{DATAS_DIR}/env_var_names.jsonl", ) + @pytest.mark.skip(reason="temporarily disable this for service-side error.") def test_automatic_runtime_creation_failure(self, pf): with pytest.raises(FlowRequestException) as e: From f453846014908c93ccc572f1f4502d308de4a88d Mon Sep 17 00:00:00 2001 From: chw-microsoft <95913588+chw-microsoft@users.noreply.github.com> Date: Wed, 13 Sep 2023 19:53:17 +0800 Subject: [PATCH 4/8] Refine error message body for flow_validator.py (#322) # Description Please add an informative description that covers that changes made by the pull request and link all relevant issues. # All Promptflow Contribution checklist: - [x] **The pull request does not introduce [breaking changes]** - [x] **CHANGELOG is updated for new features, bug fixes or other significant changes.** - [ ] **I have read the [contribution guidelines](../CONTRIBUTING.md).** ## General Guidelines and Best Practices - [ ] Title of the pull request is clear and informative. - [ ] There are a small number of commits, each of which have an informative message. This means that previously merged commits do not appear in the history of the PR. For more information on cleaning up the commits in your PR, [see this page](https://github.com/Azure/azure-powershell/blob/master/documentation/development-docs/cleaning-up-commits.md). ### Testing Guidelines - [ ] Pull request includes test coverage for the included changes. --- .../promptflow/executor/flow_executor.py | 2 +- .../promptflow/executor/flow_validator.py | 123 ++++++++------ .../e2etests/test_executor_validation.py | 154 ++++++++++++++++-- .../unittests/executor/test_flow_validator.py | 24 ++- 4 files changed, 226 insertions(+), 77 deletions(-) diff --git a/src/promptflow/promptflow/executor/flow_executor.py b/src/promptflow/promptflow/executor/flow_executor.py index 6d2d992e389..c5875650877 100644 --- a/src/promptflow/promptflow/executor/flow_executor.py +++ b/src/promptflow/promptflow/executor/flow_executor.py @@ -741,7 +741,7 @@ def _extract_outputs(self, nodes_outputs, bypassed_nodes, flow_inputs): if not node: raise OutputReferenceNotExist( message_format=( - "Flow is defined incorrectly. The node '{node_name}' " + "The output '{output_name}' for flow is incorrect. The node '{node_name}' " "referenced by the output '{output_name}' can not found in flow. " "Please rectify the error in your flow and try again." ), diff --git a/src/promptflow/promptflow/executor/flow_validator.py b/src/promptflow/promptflow/executor/flow_validator.py index 9ef63b9e4f4..05abe4c4b18 100644 --- a/src/promptflow/promptflow/executor/flow_validator.py +++ b/src/promptflow/promptflow/executor/flow_validator.py @@ -33,11 +33,14 @@ def _ensure_nodes_order(flow: Flow): if i.value_type != InputValueType.NODE_REFERENCE: continue if i.value not in dependencies: - msg = ( - f"Node '{n.name}' references a non-existent node '{i.value}' in your flow. " - f"Please review your flow to ensure that the node name is accurately specified." + msg_format = ( + "Invalid node definitions found in the flow graph. Node '{node_name}' references " + "a non-existent node '{reference_node_name}' in your flow. Please review your flow to " + "ensure that the node name is accurately specified." + ) + raise NodeReferenceNotFound( + message_format=msg_format, node_name=n.name, reference_node_name=i.value ) - raise NodeReferenceNotFound(message=msg) dependencies[n.name].add(i.value) sorted_nodes = [] picked = set() @@ -50,9 +53,12 @@ def _ensure_nodes_order(flow: Flow): # Figure out the nodes names with circular dependency problem alphabetically remaining_nodes = sorted(list(set(dependencies.keys()) - picked)) raise NodeCircularDependency( - message=f"Node circular dependency has been detected among the nodes in your flow. " - f"Kindly review the reference relationships for the nodes {remaining_nodes} " - f"and resolve the circular reference issue in the flow." + message_format=( + "Invalid node definitions found in the flow graph. Node circular dependency has been detected " + "among the nodes in your flow. Kindly review the reference relationships for the nodes " + "{remaining_nodes} and resolve the circular reference issue in the flow." + ), + remaining_nodes=remaining_nodes, ) sorted_nodes.append(node_to_pick) picked.add(node_to_pick.name) @@ -73,9 +79,12 @@ def _validate_nodes_topology(flow: Flow) -> Flow: for node in flow.nodes: if node.name in node_names: raise DuplicateNodeName( - message=f"Node with name '{node.name}' appears more than once in the node definitions in your " - f"flow, which is not allowed. To address this issue, please review your " - f"flow and either rename or remove nodes with identical names.", + message_format=( + "Invalid node definitions found in the flow graph. Node with name '{node_name}' appears " + "more than once in the node definitions in your flow, which is not allowed. To address " + "this issue, please review your flow and either rename or remove nodes with identical names." + ), + node_name=node.name, ) node_names.add(node.name) for node in flow.nodes: @@ -83,13 +92,15 @@ def _validate_nodes_topology(flow: Flow) -> Flow: if v.value_type != InputValueType.FLOW_INPUT: continue if v.value not in flow.inputs: - msg = ( - f"Node '{node.name}' references flow input '{v.value}' which is not defined in your " - f"flow. To resolve this issue, please review your flow, " - f"ensuring that you either add the missing flow inputs or adjust node reference " - f"to the correct flow input." + msg_format = ( + "Invalid node definitions found in the flow graph. Node '{node_name}' references flow input " + "'{flow_input_name}' which is not defined in your flow. To resolve this issue, " + "please review your flow, ensuring that you either add the missing flow inputs " + "or adjust node reference to the correct flow input." + ) + raise InputReferenceNotFound( + message_format=msg_format, node_name=node.name, flow_input_name=v.value ) - raise InputReferenceNotFound(message=msg) return FlowValidator._ensure_nodes_order(flow) @staticmethod @@ -107,11 +118,14 @@ def resolve_flow_inputs_type(flow: Flow, inputs: Mapping[str, Any], idx: Optiona updated_inputs[k] = v.type.parse(inputs[k]) except Exception as e: line_info = "" if idx is None else f"in line {idx} of input data" - msg = ( - f"The value '{inputs[k]}' for flow input '{k}' {line_info} does not match the expected type " - f"'{v.type}'. Please review the input data or adjust the input type of '{k}' in your flow." + msg_format = ( + "The input for flow is incorrect. The value for flow input '{flow_input_name}' {line_info} " + "does not match the expected type '{expected_type}'. Please change flow input type " + "or adjust the input value in your input data." ) - raise InputTypeError(message=msg) from e + raise InputTypeError( + message_format=msg_format, flow_input_name=k, line_info=line_info, expected_type=v.type + ) from e return updated_inputs @staticmethod @@ -125,11 +139,12 @@ def ensure_flow_inputs_type(flow: Flow, inputs: Mapping[str, Any], idx: Optional for k, v in flow.inputs.items(): if k not in inputs: line_info = "in input data" if idx is None else f"in line {idx} of input data" - msg = ( - f"The value for flow input '{k}' is not provided {line_info}. " - f"Please review your input data or remove this input in your flow if it's no longer needed." + msg_format = ( + "The input for flow is incorrect. The value for flow input '{input_name}' is not " + "provided {line_info}. Please review your input data or remove this input in your flow " + "if it's no longer needed." ) - raise InputNotFound(message=msg) + raise InputNotFound(message_format=msg_format, input_name=k, line_info=line_info) return FlowValidator.resolve_flow_inputs_type(flow, inputs, idx) @staticmethod @@ -145,23 +160,36 @@ def convert_flow_inputs_for_node(flow: Flow, node: Node, inputs: Mapping[str, An for k, v in node.inputs.items(): if v.value_type == InputValueType.FLOW_INPUT: if v.value not in flow.inputs: - flow_input_keys = ", ".join(flow.inputs.keys()) if flow.inputs is not None else None raise InputNotFound( - message=f"Node input {k} is not found in flow input '{flow_input_keys}' for node" + message_format=( + "The input for node is incorrect. Node input '{node_input_name}' is not found " + "from flow inputs of node '{node_name}'. Please review the node definition in your flow." + ), + node_input_name=v.value, + node_name=node.name, ) if v.value not in inputs: - input_keys = ", ".join(inputs.keys()) raise InputNotFound( - message=f"Node input {k} is not found in input data with keys of '{input_keys}' for node" + message_format=( + "The input for node is incorrect. Node input '{node_input_name}' is not found " + "in input data for node '{node_name}'. Please verify the inputs data for the node." + ), + node_input_name=v.value, + node_name=node.name, ) try: updated_inputs[v.value] = flow.inputs[v.value].type.parse(inputs[v.value]) except Exception as e: - msg = ( - f"Input '{k}' for node '{node.name}' of value '{inputs[v.value]}' " - f"is not type '{flow.inputs[v.value].type}'." + msg_format = ( + "The input for node is incorrect. Value for input '{input_name}' of node '{node_name}' " + "is not type '{expected_type}'. Please review and rectify the input data." ) - raise InputTypeError(message=msg) from e + raise InputTypeError( + message_format=msg_format, + input_name=k, + node_name=node.name, + expected_type=flow.inputs[v.value].type, + ) from e return updated_inputs @staticmethod @@ -169,27 +197,30 @@ def _ensure_outputs_valid(flow: Flow): updated_outputs = {} for k, v in flow.outputs.items(): if v.reference.value_type == InputValueType.LITERAL and v.reference.value == "": - msg = ( - f"The reference is not specified for the output '{k}' in the flow. " - f"To rectify this, ensure that you accurately specify the reference in the flow." + msg_format = ( + "The output '{output_name}' for flow is incorrect. The reference is not specified for " + "the output '{output_name}' in the flow. To rectify this, " + "ensure that you accurately specify the reference in the flow." ) - raise EmptyOutputReference(message=msg) + raise EmptyOutputReference(message_format=msg_format, output_name=k) if v.reference.value_type == InputValueType.FLOW_INPUT and v.reference.value not in flow.inputs: - msg = ( - f"The output '{k}' references non-existent flow input '{v.reference.value}' in your flow. " - f"please carefully review your flow " - f"and correct the reference definition for the output in question." + msg_format = ( + "The output '{output_name}' for flow is incorrect. The output '{output_name}' references " + "non-existent flow input '{flow_input_name}' in your flow. Please carefully review your flow and " + "correct the reference definition for the output in question." + ) + raise OutputReferenceNotFound( + message_format=msg_format, output_name=k, flow_input_name=v.reference.value ) - raise OutputReferenceNotFound(message=msg) if v.reference.value_type == InputValueType.NODE_REFERENCE: node = flow.get_node(v.reference.value) if node is None: - msg = ( - f"The output '{k}' references non-existent node '{v.reference.value}' in your flow. " - f"To resolve this issue, please carefully review your flow " - f"and correct the reference definition for the output in question." + msg_format = ( + "The output '{output_name}' for flow is incorrect. The output '{output_name}' references " + "non-existent node '{node_name}' in your flow. To resolve this issue, please carefully review " + "your flow and correct the reference definition for the output in question." ) - raise OutputReferenceNotFound(message=msg) + raise OutputReferenceNotFound(message_format=msg_format, output_name=k, node_name=v.reference.value) if node.aggregation: msg = f"Output '{k}' references a reduce node '{v.reference.value}', will not take effect." logger.warning(msg) diff --git a/src/promptflow/tests/executor/e2etests/test_executor_validation.py b/src/promptflow/tests/executor/e2etests/test_executor_validation.py index 2465047758c..dae4e6b86f8 100644 --- a/src/promptflow/tests/executor/e2etests/test_executor_validation.py +++ b/src/promptflow/tests/executor/e2etests/test_executor_validation.py @@ -30,19 +30,108 @@ @pytest.mark.usefixtures("use_secrets_config_file", "dev_connections") @pytest.mark.e2etest class TestValidation: + @pytest.mark.parametrize( + "flow_folder, yml_file, error_class, error_msg", + [ + ( + "nodes_names_duplicated", + "flow.dag.yaml", + DuplicateNodeName, + ( + "Invalid node definitions found in the flow graph. Node with name 'stringify_num' appears more " + "than once in the node definitions in your flow, which is not allowed. To " + "address this issue, please review your flow and either rename or remove " + "nodes with identical names." + ), + ), + ( + "source_file_missing", + "flow.dag.jinja.yaml", + InvalidSource, + ( + "Node source path 'summarize_text_content__variant_1.jinja2' is invalid on " + "node 'summarize_text_content'." + ), + ), + ( + "node_reference_not_found", + "flow.dag.yaml", + NodeReferenceNotFound, + ( + "Invalid node definitions found in the flow graph. Node 'divide_num_2' references a non-existent " + "node 'divide_num_3' in your flow. Please review your flow to ensure that the " + "node name is accurately specified." + ), + ), + ( + "node_circular_dependency", + "flow.dag.yaml", + NodeCircularDependency, + ( + "Invalid node definitions found in the flow graph. Node circular dependency has been detected " + "among the nodes in your flow. Kindly review the reference relationships for " + "the nodes ['divide_num', 'divide_num_1', 'divide_num_2'] and resolve the " + "circular reference issue in the flow." + ), + ), + ( + "flow_input_reference_invalid", + "flow.dag.yaml", + InputReferenceNotFound, + ( + "Invalid node definitions found in the flow graph. Node 'divide_num' references flow input 'num_1' " + "which is not defined in your flow. To resolve this issue, please review your " + "flow, ensuring that you either add the missing flow inputs or adjust node " + "reference to the correct flow input." + ), + ), + ( + "flow_output_reference_invalid", + "flow.dag.yaml", + EmptyOutputReference, + ( + "The output 'content' for flow is incorrect. The reference is not specified for the output " + "'content' in the flow. To rectify this, ensure that you accurately specify " + "the reference in the flow." + ), + ), + ( + "outputs_reference_not_valid", + "flow.dag.yaml", + OutputReferenceNotFound, + ( + "The output 'content' for flow is incorrect. The output 'content' references non-existent " + "node 'another_stringify_num' in your flow. To resolve this issue, please " + "carefully review your flow and correct the reference definition for the " + "output in question." + ), + ), + ( + "outputs_with_invalid_flow_inputs_ref", + "flow.dag.yaml", + OutputReferenceNotFound, + ( + "The output 'num' for flow is incorrect. The output 'num' references non-existent flow " + "input 'num11' in your flow. Please carefully review your flow and correct " + "the reference definition for the output in question." + ), + ), + ], + ) + def test_executor_create_failure_type_and_message( + self, flow_folder, yml_file, error_class, error_msg, dev_connections + ): + with pytest.raises(error_class) as exc_info: + FlowExecutor.create(get_yaml_file(flow_folder, WRONG_FLOW_ROOT, yml_file), dev_connections) + assert error_msg == exc_info.value.message + @pytest.mark.parametrize( "flow_folder, yml_file, error_class", [ - ("nodes_names_duplicated", "flow.dag.yaml", DuplicateNodeName), ("source_file_missing", "flow.dag.python.yaml", PythonParsingError), - ("source_file_missing", "flow.dag.jinja.yaml", InvalidSource), - ("node_reference_not_found", "flow.dag.yaml", NodeReferenceNotFound), - ("node_circular_dependency", "flow.dag.yaml", NodeCircularDependency), - ("flow_input_reference_invalid", "flow.dag.yaml", InputReferenceNotFound), - ("flow_output_reference_invalid", "flow.dag.yaml", EmptyOutputReference), ], ) - def test_executor_create(self, flow_folder, yml_file, error_class, dev_connections): + def test_executor_create_failure_type(self, flow_folder, yml_file, error_class, dev_connections): with pytest.raises(error_class): FlowExecutor.create(get_yaml_file(flow_folder, WRONG_FLOW_ROOT, yml_file), dev_connections) @@ -62,8 +151,6 @@ def test_node_topology_in_order(self, ordered_flow_folder, unordered_flow_folder @pytest.mark.parametrize( "flow_folder, error_class", [ - ("outputs_reference_not_valid", OutputReferenceNotFound), - ("outputs_with_invalid_flow_inputs_ref", OutputReferenceNotFound), ("invalid_connection", ConnectionNotFound), ("tool_type_missing", NotImplementedError), ("wrong_module", FailedToImportModule), @@ -104,8 +191,9 @@ def test_flow_run_input_type_invalid(self, flow_folder, line_input, error_class, "simple_flow_with_python_tool", [{"num": "hello"}], ( - "The value 'hello' for flow input 'num' in line 0 of input data does not match the expected " - "type 'int'. Please review the input data or adjust the input type of 'num' in your flow." + "The input for flow is incorrect. The value for flow input 'num' in line 0 of input data does not " + "match the expected type 'int'. Please change flow input type or adjust the input value in " + "your input data." ), "InputTypeError", ), @@ -136,18 +224,48 @@ def test_bulk_run_input_type_invalid(self, flow_folder, batch_input, error_messa ), f"Expected message {error_class} but got {str(bulk_result.line_results[0].run_info.error)}" @pytest.mark.parametrize( - "path_root, flow_folder, node_name, line_input, error_class", + "path_root, flow_folder, node_name, line_input, error_class, error_msg", [ - (FLOW_ROOT, "simple_flow_with_python_tool", "divide_num", {"num11": "22"}, InputNotFound), - (FLOW_ROOT, "simple_flow_with_python_tool", "divide_num", {"num": "hello"}, InputTypeError), - (WRONG_FLOW_ROOT, "flow_input_reference_invalid", "divide_num", {"num": "22"}, InputNotFound), + ( + FLOW_ROOT, + "simple_flow_with_python_tool", + "divide_num", + {"num11": "22"}, + InputNotFound, + ( + "The input for node is incorrect. Node input 'num' is not found in input data " + "for node 'divide_num'. Please verify the inputs data for the node." + ), + ), + ( + FLOW_ROOT, + "simple_flow_with_python_tool", + "divide_num", + {"num": "hello"}, + InputTypeError, + ( + "The input for node is incorrect. Value for input 'num' of node 'divide_num' " + "is not type 'int'. Please review and rectify the input data." + ), + ), + ( + WRONG_FLOW_ROOT, + "flow_input_reference_invalid", + "divide_num", + {"num": "22"}, + InputNotFound, + ( + "The input for node is incorrect. Node input 'num_1' is not found from flow " + "inputs of node 'divide_num'. Please review the node definition in your flow." + ), + ), ], ) def test_single_node_input_type_invalid( - self, path_root: str, flow_folder, node_name, line_input, error_class, dev_connections + self, path_root: str, flow_folder, node_name, line_input, error_class, error_msg, dev_connections ): # Single Node run - the inputs are from flow_inputs + dependency_nodes_outputs - with pytest.raises(error_class): + with pytest.raises(error_class) as exe_info: FlowExecutor.load_and_exec_node( flow_file=get_yaml_file(flow_folder, path_root), node_name=node_name, @@ -157,6 +275,8 @@ def test_single_node_input_type_invalid( raise_ex=True, ) + assert error_msg == exe_info.value.message + @pytest.mark.parametrize( "flow_folder, msg", [ diff --git a/src/promptflow/tests/executor/unittests/executor/test_flow_validator.py b/src/promptflow/tests/executor/unittests/executor/test_flow_validator.py index 226eb0f01b5..1fbb2bd6d92 100644 --- a/src/promptflow/tests/executor/unittests/executor/test_flow_validator.py +++ b/src/promptflow/tests/executor/unittests/executor/test_flow_validator.py @@ -32,34 +32,32 @@ def test_ensure_nodes_order(self, flow_folder, expected_node_order): ( "nodes_cycle", ( - "Node circular dependency has been detected among the nodes in your flow. " - "Kindly review the reference relationships for the nodes " - "['first_node', 'second_node'] and resolve the circular reference issue in " - "the flow." + "Invalid node definitions found in the flow graph. Node circular dependency has been detected " + "among the nodes in your flow. Kindly review the reference relationships for the nodes " + "['first_node', 'second_node'] and resolve the circular reference issue in the flow." ), ), ( "nodes_cycle_with_skip", ( - "Node circular dependency has been detected among the nodes in your flow. " - "Kindly review the reference relationships for the " - "nodes ['first_node', 'second_node'] and resolve the circular reference issue " - "in the flow." + "Invalid node definitions found in the flow graph. Node circular dependency has been detected " + "among the nodes in your flow. Kindly review the reference relationships for the nodes " + "['first_node', 'second_node'] and resolve the circular reference issue in the flow." ), ), ( "nodes_cycle_with_activate", ( - "Node circular dependency has been detected among the nodes in your flow. " - "Kindly review the reference relationships for the nodes ['first_node', " - "'second_node'] and resolve the circular reference issue in the flow." + "Invalid node definitions found in the flow graph. Node circular dependency has been detected " + "among the nodes in your flow. Kindly review the reference relationships " + "for the nodes ['first_node', 'second_node'] and resolve the circular reference issue in the flow." ), ), ( "wrong_node_reference", ( - "Node 'second_node' references a non-existent node 'third_node' in your flow. " - "Please review your flow to ensure that the node " + "Invalid node definitions found in the flow graph. Node 'second_node' references a non-existent " + "node 'third_node' in your flow. Please review your flow to ensure that the node " "name is accurately specified." ), ), From e8b7fc3917d5b95d84a94b42fe94263e87d3a96f Mon Sep 17 00:00:00 2001 From: chw-microsoft <95913588+chw-microsoft@users.noreply.github.com> Date: Wed, 13 Sep 2023 19:54:39 +0800 Subject: [PATCH 5/8] refine the error/message for run_tracker.py (#329) # Description Update the error message at run_tracker.py, to make it more concise and actionable # All Promptflow Contribution checklist: - [x] **The pull request does not introduce [breaking changes]** - [ ] **CHANGELOG is updated for new features, bug fixes or other significant changes.** - [x] **I have read the [contribution guidelines](../CONTRIBUTING.md).** ## General Guidelines and Best Practices - [ ] Title of the pull request is clear and informative. - [ ] There are a small number of commits, each of which have an informative message. This means that previously merged commits do not appear in the history of the PR. For more information on cleaning up the commits in your PR, [see this page](https://github.com/Azure/azure-powershell/blob/master/documentation/development-docs/cleaning-up-commits.md). ### Testing Guidelines - [ ] Pull request includes test coverage for the included changes. --- src/promptflow/promptflow/_core/_errors.py | 8 +++ .../promptflow/_core/run_tracker.py | 51 +++++++++++++------ .../e2etests/test_executor_validation.py | 22 ++++++++ .../flow_output_unserializable/divide_num.py | 14 +++++ .../flow_output_unserializable/flow.dag.yaml | 17 +++++++ 5 files changed, 97 insertions(+), 15 deletions(-) create mode 100644 src/promptflow/tests/test_configs/wrong_flows/flow_output_unserializable/divide_num.py create mode 100644 src/promptflow/tests/test_configs/wrong_flows/flow_output_unserializable/flow.dag.yaml diff --git a/src/promptflow/promptflow/_core/_errors.py b/src/promptflow/promptflow/_core/_errors.py index bfb7023f18a..b89482ba09a 100644 --- a/src/promptflow/promptflow/_core/_errors.py +++ b/src/promptflow/promptflow/_core/_errors.py @@ -121,3 +121,11 @@ class MetaFileNotFound(GenerateMetaUserError): class MetaFileReadError(GenerateMetaUserError): pass + + +class RunRecordNotFound(SystemErrorException): + pass + + +class FlowOutputUnserializable(UserErrorException): + pass diff --git a/src/promptflow/promptflow/_core/run_tracker.py b/src/promptflow/promptflow/_core/run_tracker.py index e278e216396..ec66b889fba 100644 --- a/src/promptflow/promptflow/_core/run_tracker.py +++ b/src/promptflow/promptflow/_core/run_tracker.py @@ -8,6 +8,7 @@ from types import GeneratorType from typing import Any, Dict, List, Mapping, Optional, Union +from promptflow._core._errors import FlowOutputUnserializable, RunRecordNotFound from promptflow._core.log_manager import NodeLogManager from promptflow._core.thread_local_singleton import ThreadLocalSingleton from promptflow._utils.dataclass_serializer import serialize @@ -16,7 +17,7 @@ from promptflow.contracts.run_info import FlowRunInfo, RunInfo, Status from promptflow.contracts.run_mode import RunMode from promptflow.contracts.tool import ConnectionType -from promptflow.exceptions import ErrorTarget, UserErrorException, ValidationException +from promptflow.exceptions import ErrorTarget from promptflow.storage import AbstractRunStorage from promptflow.storage._run_storage import DummyRunStorage @@ -216,7 +217,14 @@ def end_run( ): run_info = self._flow_runs.get(run_id) or self._node_runs.get(run_id) if run_info is None: - raise RunRecordNotFound(message=f"Run {run_id} not found", target=ErrorTarget.RUN_TRACKER) + raise RunRecordNotFound( + message_format=( + "Run record with ID '{run_id}' was not tracked in promptflow execution. " + "Please contact support for further assistance." + ), + target=ErrorTarget.RUN_TRACKER, + run_id=run_id, + ) if isinstance(run_info, FlowRunInfo): self._flow_run_postprocess(run_info, result, ex) elif isinstance(run_info, RunInfo): @@ -247,14 +255,26 @@ def _ensure_inputs_is_json_serializable(self, inputs: dict, node_name: str) -> d } def _assert_flow_output_serializable(self, output: Any) -> Any: - try: - return {k: self._ensure_serializable_value(v) for k, v in output.items()} - except Exception as e: - # If it is flow output not node output, raise an exception. - raise UserErrorException( - f"Flow output must be json serializable, dump json failed: {e}", - target=ErrorTarget.FLOW_EXECUTOR, - ) from e + serializable_output = {} + for k, v in output.items(): + try: + serializable_output[k] = self._ensure_serializable_value(v) + except Exception as e: + # If a specific key-value pair is not serializable, raise an exception with the key. + error_type_and_message = f"({e.__class__.__name__}) {e}" + message_format = ( + "The output '{output_name}' for flow is incorrect. The output value is not JSON serializable. " + "JSON dump failed: {error_type_and_message}. Please verify your flow output and " + "make sure the value serializable." + ) + raise FlowOutputUnserializable( + message_format=message_format, + target=ErrorTarget.FLOW_EXECUTOR, + output_name=k, + error_type_and_message=error_type_and_message, + ) from e + + return serializable_output def _enrich_run_info_with_exception(self, run_info: Union[RunInfo, FlowRunInfo], ex: Exception): """Update exception details into run info.""" @@ -283,7 +303,12 @@ def ensure_run_info(self, run_id: str) -> Union[RunInfo, FlowRunInfo]: run_info = self._node_runs.get(run_id) or self._flow_runs.get(run_id) if run_info is None: raise RunRecordNotFound( - message=f"Run {run_id} not found when tracking inputs", target=ErrorTarget.RUN_TRACKER + message_format=( + "Run record with ID '{run_id}' was not tracked in promptflow execution. " + "Please contact support for further assistance." + ), + target=ErrorTarget.RUN_TRACKER, + run_id=run_id, ) return run_info @@ -390,7 +415,3 @@ def get_status_summary(self, run_id: str): def persist_status_summary(self, status_summary: Dict[str, int], run_id: str): self._storage.persist_status_summary(status_summary, run_id) - - -class RunRecordNotFound(ValidationException): - pass diff --git a/src/promptflow/tests/executor/e2etests/test_executor_validation.py b/src/promptflow/tests/executor/e2etests/test_executor_validation.py index dae4e6b86f8..f0077f72f97 100644 --- a/src/promptflow/tests/executor/e2etests/test_executor_validation.py +++ b/src/promptflow/tests/executor/e2etests/test_executor_validation.py @@ -3,6 +3,7 @@ import pytest +from promptflow._core._errors import FlowOutputUnserializable from promptflow._core.tool_meta_generator import PythonParsingError from promptflow._core.tools_manager import APINotFound from promptflow.contracts._errors import FailedToImportModule @@ -175,6 +176,27 @@ def test_flow_run_input_type_invalid(self, flow_folder, line_input, error_class, with pytest.raises(error_class): executor.exec_line(line_input) + @pytest.mark.parametrize( + "flow_folder, line_input, error_class, error_msg", + [ + ( + "flow_output_unserializable", + {"num": "22"}, + FlowOutputUnserializable, + ( + "The output 'content' for flow is incorrect. The output value is not JSON serializable. " + "JSON dump failed: (TypeError) Object of type UnserializableClass is not JSON serializable. " + "Please verify your flow output and make sure the value serializable." + ), + ), + ], + ) + def test_flow_run_execution_errors(self, flow_folder, line_input, error_class, error_msg, dev_connections): + executor = FlowExecutor.create(get_yaml_file(flow_folder, WRONG_FLOW_ROOT), dev_connections) + # For now, there exception is designed to be swallowed in executor. But Run Info would have the error details + res = executor.exec_line(line_input) + assert error_msg == res.run_info.error["message"] + @pytest.mark.parametrize( "flow_folder, batch_input, error_message, error_class", [ diff --git a/src/promptflow/tests/test_configs/wrong_flows/flow_output_unserializable/divide_num.py b/src/promptflow/tests/test_configs/wrong_flows/flow_output_unserializable/divide_num.py new file mode 100644 index 00000000000..576002520ae --- /dev/null +++ b/src/promptflow/tests/test_configs/wrong_flows/flow_output_unserializable/divide_num.py @@ -0,0 +1,14 @@ +from promptflow import tool + + +@tool +def divide_num(num: int): + return UnserializableClass(num=(int)(num / 2)) + + +class UnserializableClass: + def __init__(self, num: int): + self.num = num + + def __str__(self): + return str(self.num) \ No newline at end of file diff --git a/src/promptflow/tests/test_configs/wrong_flows/flow_output_unserializable/flow.dag.yaml b/src/promptflow/tests/test_configs/wrong_flows/flow_output_unserializable/flow.dag.yaml new file mode 100644 index 00000000000..e2499fee0f1 --- /dev/null +++ b/src/promptflow/tests/test_configs/wrong_flows/flow_output_unserializable/flow.dag.yaml @@ -0,0 +1,17 @@ +inputs: + num: + type: int +outputs: + content: + type: string + reference: ${divide_num.output} +nodes: +- name: divide_num + type: python + source: + type: code + path: divide_num.py + inputs: + num: ${inputs.num} + + From e367c6f6dff9b5fd4d1f29ae1cf856fc55bec749 Mon Sep 17 00:00:00 2001 From: Ying Chen Date: Wed, 13 Sep 2023 20:24:43 +0800 Subject: [PATCH 6/8] [DOC]Detail explain flow.dag.yaml schema/concept: how to author nodes (#333) # Description Please add an informative description that covers that changes made by the pull request and link all relevant issues. # All Promptflow Contribution checklist: - [ ] **The pull request does not introduce [breaking changes]** - [ ] **CHANGELOG is updated for new features, bug fixes or other significant changes.** - [ ] **I have read the [contribution guidelines](../CONTRIBUTING.md).** ## General Guidelines and Best Practices - [ ] Title of the pull request is clear and informative. - [ ] There are a small number of commits, each of which have an informative message. This means that previously merged commits do not appear in the history of the PR. For more information on cleaning up the commits in your PR, [see this page](https://github.com/Azure/azure-powershell/blob/master/documentation/development-docs/cleaning-up-commits.md). ### Testing Guidelines - [ ] Pull request includes test coverage for the included changes. --------- Co-authored-by: Ying Chen <2601502859@qq.com> Co-authored-by: Clement Wang <47586720+wangchao1230@users.noreply.github.com> --- .../develop-a-flow/develop-standard-flow.md | 313 ++++++++++++++++++ docs/how-to-guides/develop-a-flow/index.md | 9 + docs/how-to-guides/index.md | 1 + docs/how-to-guides/quick-start.md | 2 + docs/index.md | 1 + .../develop-standard-flow/add_tool.png | Bin 0 -> 23720 bytes .../develop-standard-flow/edit_tool.png | Bin 0 -> 38789 bytes .../develop-standard-flow/flow_input.png | Bin 0 -> 18473 bytes .../develop-standard-flow/flow_output.png | Bin 0 -> 15986 bytes ...llm_with_flow_input_single_output_node.png | Bin 0 -> 61686 bytes .../link_llm_with_multi_output_node.png | Bin 0 -> 41705 bytes .../link_python_with_flow_node_input.png | Bin 0 -> 17534 bytes docs/reference/flow-yaml-schema-reference.md | 79 +++++ docs/reference/index.md | 8 + 14 files changed, 413 insertions(+) create mode 100644 docs/how-to-guides/develop-a-flow/develop-standard-flow.md create mode 100644 docs/how-to-guides/develop-a-flow/index.md create mode 100644 docs/media/how-to-guides/develop-standard-flow/add_tool.png create mode 100644 docs/media/how-to-guides/develop-standard-flow/edit_tool.png create mode 100644 docs/media/how-to-guides/develop-standard-flow/flow_input.png create mode 100644 docs/media/how-to-guides/develop-standard-flow/flow_output.png create mode 100644 docs/media/how-to-guides/develop-standard-flow/link_llm_with_flow_input_single_output_node.png create mode 100644 docs/media/how-to-guides/develop-standard-flow/link_llm_with_multi_output_node.png create mode 100644 docs/media/how-to-guides/develop-standard-flow/link_python_with_flow_node_input.png create mode 100644 docs/reference/flow-yaml-schema-reference.md diff --git a/docs/how-to-guides/develop-a-flow/develop-standard-flow.md b/docs/how-to-guides/develop-a-flow/develop-standard-flow.md new file mode 100644 index 00000000000..b8f6d6c2e18 --- /dev/null +++ b/docs/how-to-guides/develop-a-flow/develop-standard-flow.md @@ -0,0 +1,313 @@ +# Develop standard flow + +:::{admonition} Experimental feature +This is an experimental feature, and may change at any time. Learn [more](../faq.md#stable-vs-experimental). +::: + +From this document, you can learn how to develop a standard flow by writing a flow yaml from scratch. You can +find additional information about flow yaml schema in [Flow YAML Schema](../../reference/flow-yaml-schema-reference.md). + +## Flow input data +The flow input data is the data that you want to process in your flow. +::::{tab-set} +:::{tab-item} CLI +:sync: CLI +You can add a flow input in inputs section of flow yaml. +```yaml +inputs: + url: + type: string + default: https://www.microsoft.com/en-us/d/xbox-wireless-controller-stellar-shift-special-edition/94fbjc7h0h6h +``` +::: + +:::{tab-item} VS Code Extension +:sync: VS Code Extension +When unfolding Inputs section in the authoring page, you can set and view your flow inputs, including input schema (name and type), +and the input value. + +![flow_input](../../media/how-to-guides/develop-standard-flow/flow_input.png) +::: + +:::: +For Web Classification sample as shown the screenshot above, the flow input is a url of string type. We also support +the input type of `int`, `bool`, `double`, `list` and `object`. + +## Develop the flow using different tools +In one flow, you can consume different kinds of tools. We now support built-in tool like +[LLM](../../reference/tools-reference/llm-tool.md), [Python](../../reference/tools-reference/python-tool.md) and +[Prompt](../../reference/tools-reference/prompt-tool.md) and +third-party tool like [Serp API](../../reference/tools-reference/serp-api-tool.md), +[Vector Search](../../reference/tools-reference/vector_db_lookup_tool.md), etc. + +### Add tool as your need +::::{tab-set} +:::{tab-item} CLI +:sync: CLI +You can add a tool node in nodes section of flow yaml. For example, yaml below shows how to add a Python tool node in the flow. + +```yaml +nodes: +- name: fetch_text_content_from_url + type: python + source: + type: code + path: fetch_text_content_from_url.py + inputs: + url: ${inputs.url} +``` +::: + +:::{tab-item} VS Code Extension +:sync: VS Code Extension +By selecting the tool card on the very top, you'll add a new tool node to flow. + +![add_tool](../../media/how-to-guides/develop-standard-flow/add_tool.png) +::: + +:::: + +### Edit tool +::::{tab-set} +:::{tab-item} CLI +:sync: CLI +You can edit the tool by simply opening the source file and making edits. For example, we provide a simple Python tool code below. + +```python +from promptflow import tool + +# The inputs section will change based on the arguments of the tool function, after you save the code +# Adding type to arguments and return value will help the system show the types properly +# Please update the function name/signature per need +@tool +def my_python_tool(input1: str) -> str: + return 'hello ' + input1 +``` + +We also provide an LLM tool prompt below. + +```jinja +Please summarize the following text in one paragraph. 100 words. +Do not add any information that is not in the text. +Text: {{text}} +Summary: +``` +::: + +:::{tab-item} VS Code Extension +:sync: VS Code Extension +When a new tool node is added to flow, it will be appended at the bottom of flatten view with a random name by default. +At the top of each tool node card, there's a toolbar for adjusting the tool node. You can move it up or down, you can delete or rename it too. +For a python tool node, you can edit the tool code by clicking the code file. For a LLM tool node, you can edit the +tool prompt by clicking the prompt file and adjust input parameters like connection, api and etc. +![edit_tool](../../media/how-to-guides/develop-standard-flow/edit_tool.png) +::: + +:::: + +### Create connection +Please refer to the [Create necessary connections](../quick-start.md#create-necessary-connections) for details. + +## Chain your flow - link nodes together +Before linking nodes together, you need to define and expose an interface. + +### Define LLM node interface +LLM node has only one output, the completion given by LLM provider. + +As for inputs, we offer a templating strategy that can help you create parametric prompts that accept different input +values. Instead of fixed text, enclose your input name in `{{}}`, so it can be replaced on the fly. We use Jinja as our +templating language. For example: + +```jinja +Your task is to classify a given url into one of the following types: +Movie, App, Academic, Channel, Profile, PDF or None based on the text content information. +The classification will be based on the url, the webpage text content summary, or both. + +Here are a few examples: +{% for ex in examples %} +URL: {{ex.url}} +Text content: {{ex.text_content}} +OUTPUT: +{"category": "{{ex.category}}", "evidence": "{{ex.evidence}}"} + +{% endfor %} + +For a given URL : {{url}}, and text content: {{text_content}}. +Classify above url to complete the category and indicate evidence. +OUTPUT: +``` + +### Define Python node interface +Python node might have multiple inputs and outputs. Define inputs and outputs as shown below. +If you have multiple outputs, remember to make it a dictionary so that the downstream node can call each key separately. +For example: + +```python +import json +from promptflow import tool + +@tool +def convert_to_dict(input_str: str, input_str2: str) -> dict: + try: + print(input_str2) + return json.loads(input_str) + except Exception as e: + print("input is not valid, error: {}".format(e)) + return {"category": "None", "evidence": "None"} +``` + +### Link nodes together +After the interface is defined, you can use: + +- ${inputs.key} to link with flow input. +- ${upstream_node_name.output} to link with single-output upstream node. +- ${upstream_node_name.output.key} to link with multi-output upstream node. + +Below are common scenarios for linking nodes together. + +### Scenario 1 - Link LLM node with flow input and single-output upstream node +After you add a new LLM node and edit the prompt file like [Define LLM node interface](#define-llm-node-interface), +three inputs called `url`, `examples` and `text_content` are created in inputs section. + +::::{tab-set} +:::{tab-item} CLI +:sync: CLI +You can link the LLM node input with flow input by `${inputs.url}`. +And you can link `examples` to the upstream `prepare_examples` node and `text_content` to the `summarize_text_content` node +by `${prepare_examples.output}` and `${summarize_text_content.output}`. +```yaml +- name: classify_with_llm + type: llm + source: + type: code + path: classify_with_llm.jinja2 + inputs: + deployment_name: text-davinci-003 + suffix: "" + max_tokens: 128 + temperature: 0.2 + top_p: 1 + echo: false + presence_penalty: 0 + frequency_penalty: 0 + best_of: 1 + url: ${inputs.url} # Link with flow input + examples: ${prepare_examples.output} # Link LLM node with single-output upstream node + text_content: ${summarize_text_content.output} # Link LLM node with single-output upstream node +``` +::: + +:::{tab-item} VS Code Extension +:sync: VS Code Extension +In the value drop-down, select `${inputs.url}`, `${prepare_examples.output}` and `${summarize_text_content.output}`, then +you'll see in the graph view that the newly created LLM node is linked to the flow input, upstream `prepare_examples` and `summarize_text_content` node. + +![link_llm_with_flow_input_single_output_node](../../media/how-to-guides/develop-standard-flow/link_llm_with_flow_input_single_output_node.png) +::: + +:::: +When running the flow, the `url` input of the node will be replaced by flow input on the fly, and the `examples` and +`text_content` input of the node will be replaced by `prepare_examples` and `summarize_text_content` node output on the fly. + +### Scenario 2 - Link LLM node with multi-output upstream node +Suppose we want to link the newly created LLM node with `covert_to_dict` Python node whose output is a dictionary with two keys: `category` and `evidence`. +::::{tab-set} +:::{tab-item} CLI +:sync: CLI +You can link `examples` to the `evidence` output of upstream `covert_to_dict` node by `${convert_to_dict.output.evidence}` like below: +```yaml +- name: classify_with_llm + type: llm + source: + type: code + path: classify_with_llm.jinja2 + inputs: + deployment_name: text-davinci-003 + suffix: "" + max_tokens: 128 + temperature: 0.2 + top_p: 1 + echo: false + presence_penalty: 0 + frequency_penalty: 0 + best_of: 1 + text_content: ${convert_to_dict.output.evidence} # Link LLM node with multi-output upstream node +``` +::: + +:::{tab-item} VS Code Extension +:sync: VS Code Extension +In the value drop-down, select `${convert_to_dict.output}`, then manually append `evidence`, then you'll see in the graph +view that the newly created LLM node is linked to the upstream `convert_to_dict node`. + +![link_llm_with_multi_output_node](../../media/how-to-guides/develop-standard-flow/link_llm_with_multi_output_node.png) +::: +:::: +When running the flow, the `text_content` input of the node will be replaced by `evidence` value from `convert_to_dict node` output dictionary on the fly. + +### Scenario 3 - Link Python node with upstream node/flow input +After you add a new Python node and edit the code file like [Define Python node interface](#define-python-node-interface)], +two inputs called `input_str` and `input_str2` are created in inputs section. The linkage is the same as LLM node, +using `${flow.input_name}` to link with flow input or `${upstream_node_name.output}` to link with upstream node. + +::::{tab-set} +:::{tab-item} CLI +:sync: CLI +```yaml +- name: prepare_examples + type: python + source: + type: code + path: prepare_examples.py + inputs: + input_str: ${inputs.url} # Link Python node with flow input + input_str2: ${fetch_text_content_from_url.output} # Link Python node with single-output upstream node +``` +::: + +:::{tab-item} VS Code Extension +:sync: VS Code Extension + +![link_python_with_flow_node_input](../../media/how-to-guides/develop-standard-flow/link_python_with_flow_node_input.png) +::: + +:::: +When running the flow, the `input_str` input of the node will be replaced by flow input on the fly and the `input_str2` +input of the node will be replaced by `fetch_text_content_from_url` node output dictionary on the fly. + +## Set flow output +When the flow is complicated, instead of checking outputs on each node, you can set flow output and check outputs of +multiple nodes in one place. Moreover, flow output helps: + +- Check bulk test results in one single table. +- Define evaluation interface mapping. +- Set deployment response schema. + +::::{tab-set} +:::{tab-item} CLI +:sync: CLI +You can add flow outputs in outputs section of flow yaml . The linkage is the same as LLM node, +using `${convert_to_dict.output.category}` to link `category` flow output with with `category` value of upstream node +`convert_to_dict`. + +```yaml +outputs: + category: + type: string + reference: ${convert_to_dict.output.category} + evidence: + type: string + reference: ${convert_to_dict.output.evidence} +``` +::: + +:::{tab-item} VS Code Extension +:sync: VS Code Extension +First define flow output schema, then select in drop-down the node whose output you want to set as flow output. +Since `convert_to_dict` has a dictionary output with two keys: `category` and `evidence`, you need to manually append +`category` and `evidence` to each. Then run flow, after a while, you can check flow output in a table. + +![flow_output](../../media/how-to-guides/develop-standard-flow/flow_output.png) +::: + +:::: \ No newline at end of file diff --git a/docs/how-to-guides/develop-a-flow/index.md b/docs/how-to-guides/develop-a-flow/index.md new file mode 100644 index 00000000000..3d409421419 --- /dev/null +++ b/docs/how-to-guides/develop-a-flow/index.md @@ -0,0 +1,9 @@ +# Develop a flow +We provide guides on how to develop a flow by writing a flow yaml from scratch in this section. + +```{toctree} +:maxdepth: 1 +:hidden: + +develop-standard-flow +``` \ No newline at end of file diff --git a/docs/how-to-guides/index.md b/docs/how-to-guides/index.md index 852cde13deb..a6be983dd90 100644 --- a/docs/how-to-guides/index.md +++ b/docs/how-to-guides/index.md @@ -5,6 +5,7 @@ Simple and short articles grouped by topics, each introduces a core feature of p ```{toctree} :maxdepth: 1 +develop-a-flow/index init-and-test-a-flow run-and-evaluate-a-flow tune-prompts-with-variants diff --git a/docs/how-to-guides/quick-start.md b/docs/how-to-guides/quick-start.md index 658fab9a057..a655b4571cf 100644 --- a/docs/how-to-guides/quick-start.md +++ b/docs/how-to-guides/quick-start.md @@ -110,6 +110,7 @@ inputs: default: https://play.google.com/store/apps/details?id=com.twitter.android ... ``` +See more details of this topic in [Develop a flow](./develop-a-flow/index.md). ### Create necessary connections @@ -283,6 +284,7 @@ See more details of this topic in [Initialize and test a flow](./init-and-test-a ## Next steps Learn more on how to: +- [Develop a flow](./develop-a-flow/index.md): details on how to develop a flow by writing a flow yaml from scratch. - [Initialize and test a flow](./init-and-test-a-flow.md): details on how develop a flow from scratch or existing code. - [Run and evaluate a flow](./run-and-evaluate-a-flow.md): run and evaluate the flow using multi line data file. - [Deploy a flow](./deploy-a-flow/index.md): how to deploy the flow as a web app. diff --git a/docs/index.md b/docs/index.md index 33aecaaea14..7afeb5cd245 100644 --- a/docs/index.md +++ b/docs/index.md @@ -38,6 +38,7 @@ This documentation site contains guides for prompt flow [sdk, cli](https://pypi. - header: "📒 How-to Guides" content: " Articles guide user to complete a specific task in prompt flow.

+ - [Develop a flow](how-to-guides/develop-a-flow/index.md)
- [Initialize and test a flow](how-to-guides/init-and-test-a-flow.md)
- [Run and evaluate a flow](how-to-guides/run-and-evaluate-a-flow.md)
- [Tune prompts using variants](how-to-guides/tune-prompts-with-variants.md)
diff --git a/docs/media/how-to-guides/develop-standard-flow/add_tool.png b/docs/media/how-to-guides/develop-standard-flow/add_tool.png new file mode 100644 index 0000000000000000000000000000000000000000..50596457c2f4350e733df107707a11128ac47cab GIT binary patch literal 23720 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 literal 0 HcmV?d00001 diff --git a/docs/media/how-to-guides/develop-standard-flow/flow_output.png b/docs/media/how-to-guides/develop-standard-flow/flow_output.png new file mode 100644 index 0000000000000000000000000000000000000000..f821486c2e8c18a21b06b56449ed10131be4f4a6 GIT binary patch literal 15986 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 nE+u7QwaUc(&wn^QyYfqh^{F*u2k5&c!( literal 0 HcmV?d00001 diff --git a/docs/media/how-to-guides/develop-standard-flow/link_llm_with_flow_input_single_output_node.png b/docs/media/how-to-guides/develop-standard-flow/link_llm_with_flow_input_single_output_node.png new file mode 100644 index 0000000000000000000000000000000000000000..1425cf83a183cc2737d98b7f4627c76c3577f489 GIT binary patch literal 61686 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�kR~CWLTLVuX|$An>_P)K~()* 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 TR!v%a0%VP+tDnm{r-UW|deF1A literal 0 HcmV?d00001 diff --git a/docs/media/how-to-guides/develop-standard-flow/link_llm_with_multi_output_node.png b/docs/media/how-to-guides/develop-standard-flow/link_llm_with_multi_output_node.png new file mode 100644 index 0000000000000000000000000000000000000000..e33aa6f3c90e294d7ada6180cfbeba25abb947c2 GIT binary patch literal 41705 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 | object | The flow input definition. See [Flow input](#flow-input) for the set of configurable properties. | +| `outputs` | object | Dictionary of flow outputs. The key is a name for the output within the context of the flow and the value is the flow output definition. | +| `outputs.` | object | The component output definition. See [Flow output](#flow-output) for the set of configurable properties. | +| `nodes` | array | Sets of dictionary of individual nodes to run as steps within the flow. Node can use built-in tool or third-party tool. See [Nodes](#nodes) for more information. | +| `node_variants` | object | Dictionary of nodes with variants. The key is the node name and value contains variants definition and `default_variant_id`. See [Node variants](#node-variants) for more information. | +| `environment` | object | The environment to use for the flow. The key can be `image` or `python_requirements_txt` and the value can be either a image or a python requirements text file. | +| `additional_includes` | array | Additional includes is a list of files that can be shared among flows. Users can specify additional files and folders used by flow, and Prompt flow will help copy them all to the snapshot during flow creation. | + + +### Flow input + +| Key | Type | Description | Allowed values | +|-------------------|-------------------------------------------|------------------------------------------------------|-----------------------------------------------------| +| `type` | string | The type of flow input. | `int`, `double`, `bool`, `string`, `list`, `object` | +| `description` | string | Description of the input. | | +| `default` | int, double, bool, string, list or object | The default value for the input. | | +| `is_chat_input` | boolean | Whether the input is the chat flow input. | | +| `is_chat_history` | boolean | Whether the input is the chat history for chat flow. | | + +### Flow output + +| Key | Type | Description | Allowed values | +|------------------|---------|-------------------------------------------------------------------------------|-----------------------------------------------------| +| `type` | string | The type of flow output. | `int`, `double`, `bool`, `string`, `list`, `object` | +| `description` | string | Description of the output. | | +| `reference` | string | A reference to the node output, e.g. ${.output.} | | +| `is_chat_output` | boolean | Whether the output is the chat flow output. | | + +### Nodes +Nodes is a set of node which is a dictionary with following fields. Below, we only show the common fields of a single node using built-in tool. + +| Key | Type | Description | Allowed values | +|----------------|--------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------| +| `name` | string | The name of the node. | | +| `type` | string | The type of the node. | Type of built-in tool like `Python`, `Prompt`, `LLM` and third-party tool like `Vector Search`, etc. | +| `inputs` | object | Dictionary of node inputs. The key is the input name and the value can be primitive value or a reference to the flow input or the node output, e.g. `${inputs.}`, `${.output}` or `${.output.}` | | +| `source` | object | Dictionary of tool source used by the node. The key contains `type`, `path` and `tool`. The type can be `code`, `package` and `package_with_prompt`. | | +| `provider` | string | It indicates the provider of the tool. Used when the `type` is LLM. | `AzureOpenAI` or `OpenAI` | +| `connection` | string | The connection name which has been created before. Used when the `type` is LLM. | | +| `api` | string | The api name of the provider. Used when the `type` is LLM. | | +| `module` | string | The module name of the tool using by the node. Used when the `type` is LLM. | | +| `use_variants` | bool | Whether the node has variants. | | + + +### Node variants +Node variants is a dictionary containing variants definition for nodes with variants with their respective node names as dictionary keys. +Below, we explore the variants for a single node. + +| Key | Type | Description | Allowed values | +|----------------------|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------| +| `` | string | The name of the node. | | +| `default_variant_id` | string | Default variant id. | | +| `variants ` | object | This dictionary contains all node variations, with the variant id serving as the key and a node definition dictionary as the corresponding value. Within the node definition dictionary, the key labeled 'node' should contain a variant definition similar to [Nodes](#nodes), excluding the 'name' field. | | + + + +## Examples + +Flow examples are available in the [GitHub repository](https://github.com/microsoft/promptflow/tree/main/examples/flows). + +- [basic](https://github.com/microsoft/promptflow/tree/main/examples/flows/standard/basic) +- [web-classification](https://github.com/microsoft/promptflow/tree/main/examples/flows/standard/web-classification) +- [basic-chat](https://github.com/microsoft/promptflow/tree/main/examples/flows/chat/basic-chat) +- [chat-with-pdf](https://github.com/microsoft/promptflow/tree/main/examples/flows/chat/chat-with-pdf) +- [eval-basic](https://github.com/microsoft/promptflow/tree/main/examples/flows/evaluation/eval-basic) \ No newline at end of file diff --git a/docs/reference/index.md b/docs/reference/index.md index b37481d585e..e8eaf140815 100644 --- a/docs/reference/index.md +++ b/docs/reference/index.md @@ -37,4 +37,12 @@ tools-reference/serp-api-tool tools-reference/faiss_index_lookup_tool tools-reference/vector_db_lookup_tool tools-reference/embedding_tool +``` + +```{toctree} +:caption: YAML Schema +:maxdepth: 1 + +flow-yaml-schema-reference.md + ``` \ No newline at end of file From a74eee5e205e7c20f567c9a5fab4856e775cdbb7 Mon Sep 17 00:00:00 2001 From: chenslucky <75061414+chenslucky@users.noreply.github.com> Date: Thu, 14 Sep 2023 10:39:47 +0800 Subject: [PATCH 7/8] Update tool package version from 0.1.0b5 to 0.1.0b6 (#385) # Description Update tool package version from 0.1.0b5 to 0.1.0b6 # All Promptflow Contribution checklist: - [x] **The pull request does not introduce [breaking changes]** - [x] **CHANGELOG is updated for new features, bug fixes or other significant changes.** - [x] **I have read the [contribution guidelines](../CONTRIBUTING.md).** ## General Guidelines and Best Practices - [x] Title of the pull request is clear and informative. - [x] There are a small number of commits, each of which have an informative message. This means that previously merged commits do not appear in the history of the PR. For more information on cleaning up the commits in your PR, [see this page](https://github.com/Azure/azure-powershell/blob/master/documentation/development-docs/cleaning-up-commits.md). Co-authored-by: cs_lucky --- src/promptflow-tools/promptflow/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/promptflow-tools/promptflow/version.txt b/src/promptflow-tools/promptflow/version.txt index b7cbee9a727..e3c3372d4a2 100644 --- a/src/promptflow-tools/promptflow/version.txt +++ b/src/promptflow-tools/promptflow/version.txt @@ -1 +1 @@ -VERSION = "0.1.0b5" \ No newline at end of file +VERSION = "0.1.0b6" \ No newline at end of file From 2afc0cc59439ba4c17ee3b78ab7e0818d4183d53 Mon Sep 17 00:00:00 2001 From: Zhengfei Wang <38847871+zhengfeiwang@users.noreply.github.com> Date: Thu, 14 Sep 2023 14:17:18 +0800 Subject: [PATCH 8/8] [promptflow][Feature] Store token metrics in run properties (#382) # Description Store token related metrics in DB and show them in run properties. image # All Promptflow Contribution checklist: - [X] **The pull request does not introduce [breaking changes]** - [x] **CHANGELOG is updated for new features, bug fixes or other significant changes.** - [X] **I have read the [contribution guidelines](../CONTRIBUTING.md).** ## General Guidelines and Best Practices - [X] Title of the pull request is clear and informative. - [X] There are a small number of commits, each of which have an informative message. This means that previously merged commits do not appear in the history of the PR. For more information on cleaning up the commits in your PR, [see this page](https://github.com/Azure/azure-powershell/blob/master/documentation/development-docs/cleaning-up-commits.md). ### Testing Guidelines - [X] Pull request includes test coverage for the included changes. --- src/promptflow/CHANGELOG.md | 6 +++++ src/promptflow/promptflow/_sdk/_constants.py | 1 + .../promptflow/_sdk/_orm/run_info.py | 23 +++++++++++++++++-- .../promptflow/_sdk/entities/_run.py | 1 + .../_sdk/operations/_run_submitter.py | 6 +++-- .../sdk_cli_test/e2etests/test_flow_run.py | 8 ++++++- 6 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/promptflow/CHANGELOG.md b/src/promptflow/CHANGELOG.md index ebce9783d26..765eb500c52 100644 --- a/src/promptflow/CHANGELOG.md +++ b/src/promptflow/CHANGELOG.md @@ -1,5 +1,11 @@ # Release History +## 0.1.0b6 (Upcoming) + +### Features Added + +- Add token metrics in run properties + ## 0.1.0b5 (2023.09.08) ### Features Added diff --git a/src/promptflow/promptflow/_sdk/_constants.py b/src/promptflow/promptflow/_sdk/_constants.py index 1f080e2fcc8..161dacfcdad 100644 --- a/src/promptflow/promptflow/_sdk/_constants.py +++ b/src/promptflow/promptflow/_sdk/_constants.py @@ -140,6 +140,7 @@ class FlowRunProperties: OUTPUT_PATH = "output_path" NODE_VARIANT = "node_variant" RUN = "run" + SYSTEM_METRICS = "system_metrics" class CommonYamlFields: diff --git a/src/promptflow/promptflow/_sdk/_orm/run_info.py b/src/promptflow/promptflow/_sdk/_orm/run_info.py index 53efdfdddcb..67aef235776 100644 --- a/src/promptflow/promptflow/_sdk/_orm/run_info.py +++ b/src/promptflow/promptflow/_sdk/_orm/run_info.py @@ -11,7 +11,12 @@ from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import declarative_base -from promptflow._sdk._constants import RUN_INFO_CREATED_ON_INDEX_NAME, RUN_INFO_TABLENAME, ListViewType +from promptflow._sdk._constants import ( + RUN_INFO_CREATED_ON_INDEX_NAME, + RUN_INFO_TABLENAME, + FlowRunProperties, + ListViewType, +) from promptflow._sdk._errors import RunExistsError, RunNotFoundError from .retry import sqlite_retry @@ -89,6 +94,7 @@ def update( tags: Optional[Dict[str, str]] = None, start_time: Optional[Union[str, datetime.datetime]] = None, end_time: Optional[Union[str, datetime.datetime]] = None, + system_metrics: Optional[Dict[str, int]] = None, ) -> None: update_dict = {} if status is not None: @@ -110,7 +116,20 @@ def update( self.end_time = end_time if isinstance(end_time, str) else end_time.isoformat() update_dict["end_time"] = self.end_time with mgmt_db_session() as session: - session.query(RunInfo).filter(RunInfo.name == self.name).update(update_dict) + # if not update system metrics, we can directly update the row; + # otherwise, we need to get properties first, update the dict and finally update the row + if system_metrics is None: + session.query(RunInfo).filter(RunInfo.name == self.name).update(update_dict) + else: + # with high concurrency on same row, we may lose the earlier commit + # we regard it acceptable as it should be an edge case to update properties + # on same row with high concurrency; + # if it's a concern, we can move those properties to an extra column + run_info = session.query(RunInfo).filter(RunInfo.name == self.name).first() + props = json.loads(run_info.properties) + props[FlowRunProperties.SYSTEM_METRICS] = system_metrics.copy() + update_dict["properties"] = json.dumps(props) + session.query(RunInfo).filter(RunInfo.name == self.name).update(update_dict) session.commit() @staticmethod diff --git a/src/promptflow/promptflow/_sdk/entities/_run.py b/src/promptflow/promptflow/_sdk/entities/_run.py index 6094afd8945..602e1051cc0 100644 --- a/src/promptflow/promptflow/_sdk/entities/_run.py +++ b/src/promptflow/promptflow/_sdk/entities/_run.py @@ -194,6 +194,7 @@ def _from_orm_object(cls, obj: ORMRun) -> "Run": end_time=datetime.datetime.fromisoformat(str(obj.end_time)) if obj.end_time else None, status=str(obj.status), data=Path(obj.data).resolve().absolute().as_posix() if obj.data else None, + properties={FlowRunProperties.SYSTEM_METRICS: properties_json.get(FlowRunProperties.SYSTEM_METRICS, {})}, ) @classmethod diff --git a/src/promptflow/promptflow/_sdk/operations/_run_submitter.py b/src/promptflow/promptflow/_sdk/operations/_run_submitter.py index 35d9160277c..39eda5b976c 100644 --- a/src/promptflow/promptflow/_sdk/operations/_run_submitter.py +++ b/src/promptflow/promptflow/_sdk/operations/_run_submitter.py @@ -310,15 +310,17 @@ def _submit_bulk_run(self, flow: Flow, run: Run, local_storage: LocalStorageOper local_storage.dump_snapshot(flow) local_storage.dump_inputs(mapped_inputs) # result: outputs and metrics - # TODO: retrieve root run system metrics from executor return, we might store it in db local_storage.persist_result(bulk_result) - + # exceptions local_storage.dump_exception(exception=exception, bulk_results=bulk_result) + # system metrics: token related + system_metrics = bulk_result.get_openai_metrics() self.run_operations.update( name=run.name, status=status, end_time=datetime.datetime.now(), + system_metrics=system_metrics, ) def _resolve_data(self, run: Run): diff --git a/src/promptflow/tests/sdk_cli_test/e2etests/test_flow_run.py b/src/promptflow/tests/sdk_cli_test/e2etests/test_flow_run.py index 083cb1b1915..bbae2db33ae 100644 --- a/src/promptflow/tests/sdk_cli_test/e2etests/test_flow_run.py +++ b/src/promptflow/tests/sdk_cli_test/e2etests/test_flow_run.py @@ -7,7 +7,7 @@ from promptflow import PFClient from promptflow._constants import PROMPTFLOW_CONNECTIONS -from promptflow._sdk._constants import LocalStorageFilenames, RunStatus +from promptflow._sdk._constants import FlowRunProperties, LocalStorageFilenames, RunStatus from promptflow._sdk._errors import InvalidFlowError, RunExistsError, RunNotFoundError from promptflow._sdk._run_functions import create_yaml_run from promptflow._sdk._utils import _get_additional_includes @@ -680,3 +680,9 @@ def test_error_message_dump(self, pf): run_dict = run._to_dict() assert "error" in run_dict assert run_dict["error"] == exception + + def test_system_metrics_in_properties(self, pf) -> None: + run = create_run_against_multi_line_data(pf) + assert FlowRunProperties.SYSTEM_METRICS in run.properties + assert isinstance(run.properties[FlowRunProperties.SYSTEM_METRICS], dict) + assert "total_tokens" in run.properties[FlowRunProperties.SYSTEM_METRICS]