Skip to content

AI-change-the-world/auto_agent

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

26 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿค– Auto-Agent ๆ™บ่ƒฝไฝ“ๆก†ๆžถ

่ฎฉAI่‡ชไธป่ง„ๅˆ’ใ€ๆ‰ง่กŒๅ’Œๅญฆไน 

Version Python License Tests Documentation

๐Ÿš€ ๅŸบไบŽLLM็š„่‡ชไธปๆ™บ่ƒฝไฝ“ๆก†ๆžถ๏ผŒ่ฎฉAIๅƒไบบ็ฑปไธ€ๆ ท่ง„ๅˆ’ไปปๅŠกใ€่ฐƒ็”จๅทฅๅ…ทใ€็ฎก็†่ฎฐๅฟ†

ๅฟซ้€Ÿๅผ€ๅง‹ โ€ข ๆ ธๅฟƒ็‰นๆ€ง โ€ข ๆ–‡ๆกฃ โ€ข ็คบไพ‹ โ€ข ไผ˜ๅŒ–ๆ–นๆกˆ


๐Ÿ“– ้กน็›ฎ็ฎ€ไป‹

Auto-Agent ๆ˜ฏไธ€ไธช่‡ชไธปๆ™บ่ƒฝไฝ“ๆก†ๆžถ๏ผŒ่ฎฉๅคง่ฏญ่จ€ๆจกๅž‹ไธไป…ไป…ๆ˜ฏ่Šๅคฉๅทฅๅ…ท๏ผŒ่€Œๆ˜ฏ่ƒฝๅคŸ่‡ชไธป่ง„ๅˆ’ไปปๅŠกใ€ๆ‰ง่กŒๅคๆ‚ๅทฅไฝœๆตใ€็ฎก็†้•ฟๆœŸ่ฎฐๅฟ†็š„ๆ™บ่ƒฝไปฃ็†ใ€‚

๐ŸŽฏ ๆ ธๅฟƒไปทๅ€ผ

  • ๐Ÿค– ่‡ชไธปๆ‰ง่กŒ๏ผš่‡ช็„ถ่ฏญ่จ€ๆ่ฟฐ้œ€ๆฑ‚๏ผŒAI่‡ชไธป่ง„ๅˆ’ๅนถๆ‰ง่กŒ
  • ๐Ÿง  ๆŒ็ปญๅญฆไน ๏ผšไธ‰ๅฑ‚่ฎฐๅฟ†็ณป็ปŸ๏ผŒๆ”ฏๆŒไปŽ็ป้ชŒไธญๅญฆไน ๅ’Œๆ”น่ฟ›
  • ๐Ÿ”ง ๅทฅๅ…ท็”Ÿๆ€๏ผš็ตๆดป็š„ๅทฅๅ…ท็ณป็ปŸ๏ผŒๆ”ฏๆŒ่‡ชๅฎšไน‰ๆ‰ฉๅฑ•
  • ๐Ÿ“Š ๅฏ่ง‚ๆต‹ๆ€ง๏ผšๅฎŒๆ•ด็š„ๆ‰ง่กŒ่ฟฝ่ธชๅ’ŒๆŠฅๅ‘Š็”Ÿๆˆ

๐Ÿ“š ่ตทๆบไธŽๅ‘ๅฑ•

ๆœฌ้กน็›ฎๆœ€ๅˆๅœจ DocHive ไธญ่ฟ›่กŒ่ฎพ่ฎกๅ’Œ้ชŒ่ฏ๏ผŒ็Žฐๅทฒ็‹ฌ็ซ‹ไธบไธ“้—จ็š„ๆ™บ่ƒฝไฝ“ๆก†ๆžถใ€‚

โš ๏ธ ๅผ€ๅ‘็Šถๆ€๏ผš้กน็›ฎๅค„ไบŽๆ—ฉๆœŸๅ‘ๅฑ•้˜ถๆฎต๏ผŒAPIๅฏ่ƒฝๅœจๅŽ็ปญ็‰ˆๆœฌไธญ่ฐƒๆ•ดใ€‚ๅปบ่ฎฎๅœจ็”Ÿไบง็Žฏๅขƒไธญ่ฐจๆ…Žไฝฟ็”จใ€‚


๐ŸŒŸ ๆ ธๅฟƒ็‰นๆ€ง

๐Ÿค– ๆ™บ่ƒฝไฝ“ๆ ธๅฟƒ่ƒฝๅŠ›

็‰นๆ€ง ๆ่ฟฐ ไบฎ็‚น
่‡ชไธป่ง„ๅˆ’ ๅŸบไบŽLLM็š„ไปปๅŠกๅˆ†่งฃๅ’Œๆ‰ง่กŒ่ฎกๅˆ’็”Ÿๆˆ ่‡ช็„ถ่ฏญ่จ€ๆ่ฟฐ้œ€ๆฑ‚๏ผŒAI่‡ชไธป่ง„ๅˆ’ๆ‰ง่กŒ่ทฏๅพ„
ๅทฅๅ…ท็ณป็ปŸ ็ตๆดป็š„ๅทฅๅ…ทๆณจๅ†Œๆœบๅˆถ๏ผŒๆ”ฏๆŒ่ฃ…้ฅฐๅ™จๅฟซ้€Ÿๅฎšไน‰ 3็งๅฎšไน‰ๆ–นๅผ๏ผŒไปŽ็ฎ€ๅ•ๅˆฐๅฎŒๅ…จ่‡ชๅฎšไน‰
ๆ™บ่ƒฝ้‡่ฏ• LLM้ฉฑๅŠจ็š„้”™่ฏฏๅˆ†ๆžใ€ๅ‚ๆ•ฐไฟฎๆญฃๅ’Œ็ญ–็•ฅๅญฆไน  ไปŽๅคฑ่ดฅไธญๅญฆไน ๏ผŒ่‡ชๅŠจไผ˜ๅŒ–ๆ‰ง่กŒ็ญ–็•ฅ
ๆ„ๅ›พ่ทฏ็”ฑ ่‡ชๅŠจ่ฏ†ๅˆซ็”จๆˆทๆ„ๅ›พๅนถ่ทฏ็”ฑๅˆฐๅˆ้€‚็š„ Handler/ๆต็จ‹ ๆ”ฏๆŒๅคšๅค„็†ๅ™จๆ‰ฉๅฑ•๏ผˆๅฏ้€ๆญฅๆผ”่ฟ›ไธบๅคšAgent๏ผ‰

๐Ÿง  ๅ…ˆ่ฟ›่ฎฐๅฟ†็ณป็ปŸ

ๅฑ‚็บง ๅ็งฐ ๅญ˜ๅ‚จๆ ผๅผ ็”Ÿๅ‘ฝๅ‘จๆœŸ ๆ ธๅฟƒ่ƒฝๅŠ›
L1 ็Ÿญๆ—ถ่ฎฐๅฟ† ๅ†…ๅญ˜ ๅ•ไปปๅŠก ๆ‰ง่กŒไธŠไธ‹ๆ–‡ใ€ไธญ้—ดๅ†ณ็ญ–่ฎฐๅฝ•
L2 ่ฏญไน‰่ฎฐๅฟ† JSON ้•ฟๆœŸ ็”จๆˆทๅๅฅฝใ€็Ÿฅ่ฏ†ใ€็ญ–็•ฅใ€้”™่ฏฏๆขๅค็ป้ชŒ
L3 ๅ™ไบ‹่ฎฐๅฟ† Markdown ้•ฟๆœŸ ้ซ˜่ฏญไน‰ๅฏ†ๅบฆๆ€ป็ป“ใ€Promptๆณจๅ…ฅ

ๅฎž็Žฐ็Šถๆ€

  • ๐Ÿ“Š ๅˆ†็ฑปๅญ˜ๅ‚จ๏ผšๅทฒๅฎž็Žฐ๏ผˆcategory/subcategory/tags๏ผ‰
  • ๐Ÿ”„ ๅ้ฆˆๅญฆไน ๏ผšๅทฒๅฎž็Žฐ๏ผˆreward/confidence/needs_revision๏ผ‰
  • ๐ŸŽฏ ๆ™บ่ƒฝๆณจๅ…ฅ๏ผšๅทฒๅฎž็Žฐ๏ผˆMemoryRouter + token_budget๏ผ›ๅฏ้€‰ LLM ๆ€ป็ป“๏ผ‰
  • ๐Ÿ“ˆ ๆŒ็ปญไผ˜ๅŒ–๏ผš้ƒจๅˆ†ๅฎž็Žฐ๏ผˆL1โ†’L2 ๆ็‚ผใ€้”™่ฏฏๆขๅค็ญ–็•ฅ่ฎฐๅฟ†ๅŒ–๏ผ‰

