mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-05-20 15:11:09 +00:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3131f961a4 | |||
| d983149984 | |||
| 3d5e579ebd | |||
| a14ca92c36 | |||
| b85a7592dc |
@@ -17,5 +17,11 @@ VOLCENGINE_TTS_ACCESS_TOKEN=xxx
|
|||||||
# VOLCENGINE_TTS_CLUSTER=volcano_tts # Optional, default is volcano_tts
|
# VOLCENGINE_TTS_CLUSTER=volcano_tts # Optional, default is volcano_tts
|
||||||
# VOLCENGINE_TTS_VOICE_TYPE=BV700_V2_streaming # Optional, default is BV700_V2_streaming
|
# VOLCENGINE_TTS_VOICE_TYPE=BV700_V2_streaming # Optional, default is BV700_V2_streaming
|
||||||
|
|
||||||
|
# Option, for langsmith tracing and monitoring
|
||||||
|
# LANGSMITH_TRACING=true
|
||||||
|
# LANGSMITH_ENDPOINT="https://api.smith.langchain.com"
|
||||||
|
# LANGSMITH_API_KEY="xxx"
|
||||||
|
# LANGSMITH_PROJECT="xxx"
|
||||||
|
|
||||||
# [!NOTE]
|
# [!NOTE]
|
||||||
# For model settings and other configurations, please refer to `docs/configuration_guide.md`
|
# For model settings and other configurations, please refer to `docs/configuration_guide.md`
|
||||||
|
|||||||
@@ -347,6 +347,25 @@ When you submit a research topic in the Studio UI, you'll be able to see the ent
|
|||||||
- The research and writing phases for each section
|
- The research and writing phases for each section
|
||||||
- The final report generation
|
- The final report generation
|
||||||
|
|
||||||
|
### Enabling LangSmith Tracing
|
||||||
|
|
||||||
|
DeerFlow supports LangSmith tracing to help you debug and monitor your workflows. To enable LangSmith tracing:
|
||||||
|
|
||||||
|
1. Make sure your `.env` file has the following configurations (see `.env.example`):
|
||||||
|
```bash
|
||||||
|
LANGSMITH_TRACING=true
|
||||||
|
LANGSMITH_ENDPOINT="https://api.smith.langchain.com"
|
||||||
|
LANGSMITH_API_KEY="xxx"
|
||||||
|
LANGSMITH_PROJECT="xxx"
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Start tracing and visualize the graph locally with LangSmith by running:
|
||||||
|
```bash
|
||||||
|
langgraph dev
|
||||||
|
```
|
||||||
|
|
||||||
|
This will enable trace visualization in LangGraph Studio and send your traces to LangSmith for monitoring and analysis.
|
||||||
|
|
||||||
## Docker
|
## Docker
|
||||||
|
|
||||||
You can also run this project with Docker.
|
You can also run this project with Docker.
|
||||||
|
|||||||
@@ -333,6 +333,25 @@ Wenn Sie ein Forschungsthema in der Studio UI einreichen, können Sie die gesamt
|
|||||||
- Die Forschungs- und Schreibphasen für jeden Abschnitt
|
- Die Forschungs- und Schreibphasen für jeden Abschnitt
|
||||||
- Die Erstellung des endgültigen Berichts
|
- Die Erstellung des endgültigen Berichts
|
||||||
|
|
||||||
|
### Aktivieren von LangSmith-Tracing
|
||||||
|
|
||||||
|
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"
|
||||||
|
LANGSMITH_API_KEY="xxx"
|
||||||
|
LANGSMITH_PROJECT="xxx"
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Starten Sie das Tracing mit LangSmith lokal, indem Sie folgenden Befehl ausführen:
|
||||||
|
```bash
|
||||||
|
langgraph dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Dies aktiviert die Trace-Visualisierung in LangGraph Studio und sendet Ihre Traces zur Überwachung und Analyse an LangSmith.
|
||||||
|
|
||||||
## Beispiele
|
## Beispiele
|
||||||
|
|
||||||
Die folgenden Beispiele demonstrieren die Fähigkeiten von DeerFlow:
|
Die folgenden Beispiele demonstrieren die Fähigkeiten von DeerFlow:
|
||||||
|
|||||||
@@ -322,6 +322,25 @@ Studio UI で研究トピックを送信すると、次を含む全ワークフ
|
|||||||
- 各セクションの研究と執筆段階
|
- 各セクションの研究と執筆段階
|
||||||
- 最終レポート生成
|
- 最終レポート生成
|
||||||
|
|
||||||
|
### LangSmith トレースの有効化
|
||||||
|
|
||||||
|
DeerFlow は LangSmith トレース機能をサポートしており、ワークフローのデバッグとモニタリングに役立ちます。LangSmith トレースを有効にするには:
|
||||||
|
|
||||||
|
1. `.env` ファイルに次の設定があることを確認してください(`.env.example` を参照):
|
||||||
|
```bash
|
||||||
|
LANGSMITH_TRACING=true
|
||||||
|
LANGSMITH_ENDPOINT="https://api.smith.langchain.com"
|
||||||
|
LANGSMITH_API_KEY="xxx"
|
||||||
|
LANGSMITH_PROJECT="xxx"
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 次のコマンドを実行して LangSmith トレースを開始します:
|
||||||
|
```bash
|
||||||
|
langgraph dev
|
||||||
|
```
|
||||||
|
|
||||||
|
これにより、LangGraph Studio でトレース可視化が有効になり、トレースがモニタリングと分析のために LangSmith に送信されます。
|
||||||
|
|
||||||
## Docker
|
## Docker
|
||||||
|
|
||||||
このプロジェクトは Docker でも実行できます。
|
このプロジェクトは Docker でも実行できます。
|
||||||
|
|||||||
@@ -322,6 +322,25 @@ langgraph dev
|
|||||||
- 每个部分的研究和写作阶段
|
- 每个部分的研究和写作阶段
|
||||||
- 最终报告生成
|
- 最终报告生成
|
||||||
|
|
||||||
|
### 启用 LangSmith 追踪
|
||||||
|
|
||||||
|
DeerFlow 支持 LangSmith 追踪功能,帮助您调试和监控工作流。要启用 LangSmith 追踪:
|
||||||
|
|
||||||
|
1. 确保您的 `.env` 文件中有以下配置(参见 `.env.example`):
|
||||||
|
```bash
|
||||||
|
LANGSMITH_TRACING=true
|
||||||
|
LANGSMITH_ENDPOINT="https://api.smith.langchain.com"
|
||||||
|
LANGSMITH_API_KEY="xxx"
|
||||||
|
LANGSMITH_PROJECT="xxx"
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 通过运行以下命令本地启动 LangSmith 追踪:
|
||||||
|
```bash
|
||||||
|
langgraph dev
|
||||||
|
```
|
||||||
|
|
||||||
|
这将在 LangGraph Studio 中启用追踪可视化,并将您的追踪发送到 LangSmith 进行监控和分析。
|
||||||
|
|
||||||
## Docker
|
## Docker
|
||||||
|
|
||||||
您也可以使用 Docker 运行此项目。
|
您也可以使用 Docker 运行此项目。
|
||||||
|
|||||||
+11
-8
@@ -9,7 +9,7 @@ from langchain_community.tools import BraveSearch, DuckDuckGoSearchResults
|
|||||||
from langchain_community.tools.arxiv import ArxivQueryRun
|
from langchain_community.tools.arxiv import ArxivQueryRun
|
||||||
from langchain_community.utilities import ArxivAPIWrapper, BraveSearchWrapper
|
from langchain_community.utilities import ArxivAPIWrapper, BraveSearchWrapper
|
||||||
|
|
||||||
from src.config import SEARCH_MAX_RESULTS
|
from src.config import SEARCH_MAX_RESULTS, SearchEngine
|
||||||
from src.tools.tavily_search.tavily_search_results_with_images import (
|
from src.tools.tavily_search.tavily_search_results_with_images import (
|
||||||
TavilySearchResultsWithImages,
|
TavilySearchResultsWithImages,
|
||||||
)
|
)
|
||||||
@@ -19,13 +19,16 @@ from src.tools.decorators import create_logged_tool
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
LoggedTavilySearch = create_logged_tool(TavilySearchResultsWithImages)
|
LoggedTavilySearch = create_logged_tool(TavilySearchResultsWithImages)
|
||||||
tavily_search_tool = LoggedTavilySearch(
|
if os.getenv("SEARCH_API", "") == SearchEngine.TAVILY.value:
|
||||||
name="web_search",
|
tavily_search_tool = LoggedTavilySearch(
|
||||||
max_results=SEARCH_MAX_RESULTS,
|
name="web_search",
|
||||||
include_raw_content=True,
|
max_results=SEARCH_MAX_RESULTS,
|
||||||
include_images=True,
|
include_raw_content=True,
|
||||||
include_image_descriptions=True,
|
include_images=True,
|
||||||
)
|
include_image_descriptions=True,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
tavily_search_tool = None
|
||||||
|
|
||||||
LoggedDuckDuckGoSearch = create_logged_tool(DuckDuckGoSearchResults)
|
LoggedDuckDuckGoSearch = create_logged_tool(DuckDuckGoSearchResults)
|
||||||
duckduckgo_search_tool = LoggedDuckDuckGoSearch(
|
duckduckgo_search_tool = LoggedDuckDuckGoSearch(
|
||||||
|
|||||||
@@ -304,10 +304,58 @@ function PythonToolCall({ toolCall }: { toolCall: ToolCallRuntime }) {
|
|||||||
</SyntaxHighlighter>
|
</SyntaxHighlighter>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{toolCall.result && <PythonToolCallResult result={toolCall.result} />}
|
||||||
</section>
|
</section>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function PythonToolCallResult({ result }: { result: string }) {
|
||||||
|
const { resolvedTheme } = useTheme();
|
||||||
|
const hasError = useMemo(
|
||||||
|
() => result.includes("Error executing code:\n"),
|
||||||
|
[result],
|
||||||
|
);
|
||||||
|
const error = useMemo(() => {
|
||||||
|
if (hasError) {
|
||||||
|
const parts = result.split("```\nError: ");
|
||||||
|
if (parts.length > 1) {
|
||||||
|
return parts[1]!.trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}, [result, hasError]);
|
||||||
|
const stdout = useMemo(() => {
|
||||||
|
if (!hasError) {
|
||||||
|
const parts = result.split("```\nStdout: ");
|
||||||
|
if (parts.length > 1) {
|
||||||
|
return parts[1]!.trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}, [result, hasError]);
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="mt-4 font-medium italic">
|
||||||
|
{hasError ? "Error when executing the above code" : "Execution output"}
|
||||||
|
</div>
|
||||||
|
<div className="bg-accent mt-2 max-h-[400px] max-w-[calc(100%-120px)] overflow-y-auto rounded-md p-2 text-sm">
|
||||||
|
<SyntaxHighlighter
|
||||||
|
language="plaintext"
|
||||||
|
style={resolvedTheme === "dark" ? dark : docco}
|
||||||
|
customStyle={{
|
||||||
|
color: hasError ? "red" : "inherit",
|
||||||
|
background: "transparent",
|
||||||
|
border: "none",
|
||||||
|
boxShadow: "none",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{error ?? stdout ?? "(empty)"}
|
||||||
|
</SyntaxHighlighter>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
function MCPToolCall({ toolCall }: { toolCall: ToolCallRuntime }) {
|
function MCPToolCall({ toolCall }: { toolCall: ToolCallRuntime }) {
|
||||||
const tool = useMemo(() => findMCPTool(toolCall.name), [toolCall.name]);
|
const tool = useMemo(() => findMCPTool(toolCall.name), [toolCall.name]);
|
||||||
const { resolvedTheme } = useTheme();
|
const { resolvedTheme } = useTheme();
|
||||||
|
|||||||
@@ -19,6 +19,19 @@ import { cn } from "~/lib/utils";
|
|||||||
import Image from "./image";
|
import Image from "./image";
|
||||||
import { Tooltip } from "./tooltip";
|
import { Tooltip } from "./tooltip";
|
||||||
|
|
||||||
|
const components: ReactMarkdownOptions["components"] = {
|
||||||
|
a: ({ href, children }) => (
|
||||||
|
<a href={href} target="_blank" rel="noopener noreferrer">
|
||||||
|
{children}
|
||||||
|
</a>
|
||||||
|
),
|
||||||
|
img: ({ src, alt }) => (
|
||||||
|
<a href={src as string} target="_blank" rel="noopener noreferrer">
|
||||||
|
<Image className="rounded" src={src as string} alt={alt ?? ""} />
|
||||||
|
</a>
|
||||||
|
),
|
||||||
|
};
|
||||||
|
|
||||||
export function Markdown({
|
export function Markdown({
|
||||||
className,
|
className,
|
||||||
children,
|
children,
|
||||||
@@ -49,18 +62,7 @@ export function Markdown({
|
|||||||
<ReactMarkdown
|
<ReactMarkdown
|
||||||
remarkPlugins={[remarkGfm, remarkMath]}
|
remarkPlugins={[remarkGfm, remarkMath]}
|
||||||
rehypePlugins={rehypePlugins}
|
rehypePlugins={rehypePlugins}
|
||||||
components={{
|
components={components}
|
||||||
a: ({ href, children }) => (
|
|
||||||
<a href={href} target="_blank" rel="noopener noreferrer">
|
|
||||||
{children}
|
|
||||||
</a>
|
|
||||||
),
|
|
||||||
img: ({ src, alt }) => (
|
|
||||||
<a href={src as string} target="_blank" rel="noopener noreferrer">
|
|
||||||
<Image className="rounded" src={src as string} alt={alt ?? ""} />
|
|
||||||
</a>
|
|
||||||
),
|
|
||||||
}}
|
|
||||||
{...props}
|
{...props}
|
||||||
>
|
>
|
||||||
{autoFixMarkdown(
|
{autoFixMarkdown(
|
||||||
|
|||||||
Reference in New Issue
Block a user