diff --git a/.github/workflows/vdb-tests.yml b/.github/workflows/vdb-tests.yml index a5ba51ce0e..73af370063 100644 --- a/.github/workflows/vdb-tests.yml +++ b/.github/workflows/vdb-tests.yml @@ -8,6 +8,8 @@ on: - api/core/rag/datasource/** - docker/** - .github/workflows/vdb-tests.yml + - api/poetry.lock + - api/pyproject.toml concurrency: group: vdb-tests-${{ github.head_ref || github.run_id }} diff --git a/api/configs/packaging/__init__.py b/api/configs/packaging/__init__.py index 1f2b8224e8..5d2a0231b0 100644 --- a/api/configs/packaging/__init__.py +++ b/api/configs/packaging/__init__.py @@ -9,7 +9,7 @@ class PackagingInfo(BaseSettings): CURRENT_VERSION: str = Field( description="Dify version", - default="0.11.2", + default="0.12.1", ) COMMIT_SHA: str = Field( diff --git a/api/controllers/console/app/app.py b/api/controllers/console/app/app.py index 9687b59cd1..da72b704c7 100644 --- a/api/controllers/console/app/app.py +++ b/api/controllers/console/app/app.py @@ -190,7 +190,7 @@ class AppCopyApi(Resource): ) session.commit() - stmt = select(App).where(App.id == result.app.id) + stmt = select(App).where(App.id == result.app_id) app = session.scalar(stmt) return app, 201 diff --git a/api/core/app/apps/advanced_chat/app_generator.py b/api/core/app/apps/advanced_chat/app_generator.py index fbef787c98..660527487e 100644 --- a/api/core/app/apps/advanced_chat/app_generator.py +++ b/api/core/app/apps/advanced_chat/app_generator.py @@ -138,7 +138,9 @@ class AdvancedChatAppGenerator(MessageBasedAppGenerator): conversation_id=conversation.id if conversation else None, inputs=conversation.inputs if conversation - else self._prepare_user_inputs(user_inputs=inputs, variables=app_config.variables, tenant_id=app_model.id), + else self._prepare_user_inputs( + user_inputs=inputs, variables=app_config.variables, tenant_id=app_model.tenant_id + ), query=query, files=file_objs, parent_message_id=args.get("parent_message_id") if invoke_from != InvokeFrom.SERVICE_API else UUID_NIL, diff --git a/api/core/app/apps/agent_chat/app_generator.py b/api/core/app/apps/agent_chat/app_generator.py index 1df517d859..3789166c92 100644 --- a/api/core/app/apps/agent_chat/app_generator.py +++ b/api/core/app/apps/agent_chat/app_generator.py @@ -139,7 +139,9 @@ class AgentChatAppGenerator(MessageBasedAppGenerator): conversation_id=conversation.id if conversation else None, inputs=conversation.inputs if conversation - else self._prepare_user_inputs(user_inputs=inputs, variables=app_config.variables, tenant_id=app_model.id), + else self._prepare_user_inputs( + user_inputs=inputs, variables=app_config.variables, tenant_id=app_model.tenant_id + ), query=query, files=file_objs, parent_message_id=args.get("parent_message_id") if invoke_from != InvokeFrom.SERVICE_API else UUID_NIL, diff --git a/api/core/app/apps/chat/app_generator.py b/api/core/app/apps/chat/app_generator.py index dce59cc09e..9fbf232087 100644 --- a/api/core/app/apps/chat/app_generator.py +++ b/api/core/app/apps/chat/app_generator.py @@ -142,7 +142,9 @@ class ChatAppGenerator(MessageBasedAppGenerator): conversation_id=conversation.id if conversation else None, inputs=conversation.inputs if conversation - else self._prepare_user_inputs(user_inputs=inputs, variables=app_config.variables, tenant_id=app_model.id), + else self._prepare_user_inputs( + user_inputs=inputs, variables=app_config.variables, tenant_id=app_model.tenant_id + ), query=query, files=file_objs, parent_message_id=args.get("parent_message_id") if invoke_from != InvokeFrom.SERVICE_API else UUID_NIL, diff --git a/api/core/app/apps/completion/app_generator.py b/api/core/app/apps/completion/app_generator.py index 1678ebbfe2..eb3633f488 100644 --- a/api/core/app/apps/completion/app_generator.py +++ b/api/core/app/apps/completion/app_generator.py @@ -124,7 +124,7 @@ class CompletionAppGenerator(MessageBasedAppGenerator): model_conf=ModelConfigConverter.convert(app_config), file_upload_config=file_extra_config, inputs=self._prepare_user_inputs( - user_inputs=inputs, variables=app_config.variables, tenant_id=app_model.id + user_inputs=inputs, variables=app_config.variables, tenant_id=app_model.tenant_id ), query=query, files=file_objs, diff --git a/api/core/app/task_pipeline/workflow_cycle_manage.py b/api/core/app/task_pipeline/workflow_cycle_manage.py index 9229cbcc0a..d45726af46 100644 --- a/api/core/app/task_pipeline/workflow_cycle_manage.py +++ b/api/core/app/task_pipeline/workflow_cycle_manage.py @@ -3,6 +3,7 @@ import time from collections.abc import Mapping, Sequence from datetime import UTC, datetime from typing import Any, Optional, Union, cast +from uuid import uuid4 from sqlalchemy.orm import Session @@ -80,38 +81,38 @@ class WorkflowCycleManage: inputs[f"sys.{key.value}"] = value - inputs = WorkflowEntry.handle_special_values(inputs) - triggered_from = ( WorkflowRunTriggeredFrom.DEBUGGING if self._application_generate_entity.invoke_from == InvokeFrom.DEBUGGER else WorkflowRunTriggeredFrom.APP_RUN ) - # init workflow run - workflow_run = WorkflowRun() - workflow_run_id = self._workflow_system_variables[SystemVariableKey.WORKFLOW_RUN_ID] - if workflow_run_id: - workflow_run.id = workflow_run_id - workflow_run.tenant_id = self._workflow.tenant_id - workflow_run.app_id = self._workflow.app_id - workflow_run.sequence_number = new_sequence_number - workflow_run.workflow_id = self._workflow.id - workflow_run.type = self._workflow.type - workflow_run.triggered_from = triggered_from.value - workflow_run.version = self._workflow.version - workflow_run.graph = self._workflow.graph - workflow_run.inputs = json.dumps(inputs) - workflow_run.status = WorkflowRunStatus.RUNNING.value - workflow_run.created_by_role = ( - CreatedByRole.ACCOUNT.value if isinstance(self._user, Account) else CreatedByRole.END_USER.value - ) - workflow_run.created_by = self._user.id + # handle special values + inputs = WorkflowEntry.handle_special_values(inputs) - db.session.add(workflow_run) - db.session.commit() - db.session.refresh(workflow_run) - db.session.close() + # init workflow run + with Session(db.engine, expire_on_commit=False) as session: + workflow_run = WorkflowRun() + system_id = self._workflow_system_variables[SystemVariableKey.WORKFLOW_RUN_ID] + workflow_run.id = system_id or str(uuid4()) + workflow_run.tenant_id = self._workflow.tenant_id + workflow_run.app_id = self._workflow.app_id + workflow_run.sequence_number = new_sequence_number + workflow_run.workflow_id = self._workflow.id + workflow_run.type = self._workflow.type + workflow_run.triggered_from = triggered_from.value + workflow_run.version = self._workflow.version + workflow_run.graph = self._workflow.graph + workflow_run.inputs = json.dumps(inputs) + workflow_run.status = WorkflowRunStatus.RUNNING + workflow_run.created_by_role = ( + CreatedByRole.ACCOUNT if isinstance(self._user, Account) else CreatedByRole.END_USER + ) + workflow_run.created_by = self._user.id + workflow_run.created_at = datetime.now(UTC).replace(tzinfo=None) + + session.add(workflow_run) + session.commit() return workflow_run diff --git a/api/core/ops/ops_trace_manager.py b/api/core/ops/ops_trace_manager.py index 1069889abd..b7799ce1fb 100644 --- a/api/core/ops/ops_trace_manager.py +++ b/api/core/ops/ops_trace_manager.py @@ -445,7 +445,7 @@ class TraceTask: "ls_provider": message_data.model_provider, "ls_model_name": message_data.model_id, "status": message_data.status, - "from_end_user_id": message_data.from_account_id, + "from_end_user_id": message_data.from_end_user_id, "from_account_id": message_data.from_account_id, "agent_based": message_data.agent_based, "workflow_run_id": message_data.workflow_run_id, @@ -521,7 +521,7 @@ class TraceTask: "ls_provider": message_data.model_provider, "ls_model_name": message_data.model_id, "status": message_data.status, - "from_end_user_id": message_data.from_account_id, + "from_end_user_id": message_data.from_end_user_id, "from_account_id": message_data.from_account_id, "agent_based": message_data.agent_based, "workflow_run_id": message_data.workflow_run_id, @@ -570,7 +570,7 @@ class TraceTask: "ls_provider": message_data.model_provider, "ls_model_name": message_data.model_id, "status": message_data.status, - "from_end_user_id": message_data.from_account_id, + "from_end_user_id": message_data.from_end_user_id, "from_account_id": message_data.from_account_id, "agent_based": message_data.agent_based, "workflow_run_id": message_data.workflow_run_id, diff --git a/api/core/workflow/nodes/llm/node.py b/api/core/workflow/nodes/llm/node.py index 4a6f0ecae9..39480e34b3 100644 --- a/api/core/workflow/nodes/llm/node.py +++ b/api/core/workflow/nodes/llm/node.py @@ -20,6 +20,7 @@ from core.model_runtime.entities import ( from core.model_runtime.entities.llm_entities import LLMResult, LLMUsage from core.model_runtime.entities.message_entities import ( AssistantPromptMessage, + PromptMessageContent, PromptMessageRole, SystemPromptMessage, UserPromptMessage, @@ -66,7 +67,6 @@ from .entities import ( ModelConfig, ) from .exc import ( - FileTypeNotSupportError, InvalidContextStructureError, InvalidVariableTypeError, LLMModeRequiredError, @@ -137,12 +137,12 @@ class LLMNode(BaseNode[LLMNodeData]): query = None if self.node_data.memory: query = self.node_data.memory.query_prompt_template - if query is None and ( - query_variable := self.graph_runtime_state.variable_pool.get( - (SYSTEM_VARIABLE_NODE_ID, SystemVariableKey.QUERY) - ) - ): - query = query_variable.text + if not query and ( + query_variable := self.graph_runtime_state.variable_pool.get( + (SYSTEM_VARIABLE_NODE_ID, SystemVariableKey.QUERY) + ) + ): + query = query_variable.text prompt_messages, stop = self._fetch_prompt_messages( user_query=query, @@ -675,7 +675,7 @@ class LLMNode(BaseNode[LLMNodeData]): and ModelFeature.AUDIO not in model_config.model_schema.features ) ): - raise FileTypeNotSupportError(type_name=content_item.type) + continue prompt_message_content.append(content_item) if len(prompt_message_content) == 1 and prompt_message_content[0].type == PromptMessageContentType.TEXT: prompt_message.content = prompt_message_content[0].data @@ -828,14 +828,14 @@ class LLMNode(BaseNode[LLMNodeData]): } -def _combine_text_message_with_role(*, text: str, role: PromptMessageRole): +def _combine_message_content_with_role(*, contents: Sequence[PromptMessageContent], role: PromptMessageRole): match role: case PromptMessageRole.USER: - return UserPromptMessage(content=[TextPromptMessageContent(data=text)]) + return UserPromptMessage(content=contents) case PromptMessageRole.ASSISTANT: - return AssistantPromptMessage(content=[TextPromptMessageContent(data=text)]) + return AssistantPromptMessage(content=contents) case PromptMessageRole.SYSTEM: - return SystemPromptMessage(content=[TextPromptMessageContent(data=text)]) + return SystemPromptMessage(content=contents) raise NotImplementedError(f"Role {role} is not supported") @@ -877,7 +877,9 @@ def _handle_list_messages( jinjia2_variables=jinja2_variables, variable_pool=variable_pool, ) - prompt_message = _combine_text_message_with_role(text=result_text, role=message.role) + prompt_message = _combine_message_content_with_role( + contents=[TextPromptMessageContent(data=result_text)], role=message.role + ) prompt_messages.append(prompt_message) else: # Get segment group from basic message @@ -908,12 +910,14 @@ def _handle_list_messages( # Create message with text from all segments plain_text = segment_group.text if plain_text: - prompt_message = _combine_text_message_with_role(text=plain_text, role=message.role) + prompt_message = _combine_message_content_with_role( + contents=[TextPromptMessageContent(data=plain_text)], role=message.role + ) prompt_messages.append(prompt_message) if file_contents: # Create message with image contents - prompt_message = UserPromptMessage(content=file_contents) + prompt_message = _combine_message_content_with_role(contents=file_contents, role=message.role) prompt_messages.append(prompt_message) return prompt_messages @@ -1018,6 +1022,8 @@ def _handle_completion_template( else: template_text = template.text result_text = variable_pool.convert_template(template_text).text - prompt_message = _combine_text_message_with_role(text=result_text, role=PromptMessageRole.USER) + prompt_message = _combine_message_content_with_role( + contents=[TextPromptMessageContent(data=result_text)], role=PromptMessageRole.USER + ) prompt_messages.append(prompt_message) return prompt_messages diff --git a/api/libs/helper.py b/api/libs/helper.py index 6b8da40562..e6ad377e9f 100644 --- a/api/libs/helper.py +++ b/api/libs/helper.py @@ -31,12 +31,12 @@ class AppIconUrlField(fields.Raw): if obj is None: return None - from models.model import App, IconType + from models.model import App, IconType, Site if isinstance(obj, dict) and "app" in obj: obj = obj["app"] - if isinstance(obj, App) and obj.icon_type == IconType.IMAGE.value: + if isinstance(obj, App | Site) and obj.icon_type == IconType.IMAGE.value: return file_helpers.get_signed_file_url(obj.icon) return None diff --git a/api/models/account.py b/api/models/account.py index 68b39f9904..f040ac39f5 100644 --- a/api/models/account.py +++ b/api/models/account.py @@ -59,8 +59,8 @@ class Account(UserMixin, Base): self._current_tenant = tenant @property - def current_tenant_id(self): - return self._current_tenant.id + def current_tenant_id(self) -> str | None: + return self._current_tenant.id if self._current_tenant else None @current_tenant_id.setter def current_tenant_id(self, value: str): diff --git a/api/models/workflow.py b/api/models/workflow.py index 6545bdc0ac..fc75cdddb3 100644 --- a/api/models/workflow.py +++ b/api/models/workflow.py @@ -6,6 +6,7 @@ from typing import TYPE_CHECKING, Any, Optional, Union if TYPE_CHECKING: from models.model import AppMode +from enum import StrEnum import sqlalchemy as sa from sqlalchemy import Index, PrimaryKeyConstraint, func @@ -318,7 +319,7 @@ class Workflow(Base): ) -class WorkflowRunStatus(Enum): +class WorkflowRunStatus(StrEnum): """ Workflow Run Status Enum """ @@ -397,13 +398,13 @@ class WorkflowRun(Base): version = db.Column(db.String(255), nullable=False) graph = db.Column(db.Text) inputs = db.Column(db.Text) - status = db.Column(db.String(255), nullable=False) - outputs: Mapped[str] = db.Column(db.Text) + status = db.Column(db.String(255), nullable=False) # running, succeeded, failed, stopped + outputs: Mapped[str] = mapped_column(sa.Text, default="{}") error = db.Column(db.Text) elapsed_time = db.Column(db.Float, nullable=False, server_default=db.text("0")) total_tokens = db.Column(db.Integer, nullable=False, server_default=db.text("0")) total_steps = db.Column(db.Integer, server_default=db.text("0")) - created_by_role = db.Column(db.String(255), nullable=False) + created_by_role = db.Column(db.String(255), nullable=False) # account, end_user created_by = db.Column(StringUUID, nullable=False) created_at = db.Column(db.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP(0)")) finished_at = db.Column(db.DateTime) diff --git a/api/services/conversation_service.py b/api/services/conversation_service.py index f3e76d3300..8642972710 100644 --- a/api/services/conversation_service.py +++ b/api/services/conversation_service.py @@ -1,3 +1,4 @@ +from collections.abc import Callable from datetime import UTC, datetime from typing import Optional, Union @@ -74,14 +75,14 @@ class ConversationService: return InfiniteScrollPagination(data=conversations, limit=limit, has_more=has_more) @classmethod - def _get_sort_params(cls, sort_by: str) -> tuple[str, callable]: + def _get_sort_params(cls, sort_by: str): if sort_by.startswith("-"): return sort_by[1:], desc return sort_by, asc @classmethod def _build_filter_condition( - cls, sort_field: str, sort_direction: callable, reference_conversation: Conversation, is_next_page: bool = False + cls, sort_field: str, sort_direction: Callable, reference_conversation: Conversation, is_next_page: bool = False ): field_value = getattr(reference_conversation, sort_field) if (sort_direction == desc and not is_next_page) or (sort_direction == asc and is_next_page): @@ -160,5 +161,5 @@ class ConversationService: conversation = cls.get_conversation(app_model, conversation_id, user) conversation.is_deleted = True - conversation.updated_at = datetime.now(timezone.utc).replace(tzinfo=None) + conversation.updated_at = datetime.now(UTC).replace(tzinfo=None) db.session.commit() diff --git a/docker-legacy/docker-compose.chroma.yaml b/docker-legacy/docker-compose.chroma.yaml index a943d620c0..63354305de 100644 --- a/docker-legacy/docker-compose.chroma.yaml +++ b/docker-legacy/docker-compose.chroma.yaml @@ -1,7 +1,7 @@ services: # Chroma vector store. chroma: - image: ghcr.io/chroma-core/chroma:0.5.1 + image: ghcr.io/chroma-core/chroma:0.5.20 restart: always volumes: - ./volumes/chroma:/chroma/chroma diff --git a/docker-legacy/docker-compose.yaml b/docker-legacy/docker-compose.yaml index 7bf2cd4708..aaca3c9c12 100644 --- a/docker-legacy/docker-compose.yaml +++ b/docker-legacy/docker-compose.yaml @@ -2,7 +2,7 @@ version: '3' services: # API service api: - image: langgenius/dify-api:0.11.2 + image: langgenius/dify-api:0.12.1 restart: always environment: # Startup mode, 'api' starts the API server. @@ -227,7 +227,7 @@ services: # worker service # The Celery worker for processing the queue. worker: - image: langgenius/dify-api:0.11.2 + image: langgenius/dify-api:0.12.1 restart: always environment: CONSOLE_WEB_URL: '' @@ -397,7 +397,7 @@ services: # Frontend web application. web: - image: langgenius/dify-web:0.11.2 + image: langgenius/dify-web:0.12.1 restart: always environment: # The base URL of console application api server, refers to the Console base URL of WEB service if console domain is diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index 3822048cf9..77e022d9b9 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -291,7 +291,7 @@ x-shared-env: &shared-api-worker-env services: # API service api: - image: langgenius/dify-api:0.11.2 + image: langgenius/dify-api:0.12.1 restart: always environment: # Use the shared environment variables. @@ -311,7 +311,7 @@ services: # worker service # The Celery worker for processing the queue. worker: - image: langgenius/dify-api:0.11.2 + image: langgenius/dify-api:0.12.1 restart: always environment: # Use the shared environment variables. @@ -330,7 +330,7 @@ services: # Frontend web application. web: - image: langgenius/dify-web:0.11.2 + image: langgenius/dify-web:0.12.1 restart: always environment: CONSOLE_API_URL: ${CONSOLE_API_URL:-} @@ -607,7 +607,7 @@ services: # Chroma vector database chroma: - image: ghcr.io/chroma-core/chroma:0.5.1 + image: ghcr.io/chroma-core/chroma:0.5.20 profiles: - chroma restart: always diff --git a/web/app/components/base/divider/index.tsx b/web/app/components/base/divider/index.tsx index 4b351dea99..fcee10a9e2 100644 --- a/web/app/components/base/divider/index.tsx +++ b/web/app/components/base/divider/index.tsx @@ -3,17 +3,21 @@ import React from 'react' import { type VariantProps, cva } from 'class-variance-authority' import classNames from '@/utils/classnames' -const dividerVariants = cva( - 'bg-divider-regular', +const dividerVariants = cva('', { variants: { type: { - horizontal: 'w-full h-[0.5px] my-2', + horizontal: 'w-full h-[0.5px] my-2 ', vertical: 'w-[1px] h-full mx-2', }, + bgStyle: { + gradient: 'bg-gradient-to-r from-divider-regular to-background-gradient-mask-transparent', + solid: 'bg-divider-regular', + }, }, defaultVariants: { type: 'horizontal', + bgStyle: 'solid', }, }, ) @@ -23,9 +27,9 @@ type DividerProps = { style?: CSSProperties } & VariantProps -const Divider: FC = ({ type, className = '', style }) => { +const Divider: FC = ({ type, bgStyle, className = '', style }) => { return ( -
+
) } diff --git a/web/app/components/base/ga/index.tsx b/web/app/components/base/ga/index.tsx index 219724113f..0015edbfca 100644 --- a/web/app/components/base/ga/index.tsx +++ b/web/app/components/base/ga/index.tsx @@ -47,6 +47,12 @@ gtag('config', '${gaIdMaps[gaType]}'); nonce={nonce!} > + {/* Cookie banner */} + ) diff --git a/web/app/components/explore/app-list/index.tsx b/web/app/components/explore/app-list/index.tsx index 6186d8164d..b8e7939328 100644 --- a/web/app/components/explore/app-list/index.tsx +++ b/web/app/components/explore/app-list/index.tsx @@ -14,7 +14,7 @@ import type { App } from '@/models/explore' import Category from '@/app/components/explore/category' import AppCard from '@/app/components/explore/app-card' import { fetchAppDetail, fetchAppList } from '@/service/explore' -import { importApp } from '@/service/apps' +import { importDSL } from '@/service/apps' import { useTabSearchParams } from '@/hooks/use-tab-searchparams' import CreateAppModal from '@/app/components/explore/create-app-modal' import AppTypeSelector from '@/app/components/app/type-selector' @@ -24,6 +24,7 @@ import { NEED_REFRESH_APP_LIST_KEY } from '@/config' import { useAppContext } from '@/context/app-context' import { getRedirection } from '@/utils/app-redirection' import Input from '@/app/components/base/input' +import { DSLImportMode } from '@/models/app' type AppsProps = { pageType?: PageType @@ -127,8 +128,9 @@ const Apps = ({ currApp?.app.id as string, ) try { - const app = await importApp({ - data: export_data, + const app = await importDSL({ + mode: DSLImportMode.YAML_CONTENT, + yaml_content: export_data, name, icon_type, icon, @@ -143,7 +145,7 @@ const Apps = ({ if (onSuccess) onSuccess() localStorage.setItem(NEED_REFRESH_APP_LIST_KEY, '1') - getRedirection(isCurrentWorkspaceEditor, app, push) + getRedirection(isCurrentWorkspaceEditor, { id: app.app_id }, push) } catch (e) { Toast.notify({ type: 'error', message: t('app.newApp.appCreateFailed') }) diff --git a/web/app/components/workflow/nodes/_base/components/memory-config.tsx b/web/app/components/workflow/nodes/_base/components/memory-config.tsx index 6cf548877e..1e436c28e7 100644 --- a/web/app/components/workflow/nodes/_base/components/memory-config.tsx +++ b/web/app/components/workflow/nodes/_base/components/memory-config.tsx @@ -53,7 +53,7 @@ type Props = { const MEMORY_DEFAULT: Memory = { window: { enabled: false, size: WINDOW_SIZE_DEFAULT }, - query_prompt_template: '', + query_prompt_template: '{{#sys.query#}}', } const MemoryConfig: FC = ({ diff --git a/web/app/signin/layout.tsx b/web/app/signin/layout.tsx index 342876bc53..b404c5c4de 100644 --- a/web/app/signin/layout.tsx +++ b/web/app/signin/layout.tsx @@ -1,25 +1,10 @@ -import Script from 'next/script' import Header from './_header' import style from './page.module.css' import cn from '@/utils/classnames' -import { IS_CE_EDITION } from '@/config' export default async function SignInLayout({ children }: any) { return <> - {!IS_CE_EDITION && ( - <> - - - - )} -
=18.17.0" diff --git a/web/themes/dark.css b/web/themes/dark.css index f0a7b521c6..dc24322bf5 100644 --- a/web/themes/dark.css +++ b/web/themes/dark.css @@ -85,6 +85,10 @@ html[data-theme="dark"] { --color-components-button-secondary-accent-border-hover: #FFFFFF1F; --color-components-button-secondary-accent-border-disabled: #FFFFFF0D; + --color-components-button-indigo-bg: #444CE7; + --color-components-button-indigo-bg-hover: #6172F3; + --color-components-button-indigo-bg-disabled: #FFFFFF08; + --color-components-checkbox-icon: #FFFFFFF2; --color-components-checkbox-icon-disabled: #FFFFFF33; --color-components-checkbox-bg: #296DFF; @@ -315,6 +319,39 @@ html[data-theme="dark"] { --color-components-premium-badge-orange-stroke-stop-0-hover: #FFFFFF80; --color-components-premium-badge-orange-stroke-stop-100-hover: #FF4405; + --color-components-progress-bar-bg: #C8CEDA14; + --color-components-progress-bar-progress: #C8CEDA24; + --color-components-progress-bar-border: #FFFFFF08; + --color-components-progress-bar-progress-solid: #FFFFFFF2; + --color-components-progress-bar-progress-highlight: #C8CEDA33; + + --color-components-icon-bg-red-solid: #D92D20; + --color-components-icon-bg-rose-solid: #E31B54; + --color-components-icon-bg-pink-solid: #DD2590; + --color-components-icon-bg-orange-dark-solid: #FF4405; + --color-components-icon-bg-yellow-solid: #EAAA08; + --color-components-icon-bg-green-solid: #4CA30D; + --color-components-icon-bg-teal-solid: #0E9384; + --color-components-icon-bg-blue-light-solid: #0BA5EC; + --color-components-icon-bg-blue-solid: #155AEF; + --color-components-icon-bg-indigo-solid: #444CE7; + --color-components-icon-bg-violet-solid: #7839EE; + --color-components-icon-bg-midnight-solid: #5D698D; + --color-components-icon-bg-rose-soft: #F63D6833; + --color-components-icon-bg-pink-soft: #EE46BC33; + --color-components-icon-bg-orange-dark-soft: #FF440533; + --color-components-icon-bg-yellow-soft: #EAAA0833; + --color-components-icon-bg-green-soft: #66C61C33; + --color-components-icon-bg-teal-soft: #15B79E33; + --color-components-icon-bg-blue-light-soft: #0BA5EC33; + --color-components-icon-bg-blue-soft: #155AEF33; + --color-components-icon-bg-indigo-soft: #6172F333; + --color-components-icon-bg-violet-soft: #875BF733; + --color-components-icon-bg-midnight-soft: #828DAD33; + --color-components-icon-bg-red-soft: #F0443833; + --color-components-icon-bg-orange-solid: #F79009; + --color-components-icon-bg-orange-soft: #F7900933; + --color-text-primary: #FBFBFC; --color-text-secondary: #D9D9DE; --color-text-tertiary: #C8CEDA99; @@ -410,12 +447,6 @@ html[data-theme="dark"] { --color-workflow-link-line-error-active: #F97066; --color-workflow-link-line-error-handle: #F97066; - --color-workflow-link-line-success-active: #47CD89; - --color-workflow-link-line-success-handle: #47CD89; - - --color-workflow-link-line-error-active: #F97066; - --color-workflow-link-line-error-handle: #F97066; - --color-workflow-minimap-bg: #27272B; --color-workflow-minimap-block: #C8CEDA14; @@ -697,4 +728,11 @@ html[data-theme="dark"] { --color-third-party-model-bg-openai: #121212; --color-third-party-model-bg-anthropic: #1D1917; --color-third-party-model-bg-default: #0B0B0E; + + --color-third-party-aws: #141F2E; + --color-third-party-aws-alt: #192639; + + --color-saas-background: #0B0B0E; + --color-saas-pricing-grid-bg: #C8CEDA33; + } \ No newline at end of file diff --git a/web/themes/light.css b/web/themes/light.css index 5ad92229c0..6fb2a6b00c 100644 --- a/web/themes/light.css +++ b/web/themes/light.css @@ -85,6 +85,10 @@ html[data-theme="light"] { --color-components-button-secondary-accent-border-hover: #10182824; --color-components-button-secondary-accent-border-disabled: #1018280A; + --color-components-button-indigo-bg: #444CE7; + --color-components-button-indigo-bg-hover: #3538CD; + --color-components-button-indigo-bg-disabled: #6172F324; + --color-components-checkbox-icon: #FFFFFF; --color-components-checkbox-icon-disabled: #FFFFFF80; --color-components-checkbox-bg: #155AEF; @@ -315,6 +319,39 @@ html[data-theme="light"] { --color-components-premium-badge-orange-stroke-stop-0-hover: #FFFFFFF2; --color-components-premium-badge-orange-stroke-stop-100-hover: #BC1B06; + --color-components-progress-bar-bg: #155AEF0A; + --color-components-progress-bar-progress: #155AEF24; + --color-components-progress-bar-border: #1018280A; + --color-components-progress-bar-progress-solid: #296DFF; + --color-components-progress-bar-progress-highlight: #155AEF33; + + --color-components-icon-bg-red-solid: #D92D20; + --color-components-icon-bg-rose-solid: #E31B54; + --color-components-icon-bg-pink-solid: #DD2590; + --color-components-icon-bg-orange-dark-solid: #FF4405; + --color-components-icon-bg-yellow-solid: #EAAA08; + --color-components-icon-bg-green-solid: #4CA30D; + --color-components-icon-bg-teal-solid: #0E9384; + --color-components-icon-bg-blue-light-solid: #0BA5EC; + --color-components-icon-bg-blue-solid: #155AEF; + --color-components-icon-bg-indigo-solid: #444CE7; + --color-components-icon-bg-violet-solid: #7839EE; + --color-components-icon-bg-midnight-solid: #828DAD; + --color-components-icon-bg-rose-soft: #FFF1F3; + --color-components-icon-bg-pink-soft: #FDF2FA; + --color-components-icon-bg-orange-dark-soft: #FFF4ED; + --color-components-icon-bg-yellow-soft: #FEFBE8; + --color-components-icon-bg-green-soft: #F3FEE7; + --color-components-icon-bg-teal-soft: #F0FDF9; + --color-components-icon-bg-blue-light-soft: #F0F9FF; + --color-components-icon-bg-blue-soft: #EFF4FF; + --color-components-icon-bg-indigo-soft: #EEF4FF; + --color-components-icon-bg-violet-soft: #F5F3FF; + --color-components-icon-bg-midnight-soft: #F0F2F5; + --color-components-icon-bg-red-soft: #FEF3F2; + --color-components-icon-bg-orange-solid: #F79009; + --color-components-icon-bg-orange-soft: #FFFAEB; + --color-text-primary: #101828; --color-text-secondary: #354052; --color-text-tertiary: #676F83; @@ -684,11 +721,17 @@ html[data-theme="light"] { --color-third-party-LangChain: #1C3C3C; --color-third-party-Langfuse: #000000; - --color-third-party-Github: #1B1F24; --color-third-party-Github-tertiary: #1B1F24; --color-third-party-Github-secondary: #1B1F24; --color-third-party-model-bg-openai: #E3E5E8; --color-third-party-model-bg-anthropic: #EEEDE7; --color-third-party-model-bg-default: #F9FAFB; + + --color-third-party-aws: #141F2E; + --color-third-party-aws-alt: #0F1824; + + --color-saas-background: #FCFCFD; + --color-saas-pricing-grid-bg: #C8CEDA80; + } \ No newline at end of file diff --git a/web/themes/tailwind-theme-var-define.ts b/web/themes/tailwind-theme-var-define.ts index e42b7fba5e..6329ce3d26 100644 --- a/web/themes/tailwind-theme-var-define.ts +++ b/web/themes/tailwind-theme-var-define.ts @@ -85,6 +85,10 @@ const vars = { 'components-button-secondary-accent-border-hover': 'var(--color-components-button-secondary-accent-border-hover)', 'components-button-secondary-accent-border-disabled': 'var(--color-components-button-secondary-accent-border-disabled)', + 'components-button-indigo-bg': 'var(--color-components-button-indigo-bg)', + 'components-button-indigo-bg-hover': 'var(--color-components-button-indigo-bg-hover)', + 'components-button-indigo-bg-disabled': 'var(--color-components-button-indigo-bg-disabled)', + 'components-checkbox-icon': 'var(--color-components-checkbox-icon)', 'components-checkbox-icon-disabled': 'var(--color-components-checkbox-icon-disabled)', 'components-checkbox-bg': 'var(--color-components-checkbox-bg)', @@ -315,6 +319,39 @@ const vars = { 'components-premium-badge-orange-stroke-stop-0-hover': 'var(--color-components-premium-badge-orange-stroke-stop-0-hover)', 'components-premium-badge-orange-stroke-stop-100-hover': 'var(--color-components-premium-badge-orange-stroke-stop-100-hover)', + 'components-progress-bar-bg': 'var(--color-components-progress-bar-bg)', + 'components-progress-bar-progress': 'var(--color-components-progress-bar-progress)', + 'components-progress-bar-border': 'var(--color-components-progress-bar-border)', + 'components-progress-bar-progress-solid': 'var(--color-components-progress-bar-progress-solid)', + 'components-progress-bar-progress-highlight': 'var(--color-components-progress-bar-progress-highlight)', + + 'components-icon-bg-red-solid': 'var(--color-components-icon-bg-red-solid)', + 'components-icon-bg-rose-solid': 'var(--color-components-icon-bg-rose-solid)', + 'components-icon-bg-pink-solid': 'var(--color-components-icon-bg-pink-solid)', + 'components-icon-bg-orange-dark-solid': 'var(--color-components-icon-bg-orange-dark-solid)', + 'components-icon-bg-yellow-solid': 'var(--color-components-icon-bg-yellow-solid)', + 'components-icon-bg-green-solid': 'var(--color-components-icon-bg-green-solid)', + 'components-icon-bg-teal-solid': 'var(--color-components-icon-bg-teal-solid)', + 'components-icon-bg-blue-light-solid': 'var(--color-components-icon-bg-blue-light-solid)', + 'components-icon-bg-blue-solid': 'var(--color-components-icon-bg-blue-solid)', + 'components-icon-bg-indigo-solid': 'var(--color-components-icon-bg-indigo-solid)', + 'components-icon-bg-violet-solid': 'var(--color-components-icon-bg-violet-solid)', + 'components-icon-bg-midnight-solid': 'var(--color-components-icon-bg-midnight-solid)', + 'components-icon-bg-rose-soft': 'var(--color-components-icon-bg-rose-soft)', + 'components-icon-bg-pink-soft': 'var(--color-components-icon-bg-pink-soft)', + 'components-icon-bg-orange-dark-soft': 'var(--color-components-icon-bg-orange-dark-soft)', + 'components-icon-bg-yellow-soft': 'var(--color-components-icon-bg-yellow-soft)', + 'components-icon-bg-green-soft': 'var(--color-components-icon-bg-green-soft)', + 'components-icon-bg-teal-soft': 'var(--color-components-icon-bg-teal-soft)', + 'components-icon-bg-blue-light-soft': 'var(--color-components-icon-bg-blue-light-soft)', + 'components-icon-bg-blue-soft': 'var(--color-components-icon-bg-blue-soft)', + 'components-icon-bg-indigo-soft': 'var(--color-components-icon-bg-indigo-soft)', + 'components-icon-bg-violet-soft': 'var(--color-components-icon-bg-violet-soft)', + 'components-icon-bg-midnight-soft': 'var(--color-components-icon-bg-midnight-soft)', + 'components-icon-bg-red-soft': 'var(--color-components-icon-bg-red-soft)', + 'components-icon-bg-orange-solid': 'var(--color-components-icon-bg-orange-solid)', + 'components-icon-bg-orange-soft': 'var(--color-components-icon-bg-orange-soft)', + 'text-primary': 'var(--color-text-primary)', 'text-secondary': 'var(--color-text-secondary)', 'text-tertiary': 'var(--color-text-tertiary)', @@ -690,6 +727,12 @@ const vars = { 'third-party-model-bg-openai': 'var(--color-third-party-model-bg-openai)', 'third-party-model-bg-anthropic': 'var(--color-third-party-model-bg-anthropic)', 'third-party-model-bg-default': 'var(--color-third-party-model-bg-default)', -} + 'third-party-aws': 'var(--color-third-party-aws)', + 'third-party-aws-alt': 'var(--color-third-party-aws-alt)', + + 'saas-background': 'var(--color-saas-background)', + 'saas-pricing-grid-bg': 'var(--color-saas-pricing-grid-bg)', + +} export default vars