๐Ÿ“Š ๅฏ่ง‚ๆต‹ๆ€งไธŽๆŠฅๅ‘Š

  • ๐Ÿ“ˆ ๆ‰ง่กŒ่ฟฝ่ธช๏ผšๅฎŒๆ•ด็š„LLM่ฐƒ็”จ่ฎฐๅฝ•ๅ’ŒTokenไฝฟ็”จ็ปŸ่ฎก
  • ๐Ÿ“‹ ๆต็จ‹ๅฏ่ง†ๅŒ–๏ผšMermaidๆต็จ‹ๅ›พ่‡ชๅŠจ็”Ÿๆˆ
  • ๐Ÿ“ ๆ™บ่ƒฝๆŠฅๅ‘Š๏ผšMarkdown + HTMLๅŒๆ ผๅผๆŠฅๅ‘Š่พ“ๅ‡บ

๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹

๐Ÿ“ฆ ๅฎ‰่ฃ…

ไปŽๆบ็ ๅฎ‰่ฃ…

git clone https://github.com/AI-change-the-world/auto_agent.git
cd auto_agent
pip install -e .

โšก ไบ”ๅˆ†้’ŸไธŠๆ‰‹

1. ้…็ฝฎ็Žฏๅขƒๅ˜้‡

# OpenAI
export OPENAI_API_KEY=your-api-key
export OPENAI_BASE_URL=https://api.openai.com/v1
export OPENAI_MODEL=gpt-4o-mini

2. ่ฟ่กŒๆทฑๅบฆ็ ”็ฉถ็คบไพ‹

python examples/deep_research_demo.py

่ฟ™ไธช็คบไพ‹ไผšๆผ”็คบ๏ผš

  • ๐Ÿค– AI่‡ชไธป่ง„ๅˆ’็ ”็ฉถไปปๅŠก
  • ๐Ÿ”ง ่‡ชๅŠจ่ฐƒ็”จๅคšไธชๅทฅๅ…ท
  • ๐Ÿ“Š ็”ŸๆˆๅฎŒๆ•ด็š„็ ”็ฉถๆŠฅๅ‘Š
  • ๐Ÿ“ˆ ๆ‰ง่กŒ่ฟ‡็จ‹ๅฏ่ง†ๅŒ–

3. ๆŸฅ็œ‹็ป“ๆžœ

่ฟ่กŒๅŽไผšๅœจ examples/output/ ็›ฎๅฝ•็”Ÿๆˆ๏ผš

  • ๐Ÿ“„ Markdown็ ”็ฉถๆŠฅๅ‘Š
  • ๐ŸŒ HTMLๅฏ่ง†ๅŒ–ๆŠฅๅ‘Š
  • ๐Ÿ“‹ ่ฏฆ็ป†็š„ๆ‰ง่กŒ่ฟฝ่ธชๆ—ฅๅฟ—

๐Ÿ’ก ๆ็คบ๏ผšๅฆ‚ๆžœๆš‚ๆ—ถๆฒกๆœ‰ API Key๏ผŒๅฏไปฅๅ…ˆ็œ‹ๆ— ้œ€่ฐƒ็”จ LLM ็š„็คบไพ‹๏ผšcustom_tool.py๏ผŒไปฅๅŠ่ฎฐๅฟ†็ณป็ปŸ็คบไพ‹๏ผšmemory_demo.pyใ€‚

๐Ÿ”ง ๅทฅๅ…ท็ณป็ปŸ

Auto-Agentๆไพ›็ตๆดป็š„ๅทฅๅ…ท็ณป็ปŸ๏ผŒๆ”ฏๆŒ3็งๅฎšไน‰ๆ–นๅผ๏ผŒไปŽ็ฎ€ๅ•ๅ‡ฝๆ•ฐๅˆฐๅคๆ‚ๅทฅๅ…ทๅบ”ๆœ‰ๅฐฝๆœ‰ใ€‚

๐ŸŽฏ ไธ‰็งๅฎšไน‰ๆ–นๅผๅฏนๆฏ”

ๆ–นๅผ ้šพๅบฆ ๅŠŸ่ƒฝ ้€‚็”จๅœบๆ™ฏ
ๅ‡ฝๆ•ฐ่ฃ…้ฅฐๅ™จ โญ ๅŸบ็ก€ๅŠŸ่ƒฝ ็ฎ€ๅ•ๅŒๆญฅ/ๅผ‚ๆญฅๅ‡ฝๆ•ฐๅŒ…่ฃ…
็ฑป่ฃ…้ฅฐๅ™จ โญโญ ้ชŒ่ฏ/ๅŽ‹็ผฉ ้œ€่ฆๅ‚ๆ•ฐ้ชŒ่ฏๆˆ–็ป“ๆžœๅŽ‹็ผฉ
็ปงๆ‰ฟBaseTool โญโญโญ ๅฎŒๅ…จๆŽงๅˆถ ๅคๆ‚้€ป่พ‘ใ€ไพ่ต–ๆณจๅ…ฅใ€็Šถๆ€็ฎก็†

ๆ–นๅผไธ€๏ผšๅ‡ฝๆ•ฐ่ฃ…้ฅฐๅ™จ๏ผˆๆœ€ๆ–นไพฟ๏ผ‰โœจ

ๆœ€็ฎ€ๅ•็š„ๅทฅๅ…ทๅฎšไน‰ๆ–นๅผ๏ผŒ้€‚ๅˆๅŒ…่ฃ…็Žฐๆœ‰ๅ‡ฝๆ•ฐ๏ผš

from auto_agent import func_tool

@func_tool(name="calculator", description="ๆ•ฐๅญฆ่ฎก็ฎ—ๅ™จ", category="math")
async def calculator(expression: str, precision: int = 2) -> dict:
    """่ฎก็ฎ—ๆ•ฐๅญฆ่กจ่พพๅผ๏ผŒๆ”ฏๆŒๅŠ ๅ‡ไน˜้™คๅ’Œๅ‡ฝๆ•ฐ"""
    try:
        result = eval(expression)
        return {"success": True, "result": round(result, precision)}
    except Exception as e:
        return {"success": False, "error": str(e)}

@func_tool(name="web_search", description="็ฝ‘็ปœๆœ็ดข", category="search")
async def web_search(query: str, limit: int = 5) -> dict:
    """ไฝฟ็”จๆœ็ดขๅผ•ๆ“Ž่Žทๅ–ไฟกๆฏ"""
    # ๅฎž็Žฐๆœ็ดข้€ป่พ‘...
    return {"success": True, "results": [...], "count": limit}

ๆ–นๅผไบŒ๏ผš็ฑป่ฃ…้ฅฐๅ™จ

้€‚ๅˆ้œ€่ฆๅ‚ๆ•ฐ้ชŒ่ฏๆˆ–็ป“ๆžœๅŽ‹็ผฉ็š„ๅœบๆ™ฏ๏ผš

from auto_agent import tool, BaseTool
from typing import Dict, Any

# ่‡ชๅฎšไน‰ๅŽ‹็ผฉๅ‡ฝๆ•ฐ๏ผˆๆŽงๅˆถไธŠไธ‹ๆ–‡้•ฟๅบฆ๏ผ‰
def compress_search_result(result: Dict[str, Any], state: Dict[str, Any]) -> Dict[str, Any]:
    """ๅŽ‹็ผฉๆœ็ดข็ป“ๆžœ๏ผŒ้ฟๅ…ไธŠไธ‹ๆ–‡ๆบขๅ‡บ"""
    return {
        "success": result.get("success"),
        "count": len(result.get("documents", [])),
        "top_docs": result.get("documents", [])[:3],  # ๅชไฟ็•™ๅ‰3ไธช
    }

@tool(
    name="document_search",
    description="ๆ–‡ๆกฃๅ…จๆ–‡ๆฃ€็ดข",
    category="retrieval",
    compress_function=compress_search_result,  # ็ป“ๆžœๅŽ‹็ผฉ
)
class DocumentSearchTool(BaseTool):
    def __init__(self, index_path: str):
        self.index_path = index_path

    async def execute(self, query: str, limit: int = 10, **kwargs) -> Dict[str, Any]:
        # ๅฎž็Žฐๆ–‡ๆกฃๆœ็ดข้€ป่พ‘...
        return {
            "success": True,
            "documents": [...],
            "total_found": 25
        }

ๆ–นๅผไธ‰๏ผš็ปงๆ‰ฟBaseTool

้€‚ๅˆๅคๆ‚ๅทฅๅ…ท๏ผŒ้œ€่ฆๅฎŒๅ…จๆŽงๅˆถ็”Ÿๅ‘ฝๅ‘จๆœŸ๏ผš

from auto_agent import BaseTool, ToolDefinition, ToolParameter

