DeepFloodbeta

好玩的Github开源项目推荐~

我很喜欢找一些Github上开源的有趣项目,尤其是一些能用Docker部署在本地电脑中的。下面按照我的使用频率,推荐一些我日常使用的项目。

LibreChat:仿网页版ChatGPT的开源项目,支持Docker Compose部署。相比Cherry Studio,我更喜欢用这个。不知道为什么,可能是先入为主?但这个项目配置起来确实麻烦一些。它支持配置自定义渠道,使用自己的API Key,使用自定义的中转站,使用自定义模型,都没有问题。支持对话标签分组,支持对话分享(本地部署分享就别用了,localhost的地址别人也访问不通),支持预设(模型参数和系统提示词),支持上传文件、纯文本、图片,支持记忆,支持MCP,支持文件搜索(RAG),支持配置网络搜索(有默认的,也可以用MCP),支持Artifacts(直接展示HTML代码效果、Markdown Mermaid流程图啥的),支持智能体(Agent)配置,多个智能体串行执行。大概就这么多功能。作者更新比较积极,有问题提Issue解决的也比较快。

FireCrawl:网页内容爬取服务,支持Docker Compose本地部署。我主要是配合LibreChat使用,通过MCP,可以为我的LibreChat提供爬取指定网页内容的能力。

Perplexica:可以理解为开源版的Perplexity,支持Docker Compose部署。提供AI搜索服务,可以配置自己的API Key,比如DeepSeek的。搜索引擎用的是Searxng。老版本通过Docker部署后,是暴露两个服务的,一个Perplexica,一个Searxng。新版本代码更新后,默认Searxng服务不暴露了,但可以通过修改docker compose文件,将Searxng暴露出来,当搜索引擎用。这个项目我一般就是当搜索引擎用,也通过OpenAI Schema的方式,集成到了LibreChat中,在某些Agent中作为搜索工具使用。它带的Searxng服务,也被我集成进了LibreChat中,作为一个搜索MCP使用。

Dify:创建低代码AI工作流的项目,类似国内的Coze,支持Docker Compose部署。它出来的比较早,整体功能大部分都是拖拉拽,偶尔需要写代码的地方,让AI生成一下也就行了。我之前没怎么找到它的使用场景,直到最近我给孩子做了个学汉字的网页。这个网页支持PWA(可以保存到本地像APP似的使用,在桌面有自己的图标),支持配置每一个汉字的图片和音频讲解。我用Dify做了一个工作流,我输入一个汉字,它能自动帮我生成文生图Prompt,然后用文生图模型生成图片,然后执行一个搜索,搜索汉字的书写笔画顺序,最后用支持视觉的模型(比如Gemini),根据汉字、图片、笔画,编写合适的音频文案。之所以最后没有接音频生成逻辑,是因为文案我需要人工审核下,毕竟给孩子学习用的,不要有什么错误、疏漏啥的。Dify适合通过AI工作流,去干掉一些重复性的劳动。

Drawnix:比较简单的白板工具,支持Docker部署,我是让AI帮我生成了docker-compose.yml文件,以支持Docker Compose部署。支持Mermaid转流程图,Markdown转思维导图。平常用来梳理业务流程,写写画画的还挺好用的。

Planka:同样是比较单纯的看板工具,支持Docker Compose部署。我用来给自己的业余项目进行项目管理用。

Prompt-Optimizer:提示词AI优化工具,支持Docker Compose部署。提供WebUI,可以用预制的几种模版,用AI大模型优化提示词,并进行效果对比测试。同时提供提示词的版本管理功能。

PDFMathTranslate:老版本的 PDF AI大模型翻译工具,用AI进行翻译。可以在保持原PDF排版格式的前提下,将PDF的英文翻译成中文。

PDFMathTranslate-Next:新版本的 PDF AI大模型翻译工具,用AI进行翻译。跟之前版本功能一样。可配置项更多了。

bilingual_book_maker:电子书 AI大模型翻译工具,用AI进行翻译。

Kazumi:非常好用的看动漫的软件!

DartSimpleLive:直播聚合软件,可以看斗鱼、抖音、哔哩哔哩、虎牙的直播。但是没有安装包,需要自己打包。是个Flutter项目。

