| """Interface with the LangChain Hub.""" |
|
|
| from __future__ import annotations |
|
|
| import json |
| from typing import Any, Optional, Sequence |
|
|
| from langchain_core.load.dump import dumps |
| from langchain_core.load.load import loads |
| from langchain_core.prompts import BasePromptTemplate |
|
|
|
|
| def _get_client( |
| api_key: Optional[str] = None, |
| api_url: Optional[str] = None, |
| ) -> Any: |
| try: |
| from langsmith import Client as LangSmithClient |
|
|
| ls_client = LangSmithClient(api_url, api_key=api_key) |
| if hasattr(ls_client, "push_prompt") and hasattr(ls_client, "pull_prompt"): |
| return ls_client |
| else: |
| from langchainhub import Client as LangChainHubClient |
|
|
| return LangChainHubClient(api_url, api_key=api_key) |
| except ImportError: |
| try: |
| from langchainhub import Client as LangChainHubClient |
|
|
| return LangChainHubClient(api_url, api_key=api_key) |
| except ImportError as e: |
| raise ImportError( |
| "Could not import langsmith or langchainhub (deprecated)," |
| "please install with `pip install langsmith`." |
| ) from e |
|
|
|
|
| def push( |
| repo_full_name: str, |
| object: Any, |
| *, |
| api_url: Optional[str] = None, |
| api_key: Optional[str] = None, |
| parent_commit_hash: Optional[str] = None, |
| new_repo_is_public: bool = False, |
| new_repo_description: Optional[str] = None, |
| readme: Optional[str] = None, |
| tags: Optional[Sequence[str]] = None, |
| ) -> str: |
| """ |
| Push an object to the hub and returns the URL it can be viewed at in a browser. |
| |
| :param repo_full_name: The full name of the prompt to push to in the format of |
| `owner/prompt_name` or `prompt_name`. |
| :param object: The LangChain to serialize and push to the hub. |
| :param api_url: The URL of the LangChain Hub API. Defaults to the hosted API service |
| if you have an api key set, or a localhost instance if not. |
| :param api_key: The API key to use to authenticate with the LangChain Hub API. |
| :param parent_commit_hash: The commit hash of the parent commit to push to. Defaults |
| to the latest commit automatically. |
| :param new_repo_is_public: Whether the prompt should be public. Defaults to |
| False (Private by default). |
| :param new_repo_description: The description of the prompt. Defaults to an empty |
| string. |
| """ |
| client = _get_client(api_key=api_key, api_url=api_url) |
|
|
| |
| if hasattr(client, "push_prompt"): |
| return client.push_prompt( |
| repo_full_name, |
| object=object, |
| parent_commit_hash=parent_commit_hash, |
| is_public=new_repo_is_public, |
| description=new_repo_description, |
| readme=readme, |
| tags=tags, |
| ) |
|
|
| |
| manifest_json = dumps(object) |
| message = client.push( |
| repo_full_name, |
| manifest_json, |
| parent_commit_hash=parent_commit_hash, |
| new_repo_is_public=new_repo_is_public, |
| new_repo_description=new_repo_description, |
| ) |
| return message |
|
|
|
|
| def pull( |
| owner_repo_commit: str, |
| *, |
| include_model: Optional[bool] = None, |
| api_url: Optional[str] = None, |
| api_key: Optional[str] = None, |
| ) -> Any: |
| """ |
| Pull an object from the hub and returns it as a LangChain object. |
| |
| :param owner_repo_commit: The full name of the prompt to pull from in the format of |
| `owner/prompt_name:commit_hash` or `owner/prompt_name` |
| or just `prompt_name` if it's your own prompt. |
| :param api_url: The URL of the LangChain Hub API. Defaults to the hosted API service |
| if you have an api key set, or a localhost instance if not. |
| :param api_key: The API key to use to authenticate with the LangChain Hub API. |
| """ |
| client = _get_client(api_key=api_key, api_url=api_url) |
|
|
| |
| if hasattr(client, "pull_prompt"): |
| response = client.pull_prompt(owner_repo_commit, include_model=include_model) |
| return response |
|
|
| |
| if hasattr(client, "pull_repo"): |
| |
| res_dict = client.pull_repo(owner_repo_commit) |
| obj = loads(json.dumps(res_dict["manifest"])) |
| if isinstance(obj, BasePromptTemplate): |
| if obj.metadata is None: |
| obj.metadata = {} |
| obj.metadata["lc_hub_owner"] = res_dict["owner"] |
| obj.metadata["lc_hub_repo"] = res_dict["repo"] |
| obj.metadata["lc_hub_commit_hash"] = res_dict["commit_hash"] |
| return obj |
|
|
| |
| resp: str = client.pull(owner_repo_commit) |
| return loads(resp) |
|
|