1. ๆดไฝๆถๆๅฒๅญฆ
1.1 ๅๅฑๆฝ่ฑกๅๅ
DeerFlow ้็จๆธ่ฟๅผๅคๆๅบฆ่ฎพ่ฎก็ๅฟต๏ผๆฏไธๅฑๅชๅจๅ ถๅฟ ่ฆไนๅคๅผๅ ฅๅคๆๆง๏ผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๅบ็จๅฑ (Application) โ โ ็จๆท็้ขใAPI ็ซฏ็น
โ - ็ฎๅ็ๆฅๅฃ้้
ๅจ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ ็ผๆๅฑ (Orchestration) โ โ Lead Agentใๅญไปฃ็่ฐๅบฆ
โ - ไปปๅกๅ่งฃไธ็ปๆ็ปผๅ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ ไธญ้ดไปถๅฑ (Middleware) โ โ ๆจชๅๅ
ณๆณจ็นๅค็
โ - ่ฎฐๅฟใๆฒ็ใๆไปถใๆ ้ข... โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ ๆง่กๅฑ (Execution) โ โ LangGraphใๆจกๅ่ฐ็จ
โ - ็ถๆ็ฎก็ใๅทฅๅ
ทๆง่ก โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ ๅบ็ก่ฎพๆฝๅฑ (Infrastructure) โ โ ๆฒ็ใๅญๅจใ้
็ฝฎ
โ - ้็ฆปๆงใๆไน
ๆงใๅฏ้
็ฝฎๆง โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
่ฎพ่ฎกๅๅ:
- ๆทฑๅบฆไผไบๅนฟๅบฆ: ๆฏไธชๆจกๅๅๅฐๆ่ด๏ผ่้ๅ่ฝๅ ็
- ๆพๅผไผไบ้ๅผ: ไธญ้ดไปถ้กบๅบใไพ่ตๅ ณ็ณปๆ็กฎๅฃฐๆ
- ็ปๅไผไบ็ปงๆฟ: ๅทฅๅๅฝๆฐ + ้ ็ฝฎ้ฉฑๅจ๏ผ่้็ฑปๅฑๆฌก็ปๆ
2. ๅ ณ้ฎ่ฎพ่ฎกๅณ็ญๅๆ
2.1 ไธบไปไนไฝฟ็จๅทฅๅๅฝๆฐ่้็ฑป็ปงๆฟ๏ผ
# โ ไผ ็ป็ฑป็ปงๆฟๆนๅผ
class LeadAgent(BaseAgent):
def __init__(self):
self.memory = Memory()
self.sandbox = Sandbox()
# โ
DeerFlow ๅทฅๅๅฝๆฐๆนๅผ
def make_lead_agent(config: RunnableConfig):
model = create_chat_model(...) # ๅจๆๆจกๅ้ๆฉ
tools = get_available_tools(...) # ๅจๆๅทฅๅ
ทๅ ่ฝฝ
middleware = _build_middlewares(...) # ๅจๆไธญ้ดไปถ้พ
return create_agent(model, tools, middleware, ...)ๅณ็ญๅๅ :
- ่ฟ่กๆถ็ตๆดปๆง: ้ ็ฝฎๅณๅฎ่กไธบ๏ผๆ ้ไฟฎๆนไปฃ็ ๅณๅฏๆนๅ Agent ่ฝๅ
- ไพ่ตๆณจๅ
ฅ: ้่ฟ
RunnableConfigๆณจๅ ฅๆๆไพ่ต๏ผไพฟไบๆต่ฏๅ mock - ้ฟๅ ็ปงๆฟๅฐ็ฑ: ไธไฝฟ็จๅค็ปงๆฟ๏ผ้่ฟ็ปๅๅฎ็ฐๅ่ฝๆฉๅฑ
- LangGraph ๅ็: ไธ LangGraph ็ๅฝๆฐๅผ่ฎพ่ฎก็ๅฟตไธ่ด
2.2 ไธบไปไนไธญ้ดไปถๅฟ ้กปๅจ ClarificationMiddleware ๆฆๆช๏ผ
middlewares = [
# ... ๅ
ถไปไธญ้ดไปถ ...
ViewImageMiddleware(), # ๅพ็ๆฐๆฎๆณจๅ
ฅ
SubagentLimitMiddleware(), # ๅนถๅ้ๅถ
ClarificationMiddleware(), # ๅฟ
้กปๆฏๆๅไธไธช
]ๅ ณ้ฎๆดๅฏ:
- ๆฆๆช็น้ๆฉ: ๅจๅทฅๅ ท่ฐ็จๅฑ้ขๆฆๆช๏ผ่้ๅจๆ็คบ่ฏๅฑ้ข
- ๅผบๅถไธญๆญ: ไฝฟ็จ
Command(goto=END)็ซๅณ็ปๆญขๆง่กๆต - ็ถๆไฟๆ: ไธๆทปๅ ้ขๅค AI ๆถๆฏ๏ผไฟๆๅฏน่ฏ็ถๆๅนฒๅ
ๆฟไปฃๆนๆกๅฏนๆฏ:
- ๆ็คบ่ฏ็บฆๆ: โๅฆๆไธๆธ ๆฅ๏ผ่ฏท่ฏข้ฎ็จๆทโ โ ่ฝฏ็บฆๆ๏ผๆจกๅๅฏ่ฝๅฟฝ็ฅ
- ๅทฅๅ
ทๆฆๆช: ๆฃๆตๅฐ
ask_clarification็ซๅณไธญๆญ โ ็กฌ็บฆๆ๏ผ100% ๆง่ก
2.3 ไธบไปไนไฝฟ็จ้ฒๆๆบๅถๆดๆฐ่ฎฐๅฟ๏ผ
class MemoryMiddleware:
def after_agent(self, state, runtime):
# ไธ็ดๆฅๆดๆฐ๏ผ่ๆฏๅ ๅ
ฅ้ๅ
queue.add(thread_id=thread_id, messages=filtered)
# ้ๅไผๅจ 30 ็งๅๆน้ๅค็ๆง่ฝ่้:
- ๅๅฐ LLM ่ฐ็จ: ๆน้ๅค็ๅคๆกๆถๆฏ๏ผไธๆฌกๆง็ๆๆ่ฆ
- ้ฟๅ IO ็ซไบ: ๅค็บฟ็จ็ฏๅขไธ็ๆไปถๅๅ ฅๅฒ็ช
- ็จๆทไฝ้ช: ไธ้ปๅกไธปๅๅบๆต็จ๏ผๅๅฐๅผๆญฅๆดๆฐ
ๆ่กกๅ่:
- โ ๆง่ฝๆๅ: ๅๅฐ 80% ็่ฎฐๅฟ็ธๅ ณ LLM ่ฐ็จ
- โ ๅปถ่ฟๆดๆฐ: ๆ็ซฏๆ ๅตไธ่ฎฐๅฟๅฏ่ฝๆปๅ 30 ็ง
- โ ๅฎน้ๆง: ้ๅๆไน ๅ๏ผๅดฉๆบๅๆขๅคไธไธขๅคฑ
2.4 ไธบไปไน้็จ่ๆ่ทฏๅพ็ณป็ป๏ผ
# Agent ็ๅฐ็่ทฏๅพ
/mnt/user-data/workspace/script.py
# ๅฎ้
็ฉ็่ทฏๅพ๏ผLocal ๆจกๅผ๏ผ
backend/.deer-flow/threads/{id}/user-data/workspace/script.py
# ๅฎ้
็ฉ็่ทฏๅพ๏ผDocker ๆจกๅผ๏ผ
/var/lib/docker/.../workspace/script.py่ฎพ่ฎก็ฎๆ :
- ็ฏๅข้ๆ: Agent ไปฃ็ ๆ ้ไฟฎๆนๅณๅฏๅจไธๅๆฒ็ๆจกๅผ้ด่ฟ็งป
- ๅฎๅ จๆง: ้ๅถ Agent ๅช่ฝ่ฎฟ้ฎ็นๅฎ็ฎๅฝ๏ผ้ฒๆญข็ฎๅฝ้ๅๆปๅป
- ๅฏๆต่ฏๆง: ๆฌๅฐๅผๅๅ็ไบง็ฏๅข่กไธบไธ่ด
3. ไปฃ็ ็ป็ปไธๆฝ่ฑกๅฑๆฌก
3.1 ็ฎๅฝ็ปๆๅฒๅญฆ
backend/src/
โโโ agents/ # Agent ๆ ธๅฟ
โ โโโ lead_agent/ # ไธป Agent ๅทฅๅ
โ โโโ middlewares/ # ๆจชๅๅ
ณๆณจ็น๏ผๆๅ่ฝ็ป็ป๏ผ
โ โโโ memory/ # ่ฎฐๅฟๅญ็ณป็ป๏ผ็ฌ็ซๆจกๅ๏ผ
โโโ sandbox/ # ๆฒ็ๆฝ่ฑก
โ โโโ sandbox.py # ๆฝ่ฑกๆฅๅฃ
โ โโโ local/ # ๆฌๅฐๅฎ็ฐ
โ โโโ middleware.py # ้ๆไธญ้ดไปถ
โโโ tools/ # ๅทฅๅ
ท็ณป็ป
โ โโโ builtins/ # ๅ
็ฝฎๅทฅๅ
ท
โ โโโ tools.py # ๅทฅๅ
ทๅ ่ฝฝๅจ
โโโ config/ # ้
็ฝฎ็ฎก็
โ โโโ agents_config.py
โ โโโ memory_config.py
โ โโโ ...
โโโ channels/ # IM ้ๆ
โโโ base.py # ๆฝ่ฑกๆฅๅฃ
โโโ slack.py # ๅ
ทไฝๅฎ็ฐ
โโโ telegram.py
็ป็ปๅๅ:
- ๆๅ่ฝๅๅ: ็ธๅ ณๆไปถๆพๅจไธ่ตท๏ผๅ ่ๆง๏ผ
- ๆฝ่ฑกไธๅฎ็ฐๅ็ฆป:
sandbox.py๏ผๆฝ่ฑก๏ผvslocal/๏ผๅฎ็ฐ๏ผ - ้
็ฝฎ้ไธญ: ๆๆ้
็ฝฎ็ฑปๆพๅจ
config/็ฎๅฝ
3.2 ็ฑปๅๅฎๅ จ่ฎพ่ฎก
# ThreadState ไฝฟ็จ TypedDict + NotRequired
class ThreadState(AgentState):
sandbox: NotRequired[SandboxState | None]
artifacts: Annotated[list[str], merge_artifacts]
# ไธญ้ดไปถไฝฟ็จๆณๅ
class AgentMiddleware(Generic[StateSchema]):
state_schema: type[StateSchema]
# ่ฟ่กๆถ็ฑปๅๆฃๆฅ
middlewares: list[AgentMiddleware[ThreadState]] = [
ThreadDataMiddleware(),
MemoryMiddleware(),
]ไผๅฟ:
- ็ผ่ฏๆถ็ฑปๅๆฃๆฅ๏ผๅๅฐ่ฟ่กๆถ้่ฏฏ
- IDE ๆบ่ฝๆ็คบ๏ผๆๅๅผๅไฝ้ช
- ้ๆๅฎๅ จ๏ผไฟฎๆนๆฐๆฎ็ปๆๆถ่ชๅจๆฃๆตๅฝฑๅ่ๅด
4. ๅฏๆฉๅฑๆง่ฎพ่ฎก
4.1 ๆไปถๅๆถๆ
Skill ็ณป็ปๆฉๅฑ็น:
# 1. ๅฎไน Skill ๆฅๅฃ๏ผ็บฆๅฎ๏ผ
class Skill:
name: str
description: str
allowed_tools: list[str]
# 2. ่ชๅจๅ็ฐๆบๅถ
skills = load_skills(enabled_only=True)
# ๆซๆ skills/public/ ๅ skills/custom/ ็ฎๅฝ
# 3. ๅจๆๅ ่ฝฝ
prompt = apply_prompt_template(skills_section=get_skills_prompt_section())MCP ๆฉๅฑ็น:
# ้่ฟ้
็ฝฎ่้ไปฃ็ ๆทปๅ ๆฐๅทฅๅ
ท
# extensions_config.json
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {"GITHUB_PERSONAL_ACCESS_TOKEN": "..."}
}
}
}4.2 ไธญ้ดไปถๆฉๅฑๆบๅถ
# ๆทปๅ ๆฐไธญ้ดไปถ็ไธๆญฅๆณ
# 1. ๅๅปบไธญ้ดไปถ็ฑป
class CustomMiddleware(AgentMiddleware[ThreadState]):
def before_agent(self, state, runtime):
# ่ชๅฎไน้ป่พ
return state
# 2. ๆณจๅๅฐไธญ้ดไปถ้พ
def _build_middlewares(config):
middlewares = [
# ... ๅ
ถไปไธญ้ดไปถ ...
CustomMiddleware(param="value"), # ๆๅ
ฅๅ้ไฝ็ฝฎ
ClarificationMiddleware(), # ไฟๆๆๅ
]
# 3. ้
็ฝฎ้ฉฑๅจ๏ผๅฏ้๏ผ
if config.get("custom_feature_enabled"):
middlewares.append(CustomMiddleware())4.3 ๆจกๅ้้ ๅจๆจกๅผ
# backend/src/models/factory.py
def create_chat_model(name: str, thinking_enabled: bool = False):
"""
ๆจกๅๅๅปบๅทฅๅ - ๆฏๆๅคๅๅๆจกๅ็ปไธๆฅๅฃ
้่ฟ้
็ฝฎๅฎไพๅไธๅๅๅ็ๆจกๅ๏ผ
- OpenAI: langchain_openai.ChatOpenAI
- Anthropic: langchain_anthropic.ChatAnthropic
- Google: langchain_google_genai.ChatGoogleGenerativeAI
"""
model_config = app_config.get_model_config(name)
model_class = resolve_class(model_config.use, BaseChatModel)
# ็ปไธๅค็ thinking ๅๆฐ
if thinking_enabled and model_config.supports_thinking:
kwargs.update(model_config.when_thinking_enabled)
return model_class(**kwargs)5. ๅฏไปฅๅ้ด็ๆไฝณๅฎ่ทต
5.1 ้ ็ฝฎ้ฉฑๅจๅผๅ (Configuration-Driven Development)
# ไธๆฏ็กฌ็ผ็ ๏ผ่ๆฏไป้
็ฝฎ่ฏปๅ
summarization_config = get_summarization_config()
if summarization_config.enabled:
middlewares.append(SummarizationMiddleware(
trigger=summarization_config.trigger,
keep=summarization_config.keep
))
# ้
็ฝฎ็ญๆดๆฐๆฏๆ
config = ExtensionsConfig.from_file() # ๆฏๆฌก่ฏปๅๆๆฐๆไปถ้็จๅบๆฏ:
- ๅ่ฝๅผๅ ณ๏ผFeature Flags๏ผ
- A/B ๆต่ฏ้ ็ฝฎ
- ๅค็งๆท้ ็ฝฎ้็ฆป
5.2 ้ฒๅพกๆง็ผ็จๅคๅฑ้ฒๆค
# ็ฌฌไธๅฑ๏ผๆ็คบ่ฏ็บฆๆ
"""ไฝ ๆๅคๅช่ฝ่ฐ็จ 3 ไธชๅญไปฃ็"""
# ็ฌฌไบๅฑ๏ผไธญ้ดไปถ็กฌๆงๆชๆญ
class SubagentLimitMiddleware:
def after_model(self, state, runtime):
if len(task_calls) > 3:
return truncate_to_3_calls(state)
# ็ฌฌไธๅฑ๏ผๆง่กๅจ่ถ
ๆถ
executor.run(timeout=900) # 15 ๅ้่ถ
ๆถ
# ็ฌฌๅๅฑ๏ผๆฒ็่ตๆบ้ๅถ
docker.run(mem_limit="512m", cpu_quota=50000)ๆ ธๅฟๆๆณ: ไธ่ฆไฟกไปปไปปไฝไธๅฑ้ฒๆค๏ผๅคๅฑๅ ๅบ็กฎไฟๅฎๅ จใ
5.3 ๅปถ่ฟๅๅงๅไธ่ตๆบๅค็จ
class SandboxMiddleware:
def __init__(self, lazy_init: bool = True):
self._lazy_init = lazy_init
def before_agent(self, state, runtime):
if self._lazy_init:
return None # ๅปถ่ฟๅฐ้ฆๆฌกๅทฅๅ
ท่ฐ็จ
# ็ซๅณๅๅงๅ...
# ่ตๆบๅค็จ็ญ็ฅ
sandbox_id = provider.acquire(thread_id) # ๅค็จๅทฒๆๆฒ็
# ่ไธๆฏๆฏๆฌกๅๅปบๆฐ็ๆถ็:
- ๅฏๅจๆถ้ดๅๅฐ 60%
- ่ตๆบๅฉ็จ็ๆๅ
- ็จๆทไฝ้ชๆดๆต็
5.4 ๆบ่ฝ้็บงไธๅฎน้
# TitleMiddleware ็คบไพ
try:
title = await self._generate_title_with_llm(state)
except Exception as e:
# ้็บง็ญ็ฅ๏ผไฝฟ็จ็จๆทๆถๆฏๅ N ๅญ็ฌฆ
title = user_msg[:50] + "..."
# ่ฎฐๅฟ็ณป็ปๅฎน้
try:
memory_data = get_memory_data(agent_name)
except Exception as e:
print(f"Failed to load memory: {e}")
memory_data = {} # ่ฟๅ็ฉบ่ฎฐๅฟ๏ผไธๅฝฑๅไธปๆต็จๅๅ: ่พ ๅฉๅ่ฝๅคฑ่ดฅไธๅบ้ปๅกไธปๆต็จใ
5.5 ็ถๆไธๅฏๅๆง
# ไธไฝฟ็จ mutable ้ป่ฎคๅๆฐ
def merge_artifacts(existing: list[str] | None, new: list[str] | None) -> list[str]:
if existing is None:
return new or []
if new is None:
return existing
# ่ฟๅๆฐๅ่กจ๏ผ่้ไฟฎๆนๅๅ่กจ
return list(dict.fromkeys(existing + new))
# Reducer ๆจกๅผ
artifacts: Annotated[list[str], merge_artifacts]ไผๅฟ:
- ๆถ้ดๆ ่ก่ฐ่ฏ๏ผไฟๅญ็ถๆๅฟซ็ ง๏ผ
- ้ฟๅ ๅฏไฝ็จๅฏผ่ด็ Bug
- ๆฏๆๅนถๅๅฎๅ จ
6. ๆ่กกไธๅฆฅๅ
6.1 ๅๅบ็ๆ่กก
| ๅณ็ญ | ๆถ็ | ไปฃไปท |
|---|---|---|
| JSON ๆไปถๅญๅจ่ฎฐๅฟ | ็ฎๅใๅฏ็งปๆค | ไธ้ๅ้ซ้ขๅๅ ฅใๆ ๆฅ่ฏข่ฝๅ |
| ๅๆญฅ + ๅผๆญฅๅๆนๆณ | ๅ ผๅฎนๆงๅผบ | ไปฃ็ ้ๅค๏ผwrap_tool_call + awrap_tool_call๏ผ |
| ๅทฅๅๅฝๆฐ | ็ตๆดปๆง | ไธขๅคฑ้ขๅๅฏน่ฑก็ๅฐ่ฃ ๆง |
| ่ๆ่ทฏๅพ | ้ๆๆง | ๆง่ฝๆ่๏ผ่ทฏๅพ่ฝฌๆข๏ผ |
| ้ฒๆ่ฎฐๅฟๆดๆฐ | ๆง่ฝ | ๆฐๆฎไธ่ดๆงๅปถ่ฟ |
6.2 ๆชๆฅๅฏ่ฝ็ๆผ่ฟ
็ญๆ๏ผ3-6 ไธชๆ๏ผ:
- ่ฎฐๅฟๅญๅจ่ฟ็งปๅฐ SQLite/PostgreSQL๏ผๆฏๆๆฅ่ฏข๏ผ
- ๅผๅ ฅ Pydantic 2.0 ๆๅๆง่ฝ
- ๅฎๅ็ฑปๅๆณจ่งฃ่ฆ็
้ฟๆ๏ผ6-12 ไธชๆ๏ผ:
- ่่ Rust ้ๅๆง่ฝๅ ณ้ฎ่ทฏๅพ๏ผๆฒ็ๆง่ก๏ผ
- ๆฏๆๅๅธๅผ Agent ๆง่ก
- ๅผๅ ฅๆดๅผบๅคง็ไปปๅก่ฐๅบฆๅจ๏ผๅฆ Temporal๏ผ
7. ๅฏนๅผๅ่ ็ๅฏ็คบ
7.1 ไฝๆถ้็จ DeerFlow ๆถๆ
้ๅ้็จ:
- ้่ฆๅคๆไปปๅก็ผๆ็็ณป็ป
- ๅค็งๆทใๅค้็ฆป็บงๅซ้ๆฑ
- ้ซๅบฆๅฏ้ ็ฝฎใๅฏๆฉๅฑ็ๅนณๅฐ
ไธ้ๅ้็จ:
- ็ฎๅๅฏน่ฏๆบๅจไบบ๏ผ่ฟๅบฆ่ฎพ่ฎก๏ผ
- ไธฅๆ ผๅฎๆถๆง่ฆๆฑ๏ผไธญ้ดไปถ้พๆๅปถ่ฟ๏ผ
- ่ตๆบๅ้็ฏๅข๏ผๅ ๅญๅ ็จ่พ้ซ๏ผ
7.2 ๆ ธๅฟๅญฆไน ็น
- ไธญ้ดไปถๆจกๅผ: ็จไบๆจชๅๅ ณๆณจ็น๏ผๆฅๅฟใๆ้ใ็ๆง๏ผ
- ้ ็ฝฎ้ฉฑๅจ: ๅฐๅๅ็นๅค็ฝฎๅฐ้ ็ฝฎ๏ผไปฃ็ ไฟๆ็จณๅฎ
- ้ฒๅพกๆง็ผ็จ: ๅคๅฑ้ฒๆค๏ผไผ้ ้็บง
- ็ฑปๅๅฎๅ จ: ไฝฟ็จ็ฐไปฃ Python ็ฑปๅ็ณป็ปๆๅไปฃ็ ่ดจ้
- ๆธ่ฟๅผๅคๆๅบฆ: ๅชๅจๅฟ ่ฆๆถๅผๅ ฅๅคๆๆง
8. ๆป็ป
DeerFlow ็่ฎพ่ฎกไฝ็ฐไบ**โๅทฅไธ็บง Agent ็ณป็ปโ**็ๆ็ๅบฆ๏ผ
- ๆถๆๅฑ้ข: ๆธ ๆฐ็ๅๅฑใๆ็กฎ็ไพ่ตๅ ณ็ณป
- ไปฃ็ ๅฑ้ข: ็ฑปๅๅฎๅ จใ้ฒๅพกๅผ็ผ็จใๅฏๆต่ฏๆง
- ไบงๅๅฑ้ข: ไบบๆบๅไฝใๅฏ่งๆตๆงใไผไธๅฐฑ็ปช
ๅฎ่ฏๆไบๆๅปบๅคๆ็ LLM ๅบ็จไธไป ้่ฆ่ฐ็จ API๏ผๆด้่ฆ๏ผ
- ็ณป็ปๅทฅ็จๆ็ปด: ๆ Agent ๅฝไฝๆไฝ็ณป็ป่้่ๆฌ
- ๅฏ้ ๆงๅทฅ็จ: ๅคๅฑ้ฒๆคใไผ้ ้็บงใๅฏ่งๆตๆง
- ็จๆทไฝ้ช่ฎพ่ฎก: ไบบๆบๅไฝ็่พน็ใๅ้ฆๆบๅถ
็ธๅ ณๆๆกฃ:
ๅๆๆฅๆ: 2026-03-09