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_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]
|
||||
# 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 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
|
||||
|
||||
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 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
|
||||
|
||||
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 でも実行できます。
|
||||
|
||||
@@ -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 运行此项目。
|
||||
|
||||
+11
-8
@@ -9,7 +9,7 @@ from langchain_community.tools import BraveSearch, DuckDuckGoSearchResults
|
||||
from langchain_community.tools.arxiv import ArxivQueryRun
|
||||
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 (
|
||||
TavilySearchResultsWithImages,
|
||||
)
|
||||
@@ -19,13 +19,16 @@ from src.tools.decorators import create_logged_tool
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
LoggedTavilySearch = create_logged_tool(TavilySearchResultsWithImages)
|
||||
tavily_search_tool = LoggedTavilySearch(
|
||||
name="web_search",
|
||||
max_results=SEARCH_MAX_RESULTS,
|
||||
include_raw_content=True,
|
||||
include_images=True,
|
||||
include_image_descriptions=True,
|
||||
)
|
||||
if os.getenv("SEARCH_API", "") == SearchEngine.TAVILY.value:
|
||||
tavily_search_tool = LoggedTavilySearch(
|
||||
name="web_search",
|
||||
max_results=SEARCH_MAX_RESULTS,
|
||||
include_raw_content=True,
|
||||
include_images=True,
|
||||
include_image_descriptions=True,
|
||||
)
|
||||
else:
|
||||
tavily_search_tool = None
|
||||
|
||||
LoggedDuckDuckGoSearch = create_logged_tool(DuckDuckGoSearchResults)
|
||||
duckduckgo_search_tool = LoggedDuckDuckGoSearch(
|
||||
|
||||
@@ -304,10 +304,58 @@ function PythonToolCall({ toolCall }: { toolCall: ToolCallRuntime }) {
|
||||
</SyntaxHighlighter>
|
||||
</div>
|
||||
</div>
|
||||
{toolCall.result && <PythonToolCallResult result={toolCall.result} />}
|
||||
</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 }) {
|
||||
const tool = useMemo(() => findMCPTool(toolCall.name), [toolCall.name]);
|
||||
const { resolvedTheme } = useTheme();
|
||||
|
||||
@@ -19,6 +19,19 @@ import { cn } from "~/lib/utils";
|
||||
import Image from "./image";
|
||||
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({
|
||||
className,
|
||||
children,
|
||||
@@ -49,18 +62,7 @@ export function Markdown({
|
||||
<ReactMarkdown
|
||||
remarkPlugins={[remarkGfm, remarkMath]}
|
||||
rehypePlugins={rehypePlugins}
|
||||
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>
|
||||
),
|
||||
}}
|
||||
components={components}
|
||||
{...props}
|
||||
>
|
||||
{autoFixMarkdown(
|
||||
|
||||
Reference in New Issue
Block a user