mirror of
https://github.com/open-webui/open-webui.git
synced 2025-12-13 12:55:19 +00:00
Merge branch 'main' into panchen/dev_hide
This commit is contained in:
commit
fb711c6964
9 changed files with 5165 additions and 2911 deletions
|
|
@ -1435,83 +1435,135 @@ async def chat_completion(
|
|||
form_data: dict,
|
||||
user=Depends(get_verified_user),
|
||||
):
|
||||
if not request.app.state.MODELS:
|
||||
await get_all_models(request, user=user)
|
||||
"""
|
||||
聊天完成接口 - 处理用户与 AI 模型的对话请求
|
||||
|
||||
model_id = form_data.get("model", None)
|
||||
model_item = form_data.pop("model_item", {})
|
||||
tasks = form_data.pop("background_tasks", None)
|
||||
核心功能:
|
||||
1. 模型验证: 检查模型是否存在及用户访问权限
|
||||
2. 元数据构建: 提取 chat_id, message_id, session_id 等上下文信息
|
||||
3. Payload 处理: 通过 process_chat_payload 处理消息、工具调用、文件等
|
||||
4. 聊天执行: 调用 chat_completion_handler 与 LLM 交互
|
||||
5. 响应处理: 通过 process_chat_response 处理流式/非流式响应
|
||||
6. 异步任务: 如果有 session_id,创建后台任务异步执行
|
||||
|
||||
Args:
|
||||
request: FastAPI Request 对象
|
||||
form_data: 聊天请求数据,包含:
|
||||
- model: 模型 ID
|
||||
- messages: 对话历史 (OpenAI 格式)
|
||||
- chat_id: 聊天会话 ID
|
||||
- id: 消息 ID
|
||||
- session_id: 会话 ID (用于异步任务)
|
||||
- tool_ids: 工具 ID 列表
|
||||
- files: 附加文件列表
|
||||
- stream: 是否流式响应
|
||||
user: 已验证的用户对象
|
||||
|
||||
Returns:
|
||||
- 同步模式: 返回 LLM 响应 (流式 StreamingResponse 或完整 JSON)
|
||||
- 异步模式: 返回 {"status": True, "task_id": "xxx"}
|
||||
|
||||
Raises:
|
||||
HTTPException 400: 模型不存在、无访问权限、参数错误
|
||||
HTTPException 404: Chat 不存在
|
||||
|
||||
处理流程:
|
||||
1. 加载所有模型到 app.state.MODELS
|
||||
2. 验证模型访问权限 (check_model_access)
|
||||
3. 构建 metadata (包含 user_id, chat_id, tool_ids 等)
|
||||
4. 定义 process_chat 内部函数:
|
||||
- 调用 process_chat_payload (处理 Pipeline/Filter/Tools)
|
||||
- 调用 chat_completion_handler (与 LLM 交互)
|
||||
- 更新数据库消息记录
|
||||
- 调用 process_chat_response (处理响应、事件发射)
|
||||
5. 根据是否有 session_id 决定同步/异步执行
|
||||
"""
|
||||
# === 1. 初始化阶段:加载模型列表 ===
|
||||
if not request.app.state.MODELS:
|
||||
await get_all_models(request, user=user) # 从数据库和后端服务加载所有可用模型
|
||||
|
||||
# === 2. 提取请求参数 ===
|
||||
model_id = form_data.get("model", None) # 用户选择的模型 ID (如 "gpt-4")
|
||||
model_item = form_data.pop("model_item", {}) # 模型元数据 (包含 direct 标志)
|
||||
tasks = form_data.pop("background_tasks", None) # 后台任务列表
|
||||
|
||||
metadata = {}
|
||||
try:
|
||||
# === 3. 模型验证与权限检查 ===
|
||||
if not model_item.get("direct", False):
|
||||
# 标准模式:使用平台内置模型
|
||||
if model_id not in request.app.state.MODELS:
|
||||
raise Exception("Model not found")
|
||||
|
||||
model = request.app.state.MODELS[model_id] # 从缓存获取模型配置
|
||||
model_info = Models.get_model_by_id(model_id) # 从数据库获取模型详细信息
|
||||
|
||||
model = request.app.state.MODELS[model_id]
|
||||
model_info = Models.get_model_by_id(model_id)
|
||||
|
||||
# Check if user has access to the model
|
||||
# 检查用户是否有权限访问该模型
|
||||
if not BYPASS_MODEL_ACCESS_CONTROL and (
|
||||
user.role != "admin" or not BYPASS_ADMIN_ACCESS_CONTROL
|
||||
):
|
||||
try:
|
||||
check_model_access(user, model)
|
||||
check_model_access(user, model) # 检查 RBAC 权限
|
||||
except Exception as e:
|
||||
raise e
|
||||
else:
|
||||
# Direct 模式:用户直接传入 OpenAI API 等外部模型配置
|
||||
model = model_item
|
||||
model_info = None
|
||||
|
||||
request.state.direct = True
|
||||
request.state.direct = True # 标记为直连模式
|
||||
request.state.model = model
|
||||
|
||||
# === 4. 提取模型参数 ===
|
||||
model_info_params = (
|
||||
model_info.params.model_dump() if model_info and model_info.params else {}
|
||||
)
|
||||
|
||||
# Chat Params
|
||||
# 流式响应分块大小 (用于控制 SSE 推送频率)
|
||||
stream_delta_chunk_size = form_data.get("params", {}).get(
|
||||
"stream_delta_chunk_size"
|
||||
)
|
||||
# 推理标签 (用于标记 AI 的思考过程,如 <think>...</think>)
|
||||
reasoning_tags = form_data.get("params", {}).get("reasoning_tags")
|
||||
|
||||
# Model Params
|
||||
# 模型参数优先级高于请求参数
|
||||
if model_info_params.get("stream_delta_chunk_size"):
|
||||
stream_delta_chunk_size = model_info_params.get("stream_delta_chunk_size")
|
||||
|
||||
if model_info_params.get("reasoning_tags") is not None:
|
||||
reasoning_tags = model_info_params.get("reasoning_tags")
|
||||
|
||||
# === 5. 构建元数据 (metadata) - 贯穿整个处理流程的上下文 ===
|
||||
metadata = {
|
||||
"user_id": user.id,
|
||||
"chat_id": form_data.pop("chat_id", None),
|
||||
"message_id": form_data.pop("id", None),
|
||||
"session_id": form_data.pop("session_id", None),
|
||||
"filter_ids": form_data.pop("filter_ids", []),
|
||||
"tool_ids": form_data.get("tool_ids", None),
|
||||
"tool_servers": form_data.pop("tool_servers", None),
|
||||
"files": form_data.get("files", None),
|
||||
"features": form_data.get("features", {}),
|
||||
"variables": form_data.get("variables", {}),
|
||||
"model": model,
|
||||
"direct": model_item.get("direct", False),
|
||||
"chat_id": form_data.pop("chat_id", None), # 聊天会话 ID
|
||||
"message_id": form_data.pop("id", None), # 当前消息 ID
|
||||
"session_id": form_data.pop("session_id", None), # WebSocket 会话 ID (异步任务)
|
||||
"filter_ids": form_data.pop("filter_ids", []), # Pipeline Filter ID 列表
|
||||
"tool_ids": form_data.get("tool_ids", None), # 工具/函数调用 ID 列表
|
||||
"tool_servers": form_data.pop("tool_servers", None), # 外部工具服务器配置
|
||||
"files": form_data.get("files", None), # 用户上传的文件列表
|
||||
"features": form_data.get("features", {}), # 功能开关 (如 web_search)
|
||||
"variables": form_data.get("variables", {}), # 模板变量
|
||||
"model": model, # 模型配置对象
|
||||
"direct": model_item.get("direct", False), # 是否直连模式
|
||||
"params": {
|
||||
"stream_delta_chunk_size": stream_delta_chunk_size,
|
||||
"reasoning_tags": reasoning_tags,
|
||||
"function_calling": (
|
||||
"native"
|
||||
"native" # 原生函数调用 (如 OpenAI Function Calling)
|
||||
if (
|
||||
form_data.get("params", {}).get("function_calling") == "native"
|
||||
or model_info_params.get("function_calling") == "native"
|
||||
)
|
||||
else "default"
|
||||
else "default" # 默认模式 (通过 Prompt 实现)
|
||||
),
|
||||
},
|
||||
}
|
||||
|
||||
# === 6. 权限二次验证:检查用户是否拥有该 chat ===
|
||||
if metadata.get("chat_id") and (user and user.role != "admin"):
|
||||
if not metadata["chat_id"].startswith("local:"):
|
||||
if not metadata["chat_id"].startswith("local:"): # local: 前缀表示临时会话
|
||||
chat = Chats.get_chat_by_id_and_user_id(metadata["chat_id"], user.id)
|
||||
if chat is None:
|
||||
raise HTTPException(
|
||||
|
|
@ -1519,8 +1571,9 @@ async def chat_completion(
|
|||
detail=ERROR_MESSAGES.DEFAULT(),
|
||||
)
|
||||
|
||||
request.state.metadata = metadata
|
||||
form_data["metadata"] = metadata
|
||||
# === 7. 保存元数据到请求状态和 form_data ===
|
||||
request.state.metadata = metadata # 供其他中间件/处理器访问
|
||||
form_data["metadata"] = metadata # 传递给下游处理函数
|
||||
|
||||
except Exception as e:
|
||||
log.debug(f"Error processing chat metadata: {e}")
|
||||
|
|
@ -1529,13 +1582,19 @@ async def chat_completion(
|
|||
detail=str(e),
|
||||
)
|
||||
|
||||
# === 8. 定义内部处理函数 process_chat ===
|
||||
async def process_chat(request, form_data, user, metadata, model):
|
||||
"""处理完整的聊天流程:Payload 处理 → LLM 调用 → 响应处理"""
|
||||
try:
|
||||
# 8.1 Payload 预处理:执行 Pipeline Filters、工具注入、RAG 检索等
|
||||
form_data, metadata, events = await process_chat_payload(
|
||||
request, form_data, user, metadata, model
|
||||
)
|
||||
|
||||
# 8.2 调用 LLM 完成对话 (核心)
|
||||
response = await chat_completion_handler(request, form_data, user)
|
||||
|
||||
# 8.3 更新数据库:保存模型 ID 到消息记录
|
||||
if metadata.get("chat_id") and metadata.get("message_id"):
|
||||
try:
|
||||
if not metadata["chat_id"].startswith("local:"):
|
||||
|
|
@ -1549,23 +1608,28 @@ async def chat_completion(
|
|||
except:
|
||||
pass
|
||||
|
||||
# 8.4 响应后处理:执行后置 Pipeline、事件发射、任务回调等
|
||||
return await process_chat_response(
|
||||
request, response, form_data, user, metadata, model, events, tasks
|
||||
)
|
||||
|
||||
# 8.5 异常处理:取消任务
|
||||
except asyncio.CancelledError:
|
||||
log.info("Chat processing was cancelled")
|
||||
try:
|
||||
event_emitter = get_event_emitter(metadata)
|
||||
await event_emitter(
|
||||
{"type": "chat:tasks:cancel"},
|
||||
{"type": "chat:tasks:cancel"}, # 通知前端任务已取消
|
||||
)
|
||||
except Exception as e:
|
||||
pass
|
||||
|
||||
# 8.6 异常处理:记录错误到数据库并通知前端
|
||||
except Exception as e:
|
||||
log.debug(f"Error processing chat payload: {e}")
|
||||
if metadata.get("chat_id") and metadata.get("message_id"):
|
||||
# Update the chat message with the error
|
||||
try:
|
||||
# 将错误信息保存到消息记录
|
||||
if not metadata["chat_id"].startswith("local:"):
|
||||
Chats.upsert_message_to_chat_by_id_and_message_id(
|
||||
metadata["chat_id"],
|
||||
|
|
@ -1575,6 +1639,7 @@ async def chat_completion(
|
|||
},
|
||||
)
|
||||
|
||||
# 通过 WebSocket 发送错误事件到前端
|
||||
event_emitter = get_event_emitter(metadata)
|
||||
await event_emitter(
|
||||
{
|
||||
|
|
@ -1588,21 +1653,25 @@ async def chat_completion(
|
|||
|
||||
except:
|
||||
pass
|
||||
|
||||
# 8.7 清理资源:断开 MCP 客户端连接
|
||||
finally:
|
||||
try:
|
||||
if mcp_clients := metadata.get("mcp_clients"):
|
||||
for client in mcp_clients.values():
|
||||
await client.disconnect()
|
||||
await client.disconnect() # 断开 Model Context Protocol 客户端
|
||||
except Exception as e:
|
||||
log.debug(f"Error cleaning up: {e}")
|
||||
pass
|
||||
|
||||
# === 9. 决定执行模式:异步任务 vs 同步执行 ===
|
||||
if (
|
||||
metadata.get("session_id")
|
||||
and metadata.get("chat_id")
|
||||
and metadata.get("message_id")
|
||||
):
|
||||
# Asynchronous Chat Processing
|
||||
# 异步模式:创建后台任务,立即返回 task_id 给前端
|
||||
# 前端通过 WebSocket 监听任务状态和流式响应
|
||||
task_id, _ = await create_task(
|
||||
request.app.state.redis,
|
||||
process_chat(request, form_data, user, metadata, model),
|
||||
|
|
@ -1610,6 +1679,7 @@ async def chat_completion(
|
|||
)
|
||||
return {"status": True, "task_id": task_id}
|
||||
else:
|
||||
# 同步模式:直接执行并返回响应 (流式或完整)
|
||||
return await process_chat(request, form_data, user, metadata, model)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -590,7 +590,7 @@ async def signup(request: Request, response: Response, form_data: SignupForm):
|
|||
raise HTTPException(400, detail=ERROR_MESSAGES.EMAIL_TAKEN)
|
||||
|
||||
try:
|
||||
role = "admin" if not has_users else request.app.state.config.DEFAULT_USER_ROLE
|
||||
role = "admin" if not has_users else "user"
|
||||
|
||||
# The password passed to bcrypt must be 72 bytes or fewer. If it is longer, it will be truncated before hashing.
|
||||
if len(form_data.password.encode("utf-8")) > 72:
|
||||
|
|
|
|||
7213
package-lock.json
generated
7213
package-lock.json
generated
File diff suppressed because it is too large
Load diff
16
package.json
16
package.json
|
|
@ -65,24 +65,24 @@
|
|||
"@pyscript/core": "^0.4.32",
|
||||
"@sveltejs/adapter-node": "^2.0.0",
|
||||
"@sveltejs/svelte-virtual-list": "^3.0.1",
|
||||
"@tiptap/core": "^3.0.7",
|
||||
"@tiptap/extension-bubble-menu": "^2.26.1",
|
||||
"@tiptap/core": "^3.11.0",
|
||||
"@tiptap/extension-bubble-menu": "^3.11.0",
|
||||
"@tiptap/extension-code-block-lowlight": "^3.0.7",
|
||||
"@tiptap/extension-drag-handle": "^3.4.5",
|
||||
"@tiptap/extension-drag-handle": "^3.11.0",
|
||||
"@tiptap/extension-file-handler": "^3.0.7",
|
||||
"@tiptap/extension-floating-menu": "^2.26.1",
|
||||
"@tiptap/extension-highlight": "^3.3.0",
|
||||
"@tiptap/extension-floating-menu": "^3.11.0",
|
||||
"@tiptap/extension-highlight": "^3.11.0",
|
||||
"@tiptap/extension-image": "^3.0.7",
|
||||
"@tiptap/extension-link": "^3.0.7",
|
||||
"@tiptap/extension-list": "^3.0.7",
|
||||
"@tiptap/extension-mention": "^3.0.9",
|
||||
"@tiptap/extension-mention": "^3.11.0",
|
||||
"@tiptap/extension-table": "^3.0.7",
|
||||
"@tiptap/extension-typography": "^3.0.7",
|
||||
"@tiptap/extension-youtube": "^3.0.7",
|
||||
"@tiptap/extensions": "^3.0.7",
|
||||
"@tiptap/pm": "^3.0.7",
|
||||
"@tiptap/starter-kit": "^3.0.7",
|
||||
"@tiptap/suggestion": "^3.4.2",
|
||||
"@tiptap/starter-kit": "^3.11.0",
|
||||
"@tiptap/suggestion": "^3.11.0",
|
||||
"@xyflow/svelte": "^0.1.19",
|
||||
"alpinejs": "^3.15.0",
|
||||
"async": "^3.2.5",
|
||||
|
|
|
|||
|
|
@ -161,9 +161,9 @@
|
|||
</button>
|
||||
</Tooltip>
|
||||
{/if}
|
||||
{/if}
|
||||
{/if} -->
|
||||
|
||||
{#if $mobile && !$temporaryChatEnabled && chat && chat.id}
|
||||
<!-- {#if $mobile && !$temporaryChatEnabled && chat && chat.id}
|
||||
<Tooltip content={$i18n.t('New Chat')}>
|
||||
<button
|
||||
class=" flex {$showSidebar
|
||||
|
|
@ -179,9 +179,9 @@
|
|||
</div>
|
||||
</button>
|
||||
</Tooltip>
|
||||
{/if}
|
||||
{/if} -->
|
||||
|
||||
{#if shareEnabled && chat && (chat.id || $temporaryChatEnabled)}
|
||||
<!-- {#if shareEnabled && chat && (chat.id || $temporaryChatEnabled)}
|
||||
<Menu
|
||||
{chat}
|
||||
{shareEnabled}
|
||||
|
|
@ -202,7 +202,7 @@
|
|||
</div>
|
||||
</button>
|
||||
</Menu>
|
||||
{/if}
|
||||
{/if} -->
|
||||
|
||||
<!-- ai-friend 屏蔽对话高级设置 -->
|
||||
{#if false}
|
||||
|
|
@ -223,7 +223,7 @@
|
|||
{/if}
|
||||
{/if}
|
||||
|
||||
{#if $user !== undefined && $user !== null}
|
||||
<!-- {#if $user !== undefined && $user !== null}
|
||||
<UserMenu
|
||||
className="max-w-[240px]"
|
||||
role={$user?.role}
|
||||
|
|
@ -248,7 +248,7 @@
|
|||
</div>
|
||||
</div>
|
||||
</UserMenu>
|
||||
{/if}
|
||||
{/if} -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -617,8 +617,8 @@
|
|||
<div class=" self-center flex items-center justify-center size-9">
|
||||
<img
|
||||
crossorigin="anonymous"
|
||||
src="{WEBUI_BASE_URL}/static/favicon.png"
|
||||
class="sidebar-new-chat-icon size-6 rounded-full group-hover:hidden"
|
||||
src="static/favicon.png"
|
||||
class="sidebar-new-chat-icon size-6 rounded-full group-hover:hidden invert"
|
||||
alt=""
|
||||
/>
|
||||
|
||||
|
|
@ -650,8 +650,31 @@
|
|||
</a>
|
||||
</Tooltip>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="">
|
||||
<Tooltip content={$i18n.t('Memory')} placement="right">
|
||||
<a
|
||||
id="sidebar-memory-button"
|
||||
class=" cursor-pointer flex rounded-xl hover:bg-gray-100 dark:hover:bg-gray-850 transition group"
|
||||
href="/memories"
|
||||
draggable="false"
|
||||
on:click={async (e) => {
|
||||
e.stopImmediatePropagation();
|
||||
e.preventDefault();
|
||||
|
||||
goto('/memories');
|
||||
itemClickHandler();
|
||||
}}
|
||||
aria-label={$i18n.t('Memory')}
|
||||
>
|
||||
<div class=" self-center flex items-center justify-center size-9">
|
||||
<Sparkles strokeWidth="2" className="size-4.5" />
|
||||
</div>
|
||||
</a>
|
||||
</Tooltip>
|
||||
</div>
|
||||
|
||||
<!-- <div class="">
|
||||
<Tooltip content={$i18n.t('Search')} placement="right">
|
||||
<button
|
||||
class=" cursor-pointer flex rounded-xl hover:bg-gray-100 dark:hover:bg-gray-850 transition group"
|
||||
|
|
@ -669,9 +692,9 @@
|
|||
</div>
|
||||
</button>
|
||||
</Tooltip>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
{#if ($config?.features?.enable_notes ?? false) && ($user?.role === 'admin' || ($user?.permissions?.features?.notes ?? true))}
|
||||
<!-- {#if ($config?.features?.enable_notes ?? false) && ($user?.role === 'admin' || ($user?.permissions?.features?.notes ?? true))}
|
||||
<div class="">
|
||||
<Tooltip content={$i18n.t('Notes')} placement="right">
|
||||
<a
|
||||
|
|
@ -693,9 +716,9 @@
|
|||
</a>
|
||||
</Tooltip>
|
||||
</div>
|
||||
{/if}
|
||||
{/if} -->
|
||||
|
||||
{#if $user?.role === 'admin' || $user?.permissions?.workspace?.models || $user?.permissions?.workspace?.knowledge || $user?.permissions?.workspace?.prompts || $user?.permissions?.workspace?.tools}
|
||||
<!-- {#if $user?.role === 'admin' || $user?.permissions?.workspace?.models || $user?.permissions?.workspace?.knowledge || $user?.permissions?.workspace?.prompts || $user?.permissions?.workspace?.tools}
|
||||
<div class="">
|
||||
<Tooltip content={$i18n.t('Workspace')} placement="right">
|
||||
<a
|
||||
|
|
@ -730,7 +753,7 @@
|
|||
</a>
|
||||
</Tooltip>
|
||||
</div>
|
||||
{/if}
|
||||
{/if} -->
|
||||
</div>
|
||||
</button>
|
||||
|
||||
|
|
@ -795,8 +818,8 @@
|
|||
>
|
||||
<img
|
||||
crossorigin="anonymous"
|
||||
src="{WEBUI_BASE_URL}/static/favicon.png"
|
||||
class="sidebar-new-chat-icon size-6 rounded-full"
|
||||
src="static/favicon.png"
|
||||
class="sidebar-new-chat-icon size-6 rounded-full invert"
|
||||
alt=""
|
||||
/>
|
||||
</a>
|
||||
|
|
@ -862,7 +885,7 @@
|
|||
</a>
|
||||
</div>
|
||||
|
||||
<div class="px-[7px] flex justify-center text-gray-800 dark:text-gray-200">
|
||||
<!-- <div class="px-[7px] flex justify-center text-gray-800 dark:text-gray-200">
|
||||
<button
|
||||
id="sidebar-search-button"
|
||||
class="grow flex items-center space-x-3 rounded-2xl px-2.5 py-2 hover:bg-gray-100 dark:hover:bg-gray-900 transition outline-none"
|
||||
|
|
@ -880,7 +903,7 @@
|
|||
<div class=" self-center text-sm font-primary">{$i18n.t('Search')}</div>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<div class="px-[7px] flex justify-center text-gray-800 dark:text-gray-200">
|
||||
<a
|
||||
|
|
@ -901,7 +924,7 @@
|
|||
</a>
|
||||
</div>
|
||||
|
||||
{#if ($config?.features?.enable_notes ?? false) && ($user?.role === 'admin' || ($user?.permissions?.features?.notes ?? true))}
|
||||
<!-- {#if ($config?.features?.enable_notes ?? false) && ($user?.role === 'admin' || ($user?.permissions?.features?.notes ?? true))}
|
||||
<div class="px-[7px] flex justify-center text-gray-800 dark:text-gray-200">
|
||||
<a
|
||||
id="sidebar-notes-button"
|
||||
|
|
@ -920,9 +943,9 @@
|
|||
</div>
|
||||
</a>
|
||||
</div>
|
||||
{/if}
|
||||
{/if} -->
|
||||
|
||||
{#if $user?.role === 'admin' || $user?.permissions?.workspace?.models || $user?.permissions?.workspace?.knowledge || $user?.permissions?.workspace?.prompts || $user?.permissions?.workspace?.tools}
|
||||
<!-- {#if $user?.role === 'admin' || $user?.permissions?.workspace?.models || $user?.permissions?.workspace?.knowledge || $user?.permissions?.workspace?.prompts || $user?.permissions?.workspace?.tools}
|
||||
<div class="px-[7px] flex justify-center text-gray-800 dark:text-gray-200">
|
||||
<a
|
||||
id="sidebar-workspace-button"
|
||||
|
|
@ -954,14 +977,14 @@
|
|||
</div>
|
||||
</a>
|
||||
</div>
|
||||
{/if}
|
||||
{/if} -->
|
||||
</div>
|
||||
|
||||
{#if ($models ?? []).length > 0 && ($settings?.pinnedModels ?? []).length > 0}
|
||||
<PinnedModelList bind:selectedChatId {shiftKey} />
|
||||
{/if}
|
||||
|
||||
{#if $config?.features?.enable_channels && ($user?.role === 'admin' || $channels.length > 0)}
|
||||
<!-- {#if $config?.features?.enable_channels && ($user?.role === 'admin' || $channels.length > 0)}
|
||||
<Folder
|
||||
className="px-2 mt-0.5"
|
||||
name={$i18n.t('Channels')}
|
||||
|
|
@ -987,9 +1010,9 @@
|
|||
/>
|
||||
{/each}
|
||||
</Folder>
|
||||
{/if}
|
||||
{/if} -->
|
||||
|
||||
{#if folders}
|
||||
<!-- {#if folders}
|
||||
<Folder
|
||||
className="px-2 mt-0.5"
|
||||
name={$i18n.t('Folders')}
|
||||
|
|
@ -1039,7 +1062,7 @@
|
|||
}}
|
||||
/>
|
||||
</Folder>
|
||||
{/if}
|
||||
{/if} -->
|
||||
|
||||
<Folder
|
||||
className="px-2 mt-0.5"
|
||||
|
|
|
|||
513
src/lib/constants/legal.ts
Normal file
513
src/lib/constants/legal.ts
Normal file
|
|
@ -0,0 +1,513 @@
|
|||
export const agreementContent = `
|
||||
欢迎您使用XXX(产品)产品及服务!本协议由XXX(产品)提供者XXX有限公司及其关联公司(以下简称“我们”)与您订立,您应当阅读并遵守本平台发布的《用户协议》(以下简称“本协议”)。使用本服务即表示您通过电子方式确认本协议内容,同意本协议约束。如果您或您的监护人不同意本协议的任何内容,您应该立即停止使用XXX(产品)服务。如您未经监护人同意使用本服务,则您及您的监护人应依法承担因此导致的一切后果。
|
||||
|
||||
我们特别提醒您在使用本服务之前认真阅读(未满18周岁的未成年人应在法定监护人陪同下阅读)、充分理解本协议的全部条款,尤其是免责声明、法律管辖和适用等加粗显示的条款。如您不同意本协议的任何条款,将导致我们无法为您提供完整的产品和服务,您可以选择停止使用本服务。如您自主选择同意本协议,或您的注册、登录、使用等行为将视为您对本协议的接受,并视为您接受并遵守本协议各项条款。除了以上服务条款之外,我们还发布了一份隐私政策,其中描述了我们如何处理、收集、使用和保护您的信息。
|
||||
|
||||
特别提示:
|
||||
|
||||
本服务提供的所有内容均由人工智能模型生成,可能出现错误或遗漏,本服务对其答复内容的准确性、完整性、及时性和功能性不作任何保证。本服务输出内容,仅供您参考,不代表本服务提供者的态度或观点,亦不构成任何建议或承诺,对涉及对您或相关方可能会产生重大影响的情形(如与医疗、法律、投资等专业咨询),建议您咨询相关专业人士。
|
||||
|
||||
您应科学理性认识和依法使用本服务,您根据本服务输出内容所作出的任何判断或者据此作出的后续相关操作行为,以及由此带来的后果和责任均由您自行承担,本服务提供者不承担您因使用本服务给您或任何第三方产生的任何损害或责任。
|
||||
|
||||
本服务输出内容虽已经过人工智能算法自动过滤,但仍不排除其中部分信息具有瑕疵、不合理或引发用户不适,如有此情形,欢迎向我们反馈。
|
||||
|
||||
如对本协议内容有任何疑问、意见或建议,您可通过发送邮件至XXX@163.com与我们联系。
|
||||
|
||||
第1条 定义
|
||||
|
||||
1.1 用户
|
||||
|
||||
指通过XXX.cn网站使用XXX(产品)服务的所有自然人。本协议中可称为“用户”或“您”。
|
||||
|
||||
1.2 输入
|
||||
|
||||
指用户为使用本服务在对话框进行的文本输入。
|
||||
|
||||
1.3 输出
|
||||
|
||||
指本服务根据用户输入而相应输出的文字、表格、代码和图片等内容。
|
||||
第2条 服务介绍
|
||||
|
||||
2.1 XXX(产品)根据本条款向用户提供远程接口调用、提供多平台集成式人工智能问答服务。用户需在对话框输入文本信息,XXX(产品)会基于用户输入输出相应的内容及选择的平台模型作为响应,包括文字、表格、代码和图片等。XXX(产品)可能会收集和分析用户的输入和输出信息,以提高识别和响应能力,改进本服务的智能性和内容质量。
|
||||
|
||||
2.2 本服务具体功能将随着用户反馈、技术升级及合作方的更新,或相关监管政策的变化不断迭代更新。
|
||||
|
||||
2.3 您在使用本服务某一特定功能时,针对该特定功能可能会另有单独的协议、相关业务规则等(“具体协议”),您在使用该项特定功能前请阅读并同意相关的具体协议。本协议与具体协议的内容存在冲突的,以具体协议的规定为准。
|
||||
|
||||
2.4 服务修改、升级
|
||||
|
||||
由于互联网行业高速发展,您与本平台签署的本协议列明的条款并不能完整罗列并覆盖您与XXX(产品)所有权利与义务,现有的约定也不能保证完全符合未来发展的需求。因此,XXX(产品)网站公示的相关声明及政策、XXX(产品)相关的规则和协议均为本协议的补充协议,与本协议不可分割且具有同等法律效力。XXX(产品)有权通过公告(包括但不限于网站首页公告、系统消息 、网页弹窗 )、短信提醒等方式向您发送XXX(产品)网站页面改版、服务升级、服务改版等通知,如您拒绝接受上述改动的,请您立即停止使用相关服务,您的使用行为视为您同意XXX(产品)网站相关服务修改、升级。
|
||||
第3条 账号登录
|
||||
|
||||
3.1 为平台服务仅向注册用户提供,如果您需使用XXX(产品)服务的,请先根据本协议及其他服务规则(包括但不限于《隐私政策》、《用户协议》、《XXX(产品)儿童个人信息保护规则》等)的条款并按照页面上的提示完成全部的注册程序成为注册用户,并确保您所提交的包括但不限于姓名、手机号、联系地址、证件号码等注册信息真实、合法、完整、有效。
|
||||
|
||||
3.2 本服务主要面向成人。如果您未满18周岁,请在法定监护人陪同下阅读本协议,并在征得法定监护人的同意后使用本服务。我们充分理解保护未成年人的重要性,并会根据法律法规的要求及行业主流实践采取相应的保护措施。与此同时,请监护人合理引导和约束未成年人用户对本服务的使用,共同营造良好网络环境,帮助未成年人养成良好上网习惯,避免过度依赖或者沉迷本服务。
|
||||
|
||||
3.3 为落实国家法律法规的有关实名认证的要求,使您更好地使用XXX(产品)产品及相关服务,保障您的账号安全,您在注册时需要向我们提供真实的手机号码。此外,为了向您提供已有或未来上线的部分功能,我们可能还会严格依照法律法规要求向您收集其他个人信息。
|
||||
|
||||
3.4 您理解并承诺,您所设置的账号不得违反国家法律法规相关规定,您的账号名称、头像和简介等注册信息及其他个人信息中不得出现违法和不良信息,未经他人许可不得用他人名义(包括但不限于冒用他人姓名、名称、字号、头像等足以让人混淆的方式)开设账号,不得恶意注册账号(包括但不限于频繁注册、批量注册账号等行为)。您在账号注册及使用过程中需遵守相关法律法规,不得实施任何侵害国家利益、损害其他公民合法权益、有害社会道德风尚的行为。XXX(产品)有权对您提交的信息进行审核。
|
||||
|
||||
3.6 您应该自行保管好您的账号信息(包括账号、密码、验证码等)。因您对账号信息保管不当、主动泄露或遭受他人攻击、诈骗等行为导致的损失及后果,均由您自行承担。如发现任何未经授权使用您账号登录使用本服务或其他可能导致您账号遭窃、遗失的情况,建议您立即通知XXX(产品)。您理解XXX(产品)对您的请求采取行动需要合理时间,除XXX(产品)存在客观过错外,XXX(产品)对在采取行动前已经产生的后果不承担责任。
|
||||
|
||||
3.8 如您发现账号存在安全问题,请您立即联系我们予以调查处理,否则我们对潜在损失的产生或扩大不承担任何责任。 我们特别提示您,您应该妥善保管您的账号和密码,当您使用完毕XXX(产品)平台的服务后,您应安全退出。此外,您不应轻信借款、索要密码或其他涉及财产的网络信息。涉及财产操作的,请一定先核实对方身份,并请经常留意我们有关防范诈骗犯罪的提示。您知悉并同意,如您在账号信息的保管上、相关上网设备的网络安全维护上存在任何过失导致账号丢失、泄露,您应对此所产生的任何后果负责,我们对此不负任何责任,如我们因此产生相关支出,我们将有权向您予以追偿。
|
||||
|
||||
3.9 您知悉并同意,在符合法律法规的规定,或经国家机关要求的前提下,我们有权对您的注册账号进行限制或冻结,在该等情况下,您可能无法继续登陆或使用您的注册账号。
|
||||
|
||||
3.10 您可以随时注销您的账号并终止与XXX(产品)的服务关系,但请您理解,即使您的账号已注销,您仍需对您注销前的账号使用行为承担相应法律责任。特别地,在您注销账号前,您应确保账号不存在未完结交易或其他未了结的权利义务,且不存在其他因注销可能引发纠纷或者导致已发生的纠纷难以解决的情况,包括但不限于您的账号被冻结、限制,您的注销是出于躲避调查取证的目的等。请注意,若我们发现您在使用本服务过程中存在违法行为,我们将依法保存该等记录。
|
||||
|
||||
3.11 特别提醒您,一旦您注销本服务账号,如届时该账号下还存在虚拟收益的(包括但不限于积分、虚拟货币、已经购买但未到期或未使用完的增值服务等),XXX(产品)有权对该账号下的全部虚拟收益做清除处理,因此产生的后果由您自行承担。
|
||||
|
||||
第4条 服务使用规范
|
||||
|
||||
4.1 基于您对本服务的使用,XXX(产品)许可您一项个人的、基于法定或约定事由可撤销的、不可转让的、非独占的和非商业的使用本服务进行内容输入并获得内容输出的权利。本协议未明示授权的其他一切权利仍由XXX(产品)保留,您在行使该些权利前须另行获得XXX(产品)的书面许可,同时XXX(产品)如未行使前述任何权利,并不构成对该权利的放弃。如果您对外发布或传播本服务生成的输出,您应当:
|
||||
|
||||
(1)主动核查输出内容的真实性、准确性,避免传播虚假信息;
|
||||
(2)以显著方式标明该输出内容系由人工智能生成,以向公众提示内容合成的情况;
|
||||
(3)避免发布和传播任何违反本协议使用规范的输出内容。
|
||||
|
||||
4.2 用户在使用XXX(产品)提供的上述服务时,应遵守本协议,遵守自愿、平等、公平及诚实信用原则,不利用本服务侵犯他人合法权益及谋取不正当利益,不扰乱互联网平台正常秩序。
|
||||
|
||||
4.3 为履行法定合规要求,XXX(产品)有权采取技术手段或人工手段对用户使用本服务的行为及信息进行审查,包括但不限于对输入和输出进行审查、建立风险过滤机制、建立违法内容特征库等。对于违规用户,XXX(产品)有权按照本协议第八条的规定进行处置。
|
||||
|
||||
4.4 XXX(产品)提示您,作为本服务的使用者,您在使用上述服务时应积极承担信息安全义务。您承诺不对本服务采取以下行为:
|
||||
4.4.1 利用XXX(产品)软件及服务制作、发表、诱导生成、复制、传送、传播、储存以下信息
|
||||
|
||||
(1) 反对宪法所确定的基本原则。
|
||||
(2) 危害国家安全,泄露国家秘密,颠覆国家政权,推翻社会主义制度,破坏国家统一。
|
||||
(3) 损害国家荣誉和利益。
|
||||
(4) 煽动民族仇恨、民族歧视,破坏民族团结。
|
||||
(5) 侮辱、滥用英烈形象,否定英烈事迹,美化粉饰侵略战争行为的。
|
||||
(6) 破坏国家宗教政策,宣扬邪教和封建迷信。
|
||||
(7) 散布谣言、虚假有害信息,扰乱社会秩序,破坏社会稳定。
|
||||
(8) 宣扬淫秽、色情、赌博、暴力、凶杀、恐怖主义、极端主义或者教唆犯罪。
|
||||
(9) 煽动非法集会、结社、游行、示威、聚众扰乱社会秩序。
|
||||
(10) 诽谤他人,泄露他人隐私,侵害他人名誉权、肖像权、隐私权、知识产权和其他合法权益。
|
||||
(11) 破坏国际关系以及国际和平稳定。
|
||||
(12) 含有法律、行政法规禁止的其他内容的信息。
|
||||
|
||||
4.4.2 通过输入,诱导生成不友善对话的输出
|
||||
|
||||
(1) 人身攻击及辱骂他人。
|
||||
(2) 针对以下群体发表诅咒、歧视、漠视生命尊严等性质的言论,群体包括:不同特定国籍、地域、性别、性别认同、性倾向、种族、民族、健康状况、职业、年龄、信仰、残障群体等。
|
||||
(3)对他人进行诅咒、恐吓或威胁。
|
||||
(4)对其他用户创作的内容直接进行贬低性的评论。
|
||||
(5)对其他用户使用粗俗用语,并产生了冒犯。
|
||||
(6)针对以下群体发表偏见性质的言论,群体包括:特定国籍、地域、性别、性别认同、性倾向、种族、民族、健康状况、职业、年龄、信仰、残障群体等。
|
||||
(7)涉及未成年人色情低俗的,如展示未成年人婚育、性侵害等;
|
||||
(8)涉及未成年人暴力欺凌的,如施暴犯罪、残害体罚、校园欺凌等;
|
||||
(9)涉及披露未成年人隐私的,如展示未成年人性器官,公开个人隐私等;
|
||||
(10)涉及未成年人不良行为的,如宗教传授、饮酒吸烟、邪典动画等;
|
||||
(11)其他危害未成年人安全和健康的相关内容。
|
||||
(12)抵制一切色情低俗内容
|
||||
|
||||
4.4.3 通过输入,恶意对抗本服务的过滤机制,包括但不限于:
|
||||
|
||||
(1)输入难以辨识涵义影响阅读体验的字符、数字等无意义乱码。
|
||||
(2)恶意对抗行为,包括但不限于使用变体、谐音等方式规避服务检测来输入违反上述4.4.1和4.4.2的言论。
|
||||
|
||||
4.4.4 干扰本服务正常运行以及损害XXX(产品)合法权益,包括但不限于:
|
||||
|
||||
(1)利用本服务从事窃取商业秘密、窃取个人信息等违法犯罪活动。
|
||||
(2)对本服务进行反向编译、反向工程或者以其他任何途径获得与本服务算法相关的任何信息。
|
||||
(3)利用本服务开发与本服务存在竞争关系其他产品和服务(除非该限制违法相关法律规范)。
|
||||
(4)以任何方式(包括但不限于通过任何机器人、蜘蛛、其他自动设置、设置镜像)来抓取、复制本服务及其所包含的任何内容。
|
||||
(5)未经XXX(产品)及XXX(产品)合作方同意或未有合法正当依据,擅自去除、篡改本服务涉及的人工智能生成标识或深度合成内容显著标识。
|
||||
(6)将有关干扰、破坏或限制任何计算机软件、硬件或通讯设备功能的软件病毒或其他计算机代码、档案和程序之资料,加以上载、发布、发送电子邮件或以其他方式传送。
|
||||
(7)非法入侵本服务服务器、篡改本服务之相关代码或其他损害本服务的行为。(8)企图规避XXX(产品)平台及XXX(产品)合作方的安全设置或网络系统,包括获取用户不应获取的数据,登录未经明确授权的服务器或账号,或采用运行端口扫描等方式窥探其他网络的安全措施。
|
||||
(9)以导致XXX(产品)或XXX(产品)合作方的计算机系统或设施承受不合理负载的方式获取输出,或进行可能导致此类情况出现的行为。
|
||||
(10)未经XXX(产品)或XXX(产品)合作方的授权,非法转售或对外提供相应服务,或以商业化目的使用XXX(产品)服务。
|
||||
|
||||
4.4.5不应擅自复制和使用网络上未公开和未授权的文件。除相关著作权人明示同意,不应在网络中擅自破解、传播、下载或复制第三人享有著作权的软件或进行其他任何侵害他人知识产权的活动;
|
||||
|
||||
4.4.6其他违反法律法规规定、侵犯第三人以及XXX(产品)合法权益的行为,例如实施垄断或不正当竞争行为等。 如您在使用XXX(产品)服务过程中涉及上述行为中的一项或多项,则需要对自己的行为承担法律责任。承担法律责任的形式包括但不限于: 对受到侵害者进行赔偿,以及在我们首先承担了因您的行为导致的行政处罚或侵权损害赔偿责任等损失(含诉讼费、律师费等相关法律程序费用)后,您应立即给予我们等额的赔偿。此外,根据具体违法违规情形,我们有权作出独立判断,在不通知您的前提下立即暂停或终止对您提供部分或全部服务,包括禁言、删除您在XXX(产品)平台储存、发布的内容,冻结、锁定、注销、删除帐号,暂停或终止您使用本服务。您知悉并理解,如果我们发现您的上述违法违规行为,依据相关法律法规的规定,我们有权或有义务立即停止相关服务,删除或屏蔽相关违规信息,并视情况进行调查取证,保存有关记录,或向国家有关机关举报。同时,我们有权自主删除、屏蔽含有该内容的任何数据信息。我们将根据国家相关法 律法规要求,对依法删除、屏蔽的数据信息予以记录、保存。
|
||||
第5条 知识产权和其他权利
|
||||
|
||||
5.1 XXX(产品)为本服务的开发、运营主体,并对本服务的开发和运营等过程中产生的所有数据、信息、输出等享有法律法规允许范围内的全部权利,但相关权利人依照法律规定应享有权利的除外。
|
||||
|
||||
5.2除另有特别声明外,XXX(产品)提供本服务时所依托的相关著作权、专利权及其他知识产权(包括但不限于技术、程序、代码、用户界面、网页、文字、图片、图像、音频、视频、图表、版面设计、商标、电子文档等)均归XXX(产品)所有,但相关权利人依照法律规定应享有权利的除外。
|
||||
|
||||
5.3您理解并承诺,您在使用本服务时的输入不侵犯任何人的知识产权、肖像权、名誉权、荣誉权、姓名权、隐私权、个人信息权益等合法权益,不涉及任何国家秘密、商业秘密、重要数据或其他可能会对国家安全或者公共利益造成不利影响的数据,否则由此产生的侵权风险和责任由您承担。XXX(产品)由此遭受的全部直接和间接损失(包括但不限于经济、商誉、维权支出、律师费等损失)也同样由您承担。
|
||||
|
||||
5.4您知悉、理解并同意,如果您按照法律规定对您的输入(包括您使用本服务过程中自行上传、发布的全部内容)和/或输出享有权利的(包括但不限于知识产权、肖像权等),您使用本服务均不会造成前述合法权利的转移或减损,除非我们与您另有约定。与此同时,您理解并同意XXX(产品)将在法律允许的范围内为实现本服务目的对您上传、发布的内容进行存储及使用(包括但不限于复制、分发、传送、公开展示、编辑等)。
|
||||
|
||||
5.5您理解并同意,您在使用XXX(产品)服务时输入和/或生成、发布、上传、提交、存储的内容(包括但不限于您创建的AI对话机器人、文字、图片、视频、音频、动画等)均由您原创或已获合法授权。您通过XXX(产品)平台输入和/或生成、发布、上传、提交、存储的任何内容的知识产权归属您或原始著作权人所有,您的输入和/或生成、发布、上传、提交、存储或发布行为不会侵犯他人的知识产权或其他合法权益。
|
||||
|
||||
您知悉、理解并同意,您一旦接受本服务协议,即表明您主动将上述内容的非专属、可转让的财产性权利,如著作权(包括但不限于:复制权、发行权、出租权、展览权、表演权、放映权、广播权、信息网络传播权、摄制权、改编 权、翻译权、汇编权以及应当由著作权人享有的其他可转让权利),在全世界范围内永久、免费、独家且不可撤销地授权给我们,我们可基于该等授权使用上述内容(包括但不限于用于商业用途)或向第三方自主进行任何必要的转授权。该等授权、转授权的使用场景包括但不限于当前或其他任何网站、小程序、应用程序、产品或移动终端设备等,且我们或我们所授权许可的第三方可通过对上述授权内容进行修改、复制、改编、翻译、汇编或制作,形成衍生产品。在不违反相关法律法规的强制性规定、尊重相关原始授权内容的知识产权的基础上,该等衍生产品的相关知识产权归我们或我们所授权许可的第三方所有。
|
||||
|
||||
您确认并同意授权我们以自己的名义或委托专业第三方针对有关您输入和/或生成、发布、上传、提交、存储或发布的内容(含衍生作品)的侵权行为进行独立自主的维权并获得全部赔偿。维权形式包括但不限于:监测侵权行为、发送维权函、提起诉讼或仲裁、调解、和解等。我们有权对维权事宜做出独立决策并予以实施。您同意,因您通过XXX(产品)输入和/或生成、发布、上传、发布的任何内容导致的知识产权侵权问题,您将承担全部责任;如我们,或我们授权的其他服务提供方因第三方知识产权维权而产生损失,您将等额赔偿。 本服务协议已经构成《著作权法》第二十五条所规定的书面协议,其效力及于用户在XXX(产品)平台发布的任何受著作权法保护的作品内容,无论该内容形成于本服务协议签订前还是本服务协议签订后。我们及我们转授权、许可的相关方有权将任何您基于XXX(产品)平台服务创建、发布的AI对话机器人、AI对话内容、产品讨论或图片进行使用或者与其他人合作使用,使用范围包括但不限于网站、电子杂志、杂志、刊物、海报、公众号文章、微信小程序等。
|
||||
第6条 个人信息保护
|
||||
|
||||
6.1 XXX(产品)非常重视对用户个人信息的保护。XXX(产品)将按照《隐私政策》的规定收集、使用、储存和分享您的个人信息。
|
||||
第7条 服务费用
|
||||
|
||||
7.1 XXX(产品)可能在提供本服务过程中向您收取费用,具体以届时XXX(产品)就本服务对外公布的信息为准。如用户使用本服务中的收费项目,应按照XXX(产品)公布的计费标准和方式支付相关费用。
|
||||
|
||||
7.2 对于暂不收费的功能,XXX(产品)有权根据实际情况对暂不收费的服务内容、服务期限及服务标准等进行单方变更,用户对此理解并接受前述的变更。
|
||||
|
||||
7.3 前述修改、变更或开始收费前,XXX(产品)将在相应服务页面进行通知或公告。如用户拒绝付费,那么用户将不能继续使用本服务中的收费功能。
|
||||
|
||||
第8条 违约责任和处罚措施
|
||||
|
||||
8.1 因用户违反相关法律法规或本协议约定导致的任何后果,均由用户独立承担责任、赔偿损失,与XXX(产品)无关。若因用户使用本服务的行为给XXX(产品)或与XXX(产品)公司合作的其他单位面临任何投诉、举报、质询、索赔、诉讼,或者使XXX(产品)公司或者与XXX(产品)公司合作的其他方因此遭受任何名誉、声誉或者财产上的损失,您应积极地采取一切可能采取的措施,以保证XXX(产品)公司及与XXX(产品)公司合作的其他方免受上述索赔、诉讼的影响。同时您对XXX(产品)公司及与XXX(产品)公司合作的其他方因此遭受的直接及间接经济损失负有全部的损害赔偿责任。
|
||||
|
||||
8.2 如果用户以任何手段干扰本服务的运行或干扰其他用户对本服务的使用的,XXX(产品)有权要求其赔偿损失(包括但不限于经济、商誉、维权支出、律师费等损失)。
|
||||
|
||||
8.3 如果用户有上述违反“第4条 服务使用规范”行为的,XXX(产品)有权采取警示、限制功能、暂停或终止提供服务、删除违法违规信息、锁定账号等XXX(产品)认为合理的处理措施,并保存有关记录。对处理结果存在疑议的,用户可根据9.2条之规定向我们进行申诉,我们将及时受理并进行处理和反馈。
|
||||
|
||||
第9条 投诉、申诉处理
|
||||
|
||||
9.1 投诉。如果您认为本服务涉及侵害您知识产权或其他权利的,或者您发现任何违法、虚假信息以及违反本协议的使用行为,您可将相关投诉材料发送至该邮箱:XXX@163.com我们会在收到您的投诉材料后进行处理,包括及时采取停止生成、停止传输、消除等合理处置措施。
|
||||
|
||||
9.2 申诉。如果您认为我们不恰当地限制了您使用本服务的能力,您可以将相关申诉材料发送至该邮箱:XXX@163.com申诉所需的材料至少包括您的账号信息、身份证或护照复印件、账号当前状态、账号因何种使用情形被采取措施以及您希望我们采取何种措施恢复您使用本服务的能力。申诉结果我们将以邮件方式通知您。
|
||||
|
||||
9.3 我们将在您提出投诉或申诉后的15个工作日内向您反馈相关情况。
|
||||
|
||||
第10条 免责声明
|
||||
|
||||
10.1 XXX(产品)致力于提供安全、稳定、持续的服务,保障用户正常使用,XXX(产品)不承担除法律有明确规定外的其他责任,如:不保证本服务在操作上不会中断或没有错误,不保证在现有技术水平下有能力纠正本服务的所有缺陷,亦不保证本服务能满足用户的所有要求,亦不保证本服务所提供的合作方能保持不变或持续更新。XXX(产品)将在现有技术的基础上尽最大努力提供相应的安全措施以保障本服务的安全和正常运行,包括但不限于通过限制用户单次可发送的服务器请求数量。在特定时间段内用户的请求数量达到风险预警上限后,基于服务运营安全的考虑,您的账号可能会被暂停。
|
||||
|
||||
10.2 由于可能存在的计算机病毒、网络通讯故障、系统维护等方面的因素以及可能发生的不可抗力事件或意外事件,XXX(产品)在此明确声明对本服务不作明示或暗示的保证,包括对本服务的可适用性、没有错误或疏漏、持续性、准确性、可靠性、适用于某一特定用途或满足用户的需求、使用效果等。
|
||||
|
||||
10.3 人工智能和机器学习是快速发展的研究领域,XXX(产品)及XXX(产品)合作方也在不断努力改进本服务,使其更加准确、可靠、安全、可信。但限于技术特性,XXX(产品)及XXX(产品)合作方在尽到合理努力的前提下,仍无法完全保证您通过本服务获得的输出的合法性、真实性、准确性以及完整性。您应对本服务中的输出自行加以判断,并承担因使用内容引起的所有风险。我们提示您,除法律有明确规定外,XXX(产品)无法也不会对前述风险而导致的任何损失或损害承担责任。
|
||||
|
||||
10.4 本服务下的输出不代表专业意见,不能代替如法律、医疗、金融等专业领域从业人员向您解答对应疑问。相关观点也仅限于算法所触达有限数据呈现的供您参考的结果,并不代表XXX(产品)立场。由于机器学习特性,就相同的输入可能产生不同的输出结果,请您注意甄别。您根据输出的内容所作出的任何判断或者据此作出的后续相关操作行为,以及由此带来的后果和责任均由您自行承担,请科学理性认识和依法使用本服务。
|
||||
第11条 法律管辖和适用
|
||||
|
||||
11.1 本协议的订立、执行和解释及争议的解决均应适用中华人民共和国大陆地区法律。
|
||||
|
||||
11.2 本协议的签订、履行或解释发生争议,双方应努力友好协商解决。如协商不成,任何一方均XXX有限公司住所地有管辖权的法院起诉。
|
||||
|
||||
第12条 本协议的更新与终止
|
||||
|
||||
12.1 您对本协议的接受包括接受我们对本协议任何条款随时所做的任何修改。我们有权随时修改本协议,更新后的协议将通过官方网站公布等适当的方式进行公布。一旦公布即代替原协议条款,请您自行在官方网站查阅最新版协议条款。如您不接受修改后的协议,请您立即停止使用本服务。您继续使用本服务将被视为您已接受了修改后的协议。
|
||||
`;
|
||||
|
||||
export const privacyContent = `
|
||||
隐私政策
|
||||
|
||||
XXX科技有限公司运营的产品:XXX(XXX.cn)(以下简称"我们")深知个人信息对您的重要性,并会尽全力保护您的个人信息安全可靠。我们致力于维持您对我们的信任,恪守以下原则,保护您的个人信息:权责一致原则、目的明确原则、选择同意原则、最少够用原则、确保安全原则、主体参与原则、公开透明原则等。同时,我们承诺,我们将按业界成熟的安全标准,采取相应的安全保护措施来保护您的个人信息。
|
||||
|
||||
请在使用我们的产品(或服务)前,审慎阅读并充分理解本政策,如您明确表示不同意本政策的,我们将不会按照本政策的约定对您的个人信息进行收集、保存等,但请您知悉,您不同意本政策的行为或影响您正常使用我们的产品和/或服务;如您需完整使用或继续使用我们的产品和/或服务的,请您在首次登录或我们更新相关隐私政策(我们将在每次更新后提示您查看并同意更新后的隐私政策)后选择同意隐私政策。您选择同意本隐私政策或更新后的隐私政策的,视为您同意授权我们按照本隐私政策收集、处理和保护您的信息。其中,与您的权益可能存在重大关系的条款我们已用加粗等形式予以提示,请特别关注。
|
||||
|
||||
如您不具备完全民事行为能力,请您在监护人陪同下仔细阅读,充分理解本隐私政策,并征得监护人的同意后使用我们的服务或向我们提供信息。
|
||||
|
||||
一、我们如何收集和使用您的个人信息
|
||||
|
||||
个人信息是指以电子或者其他方式记录的能够单独或者与其他信息结合识别特定自然人身份或者反映特定自然人活动情况的各种信息。我们仅会出于本政策所述的以下目的,收集和使用您的个人信息:
|
||||
|
||||
1、注册账号/快捷登录 TODO(注册机制)
|
||||
|
||||
(1) 为完成创建账号,您需提供以下信息:您的姓名、手机号码、创建的用户名和密码等。在此过程中,基于我们与通信运营商的合作,经过您的明示同意,运营商会将您的手机验证码发送给我们,便于我们为您提供快捷的登录服务;
|
||||
|
||||
我们收集该类信息是为了:完成注册程序、提供快捷登录功能;为您持续稳定提供专属于注册用户的产品和/或服务;实现您的管理账户,您可以查看您的收藏、会员管理、客户管理、设备管理等内容,并不会因为设备更换而丢失;保护您的账号安全。
|
||||
|
||||
您应知悉,我们收集该类信息是为了满足相关法律法规及政策要求,您可以拒绝提供,但若您拒绝提供可能导致您无法使用我们的手机号注册/快捷登录功能,进而影响您使用专属于注册用户的部分基础服务,但不影响您以其他方式登陆或以游客身份浏览XXX(产品)页面,请您谨慎考虑后再提供。
|
||||
|
||||
(2)您提供的上述信息,将在您使用本服务期间持续授权我们使用。在您注销账号时,我们将停止使用并删除上述信息,注销/删除流程详见第五条。
|
||||
|
||||
(3)上述信息将存储于中华人民共和国境内。如需跨境传输,我们将会单独征得您的授权同意。
|
||||
|
||||
2、商品交易
|
||||
|
||||
仅当您在我们的产品和/或服务中产生购买/积分兑换商品或服务(如有)行为时,我们将根据您的购买/兑换行为及购买/兑换的内容收集如下部分或全部的个人信息:交易商品或服务信息、交易金额、下单时间、订单商户、订单编号、订单状态、支付方式(此功能为我们接入第三方软件开发工具包所开发的功能)、支付账号、支付状态。我们收集上述信息是为了帮助您顺利完成交易、保障您的交易安全、查询订单信息、提供客户服务等。
|
||||
|
||||
如果您拒绝我们收集上述信息,将无法在我们的产品和/或服务中购买/兑换商品和/或服务,但不影响您使用我们提供的其他产品和/或服务。
|
||||
|
||||
因您购买的商品/兑换可能通过第三方服务商提供,在该过程中该第三方服务商为顺利、安全、准确向您交付商品或服务或不可避免的获知您的相关信息。我们向您承诺,我们会以最大努力保障您的个人信息安全,我们会严格要求第三方对您的个人信息予以保密,仅为提供商品/服务之目的获悉和使用,不得对外泄露或做其他任何用途。
|
||||
|
||||
3、支付功能
|
||||
|
||||
当您在我们客户端上开通服务、订购商品等发生支付行为时,需要用到支付功能。在支付过程中,我们可能会收集您的第三方支付渠道的user ID (例如支付宝user ID、微信open ID信息)。上述信息为我们向您提供您购买商品和/或服务所必须的信息,我们无法仅根据该信息获得您的个人财产信息,也不能识别特定自然人身份信息。如果您不同意我们收集上述信息,您将无法使用部分产品和/或服务包含的互动功能,但不影响您使用我们为您提供的其他产品和服务。
|
||||
|
||||
4、搜索功能
|
||||
|
||||
当您在我们的产品中使用搜索功能时,我们需要收集您的一些信息,其中包括如下个人信息:您的设备信息、您的日志信息,包括您搜索的字或词、您的浏览记录和时间、您搜索的时间以及次数。我们收集这些信息是为了向您快速匹配您所需要的内容以及您可能感兴趣的内容,同时亦为了改进我们的产品和服务。
|
||||
|
||||
5、客户服务
|
||||
|
||||
当您向XXX(产品)发起投诉、申诉或进行咨询时,为了您的账号与系统安全,我们可能需要您先行提供账号信息,并与您之前的个人信息相匹配以验证您的用户身份。同时,为了方便与您联系或帮助您解决问题,我们可能还需要您提供姓名、手机号码、电子邮件及其他联系方式等个人信息。另外,我们还会收集您与我们的沟通信息(包括文字/图片/音视频/通话记录形式)、与您的需求相关联的其他必要信息。我们收集这些信息是为了调查事实与帮助您解决问题,如您拒绝提供上述信息,我们可能无法向您及时反馈投诉、申诉或咨询结果。
|
||||
|
||||
6、开展内部数据分析和研究,第三方SDK统计服务,改善我们的产品或服务
|
||||
|
||||
(1)为改善我们的产品和服务,经您授权同意我们可能接入第三方产品和服务或接受第三方SDK统计服务,我们将明确标识由第三方提供,告知您收集数据的类型和用途,对于收集到的您的个人信息,必要时我们将建立安全评估机制和采取个人信息安全保护措施,SDK数据将不含与我们提供产品或服务无关的数据。目前我们产品中包含的第三方SDK服务请具体查阅本协议附件二所示《XXX(产品)第三方合作目录》。前述服务商收集和处理信息等行为遵守其自身的隐私条款,而不适用于本政策。为了最大程度保障您的信息安全,我们建议您在使用任何第三方SDK类服务前先行查看其隐私条款。
|
||||
|
||||
我们将监督第三方接入及第三方SDK统计服务,并对违规收集您个人信息的行为采取技术检测、及时切断接入等有效措施,以保护您的个人信息不被泄露;此外,为保障您的合法权益,如您发现这等SDK或其他类似的应用程序侵权您的个人信息,您可通过以下途径投诉:
|
||||
|
||||
电子邮箱:XXX@163.com
|
||||
|
||||
(2)为给您提供更加优质的服务,我们可能会存在数据统计分析需求,除上述个人信息外,统计分析服务将根据统计维度的不同采集如下信息:SDK/API/JS代码版本、浏览器、互联网服务提供商、平台、时间戳、应用标识符、应用程序版本、应用分发渠道、独立设备标识符、设备型号、传感器参数、终端制造厂商、终端设备操作系统版本、会话启动/停止时间、语言所在地、时区和网络状态(WiFi等)、硬盘、CPU和电池使用情况等。
|
||||
|
||||
7、人机交互对话
|
||||
|
||||
当您成功连接我们的服务后,您可以通过对话框与我们网站内多模型进行交互对话。我们会自动接收并记录您与各模型进行交互过程中自愿输入的对话信息,使用这些信息向您输出内容,以提供人机交互服务。如您拒绝我们收集和处理前述个人信息,请您谨慎输入前述信息,但因此您可能会影响您正常使用XXX(产品)提供的部分或全部功能。
|
||||
|
||||
8、问答历史
|
||||
|
||||
为向您提供连续性、一致化的使用体验,保障服务质量,我们会记录您的个人对话记录,包括您输入的对话信息、以及基于上述信息形成的对话主题。您可以查找并管理您尚未删除的问答历史。请您知悉,为符合相关法律法规要求,履行网络信息安全义务,我们会在法律允许的时间内保留您的问答历史及对话主题。
|
||||
|
||||
二、我们如何使用 Cookie 和同类技术
|
||||
|
||||
(一)Cookie
|
||||
|
||||
1、为确保网站正常运转,我们会在您的计算机或移动设备上存储名为 Cookie 的小数据文件。Cookie 通常包含标识符、站点名称以及一些号码和字符。借助于 Cookie,网站能够存储您的偏好或购物篮内的商品等数据。
|
||||
|
||||
2、我们不会将 Cookie 用于本政策所述目的之外的任何用途。您可根据自己的偏好管理或删除 Cookie。您可以清除计算机上保存的所有 Cookie,大部分网络浏览器都设有阻止 Cookie 的功能。但如果您这么做,则需要在每一次访问我们的网站时亲自更改用户设置。
|
||||
(二)网站信标和像素标签
|
||||
|
||||
除 Cookie 外,我们还会在网站上使用网站信标和像素标签等其他同类技术。例如,我们向您发送的电子邮件可能含有链接至我们网站内容的点击 URL。如果您点击该链接,我们则会跟踪此次点击,帮助我们了解您的产品或服务偏好并改善客户服务。网站信标通常是一种嵌入到网站或电子邮件中的透明图像。借助于电子邮件中的像素标签,我们能够获知电子邮件是否被打开。如果您不希望自己的活动以这种方式被追踪,则可以随时从我们的寄信名单中退订。
|
||||
|
||||
(三)Do Not Track(请勿追踪)
|
||||
|
||||
很多网络浏览器均设有 Do Not Track 功能,该功能可向网站发布 Do Not Track 请求。目前,主要互联网标准组织尚未设立相关政策来规定网站应如何应对此类请求。但如果您的浏览器启用了 Do Not Track,那么我们的所有网站都会尊重您的选择。
|
||||
|
||||
三、我们如何共享、转让、公开披露您的个人信息
|
||||
|
||||
(一)共享
|
||||
|
||||
我们不会向其他任何公司、组织和个人分享您的个人信息,但以下情况除外:
|
||||
|
||||
1、在获取明确同意的情况下共享:获得您的明确同意后,我们会与其他方共享您的个人信息。
|
||||
|
||||
2、我们可能会根据法律法规规定,或按政府主管部门的强制性要求,对外共享您的个人信息。
|
||||
|
||||
3、与我们的关联公司共享:您的个人信息可能会与我们关联公司共享。我们只会共享必要的个人信息,且受本隐私政策中所声明目的的约束。关联公司如要改变个人信息的处理目的,将再次征求您的授权同意。
|
||||
|
||||
4、与授权合作伙伴共享:仅为实现本隐私权政策中声明的目的,我们的某些服务将由授权合作伙伴提供。我们可能会与合作伙伴共享您的某些个人信息,以提供更好的客户服务和用户体验。例如,我们聘请来提供第三方数据统计和分析服务的公司可能需要采集和访问个人数据以进行数据统计和分析。在这种情况下,这些公司必须遵守我们的数据隐私和安全要求。我们仅会出于合法、正当、必要、特定、明确的目的共享您的个人信息,并且只会共享提供服务所必要的个人信息。
|
||||
|
||||
5、对我们与之共享个人信息的公司、组织和个人,我们会与其签署严格的保密协定,要求他们按照我们的说明、本隐私政策以及其他任何相关的保密和安全措施来处理个人信息。
|
||||
|
||||
(二)转移
|
||||
|
||||
1、在获取明确同意的情况下转移:获得您的明确同意后,我们会向其他方转移您的个人信息;
|
||||
|
||||
2、在涉及合并、收购或破产清算时,如涉及到个人信息转移,我们会在要求新的持有您个人信息的公司、组织继续受此隐私政策的约束并立即通知您以获取您的单独授权,否则我们将要求该公司、组织重新向您征求授权同意。
|
||||
(三)公开披露
|
||||
|
||||
我们仅会在以下情况下,公开披露您的个人信息:
|
||||
|
||||
1、获得您明确同意后;
|
||||
|
||||
2、基于法律的披露:在法律、法律程序、诉讼或政府主管部门强制性要求的情况下,我们可能会公开披露您的个人信息。
|
||||
四、我们如何保护您的个人信息
|
||||
1、信息存储
|
||||
|
||||
(1)存储地点:我们依照法律法规的规定,仅会将收集到的有关您的个人信息存储于中华人民共和国境内。目前我们暂时不存在跨境存储您的个人信息或向境外提供个人信息的场景。如果确有必要进行数据的跨境传输,我们会单独向您明确告知(包括数据出境的目的、接收方、使用方式与范围、使用内容、安全保障措施、安全风险等),并征得您的授权同意,我们会确保数据接收方有充足的数据保护能力来保护您的个人信息。
|
||||
|
||||
(2)存储期限:我们在为您提供满足产品和服务目的所必需且最短的期间内保留您的个人信息,例如:当您使用我们的注册及会员功能时,我们需要收集您的手机号码,且在您提供后并在您使用该功能期间,我们需要持续保存您的手机号码,以向您正常提供该功能、保障您的账号和系统安全。此外,我们或对您的相关信息保存至相关法律所规定的必要期限(例如《电子商务法》规定:商品和服务信息、交易信息保存时间自交易完成之日起不少于三年)。
|
||||
|
||||
(3)在超出上述存储期限后,我们会对您的个人信息进行删除或匿名化处理。
|
||||
2、信息保护
|
||||
|
||||
(1)我们已使用符合业界标准的安全防护措施保护您提供的个人信息,防止数据遭到未经授权访问、公开披露、使用、修改、损坏或丢失。我们会采取一切合理可行的措施,保护您的个人信息。例如,在您的浏览器与"服务"之间交换数据(如信用卡信息)时受 SSL 加密保护;我们同时对我们网站提供 https 安全浏览方式;我们会使用加密技术确保数据的保密性;我们会使用受信赖的保护机制防止数据遭到恶意攻击;我们会部署访问控制机制,确保只有授权人员才可访问个人信息;以及我们会举办安全和隐私保护培训课程,加强员工对于保护个人信息重要性的认识。
|
||||
|
||||
(2)我们会采取一切合理可行的措施,确保未收集无关的个人信息。我们只会在达成本政策所述目的所需的期限内保留您的个人信息,除非需要延长保留期或受到法律的允许。
|
||||
|
||||
(3)互联网并非绝对安全的环境,而且电子邮件、即时通讯、及与其他我们用户的交流方式并未加密,我们强烈建议您不要通过此类方式发送个人信息。请使用复杂密码,协助我们保证您的账号安全。
|
||||
|
||||
(4)互联网环境并非百分之百安全,我们将尽力确保您发送给我们的任何信息的安全性。如果我们的物理、技术、或管理防护设施遭到破坏,导致信息被非授权访问、公开披露、篡改、或毁坏,导致您的合法权益受损,我们将承担相应的法律责任。同时,我们还有专业的安全技术和运营团队负责维护,便于及时有效的响应、处置各类安全漏洞和突发事件,联合相关部门进行安全事件溯源和打击。
|
||||
|
||||
(5)发生或者可能发生个人信息泄露、篡改、丢失的,我们将立即采取补救措施,并第一时间通知相关部门、负责人及信息主体、监管部门。通知内容包括:
|
||||
|
||||
(1)所泄露、篡改、丢失的信息种类、原因和可能造成的危害;
|
||||
|
||||
(2)我们所采取的补救措施和个人可以采取的减轻危害的措施;
|
||||
|
||||
(3)我们个人信息处理相关负责人的联系方式。
|
||||
|
||||
同时,我们将及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以邮件、信函、电话、推送通知等方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。
|
||||
五、您的权利
|
||||
|
||||
按照中国相关的法律、法规、标准,以及其他国家、地区的通行做法,我们保障您对自己的个人信息行使以下权利:
|
||||
(一)访问您的个人信息
|
||||
|
||||
(1)您有权访问您的个人信息,法律法规规定的例外情况除外。如果您想行使数据访问权,可以通过以下方式自行访问:
|
||||
|
||||
如果您希望访问或编辑您的账户中的个人资料信息和更改您的密码、添加安全信息或关闭您的账户等,您可以通过访问 XXX(产品)-社区-管理执行此类操作。
|
||||
|
||||
如果您无法通过上述链接访问这些个人信息,您可以随时添加官网客服微信或发送电子邮件至XXX@163.com。我们将在30天内回复您的访问请求。
|
||||
|
||||
(2)对于您在使用我们的产品或服务过程中产生的其他个人信息,只要我们不需要过多投入,我们会向您提供。如果您想行使数据访问权,请发送电子邮件至XXX@163.com
|
||||
|
||||
(二)更正您的个人信息
|
||||
|
||||
当您发现我们处理的关于您的个人信息有错误时,您有权要求我们做出更正。您可以通过"(一)访问您的个人信息"中罗列的方式提出更正申请。
|
||||
|
||||
如果您无法通过上述链接更正这些个人信息,您可以随时添加官网客服微信,或发送电子邮件至XXX@163.com。我们将在30天内回复您的更正请求。
|
||||
|
||||
(三)删除您的个人信息
|
||||
|
||||
在以下情形中,您可以向我们提出删除个人信息的请求:
|
||||
|
||||
1、如果我们处理个人信息的行为违反法律法规;
|
||||
|
||||
2、如果我们收集、使用您的个人信息,却未征得您的同意;
|
||||
|
||||
3、如果我们处理个人信息的行为违反了与您的约定;
|
||||
|
||||
4、如果您不再使用我们的产品或服务,或您注销了账号;
|
||||
|
||||
5、如果我们不再为您提供产品或服务。
|
||||
|
||||
您可通过XXX(产品)官网您的个人中心-账号设置中直接选择注销帐户来注销您的账号、添加官方客服微信或向XXX(产品)官方邮箱XXX@163.com发送邮件申请删除您的个人信息。XXX(产品)在收到您的注销/删除请求后,我们将同时通知从我们获得您的个人信息的实体,要求其及时删除,除非法律法规另有规定,或这些实体获得您的独立授权。当您从我们的服务中删除信息后,我们可能不会立即备份系统中删除相应的信息,但会在备份更新时删除这些信息。
|
||||
(四)改变您授权同意的范围
|
||||
|
||||
每个业务功能需要一些基本的个人信息才能得以完成(见本协议"第一部分")。对于额外收集的个人信息的收集和使用,您可以随时给予或收回您的授权同意。
|
||||
|
||||
您可以通过以下方式自行操作:
|
||||
|
||||
访问 XXX(产品) 我的设置 进行修改
|
||||
|
||||
当您收回同意后,我们将不再处理相应的个人信息。但您收回同意的决定,不会影响此前基于您的授权而开展的个人信息处理。
|
||||
(五)个人信息主体注销账户
|
||||
|
||||
您随时可注销此前注册的账户,您可以通过以下方式自行操作:
|
||||
|
||||
1、XXX(产品)官网您的个人中心-账号设置中直接选择注销帐户来注销您的账号;
|
||||
|
||||
2、向我们发送电子邮件(XXX@163.com)申请注销;
|
||||
|
||||
3、在注销账户之后,我们将停止为您提供产品或服务,并依据您的要求删除您的个人信息,法律法规另有规定的除外。
|
||||
|
||||
4、在技术可行的前提下,例如数据接口匹配,我们还可按您的要求,直接将您的个人信息副本传输给您指定的第三方,但未经您的明确许可,我们不会将相关信息提供给任意第三方。
|
||||
(六)约束信息系统自动决策
|
||||
|
||||
在某些业务功能中,我们可能仅依据信息系统、算法等在内的非人工自动决策机制做出决定。如果这些决定显著影响您的合法权益,您有权要求我们做出解释,我们也将提供适当的救济方式。
|
||||
(七)响应您的上述请求
|
||||
|
||||
为保障安全,您可能需要提供书面请求,或以其他方式证明您的身份。我们可能会先要求您验证自己的身份,然后再处理您的请求。
|
||||
|
||||
我们将在三十天内做出答复。如您不满意,还可以通过以下途径投诉:
|
||||
|
||||
邮箱:XXX@163.com
|
||||
|
||||
对于您合理的请求,我们原则上不收取费用,但对多次重复、超出合理限度的请求,我们将视情收取一定成本费用。对于那些无端重复、需要过多技术手段(例如,需要开发新系统或从根本上改变现行惯例)、给他人合法权益带来风险或者非常不切实际(例如,涉及备份磁带上存放的信息)的请求,我们可能会予以拒绝。
|
||||
|
||||
在以下情形中,按照法律法规要求,我们将无法响应您的请求:
|
||||
|
||||
1、与国家安全、国防安全有关的;
|
||||
|
||||
2、与公共安全、公共卫生、重大公共利益有关的;
|
||||
|
||||
3、与犯罪侦查、起诉和审判等有关的;
|
||||
|
||||
4、有充分证据表明您存在主观恶意或滥用权利的;
|
||||
|
||||
5、响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的。
|
||||
六、我们如何处理儿童/未成年人的个人信息
|
||||
|
||||
我们的产品、网站和服务主要面向成人。如果没有父母或监护人的同意,儿童不得创建自己的用户账户。
|
||||
|
||||
对于经父母、监护人同意而收集儿童个人信息的情况,我们只会在受到法律允许、父母或监护人明确同意或者保护儿童所必要的情况下使用或公开披露此信息。
|
||||
|
||||
尽管不同国家、地区法律和习俗对儿童的定义不同,但我们将不满14周岁的任何人均视为儿童。
|
||||
|
||||
如果我们发现自己在未事先获得可证实的父母同意的情况下收集了儿童的个人信息,则会设法尽快删除相关数据。
|
||||
|
||||
七、隐私政策的更新
|
||||
|
||||
我们可能适时会对本隐私政策进行调整或变更,本隐私政策的任何更新将以标注更新时间的方式公布在我们网站上,我们将在隐私政策更新后以网站公告、弹窗方式提醒您详细阅读并依据您的意愿选择是否同意适用新的隐私政策,如您拒绝同意更新后的隐私政策的,您或许无法使用全部或部分XXX(产品)提供的服务。
|
||||
|
||||
八、如何联系我们
|
||||
|
||||
如果您对本隐私政策有任何疑问、意见或建议,通过以下方式与我们联系:
|
||||
|
||||
电子邮箱:XXX@163.com
|
||||
|
||||
我们设立了个人信息保护专职部门(或个人信息保护专员),您可以通过以下方式与
|
||||
|
||||
电子邮箱:XXX@163.com
|
||||
|
||||
九、争议解决
|
||||
|
||||
有关本《隐私政策》的解释及争议解决均应适用中华人民共和国法律。如就本政策的签订、履行等发生任何争议的,双方应尽量友好协商解决;协商不成时,任何一方均可向XXX有限公司住所地享有管辖权的人民法院提起诉讼。
|
||||
附件一 《XXX(产品)儿童个人信息保护规则》
|
||||
|
||||
为了保护儿童个人信息安全,促进儿童健康成长。本规则旨在更详细的向监护人(以下也称"您")和儿童说明我们如何收集、使用、存储和处理儿童个人信息,以及我们为您与儿童提供的访问、更正、删除、保护这些信息的方式。如果您是儿童用户的监护人,请您在充分理解并同意本规则后再使用我们的产品和/或服务。
|
||||
|
||||
一、适用范围
|
||||
|
||||
本规则仅适用于在中华人民共和国境内通过网络从事收集、存储、使用、转移、披露儿童个人信息等活动。我们的产品及服务主要面向成年人,因此未成年人不得在未经监护人的许可下注册和登录用户账号。
|
||||
|
||||
我们将本着正当必要、本人及监护人知情同意、目的明确、安全保障、依法利用的原则收集、存储、使用、转移、披露儿童个人信息,指定本规则。《隐私政策》展示了我们收集、使用、处理、保护个人信息的一般做法,本规则为《隐私政策》的一部分;如在儿童个人信息保护规则方面,本规则与《隐私政策》正文存在不一致的,本规则优先适用,如本规则中未提及的,则视产品实际情况适用/参照适用《隐私政策》,本规则中涉及的词语含义与《隐私政策》正文中的一致。
|
||||
给监护人的特别说明:
|
||||
|
||||
当我们获悉您的孩子不满十四周岁,我们将根据本政策采取特殊措施保护我们获得的您孩子的个人信息,监护人比我们对您的权益保护更为便利,请帮助我们共同保护您孩子的个人信息和隐私安全,要求他们在您的监护下共同阅读本政策,在您的支持同意下使用我们的产品和/或服务。如果您不同意《隐私政策》及本规则,或任何与注册获取用户账号相关的协议。请您立即要求您的儿童停止访问XXX(产品),您同意本规则(包括更新规则)或者您在阅读本规则下同意您的儿童继续使用我们的产品和/或服务、提交个人信息,都表示您同意我们按照本规则收集、存储、使用、转移、披露您儿童个人信息。
|
||||
给儿童的特别说明:
|
||||
|
||||
如果您不满14周岁,请您在通知您的监护人且监护人明确同意本规则之前,不要使用我们的产品和/或服务。
|
||||
|
||||
二、我们收集和使用儿童个人信息的规则
|
||||
|
||||
1、我们会严格履行法律规定的儿童个人信息保护义务与责任,遵循正当必要、知情同意、目的明确、安全保障、依法利用的原则收集和使用儿童个人信息,不会收集与我们提供的产品和/或服务无关的儿童个人信息,不会违反法律规定和我们与您的约定收集、使用儿童个人信息。
|
||||
|
||||
2、我们没有独立的向儿童提供的产品和/或服务,一般情况下,我们收集和使用的儿童个人信息仅发生在《隐私政策》正文第一条我们如何收集和使用您的信息,在《隐私政策》指引下,我们一般情况无法主动获取账号使用者的年龄(除非您在个人账户信息中填写)或者确认实际使用人账户信息的真实性,此情况下适用《隐私政策》。一旦我们发现您是儿童,我们会对您的账户信息予以更高程度的保护。除《隐私政策》正文第一条外,我们还会收集您与儿童之间监护关系的信息。
|
||||
|
||||
3、我们再次以显著、清晰的方式告知儿童监护人,并应当征得儿童监护人的同意,我们可能会收集和使用的儿童的个人信息的规则请您查阅《隐私政策》正文第一条,因业务需要,当确需超出前述约定的目的、范围收集、使用您监护的儿童的个人信息的,我们会再次征得您的同意。
|
||||
三、我们共享、转移、公开披露儿童个人信息的规则
|
||||
(一)共享
|
||||
|
||||
对于儿童个人信息,我们仅在本规则所述的目的和范围内或依照法律要求进行共享,除非存在以下一种或多种情形:
|
||||
|
||||
1、与作为监护人的您之间的共享;
|
||||
|
||||
2、事先已征得您的明确授权同意;
|
||||
|
||||
3、如果我们需要改变儿童个人信息的处理目的时,将再次征求您的授权同意。
|
||||
|
||||
4、如我们需要委托服务商处理儿童个人信息的,请您放心,我们会对服务商和其服务行为等进行安全评估,签署协议,明确责任、处理事项、处理期限、处理性质和目的等,要求其处理行为不得超出我们的授权范围;
|
||||
|
||||
5、有权机关的要求、法律法规等规定的其他情形。
|
||||
|
||||
(二)转移与公开披露
|
||||
|
||||
我们会严格履行法律规定的儿童个人信息保护义务与责任,遵循正当必要、知情同意、目的明确、安全保障、依法利用的原则转移、公开披露儿童个人信息。如您希望了解更多,请您查阅《隐私政策》正文。
|
||||
四、您和/或儿童对儿童个人信息的相关权利
|
||||
|
||||
我们的产品和服务为您和儿童提供了多种对儿童个人信息行使相关权利的功能,您可以通过这些功能管理儿童个人信息和儿童的网络生活,包括:
|
||||
|
||||
(一)访问权
|
||||
|
||||
您或儿童可以在应用程序及WEB端查询和访问儿童的相关个人信息,例如:个人资料信息、视频观看记录、搜索记录、下载记录、收藏记录,详细操作步骤我们已经在《隐私政策》第五条向儿童及其监护人明确告知,您可以参照《隐私政策》进行操作。
|
||||
|
||||
(二)更正/修改权
|
||||
|
||||
您可以在WEB端更正/修改儿童的相关个人信息,例如:个人资料信息;或您可以联系我们解决(包括但不限于添加官网客服微信或发送相关需求至官网邮箱),我们会在经对您的身份进行验证,且不影响信息的客观性和准确性的情况下进行更正/修改。
|
||||
|
||||
同时,如您或儿童发现我们收集、存储、使用、披露的儿童个人信息有错误的,可以联系我们更正,我们会在完成身份验证和核实问题后及时采取措施予以更正。
|
||||
|
||||
(三)删除权
|
||||
|
||||
1、您和儿童可以在WEB端联系我们删除儿童的相关个人信息,详细操作步骤我们已经在《隐私政策》第四条及第五条向儿童及其监护人明确告知,您可以参照《隐私政策》进行操作,上述信息删除或导致您账户下的部分数据丢失,可能导致无法继续使用我们部分产品和/或服务。
|
||||
|
||||
2、在以下情形下,您或儿童可以直接向我们提出删除儿童个人信息的请求,我们会在完成身份验证和核实问题后及时采取措施予以删除,包括:
|
||||
|
||||
(1)我们违反法律法规规定或我们与监护人的约定收集、存储、使用、转移、披露儿童个人信息的;
|
||||
|
||||
(2)我们超出目的范围或者必要期限收集、存储、使用、转移、披露儿童个人信息的;
|
||||
|
||||
(3)监护人撤回同意的;
|
||||
|
||||
(4)监护人或儿童通过注销等方式终止使用的产品或服务的;
|
||||
|
||||
(5)法律法规等规定的其他情形。
|
||||
(四)提前获知产品和/或服务停止运营权
|
||||
|
||||
我们将持续为您提供优质服务,若因特殊原因导致我们的部分或全部产品和/或服务被迫停止运营,我们将提前在显著位置或向您发送推送消息或以其他方式通知您,并将停止对儿童个人信息的收集,删除或匿名化处理我们持有的儿童个人信息。
|
||||
五、我们存储和保护儿童个人信息的规则
|
||||
|
||||
我们依照法律法规的规定,将儿童个人信息存储于中华人民共和国境内。我们仅在为提供我们的产品和服务之目的所必需且最短的期间内保留儿童个人信息。在超出上述存储期限后,我们会对儿童个人信息进行删除或匿名化处理。
|
||||
|
||||
我们采用了符合行业标准的安全技术措施及配套的组织架构和管理体系等多层面保护措施来保护儿童个人信息;同时,我们遵循最小授权原则,对工作人员设定了严格的信息访问权限,控制儿童个人信息知悉范围;我们也采取了必要技术措施,避免违法复制、下载儿童个人信息。如您希望了解更多,请您查阅《隐私政策》正文第六条。
|
||||
六、联系我们
|
||||
|
||||
如您对本规则的执行或使用我们的产品和/或服务时遇到的与儿童隐私保护相关的事宜有任何问题(包括问题咨询、投诉等),您可以通过以下任意方式与我们联系:
|
||||
|
||||
·我们的主体信息:XXX有限公司
|
||||
|
||||
·我们的邮箱:XXX@163.com
|
||||
附件二:XXX(产品)第三方SDK服务商
|
||||
SDK服务 具体功能 获取权限 第三方隐私权政策链接
|
||||
微信主体:深圳市腾讯计算机系统有限公司 用于提供微信登陆、微信支付功能 常用设备信息(如IMEI/IMSI、SIM卡序列号/MAC地址)、网络信息以及地理位置信息,用于用户登录账户和支付过程中的安全风控。 https://weixin.qq.com/cgi-bin/readtemplate?lang=3Dzh_CN&t=3Dweixin_agreement&s=3Dprivacy
|
||||
QQ主体:深圳市腾讯计算机系统有限公司 用于提供QQ第三方登录功能 App开发者和/或终端用户主动提供或QQ直接收集的个人信息;App终端用户在使用QQ互联SDK产品和/或服务过程中产生的个人信息;从App开发者或者其他第三方获取的App开发者和/或终端用户的个人信息。 https://wiki.connect.qq.com/qq
|
||||
支付宝主体:支付宝(中国)网络技术有限公司 用于提供支付宝支付功能 常用设备信息(如IMEI/IMSI、SIM卡序列号/MAC地址)、网络信息以及地理位置信息,用于用户登录账户和支付过程中的安全风控。 https://opendocs.alipay.com/open/01g6qm
|
||||
`;
|
||||
|
|
@ -171,7 +171,7 @@
|
|||
{$i18n.t('Add Memory')}
|
||||
</div>
|
||||
</button>
|
||||
<button
|
||||
<!-- <button
|
||||
class="px-4 py-2 text-sm font-medium text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 rounded-xl transition"
|
||||
on:click={() => {
|
||||
if ($memories.length > 0) {
|
||||
|
|
@ -198,7 +198,7 @@
|
|||
</svg>
|
||||
{$i18n.t('Clear memory')}
|
||||
</div>
|
||||
</button>
|
||||
</button> -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -12,11 +12,13 @@
|
|||
import { ldapUserSignIn, getSessionUser, userSignIn, userSignUp } from '$lib/apis/auths';
|
||||
|
||||
import { WEBUI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants';
|
||||
import { agreementContent as defaultAgreementContent, privacyContent as defaultPrivacyContent } from '$lib/constants/legal';
|
||||
import { WEBUI_NAME, config, user, socket } from '$lib/stores';
|
||||
|
||||
import { generateInitialsImage, canvasPixelTest } from '$lib/utils';
|
||||
|
||||
import Spinner from '$lib/components/common/Spinner.svelte';
|
||||
import Modal from '$lib/components/common/Modal.svelte';
|
||||
import OnBoarding from '$lib/components/OnBoarding.svelte';
|
||||
import SensitiveInput from '$lib/components/common/SensitiveInput.svelte';
|
||||
import { redirect } from '@sveltejs/kit';
|
||||
|
|
@ -35,6 +37,12 @@
|
|||
let confirmPassword = '';
|
||||
|
||||
let ldapUsername = '';
|
||||
let agreeToTerms = false;
|
||||
let showAgreementModal = false;
|
||||
let agreementContent = defaultAgreementContent;
|
||||
let agreeToPrivacy = false;
|
||||
let showPrivacyModal = false;
|
||||
let privacyContent = defaultPrivacyContent;
|
||||
|
||||
const setSessionUser = async (sessionUser, redirectPath: string | null = null) => {
|
||||
if (sessionUser) {
|
||||
|
|
@ -95,8 +103,16 @@
|
|||
if (mode === 'ldap') {
|
||||
await ldapSignInHandler();
|
||||
} else if (mode === 'signin') {
|
||||
if (!agreeToTerms) {
|
||||
toast.error('如果要登陆,请先同意用户协议');
|
||||
return;
|
||||
}
|
||||
await signInHandler();
|
||||
} else {
|
||||
if (!agreeToPrivacy) {
|
||||
toast.error('如果要注册,请先同意隐私协议');
|
||||
return;
|
||||
}
|
||||
await signUpHandler();
|
||||
}
|
||||
};
|
||||
|
|
@ -229,7 +245,7 @@
|
|||
<img
|
||||
id="logo"
|
||||
crossorigin="anonymous"
|
||||
src="{WEBUI_BASE_URL}/static/favicon.png"
|
||||
src="static/favicon.png"
|
||||
class="size-24 rounded-full"
|
||||
alt=""
|
||||
/>
|
||||
|
|
@ -334,6 +350,29 @@
|
|||
/>
|
||||
</div>
|
||||
|
||||
{#if mode === 'signin'}
|
||||
<div class="mt-3 flex items-start text-sm text-left text-gray-700 dark:text-gray-300 gap-2">
|
||||
<input
|
||||
id="agree-terms"
|
||||
type="checkbox"
|
||||
class="mt-0.5 rounded border-gray-300 bg-transparent text-gray-800 dark:text-gray-100 focus:ring-0"
|
||||
bind:checked={agreeToTerms}
|
||||
/>
|
||||
<label for="agree-terms" class="leading-tight">
|
||||
<span>我已阅读并同意</span>
|
||||
<button
|
||||
type="button"
|
||||
class="ml-1 underline font-medium"
|
||||
on:click={() => {
|
||||
showAgreementModal = true;
|
||||
}}
|
||||
>
|
||||
用户协议
|
||||
</button>
|
||||
</label>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if mode === 'signup' && $config?.features?.enable_signup_password_confirmation}
|
||||
<div class="mt-2">
|
||||
<label
|
||||
|
|
@ -353,6 +392,29 @@
|
|||
/>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if mode === 'signup'}
|
||||
<div class="mt-3 flex items-start text-sm text-left text-gray-700 dark:text-gray-300 gap-2">
|
||||
<input
|
||||
id="agree-privacy"
|
||||
type="checkbox"
|
||||
class="mt-0.5 rounded border-gray-300 bg-transparent text-gray-800 dark:text-gray-100 focus:ring-0"
|
||||
bind:checked={agreeToPrivacy}
|
||||
/>
|
||||
<label for="agree-privacy" class="leading-tight">
|
||||
<span>我已阅读并同意</span>
|
||||
<button
|
||||
type="button"
|
||||
class="ml-1 underline font-medium"
|
||||
on:click={() => {
|
||||
showPrivacyModal = true;
|
||||
}}
|
||||
>
|
||||
隐私协议
|
||||
</button>
|
||||
</label>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
<div class="mt-5">
|
||||
|
|
@ -575,7 +637,7 @@
|
|||
<img
|
||||
id="logo"
|
||||
crossorigin="anonymous"
|
||||
src="{WEBUI_BASE_URL}/static/favicon.png"
|
||||
src="static/favicon.png"
|
||||
class=" w-6 rounded-full"
|
||||
alt=""
|
||||
/>
|
||||
|
|
@ -585,3 +647,52 @@
|
|||
{/if}
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
|
||||
<Modal bind:show={showAgreementModal} size="lg">
|
||||
<div class="p-8 space-y-5 max-w-4xl">
|
||||
<!-- <div class="space-y-1">
|
||||
<div class="text-xl font-semibold text-gray-900 dark:text-white">用户协议</div>
|
||||
<div class="text-sm text-gray-500 dark:text-gray-400">
|
||||
以下为占位说明,请替换为正式的服务条款与隐私政策。
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<div class="text-sm text-gray-800 dark:text-gray-100 leading-relaxed space-y-3 max-h-[60vh] overflow-y-auto pr-1 marked">
|
||||
{@html DOMPurify.sanitize(marked.parse(agreementContent || '这里是用户协议占位内容。请根据实际需求替换为正式的使用条款文本。'))}
|
||||
</div>
|
||||
|
||||
<div class="flex justify-end gap-2">
|
||||
<button
|
||||
type="button"
|
||||
class="px-4 py-2 text-sm rounded-full border border-gray-200 dark:border-gray-700 text-gray-800 dark:text-gray-100 hover:bg-gray-50 dark:hover:bg-gray-800 transition"
|
||||
on:click={() => {
|
||||
showAgreementModal = false;
|
||||
}}
|
||||
>
|
||||
关闭
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</Modal>
|
||||
|
||||
<Modal bind:show={showPrivacyModal} size="lg">
|
||||
<div class="p-8 space-y-5 max-w-4xl">
|
||||
|
||||
<div class="text-sm text-gray-800 dark:text-gray-100 leading-relaxed space-y-3 max-h-[60vh] overflow-y-auto pr-1 marked">
|
||||
{@html DOMPurify.sanitize(marked.parse(privacyContent || '这里是隐私协议占位内容。请根据实际需求替换为正式的隐私政策文本。'))}
|
||||
</div>
|
||||
|
||||
<div class="flex justify-end gap-2">
|
||||
<button
|
||||
type="button"
|
||||
class="px-4 py-2 text-sm rounded-full border border-gray-200 dark:border-gray-700 text-gray-800 dark:text-gray-100 hover:bg-gray-50 dark:hover:bg-gray-800 transition"
|
||||
on:click={() => {
|
||||
showPrivacyModal = false;
|
||||
}}
|
||||
>
|
||||
关闭
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</Modal>
|
||||
|
|
|
|||
Loading…
Reference in a new issue