| --- |
| title: HF Agent |
| emoji: π€ |
| colorFrom: blue |
| colorTo: purple |
| sdk: docker |
| app_port: 7860 |
| hf_oauth: true |
| hf_oauth_scopes: |
| - read-repos |
| - write-repos |
| - contribute-repos |
| - manage-repos |
| - inference-api |
| - jobs |
| - write-discussions |
| --- |
| |
| # HF Agent |
|
|
| An MLE agent CLI with MCP (Model Context Protocol) integration and built-in tool support. |
|
|
|
|
| ## Quick Start |
|
|
| ### Installation |
|
|
| ```bash |
| # Clone the repository |
| git clone git@github.com:huggingface/hf_agent.git |
| cd hf_agent |
| ``` |
|
|
| #### Install recommended dependencies |
| ```bash |
| uv sync --extra agent # or uv sync --extra all |
| ``` |
|
|
| ### Interactive CLI |
|
|
| ```bash |
| uv run python -m agent.main |
| ``` |
| This starts an interactive chat session with the agent. Type your messages and the agent will respond, using tools as needed. |
|
|
| The agent will automatically discover and register all tools from configured MCP servers. |
|
|
|
|
| ### Env Setup |
| ```bash |
| ANTHROPIC_API_KEY=<one-key-to-rule-them-all> |
| HF_TOKEN=<hf-token-to-access-the-hub> |
| GITHUB_TOKEN=<gh-pat-key-for-not-reinventing-the-wheel> |
| HF_NAMESPACE=<hf-namespace-to-use> |
| ``` |
|
|
| ## Architecture |
|
|
| ### Component Overview |
|
|
| ``` |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ |
| β User/CLI β |
| ββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββ¬ββββββββββββ |
| β User request β Events |
| β β |
| submission_queue event_queue |
| β β |
| β β |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β |
| β submission_loop (agent_loop.py) β β |
| β ββββββββββββββββββββββββββββββββββββββββββββββββ β β |
| β β 1. Receive Operation from queue β β β |
| β β 2. Route to Handler (run_agent/compact/...) β β β |
| β ββββββββββββββββββββββββββββββββββββββββββββββββ β β |
| β β β β |
| β ββββββββββββββββββββββββββββββββββββββββββββββββ β β |
| β β Handlers.run_agent() β βββββββββββ€ |
| β β β β Emit β |
| β β ββββββββββββββββββββββββββββββββββββββββββ β β Events β |
| β β β Agentic Loop (max 10 iterations) β β β β |
| β β β β β β β |
| β β β ββββββββββββββββββββββββββββββββββββ β β β β |
| β β β β Session β β β β β |
| β β β β ββββββββββββββββββββββββββββββ β β β β β |
| β β β β β ContextManager β β β β β β |
| β β β β β β’ Message history β β β β β β |
| β β β β β (litellm.Message[]) β β β β β β |
| β β β β β β’ Auto-compaction (180k) β β β β β β |
| β β β β ββββββββββββββββββββββββββββββ β β β β β |
| β β β β β β β β β |
| β β β β ββββββββββββββββββββββββββββββ β β β β β |
| β β β β β ToolRouter β β β β β β |
| β β β β β ββ explore_hf_docs β β β β β β |
| β β β β β ββ fetch_hf_docs β β β β β β |
| β β β β β ββ find_hf_api β β β β β β |
| β β β β β ββ plan_tool β β β β β β |
| β β β β β ββ hf_jobs* β β β β β β |
| β β β β β ββ hf_private_repos* β β β β β β |
| β β β β β ββ github_* (3 tools) β β β β β β |
| β β β β β ββ MCP tools (e.g., β β β β β β |
| β β β β β model_search, etc.) β β β β β β |
| β β β β ββββββββββββββββββββββββββββββ β β β β β |
| β β β ββββββββββββββββββββββββββββββββββββ β β β β |
| β β β β β β β |
| β β β Loop: β β β β |
| β β β 1. LLM call (litellm.acompletion) β β β β |
| β β β β β β β β |
| β β β 2. Parse tool_calls[] β β β β |
| β β β β β β β β |
| β β β 3. Execute via ToolRouter β β β β |
| β β β β β β β β |
| β β β 4. Add results to ContextManager β β β β |
| β β β β β β β β |
| β β β 5. Repeat if tool_calls exist β β β β |
| β β ββββββββββββββββββββββββββββββββββββββββββ β β β |
| β ββββββββββββββββββββββββββββββββββββββββββββββββ β β |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄ββββββββββ |
| ``` |
|
|
| ### Agentic Loop Flow |
|
|
| ``` |
| User Message |
| β |
| [Add to ContextManager] |
| β |
| βββββββββββββββββββββββββββββββββββββββββ |
| β Iteration Loop (max 10) β |
| β β |
| β Get messages + tool specs β |
| β β β |
| β litellm.acompletion() β |
| β β β |
| β Has tool_calls? ββNoββ> Done β |
| β β β |
| β Yes β |
| β β β |
| β Add assistant msg (with tool_calls) β |
| β β β |
| β For each tool_call: β |
| β β’ ToolRouter.execute_tool() β |
| β β’ Add result to ContextManager β |
| β β β |
| β Continue loop ββββββββββββββββββ β |
| β β β β |
| βββββββββββ§ββββββββββββββββββββββββ§ββββββ |
| ``` |
|
|
| ## Project Structure |
|
|
| ``` |
| agent/ |
| βββ config.py # Configuration models |
| βββ main.py # Interactive CLI entry point |
| βββ prompts/ |
| β βββ system_prompt.yaml # Agent behavior and personality |
| βββ context_manager/ |
| β βββ manager.py # Message history & auto-compaction |
| βββ core/ |
| βββ agent_loop.py # Main agent loop and handlers |
| βββ session.py # Session management |
| βββ mcp_client.py # MCP SDK integration |
| βββ tools.py # ToolRouter and built-in tools |
| |
| configs/ |
| βββ main_agent_config.json # Model and MCP server configuration |
| |
| tests/ # Integration and unit tests |
| eval/ # Evaluation suite (see eval/README.md) |
| ``` |
|
|
|
|
| ## Events |
|
|
| The agent emits the following events via `event_queue`: |
|
|
| - `processing` - Starting to process user input |
| - `assistant_message` - LLM response text |
| - `tool_call` - Tool being called with arguments |
| - `tool_output` - Tool execution result |
| - `approval_request` - Requesting user approval for sensitive operations |
| - `turn_complete` - Agent finished processing |
| - `error` - Error occurred during processing |
| - `interrupted` - Agent was interrupted |
| - `compacted` - Context was compacted |
| - `undo_complete` - Undo operation completed |
| - `shutdown` - Agent shutting down |
|
|
| ## Development |
|
|
| ### Adding Built-in Tools |
|
|
| Edit `agent/core/tools.py`: |
|
|
| ```python |
| def create_builtin_tools() -> list[ToolSpec]: |
| return [ |
| ToolSpec( |
| name="your_tool", |
| description="What your tool does", |
| parameters={ |
| "type": "object", |
| "properties": { |
| "param": {"type": "string", "description": "Parameter description"} |
| }, |
| "required": ["param"] |
| }, |
| handler=your_async_handler |
| ), |
| # ... existing tools |
| ] |
| ``` |
|
|
| ### Adding MCP Servers |
|
|
| Edit `configs/main_agent_config.json`: |
|
|
| ```json |
| { |
| "model_name": "anthropic/claude-sonnet-4-5-20250929", |
| "mcpServers": { |
| "your-server-name": { |
| "transport": "http", |
| "url": "https://example.com/mcp", |
| "headers": { |
| "Authorization": "Bearer ${YOUR_TOKEN}" |
| } |
| } |
| } |
| } |
| ``` |
|
|
| Note: Environment variables like `${YOUR_TOKEN}` are auto-substituted from `.env`. |
|
|