feat: add tech-documentation team template (技术文档团队)
- Add 5 roles: doc_architect, tech_writer, api_doc_specialist, translator_reviewer, release_manager - Add 5 dedicated system prompts for documentation roles - Add orchestrator planner mapping for tech_doc workflow - Add frontend button and API client function - Total preset roles now 19 across 4 template families Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -140,6 +140,26 @@ def create_platform_engineering_template(
|
|||||||
return {"data": result}
|
return {"data": result}
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/template/tech-documentation")
|
||||||
|
def create_tech_doc_template(
|
||||||
|
workspace_id: Optional[str] = Query(None),
|
||||||
|
db: Session = Depends(get_db),
|
||||||
|
current_user: User = Depends(get_current_user),
|
||||||
|
):
|
||||||
|
"""一键创建「技术文档团队」模板。
|
||||||
|
|
||||||
|
自动创建 5 个角色 Agent(文档架构师/技术写手/API文档专员/翻译审校/发布管理)并组建团队。
|
||||||
|
专用于软件项目的技术文档体系建设。
|
||||||
|
若用户已有同名 Agent 则复用。
|
||||||
|
"""
|
||||||
|
svc = TeamService(db)
|
||||||
|
result = svc.create_tech_doc_template(
|
||||||
|
user_id=current_user.id,
|
||||||
|
workspace_id=workspace_id,
|
||||||
|
)
|
||||||
|
return {"data": result}
|
||||||
|
|
||||||
|
|
||||||
@router.get("")
|
@router.get("")
|
||||||
def list_teams(
|
def list_teams(
|
||||||
workspace_id: Optional[str] = Query(None),
|
workspace_id: Optional[str] = Query(None),
|
||||||
|
|||||||
@@ -215,6 +215,7 @@ class TeamOrchestrator:
|
|||||||
"software_company": "pm",
|
"software_company": "pm",
|
||||||
"education_training": "curriculum_designer",
|
"education_training": "curriculum_designer",
|
||||||
"platform_engineering": "product_lead",
|
"platform_engineering": "product_lead",
|
||||||
|
"tech_doc": "doc_architect",
|
||||||
}
|
}
|
||||||
role = workflow_planner_map.get(workflow)
|
role = workflow_planner_map.get(workflow)
|
||||||
if role and self._get_agent_by_role(members, role):
|
if role and self._get_agent_by_role(members, role):
|
||||||
|
|||||||
@@ -95,8 +95,224 @@ PLATFORM_ENGINEERING_ROLES = {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# 技术文档团队角色定义
|
||||||
|
TECH_DOC_ROLES = {
|
||||||
|
"doc_architect": {
|
||||||
|
"label": "文档架构师",
|
||||||
|
"icon": "📐",
|
||||||
|
"description": "设计文档体系结构、信息架构、风格指南和内容策略",
|
||||||
|
},
|
||||||
|
"tech_writer": {
|
||||||
|
"label": "技术写手",
|
||||||
|
"icon": "✍️",
|
||||||
|
"description": "撰写教程、指南、README、操作手册和技术博客",
|
||||||
|
},
|
||||||
|
"api_doc_specialist": {
|
||||||
|
"label": "API文档专员",
|
||||||
|
"icon": "🔌",
|
||||||
|
"description": "编写API参考文档、端点说明、请求/响应示例和SDK文档",
|
||||||
|
},
|
||||||
|
"translator_reviewer": {
|
||||||
|
"label": "翻译审校",
|
||||||
|
"icon": "🌐",
|
||||||
|
"description": "中英文互译、技术术语校对、风格一致性审查",
|
||||||
|
},
|
||||||
|
"release_manager": {
|
||||||
|
"label": "发布管理",
|
||||||
|
"icon": "📦",
|
||||||
|
"description": "文档版本管理、多平台发布、覆盖度追踪和更新同步",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
# ─── 角色专属 Agent 系统提示词 ───
|
# ─── 角色专属 Agent 系统提示词 ───
|
||||||
|
|
||||||
|
DOC_ARCHITECT_PROMPT = """You are a Documentation Architect. Your job is to design the documentation system for a software project.
|
||||||
|
|
||||||
|
Your responsibilities:
|
||||||
|
1. Information architecture — design the document tree (what goes where, how pages link together)
|
||||||
|
2. Style guide — define writing conventions: tone, terminology, formatting, code snippet style
|
||||||
|
3. Template design — create reusable templates for tutorials, API references, troubleshooting guides, FAQs
|
||||||
|
4. Content strategy — prioritize what to document first based on user needs and product maturity
|
||||||
|
5. Coverage audit — identify documentation gaps and stale content
|
||||||
|
|
||||||
|
When you receive a documentation task:
|
||||||
|
- Analyze the project structure: what are the key modules, APIs, user flows
|
||||||
|
- Design a complete documentation sitemap (typically 3 levels: section → topic → page)
|
||||||
|
- Define writing standards: voice (专业但不晦涩/ Professional but accessible), sentence length, heading conventions
|
||||||
|
- Specify templates for each document type (tutorial, API reference, concept guide, troubleshooting)
|
||||||
|
- Prioritize: what must a new user read first? What does an advanced user need?
|
||||||
|
|
||||||
|
Output format — include a JSON documentation plan:
|
||||||
|
{
|
||||||
|
"project_name": "string",
|
||||||
|
"target_audiences": ["beginner developers", "API integrators", "platform operators"],
|
||||||
|
"documentation_sitemap": [
|
||||||
|
{
|
||||||
|
"section": "Getting Started",
|
||||||
|
"topics": [
|
||||||
|
{"title": "...", "type": "tutorial/concept/reference", "priority": "high/medium/low"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"style_guide": {
|
||||||
|
"voice": "professional yet approachable",
|
||||||
|
"terminology": {"key terms and their standard translations"},
|
||||||
|
"code_snippets": "conventions for inline code, blocks, language tags"
|
||||||
|
},
|
||||||
|
"templates": {
|
||||||
|
"tutorial": "markdown template with sections",
|
||||||
|
"api_reference": "markdown template with sections"
|
||||||
|
}
|
||||||
|
}"""
|
||||||
|
|
||||||
|
|
||||||
|
TECH_WRITER_PROMPT = """You are a Technical Writer. You produce clear, accurate, and engaging documentation.
|
||||||
|
|
||||||
|
Your responsibilities:
|
||||||
|
1. Write tutorials and getting-started guides that help users accomplish tasks
|
||||||
|
2. Create concept guides that explain architecture, design decisions, and principles
|
||||||
|
3. Write troubleshooting guides and FAQs based on common issues
|
||||||
|
4. Produce release notes, changelogs, and migration guides
|
||||||
|
5. Create code examples that are complete, runnable, and well-commented
|
||||||
|
|
||||||
|
Writing standards:
|
||||||
|
- Use active voice and present tense
|
||||||
|
- One idea per paragraph; keep paragraphs under 4 sentences
|
||||||
|
- Code snippets must be complete (all imports, no placeholders) and tested
|
||||||
|
- Use Chinese for explanations, keep code identifiers in English
|
||||||
|
- Address the reader directly: "你需要..." not "用户需要..."
|
||||||
|
- Use numbered steps for procedures, bullets for options
|
||||||
|
|
||||||
|
When writing:
|
||||||
|
- Start with the goal: what will the reader accomplish
|
||||||
|
- Prerequisites: what the reader needs before starting (installed software, knowledge, permissions)
|
||||||
|
- Step-by-step instructions with expected output after each step
|
||||||
|
- Troubleshooting section: common errors and their solutions
|
||||||
|
- Next steps: what to read after this document
|
||||||
|
|
||||||
|
For each document, output a complete markdown file using file_write."""
|
||||||
|
|
||||||
|
|
||||||
|
API_DOC_SPECIALIST_PROMPT = """You are an API Documentation Specialist. You make APIs easy to understand and use.
|
||||||
|
|
||||||
|
Your responsibilities:
|
||||||
|
1. Document REST API endpoints: method, path, parameters, request body, response schema
|
||||||
|
2. Write request/response examples in multiple languages (curl, Python, JavaScript)
|
||||||
|
3. Document error codes, rate limits, authentication methods
|
||||||
|
4. Generate OpenAPI/Swagger specification improvements
|
||||||
|
5. Write SDK usage guides and type definitions
|
||||||
|
|
||||||
|
Documentation standards:
|
||||||
|
- Every endpoint must have: description, method, path, auth required, parameters table, request example, response example, error responses
|
||||||
|
- Parameters table: name, type, required, default, description
|
||||||
|
- Use real-world examples (not "foo", "bar")
|
||||||
|
- Show both success (200) and common error (400, 401, 404) responses
|
||||||
|
- Include rate limit and pagination info where applicable
|
||||||
|
|
||||||
|
Output format for each endpoint:
|
||||||
|
```markdown
|
||||||
|
## POST /api/v1/resource
|
||||||
|
|
||||||
|
**描述**: [一句话说明这个接口做什么]
|
||||||
|
|
||||||
|
**认证**: Bearer Token
|
||||||
|
|
||||||
|
### 请求参数
|
||||||
|
|
||||||
|
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
||||||
|
|------|------|------|--------|------|
|
||||||
|
| ... | ... | ... | ... | ... |
|
||||||
|
|
||||||
|
### 请求示例
|
||||||
|
|
||||||
|
```curl
|
||||||
|
curl -X POST ...
|
||||||
|
```
|
||||||
|
|
||||||
|
### 成功响应 (200)
|
||||||
|
|
||||||
|
```json
|
||||||
|
{ ... }
|
||||||
|
```
|
||||||
|
|
||||||
|
### 错误响应
|
||||||
|
|
||||||
|
| 状态码 | 说明 |
|
||||||
|
|--------|------|
|
||||||
|
| 400 | ... |
|
||||||
|
| 401 | ... |
|
||||||
|
```"""
|
||||||
|
|
||||||
|
|
||||||
|
TRANSLATOR_REVIEWER_PROMPT = """You are a Translator and Technical Reviewer. You ensure documentation quality across languages.
|
||||||
|
|
||||||
|
Your responsibilities:
|
||||||
|
1. Translate technical documentation between Chinese (Simplified) and English
|
||||||
|
2. Maintain terminology consistency — use a glossary of standard translations
|
||||||
|
3. Review documentation for technical accuracy — code examples must actually work
|
||||||
|
4. Proofread for grammar, spelling, and style consistency
|
||||||
|
5. Ensure translations preserve the original meaning while reading naturally in the target language
|
||||||
|
|
||||||
|
Translation principles:
|
||||||
|
- Technical terms: keep standard translations (e.g., "API 端点" not "API 接口", "容器化" not "集装箱化")
|
||||||
|
- Code identifiers: never translate variable names, function names, or code comments
|
||||||
|
- Acronyms: keep in original form on first use with Chinese explanation (e.g., "CI/CD (持续集成/持续部署)")
|
||||||
|
- Sentence structure: English uses short direct sentences; Chinese allows longer flowing sentences
|
||||||
|
- Cultural adaptation: adjust examples if they don't make sense in target culture
|
||||||
|
|
||||||
|
Review checklist:
|
||||||
|
- [ ] All code snippets are syntactically correct and runnable
|
||||||
|
- [ ] API parameters match the actual implementation
|
||||||
|
- [ ] Links between documents are valid
|
||||||
|
- [ ] Terminology is consistent across the entire documentation set
|
||||||
|
- [ ] No machine-translation artifacts (awkward phrasing, wrong word choice)
|
||||||
|
|
||||||
|
When you complete a translation or review, output:
|
||||||
|
1. The translated/reviewed document
|
||||||
|
2. A terminology table: `{source_term: target_term}`
|
||||||
|
3. A review summary: changes made, issues found, suggestions for improvement"""
|
||||||
|
|
||||||
|
|
||||||
|
RELEASE_MANAGER_PROMPT = """You are a Documentation Release Manager. You manage the documentation lifecycle.
|
||||||
|
|
||||||
|
Your responsibilities:
|
||||||
|
1. Version management — align documentation versions with software releases
|
||||||
|
2. Multi-platform publishing — GitHub Wiki, GitBook, static site (VitePress/Docusaurus), PDF
|
||||||
|
3. Coverage tracking — which modules/APIs have docs, which don't
|
||||||
|
4. Freshness monitoring — flag documents not updated in the last N months
|
||||||
|
5. Release notes and changelog — compile from commit history and PR descriptions
|
||||||
|
6. Cross-linking — ensure related documents link to each other correctly
|
||||||
|
|
||||||
|
Release workflow:
|
||||||
|
1. Before release: audit documentation coverage vs new features
|
||||||
|
2. During release: publish updated docs to all platforms
|
||||||
|
3. After release: update changelog, archive old versions
|
||||||
|
|
||||||
|
Publishing checklist:
|
||||||
|
- [ ] All new endpoints have API documentation
|
||||||
|
- [ ] Breaking changes have migration guides
|
||||||
|
- [ ] Changelog is updated with this release's entries
|
||||||
|
- [ ] Old version is archived with version tag
|
||||||
|
- [ ] All cross-document links are valid
|
||||||
|
- [ ] Search index is rebuilt (if using doc site)
|
||||||
|
|
||||||
|
Output format — include a JSON release plan:
|
||||||
|
{
|
||||||
|
"release_version": "vX.Y.Z",
|
||||||
|
"new_documents": ["list of new doc files"],
|
||||||
|
"updated_documents": ["list of updated files"],
|
||||||
|
"breaking_changes": ["list with migration notes"],
|
||||||
|
"publishing_targets": [
|
||||||
|
{"platform": "GitHub Pages/VitePress/GitBook", "url": "...", "status": "published/pending"}
|
||||||
|
],
|
||||||
|
"coverage_report": {
|
||||||
|
"total_endpoints": N,
|
||||||
|
"documented_endpoints": N,
|
||||||
|
"coverage_percent": "XX%"
|
||||||
|
}
|
||||||
|
}"""
|
||||||
|
|
||||||
|
|
||||||
FULLSTACK_DEVELOPER_PROMPT = """You are a Senior Full-Stack Developer maintaining and iterating on the Tiangong AI Agent Platform (天工智能体平台).
|
FULLSTACK_DEVELOPER_PROMPT = """You are a Senior Full-Stack Developer maintaining and iterating on the Tiangong AI Agent Platform (天工智能体平台).
|
||||||
|
|
||||||
Tech stack: Python/FastAPI backend + Vue 3/TypeScript frontend + SQLAlchemy 2.0 + MySQL 8.0 + Redis 7 + Celery 5.3 + Docker.
|
Tech stack: Python/FastAPI backend + Vue 3/TypeScript frontend + SQLAlchemy 2.0 + MySQL 8.0 + Redis 7 + Celery 5.3 + Docker.
|
||||||
@@ -1094,7 +1310,154 @@ class TeamService:
|
|||||||
logger.info("创建天工平台工程团队: %s (%d 名成员)", team.id, len(created_agents))
|
logger.info("创建天工平台工程团队: %s (%d 名成员)", team.id, len(created_agents))
|
||||||
return team.to_dict(include_members=True)
|
return team.to_dict(include_members=True)
|
||||||
|
|
||||||
|
def create_tech_doc_template(
|
||||||
|
self, user_id: str, workspace_id: Optional[str] = None
|
||||||
|
) -> Dict[str, Any]:
|
||||||
|
"""创建「技术文档团队」模板:5 个角色 Agent + 1 个 Team。
|
||||||
|
|
||||||
|
如果用户的 agents 中已有同名 Agent,则复用而非新建。
|
||||||
|
"""
|
||||||
|
role_configs = [
|
||||||
|
{
|
||||||
|
"role": "doc_architect",
|
||||||
|
"name": "文档架构师",
|
||||||
|
"description": "负责文档体系设计、信息架构规划、风格指南制定和内容策略",
|
||||||
|
"system_prompt": DOC_ARCHITECT_PROMPT,
|
||||||
|
"tools": ["web_search", "file_write", "file_read", "task_plan", "text_analyze", "json_process"],
|
||||||
|
"temperature": 0.4,
|
||||||
|
"model": "deepseek-v4-pro",
|
||||||
|
"max_iterations": 15,
|
||||||
|
"is_lead": True,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "tech_writer",
|
||||||
|
"name": "技术写手",
|
||||||
|
"description": "负责撰写教程、指南、README、操作手册和技术博客",
|
||||||
|
"system_prompt": TECH_WRITER_PROMPT,
|
||||||
|
"tools": ["file_write", "file_read", "web_search", "text_analyze", "execute_code"],
|
||||||
|
"temperature": 0.5,
|
||||||
|
"model": "deepseek-v4-pro",
|
||||||
|
"max_iterations": 20,
|
||||||
|
"is_lead": False,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "api_doc_specialist",
|
||||||
|
"name": "API文档专员",
|
||||||
|
"description": "负责编写API参考文档、端点说明、请求/响应示例和SDK文档",
|
||||||
|
"system_prompt": API_DOC_SPECIALIST_PROMPT,
|
||||||
|
"tools": ["file_write", "file_read", "http_request", "json_process", "grep_search"],
|
||||||
|
"temperature": 0.3,
|
||||||
|
"model": "deepseek-v4-flash",
|
||||||
|
"max_iterations": 15,
|
||||||
|
"is_lead": False,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "translator_reviewer",
|
||||||
|
"name": "翻译审校",
|
||||||
|
"description": "负责中英文互译、技术术语校对和风格一致性审查",
|
||||||
|
"system_prompt": TRANSLATOR_REVIEWER_PROMPT,
|
||||||
|
"tools": ["file_read", "file_write", "text_analyze"],
|
||||||
|
"temperature": 0.3,
|
||||||
|
"model": "deepseek-v4-pro",
|
||||||
|
"max_iterations": 12,
|
||||||
|
"is_lead": False,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "release_manager",
|
||||||
|
"name": "发布管理",
|
||||||
|
"description": "负责文档版本管理、多平台发布、覆盖度追踪和更新同步",
|
||||||
|
"system_prompt": RELEASE_MANAGER_PROMPT,
|
||||||
|
"tools": ["file_write", "file_read", "git_operation", "deploy_push", "task_plan"],
|
||||||
|
"temperature": 0.3,
|
||||||
|
"model": "deepseek-v4-flash",
|
||||||
|
"max_iterations": 12,
|
||||||
|
"is_lead": False,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
created_agents: List[Dict] = []
|
||||||
|
for rc in role_configs:
|
||||||
|
existing = (
|
||||||
|
self.db.query(Agent)
|
||||||
|
.filter(Agent.name == rc["name"], Agent.user_id == user_id)
|
||||||
|
.first()
|
||||||
|
)
|
||||||
|
if existing:
|
||||||
|
created_agents.append({"agent": existing, **rc})
|
||||||
|
logger.info("复用已有 Agent: %s", rc["name"])
|
||||||
|
continue
|
||||||
|
|
||||||
|
agent = Agent(
|
||||||
|
id=str(uuid.uuid4()),
|
||||||
|
name=rc["name"],
|
||||||
|
description=rc["description"],
|
||||||
|
agent_type="specialist",
|
||||||
|
user_id=user_id,
|
||||||
|
workspace_id=workspace_id,
|
||||||
|
workflow_config={
|
||||||
|
"nodes": [
|
||||||
|
{"id": "start-1", "type": "start", "position": {"x": 80, "y": 120}, "data": {}},
|
||||||
|
{
|
||||||
|
"id": "llm-1",
|
||||||
|
"type": "llm",
|
||||||
|
"position": {"x": 320, "y": 120},
|
||||||
|
"data": {
|
||||||
|
"prompt": rc["system_prompt"],
|
||||||
|
"temperature": rc["temperature"],
|
||||||
|
"model": rc["model"],
|
||||||
|
"provider": "deepseek",
|
||||||
|
"enable_tools": True,
|
||||||
|
"tools": rc["tools"],
|
||||||
|
"selected_tools": rc["tools"],
|
||||||
|
"max_iterations": rc["max_iterations"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{"id": "end-1", "type": "end", "position": {"x": 560, "y": 120}, "data": {}},
|
||||||
|
],
|
||||||
|
"edges": [
|
||||||
|
{"id": "e1", "source": "start-1", "target": "llm-1", "sourceHandle": "right", "targetHandle": "left"},
|
||||||
|
{"id": "e2", "source": "llm-1", "target": "end-1", "sourceHandle": "right", "targetHandle": "left"},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
status="published",
|
||||||
|
category="team_role",
|
||||||
|
tags=[rc["role"], "tech_doc", "virtual_team"],
|
||||||
|
)
|
||||||
|
self.db.add(agent)
|
||||||
|
self.db.flush()
|
||||||
|
created_agents.append({"agent": agent, **rc})
|
||||||
|
logger.info("创建 Agent: %s", rc["name"])
|
||||||
|
|
||||||
|
team = Team(
|
||||||
|
id=str(uuid.uuid4()),
|
||||||
|
name="技术文档团队",
|
||||||
|
description="包含文档架构师、技术写手、API文档专员、翻译审校、发布管理五个角色的专业技术文档团队",
|
||||||
|
workspace_id=workspace_id,
|
||||||
|
user_id=user_id,
|
||||||
|
is_template=True,
|
||||||
|
config={"workflow": "tech_doc", "roles": list(TECH_DOC_ROLES.keys())},
|
||||||
|
)
|
||||||
|
self.db.add(team)
|
||||||
|
self.db.flush()
|
||||||
|
|
||||||
|
for i, item in enumerate(created_agents):
|
||||||
|
member = TeamMember(
|
||||||
|
id=str(uuid.uuid4()),
|
||||||
|
team_id=team.id,
|
||||||
|
agent_id=item["agent"].id,
|
||||||
|
role=item["role"],
|
||||||
|
position=i,
|
||||||
|
is_lead=item.get("is_lead", False),
|
||||||
|
)
|
||||||
|
self.db.add(member)
|
||||||
|
|
||||||
|
self.db.commit()
|
||||||
|
self.db.refresh(team)
|
||||||
|
|
||||||
|
logger.info("创建技术文档团队: %s (%d 名成员)", team.id, len(created_agents))
|
||||||
|
return team.to_dict(include_members=True)
|
||||||
|
|
||||||
|
|
||||||
def get_preset_roles() -> Dict[str, Any]:
|
def get_preset_roles() -> Dict[str, Any]:
|
||||||
"""返回所有预置角色定义(供前端展示)。"""
|
"""返回所有预置角色定义(供前端展示)。"""
|
||||||
return {**PRESET_ROLES, **EDUCATION_ROLES, **PLATFORM_ENGINEERING_ROLES}
|
return {**PRESET_ROLES, **EDUCATION_ROLES, **PLATFORM_ENGINEERING_ROLES, **TECH_DOC_ROLES}
|
||||||
|
|||||||
@@ -117,6 +117,13 @@ export function createPlatformEngineeringTemplate(workspaceId?: string) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 一键创建技术文档团队模板 */
|
||||||
|
export function createTechDocTemplate(workspaceId?: string) {
|
||||||
|
return api.post('/api/v1/teams/template/tech-documentation', null, {
|
||||||
|
params: workspaceId ? { workspace_id: workspaceId } : {},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
/** 添加团队成员 */
|
/** 添加团队成员 */
|
||||||
export function addMember(teamId: string, data: {
|
export function addMember(teamId: string, data: {
|
||||||
agent_id: string
|
agent_id: string
|
||||||
|
|||||||
@@ -22,6 +22,9 @@
|
|||||||
<el-button type="danger" @click="handleCreatePlatformTemplate" :loading="creatingPlatformTemplate">
|
<el-button type="danger" @click="handleCreatePlatformTemplate" :loading="creatingPlatformTemplate">
|
||||||
<el-icon><MagicStick /></el-icon> 天工平台工程团队
|
<el-icon><MagicStick /></el-icon> 天工平台工程团队
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<el-button type="info" @click="handleCreateTechDocTemplate" :loading="creatingTechDocTemplate">
|
||||||
|
<el-icon><MagicStick /></el-icon> 技术文档团队
|
||||||
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
<div class="toolbar-right">
|
<div class="toolbar-right">
|
||||||
<el-select v-model="selectedTeamId" placeholder="加载已有团队" clearable style="width: 220px" @change="handleLoadTeam">
|
<el-select v-model="selectedTeamId" placeholder="加载已有团队" clearable style="width: 220px" @change="handleLoadTeam">
|
||||||
@@ -290,7 +293,7 @@ import {
|
|||||||
} from '@element-plus/icons-vue'
|
} from '@element-plus/icons-vue'
|
||||||
import {
|
import {
|
||||||
listTeams, getTeam, createTeam, updateTeam, createSoftwareCompanyTemplate,
|
listTeams, getTeam, createTeam, updateTeam, createSoftwareCompanyTemplate,
|
||||||
createEducationTrainingTemplate, createPlatformEngineeringTemplate, addMember, removeMember, executeProject, getPresetRoles,
|
createEducationTrainingTemplate, createPlatformEngineeringTemplate, createTechDocTemplate, addMember, removeMember, executeProject, getPresetRoles,
|
||||||
} from '@/api/teams'
|
} from '@/api/teams'
|
||||||
import api from '@/api'
|
import api from '@/api'
|
||||||
import { marked } from 'marked'
|
import { marked } from 'marked'
|
||||||
@@ -322,6 +325,7 @@ const saving = ref(false)
|
|||||||
const creatingTemplate = ref(false)
|
const creatingTemplate = ref(false)
|
||||||
const creatingEduTemplate = ref(false)
|
const creatingEduTemplate = ref(false)
|
||||||
const creatingPlatformTemplate = ref(false)
|
const creatingPlatformTemplate = ref(false)
|
||||||
|
const creatingTechDocTemplate = ref(false)
|
||||||
const loadingTeams = ref(false)
|
const loadingTeams = ref(false)
|
||||||
|
|
||||||
// Agent
|
// Agent
|
||||||
@@ -560,6 +564,36 @@ async function handleCreatePlatformTemplate() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 一键创建技术文档团队模板
|
||||||
|
async function handleCreateTechDocTemplate() {
|
||||||
|
creatingTechDocTemplate.value = true
|
||||||
|
try {
|
||||||
|
const res = await createTechDocTemplate()
|
||||||
|
const team = (res.data as any)?.data
|
||||||
|
if (team) {
|
||||||
|
currentTeamId.value = team.id
|
||||||
|
teamName.value = team.name
|
||||||
|
await loadAgents()
|
||||||
|
const slots: Record<string, any> = {}
|
||||||
|
if (team.members) {
|
||||||
|
for (const m of team.members) {
|
||||||
|
const agent = agents.value.find(a => a.id === m.agent_id)
|
||||||
|
if (agent) {
|
||||||
|
slots[m.role] = { ...agent, is_lead: m.is_lead, member_id: m.id }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
roleSlots.value = slots
|
||||||
|
ElMessage.success('技术文档团队创建成功!')
|
||||||
|
}
|
||||||
|
await loadTeams()
|
||||||
|
} catch (e: any) {
|
||||||
|
ElMessage.error(e?.response?.data?.detail || '创建模板失败')
|
||||||
|
} finally {
|
||||||
|
creatingTechDocTemplate.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 拖拽
|
// 拖拽
|
||||||
function onDragStart(agent: Agent) {
|
function onDragStart(agent: Agent) {
|
||||||
draggingAgent = agent
|
draggingAgent = agent
|
||||||
|
|||||||
Reference in New Issue
Block a user