class LLMReasoningTool(BaseTool):
    """ไฝฟ็”จLLM่ฟ›่กŒๆŽจ็†ๅˆ†ๆž็š„ๅทฅๅ…ท"""

    def __init__(self, llm_client):
        self.llm_client = llm_client

    @property
    def definition(self) -> ToolDefinition:
        return ToolDefinition(
            name="llm_reasoning",
            description="ไฝฟ็”จๅคง่ฏญ่จ€ๆจกๅž‹่ฟ›่กŒๆŽจ็†ๅˆ†ๆž",
            parameters=[
                ToolParameter(
                    name="question",
                    type="string",
                    description="้œ€่ฆๆŽจ็†็š„้—ฎ้ข˜",
                    required=True
                ),
                ToolParameter(
                    name="context",
                    type="string",
                    description="็›ธๅ…ณไธŠไธ‹ๆ–‡ไฟกๆฏ",
                    required=False
                ),
            ],
            category="reasoning",
            # ้”™่ฏฏๆขๅค้…็ฝฎ
            error_recovery={
                "max_retries": 2,
                "retry_on": ["TIMEOUT_ERROR", "NETWORK_ERROR"]
            }
        )

    async def execute(self, question: str, context: str = "", **kwargs) -> Dict[str, Any]:
        """ๆ‰ง่กŒLLMๆŽจ็†"""
        prompt = f"ๅŸบไบŽไปฅไธ‹ไธŠไธ‹ๆ–‡ๅ›ž็ญ”้—ฎ้ข˜๏ผš\n\nไธŠไธ‹ๆ–‡๏ผš{context}\n้—ฎ้ข˜๏ผš{question}"

        try:
            response = await self.llm_client.chat([
                {"role": "user", "content": prompt}
            ])
            return {
                "success": True,
                "answer": response,
                "confidence": 0.8
            }
        except Exception as e:
            return {"success": False, "error": str(e)}

๐Ÿ“‹ ๅทฅๅ…ทๆณจๅ†Œ

from auto_agent import ToolRegistry, get_global_registry

# ๆ–นๆณ•1๏ผšไฝฟ็”จๅ…จๅฑ€ๆณจๅ†Œ่กจ๏ผˆ่ฃ…้ฅฐๅ™จไผš่‡ชๅŠจๆณจๅ†Œ๏ผ‰
registry = get_global_registry()
print(f"ๅทฒๆณจๅ†Œๅทฅๅ…ทๆ•ฐ้‡: {len(registry.get_all_tools())}")

# ๆ–นๆณ•2๏ผšๆ‰‹ๅŠจๆณจๅ†Œๅˆฐ่‡ชๅฎšไน‰ๆณจๅ†Œ่กจ
custom_registry = ToolRegistry()
custom_registry.register(LLMReasoningTool(llm_client))
custom_registry.register(DocumentSearchTool("./index"))

# ๆ–นๆณ•3๏ผšๅœจAgentไธญๆŒ‡ๅฎšๅทฅๅ…ทๆณจๅ†Œ่กจ
agent = AutoAgent(
    llm_client=llm_client,
    tool_registry=custom_registry,
    # ... ๅ…ถไป–้…็ฝฎ
)

๐Ÿ’ก ๆ็คบ๏ผšๆŸฅ็œ‹ examples/custom_tool.py ่Žทๅ–ๅฎŒๆ•ด็คบไพ‹ใ€‚

๐ŸŒŸ ๅบ”็”จๅœบๆ™ฏ

Auto-Agent ้€‚็”จไบŽๅคš็งๅคๆ‚็š„AIๅบ”็”จๅœบๆ™ฏ๏ผš

๐Ÿ“Š ็ ”็ฉถไธŽๅˆ†ๆž

  • ๆทฑๅบฆ็ ”็ฉถ๏ผš่‡ชๅŠจ่ง„ๅˆ’็ ”็ฉถๆต็จ‹๏ผŒๆ”ถ้›†ๅคšๆบไฟกๆฏ๏ผŒ็”Ÿๆˆ็ปผๅˆๆŠฅๅ‘Š
  • ๅธ‚ๅœบๅˆ†ๆž๏ผš็ซžไบ‰ๅฏนๆ‰‹ๅˆ†ๆžใ€่ถ‹ๅŠฟ้ข„ๆต‹ใ€ๆŠ•่ต„ๅปบ่ฎฎ็”Ÿๆˆ
  • ๆŠ€ๆœฏ่ฐƒ็ ”๏ผšๆ–ฐๆŠ€ๆœฏ่ฏ„ไผฐใ€ๆžถๆž„ๆ–นๆกˆ่ฎพ่ฎกใ€ๅฎž็Žฐ่ทฏๅพ„่ง„ๅˆ’

โœ๏ธ ๅ†…ๅฎนๅˆ›ไฝœ

  • ๆ–‡ๆกฃๅ†™ไฝœ๏ผšๆŠ€ๆœฏๆ–‡ๆกฃใ€ๅšๅฎขๆ–‡็ซ ใ€็ ”็ฉถๆŠฅๅ‘Š่‡ชๅŠจ็”Ÿๆˆ
  • ไปฃ็ ็”Ÿๆˆ๏ผšๆ นๆฎ้œ€ๆฑ‚่‡ชๅŠจ็ผ–ๅ†™ๅ’Œไผ˜ๅŒ–ไปฃ็ 
  • ๅˆ›ๆ„ๅ†™ไฝœ๏ผšๆ•…ไบ‹ๅˆ›ไฝœใ€่ฅ้”€ๆ–‡ๆกˆใ€ไธชๆ€งๅŒ–ๅ†…ๅฎน

๐Ÿค– ๆ™บ่ƒฝๅŠฉๆ‰‹

  • ไปปๅŠก่‡ชๅŠจๅŒ–๏ผšๅคๆ‚ๅทฅไฝœๆต็จ‹็š„่‡ชๅŠจๅŒ–ๆ‰ง่กŒ
  • ้—ฎ้ข˜่งฃๅ†ณ๏ผšๅคšๆญฅ้ชค้—ฎ้ข˜ๅˆ†ๆžๅ’Œ่งฃๅ†ณๆ–นๆกˆ็”Ÿๆˆ
  • ๅญฆไน ่พ…ๅฏผ๏ผšไธชๆ€งๅŒ–ๅญฆไน ่ฎกๅˆ’ๅˆถๅฎšๅ’Œ่ฟ›ๅบฆ่ทŸ่ธช

๐Ÿ”ง ไผไธšๅบ”็”จ

  • ๆ•ฐๆฎๅค„็†๏ผš่‡ชๅŠจๆ•ฐๆฎๆธ…ๆด—ใ€ๅˆ†ๆžๅ’ŒๆŠฅๅ‘Š็”Ÿๆˆ
  • ๅฎขๆˆทๆœๅŠก๏ผšๆ™บ่ƒฝๅฎขๆœใ€้—ฎ้ข˜่ฏŠๆ–ญใ€่งฃๅ†ณๆ–นๆกˆๆŽจ่
  • ่ฟ่ฅไผ˜ๅŒ–๏ผšไธšๅŠกๆต็จ‹ไผ˜ๅŒ–ใ€ๆ•ˆ็އๅˆ†ๆžใ€ๆ”น่ฟ›ๅปบ่ฎฎ

๐Ÿ“ˆ ็คบไพ‹้กน็›ฎ

็คบไพ‹ ๅŠŸ่ƒฝ ๅคๆ‚ๅบฆ ๆ–‡ไปถ
ๆทฑๅบฆ็ ”็ฉถ ่‡ชไธป่ง„ๅˆ’็ ”็ฉถไปปๅŠก๏ผŒ็”ŸๆˆๅฎŒๆ•ดๆŠฅๅ‘Š โญโญโญ deep_research_demo.py
ๅทฅไฝœๆตๆผ”็คบ Markdown ๅฎšไน‰ Agent โ†’ ๆ‰ง่กŒ โ†’ ็”Ÿๆˆๅฏ่ง†ๅŒ–ๆŠฅๅ‘Š โญโญโญ workflow_demo.py
่‡ชๅฎšไน‰ๅทฅๅ…ท ๅทฅๅ…ทๅฎšไน‰ๅ’Œๆณจๅ†Œ็คบไพ‹ โญ custom_tool.py
่ฎฐๅฟ†็ณป็ปŸ ่ฎฐๅฟ†็ฎก็†ๅŠŸ่ƒฝๆผ”็คบ โญโญ memory_demo.py

๐Ÿš€ ่ฟ่กŒ็คบไพ‹

# 1. ้…็ฝฎ็Žฏๅขƒๅ˜้‡
export OPENAI_API_KEY=your-api-key
export OPENAI_MODEL=gpt-4o-mini

# 2. ่ฟ่กŒๆทฑๅบฆ็ ”็ฉถ็คบไพ‹
python examples/deep_research_demo.py

# 3. ๆŸฅ็œ‹็”Ÿๆˆ็š„็ป“ๆžœ
ls examples/output/

