update branch name in gha (#274)

harrison/promot-mrkl
Harrison Chase 2 years ago committed by GitHub
parent 48b093823e
commit 3c1c7ba672
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -2,7 +2,7 @@ name: lint
on: on:
push: push:
branches: [main] branches: [master]
pull_request: pull_request:
env: env:

@ -2,7 +2,7 @@ name: test
on: on:
push: push:
branches: [main] branches: [master]
pull_request: pull_request:
env: env:

@ -3,8 +3,8 @@
from langchain.agents import MRKLChain, ReActChain, SelfAskWithSearchChain from langchain.agents import MRKLChain, ReActChain, SelfAskWithSearchChain
from langchain.chains import ( from langchain.chains import (
ConversationChain, ConversationChain,
LLMChain,
LLMBashChain, LLMBashChain,
LLMChain,
LLMMathChain, LLMMathChain,
PALChain, PALChain,
QAWithSourcesChain, QAWithSourcesChain,

@ -1,3 +1,4 @@
"""Chain that interprets a prompt and executes bash code to perform bash operations."""
from typing import Dict, List from typing import Dict, List
from pydantic import BaseModel, Extra from pydantic import BaseModel, Extra
@ -5,9 +6,9 @@ from pydantic import BaseModel, Extra
from langchain.chains.base import Chain from langchain.chains.base import Chain
from langchain.chains.llm import LLMChain from langchain.chains.llm import LLMChain
from langchain.chains.llm_bash.prompt import PROMPT from langchain.chains.llm_bash.prompt import PROMPT
from langchain.utilities.bash import BashProcess
from langchain.input import print_text from langchain.input import print_text
from langchain.llms.base import LLM from langchain.llms.base import LLM
from langchain.utilities.bash import BashProcess
class LLMBashChain(Chain, BaseModel): class LLMBashChain(Chain, BaseModel):
@ -47,7 +48,7 @@ class LLMBashChain(Chain, BaseModel):
""" """
return [self.output_key] return [self.output_key]
def _call(self, inputs: Dict[str, str]) -> Dict[str, Dict[str, list[str]]]: def _call(self, inputs: Dict[str, str]) -> Dict[str, str]:
llm_executor = LLMChain(prompt=PROMPT, llm=self.llm) llm_executor = LLMChain(prompt=PROMPT, llm=self.llm)
bash_executor = BashProcess() bash_executor = BashProcess()
if self.verbose: if self.verbose:
@ -60,7 +61,7 @@ class LLMBashChain(Chain, BaseModel):
t = t.strip() t = t.strip()
if t.startswith("```bash"): if t.startswith("```bash"):
# Split the string into a list of substrings # Split the string into a list of substrings
command_list = t.split('\n') command_list = t.split("\n")
print(command_list) print(command_list)
# Remove the first and last substrings # Remove the first and last substrings
@ -73,5 +74,4 @@ class LLMBashChain(Chain, BaseModel):
else: else:
raise ValueError(f"unknown format from LLM: {t}") raise ValueError(f"unknown format from LLM: {t}")
answer = {"commands": command_list, "output": output} return {self.output_key: output}
return {self.output_key: answer}

@ -1,6 +1,6 @@
"""General utilities."""
from langchain.utilities.bash import BashProcess from langchain.utilities.bash import BashProcess
__all__ = [ __all__ = [
'BashProcess', "BashProcess",
] ]

@ -1,14 +1,17 @@
"""Wrapper around subprocess to run commands."""
import subprocess import subprocess
from typing import Dict, List, Union from typing import List
class BashProcess: class BashProcess:
"""Executes bash commands and returns the output.""" """Executes bash commands and returns the output."""
def __init__(self, strip_newlines: bool = False): def __init__(self, strip_newlines: bool = False):
"""Initialize with stripping newlines."""
self.strip_newlines = strip_newlines self.strip_newlines = strip_newlines
def run(self, commands: List[str]) -> str:
def run(self, commands: List[str]) -> Dict[str, Union[bool, list[str]]]: """Run commands and return final output."""
outputs = [] outputs = []
for command in commands: for command in commands:
try: try:
@ -17,7 +20,5 @@ class BashProcess:
output = output.strip() output = output.strip()
outputs.append(output) outputs.append(output)
except subprocess.CalledProcessError as error: except subprocess.CalledProcessError as error:
outputs.append(str(error)) return str(error)
return {"success": False, "outputs": outputs} return outputs[-1]
return {"success": True, "outputs": outputs}

@ -10,9 +10,9 @@ from tests.unit_tests.llms.fake_llm import FakeLLM
@pytest.fixture @pytest.fixture
def fake_llm_bash_chain() -> LLMBashChain: def fake_llm_bash_chain() -> LLMBashChain:
"""Fake LLM Bash chain for testing.""" """Fake LLM Bash chain for testing."""
queries = { question = "Please write a bash script that prints 'Hello World' to the console."
_PROMPT_TEMPLATE.format(question="Please write a bash script that prints 'Hello World' to the console."): "```bash\nexpr 1 + 1\n```", prompt = _PROMPT_TEMPLATE.format(question=question)
} queries = {prompt: "```bash\nexpr 1 + 1\n```"}
fake_llm = FakeLLM(queries=queries) fake_llm = FakeLLM(queries=queries)
return LLMBashChain(llm=fake_llm, input_key="q", output_key="a") return LLMBashChain(llm=fake_llm, input_key="q", output_key="a")
@ -21,4 +21,4 @@ def test_simple_question(fake_llm_bash_chain: LLMBashChain) -> None:
"""Test simple question that should not need python.""" """Test simple question that should not need python."""
question = "Please write a bash script that prints 'Hello World' to the console." question = "Please write a bash script that prints 'Hello World' to the console."
output = fake_llm_bash_chain.run(question) output = fake_llm_bash_chain.run(question)
assert output == {'commands': ['expr 1 + 1'], 'output': {'outputs': ['2\n'], 'success': True}} assert output == "2\n"

@ -1,22 +1,25 @@
"""Test the bash utility."""
import subprocess import subprocess
from pathlib import Path from pathlib import Path
from langchain.utilities.bash import BashProcess from langchain.utilities.bash import BashProcess
def test_pwd_command() -> None: def test_pwd_command() -> None:
"""Test correct functionality.""" """Test correct functionality."""
session = BashProcess() session = BashProcess()
commands = ["pwd"] commands = ["pwd"]
output = session.run(commands) output = session.run(commands)
print(output)
assert output["outputs"] == [subprocess.check_output("pwd", shell=True).decode()] assert output == subprocess.check_output("pwd", shell=True).decode()
def test_incorrect_command() -> None: def test_incorrect_command() -> None:
"""Test handling of incorrect command.""" """Test handling of incorrect command."""
session = BashProcess() session = BashProcess()
output = session.run(["invalid_command"]) output = session.run(["invalid_command"])
assert output["success"] is False assert output == "Command 'invalid_command' returned non-zero exit status 127."
def test_create_directory_and_files(tmp_path: Path) -> None: def test_create_directory_and_files(tmp_path: Path) -> None:
"""Test creation of a directory and files in a temporary directory.""" """Test creation of a directory and files in a temporary directory."""
@ -31,14 +34,12 @@ def test_create_directory_and_files(tmp_path: Path) -> None:
f"touch {temp_dir}/file1.txt", f"touch {temp_dir}/file1.txt",
f"touch {temp_dir}/file2.txt", f"touch {temp_dir}/file2.txt",
f"echo 'hello world' > {temp_dir}/file2.txt", f"echo 'hello world' > {temp_dir}/file2.txt",
f"cat {temp_dir}/file2.txt" f"cat {temp_dir}/file2.txt",
] ]
output = session.run(commands) output = session.run(commands)
assert output["success"] is True assert output == "hello world"
assert output["outputs"][-1] == "hello world"
# check that the files were created in the temporary directory # check that the files were created in the temporary directory
output = session.run([f"ls {temp_dir}"]) output = session.run([f"ls {temp_dir}"])
assert output["success"] is True assert output == "file1.txt\nfile2.txt"
assert output["outputs"] == ["file1.txt\nfile2.txt"]
Loading…
Cancel
Save