Source code for langchain_community.tools.zapier.tool

"""[已弃用]

## Zapier自然语言操作API
完整文档请参阅:https://nla.zapier.com/start/

**Zapier自然语言操作**  通过自然语言API接口,让您可以访问Zapier平台上的5000多个应用和20000多个操作。

NLA支持诸如Gmail、Salesforce、Trello、Slack、Asana、HubSpot、Google表格、Microsoft Teams等应用:https://zapier.com/apps

Zapier NLA处理所有底层API授权和自然语言 --> 底层API调用 --> 返回简化输出给LLMs的翻译。关键思想是您或您的用户通过类似于OAuth的设置窗口公开一组操作,然后可以通过REST API进行查询和执行。

NLA提供API密钥和OAuth来签署NLA API请求。

1. 服务器端(API密钥):用于快速入门、测试和生产场景,LangChain将仅使用开发者Zapier帐户中公开的操作(并将使用Zapier.com上开发者连接的帐户)
2. 用户界面(OAuth):用于生产场景,您正在部署面向最终用户的应用程序,LangChain需要访问最终用户公开的操作和Zapier.com上连接的帐户

为简洁起见,本快速入门将专注于服务器端用例。
请查看[完整文档](https://nla.zapier.com/start/)以获取面向用户的OAuth开发者支持。

通常,您会使用SequentialChain,以下是一个基本示例:

    1. 使用NLA在Gmail中查找电子邮件
    2. 使用LLMChain为(1)生成一份草稿回复
    3. 使用NLA发送草稿回复(2)给Slack中的某人通过直接消息

在下面的代码中:

```python

import os

# 从https://platform.openai.com/获取
os.environ["OPENAI_API_KEY"] = os.environ.get("OPENAI_API_KEY", "")

# 从https://nla.zapier.com/docs/authentication/获取
os.environ["ZAPIER_NLA_API_KEY"] = os.environ.get("ZAPIER_NLA_API_KEY", "")

from langchain_community.agent_toolkits import ZapierToolkit
from langchain_community.utilities.zapier import ZapierNLAWrapper

## 步骤0. 公开Gmail“查找电子邮件”和Slack“发送频道消息”操作

# 首先转到这里,登录,公开(启用)这两个操作:
#    https://nla.zapier.com/demo/start
#    -- 对于此示例,可以将所有字段保留为“让AI猜测”
# 在OAuth场景中,您将获得自己的<provider> id(而不是'demo'),您首先将用户通过该id路由

zapier = ZapierNLAWrapper()
## 要利用OAuth,您可以将值`nla_oauth_access_token`传递给ZapierNLAWrapper。如果这样做,就不需要初始化ZAPIER_NLA_API_KEY环境变量
# zapier = ZapierNLAWrapper(zapier_nla_oauth_access_token="TOKEN_HERE")
toolkit = ZapierToolkit.from_zapier_nla_wrapper(zapier)
```
"""
from typing import Any, Dict, Optional

from langchain_core._api import warn_deprecated
from langchain_core.callbacks import (
    AsyncCallbackManagerForToolRun,
    CallbackManagerForToolRun,
)
from langchain_core.pydantic_v1 import Field, root_validator
from langchain_core.tools import BaseTool

from langchain_community.tools.zapier.prompt import BASE_ZAPIER_TOOL_PROMPT
from langchain_community.utilities.zapier import ZapierNLAWrapper


[docs]class ZapierNLARunAction(BaseTool): """工具,用于执行用户暴露的特定操作。 参数: action_id: 要执行的特定操作的操作ID(来自操作列表) (必须将api_key设置与操作所有者关联) instructions: 用于使用该操作的自然语言指令字符串 (例如,“获取Mike Knoop的最新电子邮件”对应于“Gmail: 查找电子邮件”操作) params: 字典,可选。提供的任何参数将*覆盖*来自`instructions`的AI猜测 (请参阅此处的“理解AI猜测流程”: https://nla.zapier.com/docs/using-the-api#ai-guessing)""" api_wrapper: ZapierNLAWrapper = Field(default_factory=ZapierNLAWrapper) # type: ignore[arg-type] action_id: str params: Optional[dict] = None base_prompt: str = BASE_ZAPIER_TOOL_PROMPT zapier_description: str params_schema: Dict[str, str] = Field(default_factory=dict) name: str = "" description: str = "" @root_validator def set_name_description(cls, values: Dict[str, Any]) -> Dict[str, Any]: zapier_description = values["zapier_description"] params_schema = values["params_schema"] if "instructions" in params_schema: del params_schema["instructions"] # Ensure base prompt (if overridden) contains necessary input fields necessary_fields = {"{zapier_description}", "{params}"} if not all(field in values["base_prompt"] for field in necessary_fields): raise ValueError( "Your custom base Zapier prompt must contain input fields for " "{zapier_description} and {params}." ) values["name"] = zapier_description values["description"] = values["base_prompt"].format( zapier_description=zapier_description, params=str(list(params_schema.keys())), ) return values def _run( self, instructions: str, run_manager: Optional[CallbackManagerForToolRun] = None ) -> str: """使用Zapier NLA工具返回所有暴露的用户操作列表。""" warn_deprecated( since="0.0.319", message=( "This tool will be deprecated on 2023-11-17. See " "https://nla.zapier.com/sunset/ for details" ), ) return self.api_wrapper.run_as_str(self.action_id, instructions, self.params) async def _arun( self, instructions: str, run_manager: Optional[AsyncCallbackManagerForToolRun] = None, ) -> str: """使用Zapier NLA工具返回所有暴露的用户操作列表。""" warn_deprecated( since="0.0.319", message=( "This tool will be deprecated on 2023-11-17. See " "https://nla.zapier.com/sunset/ for details" ), ) return await self.api_wrapper.arun_as_str( self.action_id, instructions, self.params, )
ZapierNLARunAction.__doc__ = ( ZapierNLAWrapper.run.__doc__ + ZapierNLARunAction.__doc__ # type: ignore ) # other useful actions
[docs]class ZapierNLAListActions(BaseTool): """用户操作列表工具。""" name: str = "ZapierNLA_list_actions" description: str = BASE_ZAPIER_TOOL_PROMPT + ( "This tool returns a list of the user's exposed actions." ) api_wrapper: ZapierNLAWrapper = Field(default_factory=ZapierNLAWrapper) # type: ignore[arg-type] def _run( self, _: str = "", run_manager: Optional[CallbackManagerForToolRun] = None, ) -> str: """使用Zapier NLA工具返回所有暴露的用户操作列表。""" warn_deprecated( since="0.0.319", message=( "This tool will be deprecated on 2023-11-17. See " "https://nla.zapier.com/sunset/ for details" ), ) return self.api_wrapper.list_as_str() async def _arun( self, _: str = "", run_manager: Optional[AsyncCallbackManagerForToolRun] = None, ) -> str: """使用Zapier NLA工具返回所有暴露的用户操作列表。""" warn_deprecated( since="0.0.319", message=( "This tool will be deprecated on 2023-11-17. See " "https://nla.zapier.com/sunset/ for details" ), ) return await self.api_wrapper.alist_as_str()
ZapierNLAListActions.__doc__ = ( ZapierNLAWrapper.list.__doc__ + ZapierNLAListActions.__doc__ # type: ignore )