mirror of
https://github.com/hwchase17/langchain.git
synced 2025-08-01 17:13:22 +00:00
update branch name in gha (#274)
This commit is contained in:
parent
48b093823e
commit
3c1c7ba672
2
.github/workflows/lint.yml
vendored
2
.github/workflows/lint.yml
vendored
@ -2,7 +2,7 @@ name: lint
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [main]
|
branches: [master]
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
|
2
.github/workflows/test.yml
vendored
2
.github/workflows/test.yml
vendored
@ -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…
Reference in New Issue
Block a user