๐ŸŽฏ IntentRouter vs TaskPlanner

Auto-Agent ๆไพ›ไธคไธชๆ ธๅฟƒ็ป„ไปถ็”จไบŽๅค„็†็”จๆˆท่ฏทๆฑ‚๏ผš

็ป„ไปถ IntentRouter (ๆ„ๅ›พ่ทฏ็”ฑๅ™จ) TaskPlanner (ไปปๅŠก่ง„ๅˆ’ๅ™จ)
่Œ่ดฃ ่ฏ†ๅˆซ็”จๆˆทๆ„ๅ›พ๏ผŒ้€‰ๆ‹ฉๅ“ชไธช Agent/Handler ๅค„็† ่ง„ๅˆ’ๅ…ทไฝ“ๆ‰ง่กŒๆญฅ้ชค๏ผŒๅ†ณๅฎš่ฐƒ็”จๅ“ชไบ›ๅทฅๅ…ท
่พ“ๅ‡บ ๅ•ไธ€็ป“ๆžœ๏ผšhandler_name + confidence ๅคšๆญฅ้ชค่ฎกๅˆ’๏ผšsteps[] + state_schema
็ฒ’ๅบฆ ็ฒ—็ฒ’ๅบฆ๏ผˆ้€‰ๆ‹ฉๅค„็†ๅ™จ๏ผ‰ ็ป†็ฒ’ๅบฆ๏ผˆ็ผ–ๆŽ’ๅทฅๅ…ท้“พ๏ผ‰
ๆ—ถๆœบ ่ฏทๆฑ‚ๅ…ฅๅฃ๏ผŒ็ฌฌไธ€ๆญฅ ็กฎๅฎš Agent ๅŽ๏ผŒ่ง„ๅˆ’ๆ‰ง่กŒๆต็จ‹

ๅ…ธๅž‹ๆต็จ‹

็”จๆˆท่พ“ๅ…ฅ: "ๅธฎๆˆ‘ๅ†™ไธ€็ฏ‡AIๆŠฅๅ‘Š"
         โ†“
    IntentRouter
         โ†“ ่ทฏ็”ฑๅˆฐ "writer" Agent
    TaskPlanner
         โ†“ ่ง„ๅˆ’ๆญฅ้ชค
    [analyze_input โ†’ search โ†’ outline โ†’ compose]
         โ†“
    ๆ‰ง่กŒๅทฅๅ…ท้“พ

IntentRouter ไฝฟ็”จ็คบไพ‹

from auto_agent import IntentRouter, OpenAIClient

# ๅˆๅง‹ๅŒ–
llm = OpenAIClient(api_key="sk-xxx")
router = IntentRouter(llm_client=llm, default_handler="chat")

# ๆณจๅ†Œๅค„็†ๅ™จ
router.register(
    name="writer",
    description="ๆ–‡ๆกฃๅ†™ไฝœ๏ผŒๅŒ…ๆ‹ฌๆŠฅๅ‘Šใ€ๆ–‡็ซ ใ€็ฌ”่ฎฐ็ญ‰",
    keywords=["ๅ†™", "ๆ’ฐๅ†™", "ๆ–‡ๆกฃ", "ๆŠฅๅ‘Š", "ๆ–‡็ซ "],
)
router.register(
    name="search",
    description="ไฟกๆฏๆฃ€็ดขๅ’Œๆœ็ดข",
    keywords=["ๆœ็ดข", "ๆŸฅๆ‰พ", "ๆฃ€็ดข"],
)
router.register(
    name="qa",
    description="้—ฎ็ญ”ๅ’Œ็Ÿฅ่ฏ†ๆŸฅ่ฏข",
    keywords=["ไป€ไนˆๆ˜ฏ", "ๅฆ‚ไฝ•", "ไธบไป€ไนˆ"],
)

# ่ทฏ็”ฑ
result = await router.route("ๅธฎๆˆ‘ๅ†™ไธ€็ฏ‡ๅ…ณไบŽAI็š„่ฐƒ็ ”ๆŠฅๅ‘Š")
print(f"่ทฏ็”ฑๅˆฐ: {result.handler_name}, ็ฝฎไฟกๅบฆ: {result.confidence}")
# ่พ“ๅ‡บ: ่ทฏ็”ฑๅˆฐ: writer, ็ฝฎไฟกๅบฆ: 0.70

TaskPlanner ไฝฟ็”จ็คบไพ‹

from auto_agent.core.planner import TaskPlanner

planner = TaskPlanner(
    llm_client=llm,
    tool_registry=registry,
    agent_goals=["็†่งฃ็”จๆˆท้œ€ๆฑ‚", "็”Ÿๆˆ้ซ˜่ดจ้‡ๆ–‡ๆกฃ"],
    agent_constraints=["ๆ–‡ๆกฃไธ่ถ…่ฟ‡5000ๅญ—"],
)

plan = await planner.plan(
    query="ๅ†™ไธ€็ฏ‡AIๅŒป็–—ๆŠฅๅ‘Š",
    user_context="็”จๆˆทๆ˜ฏๆŠ€ๆœฏไบบๅ‘˜",
    conversation_context="",
)

for step in plan.subtasks:
    print(f"Step {step.id}: {step.tool} - {step.description}")

๐Ÿง  ่ฎฐๅฟ†็ณป็ปŸ

Auto-Agent ๆไพ›ไธ‰ๅฑ‚่ฎฐๅฟ†ๆžถๆž„๏ผŒๆ”ฏๆŒๅ้ฆˆๅญฆไน ใ€ๆ™บ่ƒฝๆณจๅ…ฅๅ’Œ้”™่ฏฏๆขๅค็ญ–็•ฅ่ฎฐๅฟ†ๅŒ–ใ€‚

๐Ÿ—๏ธ ไธ‰ๅฑ‚่ฎฐๅฟ†ๆžถๆž„

ๅฑ‚็บง ๅ็งฐ ๅญ˜ๅ‚จๆ ผๅผ ็”Ÿๅ‘ฝๅ‘จๆœŸ ๆ ธๅฟƒ็”จ้€” ๆ›ดๆ–ฐ้ข‘็އ
L1 ็Ÿญๆ—ถ่ฎฐๅฟ† ๅ†…ๅญ˜ ๅ•ไปปๅŠกๆ‰ง่กŒ ๆ‰ง่กŒไธŠไธ‹ๆ–‡ใ€ไธญ้—ดๅ†ณ็ญ–ใ€ๅทฅๅ…ท่ฐƒ็”จ่ฎฐๅฝ• ๅฎžๆ—ถ
L2 ่ฏญไน‰่ฎฐๅฟ† JSON ้•ฟๆœŸๆŒไน…ๅŒ– ็”จๆˆทๅๅฅฝใ€็Ÿฅ่ฏ†ๅบ“ใ€ๆˆๅŠŸ็ญ–็•ฅใ€้”™่ฏฏๆขๅค็ป้ชŒ ๅฎšๆœŸๆ็‚ผ
L3 ๅ™ไบ‹่ฎฐๅฟ† Markdown ้•ฟๆœŸๆŒไน…ๅŒ– ้ซ˜่ฏญไน‰ๅฏ†ๅบฆๆ€ป็ป“ใ€่กŒไธบๆจกๅผๅˆ†ๆžใ€Promptๆณจๅ…ฅ ๅ‘จๆœŸๆ€ง็”Ÿๆˆ

๐ŸŽฏ ๆžถๆž„ไผ˜ๅŠฟ

  • ๅˆ†ๅฑ‚้š”็ฆป๏ผšไธๅŒ็”Ÿๅ‘ฝๅ‘จๆœŸ่ฎฐๅฟ†ๅˆ†็ฆป็ฎก็†๏ผŒ้ฟๅ…็›ธไบ’ๅนฒๆ‰ฐ
  • ๆ™บ่ƒฝๆณจๅ…ฅ๏ผšๅŸบไบŽๆŸฅ่ฏขๆ„ๅ›พๆŒ‰้œ€ๆณจๅ…ฅ็›ธๅ…ณ่ฎฐๅฟ†๏ผŒๆŽงๅˆถTokenๆˆๆœฌ
  • ๅ้ฆˆ้—ญ็Žฏ๏ผš็”จๆˆทๅ้ฆˆ็›ดๆŽฅๅฝฑๅ“่ฎฐๅฟ†ๆƒ้‡๏ผŒๅฝขๆˆๆŒ็ปญๅญฆไน ่ƒฝๅŠ›
  • ๅคšๆ ผๅผๅญ˜ๅ‚จ๏ผšJSON็”จไบŽๅ†ณ็ญ–๏ผŒMarkdown็”จไบŽ่ฏญไน‰็†่งฃ

๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹

from auto_agent import MemorySystem, MemoryCategory

