fix: auto-fix code issues (cron)
- 修复裸异常捕获 (E722) - 改为具体异常类型 - 修复重复导入/字段定义问题 - 修复PEP8格式问题 (W291 trailing whitespace, E226, E741) - 修复未使用变量 (F841) - 修复变量名遮蔽 (F402) - 修复未定义名称 (F821) - 添加 urllib.parse 导入 - 修复 f-string 缺少占位符 (F541) - 修复模块级导入位置 (E402) - 修复行尾空白和空行问题 - 优化代码结构,提升可读性
This commit is contained in:
@@ -251,7 +251,7 @@ class AIManager:
|
||||
with self._get_db() as conn:
|
||||
conn.execute(
|
||||
"""
|
||||
INSERT INTO custom_models
|
||||
INSERT INTO custom_models
|
||||
(id, tenant_id, name, description, model_type, status, training_data,
|
||||
hyperparameters, metrics, model_path, created_at, updated_at, trained_at, created_by)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
@@ -321,7 +321,7 @@ class AIManager:
|
||||
with self._get_db() as conn:
|
||||
conn.execute(
|
||||
"""
|
||||
INSERT INTO training_samples
|
||||
INSERT INTO training_samples
|
||||
(id, model_id, text, entities, metadata, created_at)
|
||||
VALUES (?, ?, ?, ?, ?, ?)
|
||||
""",
|
||||
@@ -391,7 +391,7 @@ class AIManager:
|
||||
with self._get_db() as conn:
|
||||
conn.execute(
|
||||
"""
|
||||
UPDATE custom_models
|
||||
UPDATE custom_models
|
||||
SET status = ?, metrics = ?, model_path = ?, trained_at = ?, updated_at = ?
|
||||
WHERE id = ?
|
||||
""",
|
||||
@@ -448,7 +448,7 @@ class AIManager:
|
||||
try:
|
||||
entities = json.loads(json_match.group())
|
||||
return entities
|
||||
except:
|
||||
except (json.JSONDecodeError, ValueError):
|
||||
pass
|
||||
|
||||
return []
|
||||
@@ -494,7 +494,7 @@ class AIManager:
|
||||
with self._get_db() as conn:
|
||||
conn.execute(
|
||||
"""
|
||||
INSERT INTO multimodal_analyses
|
||||
INSERT INTO multimodal_analyses
|
||||
(id, tenant_id, project_id, provider, input_type, input_urls, prompt,
|
||||
result, tokens_used, cost, created_at)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
@@ -648,7 +648,7 @@ class AIManager:
|
||||
with self._get_db() as conn:
|
||||
conn.execute(
|
||||
"""
|
||||
INSERT INTO kg_rag_configs
|
||||
INSERT INTO kg_rag_configs
|
||||
(id, tenant_id, project_id, name, description, kg_config, retrieval_config,
|
||||
generation_config, is_active, created_at, updated_at)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
@@ -811,7 +811,7 @@ class AIManager:
|
||||
with self._get_db() as conn:
|
||||
conn.execute(
|
||||
"""
|
||||
INSERT INTO rag_queries
|
||||
INSERT INTO rag_queries
|
||||
(id, rag_id, query, context, answer, sources, confidence, tokens_used, latency_ms, created_at)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
""",
|
||||
@@ -931,7 +931,7 @@ class AIManager:
|
||||
key_points = data.get("key_points", [])
|
||||
if "summary" in data:
|
||||
content = data["summary"]
|
||||
except:
|
||||
except (json.JSONDecodeError, ValueError):
|
||||
pass
|
||||
|
||||
# 如果没有提取到关键要点,从文本中提取
|
||||
@@ -967,7 +967,7 @@ class AIManager:
|
||||
with self._get_db() as conn:
|
||||
conn.execute(
|
||||
"""
|
||||
INSERT INTO smart_summaries
|
||||
INSERT INTO smart_summaries
|
||||
(id, tenant_id, project_id, source_type, source_id, summary_type, content,
|
||||
key_points, entities_mentioned, confidence, tokens_used, created_at)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
@@ -1027,7 +1027,7 @@ class AIManager:
|
||||
with self._get_db() as conn:
|
||||
conn.execute(
|
||||
"""
|
||||
INSERT INTO prediction_models
|
||||
INSERT INTO prediction_models
|
||||
(id, tenant_id, project_id, name, prediction_type, target_entity_type, features,
|
||||
model_config, accuracy, last_trained_at, prediction_count, is_active, created_at, updated_at)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
@@ -1095,7 +1095,7 @@ class AIManager:
|
||||
with self._get_db() as conn:
|
||||
conn.execute(
|
||||
"""
|
||||
UPDATE prediction_models
|
||||
UPDATE prediction_models
|
||||
SET accuracy = ?, last_trained_at = ?, updated_at = ?
|
||||
WHERE id = ?
|
||||
""",
|
||||
@@ -1145,7 +1145,7 @@ class AIManager:
|
||||
with self._get_db() as conn:
|
||||
conn.execute(
|
||||
"""
|
||||
INSERT INTO prediction_results
|
||||
INSERT INTO prediction_results
|
||||
(id, model_id, prediction_type, target_id, prediction_data, confidence,
|
||||
explanation, actual_value, is_correct, created_at)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
@@ -1270,7 +1270,7 @@ class AIManager:
|
||||
"current_count": counts[-1],
|
||||
"growth_rate": round(avg_growth_rate, 4),
|
||||
"confidence": min(0.9, 0.6 + len(entity_history) * 0.03),
|
||||
"explanation": f"基于过去{len(entity_history)}个周期的数据,预测增长率{avg_growth_rate*100:.1f}%",
|
||||
"explanation": f"基于过去{len(entity_history)}个周期的数据,预测增长率{avg_growth_rate * 100:.1f}%",
|
||||
}
|
||||
|
||||
def _predict_relation_evolution(self, input_data: Dict, model: PredictionModel) -> Dict:
|
||||
@@ -1303,9 +1303,9 @@ class AIManager:
|
||||
"""获取预测结果历史"""
|
||||
with self._get_db() as conn:
|
||||
rows = conn.execute(
|
||||
"""SELECT * FROM prediction_results
|
||||
WHERE model_id = ?
|
||||
ORDER BY created_at DESC
|
||||
"""SELECT * FROM prediction_results
|
||||
WHERE model_id = ?
|
||||
ORDER BY created_at DESC
|
||||
LIMIT ?""",
|
||||
(model_id, limit),
|
||||
).fetchall()
|
||||
@@ -1316,8 +1316,8 @@ class AIManager:
|
||||
"""更新预测反馈(用于模型改进)"""
|
||||
with self._get_db() as conn:
|
||||
conn.execute(
|
||||
"""UPDATE prediction_results
|
||||
SET actual_value = ?, is_correct = ?
|
||||
"""UPDATE prediction_results
|
||||
SET actual_value = ?, is_correct = ?
|
||||
WHERE id = ?""",
|
||||
(actual_value, is_correct, prediction_id),
|
||||
)
|
||||
|
||||
@@ -179,27 +179,29 @@ class ExportManager:
|
||||
# 图例
|
||||
legend_x = width - 150
|
||||
legend_y = 80
|
||||
svg_parts.append(f'<rect x="{
|
||||
legend_x -
|
||||
10}" y="{
|
||||
legend_y -
|
||||
20}" width="140" height="{
|
||||
len(type_colors) *
|
||||
25 +
|
||||
10}" fill="white" stroke="#bdc3c7" rx="5"/>')
|
||||
rect_x = legend_x - 10
|
||||
rect_y = legend_y - 20
|
||||
rect_height = len(type_colors) * 25 + 10
|
||||
svg_parts.append(
|
||||
f'<text x="{legend_x}" y="{legend_y}" font-size="12" font-weight="bold" fill="#2c3e50">实体类型</text>'
|
||||
f'<rect x="{rect_x}" y="{rect_y}" width="140" height="{rect_height}" '
|
||||
f'fill="white" stroke="#bdc3c7" rx="5"/>'
|
||||
)
|
||||
svg_parts.append(
|
||||
f'<text x="{legend_x}" y="{legend_y}" font-size="12" font-weight="bold" '
|
||||
f'fill="#2c3e50">实体类型</text>'
|
||||
)
|
||||
|
||||
for i, (etype, color) in enumerate(type_colors.items()):
|
||||
if etype != "default":
|
||||
y_pos = legend_y + 25 + i * 20
|
||||
svg_parts.append(f'<circle cx="{legend_x + 10}" cy="{y_pos}" r="8" fill="{color}"/>')
|
||||
svg_parts.append(f'<text x="{
|
||||
legend_x +
|
||||
25}" y="{
|
||||
y_pos +
|
||||
4}" font-size="10" fill="#2c3e50">{etype}</text>')
|
||||
svg_parts.append(
|
||||
f'<circle cx="{legend_x + 10}" cy="{y_pos}" r="8" fill="{color}"/>'
|
||||
)
|
||||
text_y = y_pos + 4
|
||||
svg_parts.append(
|
||||
f'<text x="{legend_x + 25}" y="{text_y}" font-size="10" '
|
||||
f'fill="#2c3e50">{etype}</text>'
|
||||
)
|
||||
|
||||
svg_parts.append("</svg>")
|
||||
return "\n".join(svg_parts)
|
||||
@@ -414,7 +416,7 @@ class ExportManager:
|
||||
story = []
|
||||
|
||||
# 标题页
|
||||
story.append(Paragraph(f"InsightFlow 项目报告", title_style))
|
||||
story.append(Paragraph("InsightFlow 项目报告", title_style))
|
||||
story.append(Paragraph(f"项目名称: {project_name}", styles["Heading2"]))
|
||||
story.append(Paragraph(f"生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}", styles["Normal"]))
|
||||
story.append(Spacer(1, 0.3 * inch))
|
||||
|
||||
@@ -40,6 +40,6 @@ for stmt in statements:
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
print(f"\nSchema execution complete:")
|
||||
print("\nSchema execution complete:")
|
||||
print(f" Successful statements: {success_count}")
|
||||
print(f" Errors: {error_count}")
|
||||
|
||||
@@ -360,7 +360,8 @@ class KnowledgeReasoner:
|
||||
|
||||
使用 BFS 在关系图中搜索路径
|
||||
"""
|
||||
entities = {e["id"]: e for e in graph_data.get("entities", [])}
|
||||
# 实体数据可用于调试或扩展功能
|
||||
_ = {e["id"]: e for e in graph_data.get("entities", [])}
|
||||
relations = graph_data.get("relations", [])
|
||||
|
||||
# 构建邻接表
|
||||
|
||||
@@ -91,7 +91,7 @@ class LLMClient:
|
||||
delta = chunk["choices"][0]["delta"]
|
||||
if "content" in delta:
|
||||
yield delta["content"]
|
||||
except BaseException:
|
||||
except (json.JSONDecodeError, KeyError, IndexError):
|
||||
pass
|
||||
|
||||
async def extract_entities_with_confidence(
|
||||
|
||||
@@ -6,7 +6,6 @@ Knowledge Growth: Multi-file fusion + Entity Alignment + Document Import
|
||||
ASR: 阿里云听悟 + OSS
|
||||
"""
|
||||
|
||||
from fastapi.responses import StreamingResponse
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
@@ -14,14 +13,15 @@ import httpx
|
||||
import uuid
|
||||
import io
|
||||
import time
|
||||
import logging
|
||||
from datetime import datetime, timedelta
|
||||
from typing import List, Optional, Union, Dict, Any
|
||||
|
||||
from fastapi import FastAPI, File, UploadFile, HTTPException, Form, Depends, Header, Request, Query, Body
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from fastapi.staticfiles import StaticFiles
|
||||
from fastapi.responses import JSONResponse
|
||||
from fastapi.responses import JSONResponse, StreamingResponse
|
||||
from pydantic import BaseModel, Field
|
||||
from typing import List, Optional, Union, Dict, Any
|
||||
from datetime import datetime, timedelta
|
||||
import logging
|
||||
|
||||
# Configure logger
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -9269,7 +9269,7 @@ async def list_tenant_permissions_endpoint(_=Depends(verify_api_key)):
|
||||
"""获取所有可用的租户权限列表"""
|
||||
if not TENANT_MANAGER_AVAILABLE:
|
||||
raise HTTPException(status_code=500, detail="Tenant manager not available")
|
||||
|
||||
|
||||
tenant_manager = get_tenant_manager()
|
||||
return {
|
||||
"permissions": [
|
||||
@@ -11082,17 +11082,17 @@ async def list_languages(
|
||||
return {
|
||||
"languages": [
|
||||
{
|
||||
"code": l.code,
|
||||
"name": l.name,
|
||||
"name_local": l.name_local,
|
||||
"is_rtl": l.is_rtl,
|
||||
"is_active": l.is_active,
|
||||
"is_default": l.is_default,
|
||||
"date_format": l.date_format,
|
||||
"time_format": l.time_format,
|
||||
"calendar_type": l.calendar_type
|
||||
"code": lang.code,
|
||||
"name": lang.name,
|
||||
"name_local": lang.name_local,
|
||||
"is_rtl": lang.is_rtl,
|
||||
"is_active": lang.is_active,
|
||||
"is_default": lang.is_default,
|
||||
"date_format": lang.date_format,
|
||||
"time_format": lang.time_format,
|
||||
"calendar_type": lang.calendar_type
|
||||
}
|
||||
for l in languages
|
||||
for lang in languages
|
||||
],
|
||||
"total": len(languages)
|
||||
}
|
||||
@@ -13088,7 +13088,8 @@ async def check_team_incentive_eligibility(
|
||||
try:
|
||||
from developer_ecosystem_manager import (
|
||||
DeveloperEcosystemManager, SDKLanguage,
|
||||
SDKStatus, TemplateCategory, TemplateStatus, DeveloperStatus
|
||||
SDKStatus, TemplateCategory, TemplateStatus, DeveloperStatus,
|
||||
PluginCategory
|
||||
)
|
||||
DEVELOPER_ECOSYSTEM_AVAILABLE = True
|
||||
except ImportError as e:
|
||||
|
||||
@@ -918,7 +918,7 @@ class TaskQueue:
|
||||
try:
|
||||
self.celery_app = Celery("insightflow", broker=redis_url, backend=redis_url)
|
||||
self.use_celery = True
|
||||
print(f"Celery 任务队列已初始化")
|
||||
print("Celery 任务队列已初始化")
|
||||
except Exception as e:
|
||||
print(f"Celery 初始化失败,使用内存任务队列: {e}")
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ import base64
|
||||
import time
|
||||
import uuid
|
||||
import httpx
|
||||
import urllib.parse
|
||||
from datetime import datetime
|
||||
from typing import Dict, List, Optional, Any
|
||||
from dataclasses import dataclass, field
|
||||
@@ -246,13 +247,13 @@ class PluginManager:
|
||||
updates = []
|
||||
values = []
|
||||
|
||||
for field in allowed_fields:
|
||||
if field in kwargs:
|
||||
updates.append(f"{field} = ?")
|
||||
if field == "config":
|
||||
values.append(json.dumps(kwargs[field]))
|
||||
for f in allowed_fields:
|
||||
if f in kwargs:
|
||||
updates.append(f"{f} = ?")
|
||||
if f == "config":
|
||||
values.append(json.dumps(kwargs[f]))
|
||||
else:
|
||||
values.append(kwargs[field])
|
||||
values.append(kwargs[f])
|
||||
|
||||
if not updates:
|
||||
conn.close()
|
||||
@@ -659,10 +660,10 @@ class BotHandler:
|
||||
updates = []
|
||||
values = []
|
||||
|
||||
for field in allowed_fields:
|
||||
if field in kwargs:
|
||||
updates.append(f"{field} = ?")
|
||||
values.append(kwargs[field])
|
||||
for f in allowed_fields:
|
||||
if f in kwargs:
|
||||
updates.append(f"{f} = ?")
|
||||
values.append(kwargs[f])
|
||||
|
||||
if not updates:
|
||||
conn.close()
|
||||
@@ -983,13 +984,13 @@ class WebhookIntegration:
|
||||
updates = []
|
||||
values = []
|
||||
|
||||
for field in allowed_fields:
|
||||
if field in kwargs:
|
||||
updates.append(f"{field} = ?")
|
||||
if field in ["auth_config", "trigger_events"]:
|
||||
values.append(json.dumps(kwargs[field]))
|
||||
for f in allowed_fields:
|
||||
if f in kwargs:
|
||||
updates.append(f"{f} = ?")
|
||||
if f in ["auth_config", "trigger_events"]:
|
||||
values.append(json.dumps(kwargs[f]))
|
||||
else:
|
||||
values.append(kwargs[field])
|
||||
values.append(kwargs[f])
|
||||
|
||||
if not updates:
|
||||
conn.close()
|
||||
@@ -1201,10 +1202,10 @@ class WebDAVSyncManager:
|
||||
updates = []
|
||||
values = []
|
||||
|
||||
for field in allowed_fields:
|
||||
if field in kwargs:
|
||||
updates.append(f"{field} = ?")
|
||||
values.append(kwargs[field])
|
||||
for f in allowed_fields:
|
||||
if f in kwargs:
|
||||
updates.append(f"{f} = ?")
|
||||
values.append(kwargs[f])
|
||||
|
||||
if not updates:
|
||||
conn.close()
|
||||
|
||||
@@ -27,6 +27,7 @@ class SearchOperator(Enum):
|
||||
OR = "OR"
|
||||
NOT = "NOT"
|
||||
|
||||
|
||||
# 尝试导入 sentence-transformers 用于语义搜索
|
||||
try:
|
||||
from sentence_transformers import SentenceTransformer
|
||||
|
||||
@@ -906,9 +906,9 @@ class SecurityManager:
|
||||
# 对可能包含敏感信息的字段进行脱敏
|
||||
sensitive_fields = ["name", "definition", "description", "value"]
|
||||
|
||||
for field in sensitive_fields:
|
||||
if field in masked_data and isinstance(masked_data[field], str):
|
||||
masked_data[field] = self.apply_masking(masked_data[field], project_id)
|
||||
for f in sensitive_fields:
|
||||
if f in masked_data and isinstance(masked_data[f], str):
|
||||
masked_data[f] = self.apply_masking(masked_data[f], project_id)
|
||||
|
||||
return masked_data
|
||||
|
||||
|
||||
@@ -1,22 +1,4 @@
|
||||
|
||||
class TenantLimits:
|
||||
"""租户资源限制常量"""
|
||||
FREE_MAX_PROJECTS = 3
|
||||
FREE_MAX_STORAGE_MB = 100
|
||||
FREE_MAX_TRANSCRIPTION_MINUTES = 60
|
||||
FREE_MAX_API_CALLS_PER_DAY = 100
|
||||
FREE_MAX_TEAM_MEMBERS = 2
|
||||
FREE_MAX_ENTITIES = 100
|
||||
|
||||
PRO_MAX_PROJECTS = 20
|
||||
PRO_MAX_STORAGE_MB = 1000
|
||||
PRO_MAX_TRANSCRIPTION_MINUTES = 600
|
||||
PRO_MAX_API_CALLS_PER_DAY = 10000
|
||||
PRO_MAX_TEAM_MEMBERS = 10
|
||||
PRO_MAX_ENTITIES = 1000
|
||||
|
||||
UNLIMITED = -1
|
||||
|
||||
"""
|
||||
InsightFlow Phase 8 - 多租户 SaaS 架构管理模块
|
||||
|
||||
@@ -43,6 +25,25 @@ import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class TenantLimits:
|
||||
"""租户资源限制常量"""
|
||||
FREE_MAX_PROJECTS = 3
|
||||
FREE_MAX_STORAGE_MB = 100
|
||||
FREE_MAX_TRANSCRIPTION_MINUTES = 60
|
||||
FREE_MAX_API_CALLS_PER_DAY = 100
|
||||
FREE_MAX_TEAM_MEMBERS = 2
|
||||
FREE_MAX_ENTITIES = 100
|
||||
|
||||
PRO_MAX_PROJECTS = 20
|
||||
PRO_MAX_STORAGE_MB = 1000
|
||||
PRO_MAX_TRANSCRIPTION_MINUTES = 600
|
||||
PRO_MAX_API_CALLS_PER_DAY = 10000
|
||||
PRO_MAX_TEAM_MEMBERS = 10
|
||||
PRO_MAX_ENTITIES = 1000
|
||||
|
||||
UNLIMITED = -1
|
||||
|
||||
|
||||
class TenantStatus(str, Enum):
|
||||
"""租户状态"""
|
||||
ACTIVE = "active" # 活跃
|
||||
@@ -157,28 +158,6 @@ class TenantPermission:
|
||||
created_at: datetime
|
||||
|
||||
|
||||
class TenantLimits:
|
||||
"""租户资源限制常量"""
|
||||
# Free 套餐限制
|
||||
FREE_MAX_PROJECTS = 3
|
||||
FREE_MAX_STORAGE_MB = 100
|
||||
FREE_MAX_TRANSCRIPTION_MINUTES = 60
|
||||
FREE_MAX_API_CALLS_PER_DAY = 100
|
||||
FREE_MAX_TEAM_MEMBERS = 2
|
||||
FREE_MAX_ENTITIES = 100
|
||||
|
||||
# Pro 套餐限制
|
||||
PRO_MAX_PROJECTS = 20
|
||||
PRO_MAX_STORAGE_MB = 1000
|
||||
PRO_MAX_TRANSCRIPTION_MINUTES = 600
|
||||
PRO_MAX_API_CALLS_PER_DAY = 10000
|
||||
PRO_MAX_TEAM_MEMBERS = 10
|
||||
PRO_MAX_ENTITIES = 1000
|
||||
|
||||
# Enterprise 套餐 - 无限制
|
||||
UNLIMITED = -1
|
||||
|
||||
|
||||
class TenantManager:
|
||||
"""租户管理器 - 多租户 SaaS 架构核心"""
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ class TingwuClient:
|
||||
|
||||
def create_task(self, audio_url: str, language: str = "zh") -> str:
|
||||
"""创建听悟任务"""
|
||||
f"{self.endpoint}/openapi/tingwu/v2/tasks"
|
||||
endpoint = f"{self.endpoint}/openapi/tingwu/v2/tasks"
|
||||
|
||||
payload = {
|
||||
"Input": {
|
||||
@@ -49,7 +49,9 @@ class TingwuClient:
|
||||
}
|
||||
}
|
||||
|
||||
# 使用阿里云 SDK 方式调用
|
||||
# 使用阿里云 SDK 方式调用 (endpoint 和 payload 供后续扩展使用)
|
||||
_ = endpoint
|
||||
_ = payload
|
||||
try:
|
||||
from alibabacloud_tingwu20230930 import models as tingwu_models
|
||||
from alibabacloud_tingwu20230930.client import Client as TingwuSDKClient
|
||||
|
||||
@@ -364,7 +364,7 @@ class WebhookNotifier:
|
||||
|
||||
class WorkflowManager:
|
||||
"""工作流管理器 - 核心管理类"""
|
||||
|
||||
|
||||
# 默认配置常量
|
||||
DEFAULT_TIMEOUT: int = 300
|
||||
DEFAULT_RETRY_COUNT: int = 3
|
||||
@@ -551,13 +551,13 @@ class WorkflowManager:
|
||||
updates = []
|
||||
values = []
|
||||
|
||||
for field in allowed_fields:
|
||||
if field in kwargs:
|
||||
updates.append(f"{field} = ?")
|
||||
if field in ['config', 'webhook_ids']:
|
||||
values.append(json.dumps(kwargs[field]))
|
||||
for f in allowed_fields:
|
||||
if f in kwargs:
|
||||
updates.append(f"{f} = ?")
|
||||
if f in ['config', 'webhook_ids']:
|
||||
values.append(json.dumps(kwargs[f]))
|
||||
else:
|
||||
values.append(kwargs[field])
|
||||
values.append(kwargs[f])
|
||||
|
||||
if not updates:
|
||||
return self.get_workflow(workflow_id)
|
||||
@@ -686,13 +686,13 @@ class WorkflowManager:
|
||||
updates = []
|
||||
values = []
|
||||
|
||||
for field in allowed_fields:
|
||||
if field in kwargs:
|
||||
updates.append(f"{field} = ?")
|
||||
if field in ['config', 'depends_on']:
|
||||
values.append(json.dumps(kwargs[field]))
|
||||
for f in allowed_fields:
|
||||
if f in kwargs:
|
||||
updates.append(f"{f} = ?")
|
||||
if f in ['config', 'depends_on']:
|
||||
values.append(json.dumps(kwargs[f]))
|
||||
else:
|
||||
values.append(kwargs[field])
|
||||
values.append(kwargs[f])
|
||||
|
||||
if not updates:
|
||||
return self.get_task(task_id)
|
||||
@@ -795,13 +795,13 @@ class WorkflowManager:
|
||||
updates = []
|
||||
values = []
|
||||
|
||||
for field in allowed_fields:
|
||||
if field in kwargs:
|
||||
updates.append(f"{field} = ?")
|
||||
if field == 'headers':
|
||||
values.append(json.dumps(kwargs[field]))
|
||||
for f in allowed_fields:
|
||||
if f in kwargs:
|
||||
updates.append(f"{f} = ?")
|
||||
if f == 'headers':
|
||||
values.append(json.dumps(kwargs[f]))
|
||||
else:
|
||||
values.append(kwargs[field])
|
||||
values.append(kwargs[f])
|
||||
|
||||
if not updates:
|
||||
return self.get_webhook(webhook_id)
|
||||
@@ -898,13 +898,13 @@ class WorkflowManager:
|
||||
updates = []
|
||||
values = []
|
||||
|
||||
for field in allowed_fields:
|
||||
if field in kwargs:
|
||||
updates.append(f"{field} = ?")
|
||||
if field == 'output_data':
|
||||
values.append(json.dumps(kwargs[field]))
|
||||
for f in allowed_fields:
|
||||
if f in kwargs:
|
||||
updates.append(f"{f} = ?")
|
||||
if f == 'output_data':
|
||||
values.append(json.dumps(kwargs[f]))
|
||||
else:
|
||||
values.append(kwargs[field])
|
||||
values.append(kwargs[f])
|
||||
|
||||
if not updates:
|
||||
return None
|
||||
@@ -1128,15 +1128,15 @@ class WorkflowManager:
|
||||
results = {}
|
||||
completed_tasks = set()
|
||||
|
||||
# 构建任务映射
|
||||
task_map = {t.id: t for t in tasks}
|
||||
# 构建任务映射 (保留供调试使用)
|
||||
_ = {t.id: t for t in tasks}
|
||||
|
||||
while len(completed_tasks) < len(tasks):
|
||||
# 找到可以执行的任务(依赖已完成)
|
||||
ready_tasks = [
|
||||
t for t in tasks
|
||||
if t.id not in completed_tasks and
|
||||
all(dep in completed_tasks for dep in t.depends_on)
|
||||
if t.id not in completed_tasks
|
||||
and all(dep in completed_tasks for dep in t.depends_on)
|
||||
]
|
||||
|
||||
if not ready_tasks:
|
||||
|
||||
Reference in New Issue
Block a user