大家有什么好玩的,多多推荐一下~

  • FireCrawl 有官方api免费额度还不少

  • 收藏记录一下

  • 已经申请了apikey,然后FireCrawl这个咋使用的啊,还需要部署啥服务啊

  • @warm #6 申请了API Key就不用本地部署了,直接用就行。
    看官方文档:https://docs.firecrawl.dev/zh/mcp-server
    你用的啥客户端,就把FireCrawl按相应的方式配置到客户端的MCP设置中就行。聊天的时候选择使用对应的MCP,大模型会在必要时自动调用相关的工具来使用。

  • 请教一下啊,Perplexica怎么在rikkahub中使用mcp的,部署后访问连接能够打开两个服务ip:3002

    。ip:8083是

    rikkahub配置mcp界面是

  • @warm #9 Perplexica没有提供MCP的支持,我现在是在Mac上,通过OpenAI Schema的方式使用的。但我看rikkahub是不支持这种方式的。
    如果还是想用的话,就得自己写项目转发了,用Claude Code、Codex或者其他的AI工具,写个小Python项目,用FastAPI库,提供API接口,用FastAPI-MCP库,一两行代码就能把API接口变成支持MCP的服务。然后再让AI编写docker-compose.yml,以使这个项目支持docker-compose部署。最后,rikkahub连你自己的这个服务就行了。

    Searxng倒是支持MCP,但也是电脑上用的,比如这个:https://github.com/ihor-sokoliuk/mcp-searxng 如果想在手机上用,可以试试这个库行不行:https://github.com/supercorp-ai/supergateway
    SuperGateway可以将stdio的MCP转成sse或streamable-http的MCP。然后用rikkahub连这个转换后的MCP。理论上可以用Searxng。

    附上我使用的方式,供你参考
    Perplexica API文档:https://github.com/ItzCrazyKns/Perplexica/blob/master/docs/API/SEARCH.md

    附录一:Perplexica OpenAI Schema

    openapi: 3.1.0
    info:
      title: Perplexica Search API
      description: API for interacting with Perplexica's AI-powered search engine.
      version: 1.0.0
    servers:
      - url: http://host.docker.internal:3090/api
        description: Local development server
    paths:
      /search:
        post:
          operationId: search
          summary: Perform a search using Perplexica's AI-powered engine.
          description: |
            Executes a search based on the provided parameters, utilizing specified models and focus modes.
          requestBody:
            required: true
            content:
              application/json:
                schema:
                  type: object
                  properties:
                    chatModel:
                      type: object
                      description: Defines the chat model to be used for the query.
                      properties:
                        providerId:
                          type: string
                          description: Specifies the providerId for the chat model. Always 'f6c4869d-dffa-46ab-8e30-113619bc2814'.
                          example: f6c4869d-dffa-46ab-8e30-113619bc2814
                        key:
                          type: string
                          description: The specific model from the chosen provider. Always 'deepseek-ai/DeepSeek-V3.2-Exp'.
                          example: deepseek-ai/DeepSeek-V3.2-Exp
                      required:
                        - providerId
                        - key
                    embeddingModel:
                      type: object
                      description: Defines the embedding model for similarity-based searching.
                      properties:
                        providerId:
                          type: string
                          description: The providerId for the embedding model. Always '200f9e7c-3992-42f4-9a9e-2baec93be05f'.
                          example: 200f9e7c-3992-42f4-9a9e-2baec93be05f
                        key:
                          type: string
                          description: The specific embedding model. Always 'text-embedding-3-small'.
                          example: text-embedding-3-small
                      required:
                        - providerId
                        - name
                    focusMode:
                      type: string
                      description: Specifies which focus mode to use.
                      enum:
                        - webSearch
                        - academicSearch
                        - writingAssistant
                        - wolframAlphaSearch
                        - youtubeSearch
                        - redditSearch
                      example: webSearch
                    optimizationMode:
                      type: string
                      description: Specifies the optimization mode to control the balance between performance and quality.
                      enum:
                        - speed
                        - balanced
                      example: speed
                    query:
                      type: string
                      description: The search query or question.
                      example: What is Perplexica?
                    systemInstructions:
                      type: string
                      description: Custom instructions to guide the AI's response.
                      example: Focus on providing technical details about Perplexica's architecture.
                    history:
                      type: array
                      description: An array of message pairs representing the conversation history.
                      items:
                        type: array
                        items:
                          type: string
                      example:
                        - - human
                          - What is Perplexica?
                        - - assistant
                          - Perplexica is an AI-powered search engine...
                    stream:
                      type: boolean
                      description: When set to true, enables streaming responses.
                      example: false
                  required:
                    - chatModel
                    - embeddingModel
                    - focusMode
                    - optimizationMode
                    - query
                    - systemInstructions
          responses:
            '200':
              description: Successful response containing the search result and sources.
              content:
                application/json:
                  schema:
                    type: object
                    properties:
                      message:
                        type: string
                        description: The search result generated based on the query and focus mode.
                        example: Perplexica is an innovative, open-source AI-powered search engine...
                      sources:
                        type: array
                        description: A list of sources used to generate the search result.
                        items:
                          type: object
                          properties:
                            pageContent:
                              type: string
                              description: A snippet of the relevant content from the source.
                              example: Perplexica is an innovative, open-source AI-powered search engine...
                            metadata:
                              type: object
                              properties:
                                title:
                                  type: string
                                  description: The title of the webpage.
                                  example: What is Perplexica, and how does it function as an AI-powered search ...
                                url:
                                  type: string
                                  description: The URL of the webpage.
                                  example: https://askai.glarity.app/search/What-is-Perplexica--and-how-does-it-function-as-an-AI-powered-search-engine
            '400':
              description: Bad request due to malformed or missing required fields.
            '500':
              description: Internal server error during the search process.
    
    

    附录二:Searxng MCP 在 LibreChat中的配置方式

      searxng:
        type: stdio
        command: npx
        args:
          - -y
          - "mcp-searxng"
        env:
          SEARXNG_URL: "http://host.docker.internal:4000"
        timeout: 60000
        initTimeout: 30000
    
    

    附录三:supergateway使用方式,我现在使用的脚本
    我用screen命令,来让服务能够保持在终端后台运行
    我的脚本,启动了三个服务,puppeteer、iMCP、DesktopCommander
    supergateway命令,参考这个写法

        # 定义启动命令 - 全部使用 supergateway
        local puppeteer_cmd="export PUPPETEER_LAUNCH_OPTIONS='{\"defaultViewport\": {\"width\": 1710, \"height\": 1107}}' && npx -y supergateway --stdio \"npx -y @modelcontextprotocol/server-puppeteer\" --port ${PUPPETEER_PORT}"
        local imcp_cmd="npx -y supergateway --stdio \"${IMCP_PATH}\" --outputTransport streamableHttp --port ${IMCP_PORT}"
        local desktop_commander_cmd="npx -y supergateway --stdio \"npx -y @wonderwhy-er/desktop-commander@latest\" --port ${DESKTOP_COMMANDER_PORT}"
    

    完整脚本参考:

    #!/bin/bash
    
    # --- 配置区 ---
    # 将所有可变配置项放在这里,方便修改
    PUPPETEER_PORT=8110
    IMCP_PORT=8111
    DESKTOP_COMMANDER_PORT=8112
    IMCP_PATH="/Applications/iMCP.app/Contents/MacOS/imcp-server"
    
    # --- 颜色定义 (可选,用于美化输出) ---
    GREEN='\033[0;32m'
    RED='\033[0;31m'
    YELLOW='\033[1;33m'
    NC='\033[0m' # No Color
    
    # --- 函数定义 ---
    
    # 检查并杀死占用指定端口的进程
    check_and_kill_port() {
        local port=$1
        echo "检查端口 ${port}..."
        # 使用 lsof 查找占用端口的 PID
        # -i TCP:${port} 指定端口, -sTCP:LISTEN 只看监听状态, -t 只输出PID
        local pid=$(lsof -i TCP:${port} -sTCP:LISTEN -t)
    
        if [ -n "$pid" ]; then
            echo -e "${YELLOW}警告:端口 ${port} 已被进程 PID: ${pid} 占用。正在尝试终止...${NC}"
            # 使用 kill -9 强制终止,确保端口被释放
            kill -9 "$pid"
            # 等待一小段时间确保进程已退出
            sleep 1
            echo "旧进程已终止。"
        else
            echo "端口 ${port} 可用。"
        fi
    }
    
    # 停止所有 screen 会话
    stop_services() {
        echo "正在停止服务..."
        screen -S puppeteer -X quit 2>/dev/null
        screen -S iMCP -X quit 2>/dev/null
        screen -S desktop-commander -X quit 2>/dev/null
        # 增加等待时间,确保服务有足够时间关闭和释放资源
        sleep 2
        echo "服务停止命令已发送。"
    }
    
    # 启动单个服务并进行验证
    start_service() {
        local name=$1
        local port=$2
        local cmd=$3
    
        echo "------------------------------------------------------"
        echo "启动 ${name} 服务 (端口: ${port})..."
        
        # 1. 检查并清理端口
        check_and_kill_port "$port"
    
        # 2. 使用 screen 启动服务
        screen -d -m -S "${name}" /bin/bash -c "${cmd}"
        
        # 3. 验证服务是否成功监听端口
        echo "等待服务启动并验证 (最多等待10秒)..."
        for i in {1..10}; do
            if lsof -i TCP:${port} -sTCP:LISTEN -t >/dev/null; then
                echo -e "${GREEN}✅ ${name} 服务已成功启动并监听端口 ${port}。${NC}"
                return 0 # 返回成功
            fi
            sleep 1
        done
    
        # 如果10秒后仍未启动,则报告失败
        echo -e "${RED}❌ 错误:${name} 服务启动失败!${NC}"
        echo "请使用 'screen -r ${name}' 查看日志以排查问题。"
        return 1 # 返回失败
    }
    
    # 主函数
    main() {
        # 停止服务逻辑
        if [ "$1" == "stop" ]; then
            stop_services
            echo -e "${GREEN}所有服务已停止。${NC}"
            exit 0
        fi
    
        # 依赖检查
        if ! command -v screen &> /dev/null; then
            echo -e "${RED}错误:未找到 screen 命令。请先安装。${NC}"
            # (此处省略了安装指南,原脚本已有)
            exit 1
        fi
        if ! command -v npx &> /dev/null; then
            echo -e "${RED}错误:未找到 npx 命令。请确保 Node.js 已安装并配置好环境。${NC}"
            exit 1
        fi
        if [ ! -f "$IMCP_PATH" ]; then
            echo -e "${RED}错误:未找到 iMCP 服务程序: ${IMCP_PATH}${NC}"
            exit 1
        fi
    
        # 确保在启动前,先执行一次停止操作,清理旧会话
        stop_services
    
        # 定义启动命令 - 全部使用 supergateway
        local puppeteer_cmd="export PUPPETEER_LAUNCH_OPTIONS='{\"defaultViewport\": {\"width\": 1710, \"height\": 1107}}' && npx -y supergateway --stdio \"npx -y @modelcontextprotocol/server-puppeteer\" --port ${PUPPETEER_PORT}"
        local imcp_cmd="npx -y supergateway --stdio \"${IMCP_PATH}\" --outputTransport streamableHttp --port ${IMCP_PORT}"
        local desktop_commander_cmd="npx -y supergateway --stdio \"npx -y @wonderwhy-er/desktop-commander@latest\" --port ${DESKTOP_COMMANDER_PORT}"
        
        # 启动服务
        start_service "puppeteer" "$PUPPETEER_PORT" "$puppeteer_cmd"
        local puppeteer_status=$?
    
        start_service "iMCP" "$IMCP_PORT" "$imcp_cmd"
        local imcp_status=$?
    
        start_service "desktop-commander" "$DESKTOP_COMMANDER_PORT" "$desktop_commander_cmd"
        local desktop_commander_status=$?
    
        # 最终状态报告
        echo "------------------------------------------------------"
        if [ $puppeteer_status -eq 0 ] && [ $imcp_status -eq 0 ] && [ $desktop_commander_status -eq 0 ]; then
            echo -e "${GREEN}✅ 所有服务已成功启动!${NC}"
        else
            echo -e "${RED}❌ 部分或全部服务启动失败,请检查上面的日志。${NC}"
        fi
        
        echo ""
        echo "服务状态:"
        echo "puppeteer        : $(screen -list | grep -q 'puppeteer' && echo '运行中' || echo '未运行')"
        echo "iMCP             : $(screen -list | grep -q 'iMCP' && echo '运行中' || echo '未运行')"
        echo "desktop-commander: $(screen -list | grep -q 'desktop-commander' && echo '运行中' || echo '未运行')"
        echo "------------------------------------------------------"
        echo "服务端口:"
        echo "puppeteer        : ${PUPPETEER_PORT}"
        echo "iMCP             : ${IMCP_PORT}"
        echo "desktop-commander: ${DESKTOP_COMMANDER_PORT}"
        echo "------------------------------------------------------"
        echo "管理命令:"
        echo "1. 查看所有会话:screen -ls"
        echo "2. 查看 puppeteer 日志:screen -r puppeteer"
        echo "3. 查看 iMCP 日志:screen -r iMCP"
        echo "4. 查看 desktop-commander 日志:screen -r desktop-commander"
        echo "5. 退出查看模式:按下 Ctrl + A 后按 D 键"
        echo "6. 停止所有服务:$0 stop" # 使用 $0 自动获取脚本名
    }
    
    # --- 脚本执行入口 ---
    main "$@"
    
    

你好啊,陌生人!

我的朋友,看起来你是新来的,如果想参与到讨论中,点击下面的按钮!

📈用户数目📈

目前论坛共有13137位用户

🎉欢迎新用户🎉