# ๅˆๅง‹ๅŒ–็ปŸไธ€่ฎฐๅฟ†็ณป็ปŸ
memory = MemorySystem(storage_path="./data/memory", token_budget=2000)

user_id = "user_001"

# === L1 ็Ÿญๆ—ถ่ฎฐๅฟ† ===
task_id = memory.start_task(user_id, "ๅธฎๆˆ‘ๅ†™ไธ€็ฏ‡AIๆŠฅๅ‘Š")
wm = memory.get_working_memory(task_id)

# ่ฎฐๅฝ•ๆ‰ง่กŒ่ฟ‡็จ‹
wm.add_decision("ไฝฟ็”จๅˆ†ๅฑ‚็ป“ๆž„็ป„็ป‡ๅ†…ๅฎน", "ๆๅ‡ๅฏ่ฏปๆ€ง")
wm.add_tool_call("web_search", {"query": "AIๆœ€ๆ–ฐ่ฟ›ๅฑ•"}, {"success": True, "count": 15})

# ไปปๅŠก็ป“ๆŸๆ—ถๆ็‚ผๅˆฐ้•ฟๆœŸ่ฎฐๅฟ†
memory.end_task(user_id, task_id, promote_to_long_term=True)

# === L2 ่ฏญไน‰่ฎฐๅฟ† ===
# ไพฟๆทๆ–นๆณ•่ฎฐๅฝ•ๅ„็ฑป่ฎฐๅฟ†
memory.set_preference(user_id, "language", "ไธญๆ–‡")
memory.add_knowledge(user_id, "็”จๆˆท็ฒพ้€šPythonๅ’ŒFastAPIๆก†ๆžถ")
memory.add_strategy(user_id, "ๅคๆ‚ไปปๅŠกๅ…ˆๅˆ†่งฃไธบๅญไปปๅŠก", is_successful=True)

# ๅˆ†็ฑป็ฎก็†
memory.add_memory(
    user_id=user_id,
    content="็”จๆˆทๅๅฅฝไฝฟ็”จๅผ‚ๆญฅไปฃ็ ๆจกๅผ",
    category=MemoryCategory.PREFERENCE,
    tags=["coding", "async"],
    confidence=0.9,
)

# === ็”จๆˆทๅ้ฆˆ้ฉฑๅŠจๅญฆไน  ===
item = memory.add_memory(user_id, "ๅปบ่ฎฎไฝฟ็”จ็ฑปๅž‹ๆณจ่งฃ")
memory.thumbs_up(user_id, item.memory_id)  # ๐Ÿ‘ ๆญฃๅ้ฆˆ
memory.thumbs_down(user_id, item.memory_id, "ๆŸไบ›ๅœบๆ™ฏไธ‹่ฟ‡ไบŽ็น็")  # ๐Ÿ‘Ž ่ดŸๅ้ฆˆ

# === ๆ™บ่ƒฝ่ฎฐๅฟ†ๆณจๅ…ฅ๏ผˆๅŒๆญฅ๏ผ‰===
ctx = memory.get_context_for_query(user_id, "ๅธฎๆˆ‘ๅ†™ไธ€ไธช Web ๅบ”็”จ")
print(ctx["context"])

๐Ÿ“– ่ฏฆ็ป†ๆ–‡ๆกฃ๏ผš่ฎฐๅฟ†็ณป็ปŸ่ฎพ่ฎก | ่ฟ็งปๆŒ‡ๅ— ๐Ÿ’ก ๆ›ดๅฎŒๆ•ด็š„่ฎฐๅฟ†็ณป็ปŸๆผ”็คบ่ฏท็œ‹๏ผšexamples/memory_demo.py

่ฎฐๅฟ†่ทฏ็”ฑๅ™จ (MemoryRouter)

่‡ชๅŠจๅˆ†ๆžๆŸฅ่ฏข๏ผŒๅ†ณๅฎšๆณจๅ…ฅๅ“ชไบ›่ฎฐๅฟ†๏ผš

from auto_agent import MemoryRouter, SemanticMemory, QueryIntent

sm = SemanticMemory()
router = MemoryRouter(sm, default_token_budget=2000)

# ๅˆ†ๆžๆŸฅ่ฏขๆ„ๅ›พๅ’Œ้ข†ๅŸŸ
analysis = router.analyze_query("ๅธฎๆˆ‘ๆ€ป็ป“ไธ€ไธ‹ไน‹ๅ‰็š„ๅญฆไน ็ป้ชŒ")
print(analysis["intent"])  # QueryIntent.REFLECTION
print(analysis["categories"])  # [MemoryCategory.STRATEGY, ...]

# ๅˆคๆ–ญๆ˜ฏๅฆ้œ€่ฆ่ฎฐๅฟ†
should_use, reason = router.should_use_memory("ไฝ ๅฅฝ")  # False, "็ฎ€ๅ•้—ฎๅ€™"
should_use, reason = router.should_use_memory("ๅธฎๆˆ‘ๅ†™ไปฃ็ ")  # True, "้ข†ๅŸŸ็›ธๅ…ณ"

# ่Žทๅ–ๆณจๅ…ฅ้…็ฝฎ
config = router.get_memory_injection_config("ๆ€ป็ป“็ป้ชŒ")
# {"use_l3_narrative": True, "token_budget": 3000, "priority": "recency"}

๐Ÿ”„ ๆ™บ่ƒฝ้‡่ฏ•ๆœบๅˆถ

Auto-Agent ๆไพ› LLM ้ฉฑๅŠจ็š„ๆ™บ่ƒฝ้‡่ฏ•ๆœบๅˆถ๏ผŒ่ƒฝๅคŸๅˆ†ๆž้”™่ฏฏๅŽŸๅ› ใ€่‡ชๅŠจไฟฎๆญฃๅ‚ๆ•ฐ๏ผŒๅนถไปŽๆˆๅŠŸ็š„ๆขๅค็ญ–็•ฅไธญๅญฆไน ใ€‚

ๆ ธๅฟƒ่ƒฝๅŠ›

่ƒฝๅŠ› ่ฏดๆ˜Ž
ๆ™บ่ƒฝ้”™่ฏฏๅˆ†ๆž ไฝฟ็”จ LLM ๅˆ†ๆž้”™่ฏฏ็ฑปๅž‹ใ€ๆ นๅ› ๅ’Œๅฏๆขๅคๆ€ง
ๅ‚ๆ•ฐ่‡ชๅŠจไฟฎๆญฃ ๅฝ“ๆฃ€ๆต‹ๅˆฐๅ‚ๆ•ฐ้”™่ฏฏๆ—ถ๏ผŒ่‡ชๅŠจๆŽจๆ–ญๆญฃ็กฎๅ‚ๆ•ฐๅ€ผ
็ญ–็•ฅๅญฆไน  ๅฐ†ๆˆๅŠŸ็š„ๆขๅค็ญ–็•ฅ่ฎฐๅฝ•ๅˆฐ L2 ่ฎฐๅฟ†๏ผŒไพ›ๅŽ็ปญๅค็”จ
ๅކๅฒ็ญ–็•ฅไผ˜ๅ…ˆ ้‡ๅˆฐ็ฑปไผผ้”™่ฏฏๆ—ถ๏ผŒไผ˜ๅ…ˆไฝฟ็”จๅކๅฒๆˆๅŠŸ็ญ–็•ฅ

้”™่ฏฏ็ฑปๅž‹ไธŽๆขๅค็ญ–็•ฅ

้”™่ฏฏ็ฑปๅž‹ ๅฏๆขๅคๆ€ง ้ป˜่ฎค็ญ–็•ฅ
PARAMETER_ERROR ้ซ˜ LLM ไฟฎๆญฃๅ‚ๆ•ฐๅŽ้‡่ฏ•
NETWORK_ERROR ้ซ˜ ๆŒ‡ๆ•ฐ้€€้ฟ้‡่ฏ•
TIMEOUT_ERROR ไธญ ๅขžๅŠ ่ถ…ๆ—ถๅŽ้‡่ฏ•
RESOURCE_ERROR ไธญ ็ญ‰ๅพ…ๆˆ–ๅˆ‡ๆข่ต„ๆบ
LOGIC_ERROR ไฝŽ ่งฆๅ‘้‡่ง„ๅˆ’
PERMISSION_ERROR ไฝŽ ไธญๆญขๅนถๆŠฅๅ‘Š

ไฝฟ็”จ็คบไพ‹

from auto_agent.retry import RetryController, RetryConfig, ErrorType

# ๅˆ›ๅปบๅธฆ LLM ็š„้‡่ฏ•ๆŽงๅˆถๅ™จ
retry_controller = RetryController(
    config=RetryConfig(max_retries=3),
    llm_client=llm_client,
)

