Agent 的部署流程:从本地启动到服务化
Agent çé¨ç½²æµç¨ï¼ä»æ¬å°å¯å¨å°æå¡å
ä»ç祥 2026-08-19 0 é 读10åéecho-agent å身为 2025 å¹´ 11 æå¯å¨ç个人å©çé¡¹ç® fubotï¼æåé¢åé¿æéªä¼´å个人æºè½ä½ï¼å´ç»è®¤ç¥è®°å¿ãä¸ä¸æå»¶ç»ãç¨æ·åå¥½æ²æ·ãä»»å¡éç¯ä¸æç»èªæä¼åå±å¼ãéççå®åºæ¯è¿ä»£ï¼é¡¹ç®éæ¥å½¢æå¤å ¥å£æ¥å ¥ãç»ä¸äºä»¶æ¨¡åãæ¶æ¯æ»çº¿ãAgent Loopã夿¨¡åæ½è±¡ãå·¥å ·è°ç¨ãMCP æ¥å ¥ãä»»å¡è°åº¦ãæé审æ¹ãè¿è¡è½¨è¿¹ãé¿æè®°å¿ååæ§èªæ¼è¿çè½åãç®åå·²æ¯æå¾®ä¿¡ãQQãCLIãGatewayãWebhookãCron çå ¥å£ï¼æå¡ç¨æ·è¶ è¿ 20 ä¸ã累计ä¸è½½è¶ è¿ 50 ä¸ï¼æ¯é¢åé¿æè¿è¡ãè®°å¿å¢å¼ºåå¯æç»æé¿æºè½ä½ç弿º Agent Runtimeã
项ç®å°åï¼github.com/fuyuxiang/eâ¦
å¾å¤ Agent 项ç®å¨æ¬å°æ¼ç¤ºæ¶é½å¾é¡ºï¼ç»ç«¯éè·èµ·æ¥ï¼è¾å ¥ä¸å¥è¯ï¼æ¨¡åè½è°ç¨å·¥å ·ï¼ç»æä¹è½è¿åã
é®é¢é常åºç°å¨ä¸ä¸æ¥ï¼è¦æ¥å
¥ HTTPï¼è¦é¿æåå°è¿è¡ï¼è¦å¨ CI éè·è¯ä¼°ï¼è¦æ workspace æ¾å°æä¹
åç®å½ï¼è¦è®©ç³»ç»æ¶å° SIGTERM åå¹²åéåºã
è¿æ¶ä½ ä¼åç°ï¼é¨ç½² Agent 䏿¯å¤åå 个å¯å¨å½ä»¤ãå®çæ£è¦è§£å³çæ¯ï¼è¿å¥ç³»ç»å¨ä¸åè¿è¡ç¯å¢éï¼å¦ä½è¢«é ç½®ãè¢«è£ é ãè¢«åæ¢ãè¢«æ£æ¥ï¼å¹¶ä¸ç¥éèªå·±è½å½±åä»ä¹ã
æ¬ç¯åªè®²ä¸ä¸ªç¹ï¼Agent çé¨ç½²æµç¨ä¸æ¯âæè¿ç¨è·èµ·æ¥âï¼èæ¯ææ¬å°å¯ç¨ç Agent æ¾è¿ä¸ä¸ªå¯æ²»ççè¿è¡æ¨¡åã
é®é¢å ¥å£
æ®é Web æå¡çé¨ç½²è¾¹çç¸å¯¹æ¸ æ¥ï¼æ´é²ç«¯å£ï¼è¿æ¥æ°æ®åºï¼å è½½é ç½®ï¼å¤ç请æ±ï¼åæ¥å¿ã
Agent ä¸ä¸æ ·ãå®ä¸åªæ¯è¿åææ¬ï¼è¿å¯è½è¯»æä»¶ãæ§è¡å½ä»¤ãè°åº¦ä»»å¡ãè°ç¨ MCP serverãåå ¥é¿æè®°å¿ãè¿æ¥è天平å°ãéè¿ Gateway æ¥æ¶å¤é¨è¯·æ±ã
妿é¨ç½²åªå ³å¿âè¿ç¨è½ä¸è½å¯å¨âï¼é£é©ä¼è¢«åå°è¿è¡æ¶ææ´é²ï¼é ç½®ä»åªéæ¥ä¸æ¸ æ¥ï¼workspace æå°é误ç®å½ï¼åè¯è·é shell å½ä»¤æ³é²ï¼å ³éæ¶åå°ä»»å¡è¿å¨åæ°æ®åºï¼å ¬å ± Gateway æ´é²äºæ¬æ¥åªè¯¥æ¬å°ä½¿ç¨çå·¥å ·ã
ä¼è°ç¨å·¥å ·åªè¯´ææè¡å¨æ¥å£ï¼è½å¦æå¡åè¿è¡ï¼è¦çå¯å¨ãé ç½®ãç¶æãæéåå ³éæ¯å¦è¿å ¥åä¸å¥å·¥ç¨è¯ä¹ã
è¿è¡å ¥å£
为äºä¸åç卿½è±¡å±é¢ï¼ä¸é¢ä»¥ echo-agent çå®ç°ä¸ºä¾ã
echo-agent çå
¥å£ä½äº echo_agent/__main__.pyï¼èæ¬åæ¯ echo-agentãpyproject.toml ä¸å£°æï¼
[project.scripts]
echo-agent = "echo_agent.__main__:main"
å®è£
åå¯ä»¥ç´æ¥è¿è¡ echo-agentï¼æ²¡æåå½ä»¤æ¶ï¼é»è®¤çä»·äºå¯å¨ Agentã
å½å CLI æ¯æå ç±»åå½ä»¤ï¼
| åå½ä»¤ | ä½ç¨ | é¨ç½²è¯ä¹ |
|---|---|---|
run | å¯å¨å®æ´ Agent | æ¬å°æåå°ä¸»è¿è¡æ¨¡å¼ |
setup | 交äºå¼é ç½®å导 | 馿¬¡é ç½®ä¸å±é¨æ´æ° |
status | æ¥çé ç½®ç¶æ | é¨ç½²åå¥åº·æ£æ¥ |
gateway | åç¬å¯å¨ Gateway server | HTTP/WebSocket æå¡å ¥å£ |
eval | è¿è¡è¯ä¼°æ°æ®é | æ¬å°æ CI åå½ |
service | 管ç Linux systemd æå¡ | é¿æåå°è¿ç¨ |
è¿ä¸ªå¸å±çå
³é®ï¼ä¸æ¯âå½ä»¤å¤âï¼èæ¯è¦çäºä»ä¸ªäººæ¬å°ä½¿ç¨å°ç产æå¡åçè·¯å¾ï¼å
setupï¼å statusï¼æ¬å°ç¨ runï¼å¤é¨ç³»ç»æ¥å
¥ç¨ gatewayï¼è´¨éåå½ç¨ evalï¼é¿æè¿è¡äº¤ç» serviceã
é¡¶å±ä»ä¿ç -c/--config å -w/--workspaceãé¨ç½²èæ¬ãCI å systemd unit å¾å¾æ¯ä»£ç æ´é¾é¢ç¹è°æ´ï¼å
¥å£åæ°çå
¼å®¹æ§æ¬èº«å°±æ¯å·¥ç¨ææ¬ã
é ç½®ä¸å·¥ä½åº
Agent å¯å¨æ¶ï¼é ç½®ä¸è½åªæ¥èªä¸ä¸ª YAML æä»¶ãç产ç¯å¢éï¼é»è®¤é ç½®ã项ç®é ç½®ãç¯å¢åéå CLI åæ°ç»å¸¸åæ¶åå¨ã
echo-agent çé ç½®å è½½é¡ºåºæ¯ï¼
default.yaml
-> ç¨æ·é
ç½®æä»¶
-> ECHO_AGENT_ ç¯å¢åé
-> CLI overrides
-> Pydantic Config æ ¡éª
ç¨æ·é
ç½®æä»¶å¯ä»¥æ¯ echo-agent.yamlãecho-agent.ymlãconfig.yaml æ config.ymlãæ¥æ¾é¡ºåºæ¯æå®ç search_dir æå½åç®å½ï¼ç¶åæ¯ ~/.echo-agentã妿æ¾å¼ä¼ å
¥ config_pathï¼åç´æ¥ä½¿ç¨è¯¥è·¯å¾ã
ç¯å¢åé使ç¨åä¸å线表达åµå¥è·¯å¾ï¼ä¾å¦ ECHO_AGENT_MODELS__DEFAULT_MODEL å ECHO_AGENT_GATEWAY__PORTãåå¹¶éç¨ deep mergeï¼åµå¥ dict éå½åå¹¶ï¼æ®éå¼ç´æ¥è¦çãè¿æ ·ç产ç¯å¢åªéè¦è¦çå
³é®å段ï¼ä¸å¿
å¤å¶æ´ä»½é
ç½®ã
workspace æ¯å¦ä¸ä¸ªå®¹æåºéçç¹ãå®ä¸æ¯æ®é临æ¶ç®å½ï¼èæ¯ Agent çè¿è¡ç¶æè¾¹çãecho-agent é»è®¤ workspace æ¯ ~/.echo-agentï¼å¦ææ¯ç¸å¯¹è·¯å¾ï¼è§£æè§ååå³äºæ¥æºï¼
| æ¥æº | ç¸å¯¹è·¯å¾åºå |
|---|---|
| CLI æ¾å¼ä¼ å ¥ workspace | å½åå·¥ä½ç®å½ |
| é ç½®æä»¶ä¸å£°æ workspace | é ç½®æä»¶æå¨ç®å½ |
| 没æé ç½®æä»¶ | å½åå·¥ä½ç®å½ |
è§£æåç³»ç»ä¼å建ç®å½ãworkspace ä¸ä¼ä¿åæ°æ®åºãä¼è¯ãè®°å¿ãæè½ãè°åº¦ç¶æãåªä½ç¼åãæ¥å¿çè¿è¡æ°æ®ã
è¿ä¸ªè§å让项ç®å
ç echo-agent.yaml å¯ä»¥æ workspace 设置为 .ï¼è®© Agent æ°æ®çå¨é¡¹ç®å·¥ä½åºï¼å
¨å±ä¸ªäººä½¿ç¨åå¯ä»¥ç»§ç»è½å° ~/.echo-agentã
é ç½®åçâç³»ç»åºè¯¥æä¹è¿è¡âï¼workspace åçâç³»ç»è¿è¡åä¼æç¶æåå°åªéâã
ç»ä¸è£ é
é¨ç½²ææçæ¯ä¸åå
¥å£åèªæ¼ä¸å¥è¿è¡æ¶ãrun ä¸å¥é»è¾ï¼gateway ä¸å¥é»è¾ï¼eval åä¸å¥é»è¾ï¼æååä¸ä»½é
ç½®å¨ä¸å模å¼ä¸è¡¨ç°ä¸ä¸è´ã
echo-agent ç¨ _bootstrap() è§£å³è¿ä¸ªé®é¢ã宿¯ CLI åè¿è¡æ¨¡å¼å
±äº«çè£
é
彿°ï¼æä¾èµé¡ºåºå建 ConfigãWorkspaceãSQLiteBackendãMessageBusãModelRouterãLLM providersãSchedulerãTaskManagerãWorkflowEngineãAgentLoopãChannelManager å HealthCheckerã
æ ¸å¿æµç¨å¯ä»¥å缩æä¸é¢è¿æ®µä¼ªä»£ç ï¼
config = load_config(config_path, overrides)
workspace = resolve_workspace(config, config_path, cwd)
storage = SQLiteBackend(workspace)
bus = MessageBus(config)
router = ModelRouter(config)
providers = init_providers(config.models.providers, router)
â
agent = AgentLoop(
  bus=bus,
  config=config,
  provider=providers.default,
  workspace=workspace,
  router=router,
  scheduler=scheduler,
  storage=storage,
  task_manager=task_manager,
  workflow_engine=workflow,
)
channels = ChannelManager(config.channels, bus)
health = HealthChecker(bus, agent, storage)
Provider åå§å乿ä¸ä¸ªéè¦åèãç³»ç»ä¼éå config.models.providersï¼é个è°ç¨ create_provider()ï¼æååæ³¨åå° ModelRouterï¼ç¬¬ä¸ä¸ªæå provider ä½ä¸ºé»è®¤ providerã
妿æä¸ª provider å建失败ï¼ç³»ç»è®°å½ warningï¼ç»§ç»å°è¯å
¶ä» providerãå¦æææ provider é½å¤±è´¥ï¼æè
æ ¹æ¬æ²¡æé
ç½® providerï¼ç³»ç»å建 _StubProviderï¼è¿åæç¡®æç¤ºãè¿æ · CLI æ Gateway ä»è½å¯å¨ï¼ç¨æ·å¯ä»¥éè¿ status æé
ç½®å导çå°é®é¢ï¼è䏿¯åªå¾å°ä¸æ¬¡è¿ç¨å´©æºã
å¯å¨ä¸å ³é
echo-agent run ææ åå½ä»¤æ¶ä¼è¿å
¥ _run()ãå¯å¨é¡ºåºå¯ä»¥æ¦æ¬ä¸ºï¼
è§£æé
ç½®å workspace
-> bootstrap
-> å®è£
SIGINT / SIGTERM handler
-> å¯å¨ MessageBus
-> å¯å¨ AgentLoop
-> å¯å¨ enabled channels
-> å¯å¨ Scheduler
-> å¯å¨ HealthChecker
-> å¦å¯ç¨ Gatewayï¼å¯å¨ GatewayServer
-> çå¾
shutdown event
è¿éæä¸¤ä¸ªå ³é®ç¹ã
第ä¸ï¼MessageBus å¿ é¡»å å¯å¨ãchannelãscheduler å AgentLoop é½ä¾èµ bus åå¸åååäºä»¶ï¼å¦æ bus 没åå¤å¥½ï¼å¤é¨å ¥å£æåæ¥æ¶æ¶æ¯ï¼åªä¼å¶é 丢失ååå®æç¶æã
第äºï¼å¦ææ²¡ææ´»è·è¾å ¥ééä¸ Gateway æªå¯ç¨ï¼ç³»ç»ä¼éåºå¹¶æ¸ çãè¿è½é¿å ä¸ä¸ªçä¼¼å¯å¨æåãå®é 没æä»»ä½å ¥å£ç空è¿ç¨é¿ææçã
åæ¢é¡ºåºåè¿æ¥ï¼
Gateway
-> HealthChecker
-> Scheduler
-> Channels
-> AgentLoop
-> MessageBus
-> Storage
å å Gateway å channelsï¼é¿å æ°çå¤é¨è¯·æ±è¿å ¥ï¼åå scheduler å AgentLoopï¼é¿å åå°ä»»å¡ç»§ç»æ¨è¿ï¼æåå bus å storageï¼é¿å æ°æ®åºå å ³éå¯¼è´æ£å¨æ¶å°¾çä»»å¡åå ¥å¤±è´¥ã
æå¡å Agent çå ³é䏿¯æä¸åæ¢é®ï¼èæ¯æå¤é¨å ¥å£ãåå°ä»»å¡ãäºä»¶éååæä¹ åç¶æä¾æ¬¡æ¶æã
Gateway 模å¼ä¼å¼ºå¶å¯ç¨ ctx.config.gateway.enabled = Trueï¼å¹¶å
许éè¿ CLI è¦ç host å portãå®ä»ä¼å¯å¨ busãagent å channelsï¼åå建 GatewayServerãè¿è¯´æ Gateway 䏿¯å¦ä¸å¥ Agentï¼èæ¯å¨åä¸ä¸ªè¿è¡æ¶ä¸æå¼æå¡å
¥å£ã
eval 忝è¿è¡æ¶è£åªï¼å®è°ç¨ _bootstrap()ï¼å¯å¨ bus å agentï¼ä½ä¸å¯å¨è天 channelsï¼éåå建 EvalRunnerï¼ç¨ eval channel æé äºä»¶ï¼æ dataset å tag è¿è¡è¯ä¼°ï¼å¹¶å¯è¾åº JSON æ¥åã
æå¡å
echo-agent service é¢å Linux systemdï¼æ¯æ installãuninstallãstartãstopãrestartãstatus å logsãé Linux ä¼æç¤º systemd service management only supported on Linuxã
å®è£
æ¶ä¼çæ /etc/systemd/system/echo-agent.serviceï¼å
³é®çç¥å
æ¬ Type=simpleãRestart=on-failureãKillSignal=SIGTERMãTimeoutStopSec=30ï¼æ¥å¿åå
¥ journalãExecStart ä¼ä¼å
æ¥æ¾ PATH ä¸ç echo-agentï¼å
¶æ¬¡æ¥æ¾å½åèæç¯å¢éç bin/echo-agentï¼æåéå° python -m echo_agent runã
ç产é¨ç½²æ¶ï¼åºæç¡®åºåä¸ç±»å¯¹è±¡ï¼
| 对象 | 建议 |
|---|---|
| 代ç ç®å½ | å®è£ å æå®¹å¨éå |
| é ç½®æä»¶ | echo-agent.yamlï¼ç±é¨ç½²ç³»ç»ç®¡ç |
| Workspace | æä¹
åå·ï¼ä¾å¦ /var/lib/echo-agent æåºç¨ç®å½ä¸ data |
å¦æä½¿ç¨å®¹å¨é¨ç½²ï¼workspace åºæè½½ä¸º volumeãå¦å容å¨é建ä¼ä¸¢å¤± SQLite æ°æ®åºãä¼è¯ãè®°å¿ãæè½ãç¥è¯åºç´¢å¼ãè°åº¦ç¶æãGateway media cacheãæ¥å¿å tracesã
è¿ä¹æ¯æ¬å°ä¼å åæå¡åå¹¶ä¸çç¾çåå ãSQLiteãworkspaceãCLIãå¯éä¾èµãsetup wizard å StubProvider é级éä½äºæ¬å°å¦ä¹ ææ¬ï¼Gatewayãsystemd serviceãschedulerãhealth checkerãå¤ééå eval CLI å让系ç»å¯ä»¥éæ¥è¿å ¥é¿æè¿è¡ã
é¨ç½²è¾¹ç
Agent é¨ç½²ä¸æ®éè天æå¡æå¤§çåºå«ï¼æ¯å®ä¼æ¹åç°å®ç³»ç»ãæ®éææ¬å Chatbot ä¸»è¦æ´é²ææ¬è¾å ¥åææ¬è¾åºï¼Agent æå¡è¿å¯è½æ´é²æä»¶è®¿é®ãå½ä»¤æ§è¡ãä»»å¡è°åº¦ãå¤é¨æ¶æ¯åéãMCP å·¥å ·è°ç¨åé¿æè®°å¿ã
æä»¥é¨ç½²å®å ¨çæ ¸å¿é®é¢ä¸æ¯âæå¡çå¬å¨åªä¸ªç«¯å£âï¼èæ¯åä¸ªè¾¹çæ¯å¦æç¡®ã
| è¾¹ç | éè¦åççé®é¢ | 坿£æ¥é¡¹ |
|---|---|---|
| å ¥å£è¾¹ç | è°è½è®¿é® Agent | Gateway é´æãhostãéæµãééå¼å ³ |
| è¡å¨è¾¹ç | Agent è½å½±ååªäºç³»ç» | å·¥å ·å级ãexec 审æ¹ãMCP åè¯æå°å |
| ç¶æè¾¹ç | é¿ææ°æ®ä¿åå¨åªé | workspace æä¹ åãå¤ä»½ãç¼åä¸è®°å¿åºå |
| è§æµè¾¹ç | è¡ä¸ºå¦ä½è¢«è®°å½åå¤ç | traceãæ¥å¿æéãå·¥å ·è°ç¨ä¸å®¡æ¹å®¡è®¡ |
模å provider ä¹å±äºé¨ç½²è¾¹çãprovider å³å®æ¨çè½ååæ°æ®æµåï¼é ç½®ä¸æç¡®æ¶ï¼ç³»ç»å¯è½ä¸å¯ç¨ï¼ä¹å¯è½æææå 容åéå°ä¸ç¬¦å颿çå¤é¨æ¨¡åã
åè¯æ´ææã模å API keyãéé tokenãMCP OAuth tokenãæ°æ®åºå¯ç ãSSH keyãWebhook secret é½ä¸åºè¯¥åè¿ä»£ç ä»åºææ®éæ¥å¿ãç产ç¯å¢åºéè¿ secret managerãç¯å¢åéæ³¨å ¥æå å¯åå¨ç®¡çï¼å¹¶æ¯æè½®æ¢ã
ä¸ä¸ªç产å¯ç¨ç Agent è³å°åºæ»¡è¶³è¿äºåºçº¿ï¼Gateway å
¬å¼æ¶å¿
须鴿åéæµï¼å±é©å·¥å
·å¿
é¡»å审æ¹çº¦æï¼workspace å¿
é¡»æä¹
ååå¯å¤ä»½ï¼æ¥å¿ä¸ trace è½è§£éæ¯æ¬¡è¡å¨ä¾æ®ï¼provider ååè¯ç¶æè½éè¿ status æ£æ¥ï¼è¯ä¼°éè½å¨åå¸ååå½å
³é®è½ååå®å
¨è¾¹çã
å°ç»
Agent çé¨ç½²æµç¨ä¸æ¯ä» echo-agent run å° echo-agent service start çå½ä»¤è¿ç§»ï¼èæ¯ä»æ¬å°éå¼åè®¾å°æå¡åæ¾å¼è¾¹ççè¿ç§»ã
æ¬å° CLI 模å¼é»è®¤ç¨æ·å°±å¨ç»ç«¯åï¼å·¥ä½ç®å½åæä»¶è¾¹çç±ç¨æ·èªå·±çè§£ï¼å®¡æ¹å¯ä»¥å³æ¶åçãæå¡åä¹åï¼è¯·æ±å¯è½æ¥èªè¿ç¨å®¢æ·ç«¯ï¼ç¨æ·ä¸ä¸å®å¨çº¿ï¼workspace éè¦æä¹ åï¼ä¼è¯å¯è½å¹¶åï¼é误è¦è½¬æ API è¯ä¹ï¼å®¡æ¹å¯è½è·¨éé宿ã
echo-agent ç CLI ä¸é¨ç½²è®¾è®¡æä¾äºä¸æ¡æ¸è¿è·¯å¾ï¼ç¨ setup 宿馿¬¡é
ç½®ï¼ç¨ status æ£æ¥è¿è¡ç¶æï¼ç¨ç»ä¸ _bootstrap() è£
é
è¿è¡æ¶ï¼ç¨ run æ gateway å¯å¨æå¡å
¥å£ï¼ç¨ eval åè´¨éåå½ï¼ç¨ service æ¥å
¥ Linux systemdã
çæ£çå·¥ç¨å¤ææ¯ï¼é¨ç½²å®æåï¼ç³»ç»ä¸ä» è½è¿è¡ï¼è¿è½è§£éèªå·±å½åè½åä»ä¹ãä¸è½åä»ä¹ãç¶æå¨åªéã失败åå¦ä½æ¢å¤ãæ¯æ¬¡è¡å¨ä¸ºä»ä¹åçãåªæåå°è¿ä¸ç¹ï¼Agent æä¸æ¯ä¸ä¸ªä¸´æ¶æ¼ç¤ºè¿ç¨ï¼èæ¯å¯ä»¥é¿ææ¿æ ä»»å¡çæå¡ã
ï¼å ¨ç¯å®ï¼
æ¬æä¸º echo-agent 设计ç¬è®°ç³»å第 29 ç¯ãé¡¹ç®æºç 已弿ºè³ GitHubãå¦æä½ å¯¹å·¥ä¸çº§ Agent çå·¥ç¨è½å°æå ´è¶£ï¼æ¬¢è¿å å ¥ææ¯äº¤æµç¾¤ï¼QQ群å·ï¼47572014ï¼å䏿¥å¸¸è®¨è®ºãä¸ä¸ç¯æä»¬å°æ¢è®¨ ãAgent æµè¯çç¥ï¼è®©è½åå¯åå½ãï¼æ¬è¯·æå¾ ã
Aitishiku.com