- ð§ æºèœå¯¹è¯ â åºäº AgentScope æ¡æ¶ïŒæ¯æå€æš¡åé 眮ïŒProvider 管çïŒïŒæµåŒèŸåºïŒSSEïŒ
- ð± 倿ž éæ¥å ¥ â DingTalkïŒééïŒãé£ä¹ŠïŒFeishu/LarkïŒãiMessage åŒç®±å³çš
- ð€ SubAgent æ¯æ â å€è§è²åŒæ¥å代çïŒç¬ç« Session äžäžæïŒæ¯æç¬ç«æš¡åé 眮 + è¿è¡æ¶æœè±¡
- ð ïž å·¥å ·ç³»ç» â å 眮 12 äžªå·¥å ·ïŒæä»¶è¯»åãShellãæµè§åšãPython æ§è¡ãæèœ/宿¶ä»»å¡ CLI çïŒïŒTool Guard å®å šé²æ€ïŒå¯è§ååŒå ³ç®¡ç + è°çšæ¥å¿
- â° å®æ¶ä»»å¡ â æ å Cron 衚蟟åŒè°åºŠïŒèªåšæ§è¡ + ç»æéç¥ + CLI 管ç
- ð æèœæ©å± â ZIP/URL æ¹åŒå®è£ èªå®ä¹æèœå ïŒçæ¬ç®¡ç + çé蜜
- ð Dashboard â ç³»ç»ç»è®¡é¢æ¿ïŒæ±æ»äŒè¯/æ¶æ¯/Token/å·¥å ·/æèœ/ä»»å¡çææ
- ð éç¥ç³»ç» â WebSocket 宿¶éç¥æ»çº¿ïŒå šå±ç³»ç»äºä»¶æšé
- ð» CLI å·¥å · â åœä»€è¡ç®¡çå·¥å ·ïŒæ¯æè¿çšç®¡çãæ§å¶å°èŸåº
- ðŠ Task Artifacts â SubAgent 产åºç©ç®¡çïŒæ¯ææä»¶/ææ¬/代ç çç±»å
- ð åå端å犻 â React å端 + FastAPI åç«¯ïŒæäŸå¯è§å管ççé¢
- 𧪠æµè¯é©±åš â 672+ åå äžéææµè¯ïŒE2E èŠçæ žå¿æµçš
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â æ¶æ¯æž éå± â
â ââââââââââââ ââââââââââââ ââââââââââââ â
â â DingTalk â â Feishu â â iMessage â ... â
â ââââââ¬ââââââ ââââââ¬ââââââ ââââââ¬ââââââ â
âââââââââŒâââââââââââââââŒââââââââââââââŒââââââââââââââââââââââ
â â â
âââââââââŒâââââââââââââââŒââââââââââââââŒââââââââââââââââââââââ
â FastAPI Backend â
â ââââââââââââââââââââââââââââââââââââââââââ â
â â PersonalAssistant Agent â â
â â âââââââââââââââââââââââââââââââââââ â â
â â â SubAgent Pool (Async Tasks) â â â
â â â [researcher] [coder] [ops] ... â â â
â â âââââââââââââââââââââââââââââââââââ â â
â ââââââââââââââââââââââââââââââââââââââââââ â
â ââââââââââââââââ ââââââââââââââââ âââââââââââââââââ â
â â Provider Mgr â â Tool System â â Tool Guard â â
â ââââââââââââââââ ââââââââââââââââ âââââââââââââââââ â
â ââââââââââââââââ ââââââââââââââââ âââââââââââââââââ â
â â Session Mgr â â Cron Sched. â â Notification â â
â ââââââââââââââââ ââââââââââââââââ â Bus â â
â ââââââââââââââââ ââââââââââââââââ âââââââââââââââââ â
â â Runtime Mgr â â ZMQ Bus â â
â ââââââââââââââââ ââââââââââââââââ â
â SQLite (WAL) â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âââââââââŒâââââââââââââââââââââââââââââââââââââââââââââââââââ
â React Frontend (Dashboard) â
â Chat · Sessions · Tools · Skills · Tasks · Cron · â
â Workspace · Dashboard â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
- Python 3.10+
- Node.js 18+
- Docker & Docker ComposeïŒå¯éïŒ
# å
éä»åº
git clone https://github.com/robscc/nimo.git
cd nimo
# äžé®å¯åšåŒåç¯å¢
make dev
# æè
åå«å¯åš
make backend # å端 http://localhost:8088
make frontend # å端 http://localhost:3000# å€å¶å¹¶é
眮ç¯å¢åé
cp .env.example .env
# çŒèŸ .env å¡«åçžå
³é
眮
# å¯åšæææå¡
docker-compose up -dæ¯æå€ç§é
眮æ¹åŒïŒäŒå
级ä»é«å°äœïŒïŒç¯å¢åé > ~/.nimo/config.yaml > .env > é»è®€åŒ
æšèäœ¿çš ~/.nimo/config.yamlïŒ
llm:
provider: compatible # å
Œå®¹ OpenAI æ ŒåŒç API
model: qwen-plus
api_key: your_api_key
base_url: https://dashscope.aliyuncs.com/compatible-mode/v1
# å¯éïŒæ¶æ¯æž é
dingtalk:
app_key: ""
app_secret: ""
feishu:
app_id: ""
app_secret: ""
imessage:
enabled: false # ä»
macOSä¹å¯äœ¿çš .env æä»¶ïŒ
LLM_MODEL=qwen-plus
LLM_API_KEY=your_api_key| æž é | ææ¡£ | ç¶æ |
|---|---|---|
| DingTalk | docs/channels/dingtalk.md | â æ¯æ |
| é£ä¹Š Feishu | docs/channels/feishu.md | â æ¯æ |
| iMessage | docs/channels/imessage.md | â æ¯æïŒé macOSïŒ |
SubAgent æ¯ç¬ç«è¿è¡çåŒæ¥å代çïŒæ¥æç¬ç«äžäžæãç¬ç«æš¡åé çœ®ïŒæ¯æå€èœ®å·¥å ·è°çšå Agent éŽéä¿¡ã
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â PersonalAssistant (äž» Agent) â
â â
â dispatch_sub_agent(task, agent_name/task_type, context) â
â â â
â ⌠â
â âââââââââââââââââââ task_type ââââââââââââââââââââââ â
â â SubAgentRegistryâââââå¹é
âââââââââ SubAgentDefinition â â
â â (è§è²æ³šåäžå¿) â â · researcher â â
â ââââââââââ¬âââââââââ â · coder â â
â â â · ops-engineer â â
â ⌠â · èªå®ä¹è§è²... â â
â å建 SubAgentTask (PENDING) ââââââââââââââââââââââ â
â çæç¬ç« sub_session_id: "sub:<parent>:<task_id>" â
â â â
â ⌠(asyncio åå°ä»»å¡) â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â SubAgent å®äŸ â â
â â · ç¬ç« BufferMemoryïŒäžåœ±åäž»äžäžæïŒ â â
â â · ç¬ç«æš¡åé
眮ïŒå¯èŠçïŒæªé
眮åéå°äž» AgentïŒ â â
â â · ç¬ç« AsyncSessionïŒé¿å
DB éïŒ â â
â â â â
â â run() â reply() 埪ç¯: â â
â â ââââââââââââââââââââââââââââââââââââââââââââ â â
â â â 1. æ£æ¥ MessageBus åŸ
å€çæ¶æ¯ â â â
â â â 2. æå»ºæ¶æ¯å衚 (system + history + user) â â â
â â â 3. è°çš LLM â â â
â â â 4. è§£æå·¥å
·è°çš (OpenAI æ ŒåŒ) â â â
â â â 5. æ§è¡å·¥å
· â è®°åœæ¥å¿ â 远å å°å¯¹è¯ â â â
â â â 6. 埪ç¯çŽå°æ å·¥å
·è°çšæèŸŸå° max_tool_roundsâ â â
â â â 7. è¶
åºèœ®æ¬¡ â åŒºå¶æèŠ (force summary) â â â
â â ââââââââââââââââââââââââââââââââââââââââââââ â â
â â â â
â â 宿 â æŽæ° Task ç¶æ (DONE/FAILED) â â
â â â åå
¥ execution_log â â
â â â éè¿ MessageBus éç¥äž» Agent â â
â â â åé task_event_bus 宿¶äºä»¶ â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
SubAgent æ¯æäž€ç§è·¯ç±æ¹åŒïŒ
| æ¹åŒ | 诎æ | äŒå 级 |
|---|---|---|
agent_name |
çŽæ¥æå® SubAgent åç§°ïŒåŠ researcherïŒ |
ðŽ æé« |
task_type |
æä»»å¡ç±»åå¹é
SubAgent ç accepted_task_types å衚 |
ð¡ æ¬¡ä¹ |
# æ¹åŒ 1ïŒçŽæ¥æå® agent_name
task = await assistant.dispatch_sub_agent(
task="åææ¥åå¹¶çææèŠ",
agent_name="researcher",
context={"file": "report.pdf"},
session_id="user_session_123",
)
# æ¹åŒ 2ïŒæ task_type èªåšè·¯ç±
task = await assistant.dispatch_sub_agent(
task="åäžäžªæåºç®æ³",
task_type="coding",
session_id="user_session_123",
)
# æ¥è¯¢ä»»å¡ç¶æ
status = await assistant.get_task_status(task.id)æ¯äžª SubAgent å®äŸæ¥æå®å šé犻çè¿è¡ç¯å¢ïŒ
- ç¬ç« SessionïŒ
sub_session_id = "sub:<parent_session>:<task_id>"ïŒäžäžäž»å¯¹è¯æ··æ· - ç¬ç« MemoryïŒäœ¿çšç¬ç«ç
BufferMemoryïŒå€èœ®å·¥å ·å¯¹è¯äžæ±¡æäž»äžäžæ - ç¬ç« DB SessionïŒäœ¿çšç¬ç«ç
AsyncSessionLocalïŒé¿å äžè¯·æ±çº§ Session ç SQLite éå²çª
SubAgent å¯é 眮ç¬ç«çæš¡ååæ°ïŒæªé 眮çåæ®µèªåšåéå°äž» Agent çå šå±é 眮ïŒ
SubAgentDefinition.get_model_config(fallback=äž»Agenté
眮)
â model_name: SubAgentèªå®ä¹ ?? äž»Agentç model
â model_provider: SubAgentèªå®ä¹ ?? äž»Agentç provider
â api_key: SubAgentèªå®ä¹ ?? äž»Agentç api_key
â base_url: SubAgentèªå®ä¹ ?? äž»Agentç base_url
SubAgent çæ¯æ¬¡è¿è¡éœäŒè®°åœå®æŽç execution_logïŒå
å«ïŒ
system_promptâ ç³»ç»æç€ºè¯user_messageâ çšæ·/äž» Agent äžåçä»»å¡llm_responseâ æ¯èœ® LLM ååºtool_start/tool_doneâ å·¥å ·è°çšåŒå§/ç»æïŒå«èæ¶duration_msïŒforced_summaryâ è¶ åºå·¥å ·èœ®æ¬¡åçåŒºå¶æèŠfinal_resultâ æç»ç»æ
æ¥å¿éè¿ task_event_bus 宿¶æšéïŒäŸ SSE 订é
ïŒïŒå¹¶æä¹
åå° SubAgentTask.execution_log åæ®µã
éè¿ MessageBus å®ç°åŒæ¥æ¶æ¯äŒ éïŒ
| æ¶æ¯æš¡åŒ | 诎æ |
|---|---|
request |
åå ¶ä» Agent åé请æ±å¹¶çåŸ ååº |
response |
åå€åŠäžäžª Agent çè¯·æ± |
notify |
ååéç¥ïŒåŠä»»å¡å®æéç¥äž» AgentïŒ |
broadcast |
å¹¿ææ¶æ¯ç»ææçžå ³ Agent |
SubAgent åšæ¯èœ®å·¥å
·è°çšåæ£æ¥ MessageBus äžçåŸ
å€çæ¶æ¯ïŒå¹¶å°å
¶æ³šå
¥åœå对è¯äžäžæã
| è§è² | 诎æ | é»è®€ä»»å¡ç±»å |
|---|---|---|
researcher |
ç ç©¶äžä¿¡æ¯æ¶é | research, summarize, analyze, report, investigate, compare |
coder |
çŒç äžææ¯å®ç° | code, debug, script, implement, test, refactor, fix |
ops-engineer |
è¿ç»Žäžåºç¡è®Ÿæœ | ops, mysql, redis, kubernetes, k8s, logs, prometheus, monitoring, debug-infra, sre, devops |
æ¯æéè¿ APIïŒPOST /api/v1/sub-agentsïŒæå端èªå®ä¹æ·»å æ°è§è²ã
å
眮 12 䞪工å
·ïŒéè¿å端 /tools 页é¢å¯è§å管çïŒ
| å·¥å · | 诎æ | é»è®€ç¶æ |
|---|---|---|
get_current_time |
è·ååœåæ¶éŽ | â åŒå¯ |
read_file |
读åæä»¶å 容 | â åŒå¯ |
browser_use |
æµè§åšèªåšå | â åŒå¯ |
send_file_to_user |
åéæä»¶ç»çšæ· | â åŒå¯ |
skill_cli |
æèœç®¡ç CLI | â åŒå¯ |
cron_cli |
宿¶ä»»å¡ç®¡ç CLI | â åŒå¯ |
dispatch_sub_agent |
æŽŸé£ SubAgent | â åŒå¯ |
write_file |
åå ¥æä»¶ | â å ³é |
edit_file |
çŒèŸæä»¶ | â å ³é |
execute_shell_command |
æ§è¡ Shell åœä»€ | â å ³é |
execute_python_code |
æ§è¡ Python 代ç | â å ³é |
produce_artifact |
çæä»»å¡äº§åºç© | â å ³é |
æ¯æ Tool Guard å®å šé²æ€æºå¶ïŒå¯¹å±é©æäœè¿è¡æŠæªå确讀ã
äœ¿çšæ å 5 段 Cron 衚蟟åŒå建èªåšåä»»å¡ïŒ
# æ¯å€©æ©äž 9 ç¹å鿥æ¥
0 9 * * *
# æ¯åšäžæéåŸ
å
0 9 * * 1
任塿§è¡åéè¿æ¶æ¯æ»çº¿åäž» Agent åééç¥ïŒæ§è¡æ¥å¿å®æŽè®°åœã
# è¿è¡åå
+ éææµè¯ïŒ672 testsïŒ
make test
# ä»
åå
æµè¯
make test-unit
# ä»
éææµè¯
make test-integration
# E2E æµè¯ïŒéåå端è¿è¡ïŒ
cd backend && .venv/bin/pytest tests/e2e/ -v
# èŠççæ¥å
make coveragenimo/
âââ .github/ # GitHub Actions & æš¡æ¿
âââ backend/ # FastAPI å端
â âââ agentpal/
â â âââ agents/ # PersonalAssistantãSubAgentãCronAgentãBaseAgent
â â âââ channels/ # DingTalkãFeishuãiMessage
â â âââ api/v1/ # REST API è·¯ç±ïŒ14 䞪 endpoint æš¡åïŒ
â â âââ memory/ # è®°å¿æš¡åïŒBuffer / SQLite / Hybrid / ReMeLightïŒ
â â âââ models/ # SQLAlchemy ORM æš¡åïŒ13 åŒ è¡šïŒ
â â âââ providers/ # æš¡åæäŸæ¹ç®¡çïŒProvider Managerãéè¯æš¡åïŒ
â â âââ runtimes/ # SubAgent è¿è¡æ¶æœè±¡ïŒInternal / HTTPïŒ
â â âââ zmq_bus/ # ZMQ æ¶æ¯æ»çº¿ïŒå®æ€è¿çšãåè®®ãäºä»¶è®¢é
ïŒ
â â âââ cli/ # åœä»€è¡å·¥å
·ïŒè¿çšç®¡çãæ§å¶å°ãåœä»€ïŒ
â â âââ workspace/ # å·¥äœç©ºéŽç®¡çïŒäžäžææå»ºãè®°å¿åå
¥ïŒ
â â âââ tools/ # å·¥å
·æ³šåäžå
眮工å
·ïŒ12 䞪ïŒ
â â âââ services/ # é
眮ãCron è°åºŠãéç¥æ»çº¿ãäºä»¶æ»çº¿
â âââ tests/ # unit / integration / e2e
âââ frontend/ # React + Vite + TypeScript + Tailwind
â âââ src/
â âââ pages/ # ChatãToolsãSkillsãTasksãSessionsãWorkspaceãCronãDashboard
â âââ components/ # LayoutãSessionPanelãMentionPopupãTaskArtifactViewerãNimoLogo
â âââ hooks/ # useToolsãuseSessionsãuseSkillsãuseCronãuseTasksãuseNotifications ...
âââ docs/ # é¡¹ç®ææ¡£
âââ docker-compose.yml
æ¬¢è¿ PR å IssueïŒè¯·å é 读 CONTRIBUTING.mdã