# ๆ™บ่ƒฝ้”™่ฏฏๅˆ†ๆž
error_analysis = await retry_controller.analyze_error(
    exception=e,
    context={"state": state, "arguments": args},
    tool_definition=tool.definition,
    memory_system=memory,  # ๅฏ้€‰๏ผšๅฏ็”จๅކๅฒ็ญ–็•ฅๆŸฅ่ฏข
)

# ๅ‚ๆ•ฐไฟฎๆญฃๅปบ่ฎฎ
if error_analysis.error_type == ErrorType.PARAMETER_ERROR:
    fixed_params = await retry_controller.suggest_parameter_fixes(
        failed_params=args,
        error_analysis=error_analysis,
        context={"state": state},
    )

# ่ฎฐๅฝ•ๆˆๅŠŸ็š„ๆขๅค็ญ–็•ฅ๏ผˆ่‡ชๅŠจๅญฆไน ๏ผ‰
await retry_controller.record_successful_recovery(
    original_error=e,
    tool_name="search_documents",
    original_params=original_args,
    fixed_params=fixed_params,
    memory_system=memory,
)

้”™่ฏฏๆขๅคๆต็จ‹

ๆ‰ง่กŒๅคฑ่ดฅ
    โ”‚
    โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ๆŸฅ่ฏขๅކๅฒ็ญ–็•ฅ    โ”‚ โ† ไผ˜ๅ…ˆไฝฟ็”จ L2 ่ฎฐๅฟ†ไธญ็š„ๆˆๅŠŸ็ญ–็•ฅ
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
    โ”Œโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”
    โ”‚ ๆœ‰ๅŒน้…๏ผŸ โ”‚
    โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜
         โ”‚
    โ”Œโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”
   ๆ˜ฏ        ๅฆ
    โ”‚         โ”‚
    โ–ผ         โ–ผ
ไฝฟ็”จๅކๅฒ   LLM ๅˆ†ๆž
็ญ–็•ฅ้‡่ฏ•   ้”™่ฏฏๅŽŸๅ› 
    โ”‚         โ”‚
    โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ–ผ
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚ ๆˆๅŠŸ๏ผŸ  โ”‚
    โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜
         โ”‚
    โ”Œโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”
   ๆ˜ฏ        ๅฆ
    โ”‚         โ”‚
    โ–ผ         โ–ผ
่ฎฐๅฝ•็ญ–็•ฅ   ็ปง็ปญ้‡่ฏ•
ๅˆฐ L2     ๆˆ–้‡่ง„ๅˆ’

๐Ÿ“Š ๆ‰ง่กŒๆŠฅๅ‘Š

from auto_agent import ExecutionReportGenerator, ExecutionPlan, PlanStep, SubTaskResult

# ็”ŸๆˆๆŠฅๅ‘Šๆ•ฐๆฎ
report_data = ExecutionReportGenerator.generate_report_data(
    agent_name="ๆ–‡ๆกฃๅ†™ไฝœๆ™บ่ƒฝไฝ“",
    query="ๅ†™ไธ€็ฏ‡AIๆŠฅๅ‘Š",
    plan=plan,
    results=results,
    state=final_state,
)

# ่Žทๅ– Mermaid ๆต็จ‹ๅ›พ
print(report_data["mermaid_diagram"])
# graph TD
#     Start([ๅผ€ๅง‹]) --> Step1
#     Step1[analyze_input] --> Step2
#     Step2[search_documents] --> Step3
#     ...

# ็”Ÿๆˆ Markdown ๆŠฅๅ‘Š
markdown = ExecutionReportGenerator.generate_markdown_report(report_data)

๐Ÿ“ Agent Markdown ๅฎšไน‰

ๆ”ฏๆŒไฝฟ็”จ Markdown ๅฎšไน‰ Agent๏ผš

from auto_agent import AgentMarkdownParser, OpenAIClient

agent_md = """
## ๆ–‡ๆกฃๅ†™ไฝœๆ™บ่ƒฝไฝ“

ไฝ ้œ€่ฆๆŒ‰ไปฅไธ‹ๆญฅ้ชคๅฎŒๆˆ็”จๆˆท็š„้œ€ๆฑ‚๏ผš

1. ่ฐƒ็”จ [analyze_input] ๅทฅๅ…ท๏ผŒๅˆ†ๆž็”จๆˆทๆ„ๅ›พ
2. ่ฐƒ็”จ [es_fulltext_search] ๅทฅๅ…ท๏ผŒๆฃ€็ดข็›ธๅ…ณๆ–‡ๆกฃ
3. ่ฐƒ็”จ [generate_outline] ๅทฅๅ…ท๏ผŒ็”Ÿๆˆๅคง็บฒ
4. ่ฐƒ็”จ [document_compose] ๅทฅๅ…ท๏ผŒๆ’ฐๅ†™ๆ–‡ๆกฃ

### ็›ฎๆ ‡
- ็†่งฃ็”จๆˆท็š„ๅ†™ไฝœ้œ€ๆฑ‚
- ็”Ÿๆˆ็ป“ๆž„ๆธ…ๆ™ฐ็š„ๆ–‡ๆกฃ

### ็บฆๆŸ
- ๆ–‡ๆกฃ้•ฟๅบฆไธ่ถ…่ฟ‡5000ๅญ—
"""

llm = OpenAIClient(api_key="sk-xxx")
parser = AgentMarkdownParser(llm_client=llm)
result = await parser.parse(agent_md)

if result["success"]:
    agent_def = result["agent"]
    print(f"Agent: {agent_def.name}")
    print(f"Goals: {agent_def.goals}")
    print(f"Steps: {[s.tool for s in agent_def.initial_plan]}")

๐Ÿ—๏ธ ๆžถๆž„่ฎพ่ฎก

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                      User Input                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                           โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    IntentRouter                             โ”‚
โ”‚         ่ฏ†ๅˆซๆ„ๅ›พ๏ผŒ้€‰ๆ‹ฉ Agent/Handler                         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                           โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    TaskPlanner                              โ”‚
โ”‚         ่ง„ๅˆ’ๆ‰ง่กŒๆญฅ้ชค๏ผŒ็ผ–ๆŽ’ๅทฅๅ…ท้“พ                              โ”‚
โ”‚                  โ†‘ ่ฎฐๅฟ†ๆณจๅ…ฅ (MemoryRouter)                   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                           โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                  Execution Engine                           โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”‚
โ”‚ โ”‚ Tool        โ”‚ โ”‚ Smart Retry      โ”‚ โ”‚ Result       โ”‚      โ”‚
โ”‚ โ”‚ Registry    โ”‚โ†’โ”‚ Controller       โ”‚โ†’โ”‚ Compressor   โ”‚      โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ + LLM ้”™่ฏฏๅˆ†ๆž   โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ”‚
โ”‚                 โ”‚ + ๅ‚ๆ•ฐ่‡ชๅŠจไฟฎๆญฃ   โ”‚                        โ”‚
โ”‚                 โ”‚ + ๅŠจๆ€้‡่ง„ๅˆ’     โ”‚                        โ”‚
โ”‚                 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                           โ”‚ ็ญ–็•ฅๅญฆไน 
                           โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    Memory System (L1/L2/L3)                 โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”‚
โ”‚ โ”‚ L1 Working    โ”‚ โ”‚ L2 Semantic   โ”‚ โ”‚ L3 Narrative  โ”‚      โ”‚
โ”‚ โ”‚ (ไปปๅŠกไธŠไธ‹ๆ–‡)  โ”‚ โ”‚ (้•ฟๆœŸ่ฎฐๅฟ†)    โ”‚ โ”‚ (ๅ™ไบ‹ๆ€ป็ป“)    โ”‚      โ”‚
โ”‚ โ”‚               โ”‚ โ”‚ + ้”™่ฏฏๆขๅค็ญ–็•ฅโ”‚ โ”‚               โ”‚      โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿ—๏ธ ้กน็›ฎๆžถๆž„

๐Ÿ“‚ ๆ ธๅฟƒๆจกๅ—

