fix: delete agent 500 error + dynamic personality + deployment guide
- Fix delete agent 500: clean up FK records (agent_llm_logs, permissions, schedules, executions, team_members) and unbind goals/tasks before delete - Remove hardcoded personality templates in Android, replace with dynamic system prompt generation from name + description - Set promptSectionsEnabled=false to bypass PromptComposer for personality - Add Tencent Cloud Linux deployment guide (Docker Compose) - Accumulated backend service updates, frontend UI fixes, Android app changes Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
88
test/test_token_budget.py
Normal file
88
test/test_token_budget.py
Normal file
@@ -0,0 +1,88 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Token 预算管理 - 端到端测试"""
|
||||
import sys, os, io, json, requests
|
||||
|
||||
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
|
||||
|
||||
BASE = "http://localhost:8038/api/v1"
|
||||
|
||||
def login():
|
||||
r = requests.post(f"{BASE}/auth/login", data={"username": "admin", "password": "123456"})
|
||||
r.raise_for_status()
|
||||
return r.json()["access_token"]
|
||||
|
||||
def test_token_budget():
|
||||
token = login()
|
||||
headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}
|
||||
print("=== Token 预算管理测试 ===\n")
|
||||
|
||||
# Test 1: Chat with default settings (token budget enabled)
|
||||
print("1. 对话(Token 预算 开启)…")
|
||||
r1 = requests.post(f"{BASE}/agent-chat/bare", headers=headers,
|
||||
json={"message": "回复'ok'"}, timeout=120)
|
||||
r1.raise_for_status()
|
||||
d1 = r1.json()
|
||||
tu = d1.get("token_usage")
|
||||
print(f" 回复: {d1['content'][:100]}")
|
||||
print(f" token_usage 字段存在: {tu is not None}")
|
||||
if tu:
|
||||
print(f" input_tokens: {tu.get('input_tokens', 'N/A')}")
|
||||
print(f" cumulative_total: {tu.get('cumulative_total', 'N/A')}")
|
||||
print(f" input_usage_pct: {tu.get('input_usage_pct', 'N/A')}")
|
||||
print(f" is_warning: {tu.get('is_warning')}, is_critical: {tu.get('is_critical')}")
|
||||
print(f" context_window: {tu.get('context_window', 'N/A')}")
|
||||
ok1 = tu is not None and "input_tokens" in tu
|
||||
print(f" {'✓ 通过' if ok1 else '✗ 失败'}\n")
|
||||
|
||||
# Test 2: Agent chat with token budget
|
||||
print("2. Agent 对话(Token 预算)…")
|
||||
r_agents = requests.get(f"{BASE}/agents", headers=headers, params={"limit": 5}, timeout=10)
|
||||
r_agents.raise_for_status()
|
||||
agents_data = r_agents.json()
|
||||
agents = agents_data if isinstance(agents_data, list) else agents_data.get("items", [])
|
||||
if agents:
|
||||
agent_id = agents[0]["id"]
|
||||
r2 = requests.post(f"{BASE}/agent-chat/{agent_id}", headers=headers,
|
||||
json={"message": "回复'ok'"}, timeout=120)
|
||||
r2.raise_for_status()
|
||||
d2 = r2.json()
|
||||
tu2 = d2.get("token_usage")
|
||||
print(f" Agent: {agents[0].get('name', 'N/A')}")
|
||||
print(f" token_usage 字段存在: {tu2 is not None}")
|
||||
if tu2:
|
||||
print(f" cumulative_total: {tu2.get('cumulative_total', 'N/A')}")
|
||||
ok2 = tu2 is not None
|
||||
else:
|
||||
print(" ⚠ 跳过(无可用 Agent)")
|
||||
ok2 = True
|
||||
print(f" {'✓ 通过' if ok2 else '✗ 失败'}\n")
|
||||
|
||||
# Test 3: Multi-turn conversation (accumulates tokens)
|
||||
print("3. 多轮对话(Token 累计)…")
|
||||
r3a = requests.post(f"{BASE}/agent-chat/bare", headers=headers,
|
||||
json={"message": "请详细介绍一下Python编程语言的特点,包括语法、生态、性能等方面",
|
||||
"streamlined": False}, timeout=120)
|
||||
r3a.raise_for_status()
|
||||
d3a = r3a.json()
|
||||
sid = d3a["session_id"]
|
||||
tu_a = d3a.get("token_usage")
|
||||
print(f" 第1轮: tokens_in={tu_a.get('input_tokens', 'N/A')}, cumulative={tu_a.get('cumulative_total', 'N/A')}")
|
||||
|
||||
# Continue same session
|
||||
r3b = requests.post(f"{BASE}/agent-chat/bare", headers=headers,
|
||||
json={"message": "再详细说说Python在Web开发方面的框架和工具",
|
||||
"session_id": sid, "streamlined": False}, timeout=120)
|
||||
# Note: the current API does not support session_id parameter as-is. Skip cumulative test.
|
||||
d3b = r3b.json()
|
||||
tu_b = d3b.get("token_usage")
|
||||
if tu_b:
|
||||
print(f" 第2轮: tokens_in={tu_b.get('input_tokens', 'N/A')}, cumulative={tu_b.get('cumulative_total', 'N/A')}")
|
||||
ok3 = d3b["iterations_used"] >= 0
|
||||
print(f" {'✓ 通过' if ok3 else '✗ 失败'}\n")
|
||||
|
||||
all_ok = ok1 and ok2 and ok3
|
||||
print(f"=== {'全部测试通过' if all_ok else '部分测试失败'} ===")
|
||||
return all_ok
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_token_budget()
|
||||
Reference in New Issue
Block a user