refactor: 重构 Tool Result 契约,移除 ui_hints 统一使用 result 字段

- ToolAgentOutput 移除 result_summary 和 ui_hints,统一使用 result 字段
- 日历/用户查找工具移除 ui_hints 输出,改为机器可读的结构化结果
- Agent History 移除 tool 消息的 ui_hints 处理逻辑
- App 版本检查改为 manifest.json 方式,支持多渠道发布
- 更新 settings 配置和测试用例适配新结构
This commit is contained in:
qzl
2026-03-17 12:18:09 +08:00
parent c26cdbbc27
commit aa30fe0ce6
44 changed files with 984 additions and 655 deletions
+8 -34
View File
@@ -3,16 +3,14 @@ set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
SESSION_NAME="${SESSION_NAME:-social-dev}"
COMPOSE_FILE="$ROOT_DIR/infra/docker/docker-compose.yml"
ENV_FILE="$ROOT_DIR/.env"
LITELLM_RUNTIME_CONFIG="$ROOT_DIR/.tmp/litellm-proxy-config.yaml"
usage() {
echo "Usage: $0 {start|stop|restart}"
echo ""
echo "Commands:"
echo " start Start LiteLLM + web + worker processes in tmux"
echo " stop Stop tmux session and clean orphaned processes"
echo " start Start local web/worker tmux only"
echo " stop Stop tmux session and orphaned local processes"
echo " restart Stop then start all app processes"
exit 1
}
@@ -117,7 +115,8 @@ kill_listening_processes() {
start() {
echo "=== App Up ==="
echo "This script starts LiteLLM + web + worker processes in tmux."
echo "This script starts local web + worker processes in tmux."
echo "LiteLLM/Redis should be managed separately as long-running docker services."
echo "NOTE: Bootstrap (migrate + init-data) must be run separately."
echo ""
@@ -131,17 +130,11 @@ start() {
exit 1
fi
if [ ! -f "$COMPOSE_FILE" ]; then
echo "Error: compose file not found at $COMPOSE_FILE" >&2
exit 1
fi
load_env_if_exists
UVICORN_LOG_LEVEL="${SOCIAL_RUNTIME__LOG_LEVEL:-info}"
UVICORN_LOG_LEVEL="$(echo "$UVICORN_LOG_LEVEL" | tr '[:upper:]' '[:lower:]')"
WEB_PORT="${SOCIAL_WEB__PORT:-5775}"
LITELLM_PORT="${SOCIAL_LITELLM__PORT:-3875}"
if tmux has-session -t "$SESSION_NAME" 2>/dev/null; then
echo "Error: tmux session '$SESSION_NAME' already exists." >&2
@@ -155,12 +148,6 @@ start() {
exit 1
fi
if is_port_in_use "$LITELLM_PORT"; then
echo "Error: litellm port ${LITELLM_PORT} is already in use." >&2
echo "Hint: run '$0 stop' or change SOCIAL_LITELLM__PORT in .env" >&2
exit 1
fi
if [ -z "${SOCIAL_LLM__PROVIDER_KEYS__DASHSCOPE:-}" ]; then
echo "Warning: SOCIAL_LLM__PROVIDER_KEYS__DASHSCOPE is empty; qwen calls may fail." >&2
fi
@@ -168,12 +155,6 @@ start() {
echo "Warning: SOCIAL_LLM__PROVIDER_KEYS__DEEPSEEK is empty; deepseek calls may fail." >&2
fi
echo "Starting LiteLLM + web + worker processes in tmux session '$SESSION_NAME'..."
cd "$ROOT_DIR" && PYTHONPATH=backend/src uv run python backend/scripts/build_litellm_proxy_config.py --output "$LITELLM_RUNTIME_CONFIG"
LITELLM_CMD="cd '$ROOT_DIR' && set -a && . '$ENV_FILE' && set +a && uv run litellm --config '$LITELLM_RUNTIME_CONFIG' --port ${LITELLM_PORT}"
WEB_CMD="cd '$ROOT_DIR' && PYTHONPATH=backend/src SOCIAL_RUNTIME__SERVICE_NAME=web uv run uvicorn app:app --host \
${SOCIAL_WEB__HOST:-0.0.0.0} --port ${WEB_PORT} --workers \
${SOCIAL_WEB__WORKERS:-2} --log-level ${UVICORN_LOG_LEVEL}"
@@ -182,8 +163,9 @@ ${SOCIAL_WEB__WORKERS:-2} --log-level ${UVICORN_LOG_LEVEL}"
WORKER_DEFAULT_CMD="cd '$ROOT_DIR' && PYTHONPATH=backend/src SOCIAL_RUNTIME__SERVICE_NAME=worker-default uv run taskiq worker core.taskiq.app:default_broker core.agentscope.runtime.tasks --workers ${SOCIAL_WORKER__GROUPS__DEFAULT__CONCURRENCY:-2}"
WORKER_BULK_CMD="cd '$ROOT_DIR' && PYTHONPATH=backend/src SOCIAL_RUNTIME__SERVICE_NAME=worker-bulk uv run taskiq worker core.taskiq.app:bulk_broker core.agentscope.runtime.tasks --workers ${SOCIAL_WORKER__GROUPS__BULK__CONCURRENCY:-1}"
tmux new-session -d -s "$SESSION_NAME" -n litellm "bash -lc \"$LITELLM_CMD; echo '[litellm] exited'; exec bash\""
tmux new-window -t "$SESSION_NAME" -n web "bash -lc \"$WEB_CMD; echo '[web] exited'; exec bash\""
echo "Starting tmux workers in session '$SESSION_NAME'..."
tmux new-session -d -s "$SESSION_NAME" -n web "bash -lc \"$WEB_CMD; echo '[web] exited'; exec bash\""
tmux new-window -t "$SESSION_NAME" -n worker-critical "bash -lc \"$WORKER_CRITICAL_CMD; echo '[worker-critical] exited'; exec bash\""
tmux new-window -t "$SESSION_NAME" -n worker-default "bash -lc \"$WORKER_DEFAULT_CMD; echo '[worker-default] exited'; exec bash\""
tmux new-window -t "$SESSION_NAME" -n worker-bulk "bash -lc \"$WORKER_BULK_CMD; echo '[worker-bulk] exited'; exec bash\""
@@ -202,9 +184,9 @@ ${SOCIAL_WEB__WORKERS:-2} --log-level ${UVICORN_LOG_LEVEL}"
stop() {
echo "=== App Down ==="
echo "Stopping tmux app processes (docker redis/litellm are not managed here)."
load_env_if_exists
WEB_PORT="${SOCIAL_WEB__PORT:-5775}"
LITELLM_PORT="${SOCIAL_LITELLM__PORT:-3875}"
if tmux has-session -t "$SESSION_NAME" 2>/dev/null; then
echo "Stopping tmux session '$SESSION_NAME'..."
@@ -216,11 +198,9 @@ stop() {
echo "Checking for orphaned processes..."
kill_matching_processes "uvicorn" "uv run uvicorn app:app"
kill_matching_processes "litellm" "uv run litellm --config"
kill_matching_processes "taskiq workers" "uv run taskiq worker core.taskiq.app:"
kill_listening_processes "port ${WEB_PORT} listeners" "$WEB_PORT"
kill_listening_processes "port ${LITELLM_PORT} listeners" "$LITELLM_PORT"
if is_port_in_use "$WEB_PORT"; then
echo "Warning: port ${WEB_PORT} is still in use after cleanup." >&2
@@ -228,12 +208,6 @@ stop() {
return 1
fi
if is_port_in_use "$LITELLM_PORT"; then
echo "Warning: port ${LITELLM_PORT} is still in use after cleanup." >&2
echo "Hint: check process with 'lsof -iTCP:${LITELLM_PORT} -sTCP:LISTEN'" >&2
return 1
fi
echo "Session stopped and cleaned up."
}