auto_agent/
โ”œโ”€โ”€ core/                    # ๐Ÿง  ๆ ธๅฟƒๆ™บ่ƒฝไฝ“ๅŠŸ่ƒฝ
โ”‚   โ”œโ”€โ”€ agent.py            # AutoAgent ไธป็ฑป - ๆ™บ่ƒฝไฝ“ๆ ธๅฟƒ
โ”‚   โ”œโ”€โ”€ planner.py          # TaskPlanner - ไปปๅŠก่ง„ๅˆ’ๅ™จ
โ”‚   โ”œโ”€โ”€ executor.py         # ๆ‰ง่กŒๅผ•ๆ“Ž
โ”‚   โ”œโ”€โ”€ context.py          # ๆ‰ง่กŒไธŠไธ‹ๆ–‡็ฎก็†
โ”‚   โ”œโ”€โ”€ editor/             # Agent Markdown ่งฃๆžๅ™จ
โ”‚   โ”œโ”€โ”€ report/             # ๆ‰ง่กŒๆŠฅๅ‘Š็”Ÿๆˆๅ™จ
โ”‚   โ””โ”€โ”€ router/             # IntentRouter - ๆ„ๅ›พ่ทฏ็”ฑๅ™จ
โ”œโ”€โ”€ llm/                    # ๐Ÿค– ๅคง่ฏญ่จ€ๆจกๅž‹ๆ”ฏๆŒ
โ”‚   โ”œโ”€โ”€ client.py           # LLM ๅฎขๆˆท็ซฏๆŠฝ่ฑกๅŸบ็ฑป
โ”‚   โ”œโ”€โ”€ providers/          # ๆจกๅž‹ๆไพ›ๅ•†
โ”‚   โ”‚   โ”œโ”€โ”€ openai.py       # OpenAI GPT ็ณปๅˆ—
โ”‚   โ”‚   โ”œโ”€โ”€ anthropic.py    # Claude ็ณปๅˆ—
โ”‚   โ”‚   โ””โ”€โ”€ deepseek.py     # DeepSeek ๆจกๅž‹
โ”œโ”€โ”€ memory/                 # ๐Ÿง  ไธ‰ๅฑ‚่ฎฐๅฟ†็ณป็ปŸ
โ”‚   โ”œโ”€โ”€ system.py           # ็ปŸไธ€่ฎฐๅฟ†็ณป็ปŸ (L1/L2/L3)
โ”‚   โ”œโ”€โ”€ working.py          # L1 ็Ÿญๆ—ถ่ฎฐๅฟ†
โ”‚   โ”œโ”€โ”€ semantic.py         # L2 ้•ฟๆœŸ่ฏญไน‰่ฎฐๅฟ†
โ”‚   โ”œโ”€โ”€ narrative.py        # L3 ๅ™ไบ‹่ฎฐๅฟ†
โ”‚   โ”œโ”€โ”€ router.py           # ่ฎฐๅฟ†่ทฏ็”ฑๅ™จ
โ”‚   โ”œโ”€โ”€ manager.py          # ่ฎฐๅฟ†็ฎก็†ๅ™จ
โ”‚   โ”œโ”€โ”€ models.py           # ่ฎฐๅฟ†ๆ•ฐๆฎๆจกๅž‹
โ”‚   โ””โ”€โ”€ storage/            # ๅญ˜ๅ‚จๅŽ็ซฏ
โ”‚       โ”œโ”€โ”€ sqlite.py       # SQLite ๅญ˜ๅ‚จ
โ”‚       โ”œโ”€โ”€ redis.py        # Redis ็ผ“ๅญ˜
โ”‚       โ””โ”€โ”€ markdown.py     # Markdown ๆ–‡ไปถๅญ˜ๅ‚จ
โ”œโ”€โ”€ tools/                  # ๐Ÿ”ง ๅทฅๅ…ท็”Ÿๆ€็ณป็ปŸ
โ”‚   โ”œโ”€โ”€ base.py             # ๅทฅๅ…ทๅŸบ็ฑป
โ”‚   โ”œโ”€โ”€ registry.py         # ๅทฅๅ…ทๆณจๅ†Œ่กจ
โ”‚   โ”œโ”€โ”€ models.py           # ๅทฅๅ…ทๆ•ฐๆฎๆจกๅž‹
โ”‚   โ””โ”€โ”€ builtin/            # ๅ†…็ฝฎๅทฅๅ…ท
โ”‚       โ”œโ”€โ”€ calculator.py   # ่ฎก็ฎ—ๅ™จๅทฅๅ…ท
โ”‚       โ”œโ”€โ”€ code_executor.py # ไปฃ็ ๆ‰ง่กŒๅ™จ
โ”‚       โ””โ”€โ”€ web_search.py   # ็ฝ‘็ปœๆœ็ดขๅทฅๅ…ท
โ”œโ”€โ”€ retry/                  # ๐Ÿ”„ ๆ™บ่ƒฝ้‡่ฏ•ๆœบๅˆถ
โ”‚   โ”œโ”€โ”€ controller.py       # ้‡่ฏ•ๆŽงๅˆถๅ™จ
โ”‚   โ”œโ”€โ”€ models.py           # ้‡่ฏ•้…็ฝฎๆจกๅž‹
โ”‚   โ””โ”€โ”€ strategies.py       # ้‡่ฏ•็ญ–็•ฅ
โ”œโ”€โ”€ tracing/                # ๐Ÿ“Š ๆ‰ง่กŒ่ฟฝ่ธช
โ”‚   โ”œโ”€โ”€ context.py          # ่ฟฝ่ธชไธŠไธ‹ๆ–‡
โ”‚   โ””โ”€โ”€ models.py           # ่ฟฝ่ธชๆ•ฐๆฎๆจกๅž‹
โ””โ”€โ”€ utils/                  # ๐Ÿ› ๏ธ ๅทฅๅ…ทๅ‡ฝๆ•ฐ
    โ”œโ”€โ”€ logger.py           # ๆ—ฅๅฟ—ๅทฅๅ…ท
    โ”œโ”€โ”€ serialization.py    # ๅบๅˆ—ๅŒ–ๅทฅๅ…ท
    โ””โ”€โ”€ validators.py       # ๆ•ฐๆฎ้ชŒ่ฏๅ™จ

๐Ÿ“š ็คบไพ‹ไธŽๆ–‡ๆกฃ

examples/                   # ๐Ÿ’ก ไฝฟ็”จ็คบไพ‹
โ”œโ”€โ”€ deep_research_demo.py   # ๆทฑๅบฆ็ ”็ฉถๆ™บ่ƒฝไฝ“
โ”œโ”€โ”€ workflow_demo.py        # ๅทฅไฝœๆตๆผ”็คบ๏ผˆMarkdown โ†’ ๆ‰ง่กŒ โ†’ ๆŠฅๅ‘Š๏ผ‰
โ”œโ”€โ”€ memory_demo.py          # ่ฎฐๅฟ†็ณป็ปŸๆผ”็คบ
โ”œโ”€โ”€ custom_tool.py          # ่‡ชๅฎšไน‰ๅทฅๅ…ท็คบไพ‹
โ””โ”€โ”€ output/                 # ็คบไพ‹่พ“ๅ‡บ๏ผˆMarkdown/HTML ๆŠฅๅ‘Š๏ผ‰

docs/                       # ๐Ÿ“– ้กน็›ฎๆ–‡ๆกฃ
โ”œโ”€โ”€ MEMORY.md              # ่ฎฐๅฟ†็ณป็ปŸ่ฎพ่ฎก่ฏฆ่งฃ
โ”œโ”€โ”€ TOOLS.md               # ๅทฅๅ…ทๅผ€ๅ‘ๆŒ‡ๅ—
โ”œโ”€โ”€ OPTIMIZE.md            # ๆ€ง่ƒฝไผ˜ๅŒ–ๅปบ่ฎฎ
โ””โ”€โ”€ MIGRATION_GUIDE.md     # ็‰ˆๆœฌ่ฟ็งปๆŒ‡ๅ—

tests/                      # ๐Ÿงช ๆต‹่ฏ•ๅฅ—ไปถ
โ”œโ”€โ”€ test_memory_system.py  # ่ฎฐๅฟ†็ณป็ปŸๆต‹่ฏ•
โ”œโ”€โ”€ test_router.py         # ่ทฏ็”ฑๅ™จๆต‹่ฏ•
โ””โ”€โ”€ test_integration.py    # ้›†ๆˆๆต‹่ฏ•

๐Ÿงช ๆต‹่ฏ•

# ่ฟ่กŒๆ‰€ๆœ‰ๆต‹่ฏ•
pytest tests/ -v

# ่ฟ่กŒ็‰นๅฎšๆต‹่ฏ•
pytest tests/test_memory.py -v

# ๆŸฅ็œ‹่ฆ†็›–็އ
pytest tests/ --cov=auto_agent --cov-report=html

๐Ÿ’ก ๆ็คบ๏ผš่ฏทไปฅไฝ ๆœฌๅœฐ/CI ๅฎž้™…่ฟ่กŒ็š„ pytest ็ป“ๆžœไธบๅ‡†๏ผˆ้ฟๅ… README ไธญ็š„ๅ›บๅฎšๆ•ฐๅญ—่ฟ‡ๆœŸ๏ผ‰ใ€‚

๐Ÿ“ฆ API ๅ‚่€ƒ

ๆ ธๅฟƒ็ฑป

