diff --git a/CONTRIBUTING b/CONTRIBUTING index 2c4ef78..dce2575 100644 --- a/CONTRIBUTING +++ b/CONTRIBUTING @@ -17,11 +17,14 @@ There are many ways you can contribute to DeerFlow: 1. Fork the repository 2. Clone your fork: + ```bash git clone https://github.com/bytedance/deer-flow.git cd deer-flow ``` + 3. Set up your development environment: + ```bash # Install dependencies, uv will take care of the python interpreter and venv creation uv sync @@ -30,7 +33,9 @@ There are many ways you can contribute to DeerFlow: uv pip install -e ".[dev]" uv pip install -e ".[test]" ``` + 4. Configure pre-commit hooks: + ```bash chmod +x pre-commit ln -s ../../pre-commit .git/hooks/pre-commit @@ -39,6 +44,7 @@ There are many ways you can contribute to DeerFlow: ## Development Process 1. Create a new branch: + ```bash git checkout -b feature/amazing-feature ``` @@ -50,6 +56,7 @@ There are many ways you can contribute to DeerFlow: - Update documentation as needed 3. Run tests and checks: + ```bash make test # Run tests make lint # Run linting @@ -58,11 +65,13 @@ There are many ways you can contribute to DeerFlow: ``` 4. Commit your changes: + ```bash git commit -m 'Add some amazing feature' ``` 5. Push to your fork: + ```bash git push origin feature/amazing-feature ``` @@ -90,6 +99,7 @@ There are many ways you can contribute to DeerFlow: ## Testing Run the test suite: + ```bash # Run all tests make test @@ -122,6 +132,7 @@ make format ## Need Help? If you need help with anything: + - Check existing issues and discussions - Join our community channels - Ask questions in discussions diff --git a/Makefile b/Makefile index 3b662a6..3a5fb48 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,7 @@ format: lint: uv run black --check . + uv run ruff check . serve: uv run server.py --reload diff --git a/README.md b/README.md index 0c100ef..5973ea5 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Please visit [our official website](https://deerflow.tech/) for more details. ### Video -https://github.com/user-attachments/assets/f3786598-1f2a-4d07-919e-8b99dfa1de3e + In this demo, we showcase how to use DeerFlow to: @@ -152,16 +152,13 @@ Explore more details in the [`web`](./web/) directory. DeerFlow supports multiple search engines that can be configured in your `.env` file using the `SEARCH_API` variable: - **Tavily** (default): A specialized search API for AI applications - - Requires `TAVILY_API_KEY` in your `.env` file - Sign up at: https://app.tavily.com/home - **DuckDuckGo**: Privacy-focused search engine - - No API key required - **Brave Search**: Privacy-focused search engine with advanced features - - Requires `BRAVE_SEARCH_API_KEY` in your `.env` file - Sign up at: https://brave.com/search/api/ @@ -202,7 +199,6 @@ DeerFlow support private knowledgebase such as ragflow and vikingdb, so that you ### Tools and MCP Integrations - 🔍 **Search and Retrieval** - - Web search via Tavily, Brave Search and more - Crawling with Jina - Advanced content extraction @@ -219,7 +215,6 @@ DeerFlow support private knowledgebase such as ragflow and vikingdb, so that you ### Human Collaboration - 🧠 **Human-in-the-loop** - - Supports interactive modification of research plans using natural language - Supports auto-acceptance of research plans @@ -527,6 +522,7 @@ DeerFlow includes a human in the loop mechanism that allows you to review, edit, - Via API: Set `auto_accepted_plan: true` in your request 4. **API Integration**: When using the API, you can provide feedback through the `feedback` parameter: + ```json { "messages": [{ "role": "user", "content": "What is quantum computing?" }], diff --git a/README_de.md b/README_de.md index 53638e7..bf36be3 100644 --- a/README_de.md +++ b/README_de.md @@ -19,9 +19,10 @@ Besuchen Sie [unsere offizielle Website](https://deerflow.tech/) für weitere De ### Video -https://github.com/user-attachments/assets/f3786598-1f2a-4d07-919e-8b99dfa1de3e + In dieser Demo zeigen wir, wie man DeerFlow nutzt, um: + - Nahtlos mit MCP-Diensten zu integrieren - Den Prozess der tiefgehenden Recherche durchzuführen und einen umfassenden Bericht mit Bildern zu erstellen - Podcast-Audio basierend auf dem generierten Bericht zu erstellen @@ -36,7 +37,6 @@ In dieser Demo zeigen wir, wie man DeerFlow nutzt, um: --- - ## 📑 Inhaltsverzeichnis - [🚀 Schnellstart](#schnellstart) @@ -50,12 +50,12 @@ In dieser Demo zeigen wir, wie man DeerFlow nutzt, um: - [💖 Danksagungen](#danksagungen) - [⭐ Star-Verlauf](#star-verlauf) - ## Schnellstart DeerFlow ist in Python entwickelt und kommt mit einer in Node.js geschriebenen Web-UI. Um einen reibungslosen Einrichtungsprozess zu gewährleisten, empfehlen wir die Verwendung der folgenden Tools: ### Empfohlene Tools + - **[`uv`](https://docs.astral.sh/uv/getting-started/installation/):** Vereinfacht die Verwaltung von Python-Umgebungen und Abhängigkeiten. `uv` erstellt automatisch eine virtuelle Umgebung im Stammverzeichnis und installiert alle erforderlichen Pakete für Sie—keine manuelle Installation von Python-Umgebungen notwendig. @@ -66,11 +66,14 @@ DeerFlow ist in Python entwickelt und kommt mit einer in Node.js geschriebenen W Installieren und verwalten Sie Abhängigkeiten des Node.js-Projekts. ### Umgebungsanforderungen + Stellen Sie sicher, dass Ihr System die folgenden Mindestanforderungen erfüllt: + - **[Python](https://www.python.org/downloads/):** Version `3.12+` - **[Node.js](https://nodejs.org/en/download/):** Version `22+` ### Installation + ```bash # Repository klonen git clone https://github.com/bytedance/deer-flow.git @@ -138,25 +141,24 @@ bootstrap.bat -d Weitere Details finden Sie im Verzeichnis [`web`](./web/). - ## Unterstützte Suchmaschinen DeerFlow unterstützt mehrere Suchmaschinen, die in Ihrer `.env`-Datei über die Variable `SEARCH_API` konfiguriert werden können: - **Tavily** (Standard): Eine spezialisierte Such-API für KI-Anwendungen - - Erfordert `TAVILY_API_KEY` in Ihrer `.env`-Datei - - Registrieren Sie sich unter: https://app.tavily.com/home + - Erfordert `TAVILY_API_KEY` in Ihrer `.env`-Datei + - Registrieren Sie sich unter: - **DuckDuckGo**: Datenschutzorientierte Suchmaschine - - Kein API-Schlüssel erforderlich + - Kein API-Schlüssel erforderlich - **Brave Search**: Datenschutzorientierte Suchmaschine mit erweiterten Funktionen - - Erfordert `BRAVE_SEARCH_API_KEY` in Ihrer `.env`-Datei - - Registrieren Sie sich unter: https://brave.com/search/api/ + - Erfordert `BRAVE_SEARCH_API_KEY` in Ihrer `.env`-Datei + - Registrieren Sie sich unter: - **Arxiv**: Wissenschaftliche Papiersuche für akademische Forschung - - Kein API-Schlüssel erforderlich - - Spezialisiert auf wissenschaftliche und akademische Papiere + - Kein API-Schlüssel erforderlich + - Spezialisiert auf wissenschaftliche und akademische Papiere Um Ihre bevorzugte Suchmaschine zu konfigurieren, setzen Sie die Variable `SEARCH_API` in Ihrer `.env`-Datei: @@ -170,40 +172,39 @@ SEARCH_API=tavily ### Kernfähigkeiten - 🤖 **LLM-Integration** - - Unterstützt die Integration der meisten Modelle über [litellm](https://docs.litellm.ai/docs/providers). - - Unterstützung für Open-Source-Modelle wie Qwen - - OpenAI-kompatible API-Schnittstelle - - Mehrstufiges LLM-System für unterschiedliche Aufgabenkomplexitäten + - Unterstützt die Integration der meisten Modelle über [litellm](https://docs.litellm.ai/docs/providers). + - Unterstützung für Open-Source-Modelle wie Qwen + - OpenAI-kompatible API-Schnittstelle + - Mehrstufiges LLM-System für unterschiedliche Aufgabenkomplexitäten ### Tools und MCP-Integrationen - 🔍 **Suche und Abruf** - - Websuche über Tavily, Brave Search und mehr - - Crawling mit Jina - - Fortgeschrittene Inhaltsextraktion + - Websuche über Tavily, Brave Search und mehr + - Crawling mit Jina + - Fortgeschrittene Inhaltsextraktion - 🔗 **MCP Nahtlose Integration** - - Erweiterte Fähigkeiten für privaten Domänenzugriff, Wissensgraphen, Webbrowsing und mehr - - Erleichtert die Integration verschiedener Forschungswerkzeuge und -methoden + - Erweiterte Fähigkeiten für privaten Domänenzugriff, Wissensgraphen, Webbrowsing und mehr + - Erleichtert die Integration verschiedener Forschungswerkzeuge und -methoden ### Menschliche Zusammenarbeit - 🧠 **Mensch-in-der-Schleife** - - Unterstützt interaktive Modifikation von Forschungsplänen mit natürlicher Sprache - - Unterstützt automatische Akzeptanz von Forschungsplänen + - Unterstützt interaktive Modifikation von Forschungsplänen mit natürlicher Sprache + - Unterstützt automatische Akzeptanz von Forschungsplänen - 📝 **Bericht-Nachbearbeitung** - - Unterstützt Notion-ähnliche Blockbearbeitung - - Ermöglicht KI-Verfeinerungen, einschließlich KI-unterstützter Polierung, Satzkürzung und -erweiterung - - Angetrieben von [tiptap](https://tiptap.dev/) + - Unterstützt Notion-ähnliche Blockbearbeitung + - Ermöglicht KI-Verfeinerungen, einschließlich KI-unterstützter Polierung, Satzkürzung und -erweiterung + - Angetrieben von [tiptap](https://tiptap.dev/) ### Inhaltserstellung - 🎙️ **Podcast- und Präsentationserstellung** - - KI-gestützte Podcast-Skripterstellung und Audiosynthese - - Automatisierte Erstellung einfacher PowerPoint-Präsentationen - - Anpassbare Vorlagen für maßgeschneiderte Inhalte - + - KI-gestützte Podcast-Skripterstellung und Audiosynthese + - Automatisierte Erstellung einfacher PowerPoint-Präsentationen + - Anpassbare Vorlagen für maßgeschneiderte Inhalte ## Architektur @@ -255,7 +256,6 @@ curl --location 'http://localhost:8000/api/tts' \ --output speech.mp3 ``` - ## Entwicklung ### Testen @@ -313,9 +313,10 @@ langgraph dev ``` Nach dem Start des LangGraph-Servers sehen Sie mehrere URLs im Terminal: -- API: http://127.0.0.1:2024 -- Studio UI: https://smith.langchain.com/studio/?baseUrl=http://127.0.0.1:2024 -- API-Dokumentation: http://127.0.0.1:2024/docs + +- API: +- Studio UI: +- API-Dokumentation: Öffnen Sie den Studio UI-Link in Ihrem Browser, um auf die Debugging-Schnittstelle zuzugreifen. @@ -330,6 +331,7 @@ In der Studio UI können Sie: 5. Feedback während der Planungsphase geben, um Forschungspläne zu verfeinern Wenn Sie ein Forschungsthema in der Studio UI einreichen, können Sie die gesamte Workflow-Ausführung sehen, einschließlich: + - Die Planungsphase, in der der Forschungsplan erstellt wird - Die Feedback-Schleife, in der Sie den Plan ändern können - Die Forschungs- und Schreibphasen für jeden Abschnitt @@ -340,6 +342,7 @@ Wenn Sie ein Forschungsthema in der Studio UI einreichen, können Sie die gesamt DeerFlow unterstützt LangSmith-Tracing, um Ihnen beim Debuggen und Überwachen Ihrer Workflows zu helfen. Um LangSmith-Tracing zu aktivieren: 1. Stellen Sie sicher, dass Ihre `.env`-Datei die folgenden Konfigurationen enthält (siehe `.env.example`): + ```bash LANGSMITH_TRACING=true LANGSMITH_ENDPOINT="https://api.smith.langchain.com" @@ -348,6 +351,7 @@ DeerFlow unterstützt LangSmith-Tracing, um Ihnen beim Debuggen und Überwachen ``` 2. Starten Sie das Tracing mit LangSmith lokal, indem Sie folgenden Befehl ausführen: + ```bash langgraph dev ``` @@ -421,6 +425,7 @@ uv run main.py --help Die Anwendung unterstützt jetzt einen interaktiven Modus mit eingebauten Fragen in Englisch und Chinesisch: 1. Starten Sie den interaktiven Modus: + ```bash uv run main.py --interactive ``` @@ -446,6 +451,7 @@ DeerFlow enthält einen Mensch-in-der-Schleife-Mechanismus, der es Ihnen ermögl - Über API: Setzen Sie `auto_accepted_plan: true` in Ihrer Anfrage 4. **API-Integration**: Bei Verwendung der API können Sie Feedback über den Parameter `feedback` geben: + ```json { "messages": [{"role": "user", "content": "Was ist Quantencomputing?"}], @@ -485,6 +491,7 @@ Wir möchten unsere aufrichtige Wertschätzung den folgenden Projekten für ihre Diese Projekte veranschaulichen die transformative Kraft der Open-Source-Zusammenarbeit, und wir sind stolz darauf, auf ihren Grundlagen aufzubauen. ### Hauptmitwirkende + Ein herzliches Dankeschön geht an die Hauptautoren von `DeerFlow`, deren Vision, Leidenschaft und Engagement dieses Projekt zum Leben erweckt haben: - **[Daniel Walnut](https://github.com/hetaoBackend/)** @@ -494,4 +501,4 @@ Ihr unerschütterliches Engagement und Fachwissen waren die treibende Kraft hint ## Star-Verlauf -[![Star History Chart](https://api.star-history.com/svg?repos=bytedance/deer-flow&type=Date)](https://star-history.com/#bytedance/deer-flow&Date) \ No newline at end of file +[![Star History Chart](https://api.star-history.com/svg?repos=bytedance/deer-flow&type=Date)](https://star-history.com/#bytedance/deer-flow&Date) diff --git a/README_es.md b/README_es.md index d09f23a..8da4b2e 100644 --- a/README_es.md +++ b/README_es.md @@ -19,7 +19,7 @@ Por favor, visita [nuestra página web oficial](https://deerflow.tech/) para má ### Video -https://github.com/user-attachments/assets/f3786598-1f2a-4d07-919e-8b99dfa1de3e + En esta demostración, mostramos cómo usar DeerFlow para: @@ -150,7 +150,7 @@ DeerFlow soporta múltiples motores de búsqueda que pueden configurarse en tu a - **Tavily** (predeterminado): Una API de búsqueda especializada para aplicaciones de IA - Requiere `TAVILY_API_KEY` en tu archivo `.env` - - Regístrate en: https://app.tavily.com/home + - Regístrate en: - **DuckDuckGo**: Motor de búsqueda centrado en la privacidad @@ -159,7 +159,7 @@ DeerFlow soporta múltiples motores de búsqueda que pueden configurarse en tu a - **Brave Search**: Motor de búsqueda centrado en la privacidad con características avanzadas - Requiere `BRAVE_SEARCH_API_KEY` en tu archivo `.env` - - Regístrate en: https://brave.com/search/api/ + - Regístrate en: - **Arxiv**: Búsqueda de artículos científicos para investigación académica - No requiere clave API @@ -325,9 +325,9 @@ langgraph dev Después de iniciar el servidor LangGraph, verás varias URLs en la terminal: -- API: http://127.0.0.1:2024 -- UI de Studio: https://smith.langchain.com/studio/?baseUrl=http://127.0.0.1:2024 -- Docs de API: http://127.0.0.1:2024/docs +- API: +- UI de Studio: +- Docs de API: Abre el enlace de UI de Studio en tu navegador para acceder a la interfaz de depuración. @@ -353,6 +353,7 @@ Cuando envías un tema de investigación en la UI de Studio, podrás ver toda la DeerFlow soporta el rastreo de LangSmith para ayudarte a depurar y monitorear tus flujos de trabajo. Para habilitar el rastreo de LangSmith: 1. Asegúrate de que tu archivo `.env` tenga las siguientes configuraciones (ver `.env.example`): + ```bash LANGSMITH_TRACING=true LANGSMITH_ENDPOINT="https://api.smith.langchain.com" @@ -361,6 +362,7 @@ DeerFlow soporta el rastreo de LangSmith para ayudarte a depurar y monitorear tu ``` 2. Inicia el rastreo y visualiza el grafo localmente con LangSmith ejecutando: + ```bash langgraph dev ``` @@ -504,6 +506,7 @@ DeerFlow incluye un mecanismo de humano en el bucle que te permite revisar, edit - Vía API: Establece `auto_accepted_plan: true` en tu solicitud 4. **Integración API**: Cuando uses la API, puedes proporcionar retroalimentación a través del parámetro `feedback`: + ```json { "messages": [{ "role": "user", "content": "¿Qué es la computación cuántica?" }], @@ -553,4 +556,4 @@ Su compromiso inquebrantable y experiencia han sido la fuerza impulsora detrás ## Historial de Estrellas -[![Gráfico de Historial de Estrellas](https://api.star-history.com/svg?repos=bytedance/deer-flow&type=Date)](https://star-history.com/#bytedance/deer-flow&Date) \ No newline at end of file +[![Gráfico de Historial de Estrellas](https://api.star-history.com/svg?repos=bytedance/deer-flow&type=Date)](https://star-history.com/#bytedance/deer-flow&Date) diff --git a/README_ja.md b/README_ja.md index c148e5c..dc18fdf 100644 --- a/README_ja.md +++ b/README_ja.md @@ -17,11 +17,11 @@ ### ビデオ -https://github.com/user-attachments/assets/f3786598-1f2a-4d07-919e-8b99dfa1de3e + -このデモでは、DeerFlow の使用方法を紹介しています: +このデモでは、DeerFlowの使用方法を紹介しています: -- MCP サービスとのシームレスな統合 +- MCPサービスとのシームレスな統合 - 深層研究プロセスの実施と画像を含む包括的なレポートの作成 - 生成されたレポートに基づくポッドキャストオーディオの作成 @@ -145,21 +145,18 @@ bootstrap.bat -d DeerFlow は複数の検索エンジンをサポートしており、`.env`ファイルの`SEARCH_API`変数で設定できます: - **Tavily**(デフォルト):AI アプリケーション向けの専門検索 API - - `.env`ファイルに`TAVILY_API_KEY`が必要 - - 登録先:https://app.tavily.com/home + - 登録先: - **DuckDuckGo**:プライバシー重視の検索エンジン - - - API キー不要 + - APIキー不要 - **Brave Search**:高度な機能を備えたプライバシー重視の検索エンジン - - `.env`ファイルに`BRAVE_SEARCH_API_KEY`が必要 - - 登録先:https://brave.com/search/api/ + - 登録先: - **Arxiv**:学術研究用の科学論文検索 - - API キー不要 + - APIキー不要 - 科学・学術論文専用 お好みの検索エンジンを設定するには、`.env`ファイルで`SEARCH_API`変数を設定します: @@ -173,41 +170,39 @@ SEARCH_API=tavily ### コア機能 -- 🤖 **LLM 統合** +- 🤖 **LLM統合** - [litellm](https://docs.litellm.ai/docs/providers)を通じてほとんどのモデルの統合をサポート - - Qwen などのオープンソースモデルをサポート - - OpenAI 互換の API インターフェース - - 異なるタスクの複雑さに対応するマルチティア LLM システム + - Qwenなどのオープンソースモデルをサポート + - OpenAI互換のAPIインターフェース + - 異なるタスクの複雑さに対応するマルチティアLLMシステム ### ツールと MCP 統合 - 🔍 **検索と取得** - - - Tavily、Brave Search などを通じた Web 検索 - - Jina を使用したクローリング + - Tavily、Brave Searchなどを通じたWeb検索 + - Jinaを使用したクローリング - 高度なコンテンツ抽出 -- 🔗 **MCP シームレス統合** - - プライベートドメインアクセス、ナレッジグラフ、Web ブラウジングなどの機能を拡張 +- 🔗 **MCPシームレス統合** + - プライベートドメインアクセス、ナレッジグラフ、Webブラウジングなどの機能を拡張 - 多様な研究ツールと方法論の統合を促進 ### 人間との協力 - 🧠 **人間参加型ループ** - - 自然言語を使用した研究計画の対話的修正をサポート - 研究計画の自動承認をサポート - 📝 **レポート後編集** - - Notion ライクなブロック編集をサポート - - AI 支援による洗練、文の短縮、拡張などの AI 改良を可能に + - Notionライクなブロック編集をサポート + - AI支援による洗練、文の短縮、拡張などのAI改良を可能に - [tiptap](https://tiptap.dev/)を活用 ### コンテンツ作成 - 🎙️ **ポッドキャストとプレゼンテーション生成** - - AI 駆動のポッドキャストスクリプト生成と音声合成 - - シンプルな PowerPoint プレゼンテーションの自動作成 + - AI駆動のポッドキャストスクリプト生成と音声合成 + - シンプルなPowerPointプレゼンテーションの自動作成 - カスタマイズ可能なテンプレートで個別のコンテンツに対応 ## アーキテクチャ @@ -243,6 +238,27 @@ DeerFlow は、自動研究とコード分析のためのモジュラーなマ - 収集した情報を処理および構造化 - 包括的な研究レポートを生成 +## テキスト読み上げ統合 + +DeerFlowには現在、研究レポートを音声に変換できるテキスト読み上げ(TTS)機能が含まれています。この機能は火山引擎TTS APIを使用して高品質なテキストオーディオを生成します。速度、音量、ピッチなどの特性もカスタマイズ可能です。 + +### TTS APIの使用 + +`/api/tts`エンドポイントからTTS機能にアクセスできます: + +```bash +# curlを使用したAPI呼び出し例 +curl --location 'http://localhost:8000/api/tts' \ +--header 'Content-Type: application/json' \ +--data '{ + "text": "これはテキスト読み上げ機能のテストです。", + "speed_ratio": 1.0, + "volume_ratio": 1.0, + "pitch_ratio": 1.0 +}' \ +--output speech.mp3 +``` + ## 開発 ### テスト @@ -299,11 +315,15 @@ pip install -U "langgraph-cli[inmem]" langgraph dev ``` -LangGraph サーバーを開始すると、端末にいくつかの URL が表示されます: +LangGraphサーバーを開始すると、端末にいくつかのURLが表示されます: -- API: http://127.0.0.1:2024 -- Studio UI: https://smith.langchain.com/studio/?baseUrl=http://127.0.0.1:2024 -- API ドキュメント: http://127.0.0.1:2024/docs +- API: +- Studio UI: +- APIドキュメント: + +- API: +- Studio UI: +- APIドキュメント: ブラウザで Studio UI リンクを開いてデバッグインターフェースにアクセスします。 @@ -317,7 +337,7 @@ Studio UI では、次のことができます: 4. 各コンポーネントの入力と出力を検査して問題をデバッグ 5. 計画段階でフィードバックを提供して研究計画を洗練 -Studio UI で研究トピックを送信すると、次を含む全ワークフロー実行プロセスを見ることができます: +Studio UIで研究トピックを送信すると、次を含む全ワークフロー実行プロセスを見ることができます: - 研究計画を作成する計画段階 - 計画を修正できるフィードバックループ @@ -329,6 +349,7 @@ Studio UI で研究トピックを送信すると、次を含む全ワークフ DeerFlow は LangSmith トレース機能をサポートしており、ワークフローのデバッグとモニタリングに役立ちます。LangSmith トレースを有効にするには: 1. `.env` ファイルに次の設定があることを確認してください(`.env.example` を参照): + ```bash LANGSMITH_TRACING=true LANGSMITH_ENDPOINT="https://api.smith.langchain.com" @@ -337,6 +358,7 @@ DeerFlow は LangSmith トレース機能をサポートしており、ワーク ``` 2. 次のコマンドを実行して LangSmith トレースを開始します: + ```bash langgraph dev ``` @@ -498,9 +520,8 @@ DeerFlow には人間参加型ループメカニズムが含まれており、 3. **自動承認**:レビュープロセスをスキップするために自動承認を有効にできます: - - API 経由:リクエストで`auto_accepted_plan: true`を設定 +4. **API統合**:APIを使用する場合、`feedback`パラメータでフィードバックを提供できます: -4. **API 統合**:API を使用する場合、`feedback`パラメータでフィードバックを提供できます: ```json { "messages": [ diff --git a/README_pt.md b/README_pt.md index da5d88d..ccd9600 100644 --- a/README_pt.md +++ b/README_pt.md @@ -20,7 +20,7 @@ Por favor, visite [Nosso Site Oficial](https://deerflow.tech/) para maiores deta ### Video -https://github.com/user-attachments/assets/f3786598-1f2a-4d07-919e-8b99dfa1de3e + Nesse demo, nós demonstramos como usar o DeerFlow para: In this demo, we showcase how to use DeerFlow to: @@ -148,13 +148,12 @@ Explore mais detalhes no diretório [`web`](./web/) . ## Mecanismos de Busca Suportados - DeerFlow suporta múltiplos mecanismos de busca que podem ser configurados no seu arquivo `.env` usando a variável `SEARCH_API`: - **Tavily** (padrão): Uma API de busca especializada para aplicações de IA - Requer `TAVILY_API_KEY` no seu arquivo `.env` - - Inscreva-se em: https://app.tavily.com/home + - Inscreva-se em: - **DuckDuckGo**: Mecanismo de busca focado em privacidade @@ -163,7 +162,7 @@ DeerFlow suporta múltiplos mecanismos de busca que podem ser configurados no se - **Brave Search**: Mecanismo de busca focado em privacidade com funcionalidades avançadas - Requer `BRAVE_SEARCH_API_KEY` no seu arquivo `.env` - - Inscreva-se em: https://brave.com/search/api/ + - Inscreva-se em: - **Arxiv**: Busca de artigos científicos para pesquisa acadêmica - Não requer chave API @@ -204,7 +203,6 @@ SEARCH_API=tavily - 🧠 **Humano-no-processo** - - Suporta modificação interativa de planos de pesquisa usando linguagem natural - Suporta auto-aceite de planos de pesquisa @@ -333,9 +331,9 @@ langgraph dev Após iniciar o servidor LangGraph, você verá diversas URLs no seu terminal: -- API: http://127.0.0.1:2024 -- Studio UI: https://smith.langchain.com/studio/?baseUrl=http://127.0.0.1:2024 -- API Docs: http://127.0.0.1:2024/docs +- API: +- Studio UI: +- API Docs: Abra o link do Studio UI no seu navegador para acessar a interface de depuração. @@ -343,7 +341,6 @@ Abra o link do Studio UI no seu navegador para acessar a interface de depuraçã No Studio UI, você pode: - 1. Visualizar o grafo do fluxo de trabalho e como seus componentes se conectam 2. Rastrear a execução em tempo-real e ver como os dados fluem através do sistema 3. Inspecionar o estado de cada passo do fluxo de trabalho @@ -391,7 +388,7 @@ docker compose build docker compose up ``` -## Exemplos: +## Exemplos Os seguintes exemplos demonstram as capacidades do DeerFlow: @@ -494,7 +491,8 @@ DeerFlow inclue um mecanismo de humano no processo que permite a você revisar, - Via API: Defina `auto_accepted_plan: true` na sua requisição -4. **Integração de API**: Quanto usar a API, você pode fornecer um feedback através do parâmetro `feedback`: +4. **Integração de API**: Quanto usar a API, você pode fornecer um feedback através do parâmetro `feedback`: + ```json { "messages": [{ "role": "user", "content": "O que é computação quântica?" }], diff --git a/README_ru.md b/README_ru.md index f2c2097..a6bcf26 100644 --- a/README_ru.md +++ b/README_ru.md @@ -19,7 +19,7 @@ ### Видео -https://github.com/user-attachments/assets/f3786598-1f2a-4d07-919e-8b99dfa1de3e + В этой демонстрации мы показываем, как использовать DeerFlow для: @@ -150,7 +150,7 @@ DeerFlow поддерживает несколько поисковых сист - **Tavily** (по умолчанию): Специализированный поисковый API для приложений ИИ - Требуется `TAVILY_API_KEY` в вашем файле `.env` - - Зарегистрируйтесь на: https://app.tavily.com/home + - Зарегистрируйтесь на: - **DuckDuckGo**: Поисковая система, ориентированная на конфиденциальность @@ -159,7 +159,7 @@ DeerFlow поддерживает несколько поисковых сист - **Brave Search**: Поисковая система, ориентированная на конфиденциальность, с расширенными функциями - Требуется `BRAVE_SEARCH_API_KEY` в вашем файле `.env` - - Зарегистрируйтесь на: https://brave.com/search/api/ + - Зарегистрируйтесь на: - **Arxiv**: Поиск научных статей для академических исследований - Не требуется API-ключ @@ -325,9 +325,9 @@ langgraph dev После запуска сервера LangGraph вы увидите несколько URL в терминале: -- API: http://127.0.0.1:2024 -- Studio UI: https://smith.langchain.com/studio/?baseUrl=http://127.0.0.1:2024 -- API Docs: http://127.0.0.1:2024/docs +- API: +- Studio UI: +- API Docs: Откройте ссылку Studio UI в вашем браузере для доступа к интерфейсу отладки. @@ -353,6 +353,7 @@ langgraph dev DeerFlow поддерживает трассировку LangSmith, чтобы помочь вам отладить и контролировать ваши рабочие процессы. Чтобы включить трассировку LangSmith: 1. Убедитесь, что в вашем файле `.env` есть следующие конфигурации (см. `.env.example`): + ```bash LANGSMITH_TRACING=true LANGSMITH_ENDPOINT="https://api.smith.langchain.com" @@ -361,6 +362,7 @@ DeerFlow поддерживает трассировку LangSmith, чтобы ``` 2. Запустите трассировку и визуализируйте граф локально с LangSmith, выполнив: + ```bash langgraph dev ``` @@ -504,6 +506,7 @@ DeerFlow включает механизм "человек в контуре", - Через API: Установите `auto_accepted_plan: true` в вашем запросе 4. **Интеграция API**: При использовании API вы можете предоставить обратную связь через параметр `feedback`: + ```json { "messages": [{ "role": "user", "content": "Что такое квантовые вычисления?" }], diff --git a/README_zh.md b/README_zh.md index 4210838..40c2c02 100644 --- a/README_zh.md +++ b/README_zh.md @@ -17,7 +17,7 @@ ### 视频 -https://github.com/user-attachments/assets/f3786598-1f2a-4d07-919e-8b99dfa1de3e + 在此演示中,我们展示了如何使用 DeerFlow: @@ -46,7 +46,7 @@ https://github.com/user-attachments/assets/f3786598-1f2a-4d07-919e-8b99dfa1de3e - [❓ 常见问题](#常见问题) - [📜 许可证](#许可证) - [💖 致谢](#致谢) -- [⭐ Star History](#star-History) +- [⭐ Star History](#star-history) ## 快速开始 @@ -108,7 +108,7 @@ pnpm install 请参阅[配置指南](docs/configuration_guide.md)获取更多详情。 -> [!注意] +> [! 注意] > 在启动项目之前,请仔细阅读指南,并更新配置以匹配您的特定设置和要求。 ### 控制台 UI @@ -123,8 +123,7 @@ uv run main.py ### Web UI 本项目还包括一个 Web UI,提供更加动态和引人入胜的交互体验。 - -> [!注意] +> [! 注意] > 您需要先安装 Web UI 的依赖。 ```bash @@ -147,18 +146,15 @@ bootstrap.bat -d DeerFlow 支持多种搜索引擎,可以在`.env`文件中通过`SEARCH_API`变量进行配置: - **Tavily**(默认):专为 AI 应用设计的专业搜索 API - - 需要在`.env`文件中设置`TAVILY_API_KEY` - - 注册地址:https://app.tavily.com/home + - 注册地址: - **DuckDuckGo**:注重隐私的搜索引擎 - - 无需 API 密钥 - **Brave Search**:具有高级功能的注重隐私的搜索引擎 - - 需要在`.env`文件中设置`BRAVE_SEARCH_API_KEY` - - 注册地址:https://brave.com/search/api/ + - 注册地址: - **Arxiv**:用于学术研究的科学论文搜索 - 无需 API 密钥 @@ -224,7 +220,6 @@ DeerFlow 支持基于私有域知识的检索,您可以将文档上传到多 ### 人机协作 - 🧠 **人在环中** - - 支持使用自然语言交互式修改研究计划 - 支持自动接受研究计划 @@ -263,16 +258,36 @@ DeerFlow 实现了一个模块化的多智能体系统架构,专为自动化 - 管理研究流程并决定何时生成最终报告 3. **研究团队**:执行计划的专业智能体集合: - - **研究员**:使用网络搜索引擎、爬虫甚至 MCP 服务等工具进行网络搜索和信息收集。 - **编码员**:使用 Python REPL 工具处理代码分析、执行和技术任务。 - 每个智能体都可以访问针对其角色优化的特定工具,并在 LangGraph 框架内运行 + 每个智能体都可以访问针对其角色优化的特定工具,并在 LangGraph 框架内运行 4. **报告员**:研究输出的最终阶段处理器 - 汇总研究团队的发现 - 处理和组织收集的信息 - 生成全面的研究报告 +## 文本转语音集成 + +DeerFlow 现在包含一个文本转语音 (TTS) 功能,允许您将研究报告转换为语音。此功能使用火山引擎 TTS API 生成高质量的文本音频。速度、音量和音调等特性也可以自定义。 + +### 使用 TTS API + +您可以通过`/api/tts`端点访问 TTS 功能: + +```bash +# 使用curl的API调用示例 +curl --location 'http://localhost:8000/api/tts' \ +--header 'Content-Type: application/json' \ +--data '{ + "text": "这是文本转语音功能的测试。", + "speed_ratio": 1.0, + "volume_ratio": 1.0, + "pitch_ratio": 1.0 +}' \ +--output speech.mp3 +``` + ## 开发 ### 测试 @@ -331,9 +346,9 @@ langgraph dev 启动 LangGraph 服务器后,您将在终端中看到几个 URL: -- API: http://127.0.0.1:2024 -- Studio UI: https://smith.langchain.com/studio/?baseUrl=http://127.0.0.1:2024 -- API 文档: http://127.0.0.1:2024/docs +- API: +- Studio UI: +- API 文档: 在浏览器中打开 Studio UI 链接以访问调试界面。 @@ -359,6 +374,7 @@ langgraph dev DeerFlow 支持 LangSmith 追踪功能,帮助您调试和监控工作流。要启用 LangSmith 追踪: 1. 确保您的 `.env` 文件中有以下配置(参见 `.env.example`): + ```bash LANGSMITH_TRACING=true LANGSMITH_ENDPOINT="https://api.smith.langchain.com" @@ -367,6 +383,7 @@ DeerFlow 支持 LangSmith 追踪功能,帮助您调试和监控工作流。要 ``` 2. 通过运行以下命令本地启动 LangSmith 追踪: + ```bash langgraph dev ``` @@ -409,7 +426,7 @@ docker compose up ## 文本转语音集成 -DeerFlow 现在包含一个文本转语音(TTS)功能,允许您将研究报告转换为语音。此功能使用火山引擎 TTS API 生成高质量的文本音频。速度、音量和音调等特性也可以自定义。 +DeerFlow 现在包含一个文本转语音 (TTS) 功能,允许您将研究报告转换为语音。此功能使用火山引擎 TTS API 生成高质量的文本音频。速度、音量和音调等特性也可以自定义。 ### 使用 TTS API @@ -435,17 +452,14 @@ curl --location 'http://localhost:8000/api/tts' \ ### 研究报告 1. **OpenAI Sora 报告** - OpenAI 的 Sora AI 工具分析 - - 讨论功能、访问方式、提示工程、限制和伦理考虑 - [查看完整报告](examples/openai_sora_report.md) -2. **Google 的 Agent to Agent 协议报告** - Google 的 Agent to Agent (A2A)协议概述 - - - 讨论其在 AI 智能体通信中的作用及其与 Anthropic 的 Model Context Protocol (MCP)的关系 +2. **Google 的 Agent to Agent 协议报告** - Google 的 Agent to Agent (A2A) 协议概述 + - 讨论其在 AI 智能体通信中的作用及其与 Anthropic 的 Model Context Protocol (MCP) 的关系 - [查看完整报告](examples/what_is_agent_to_agent_protocol.md) 3. **什么是 MCP?** - 对"MCP"一词在多个上下文中的全面分析 - - 探讨 AI 中的 Model Context Protocol、化学中的 Monocalcium Phosphate 和电子学中的 Micro-channel Plate - [查看完整报告](examples/what_is_mcp.md) @@ -456,17 +470,14 @@ curl --location 'http://localhost:8000/api/tts' \ - [查看完整报告](examples/bitcoin_price_fluctuation.md) 5. **什么是 LLM?** - 对大型语言模型的深入探索 - - 讨论架构、训练、应用和伦理考虑 - [查看完整报告](examples/what_is_llm.md) 6. **如何使用 Claude 进行深度研究?** - 在深度研究中使用 Claude 的最佳实践和工作流程 - - 涵盖提示工程、数据分析和与其他工具的集成 - [查看完整报告](examples/how_to_use_claude_deep_research.md) 7. **医疗保健中的 AI 采用:影响因素** - 影响医疗保健中 AI 采用的因素分析 - - 讨论 AI 技术、数据质量、伦理考虑、经济评估、组织准备度和数字基础设施 - [查看完整报告](examples/AI_adoption_in_healthcare.md) @@ -527,10 +538,10 @@ DeerFlow 包含一个人在环中机制,允许您在执行研究计划前审 - 系统将整合您的反馈并生成修订后的计划 3. **自动接受**:您可以启用自动接受以跳过审查过程: - - 通过 API:在请求中设置`auto_accepted_plan: true` 4. **API 集成**:使用 API 时,您可以通过`feedback`参数提供反馈: + ```json { "messages": [{ "role": "user", "content": "什么是量子计算?" }], diff --git a/pyproject.toml b/pyproject.toml index 72f829c..eb5d53a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,6 +38,7 @@ dependencies = [ [project.optional-dependencies] dev = [ + "ruff", "black>=24.2.0", "langgraph-cli[inmem]>=0.2.10", ] diff --git a/src/config/__init__.py b/src/config/__init__.py index 4e6d178..54bf87c 100644 --- a/src/config/__init__.py +++ b/src/config/__init__.py @@ -2,7 +2,6 @@ # SPDX-License-Identifier: MIT from .tools import SELECTED_SEARCH_ENGINE, SearchEngine -from .loader import load_yaml_config from .questions import BUILT_IN_QUESTIONS, BUILT_IN_QUESTIONS_ZH_CN from dotenv import load_dotenv @@ -11,7 +10,7 @@ from dotenv import load_dotenv load_dotenv() # Team configuration -TEAM_MEMBER_CONFIGRATIONS = { +TEAM_MEMBER_CONFIGURATIONS = { "researcher": { "name": "researcher", "desc": ( @@ -36,12 +35,12 @@ TEAM_MEMBER_CONFIGRATIONS = { }, } -TEAM_MEMBERS = list(TEAM_MEMBER_CONFIGRATIONS.keys()) +TEAM_MEMBERS = list(TEAM_MEMBER_CONFIGURATIONS.keys()) __all__ = [ # Other configurations "TEAM_MEMBERS", - "TEAM_MEMBER_CONFIGRATIONS", + "TEAM_MEMBER_CONFIGURATIONS", "SELECTED_SEARCH_ENGINE", "SearchEngine", "BUILT_IN_QUESTIONS", diff --git a/src/graph/types.py b/src/graph/types.py index 84b231b..a2a29aa 100644 --- a/src/graph/types.py +++ b/src/graph/types.py @@ -1,6 +1,7 @@ # Copyright (c) 2025 Bytedance Ltd. and/or its affiliates # SPDX-License-Identifier: MIT + from langgraph.graph import MessagesState from src.prompts.planner_model import Plan diff --git a/src/ppt/graph/state.py b/src/ppt/graph/state.py index 0d6fd22..9c32457 100644 --- a/src/ppt/graph/state.py +++ b/src/ppt/graph/state.py @@ -1,7 +1,6 @@ # Copyright (c) 2025 Bytedance Ltd. and/or its affiliates # SPDX-License-Identifier: MIT -from typing import Optional from langgraph.graph import MessagesState diff --git a/src/server/mcp_utils.py b/src/server/mcp_utils.py index 508ded9..3b69c3a 100644 --- a/src/server/mcp_utils.py +++ b/src/server/mcp_utils.py @@ -3,7 +3,7 @@ import logging from datetime import timedelta -from typing import Any, Dict, List, Optional, Tuple +from typing import Any, Dict, List, Optional from fastapi import HTTPException from mcp import ClientSession, StdioServerParameters diff --git a/src/tools/__init__.py b/src/tools/__init__.py index 5101998..701a11a 100644 --- a/src/tools/__init__.py +++ b/src/tools/__init__.py @@ -1,8 +1,6 @@ # Copyright (c) 2025 Bytedance Ltd. and/or its affiliates # SPDX-License-Identifier: MIT -import os - from .crawl import crawl_tool from .python_repl import python_repl_tool from .retriever import get_retriever_tool diff --git a/src/workflow.py b/src/workflow.py index fddc8e1..3def2e4 100644 --- a/src/workflow.py +++ b/src/workflow.py @@ -1,7 +1,6 @@ # Copyright (c) 2025 Bytedance Ltd. and/or its affiliates # SPDX-License-Identifier: MIT -import asyncio import logging from src.graph import build_graph diff --git a/tests/integration/test_crawler.py b/tests/integration/test_crawler.py index e4584bd..9e24f0b 100644 --- a/tests/integration/test_crawler.py +++ b/tests/integration/test_crawler.py @@ -1,7 +1,6 @@ # Copyright (c) 2025 Bytedance Ltd. and/or its affiliates # SPDX-License-Identifier: MIT -import pytest from src.crawler import Crawler diff --git a/tests/integration/test_python_repl_tool.py b/tests/integration/test_python_repl_tool.py index bad0333..0098a51 100644 --- a/tests/integration/test_python_repl_tool.py +++ b/tests/integration/test_python_repl_tool.py @@ -1,7 +1,6 @@ # Copyright (c) 2025 Bytedance Ltd. and/or its affiliates # SPDX-License-Identifier: MIT -import pytest from src.tools.python_repl import python_repl_tool diff --git a/tests/integration/test_template.py b/tests/integration/test_template.py index 6cc8af5..431fe60 100644 --- a/tests/integration/test_template.py +++ b/tests/integration/test_template.py @@ -101,8 +101,6 @@ def test_current_time_format(): messages = apply_prompt_template("coder", test_state) system_content = messages[0]["content"] - # Time format should be like: Mon Jan 01 2024 12:34:56 +0000 - time_format = r"\w{3} \w{3} \d{2} \d{4} \d{2}:\d{2}:\d{2}" assert any( line.strip().startswith("CURRENT_TIME:") for line in system_content.split("\n") ) diff --git a/tests/integration/test_tts.py b/tests/integration/test_tts.py index dc126de..16a4d9f 100644 --- a/tests/integration/test_tts.py +++ b/tests/integration/test_tts.py @@ -2,9 +2,7 @@ # SPDX-License-Identifier: MIT import json -import pytest from unittest.mock import patch, MagicMock -import uuid import base64 from src.tools.tts import VolcengineTTS diff --git a/tests/test_state.py b/tests/test_state.py index f196891..c25b77b 100644 --- a/tests/test_state.py +++ b/tests/test_state.py @@ -4,7 +4,7 @@ import pytest import sys import os -from typing import Annotated, List, Optional +from typing import Annotated # Import MessagesState directly from langgraph rather than through our application from langgraph.graph import MessagesState diff --git a/uv.lock b/uv.lock index aaac8f2..5caaa80 100644 --- a/uv.lock +++ b/uv.lock @@ -410,6 +410,7 @@ dependencies = [ dev = [ { name = "black" }, { name = "langgraph-cli", extra = ["inmem"] }, + { name = "ruff" }, ] test = [ { name = "pytest" }, @@ -444,6 +445,7 @@ requires-dist = [ { name = "pytest-cov", marker = "extra == 'test'", specifier = ">=4.1.0" }, { name = "python-dotenv", specifier = ">=1.0.1" }, { name = "readabilipy", specifier = ">=0.3.0" }, + { name = "ruff", marker = "extra == 'dev'" }, { name = "socksio", specifier = ">=1.0.0" }, { name = "sse-starlette", specifier = ">=1.6.5" }, { name = "uvicorn", specifier = ">=0.27.1" }, @@ -1981,6 +1983,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/68/15/6d22d07e063ce5e9bfbd96db9ec2fbb4693591b4503e3a76996639474d02/rpds_py-0.23.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d6f6512a90bd5cd9030a6237f5346f046c6f0e40af98657568fa45695d4de59d", size = 235415, upload-time = "2025-02-21T15:03:12.664Z" }, ] +[[package]] +name = "ruff" +version = "0.11.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/4c/4a3c5a97faaae6b428b336dcca81d03ad04779f8072c267ad2bd860126bf/ruff-0.11.10.tar.gz", hash = "sha256:d522fb204b4959909ecac47da02830daec102eeb100fb50ea9554818d47a5fa6", size = 4165632 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2f/9f/596c628f8824a2ce4cd12b0f0b4c0629a62dfffc5d0f742c19a1d71be108/ruff-0.11.10-py3-none-linux_armv6l.whl", hash = "sha256:859a7bfa7bc8888abbea31ef8a2b411714e6a80f0d173c2a82f9041ed6b50f58", size = 10316243 }, + { url = "https://files.pythonhosted.org/packages/3c/38/c1e0b77ab58b426f8c332c1d1d3432d9fc9a9ea622806e208220cb133c9e/ruff-0.11.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:968220a57e09ea5e4fd48ed1c646419961a0570727c7e069842edd018ee8afed", size = 11083636 }, + { url = "https://files.pythonhosted.org/packages/23/41/b75e15961d6047d7fe1b13886e56e8413be8467a4e1be0a07f3b303cd65a/ruff-0.11.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1067245bad978e7aa7b22f67113ecc6eb241dca0d9b696144256c3a879663bca", size = 10441624 }, + { url = "https://files.pythonhosted.org/packages/b6/2c/e396b6703f131406db1811ea3d746f29d91b41bbd43ad572fea30da1435d/ruff-0.11.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4854fd09c7aed5b1590e996a81aeff0c9ff51378b084eb5a0b9cd9518e6cff2", size = 10624358 }, + { url = "https://files.pythonhosted.org/packages/bd/8c/ee6cca8bdaf0f9a3704796022851a33cd37d1340bceaf4f6e991eb164e2e/ruff-0.11.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b4564e9f99168c0f9195a0fd5fa5928004b33b377137f978055e40008a082c5", size = 10176850 }, + { url = "https://files.pythonhosted.org/packages/e9/ce/4e27e131a434321b3b7c66512c3ee7505b446eb1c8a80777c023f7e876e6/ruff-0.11.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b6a9cc5b62c03cc1fea0044ed8576379dbaf751d5503d718c973d5418483641", size = 11759787 }, + { url = "https://files.pythonhosted.org/packages/58/de/1e2e77fc72adc7cf5b5123fd04a59ed329651d3eab9825674a9e640b100b/ruff-0.11.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:607ecbb6f03e44c9e0a93aedacb17b4eb4f3563d00e8b474298a201622677947", size = 12430479 }, + { url = "https://files.pythonhosted.org/packages/07/ed/af0f2340f33b70d50121628ef175523cc4c37619e98d98748c85764c8d88/ruff-0.11.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b3a522fa389402cd2137df9ddefe848f727250535c70dafa840badffb56b7a4", size = 11919760 }, + { url = "https://files.pythonhosted.org/packages/24/09/d7b3d3226d535cb89234390f418d10e00a157b6c4a06dfbe723e9322cb7d/ruff-0.11.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f071b0deed7e9245d5820dac235cbdd4ef99d7b12ff04c330a241ad3534319f", size = 14041747 }, + { url = "https://files.pythonhosted.org/packages/62/b3/a63b4e91850e3f47f78795e6630ee9266cb6963de8f0191600289c2bb8f4/ruff-0.11.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a60e3a0a617eafba1f2e4186d827759d65348fa53708ca547e384db28406a0b", size = 11550657 }, + { url = "https://files.pythonhosted.org/packages/46/63/a4f95c241d79402ccdbdb1d823d156c89fbb36ebfc4289dce092e6c0aa8f/ruff-0.11.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:da8ec977eaa4b7bf75470fb575bea2cb41a0e07c7ea9d5a0a97d13dbca697bf2", size = 10489671 }, + { url = "https://files.pythonhosted.org/packages/6a/9b/c2238bfebf1e473495659c523d50b1685258b6345d5ab0b418ca3f010cd7/ruff-0.11.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ddf8967e08227d1bd95cc0851ef80d2ad9c7c0c5aab1eba31db49cf0a7b99523", size = 10160135 }, + { url = "https://files.pythonhosted.org/packages/ba/ef/ba7251dd15206688dbfba7d413c0312e94df3b31b08f5d695580b755a899/ruff-0.11.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5a94acf798a82db188f6f36575d80609072b032105d114b0f98661e1679c9125", size = 11170179 }, + { url = "https://files.pythonhosted.org/packages/73/9f/5c336717293203ba275dbfa2ea16e49b29a9fd9a0ea8b6febfc17e133577/ruff-0.11.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3afead355f1d16d95630df28d4ba17fb2cb9c8dfac8d21ced14984121f639bad", size = 11626021 }, + { url = "https://files.pythonhosted.org/packages/d9/2b/162fa86d2639076667c9aa59196c020dc6d7023ac8f342416c2f5ec4bda0/ruff-0.11.10-py3-none-win32.whl", hash = "sha256:dc061a98d32a97211af7e7f3fa1d4ca2fcf919fb96c28f39551f35fc55bdbc19", size = 10494958 }, + { url = "https://files.pythonhosted.org/packages/24/f3/66643d8f32f50a4b0d09a4832b7d919145ee2b944d43e604fbd7c144d175/ruff-0.11.10-py3-none-win_amd64.whl", hash = "sha256:5cc725fbb4d25b0f185cb42df07ab6b76c4489b4bfb740a175f3a59c70e8a224", size = 11650285 }, + { url = "https://files.pythonhosted.org/packages/95/3a/2e8704d19f376c799748ff9cb041225c1d59f3e7711bc5596c8cfdc24925/ruff-0.11.10-py3-none-win_arm64.whl", hash = "sha256:ef69637b35fb8b210743926778d0e45e1bffa850a7c61e428c6b971549b5f5d1", size = 10765278 }, +] + [[package]] name = "sgmllib3k" version = "1.0.0"