好记性,不如烂笔头,趁热记录下,给未来的自己。

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 的调用方法有两种:

  1. 请求 API
  2. 经过Slack

大模型 Claude API 还要申请?那就自己来封装一个吧

第一种方法,在现在来说约等于无,由于 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 areready to offer Claude more broadlyso it can power crucial, cutting-edge use cases at scale.

第二种方法,开源社区有一些现成的计划可以运用(在这儿衷心感谢)。其顶用 slack bot 便是比较靠谱和稳定的一种方法,在第二章节里,会具体介绍怎么经过 slack bot 来调用 claude。

2 | Claude in slack 教程

本章节会分以下两个部分:

  1. 如安在 slack 里接入 ,并在 slack web端调用 Claude;
  2. 怎么设置 slack API 所需的 Token 和 Member ID。

2.1 | slack 接入 Claude

  1. 登录 slack, 假如没有注册需求先进行注册:
    大模型 Claude API 还要申请?那就自己来封装一个吧
    需求注意的是,邮箱注册会被check failed,建议运用 Google/Apple 账号登录

大模型 Claude API 还要申请?那就自己来封装一个吧

  1. 创立 workspace

    大模型 Claude API 还要申请?那就自己来封装一个吧

  2. 挑选 slack connect

    大模型 Claude API 还要申请?那就自己来封装一个吧

  3. 点击 create a channel (PRO)

    大模型 Claude API 还要申请?那就自己来封装一个吧
    大模型 Claude API 还要申请?那就自己来封装一个吧

  4. 增加 Claude app

大模型 Claude API 还要申请?那就自己来封装一个吧
假如呈现 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

大模型 Claude API 还要申请?那就自己来封装一个吧
图2
大模型 Claude API 还要申请?那就自己来封装一个吧
图3
大模型 Claude API 还要申请?那就自己来封装一个吧
图4
大模型 Claude API 还要申请?那就自己来封装一个吧
图5
大模型 Claude API 还要申请?那就自己来封装一个吧
图6
大模型 Claude API 还要申请?那就自己来封装一个吧

2.2 | slack token 信息获取

  1. 进入 slack api 并创立 app, 挑选 From scratch
    大模型 Claude API 还要申请?那就自己来封装一个吧

大模型 Claude API 还要申请?那就自己来封装一个吧

大模型 Claude API 还要申请?那就自己来封装一个吧

  1. 装备权限
    大模型 Claude API 还要申请?那就自己来封装一个吧

大模型 Claude API 还要申请?那就自己来封装一个吧

  1. 获取 token (下面会用到)
    大模型 Claude API 还要申请?那就自己来封装一个吧

大模型 Claude API 还要申请?那就自己来封装一个吧

大模型 Claude API 还要申请?那就自己来封装一个吧

  1. 获取member id (下面会用到)

大模型 Claude API 还要申请?那就自己来封装一个吧

大模型 Claude API 还要申请?那就自己来封装一个吧

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