feat(Tools): Add Feishu multi-dimensional table operation function (#5213)
Co-authored-by: 黎斌 <libin.23@bytedance.com> Co-authored-by: takatost <takatost@gmail.com>pull/5228/head
parent
e7752e8135
commit
8d1386df0f
@ -0,0 +1,47 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="240px" height="240px" viewBox="0 0 240 240" enable-background="new 0 0 240 240" xml:space="preserve"> <image id="image0" width="240" height="240" x="0" y="0"
|
||||||
|
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAADwCAMAAAAJixmgAAAAIGNIUk0AAHomAACAhAAA+gAAAIDo
|
||||||
|
AAB1MAAA6mAAADqYAAAXcJy6UTwAAAINUExURQAAAJ9g6qNg6qRd6KNe6aVg6J9g6p9g359a6qRd
|
||||||
|
66Ne66Re66Rd66Rd66Re7Z9g559g76Ne7aRe6qJd76Fe66Ne66Re66Vd7KNc6aRe66Nd66Re7KRd
|
||||||
|
66Nc6p9g36Re7KRf7KRe7KNe7KNc76Va6qVd66Ne66Re66Nd6qRb6KRe66Zd66Ve7KJd6aNe66Fe
|
||||||
|
7KRd6p9Y56Re66Je6qRb6qNe66Re7KNc56Jf6qNe6qRe6qFe6KNe6qRf66Rf66Ne7KNe6qRe6qRd
|
||||||
|
66Rd7KFe6aNc6qNe6qJd7Z9b6KNd659Z7KNd66Ne6aRe66Re7KNc66Nd66Ne66Jd6qNe6qNc6aJd
|
||||||
|
6qNd6qRe66Jd7KFe6qJe66Re6qNe66Jd66Jd6aRd6qRd66Va759V6qVd6qFe56Ne6KJd6KRe66Zj
|
||||||
|
67eB79Gu9eLM+OjX+uXS+dSz9bJ37s6p9LV87q9y7de49vn1/f///9q99qlo7NGu9Kxt7d/H+Pz5
|
||||||
|
/vz6/qdj68CQ8e7h+/Pq/Maa8rqG8NzC9/Pr/Myk8+DH+OXR+cyk9Pn1/ujW+u3g+7iB7+vc+r2L
|
||||||
|
8N3C9//+//bw/cmf87uG8OPM+ebR+axt7Muk8/Dm/Mif8/n0/c+p9MOV8fHm++7g+/n0/vbv/bqG
|
||||||
|
78CQ8Kxu7cCR8ePM+LqH8MCP8bV87+LM+bqF8Muk9OLL+NSy9bqF75VHsr4AAABndFJOUwAYSHCA
|
||||||
|
WDAQMJfn57+PVyAQb98/gO/mllDPr1/ebwiHn+6eLzCvf/63OL4/xkfOT58g9odfZ65Aj3fHT2+X
|
||||||
|
j3f3z7efgEjPRzi3KKd/7sZAv+6fri+P3rY3X77G5j9oxn4fGGCAbzcMFjqxAAAAAWJLR0R1qGqY
|
||||||
|
+wAAAAd0SU1FB+gGDQkfBmABjhYAAAXYSURBVHja7d35WxtFGAfwbUGDtRWKilAwFg+2VHtwqa31
|
||||||
|
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" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.7 KiB |
@ -0,0 +1,8 @@
|
|||||||
|
from core.tools.provider.builtin.feishu_base.tools.get_tenant_access_token import GetTenantAccessTokenTool
|
||||||
|
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
|
||||||
|
|
||||||
|
|
||||||
|
class FeishuBaseProvider(BuiltinToolProviderController):
|
||||||
|
def _validate_credentials(self, credentials: dict) -> None:
|
||||||
|
GetTenantAccessTokenTool()
|
||||||
|
pass
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
identity:
|
||||||
|
author: Doug Lea
|
||||||
|
name: feishu_base
|
||||||
|
label:
|
||||||
|
en_US: Feishu Base
|
||||||
|
zh_Hans: 飞书多维表格
|
||||||
|
description:
|
||||||
|
en_US: Feishu Base
|
||||||
|
zh_Hans: 飞书多维表格
|
||||||
|
icon: icon.svg
|
||||||
|
tags:
|
||||||
|
- social
|
||||||
|
- productivity
|
||||||
|
credentials_for_provider:
|
||||||
@ -0,0 +1,52 @@
|
|||||||
|
import json
|
||||||
|
from typing import Any, Union
|
||||||
|
|
||||||
|
import httpx
|
||||||
|
|
||||||
|
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||||
|
from core.tools.tool.builtin_tool import BuiltinTool
|
||||||
|
|
||||||
|
|
||||||
|
class AddBaseRecordTool(BuiltinTool):
|
||||||
|
def _invoke(self, user_id: str, tool_parameters: dict[str, Any]
|
||||||
|
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
||||||
|
|
||||||
|
url = "https://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables/{table_id}/records"
|
||||||
|
|
||||||
|
access_token = tool_parameters.get('Authorization', '')
|
||||||
|
if not access_token:
|
||||||
|
return self.create_text_message('Invalid parameter access_token')
|
||||||
|
|
||||||
|
app_token = tool_parameters.get('app_token', '')
|
||||||
|
if not app_token:
|
||||||
|
return self.create_text_message('Invalid parameter app_token')
|
||||||
|
|
||||||
|
table_id = tool_parameters.get('table_id', '')
|
||||||
|
if not table_id:
|
||||||
|
return self.create_text_message('Invalid parameter table_id')
|
||||||
|
|
||||||
|
fields = tool_parameters.get('fields', '')
|
||||||
|
if not fields:
|
||||||
|
return self.create_text_message('Invalid parameter fields')
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Authorization': f"Bearer {access_token}",
|
||||||
|
}
|
||||||
|
|
||||||
|
params = {}
|
||||||
|
payload = {
|
||||||
|
"fields": json.loads(fields)
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
res = httpx.post(url.format(app_token=app_token, table_id=table_id), headers=headers, params=params,
|
||||||
|
json=payload, timeout=30)
|
||||||
|
res_json = res.json()
|
||||||
|
if res.is_success:
|
||||||
|
return self.create_text_message(text=json.dumps(res_json))
|
||||||
|
else:
|
||||||
|
return self.create_text_message(
|
||||||
|
f"Failed to add base record, status code: {res.status_code}, response: {res.text}")
|
||||||
|
except Exception as e:
|
||||||
|
return self.create_text_message("Failed to add base record. {}".format(e))
|
||||||
@ -0,0 +1,43 @@
|
|||||||
|
import json
|
||||||
|
from typing import Any, Union
|
||||||
|
|
||||||
|
import httpx
|
||||||
|
|
||||||
|
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||||
|
from core.tools.tool.builtin_tool import BuiltinTool
|
||||||
|
|
||||||
|
|
||||||
|
class CreateBaseTool(BuiltinTool):
|
||||||
|
def _invoke(self, user_id: str, tool_parameters: dict[str, Any]
|
||||||
|
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
||||||
|
|
||||||
|
url = "https://open.feishu.cn/open-apis/bitable/v1/apps"
|
||||||
|
|
||||||
|
access_token = tool_parameters.get('Authorization', '')
|
||||||
|
if not access_token:
|
||||||
|
return self.create_text_message('Invalid parameter access_token')
|
||||||
|
|
||||||
|
name = tool_parameters.get('name', '')
|
||||||
|
folder_token = tool_parameters.get('folder_token', '')
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Authorization': f"Bearer {access_token}",
|
||||||
|
}
|
||||||
|
|
||||||
|
params = {}
|
||||||
|
payload = {
|
||||||
|
"name": name,
|
||||||
|
"folder_token": folder_token
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
res = httpx.post(url, headers=headers, params=params, json=payload, timeout=30)
|
||||||
|
res_json = res.json()
|
||||||
|
if res.is_success:
|
||||||
|
return self.create_text_message(text=json.dumps(res_json))
|
||||||
|
else:
|
||||||
|
return self.create_text_message(
|
||||||
|
f"Failed to create base, status code: {res.status_code}, response: {res.text}")
|
||||||
|
except Exception as e:
|
||||||
|
return self.create_text_message("Failed to create base. {}".format(e))
|
||||||
@ -0,0 +1,52 @@
|
|||||||
|
import json
|
||||||
|
from typing import Any, Union
|
||||||
|
|
||||||
|
import httpx
|
||||||
|
|
||||||
|
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||||
|
from core.tools.tool.builtin_tool import BuiltinTool
|
||||||
|
|
||||||
|
|
||||||
|
class CreateBaseTableTool(BuiltinTool):
|
||||||
|
def _invoke(self, user_id: str, tool_parameters: dict[str, Any]
|
||||||
|
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
||||||
|
|
||||||
|
url = "https://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables"
|
||||||
|
|
||||||
|
access_token = tool_parameters.get('Authorization', '')
|
||||||
|
if not access_token:
|
||||||
|
return self.create_text_message('Invalid parameter access_token')
|
||||||
|
|
||||||
|
app_token = tool_parameters.get('app_token', '')
|
||||||
|
if not app_token:
|
||||||
|
return self.create_text_message('Invalid parameter app_token')
|
||||||
|
|
||||||
|
name = tool_parameters.get('name', '')
|
||||||
|
|
||||||
|
fields = tool_parameters.get('fields', '')
|
||||||
|
if not fields:
|
||||||
|
return self.create_text_message('Invalid parameter fields')
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Authorization': f"Bearer {access_token}",
|
||||||
|
}
|
||||||
|
|
||||||
|
params = {}
|
||||||
|
payload = {
|
||||||
|
"table": {
|
||||||
|
"name": name,
|
||||||
|
"fields": json.loads(fields)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
res = httpx.post(url.format(app_token=app_token), headers=headers, params=params, json=payload, timeout=30)
|
||||||
|
res_json = res.json()
|
||||||
|
if res.is_success:
|
||||||
|
return self.create_text_message(text=json.dumps(res_json))
|
||||||
|
else:
|
||||||
|
return self.create_text_message(
|
||||||
|
f"Failed to create base table, status code: {res.status_code}, response: {res.text}")
|
||||||
|
except Exception as e:
|
||||||
|
return self.create_text_message("Failed to create base table. {}".format(e))
|
||||||
@ -0,0 +1,52 @@
|
|||||||
|
import json
|
||||||
|
from typing import Any, Union
|
||||||
|
|
||||||
|
import httpx
|
||||||
|
|
||||||
|
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||||
|
from core.tools.tool.builtin_tool import BuiltinTool
|
||||||
|
|
||||||
|
|
||||||
|
class DeleteBaseRecordsTool(BuiltinTool):
|
||||||
|
def _invoke(self, user_id: str, tool_parameters: dict[str, Any]
|
||||||
|
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
||||||
|
|
||||||
|
url = "https://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables/{table_id}/records/batch_delete"
|
||||||
|
|
||||||
|
access_token = tool_parameters.get('Authorization', '')
|
||||||
|
if not access_token:
|
||||||
|
return self.create_text_message('Invalid parameter access_token')
|
||||||
|
|
||||||
|
app_token = tool_parameters.get('app_token', '')
|
||||||
|
if not app_token:
|
||||||
|
return self.create_text_message('Invalid parameter app_token')
|
||||||
|
|
||||||
|
table_id = tool_parameters.get('table_id', '')
|
||||||
|
if not table_id:
|
||||||
|
return self.create_text_message('Invalid parameter table_id')
|
||||||
|
|
||||||
|
record_ids = tool_parameters.get('record_ids', '')
|
||||||
|
if not record_ids:
|
||||||
|
return self.create_text_message('Invalid parameter record_ids')
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Authorization': f"Bearer {access_token}",
|
||||||
|
}
|
||||||
|
|
||||||
|
params = {}
|
||||||
|
payload = {
|
||||||
|
"records": json.loads(record_ids)
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
res = httpx.post(url.format(app_token=app_token, table_id=table_id), headers=headers, params=params,
|
||||||
|
json=payload, timeout=30)
|
||||||
|
res_json = res.json()
|
||||||
|
if res.is_success:
|
||||||
|
return self.create_text_message(text=json.dumps(res_json))
|
||||||
|
else:
|
||||||
|
return self.create_text_message(
|
||||||
|
f"Failed to delete base records, status code: {res.status_code}, response: {res.text}")
|
||||||
|
except Exception as e:
|
||||||
|
return self.create_text_message("Failed to delete base records. {}".format(e))
|
||||||
@ -0,0 +1,47 @@
|
|||||||
|
import json
|
||||||
|
from typing import Any, Union
|
||||||
|
|
||||||
|
import httpx
|
||||||
|
|
||||||
|
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||||
|
from core.tools.tool.builtin_tool import BuiltinTool
|
||||||
|
|
||||||
|
|
||||||
|
class DeleteBaseTablesTool(BuiltinTool):
|
||||||
|
def _invoke(self, user_id: str, tool_parameters: dict[str, Any]
|
||||||
|
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
||||||
|
|
||||||
|
url = "https://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables/batch_delete"
|
||||||
|
|
||||||
|
access_token = tool_parameters.get('Authorization', '')
|
||||||
|
if not access_token:
|
||||||
|
return self.create_text_message('Invalid parameter access_token')
|
||||||
|
|
||||||
|
app_token = tool_parameters.get('app_token', '')
|
||||||
|
if not app_token:
|
||||||
|
return self.create_text_message('Invalid parameter app_token')
|
||||||
|
|
||||||
|
table_ids = tool_parameters.get('table_ids', '')
|
||||||
|
if not table_ids:
|
||||||
|
return self.create_text_message('Invalid parameter table_ids')
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Authorization': f"Bearer {access_token}",
|
||||||
|
}
|
||||||
|
|
||||||
|
params = {}
|
||||||
|
payload = {
|
||||||
|
"table_ids": json.loads(table_ids)
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
res = httpx.post(url.format(app_token=app_token), headers=headers, params=params, json=payload, timeout=30)
|
||||||
|
res_json = res.json()
|
||||||
|
if res.is_success:
|
||||||
|
return self.create_text_message(text=json.dumps(res_json))
|
||||||
|
else:
|
||||||
|
return self.create_text_message(
|
||||||
|
f"Failed to delete base tables, status code: {res.status_code}, response: {res.text}")
|
||||||
|
except Exception as e:
|
||||||
|
return self.create_text_message("Failed to delete base tables. {}".format(e))
|
||||||
@ -0,0 +1,38 @@
|
|||||||
|
import json
|
||||||
|
from typing import Any, Union
|
||||||
|
|
||||||
|
import httpx
|
||||||
|
|
||||||
|
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||||
|
from core.tools.tool.builtin_tool import BuiltinTool
|
||||||
|
|
||||||
|
|
||||||
|
class GetBaseInfoTool(BuiltinTool):
|
||||||
|
def _invoke(self, user_id: str, tool_parameters: dict[str, Any]
|
||||||
|
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
||||||
|
|
||||||
|
url = "https://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}"
|
||||||
|
|
||||||
|
access_token = tool_parameters.get('Authorization', '')
|
||||||
|
if not access_token:
|
||||||
|
return self.create_text_message('Invalid parameter access_token')
|
||||||
|
|
||||||
|
app_token = tool_parameters.get('app_token', '')
|
||||||
|
if not app_token:
|
||||||
|
return self.create_text_message('Invalid parameter app_token')
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Authorization': f"Bearer {access_token}",
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
res = httpx.get(url.format(app_token=app_token), headers=headers, timeout=30)
|
||||||
|
res_json = res.json()
|
||||||
|
if res.is_success:
|
||||||
|
return self.create_text_message(text=json.dumps(res_json))
|
||||||
|
else:
|
||||||
|
return self.create_text_message(
|
||||||
|
f"Failed to get base info, status code: {res.status_code}, response: {res.text}")
|
||||||
|
except Exception as e:
|
||||||
|
return self.create_text_message("Failed to get base info. {}".format(e))
|
||||||
@ -0,0 +1,50 @@
|
|||||||
|
import json
|
||||||
|
from typing import Any, Union
|
||||||
|
|
||||||
|
import httpx
|
||||||
|
|
||||||
|
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||||
|
from core.tools.tool.builtin_tool import BuiltinTool
|
||||||
|
|
||||||
|
|
||||||
|
class GetTenantAccessTokenTool(BuiltinTool):
|
||||||
|
def _invoke(self, user_id: str, tool_parameters: dict[str, Any]
|
||||||
|
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
||||||
|
|
||||||
|
url = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal"
|
||||||
|
|
||||||
|
app_id = tool_parameters.get('app_id', '')
|
||||||
|
if not app_id:
|
||||||
|
return self.create_text_message('Invalid parameter app_id')
|
||||||
|
|
||||||
|
app_secret = tool_parameters.get('app_secret', '')
|
||||||
|
if not app_secret:
|
||||||
|
return self.create_text_message('Invalid parameter app_secret')
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
}
|
||||||
|
params = {}
|
||||||
|
payload = {
|
||||||
|
"app_id": app_id,
|
||||||
|
"app_secret": app_secret
|
||||||
|
}
|
||||||
|
|
||||||
|
"""
|
||||||
|
{
|
||||||
|
"code": 0,
|
||||||
|
"msg": "ok",
|
||||||
|
"tenant_access_token": "t-caecc734c2e3328a62489fe0648c4b98779515d3",
|
||||||
|
"expire": 7200
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
res = httpx.post(url, headers=headers, params=params, json=payload, timeout=30)
|
||||||
|
res_json = res.json()
|
||||||
|
if res.is_success:
|
||||||
|
return self.create_text_message(text=json.dumps(res_json))
|
||||||
|
else:
|
||||||
|
return self.create_text_message(
|
||||||
|
f"Failed to get tenant access token, status code: {res.status_code}, response: {res.text}")
|
||||||
|
except Exception as e:
|
||||||
|
return self.create_text_message("Failed to get tenant access token. {}".format(e))
|
||||||
@ -0,0 +1,61 @@
|
|||||||
|
import json
|
||||||
|
from typing import Any, Union
|
||||||
|
|
||||||
|
import httpx
|
||||||
|
|
||||||
|
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||||
|
from core.tools.tool.builtin_tool import BuiltinTool
|
||||||
|
|
||||||
|
|
||||||
|
class ListBaseRecordsTool(BuiltinTool):
|
||||||
|
def _invoke(self, user_id: str, tool_parameters: dict[str, Any]
|
||||||
|
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
||||||
|
|
||||||
|
url = "https://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables/{table_id}/records/search"
|
||||||
|
|
||||||
|
access_token = tool_parameters.get('Authorization', '')
|
||||||
|
if not access_token:
|
||||||
|
return self.create_text_message('Invalid parameter access_token')
|
||||||
|
|
||||||
|
app_token = tool_parameters.get('app_token', '')
|
||||||
|
if not app_token:
|
||||||
|
return self.create_text_message('Invalid parameter app_token')
|
||||||
|
|
||||||
|
table_id = tool_parameters.get('table_id', '')
|
||||||
|
if not table_id:
|
||||||
|
return self.create_text_message('Invalid parameter table_id')
|
||||||
|
|
||||||
|
page_token = tool_parameters.get('page_token', '')
|
||||||
|
page_size = tool_parameters.get('page_size', '')
|
||||||
|
sort_condition = tool_parameters.get('sort_condition', '')
|
||||||
|
filter_condition = tool_parameters.get('filter_condition', '')
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Authorization': f"Bearer {access_token}",
|
||||||
|
}
|
||||||
|
|
||||||
|
params = {
|
||||||
|
"page_token": page_token,
|
||||||
|
"page_size": page_size,
|
||||||
|
}
|
||||||
|
|
||||||
|
payload = {
|
||||||
|
"automatic_fields": True
|
||||||
|
}
|
||||||
|
if sort_condition:
|
||||||
|
payload["sort"] = json.loads(sort_condition)
|
||||||
|
if filter_condition:
|
||||||
|
payload["filter"] = json.loads(filter_condition)
|
||||||
|
|
||||||
|
try:
|
||||||
|
res = httpx.post(url.format(app_token=app_token, table_id=table_id), headers=headers, params=params,
|
||||||
|
json=payload, timeout=30)
|
||||||
|
res_json = res.json()
|
||||||
|
if res.is_success:
|
||||||
|
return self.create_text_message(text=json.dumps(res_json))
|
||||||
|
else:
|
||||||
|
return self.create_text_message(
|
||||||
|
f"Failed to list base records, status code: {res.status_code}, response: {res.text}")
|
||||||
|
except Exception as e:
|
||||||
|
return self.create_text_message("Failed to list base records. {}".format(e))
|
||||||
@ -0,0 +1,46 @@
|
|||||||
|
import json
|
||||||
|
from typing import Any, Union
|
||||||
|
|
||||||
|
import httpx
|
||||||
|
|
||||||
|
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||||
|
from core.tools.tool.builtin_tool import BuiltinTool
|
||||||
|
|
||||||
|
|
||||||
|
class ListBaseTablesTool(BuiltinTool):
|
||||||
|
def _invoke(self, user_id: str, tool_parameters: dict[str, Any]
|
||||||
|
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
||||||
|
|
||||||
|
url = "https://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables"
|
||||||
|
|
||||||
|
access_token = tool_parameters.get('Authorization', '')
|
||||||
|
if not access_token:
|
||||||
|
return self.create_text_message('Invalid parameter access_token')
|
||||||
|
|
||||||
|
app_token = tool_parameters.get('app_token', '')
|
||||||
|
if not app_token:
|
||||||
|
return self.create_text_message('Invalid parameter app_token')
|
||||||
|
|
||||||
|
page_token = tool_parameters.get('page_token', '')
|
||||||
|
page_size = tool_parameters.get('page_size', '')
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Authorization': f"Bearer {access_token}",
|
||||||
|
}
|
||||||
|
|
||||||
|
params = {
|
||||||
|
"page_token": page_token,
|
||||||
|
"page_size": page_size,
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
res = httpx.get(url.format(app_token=app_token), headers=headers, params=params, timeout=30)
|
||||||
|
res_json = res.json()
|
||||||
|
if res.is_success:
|
||||||
|
return self.create_text_message(text=json.dumps(res_json))
|
||||||
|
else:
|
||||||
|
return self.create_text_message(
|
||||||
|
f"Failed to list base tables, status code: {res.status_code}, response: {res.text}")
|
||||||
|
except Exception as e:
|
||||||
|
return self.create_text_message("Failed to list base tables. {}".format(e))
|
||||||
@ -0,0 +1,47 @@
|
|||||||
|
import json
|
||||||
|
from typing import Any, Union
|
||||||
|
|
||||||
|
import httpx
|
||||||
|
|
||||||
|
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||||
|
from core.tools.tool.builtin_tool import BuiltinTool
|
||||||
|
|
||||||
|
|
||||||
|
class ReadBaseRecordTool(BuiltinTool):
|
||||||
|
def _invoke(self, user_id: str, tool_parameters: dict[str, Any]
|
||||||
|
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
||||||
|
|
||||||
|
url = "https://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables/{table_id}/records/{record_id}"
|
||||||
|
|
||||||
|
access_token = tool_parameters.get('Authorization', '')
|
||||||
|
if not access_token:
|
||||||
|
return self.create_text_message('Invalid parameter access_token')
|
||||||
|
|
||||||
|
app_token = tool_parameters.get('app_token', '')
|
||||||
|
if not app_token:
|
||||||
|
return self.create_text_message('Invalid parameter app_token')
|
||||||
|
|
||||||
|
table_id = tool_parameters.get('table_id', '')
|
||||||
|
if not table_id:
|
||||||
|
return self.create_text_message('Invalid parameter table_id')
|
||||||
|
|
||||||
|
record_id = tool_parameters.get('record_id', '')
|
||||||
|
if not record_id:
|
||||||
|
return self.create_text_message('Invalid parameter record_id')
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Authorization': f"Bearer {access_token}",
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
res = httpx.get(url.format(app_token=app_token, table_id=table_id, record_id=record_id), headers=headers,
|
||||||
|
timeout=30)
|
||||||
|
res_json = res.json()
|
||||||
|
if res.is_success:
|
||||||
|
return self.create_text_message(text=json.dumps(res_json))
|
||||||
|
else:
|
||||||
|
return self.create_text_message(
|
||||||
|
f"Failed to read base record, status code: {res.status_code}, response: {res.text}")
|
||||||
|
except Exception as e:
|
||||||
|
return self.create_text_message("Failed to read base record. {}".format(e))
|
||||||
@ -0,0 +1,56 @@
|
|||||||
|
import json
|
||||||
|
from typing import Any, Union
|
||||||
|
|
||||||
|
import httpx
|
||||||
|
|
||||||
|
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||||
|
from core.tools.tool.builtin_tool import BuiltinTool
|
||||||
|
|
||||||
|
|
||||||
|
class UpdateBaseRecordTool(BuiltinTool):
|
||||||
|
def _invoke(self, user_id: str, tool_parameters: dict[str, Any]
|
||||||
|
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
||||||
|
|
||||||
|
url = "https://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables/{table_id}/records/{record_id}"
|
||||||
|
|
||||||
|
access_token = tool_parameters.get('Authorization', '')
|
||||||
|
if not access_token:
|
||||||
|
return self.create_text_message('Invalid parameter access_token')
|
||||||
|
|
||||||
|
app_token = tool_parameters.get('app_token', '')
|
||||||
|
if not app_token:
|
||||||
|
return self.create_text_message('Invalid parameter app_token')
|
||||||
|
|
||||||
|
table_id = tool_parameters.get('table_id', '')
|
||||||
|
if not table_id:
|
||||||
|
return self.create_text_message('Invalid parameter table_id')
|
||||||
|
|
||||||
|
record_id = tool_parameters.get('record_id', '')
|
||||||
|
if not record_id:
|
||||||
|
return self.create_text_message('Invalid parameter record_id')
|
||||||
|
|
||||||
|
fields = tool_parameters.get('fields', '')
|
||||||
|
if not fields:
|
||||||
|
return self.create_text_message('Invalid parameter fields')
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Authorization': f"Bearer {access_token}",
|
||||||
|
}
|
||||||
|
|
||||||
|
params = {}
|
||||||
|
payload = {
|
||||||
|
"fields": json.loads(fields)
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
res = httpx.put(url.format(app_token=app_token, table_id=table_id, record_id=record_id), headers=headers,
|
||||||
|
params=params, json=payload, timeout=30)
|
||||||
|
res_json = res.json()
|
||||||
|
if res.is_success:
|
||||||
|
return self.create_text_message(text=json.dumps(res_json))
|
||||||
|
else:
|
||||||
|
return self.create_text_message(
|
||||||
|
f"Failed to update base record, status code: {res.status_code}, response: {res.text}")
|
||||||
|
except Exception as e:
|
||||||
|
return self.create_text_message("Failed to update base record. {}".format(e))
|
||||||
Loading…
Reference in New Issue