add yuqye(https://www.yuque.com)tools (#8960)
Co-authored-by: 佐井 <chengwu.lcw@alibaba-inc.com>pull/9529/head
parent
c379448673
commit
3f330c0b80
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 7.1 KiB |
@ -0,0 +1,19 @@
|
|||||||
|
from core.tools.errors import ToolProviderCredentialValidationError
|
||||||
|
from core.tools.provider.builtin.aliyuque.tools.base import AliYuqueTool
|
||||||
|
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
|
||||||
|
|
||||||
|
|
||||||
|
class AliYuqueProvider(BuiltinToolProviderController):
|
||||||
|
def _validate_credentials(self, credentials: dict) -> None:
|
||||||
|
token = credentials.get("token")
|
||||||
|
if not token:
|
||||||
|
raise ToolProviderCredentialValidationError("token is required")
|
||||||
|
|
||||||
|
try:
|
||||||
|
resp = AliYuqueTool.auth(token)
|
||||||
|
if resp and resp.get("data", {}).get("id"):
|
||||||
|
return
|
||||||
|
|
||||||
|
raise ToolProviderCredentialValidationError(resp)
|
||||||
|
except Exception as e:
|
||||||
|
raise ToolProviderCredentialValidationError(str(e))
|
||||||
@ -0,0 +1,50 @@
|
|||||||
|
"""
|
||||||
|
语雀客户端
|
||||||
|
"""
|
||||||
|
|
||||||
|
__author__ = "佐井"
|
||||||
|
__created__ = "2024-06-01 09:45:20"
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
import requests
|
||||||
|
|
||||||
|
|
||||||
|
class AliYuqueTool:
|
||||||
|
# yuque service url
|
||||||
|
server_url = "https://www.yuque.com"
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def auth(token):
|
||||||
|
session = requests.Session()
|
||||||
|
session.headers.update({"Accept": "application/json", "X-Auth-Token": token})
|
||||||
|
login = session.request("GET", AliYuqueTool.server_url + "/api/v2/user")
|
||||||
|
login.raise_for_status()
|
||||||
|
resp = login.json()
|
||||||
|
return resp
|
||||||
|
|
||||||
|
def request(self, method: str, token, tool_parameters: dict[str, Any], path: str) -> str:
|
||||||
|
if not token:
|
||||||
|
raise Exception("token is required")
|
||||||
|
session = requests.Session()
|
||||||
|
session.headers.update({"accept": "application/json", "X-Auth-Token": token})
|
||||||
|
new_params = {**tool_parameters}
|
||||||
|
# 找出需要替换的变量
|
||||||
|
replacements = {k: v for k, v in new_params.items() if f"{{{k}}}" in path}
|
||||||
|
|
||||||
|
# 替换 path 中的变量
|
||||||
|
for key, value in replacements.items():
|
||||||
|
path = path.replace(f"{{{key}}}", str(value))
|
||||||
|
del new_params[key] # 从 kwargs 中删除已经替换的变量
|
||||||
|
# 请求接口
|
||||||
|
if method.upper() in {"POST", "PUT"}:
|
||||||
|
session.headers.update(
|
||||||
|
{
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
response = session.request(method.upper(), self.server_url + path, json=new_params)
|
||||||
|
else:
|
||||||
|
response = session.request(method, self.server_url + path, params=new_params)
|
||||||
|
response.raise_for_status()
|
||||||
|
return response.text
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
"""
|
||||||
|
创建文档
|
||||||
|
"""
|
||||||
|
|
||||||
|
__author__ = "佐井"
|
||||||
|
__created__ = "2024-06-01 10:45:20"
|
||||||
|
|
||||||
|
from typing import Any, Union
|
||||||
|
|
||||||
|
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||||
|
from core.tools.provider.builtin.aliyuque.tools.base import AliYuqueTool
|
||||||
|
from core.tools.tool.builtin_tool import BuiltinTool
|
||||||
|
|
||||||
|
|
||||||
|
class AliYuqueCreateDocumentTool(AliYuqueTool, BuiltinTool):
|
||||||
|
def _invoke(
|
||||||
|
self, user_id: str, tool_parameters: dict[str, Any]
|
||||||
|
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
||||||
|
token = self.runtime.credentials.get("token", None)
|
||||||
|
if not token:
|
||||||
|
raise Exception("token is required")
|
||||||
|
return self.create_text_message(self.request("POST", token, tool_parameters, "/api/v2/repos/{book_id}/docs"))
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
删除文档
|
||||||
|
"""
|
||||||
|
|
||||||
|
__author__ = "佐井"
|
||||||
|
__created__ = "2024-09-17 22:04"
|
||||||
|
|
||||||
|
from typing import Any, Union
|
||||||
|
|
||||||
|
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||||
|
from core.tools.provider.builtin.aliyuque.tools.base import AliYuqueTool
|
||||||
|
from core.tools.tool.builtin_tool import BuiltinTool
|
||||||
|
|
||||||
|
|
||||||
|
class AliYuqueDeleteDocumentTool(AliYuqueTool, BuiltinTool):
|
||||||
|
def _invoke(
|
||||||
|
self, user_id: str, tool_parameters: dict[str, Any]
|
||||||
|
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
||||||
|
token = self.runtime.credentials.get("token", None)
|
||||||
|
if not token:
|
||||||
|
raise Exception("token is required")
|
||||||
|
return self.create_text_message(
|
||||||
|
self.request("DELETE", token, tool_parameters, "/api/v2/repos/{book_id}/docs/{id}")
|
||||||
|
)
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
identity:
|
||||||
|
name: aliyuque_delete_document
|
||||||
|
author: 佐井
|
||||||
|
label:
|
||||||
|
en_US: Delete Document
|
||||||
|
zh_Hans: 删除文档
|
||||||
|
icon: icon.svg
|
||||||
|
description:
|
||||||
|
human:
|
||||||
|
en_US: Delete Document
|
||||||
|
zh_Hans: 根据id删除文档
|
||||||
|
llm: Delete document.
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- name: book_id
|
||||||
|
type: number
|
||||||
|
required: true
|
||||||
|
form: llm
|
||||||
|
label:
|
||||||
|
en_US: Knowledge Base ID
|
||||||
|
zh_Hans: 知识库ID
|
||||||
|
human_description:
|
||||||
|
en_US: The unique identifier of the knowledge base where the document will be created.
|
||||||
|
zh_Hans: 文档将被创建的知识库的唯一标识。
|
||||||
|
llm_description: ID of the target knowledge base.
|
||||||
|
|
||||||
|
- name: id
|
||||||
|
type: string
|
||||||
|
required: true
|
||||||
|
form: llm
|
||||||
|
label:
|
||||||
|
en_US: Document ID or Path
|
||||||
|
zh_Hans: 文档 ID or 路径
|
||||||
|
human_description:
|
||||||
|
en_US: Document ID or path.
|
||||||
|
zh_Hans: 文档 ID or 路径。
|
||||||
|
llm_description: Document ID or path.
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
"""
|
||||||
|
获取知识库首页
|
||||||
|
"""
|
||||||
|
|
||||||
|
__author__ = "佐井"
|
||||||
|
__created__ = "2024-06-01 22:57:14"
|
||||||
|
|
||||||
|
from typing import Any, Union
|
||||||
|
|
||||||
|
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||||
|
from core.tools.provider.builtin.aliyuque.tools.base import AliYuqueTool
|
||||||
|
from core.tools.tool.builtin_tool import BuiltinTool
|
||||||
|
|
||||||
|
|
||||||
|
class AliYuqueDescribeBookIndexPageTool(AliYuqueTool, BuiltinTool):
|
||||||
|
def _invoke(
|
||||||
|
self, user_id: str, tool_parameters: dict[str, Any]
|
||||||
|
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
||||||
|
token = self.runtime.credentials.get("token", None)
|
||||||
|
if not token:
|
||||||
|
raise Exception("token is required")
|
||||||
|
return self.create_text_message(
|
||||||
|
self.request("GET", token, tool_parameters, "/api/v2/repos/{group_login}/{book_slug}/index_page")
|
||||||
|
)
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
获取知识库目录
|
||||||
|
"""
|
||||||
|
|
||||||
|
__author__ = "佐井"
|
||||||
|
__created__ = "2024-09-17 15:17:11"
|
||||||
|
|
||||||
|
from typing import Any, Union
|
||||||
|
|
||||||
|
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||||
|
from core.tools.provider.builtin.aliyuque.tools.base import AliYuqueTool
|
||||||
|
from core.tools.tool.builtin_tool import BuiltinTool
|
||||||
|
|
||||||
|
|
||||||
|
class YuqueDescribeBookTableOfContentsTool(AliYuqueTool, BuiltinTool):
|
||||||
|
def _invoke(
|
||||||
|
self, user_id: str, tool_parameters: dict[str, Any]
|
||||||
|
) -> (Union)[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
||||||
|
token = self.runtime.credentials.get("token", None)
|
||||||
|
if not token:
|
||||||
|
raise Exception("token is required")
|
||||||
|
return self.create_text_message(self.request("GET", token, tool_parameters, "/api/v2/repos/{book_id}/toc"))
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
identity:
|
||||||
|
name: aliyuque_describe_book_table_of_contents
|
||||||
|
author: 佐井
|
||||||
|
label:
|
||||||
|
en_US: Get Book's Table of Contents
|
||||||
|
zh_Hans: 获取知识库的目录
|
||||||
|
icon: icon.svg
|
||||||
|
description:
|
||||||
|
human:
|
||||||
|
en_US: Get Book's Table of Contents.
|
||||||
|
zh_Hans: 获取知识库的目录。
|
||||||
|
llm: Get Book's Table of Contents.
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- name: book_id
|
||||||
|
type: number
|
||||||
|
required: true
|
||||||
|
form: llm
|
||||||
|
label:
|
||||||
|
en_US: Book ID
|
||||||
|
zh_Hans: 知识库 ID
|
||||||
|
human_description:
|
||||||
|
en_US: Book ID.
|
||||||
|
zh_Hans: 知识库 ID。
|
||||||
|
llm_description: Book ID.
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
"""
|
||||||
|
获取文档
|
||||||
|
"""
|
||||||
|
|
||||||
|
__author__ = "佐井"
|
||||||
|
__created__ = "2024-06-01 10:45:20"
|
||||||
|
|
||||||
|
from typing import Any, Union
|
||||||
|
|
||||||
|
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||||
|
from core.tools.provider.builtin.aliyuque.tools.base import AliYuqueTool
|
||||||
|
from core.tools.tool.builtin_tool import BuiltinTool
|
||||||
|
|
||||||
|
|
||||||
|
class AliYuqueDescribeDocumentsTool(AliYuqueTool, BuiltinTool):
|
||||||
|
def _invoke(
|
||||||
|
self, user_id: str, tool_parameters: dict[str, Any]
|
||||||
|
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
||||||
|
token = self.runtime.credentials.get("token", None)
|
||||||
|
if not token:
|
||||||
|
raise Exception("token is required")
|
||||||
|
return self.create_text_message(
|
||||||
|
self.request("GET", token, tool_parameters, "/api/v2/repos/{book_id}/docs/{id}")
|
||||||
|
)
|
||||||
@ -0,0 +1,38 @@
|
|||||||
|
identity:
|
||||||
|
name: aliyuque_describe_documents
|
||||||
|
author: 佐井
|
||||||
|
label:
|
||||||
|
en_US: Get Doc Detail
|
||||||
|
zh_Hans: 获取文档详情
|
||||||
|
icon: icon.svg
|
||||||
|
|
||||||
|
description:
|
||||||
|
human:
|
||||||
|
en_US: Retrieves detailed information of a specific document identified by its ID or path within a knowledge base.
|
||||||
|
zh_Hans: 根据知识库ID和文档ID或路径获取文档详细信息。
|
||||||
|
llm: Fetches detailed doc info using ID/path from a knowledge base; supports doc lookup in Yuque.
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- name: book_id
|
||||||
|
type: number
|
||||||
|
required: true
|
||||||
|
form: llm
|
||||||
|
label:
|
||||||
|
en_US: Knowledge Base ID
|
||||||
|
zh_Hans: 知识库 ID
|
||||||
|
human_description:
|
||||||
|
en_US: Identifier for the knowledge base where the document resides.
|
||||||
|
zh_Hans: 文档所属知识库的唯一标识。
|
||||||
|
llm_description: ID of the knowledge base holding the document.
|
||||||
|
|
||||||
|
- name: id
|
||||||
|
type: string
|
||||||
|
required: true
|
||||||
|
form: llm
|
||||||
|
label:
|
||||||
|
en_US: Document ID or Path
|
||||||
|
zh_Hans: 文档 ID 或路径
|
||||||
|
human_description:
|
||||||
|
en_US: The unique identifier or path of the document to retrieve.
|
||||||
|
zh_Hans: 需要获取的文档的ID或其在知识库中的路径。
|
||||||
|
llm_description: Unique doc ID or its path for retrieval.
|
||||||
@ -0,0 +1,29 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
获取知识库目录
|
||||||
|
"""
|
||||||
|
|
||||||
|
__author__ = "佐井"
|
||||||
|
__created__ = "2024-09-17 15:17:11"
|
||||||
|
|
||||||
|
from typing import Any, Union
|
||||||
|
|
||||||
|
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||||
|
from core.tools.provider.builtin.aliyuque.tools.base import AliYuqueTool
|
||||||
|
from core.tools.tool.builtin_tool import BuiltinTool
|
||||||
|
|
||||||
|
|
||||||
|
class YuqueDescribeBookTableOfContentsTool(AliYuqueTool, BuiltinTool):
|
||||||
|
def _invoke(
|
||||||
|
self, user_id: str, tool_parameters: dict[str, Any]
|
||||||
|
) -> (Union)[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
||||||
|
token = self.runtime.credentials.get("token", None)
|
||||||
|
if not token:
|
||||||
|
raise Exception("token is required")
|
||||||
|
|
||||||
|
doc_ids = tool_parameters.get("doc_ids")
|
||||||
|
if doc_ids:
|
||||||
|
doc_ids = [int(doc_id.strip()) for doc_id in doc_ids.split(",")]
|
||||||
|
tool_parameters["doc_ids"] = doc_ids
|
||||||
|
|
||||||
|
return self.create_text_message(self.request("PUT", token, tool_parameters, "/api/v2/repos/{book_id}/toc"))
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
"""
|
||||||
|
更新文档
|
||||||
|
"""
|
||||||
|
|
||||||
|
__author__ = "佐井"
|
||||||
|
__created__ = "2024-06-19 16:50:07"
|
||||||
|
|
||||||
|
from typing import Any, Union
|
||||||
|
|
||||||
|
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||||
|
from core.tools.provider.builtin.aliyuque.tools.base import AliYuqueTool
|
||||||
|
from core.tools.tool.builtin_tool import BuiltinTool
|
||||||
|
|
||||||
|
|
||||||
|
class AliYuqueUpdateDocumentTool(AliYuqueTool, BuiltinTool):
|
||||||
|
def _invoke(
|
||||||
|
self, user_id: str, tool_parameters: dict[str, Any]
|
||||||
|
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
||||||
|
token = self.runtime.credentials.get("token", None)
|
||||||
|
if not token:
|
||||||
|
raise Exception("token is required")
|
||||||
|
return self.create_text_message(
|
||||||
|
self.request("PUT", token, tool_parameters, "/api/v2/repos/{book_id}/docs/{id}")
|
||||||
|
)
|
||||||
Loading…
Reference in New Issue