Spaces:
Running
Running
metadata
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
# Clone the repository
git clone git@github.com:huggingface/hf_agent.git
cd hf_agent
Install recommended dependencies
uv sync --extra agent # or uv sync --extra all
Interactive CLI
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
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 inputassistant_message- LLM response texttool_call- Tool being called with argumentstool_output- Tool execution resultapproval_request- Requesting user approval for sensitive operationsturn_complete- Agent finished processingerror- Error occurred during processinginterrupted- Agent was interruptedcompacted- Context was compactedundo_complete- Undo operation completedshutdown- Agent shutting down
Development
Adding Built-in Tools
Edit agent/core/tools.py:
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:
{
"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.