update readme & solve frontend efficiency

This commit is contained in:
NA-Wen 2026-03-11 11:35:33 +08:00
parent 54ad9a57ee
commit 55f565d53f
3 changed files with 41 additions and 5 deletions

View File

@ -182,6 +182,29 @@ make dev
```
Checks all YAML files for syntax and schema errors.
### 🦞 Run with OpenClaw
OpenClaw can integrate with ChatDev by invoking existing agent teams or dynamically creating new agent teams within ChatDev.
To get started:
1. Start the ChatDev 2.0 backend.
2. Install the required skills for your OpenClaw instance:
```bash
clawdbot install chatdev
```
3. Ask your OpenClaw to create a ChatDev workflow. For example:
* **Automated information collection and content publishing**
```
Create a ChatDev workflow to automatically collect trending information, generate a Xiaohongshu post, and publish it.
```
* **Multi-agent geopolitical simulation**
```
Create a ChatDev workflow with multiple agents to simulate possible future developments of the Middle East situation.
```
### 🐳 Run with Docker
Alternatively, you can run the entire application using Docker Compose. This method simplifies dependency management and provides a consistent environment.

View File

@ -56,7 +56,7 @@
>
<CollapsibleMessage
v-if="message.text"
:html-content="renderMarkdown(message.text)"
:html-content="message.htmlContent || renderMarkdown(message.text)"
:raw-content="message.text"
:default-expanded="configStore.AUTO_EXPAND_MESSAGES"
/>
@ -540,6 +540,7 @@ const addTotalLoadingMessage = (nodeId) => {
type: 'dialogue',
name: nodeId,
text: '',
htmlContent: '',
avatar,
isRight: false,
isLoading: true,
@ -614,6 +615,20 @@ const finalizeAllLoadingEntries = (nodeState, endedAt = Date.now()) => {
// Global timer for updating loading bubble durations
const now = ref(Date.now())
let loadingTimerInterval = null
const runningLoadingEntries = ref(0)
const startLoadingTimer = () => {
if (loadingTimerInterval) return
loadingTimerInterval = setInterval(() => {
now.value = Date.now()
}, 1000)
}
const stopLoadingTimer = () => {
if (!loadingTimerInterval) return
clearInterval(loadingTimerInterval)
loadingTimerInterval = null
}
// Map sprites for different roles
const nameToSpriteMap = ref(new Map())

View File

@ -24,8 +24,6 @@ _DYNAMIC_TOOLS_DIR = Path(__file__).parent / "dynamic_tools"
_DYNAMIC_TOOLS_DIR.mkdir(parents=True, exist_ok=True)
def _safe_tool_filename(filename: str) -> str:
name = Path(filename).name
if not name.endswith(".py"):
@ -184,6 +182,6 @@ if _bootstrap["errors"]:
if __name__ == "__main__":
print("Starting DevAll MCP server...")
print("Starting MCP server...")
print("Run standalone with: fastmcp run server/mcp_server.py --transport streamable-http --port 8010")
mcp.run()
mcp.run()