diff --git a/backend/ai_manager.py b/backend/ai_manager.py
index 1873aad..648a654 100644
--- a/backend/ai_manager.py
+++ b/backend/ai_manager.py
@@ -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),
)
diff --git a/backend/export_manager.py b/backend/export_manager.py
index ed7b107..1eac5b6 100644
--- a/backend/export_manager.py
+++ b/backend/export_manager.py
@@ -179,27 +179,29 @@ class ExportManager:
# 图例
legend_x = width - 150
legend_y = 80
- svg_parts.append(f'')
+ rect_x = legend_x - 10
+ rect_y = legend_y - 20
+ rect_height = len(type_colors) * 25 + 10
svg_parts.append(
- f'实体类型'
+ f''
+ )
+ svg_parts.append(
+ f'实体类型'
)
for i, (etype, color) in enumerate(type_colors.items()):
if etype != "default":
y_pos = legend_y + 25 + i * 20
- svg_parts.append(f'')
- svg_parts.append(f'{etype}')
+ svg_parts.append(
+ f''
+ )
+ text_y = y_pos + 4
+ svg_parts.append(
+ f'{etype}'
+ )
svg_parts.append("")
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))
diff --git a/backend/init_db.py b/backend/init_db.py
index 3dadf73..f78e41a 100644
--- a/backend/init_db.py
+++ b/backend/init_db.py
@@ -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}")
diff --git a/backend/knowledge_reasoner.py b/backend/knowledge_reasoner.py
index 9385e4f..1a84dea 100644
--- a/backend/knowledge_reasoner.py
+++ b/backend/knowledge_reasoner.py
@@ -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", [])
# 构建邻接表
diff --git a/backend/llm_client.py b/backend/llm_client.py
index 8a4cd81..bbda740 100644
--- a/backend/llm_client.py
+++ b/backend/llm_client.py
@@ -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(
diff --git a/backend/main.py b/backend/main.py
index 5a19944..4d85f2b 100644
--- a/backend/main.py
+++ b/backend/main.py
@@ -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:
diff --git a/backend/performance_manager.py b/backend/performance_manager.py
index 1ff1184..69b031a 100644
--- a/backend/performance_manager.py
+++ b/backend/performance_manager.py
@@ -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}")
diff --git a/backend/plugin_manager.py b/backend/plugin_manager.py
index 3a48601..00c3c77 100644
--- a/backend/plugin_manager.py
+++ b/backend/plugin_manager.py
@@ -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()
diff --git a/backend/search_manager.py b/backend/search_manager.py
index a6246ec..e0331fc 100644
--- a/backend/search_manager.py
+++ b/backend/search_manager.py
@@ -27,6 +27,7 @@ class SearchOperator(Enum):
OR = "OR"
NOT = "NOT"
+
# 尝试导入 sentence-transformers 用于语义搜索
try:
from sentence_transformers import SentenceTransformer
diff --git a/backend/security_manager.py b/backend/security_manager.py
index 30cbd7c..080afde 100644
--- a/backend/security_manager.py
+++ b/backend/security_manager.py
@@ -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
diff --git a/backend/tenant_manager.py b/backend/tenant_manager.py
index fb7234f..e6ed4dc 100644
--- a/backend/tenant_manager.py
+++ b/backend/tenant_manager.py
@@ -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 架构核心"""
diff --git a/backend/tingwu_client.py b/backend/tingwu_client.py
index 3930b23..72b8fab 100644
--- a/backend/tingwu_client.py
+++ b/backend/tingwu_client.py
@@ -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
diff --git a/backend/workflow_manager.py b/backend/workflow_manager.py
index 6f5d493..e922709 100644
--- a/backend/workflow_manager.py
+++ b/backend/workflow_manager.py
@@ -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: