mirror of https://github.com/hwchase17/langchain
Hub Runnable (#11946)
Adds `langchain.runnables.hub.HubRunnable` for pulling configurable objects from the hubpull/11989/head
parent
9e24626e87
commit
c149954cc5
@ -0,0 +1,31 @@
|
|||||||
|
from typing import Any, Optional
|
||||||
|
|
||||||
|
from langchain.schema.runnable.base import Input, Output, RunnableBinding
|
||||||
|
|
||||||
|
|
||||||
|
class HubRunnable(RunnableBinding[Input, Output]):
|
||||||
|
"""
|
||||||
|
An instance of a runnable stored in the LangChain Hub.
|
||||||
|
"""
|
||||||
|
|
||||||
|
owner_repo_commit: str
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
owner_repo_commit: str,
|
||||||
|
*,
|
||||||
|
api_url: Optional[str] = None,
|
||||||
|
api_key: Optional[str] = None,
|
||||||
|
**kwargs: Any,
|
||||||
|
) -> None:
|
||||||
|
from langchain.hub import pull
|
||||||
|
|
||||||
|
pulled = pull(owner_repo_commit, api_url=api_url, api_key=api_key)
|
||||||
|
super_kwargs = {
|
||||||
|
"kwargs": {},
|
||||||
|
"config": {},
|
||||||
|
**kwargs,
|
||||||
|
"bound": pulled,
|
||||||
|
"owner_repo_commit": owner_repo_commit,
|
||||||
|
}
|
||||||
|
super().__init__(**super_kwargs)
|
@ -0,0 +1,72 @@
|
|||||||
|
from typing import Any
|
||||||
|
from unittest.mock import Mock, patch
|
||||||
|
|
||||||
|
from langchain.prompts import ChatPromptTemplate
|
||||||
|
from langchain.runnables.hub import HubRunnable
|
||||||
|
from langchain.schema.runnable.base import ConfigurableField
|
||||||
|
|
||||||
|
|
||||||
|
@patch("langchain.hub.pull")
|
||||||
|
def test_hub_runnable(mock_pull: Mock) -> None:
|
||||||
|
mock_pull.return_value = ChatPromptTemplate.from_messages(
|
||||||
|
[("system", "a"), ("user", "b")]
|
||||||
|
)
|
||||||
|
|
||||||
|
basic: HubRunnable = HubRunnable("efriis/my-prompt")
|
||||||
|
bound = basic.bound
|
||||||
|
assert isinstance(bound, ChatPromptTemplate)
|
||||||
|
assert len(bound.messages) == 2
|
||||||
|
|
||||||
|
|
||||||
|
repo_dict = {
|
||||||
|
"efriis/my-prompt-1": ChatPromptTemplate.from_messages(
|
||||||
|
[("system", "a"), ("user", "1")]
|
||||||
|
),
|
||||||
|
"efriis/my-prompt-2": ChatPromptTemplate.from_messages(
|
||||||
|
[("system", "a"), ("user", "2")]
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def repo_lookup(owner_repo_commit: str, **kwargs: Any) -> ChatPromptTemplate:
|
||||||
|
return repo_dict[owner_repo_commit]
|
||||||
|
|
||||||
|
|
||||||
|
@patch("langchain.hub.pull")
|
||||||
|
def test_hub_runnable_configurable_alternative(mock_pull: Mock) -> None:
|
||||||
|
mock_pull.side_effect = repo_lookup
|
||||||
|
|
||||||
|
original: HubRunnable[Any, Any] = HubRunnable("efriis/my-prompt-1")
|
||||||
|
obj_a1 = original.configurable_alternatives(
|
||||||
|
ConfigurableField(id="owner_repo_commit", name="Hub ID"),
|
||||||
|
default_key="a1",
|
||||||
|
a2=HubRunnable("efriis/my-prompt-2"),
|
||||||
|
)
|
||||||
|
|
||||||
|
obj_a2 = obj_a1.with_config(configurable={"owner_repo_commit": "a2"})
|
||||||
|
|
||||||
|
templated = obj_a1.invoke({})
|
||||||
|
message_a1 = templated.messages[1]
|
||||||
|
assert message_a1.content == "1"
|
||||||
|
|
||||||
|
templated_2 = obj_a2.invoke({})
|
||||||
|
message_a2 = templated_2.messages[1]
|
||||||
|
assert message_a2.content == "2"
|
||||||
|
|
||||||
|
|
||||||
|
@patch("langchain.hub.pull")
|
||||||
|
def test_hub_runnable_configurable_fields(mock_pull: Mock) -> None:
|
||||||
|
mock_pull.side_effect = repo_lookup
|
||||||
|
|
||||||
|
original: HubRunnable[Any, Any] = HubRunnable("efriis/my-prompt-1")
|
||||||
|
obj_configurable = original.configurable_fields(
|
||||||
|
owner_repo_commit=ConfigurableField(id="owner_repo_commit", name="Hub ID"),
|
||||||
|
)
|
||||||
|
|
||||||
|
templated_1 = obj_configurable.invoke({})
|
||||||
|
assert templated_1.messages[1].content == "1"
|
||||||
|
|
||||||
|
templated_2 = obj_configurable.with_config(
|
||||||
|
configurable={"owner_repo_commit": "efriis/my-prompt-2"}
|
||||||
|
).invoke({})
|
||||||
|
assert templated_2.messages[1].content == "2"
|
Loading…
Reference in New Issue