好记性,不如烂笔头,趁热记录下,给未来的自己。
0 | 前言
自从 OpenAI 的 chatGPT 出现,被誉为第四次工业革命的开始。语言大模型这个话题,占据了互联网的半壁江山,围绕大模型的上下游生态、竞品大模型层出不穷。除了 chatGPT 外, 已经发布的还有 百度的文心一言、阿里的通义千问、MiniMax、Google的Palm、Fackbook的LLAMA 以及 Anthropic 的 Claude。
由于团队业务需要,需要对接各个大模型的API,在对接Claude的时候,发现其API需要申请+等待,无法即可使用(即使花钱也不行)。所以本文,会结合开源社区的一些方案,来实现Claude API的封装和调用。
在第一章节中,主要介绍 Claude 调用的两种方式;在第二章节中,会对基于slack bot的方式调用 Claude做详细展开,包括如何在 slack 页面使用,以及配置 slack 的 API;在第三章节里,会基于slack API 来进行基于python代码的实现。
1 | Claude 调用的几种姿势
很多大模型已经开放了 API 调用,免费的,收费的,商用的等等。但是,部分大模型的 API 调用还是需要申请,进 waiting list,然后遥遥无期的等待。Claude 的调用方式有两种:
- 申请 API
- 通过Slack
第一种方式,在目前来说约等于无,因为 Claude 目前只针对其关键的合作伙伴(如 Notion,Quora等)提供 API,对公众的 API的申请,目前还处于一个小心谨慎的逐步放开阶段
After working for the past few months with key partners like Notion, Quora, and DuckDuckGo in a closed alpha, we’ve been able to carefully test out our systems in the wild, and are ready to offer Claude more broadly so it can power crucial, cutting-edge use cases at scale.
第二种方式,开源社区有一些现成的方案可以使用(在这里衷心感谢)。其中用 slack bot 就是比较靠谱和稳定的一种方式,在第二章节里,会详细介绍如何通过 slack bot 来调用 claude。
2 | Claude in slack 教程
本章节会分以下两个部分:
- 如何在 slack 里接入 ,并在 slack web端调用 Claude;
- 如何设置 slack API 所需的 Token 和 Member ID。
2.1 | slack 接入 Claude
- 登录 slack, 如果没有注册需要先进行注册:
需要注意的是,邮箱注册会被check failed,建议使用 Google/Apple 账号登录
-
创建 workspace
-
选择 slack connect
-
点击 create a channel (PRO)
-
添加 Claude app
如果出现 Authorization hasn’t been set up for this app, so you won’t be able to install it., 点击右上角的 Manage(图1)-> App Management Settings(图2) -> Require APP Approval(图2) -> Approve(图3) -> Learn More(图3) -> Add to Slack(图4) -> Allow(图5) -> Enjoy(图6)!
图1
图2
图3
图4
图5
图6
2.2 | slack token 信息获取
- 进入 slack api 并创建 app, 选择 From scratch
- 配置权限
- 获取 token (下面会用到)
- 获取member id (下面会用到)
3 | python 代码实例
- python 核心代码
import time
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
from ClaudeDto import ClaudeChatReqDto
from ReturnBase import ReturnBase
def send_message(client, channel, text):
try:
return client.chat_postMessage(channel=channel, text=text)
except SlackApiError as e:
print(f"Error sending message: {e}")
def fetch_messages(client, channel, last_message_timestamp, bot_user_id):
response = client.conversations_history(channel=channel, oldest=last_message_timestamp)
return [msg['text'] for msg in response['messages'] if msg['user'] == bot_user_id]
def get_new_messages(client, channel, last_message_timestamp, bot_user_id):
while True:
messages = fetch_messages(client, channel, last_message_timestamp, bot_user_id)
if messages and not messages[-1].endswith('Typing…_'):
return messages[-1]
time.sleep(1) # 这里的时间设置需要 balance 一下,越小越可能被限流,越大返回时间越长
def find_direct_message_channel(client, user_id):
try:
response = client.conversations_open(users=user_id)
return response['channel']['id']
except SlackApiError as e:
print(f"Error opening DM channel: {e}")
def claude_chat_by_slack_svc(req_dto: ClaudeChatReqDto):
slack_user_token = {上面获得的token}
bot_user_id = {上面获得的member id}
client = WebClient(token=slack_user_token)
dm_channel_id = find_direct_message_channel(client, bot_user_id)
if not dm_channel_id:
print("Could not find DM channel with the bot.")
return
last_message_timestamp = None
prompt = req_dto.prompt
response = send_message(client, dm_channel_id, prompt)
if response:
last_message_timestamp = response['ts']
new_message = get_new_messages(client, dm_channel_id, last_message_timestamp, bot_user_id)
return ReturnBase(
data=new_message
)
if __name__ == "__main__":
pass
- ClaudeDto.py
from pydantic import BaseModel
class ClaudeChatReqDto(BaseModel):
prompt: str
- ReturnBase.py
from pydantic import BaseModel
from typing import Optional
class ReturnBase(BaseModel):
msg: Optional[str] = "ok"
msgCode: Optional[str] = "10000"
data: Optional[object] = None
- requirements.txt
pydantic~=1.10.7
requests~=2.25.1
openai~=0.27.4
cchardet
slack_sdk
pyjwt