Unified AI agent framework: one interface for 9 LLM providers (Qwen, Kimi, GLM, DeepSeek, MiniMax, Doubao, ChatGPT, Gemini, Claude) with tools, MCP, sub-agents, skills, RAG knowledge base, scheduler, multi-channel IM gateway (WeChat/Feishu/Telegram) and multi-user serving
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · streamable-http · http counts 0 tools · 0 res
· 0 prompts
permission surface via code analysis
No tools enumerated yet for this server.
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed v0.5.2 · analyzer v32 · 1h ago
skills & prompt files 10
- agent-rules milu-0.5.2/src/milu/templates/prompts/coder/agent.md
- agent-rules milu-0.5.2/src/milu/templates/prompts/main/agent.md
- agent-rules milu-0.5.2/src/milu/templates/prompts/reader/agent.md
- agent-rules milu-0.5.2/src/milu/templates/prompts/researcher/agent.md
- agent-rules milu-0.5.2/src/milu/templates/prompts/reviewer/agent.md
- skill milu-0.5.2/src/milu/templates/skills/frontend-design/SKILL.md
- skill milu-0.5.2/src/milu/templates/skills/internal-comms/SKILL.md
- skill milu-0.5.2/src/milu/templates/skills/mcp-builder/SKILL.md
- skill milu-0.5.2/src/milu/templates/skills/systematic-debugging/SKILL.md
- skill milu-0.5.2/src/milu/templates/skills/test-driven-development/SKILL.md
danger signals5
- dynamic code execution eval()/exec() milu-0.5.2/examples/2. agent_basic.py :28
return str(eval(expression)) # noqa: S307 - dynamic code execution eval()/exec() milu-0.5.2/src/milu/sandbox/local.py :63
exec(code, restricted_globals) # noqa: S102 - dynamic code execution eval()/exec() milu-0.5.2/tests/test_agent_integration.py :32
result = eval(expression, {"__builtins__": {}}, {}) - dynamic code execution eval()/exec() milu-0.5.2/tests/test_real_new_providers.py :118
return str(eval(expression)) - suspicious endpoint api.telegram.org milu-0.5.2/src/milu/channels/telegram.py :40
api_base: str = "https://api.telegram.org"
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 225
filesystem 62
- fs (weak) milu-0.5.2/examples/1. basic_llm.py :3
from pathlib import Path - fs (weak) milu-0.5.2/examples/2. agent_basic.py :3
from pathlib import Path - fs (weak) milu-0.5.2/examples/3. builtin_tools.py :4
from pathlib import Path - fs (weak) milu-0.5.2/examples/6_subagent.py :14
from pathlib import Path - fs (weak) milu-0.5.2/examples/7_server_fastapi.py :30
from pathlib import Path - fs (weak) milu-0.5.2/examples/multi_tenant_keys.py :24
from pathlib import Path - fs (weak) milu-0.5.2/examples/multi_turn_chat.py :16
from pathlib import Path - fs (weak) milu-0.5.2/examples/multi_user_chat.py :32
from pathlib import Path - fs (weak) milu-0.5.2/examples/scheduler_server.py :33
from pathlib import Path - fs milu-0.5.2/src/milu/agent/agent.py :11
from pathlib import Path - fs milu-0.5.2/src/milu/agent/compactor.py :411
with open(self._session.conversation_path, "r", encoding="utf-8") as f: - fs milu-0.5.2/src/milu/agent/session.py :24
from pathlib import Path - fs milu-0.5.2/src/milu/channels/commands.py :22
from pathlib import Path - fs milu-0.5.2/src/milu/channels/media.py :21
from pathlib import Path - fs milu-0.5.2/src/milu/channels/state.py :24
from pathlib import Path - fs milu-0.5.2/src/milu/cli/repl.py :13
from pathlib import Path - fs milu-0.5.2/src/milu/cli/setup_wizard.py :16
from pathlib import Path - fs milu-0.5.2/src/milu/config.py :28
from pathlib import Path - fs milu-0.5.2/src/milu/knowledge/store.py :30
from pathlib import Path - fs milu-0.5.2/src/milu/llm/base/vision.py :52
with open(path, "rb") as f: - fs milu-0.5.2/src/milu/observability/report.py :31
from pathlib import Path - fs milu-0.5.2/src/milu/observability/sink.py :10
from pathlib import Path - fs milu-0.5.2/src/milu/prompts/builder.py :22
from pathlib import Path - fs milu-0.5.2/src/milu/resources.py :20
from pathlib import Path - fs (weak) milu-0.5.2/src/milu/sandbox/docker.py :36
import shutil - fs (weak) milu-0.5.2/src/milu/sandbox/process.py :12
文件仍能被 open() 读出密钥」的旁路,使 subprocess 在密钥保护上严格优于 local。 - fs milu-0.5.2/src/milu/scheduler/engine.py :26
from pathlib import Path - fs milu-0.5.2/src/milu/scheduler/lock.py :17
from pathlib import Path - fs milu-0.5.2/src/milu/scheduler/store.py :23
from pathlib import Path - fs milu-0.5.2/src/milu/serving/web/app.py :31
from pathlib import Path - fs milu-0.5.2/src/milu/serving/web/dashboard.py :29
from pathlib import Path - fs milu-0.5.2/src/milu/skills/config.py :70
with open(path, "r", encoding="utf-8") as f: - fs milu-0.5.2/src/milu/skills/registry.py :11
from pathlib import Path - fs (weak) milu-0.5.2/src/milu/templates/skills/mcp-builder/scripts/evaluation.py :14
from pathlib import Path - fs milu-0.5.2/src/milu/tools/builtin/file_tool.py :111
os.unlink(tmp_path) - fs milu-0.5.2/src/milu/tools/builtin/knowledge_tool.py :223
with open(abs_path, encoding="utf-8", errors="replace") as f: - fs milu-0.5.2/src/milu/tools/builtin/memory_tool.py :25
from pathlib import Path - fs milu-0.5.2/src/milu/tools/builtin/todo_write.py :14
from pathlib import Path - fs milu-0.5.2/src/milu/tools/mcp/config.py :10
from pathlib import Path - fs (weak) milu-0.5.2/tests/benchmark_knowledge.py :24
import shutil - fs (weak) milu-0.5.2/tests/run_tests.py :5
from pathlib import Path - fs (weak) milu-0.5.2/tests/stress_real_api.py :28
import shutil - fs (weak) milu-0.5.2/tests/test_agent_session.py :4
from pathlib import Path - fs (weak) milu-0.5.2/tests/test_compactor.py :12
from pathlib import Path - fs (weak) milu-0.5.2/tests/test_concurrency_stress.py :13
from pathlib import Path - fs (weak) milu-0.5.2/tests/test_gateway_media.py :17
from pathlib import Path - fs (weak) milu-0.5.2/tests/test_knowledge.py :11
from pathlib import Path - fs (weak) milu-0.5.2/tests/test_mcp/test_config.py :4
from pathlib import Path - fs (weak) milu-0.5.2/tests/test_prompt_builder.py :27
with open(os.path.join(tmpdir, "soul.md"), "w", encoding="utf-8") as f: - fs (weak) milu-0.5.2/tests/test_prompt_integration.py :29
with open(os.path.join(tmpdir, "safeguard.md"), "w", encoding="utf-8") as f: - fs (weak) milu-0.5.2/tests/test_real_api.py :19
from pathlib import Path - fs (weak) milu-0.5.2/tests/test_sandbox.py :10
import shutil - fs (weak) milu-0.5.2/tests/test_scheduler_engine.py :17
from pathlib import Path - fs (weak) milu-0.5.2/tests/test_scheduler_lock.py :11
from pathlib import Path - fs (weak) milu-0.5.2/tests/test_scheduler_store.py :5
from pathlib import Path - fs (weak) milu-0.5.2/tests/test_scheduler_user_context.py :12
from pathlib import Path - fs (weak) milu-0.5.2/tests/test_session.py :5
from pathlib import Path - fs (weak) milu-0.5.2/tests/test_skills.py :103
os.unlink(path) - fs (weak) milu-0.5.2/tests/test_todo_concurrent_isolation.py :8
from pathlib import Path - fs (weak) milu-0.5.2/tests/test_tool_doc.py :10
from pathlib import Path - fs (weak) milu-0.5.2/tests/test_tool_file.py :217
assert open(path, encoding="utf-8").read() == "Hello" - fs (weak) milu-0.5.2/tests/test_tool_image.py :14
from pathlib import Path
shell / exec 6
- shell (weak) milu-0.5.2/examples/6_subagent.py :228
os.system("") - shell (weak) milu-0.5.2/examples/multi_turn_chat.py :699
os.system("") - shell milu-0.5.2/src/milu/cli/app.py :766
os.system("") - shell (weak) milu-0.5.2/src/milu/sandbox/docker.py :37
import subprocess - shell milu-0.5.2/src/milu/scheduler/notify.py :10
import subprocess - shell (weak) milu-0.5.2/tests/test_scheduler_lock.py :9
import subprocess
network 19
- net milu-0.5.2/src/milu/channels/feishu.py :33
import httpx - net milu-0.5.2/src/milu/channels/media.py :162
from urllib.parse import unquote - net milu-0.5.2/src/milu/channels/telegram.py :27
import httpx - net milu-0.5.2/src/milu/channels/wechat_kf.py :35
import httpx - net milu-0.5.2/src/milu/serving/web/app.py :1403
import socket - net milu-0.5.2/src/milu/tools/builtin/http_request.py :11
import httpx - net milu-0.5.2/src/milu/tools/builtin/web_fetch.py :16
import httpx - net milu-0.5.2/src/milu/tools/builtin/web_search.py :21
import httpx - net milu-0.5.2/src/milu/tools/mcp/connection.py :273
from urllib.parse import urlparse - net (weak) milu-0.5.2/tests/test_feishu.py :15
import httpx - net (weak) milu-0.5.2/tests/test_gateway.py :13
import httpx - net (weak) milu-0.5.2/tests/test_gateway_media.py :20
import httpx - net (weak) milu-0.5.2/tests/test_mcp/test_connection.py :294
patch("httpx.AsyncClient", FakeClient): - net (weak) milu-0.5.2/tests/test_real_api.py :315
import httpx - net (weak) milu-0.5.2/tests/test_telegram.py :1
"""Telegram 渠道单测——用 httpx.MockTransport 假冒 Bot API,无真实网络。 - net (weak) milu-0.5.2/tests/test_tool_http_request.py :19
with patch("httpx.AsyncClient") as mock_client_cls: - net (weak) milu-0.5.2/tests/test_tool_web_fetch.py :100
import httpx as real_httpx - net (weak) milu-0.5.2/tests/test_tool_web_search.py :119
with patch("httpx.AsyncClient") as mock_client_cls: - net (weak) milu-0.5.2/tests/test_wechat_kf.py :17
import httpx
secrets 11
- secrets (weak) milu-0.5.2/examples/gateway_multi_channel.py :40
if os.environ.get("TELEGRAM_BOT_TOKEN"): - secrets (weak) milu-0.5.2/examples/multi_tenant_keys.py :106
if not os.environ.get("QWEN_API_KEY"): - secrets milu-0.5.2/src/milu/channels/feishu.py :70
verify_token=os.environ.get("FEISHU_VERIFY_TOKEN", "").strip(), - secrets milu-0.5.2/src/milu/channels/telegram.py :47
token = os.environ.get("TELEGRAM_BOT_TOKEN", "").strip() - secrets milu-0.5.2/src/milu/cli/app.py :547
_admin_tok = os.environ.get("MILU_ADMIN_TOKEN") - secrets milu-0.5.2/src/milu/serving/web/dashboard.py :149
tok = os.environ.get("MILU_ADMIN_TOKEN") - secrets milu-0.5.2/src/milu/tools/builtin/web_search.py :78
custom_api_key = os.environ.get("SEARCH_API_KEY") - secrets (weak) milu-0.5.2/tests/test_agent_integration.py :12
not os.environ.get("QWEN_API_KEY"), - secrets (weak) milu-0.5.2/tests/test_real_new_providers.py :16
OPENAI_KEY = os.environ.get("OPENAI_API_KEY", "") - secrets (weak) milu-0.5.2/tests/test_sandbox.py :142
"import os; print(os.environ.get('MILU_SBX_SECRET_KEY', 'ABSENT'))" - secrets (weak) milu-0.5.2/tests/test_setup_wizard.py :106
assert os.environ["DEEPSEEK_API_KEY"] == "sk-new-key-123"
declared dependencies 24
- mcp@>=1.8.0,<2
- openai@>=1.66.0
- python-dotenv@>=1.0.0
- httpx@>=0.27.0
- jsonschema@>=4.20.0
- pyyaml@>=6.0
- markdownify@>=0.13.0
- python-docx@>=1.1.0
- openpyxl@>=3.1.0
- pypdf@>=4.0.0
- python-pptx@>=1.0.0
- xlrd@>=2.0.0
- croniter@>=1.3.8
- numpy@>=1.24
- fastapi@>=0.110.0
- uvicorn@>=0.27.0
- sse-starlette@>=2.0.0
- cryptography@>=3.4
- async-timeout@>=4.0; python_version <
- ddgs@>=8.0.0
- lark-oapi@>=1.2
- pytest@>=8.0.0
- pytest-asyncio@>=0.23.0
- ruff@>=0.15
transport_posture 2
- network-listening, binds all interfaces, no auth detected milu-0.5.2/examples/gateway_multi_channel.py :71
host="0.0.0.0", port=int(os.environ.get("PORT", "8800")) - network-listening, binds all interfaces, no auth detected milu-0.5.2/examples/wechat_kf_echo.py :36
run_server(host="0.0.0.0", port=int(os.environ.get("PORT", "8800")))