mirror of
https://github.com/hwchase17/langchain.git
synced 2025-09-16 15:04:13 +00:00
BashChain (#260)
Love the project, a ton of fun! I think the PR is pretty self-explanatory, happy to make any changes! I am working on using it in an `LLMBashChain` and may update as that progresses. Co-authored-by: Harrison Chase <hw.chase.17@gmail.com>
This commit is contained in:
44
tests/unit_tests/chains/test_bash.py
Normal file
44
tests/unit_tests/chains/test_bash.py
Normal file
@@ -0,0 +1,44 @@
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
from langchain.utilities.bash import BashProcess
|
||||
|
||||
def test_pwd_command() -> None:
|
||||
"""Test correct functionality."""
|
||||
session = BashProcess()
|
||||
commands = ["pwd"]
|
||||
output = session.run(commands)
|
||||
print(output)
|
||||
|
||||
assert output["outputs"] == [subprocess.check_output("pwd", shell=True).decode()]
|
||||
|
||||
def test_incorrect_command() -> None:
|
||||
"""Test handling of incorrect command."""
|
||||
session = BashProcess()
|
||||
output = session.run(["invalid_command"])
|
||||
assert output["success"] is False
|
||||
|
||||
def test_create_directory_and_files(tmp_path: Path) -> None:
|
||||
"""Test creation of a directory and files in a temporary directory."""
|
||||
session = BashProcess(strip_newlines=True)
|
||||
|
||||
# create a subdirectory in the temporary directory
|
||||
temp_dir = tmp_path / "test_dir"
|
||||
temp_dir.mkdir()
|
||||
|
||||
# run the commands in the temporary directory
|
||||
commands = [
|
||||
f"touch {temp_dir}/file1.txt",
|
||||
f"touch {temp_dir}/file2.txt",
|
||||
f"echo 'hello world' > {temp_dir}/file2.txt",
|
||||
f"cat {temp_dir}/file2.txt"
|
||||
]
|
||||
|
||||
output = session.run(commands)
|
||||
assert output["success"] is True
|
||||
assert output["outputs"][-1] == "hello world"
|
||||
|
||||
# check that the files were created in the temporary directory
|
||||
output = session.run([f"ls {temp_dir}"])
|
||||
assert output["success"] is True
|
||||
assert output["outputs"] == ["file1.txt\nfile2.txt"]
|
24
tests/unit_tests/chains/test_llm_bash.py
Normal file
24
tests/unit_tests/chains/test_llm_bash.py
Normal file
@@ -0,0 +1,24 @@
|
||||
"""Test LLM Bash functionality."""
|
||||
|
||||
import pytest
|
||||
|
||||
from langchain.chains.llm_bash.base import LLMBashChain
|
||||
from langchain.chains.llm_bash.prompt import _PROMPT_TEMPLATE
|
||||
from tests.unit_tests.llms.fake_llm import FakeLLM
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def fake_llm_bash_chain() -> LLMBashChain:
|
||||
"""Fake LLM Bash chain for testing."""
|
||||
queries = {
|
||||
_PROMPT_TEMPLATE.format(question="Please write a bash script that prints 'Hello World' to the console."): "```bash\nexpr 1 + 1\n```",
|
||||
}
|
||||
fake_llm = FakeLLM(queries=queries)
|
||||
return LLMBashChain(llm=fake_llm, input_key="q", output_key="a")
|
||||
|
||||
|
||||
def test_simple_question(fake_llm_bash_chain: LLMBashChain) -> None:
|
||||
"""Test simple question that should not need python."""
|
||||
question = "Please write a bash script that prints 'Hello World' to the console."
|
||||
output = fake_llm_bash_chain.run(question)
|
||||
assert output == {'commands': ['expr 1 + 1'], 'output': {'outputs': ['2\n'], 'success': True}}
|
Reference in New Issue
Block a user