作者: build

  • 2.2K Star 共享!!!打破距离,局域网传输可达70MB

    TL-RTC-File,一款开源的WebRTC P2P在线媒体流工具,以其高效、易用的特点,为大文件传输、音视频通话、屏幕共享和文本聊天提供了强大支持。它不仅支持跨平台操作,还能在局域网内实现高速传输,同时提供全面的数据统计和监控,是现代远程协作和数据交换的理想选择。

    特点

    可以多人音视频通话、屏幕共享、直播和文本聊天等多样化的互动功能。它具备跨平台兼容性、本地网络高速传输、易于使用和私有化部署的优势,同时提供了丰富的管理统计功能,包括屏幕录制、远程共享、密码保护房间、云存储集成以及实时的WebRTC性能监控和统计,确保用户能够安全、便捷地进行在线协作和数据交换。

    主要功能

    • 基于 WebRTC 的 P2P 文件传输,支持大文件传输。
    • 支持跨平台和平台无关性,易于使用。
    • 本地网络无速度限制,局域网内传输速度可达70MB/s以上。
    • 支持私有部署,增加数据安全性。
    • 支持拖拽发送多文件,以及网页文件预览。
    • 增加了本地屏幕录制、远程屏幕共享、远程音视频通话、直播、密码保护房间、OSS云存储、中继服务设置、WebRTC检测与统计、文本传输(群聊、私聊)、公共聊天、远程白板、AI聊天助手等。

    开源成就

    目前已经取得了2.2K Star

    简单部署

    1.安装依赖:首先需要安装 Node.js 14.21.x 或以上版本,以及 npm。然后进入项目目录,执行以下命令:

    cd svr/
    npm install

    2.首次运行:执行以下命令以构建生产环境:

    npm run build:pro

    如果需要开发或修改前端页面,使用以下命令;否则可以跳过此步骤:

    npm run build:dev

    3.启动服务:选择以下两种模式之一启动服务。HTTPS 模式是使用音视频流、直播和屏幕共享等功能所必需的,其他功能不受影响。

    • 以 HTTP 模式启动,访问地址为 http://你的电脑ip:9092。
    npm run http-api
    npm run http-socket
    • 或以 HTTPS 模式启动,访问地址为 https://你的电脑i:9092。
    npm run https-api
    npm run https-socket

    TL-RTC-File 以其强大的功能和灵活的部署方式,为需要在线媒体流服务的企业和个人提供了一个高效、可靠的解决方案。

    近期热文:

    29.3K Star强!集成微信登录,核心代码就10行
    6.3K Star很强!一键同步,跨设备书签管理神器
    1.6K Star 2W网站运行的问答平台!最好的语言开发

  • 快速接入工具

    这里我们以 GoogleSearch 为例,介绍如何快速接入一个工具。

    1. 准备工具供应商 yaml

    介绍

    这个 yaml 将包含工具供应商的信息,包括供应商名称、图标、作者等详细信息,以帮助前端灵活展示。

    示例

    我们需要在 core/tools/provider/builtin下创建一个google模块(文件夹),并创建google.yaml,名称必须与模块名称一致。

    后续,我们关于这个工具的所有操作都将在这个模块下进行。复制

    identity: # 工具供应商的基本信息
      author: Dify # 作者
      name: google # 名称,唯一,不允许和其他供应商重名
      label: # 标签,用于前端展示
        en_US: Google # 英文标签
        zh_Hans: Google # 中文标签
      description: # 描述,用于前端展示
        en_US: Google # 英文描述
        zh_Hans: Google # 中文描述
      icon: icon.svg # 图标,需要放置在当前模块的_assets文件夹下
    
    • identity 字段是必须的,它包含了工具供应商的基本信息,包括作者、名称、标签、描述、图标等
      • 图标需要放置在当前模块的_assets文件夹下,可以参考这里:api/core/tools/provider/builtin/google/_assets/icon.svg复制<svg xmlns="http://www.w3.org/2000/svg" width="24" height="25" viewBox="0 0 24 25" fill="none"> <path d="M22.501 12.7332C22.501 11.8699 22.4296 11.2399 22.2748 10.5865H12.2153V14.4832H18.12C18.001 15.4515 17.3582 16.9099 15.9296 17.8898L15.9096 18.0203L19.0902 20.435L19.3106 20.4565C21.3343 18.6249 22.501 15.9298 22.501 12.7332Z" fill="#4285F4"/> <path d="M12.214 23C15.1068 23 17.5353 22.0666 19.3092 20.4567L15.9282 17.8899C15.0235 18.5083 13.8092 18.9399 12.214 18.9399C9.38069 18.9399 6.97596 17.1083 6.11874 14.5766L5.99309 14.5871L2.68583 17.0954L2.64258 17.2132C4.40446 20.6433 8.0235 23 12.214 23Z" fill="#34A853"/> <path d="M6.12046 14.5766C5.89428 13.9233 5.76337 13.2233 5.76337 12.5C5.76337 11.7766 5.89428 11.0766 6.10856 10.4233L6.10257 10.2841L2.75386 7.7355L2.64429 7.78658C1.91814 9.20993 1.50146 10.8083 1.50146 12.5C1.50146 14.1916 1.91814 15.7899 2.64429 17.2132L6.12046 14.5766Z" fill="#FBBC05"/> <path d="M12.2141 6.05997C14.2259 6.05997 15.583 6.91163 16.3569 7.62335L19.3807 4.73C17.5236 3.03834 15.1069 2 12.2141 2C8.02353 2 4.40447 4.35665 2.64258 7.78662L6.10686 10.4233C6.97598 7.89166 9.38073 6.05997 12.2141 6.05997Z" fill="#EB4335"/> </svg>

    2. 准备供应商凭据

    Google 作为一个第三方工具,使用了 SerpApi 提供的 API,而 SerpApi 需要一个 API Key 才能使用,那么就意味着这个工具需要一个凭据才可以使用,而像wikipedia这样的工具,就不需要填写凭据字段,可以参考这里:api/core/tools/provider/builtin/wikipedia/wikipedia.yaml复制

    identity:
      author: Dify
      name: wikipedia
      label:
        en_US: Wikipedia
        zh_Hans: 维基百科
        pt_BR: Wikipedia
      description:
        en_US: Wikipedia is a free online encyclopedia, created and edited by volunteers around the world.
        zh_Hans: 维基百科是一个由全世界的志愿者创建和编辑的免费在线百科全书。
        pt_BR: Wikipedia is a free online encyclopedia, created and edited by volunteers around the world.
      icon: icon.svg
    credentials_for_provider:

    配置好凭据字段后效果如下:复制

    identity:
      author: Dify
      name: google
      label:
        en_US: Google
        zh_Hans: Google
      description:
        en_US: Google
        zh_Hans: Google
      icon: icon.svg
    credentials_for_provider: # 凭据字段
      serpapi_api_key: # 凭据字段名称
        type: secret-input # 凭据字段类型
        required: true # 是否必填
        label: # 凭据字段标签
          en_US: SerpApi API key # 英文标签
          zh_Hans: SerpApi API key # 中文标签
        placeholder: # 凭据字段占位符
          en_US: Please input your SerpApi API key # 英文占位符
          zh_Hans: 请输入你的 SerpApi API key # 中文占位符
        help: # 凭据字段帮助文本
          en_US: Get your SerpApi API key from SerpApi # 英文帮助文本
          zh_Hans: 从 SerpApi 获取您的 SerpApi API key # 中文帮助文本
        url: https://serpapi.com/manage-api-key # 凭据字段帮助链接
    
    • type:凭据字段类型,目前支持secret-inputtext-inputselect 三种类型,分别对应密码输入框、文本输入框、下拉框,如果为secret-input,则会在前端隐藏输入内容,并且后端会对输入内容进行加密。

    3. 准备工具 yaml

    一个供应商底下可以有多个工具,每个工具都需要一个 yaml 文件来描述,这个文件包含了工具的基本信息、参数、输出等。

    仍然以 GoogleSearch 为例,我们需要在google模块下创建一个tools模块,并创建tools/google_search.yaml,内容如下。复制

    identity: # 工具的基本信息
      name: google_search # 工具名称,唯一,不允许和其他工具重名
      author: Dify # 作者
      label: # 标签,用于前端展示
        en_US: GoogleSearch # 英文标签
        zh_Hans: 谷歌搜索 # 中文标签
    description: # 描述,用于前端展示
      human: # 用于前端展示的介绍,支持多语言
        en_US: A tool for performing a Google SERP search and extracting snippets and webpages.Input should be a search query.
        zh_Hans: 一个用于执行 Google SERP 搜索并提取片段和网页的工具。输入应该是一个搜索查询。
      llm: A tool for performing a Google SERP search and extracting snippets and webpages.Input should be a search query. # 传递给 LLM 的介绍,为了使得LLM更好理解这个工具,我们建议在这里写上关于这个工具尽可能详细的信息,让 LLM 能够理解并使用这个工具
    parameters: # 参数列表
      - name: query # 参数名称
        type: string # 参数类型
        required: true # 是否必填
        label: # 参数标签
          en_US: Query string # 英文标签
          zh_Hans: 查询语句 # 中文标签
        human_description: # 用于前端展示的介绍,支持多语言
          en_US: used for searching
          zh_Hans: 用于搜索网页内容
        llm_description: key words for searching # 传递给LLM的介绍,同上,为了使得LLM更好理解这个参数,我们建议在这里写上关于这个参数尽可能详细的信息,让LLM能够理解这个参数
        form: llm # 表单类型,llm表示这个参数需要由Agent自行推理出来,前端将不会展示这个参数
      - name: result_type
        type: select # 参数类型
        required: true
        options: # 下拉框选项
          - value: text
            label:
              en_US: text
              zh_Hans: 文本
          - value: link
            label:
              en_US: link
              zh_Hans: 链接
        default: link
        label:
          en_US: Result type
          zh_Hans: 结果类型
        human_description:
          en_US: used for selecting the result type, text or link
          zh_Hans: 用于选择结果类型,使用文本还是链接进行展示
        form: form # 表单类型,form表示这个参数需要由用户在对话开始前在前端填写
    
    • identity 字段是必须的,它包含了工具的基本信息,包括名称、作者、标签、描述等
    • parameters 参数列表
      • name 参数名称,唯一,不允许和其他参数重名
      • type 参数类型,目前支持stringnumberbooleanselect 四种类型,分别对应字符串、数字、布尔值、下拉框
      • required 是否必填
        • llm模式下,如果参数为必填,则会要求 Agent 必须要推理出这个参数
        • form模式下,如果参数为必填,则会要求用户在对话开始前在前端填写这个参数
      • options 参数选项
        • llm模式下,Dify 会将所有选项传递给 LLM,LLM 可以根据这些选项进行推理
        • form模式下,typeselect时,前端会展示这些选项
      • default 默认值
      • label 参数标签,用于前端展示
      • human_description 用于前端展示的介绍,支持多语言
      • llm_description 传递给 LLM 的介绍,为了使得 LLM 更好理解这个参数,我们建议在这里写上关于这个参数尽可能详细的信息,让 LLM 能够理解这个参数
      • form 表单类型,目前支持llmform两种类型,分别对应 Agent 自行推理和前端填写

    4. 准备工具代码

    当完成工具的配置以后,我们就可以开始编写工具代码了,主要用于实现工具的逻辑。

    google/tools模块下创建google_search.py,内容如下。复制

    from core.tools.tool.builtin_tool import BuiltinTool
    from core.tools.entities.tool_entities import ToolInvokeMessage
    
    from typing import Any, Dict, List, Union
    
    class GoogleSearchTool(BuiltinTool):
        def _invoke(self, 
                    user_id: str,
                   tool_paramters: Dict[str, Any], 
            ) -> Union[ToolInvokeMessage, List[ToolInvokeMessage]]:
            """
                invoke tools
            """
            query = tool_paramters['query']
            result_type = tool_paramters['result_type']
            api_key = self.runtime.credentials['serpapi_api_key']
            # TODO: search with serpapi
            result = SerpAPI(api_key).run(query, result_type=result_type)
    
            if result_type == 'text':
                return self.create_text_message(text=result)
            return self.create_link_message(link=result)

    参数

    工具的整体逻辑都在_invoke方法中,这个方法接收两个参数:user_idtool_paramters,分别表示用户 ID 和工具参数

    返回数据

    在工具返回时,你可以选择返回一个消息或者多个消息,这里我们返回一个消息,使用create_text_messagecreate_link_message可以创建一个文本消息或者一个链接消息。

    5. 准备供应商代码

    最后,我们需要在供应商模块下创建一个供应商类,用于实现供应商的凭据验证逻辑,如果凭据验证失败,将会抛出ToolProviderCredentialValidationError异常。

    google模块下创建google.py,内容如下。复制

    from core.tools.entities.tool_entities import ToolInvokeMessage, ToolProviderType
    from core.tools.tool.tool import Tool
    from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
    from core.tools.errors import ToolProviderCredentialValidationError
    
    from core.tools.provider.builtin.google.tools.google_search import GoogleSearchTool
    
    from typing import Any, Dict
    
    class GoogleProvider(BuiltinToolProviderController):
        def _validate_credentials(self, credentials: Dict[str, Any]) -> None:
            try:
                # 1. 此处需要使用 GoogleSearchTool()实例化一个 GoogleSearchTool,它会自动加载 GoogleSearchTool 的 yaml 配置,但是此时它内部没有凭据信息
                # 2. 随后需要使用 fork_tool_runtime 方法,将当前的凭据信息传递给 GoogleSearchTool
                # 3. 最后 invoke 即可,参数需要根据 GoogleSearchTool 的 yaml 中配置的参数规则进行传递
                GoogleSearchTool().fork_tool_runtime(
                    meta={
                        "credentials": credentials,
                    }
                ).invoke(
                    user_id='',
                    tool_paramters={
                        "query": "test",
                        "result_type": "link"
                    },
                )
            except Exception as e:
                raise ToolProviderCredentialValidationError(str(e))

    完成

    当上述步骤完成以后,我们就可以在前端看到这个工具了,并且可以在 Agent 中使用这个工具。

    当然,因为 google_search 需要一个凭据,在使用之前,还需要在前端配置它的凭据。

  • 压缩包密码破解

    通过百度网盘分享的文件:压缩包解密链接:https://pan.baidu.com/s/18JyhDd9_1cMwqrDJ3044Fw?pwd=89v2 提取码:89v2复制这段内容打开「百度网盘APP 即可获取」

  • 群晖Docker自建本地Bitwarden密码管理器远程同步使用

    Bitwarden是一个密码管理器应用程序,适用于在多个设备和浏览器之间同步密码。自建密码管理软件bitwarden使用好处在于,密码始终保存在自己的nas终端,谁也无法获取,几乎不会有泄露的风险。

    但是自建的服务,只能本地连接使用,无法做到远程连接,如跨设备,跨网络等,下面介绍一个内网穿透软件,可以实现跨平台同步.

    cpolar是一款强大的内网穿透软件,它能够在多个操作系统上无缝运行,包括Windows、MacOS和Linux,因此无论您使用哪种操作系统,都可以轻松将本地内网服务器的HTTP、HTTPS、TCP协议端口映射为公网地址端口,使得公网用户可以轻松访问您的内网服务,无需部署至公网服务器.

    本地部署密码管理软件bitwarden 结合cpolar工具,可以实现远程同步,本例以群晖作为例子,其他系统也可以采纳,下面介绍使用方法,首先从搭建birwarden开始.

    1. 拉取Bitwarden镜像

    本例群晖版本由于无法直接在群晖控制面板界面搜索容器,所以采用命令行方式进行容器下载,首先开启群晖ssh连接,然后使用工具通过ssh连接上群晖,执行下面docker命令 拉取镜像容器:vaultwarden/server

    sudo docker pull vaultwarden/server

    拉取后我们在群晖容器管理界面可以看到拉取的镜像,现在改名了,叫vaultwarden,获取镜像就完成了,下面进行运行启动

    2. 运行Bitwarden镜像

    选中镜像,点击运行,运行后,进行参数设置

    名称可以改成bitwarden,勾选开机自启,然后点击下一步

    然后设置对外访问的端口,3012端口不需要设置,点击右边去除掉,只设置80端口即可,80端口,可以自己设置,这里设置的对外是8088,该端口也是我们web 访问的端口,然后再设置存储位置,指定一个数据存储位置,这个指定的位置文件夹可以提前创建好,后面参数,填写/data,然后点击下一步

    最后点击完成

    在容器界面,可以看到我们运行的bitwarden容器,表示成功运行,接下来进行访问

    3. 本地访问

    上面我们成功运行bitwarden镜像服务容器,且配置的对外访问端口是8088(具体以自己设置的为准),下面我们通过局域网IP访问8088端口,即可看到我们的bitwarden界面,本地访问就成功了,现在还注册创建不了账号,需要使用https访问才可以注册账号,下面我们安装cpolar工具,使用cpolar工具生成https域名进行访问,再创建登录账号!

    4. 群晖安装Cpolar

    点击下面Cpolar群晖套件下载地址,下载相应版本的群晖Cpolar套件

    https://www.cpolar.com/synology-cpolar-suite,

    打开群晖套件中心,点击右上角的手动安装按钮。

    选择我们本地下载好的cpolar套件安装包,然后点击下一步

    点击同意按钮,然后点击下一步

    最后点击完成即可。

    安装完成后,在外部浏览器,我们通过群晖的局域网ip地址9200端口访问Cpolar的Web管理界面,然后输入Cpolar邮箱账号与密码进行登录

    5. 配置公网地址

    点击左侧仪表盘的隧道管理——创建隧道,创建一个bitwarden的公网地址隧道!

    • 隧道名称:可自定义命名,注意不要与已有的隧道名称重复

    • 协议:选择http

    • 本地地址:8088 (本地访问的端口)

    • 域名类型:免费选择随机域名

    • 地区:选择China

    点击创建

    隧道创建成功后,点击左侧的状态——在线隧道列表,查看所生成的公网访问地址,有两种访问方式,一种是http 和https,下面我们使用生成的https访问.

    6公网访问Bitwarden

    使用上面cpolar生成的https地址,在浏览器访问,同样 ,可以看到登录界面,公网https地址创建成功,接下来再进行创建登录账号,点击Create account,进入创建账号

    填写相关的账号信息,点击下面创建即可

    然后使用我们创建的账号登录即可,登录后就可以看到主界面了,公网https地址设置访问就成功了!

    小结

    为了更好地演示,我们在前述过程中使用了cpolar生成的隧道,其公网地址是随机生成的。

    这种随机地址的优势在于建立速度快,可以立即使用。然而,它的缺点是网址由随机字符生成,不太容易记忆(例如:3ad5da5.r10.cpolar.top)。另外,这个地址在24小时内会发生随机变化,更适合于临时使用。

    我一般会使用固定二级子域名,原因是我希望将网址发送给同事或客户时,它是一个固定、易记的公网地址(例如:bitwarden.cpolar.cn),这样更显正式,便于流交协作。

    7. 固定公网地址

    由于以上使用Cpolar所创建的隧道使用的是随机公网地址,24小时内会随机变化,不利于长期远程访问。因此我们可以为其配置二级子域名,该地址为固定地址,不会随机变化【ps:cpolar.cn已备案】

    注意需要将cpolar套餐升级至基础套餐或以上,且每个套餐对应的带宽不一样。【cpolar.cn已备案】

    登录cpolar官网,点击左侧的预留,选择保留二级子域名,设置一个二级子域名名称,点击保留,保留成功后复制保留的二级子域名名称

    保留成功后复制保留成功的二级子域名的名称

    返回登录Cpolar web UI管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到所要配置的隧道,点击右侧的编辑

    修改隧道信息,将保留成功的二级子域名配置到隧道中

    • 域名类型:选择二级子域名

    • Sub Domain:填写保留成功的二级子域名

    点击更新(注意,点击一次更新即可,不需要重复提交)

    更新完成后,打开在线隧道列表,此时可以看到公网地址已经发生变化,地址名称也变成了固定的二级子域名的名称域名

    最后,我们使用固定的公网https地址访问,可以看到访问成功,这样一个固定且永久不变的公网地址就设置好了,新地址访问,需要重新登录一下!

    8. 浏览器密码托管设置

    这里以浏览器扩展文件为例,进入官网下载扩展工具:https://bitwarden.com/download/,选择Browser extension ,这里使用的是微软 Edge浏览器,所以选择 Edge浏览器下载

    选择后会跳转到下载扩展程序界面,点击获取,添加扩展即可

    下载后打开扩展程序,点击选择自托管

    设置我们在cpolar中创建的固定公网地址,然后点击左上角保存

    然后再使用注册的账号登录

    可以看到,登录成功了,就连上了我们本地的托管服务,其他设备 浏览器操作方式也是一样,这样就可以实现跨平台,跨网络进行密码托管!

    如需转载,请注明出处!

    《Docker 本地部署Rss订阅工具并实现公网远程访问》