APIGenExecutionChecker¶
Executes the generated function calls.
This step checks if a given answer from a model as generated by APIGenGenerator
    can be executed against the given library (given by libpath, which is a string
    pointing to a python .py file with functions).
Attributes¶
- 
libpath: The path to the library where we will retrieve the functions. It can also point to a folder with the functions. In this case, the folder layout should be a folder with .py files, each containing a single function, the name of the function being the same as the filename. 
- 
check_is_dangerous: Bool to exclude some potentially dangerous functions, it contains some heuristics found while testing. This functions can run subprocesses, deal with the OS, or have other potentially dangerous operations. Defaults to True. 
Input & Output Columns¶
graph TD
    subgraph Dataset
        subgraph Columns
            ICOL0[answers]
        end
        subgraph New columns
            OCOL0[keep_row_after_execution_check]
            OCOL1[execution_result]
        end
    end
    subgraph APIGenExecutionChecker
        StepInput[Input Columns: answers]
        StepOutput[Output Columns: keep_row_after_execution_check, execution_result]
    end
    ICOL0 --> StepInput
    StepOutput --> OCOL0
    StepOutput --> OCOL1
    StepInput --> StepOutput
Inputs¶
- answers (str): List with arguments to be passed to the function, dumped as a string from a list of dictionaries. Should be loaded usingjson.loads.
Outputs¶
- 
keep_row_after_execution_check ( bool): Whether the function should be kept or not.
- 
execution_result ( str): The result from executing the function.
Examples¶
Execute a function from a given library with the answer from an LLM¶
from distilabel.steps.tasks import APIGenExecutionChecker
# For the libpath you can use as an example the file at the tests folder:
# ../distilabel/tests/unit/steps/tasks/apigen/_sample_module.py
task = APIGenExecutionChecker(
    libpath="../distilabel/tests/unit/steps/tasks/apigen/_sample_module.py",
)
task.load()
res = next(
    task.process(
        [
            {
                "answers": [
                    {
                        "arguments": {
                            "initial_velocity": 0.2,
                            "acceleration": 0.1,
                            "time": 0.5,
                        },
                        "name": "final_velocity",
                    }
                ],
            }
        ]
    )
)
res
#[{'answers': [{'arguments': {'initial_velocity': 0.2, 'acceleration': 0.1, 'time': 0.5}, 'name': 'final_velocity'}], 'keep_row_after_execution_check': True, 'execution_result': ['0.25']}]