็ฑปๅ ๆ่ฟฐ
AutoAgent ๆ™บ่ƒฝไฝ“ไธป็ฑป
OpenAIClient OpenAI/DeepSeek LLM ๅฎขๆˆท็ซฏ
ToolRegistry ๅทฅๅ…ทๆณจๅ†Œ่กจ
BaseTool ๅทฅๅ…ทๅŸบ็ฑป
IntentRouter ๆ„ๅ›พ่ทฏ็”ฑๅ™จ
TaskPlanner ไปปๅŠก่ง„ๅˆ’ๅ™จ
MemorySystem ็ปŸไธ€่ฎฐๅฟ†็ณป็ปŸ (L1/L2/L3)
WorkingMemory L1 ็Ÿญๆ—ถ่ฎฐๅฟ†
SemanticMemory L2 ้•ฟๆœŸ่ฏญไน‰่ฎฐๅฟ†
NarrativeMemoryManager L3 ๅ™ไบ‹่ฎฐๅฟ†
MemoryRouter ่ฎฐๅฟ†่ทฏ็”ฑๅ™จ
RetryController ๆ™บ่ƒฝ้‡่ฏ•ๆŽงๅˆถๅ™จ
ExecutionReportGenerator ๆ‰ง่กŒๆŠฅๅ‘Š็”Ÿๆˆๅ™จ
AgentMarkdownParser Agent Markdown ่งฃๆžๅ™จ

่ฃ…้ฅฐๅ™จ

่ฃ…้ฅฐๅ™จ ๆ่ฟฐ
@func_tool ๅ‡ฝๆ•ฐๅทฅๅ…ท่ฃ…้ฅฐๅ™จ๏ผˆๆœ€็ฎ€ๆด๏ผ‰
@tool ็ฑปๅทฅๅ…ท่ฃ…้ฅฐๅ™จ๏ผˆๆ”ฏๆŒ้ชŒ่ฏ/ๅŽ‹็ผฉ๏ผ‰

ๆ•ฐๆฎๆจกๅž‹

ๆจกๅž‹ ๆ่ฟฐ
ToolDefinition ๅทฅๅ…ทๅฎšไน‰ (ๅซ้”™่ฏฏๆขๅค้…็ฝฎ)
ToolParameter ๅทฅๅ…ทๅ‚ๆ•ฐ
ErrorRecoveryStrategy ้”™่ฏฏๆขๅค็ญ–็•ฅ้…็ฝฎ
ParameterValidator ๅ‚ๆ•ฐ้ชŒ่ฏๅ™จ
ExecutionPlan ๆ‰ง่กŒ่ฎกๅˆ’
PlanStep ่ฎกๅˆ’ๆญฅ้ชค
SubTaskResult ๅญไปปๅŠก็ป“ๆžœ
Session ไผš่ฏ
MemoryItem ่ฎฐๅฟ†ๆก็›ฎ
MemoryCategory ่ฎฐๅฟ†ๅˆ†็ฑปๆžšไธพ
SemanticMemoryItem L2 ่ฏญไน‰่ฎฐๅฟ†ๆก็›ฎ
UserFeedback ็”จๆˆทๅ้ฆˆ
QueryIntent ๆŸฅ่ฏขๆ„ๅ›พๆžšไธพ
ErrorType ้”™่ฏฏ็ฑปๅž‹ๆžšไธพ
ErrorAnalysis LLM ้”™่ฏฏๅˆ†ๆž็ป“ๆžœ
ErrorRecoveryRecord ้”™่ฏฏๆขๅค่ฎฐๅฝ•

๐ŸŒ ็คพๅŒบไธŽๆ”ฏๆŒ

๐Ÿค ่ดก็ŒฎๆŒ‡ๅ—

ๆˆ‘ไปฌๆฌข่ฟŽๅ„็งๅฝขๅผ็š„่ดก็Œฎ๏ผๆ— ่ฎบๆ˜ฏไปฃ็ ใ€ๆ–‡ๆกฃใ€ๆต‹่ฏ•๏ผŒ่ฟ˜ๆ˜ฏ้—ฎ้ข˜ๅ้ฆˆๅ’ŒๅŠŸ่ƒฝๅปบ่ฎฎใ€‚

ๅผ€ๅ‘่ดก็Œฎ

  1. Fork ้กน็›ฎไป“ๅบ“
  2. ๅˆ›ๅปบๅŠŸ่ƒฝๅˆ†ๆ”ฏ
    git checkout -b feature/amazing-feature
    # ๆˆ–ไฟฎๅคbug
    git checkout -b fix/bug-description
  3. ๆไบคๆ›ดๆ”น
    git commit -m "feat: add amazing new feature"
    # ้ตๅพช Conventional Commits ่ง„่Œƒ
  4. ๆŽจ้€ๅนถๅˆ›ๅปบ PR
    git push origin feature/amazing-feature
    # ๅœจ GitHub ไธŠๅˆ›ๅปบ Pull Request

ๅผ€ๅ‘็Žฏๅขƒ่ฎพ็ฝฎ

# 1. ๅ…‹้š†ไป“ๅบ“
git clone https://github.com/AI-change-the-world/auto_agent.git
cd auto_agent

# 2. ๅฎ‰่ฃ…ๅผ€ๅ‘ไพ่ต–
pip install -e ".[dev,storage,llm]"

# 3. ่ฟ่กŒๆต‹่ฏ•
pytest tests/ -v

# 4. ไปฃ็ ๆ ผๅผๅŒ–
black auto_agent/
ruff auto_agent/ --fix

่ดก็Œฎ็ฑปๅž‹

  • ๐Ÿ› Bug ไฟฎๅค๏ผšไฟฎๅค็Žฐๆœ‰้—ฎ้ข˜
  • โœจ ๆ–ฐๅŠŸ่ƒฝ๏ผšๆทปๅŠ ๆ–ฐ็‰นๆ€ง
  • ๐Ÿ“š ๆ–‡ๆกฃ๏ผšๆ”น่ฟ›ๆ–‡ๆกฃๅ’Œ็คบไพ‹
  • ๐Ÿงช ๆต‹่ฏ•๏ผšๆทปๅŠ ๆˆ–ๆ”น่ฟ›ๆต‹่ฏ•
  • ๐Ÿ”ง ๅทฅๅ…ท๏ผšๅผ€ๅ‘ๆ–ฐๅทฅๅ…ทๆˆ–ๆ”น่ฟ›็Žฐๆœ‰ๅทฅๅ…ท
  • ๐ŸŽจ ้‡ๆž„๏ผšไปฃ็ ็ป“ๆž„ไผ˜ๅŒ–

๐Ÿ“ž ่Žทๅ–ๅธฎๅŠฉ

  • ๐Ÿ“– ๆ–‡ๆกฃไธญๅฟƒ - ่ฏฆ็ป†ไฝฟ็”จๆŒ‡ๅ—ๅ’ŒๆŠ€ๆœฏๆ–‡ๆกฃ
  • ๐Ÿ’ฌ Issues - ๆŠฅๅ‘Š้—ฎ้ข˜ๆˆ–ๆๅ‡บๅปบ่ฎฎ
  • ๐Ÿ’ก Discussions - ่ฎจ่ฎบๅŠŸ่ƒฝๅ’Œๆœ€ไฝณๅฎž่ทต
  • ๐Ÿ“ง ้‚ฎ็ฎฑ - guchengxi1994@qq.com

๐Ÿ™ ่‡ด่ฐข

ๆ„Ÿ่ฐขๆ‰€ๆœ‰่ดก็Œฎ่€…็š„ๆ”ฏๆŒ๏ผ็‰นๅˆซๆ„Ÿ่ฐข๏ผš

  • DocHive ้กน็›ฎ๏ผŒไธบ Auto-Agent ็š„ๆ ธๅฟƒๆ€ๆƒณๆไพ›ไบ†้ชŒ่ฏ
  • ๅผ€ๆบ็คพๅŒบ๏ผŒๆไพ›ไบ†ไผ˜็ง€็š„ๅทฅๅ…ทๅ’Œ็ตๆ„Ÿ
  • ๆ—ฉๆœŸ็”จๆˆท๏ผŒ้€š่ฟ‡ๅ้ฆˆๅธฎๅŠฉๆˆ‘ไปฌๆ”น่ฟ›ไบงๅ“

๐Ÿ“„ ่ฎธๅฏ่ฏ

MIT License - ่‡ช็”ฑไฝฟ็”จ๏ผŒไฟ็•™็ฝฒๅ

ๅฎŒๆ•ด่ฎธๅฏ่ฏๆ–‡ๆœฌ่ฏทๆŸฅ็œ‹ LICENSE ๆ–‡ไปถใ€‚


๐Ÿš€ ไฝฟ็”จ Auto-Agent ๆž„ๅปบไธ‹ไธ€ไปฃๆ™บ่ƒฝๅบ”็”จ๏ผ

Star History Chart

ๅฆ‚ๆžœ่ฟ™ไธช้กน็›ฎๅฏนไฝ ๆœ‰ๅธฎๅŠฉ๏ผŒ่ฏท็ป™ๆˆ‘ไปฌไธ€ไธช โญ Star๏ผ

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages