Merge branch 'main' into chore/enterprise-license-status

This commit is contained in:
StyleZhang 2024-07-15 13:05:31 +08:00
commit 092a7346d2
77 changed files with 1551 additions and 662 deletions

View File

@ -75,7 +75,7 @@ jobs:
- name: Run Workflow
run: poetry run -C api bash dev/pytest/pytest_workflow.sh
- name: Set up Vector Stores (Weaviate, Qdrant, PGVector, Milvus, PgVecto-RS, Chroma)
- name: Set up Vector Stores (Weaviate, Qdrant, PGVector, Milvus, PgVecto-RS, Chroma, MyScale)
uses: hoverkraft-tech/compose-action@v2.0.0
with:
compose-file: |
@ -89,5 +89,6 @@ jobs:
pgvecto-rs
pgvector
chroma
myscale
- name: Test Vector Stores
run: poetry run -C api bash dev/pytest/pytest_vdb.sh

View File

@ -83,7 +83,7 @@ OCI_REGION=your-region
WEB_API_CORS_ALLOW_ORIGINS=http://127.0.0.1:3000,*
CONSOLE_CORS_ALLOW_ORIGINS=http://127.0.0.1:3000,*
# Vector database configuration, support: weaviate, qdrant, milvus, relyt, pgvecto_rs, pgvector, pgvector, chroma, opensearch, tidb_vector
# Vector database configuration, support: weaviate, qdrant, milvus, myscale, relyt, pgvecto_rs, pgvector, pgvector, chroma, opensearch, tidb_vector
VECTOR_STORE=weaviate
# Weaviate configuration
@ -106,6 +106,14 @@ MILVUS_USER=root
MILVUS_PASSWORD=Milvus
MILVUS_SECURE=false
# MyScale configuration
MYSCALE_HOST=127.0.0.1
MYSCALE_PORT=8123
MYSCALE_USER=default
MYSCALE_PASSWORD=
MYSCALE_DATABASE=default
MYSCALE_FTS_PARAMS=
# Relyt configuration
RELYT_HOST=127.0.0.1
RELYT_PORT=5432

View File

@ -13,6 +13,7 @@ from configs.middleware.storage.tencent_cos_storage_config import TencentCloudCO
from configs.middleware.vdb.analyticdb_config import AnalyticdbConfig
from configs.middleware.vdb.chroma_config import ChromaConfig
from configs.middleware.vdb.milvus_config import MilvusConfig
from configs.middleware.vdb.myscale_config import MyScaleConfig
from configs.middleware.vdb.opensearch_config import OpenSearchConfig
from configs.middleware.vdb.oracle_config import OracleConfig
from configs.middleware.vdb.pgvector_config import PGVectorConfig
@ -187,6 +188,7 @@ class MiddlewareConfig(
AnalyticdbConfig,
ChromaConfig,
MilvusConfig,
MyScaleConfig,
OpenSearchConfig,
OracleConfig,
PGVectorConfig,

View File

@ -0,0 +1,39 @@
from typing import Optional
from pydantic import BaseModel, Field, PositiveInt
class MyScaleConfig(BaseModel):
"""
MyScale configs
"""
MYSCALE_HOST: Optional[str] = Field(
description='MyScale host',
default=None,
)
MYSCALE_PORT: Optional[PositiveInt] = Field(
description='MyScale port',
default=8123,
)
MYSCALE_USER: Optional[str] = Field(
description='MyScale user',
default=None,
)
MYSCALE_PASSWORD: Optional[str] = Field(
description='MyScale password',
default=None,
)
MYSCALE_DATABASE: Optional[str] = Field(
description='MyScale database name',
default=None,
)
MYSCALE_FTS_PARAMS: Optional[str] = Field(
description='MyScale fts index parameters',
default=None,
)

View File

@ -548,7 +548,7 @@ class DatasetRetrievalSettingApi(Resource):
RetrievalMethod.SEMANTIC_SEARCH
]
}
case VectorType.QDRANT | VectorType.WEAVIATE | VectorType.OPENSEARCH | VectorType.ANALYTICDB:
case VectorType.QDRANT | VectorType.WEAVIATE | VectorType.OPENSEARCH | VectorType.ANALYTICDB | VectorType.MYSCALE:
return {
'retrieval_method': [
RetrievalMethod.SEMANTIC_SEARCH,
@ -572,7 +572,7 @@ class DatasetRetrievalSettingMockApi(Resource):
RetrievalMethod.SEMANTIC_SEARCH
]
}
case VectorType.QDRANT | VectorType.WEAVIATE | VectorType.OPENSEARCH| VectorType.ANALYTICDB:
case VectorType.QDRANT | VectorType.WEAVIATE | VectorType.OPENSEARCH| VectorType.ANALYTICDB | VectorType.MYSCALE:
return {
'retrieval_method': [
RetrievalMethod.SEMANTIC_SEARCH,

View File

@ -3,8 +3,9 @@ from functools import wraps
from hashlib import sha1
from hmac import new as hmac_new
from flask import abort, current_app, request
from flask import abort, request
from configs import dify_config
from extensions.ext_database import db
from models.model import EndUser
@ -12,12 +13,12 @@ from models.model import EndUser
def inner_api_only(view):
@wraps(view)
def decorated(*args, **kwargs):
if not current_app.config['INNER_API']:
if not dify_config.INNER_API:
abort(404)
# get header 'X-Inner-Api-Key'
inner_api_key = request.headers.get('X-Inner-Api-Key')
if not inner_api_key or inner_api_key != current_app.config['INNER_API_KEY']:
if not inner_api_key or inner_api_key != dify_config.INNER_API_KEY:
abort(404)
return view(*args, **kwargs)
@ -28,7 +29,7 @@ def inner_api_only(view):
def inner_api_user_auth(view):
@wraps(view)
def decorated(*args, **kwargs):
if not current_app.config['INNER_API']:
if not dify_config.INNER_API:
return view(*args, **kwargs)
# get header 'X-Inner-Api-Key'

View File

@ -1,7 +1,7 @@
from flask import current_app
from flask_restful import Resource, fields, marshal_with
from configs import dify_config
from controllers.service_api import api
from controllers.service_api.app.error import AppUnavailableError
from controllers.service_api.wraps import validate_app_token
@ -78,7 +78,7 @@ class AppParameterApi(Resource):
"transfer_methods": ["remote_url", "local_file"]
}}),
'system_parameters': {
'image_file_size_limit': current_app.config.get('UPLOAD_IMAGE_FILE_SIZE_LIMIT')
'image_file_size_limit': dify_config.UPLOAD_IMAGE_FILE_SIZE_LIMIT
}
}

View File

@ -1,6 +1,6 @@
from flask import current_app
from flask_restful import Resource
from configs import dify_config
from controllers.service_api import api
@ -9,7 +9,7 @@ class IndexApi(Resource):
return {
"welcome": "Dify OpenAPI",
"api_version": "v1",
"server_version": current_app.config['CURRENT_VERSION']
"server_version": dify_config.CURRENT_VERSION,
}

View File

@ -1,6 +1,6 @@
from flask import current_app
from flask_restful import fields, marshal_with
from configs import dify_config
from controllers.web import api
from controllers.web.error import AppUnavailableError
from controllers.web.wraps import WebApiResource
@ -75,7 +75,7 @@ class AppParameterApi(WebApiResource):
"transfer_methods": ["remote_url", "local_file"]
}}),
'system_parameters': {
'image_file_size_limit': current_app.config.get('UPLOAD_IMAGE_FILE_SIZE_LIMIT')
'image_file_size_limit': dify_config.UPLOAD_IMAGE_FILE_SIZE_LIMIT
}
}

View File

@ -1,8 +1,8 @@
from flask import current_app
from flask_restful import fields, marshal_with
from werkzeug.exceptions import Forbidden
from configs import dify_config
from controllers.web import api
from controllers.web.wraps import WebApiResource
from extensions.ext_database import db
@ -84,7 +84,7 @@ class AppSiteInfo:
self.can_replace_logo = can_replace_logo
if can_replace_logo:
base_url = current_app.config.get('FILES_URL')
base_url = dify_config.FILES_URL
remove_webapp_brand = tenant.custom_config_dict.get('remove_webapp_brand', False)
replace_webapp_logo = f'{base_url}/files/workspaces/{tenant.id}/webapp-logo' if tenant.custom_config_dict.get('replace_webapp_logo') else None
self.custom_config = {

View File

@ -255,6 +255,12 @@ class AdvancedChatAppRunner(AppRunner):
)
index += 1
time.sleep(0.01)
else:
queue_manager.publish(
QueueTextChunkEvent(
text=text
), PublishFrom.APPLICATION_MANAGER
)
queue_manager.publish(
QueueStopEvent(stopped_by=stopped_by),

View File

@ -7,7 +7,7 @@ features:
- agent-thought
model_properties:
mode: chat
context_size: 32000
context_size: 128000
parameter_rules:
- name: temperature
use_template: temperature

View File

@ -7,7 +7,7 @@ features:
- agent-thought
model_properties:
mode: chat
context_size: 32000
context_size: 128000
parameter_rules:
- name: temperature
use_template: temperature

View File

@ -616,30 +616,34 @@ class OAIAPICompatLargeLanguageModel(_CommonOAI_API_Compat, LargeLanguageModel):
message = cast(AssistantPromptMessage, message)
message_dict = {"role": "assistant", "content": message.content}
if message.tool_calls:
# message_dict["tool_calls"] = [helper.dump_model(PromptMessageFunction(function=tool_call)) for tool_call
# in
# message.tool_calls]
function_call = message.tool_calls[0]
message_dict["function_call"] = {
"name": function_call.function.name,
"arguments": function_call.function.arguments,
}
function_calling_type = credentials.get('function_calling_type', 'no_call')
if function_calling_type == 'tool_call':
message_dict["tool_calls"] = [tool_call.dict() for tool_call in
message.tool_calls]
elif function_calling_type == 'function_call':
function_call = message.tool_calls[0]
message_dict["function_call"] = {
"name": function_call.function.name,
"arguments": function_call.function.arguments,
}
elif isinstance(message, SystemPromptMessage):
message = cast(SystemPromptMessage, message)
message_dict = {"role": "system", "content": message.content}
elif isinstance(message, ToolPromptMessage):
message = cast(ToolPromptMessage, message)
# message_dict = {
# "role": "tool",
# "content": message.content,
# "tool_call_id": message.tool_call_id
# }
message_dict = {
"role": "tool" if credentials and credentials.get('function_calling_type', 'no_call') == 'tool_call' else "function",
"content": message.content,
"name": message.tool_call_id
}
function_calling_type = credentials.get('function_calling_type', 'no_call')
if function_calling_type == 'tool_call':
message_dict = {
"role": "tool",
"content": message.content,
"tool_call_id": message.tool_call_id
}
elif function_calling_type == 'function_call':
message_dict = {
"role": "function",
"content": message.content,
"name": message.tool_call_id
}
else:
raise ValueError(f"Got unknown type {message}")

View File

@ -0,0 +1,40 @@
model: ernie-4.0-turbo-8k-preview
label:
en_US: Ernie-4.0-turbo-8k-preview
model_type: llm
features:
- agent-thought
model_properties:
mode: chat
context_size: 8192
parameter_rules:
- name: temperature
use_template: temperature
min: 0.1
max: 1.0
default: 0.8
- name: top_p
use_template: top_p
- name: max_tokens
use_template: max_tokens
default: 1024
min: 2
max: 2048
- name: presence_penalty
use_template: presence_penalty
default: 1.0
min: 1.0
max: 2.0
- name: frequency_penalty
use_template: frequency_penalty
- name: response_format
use_template: response_format
- name: disable_search
label:
zh_Hans: 禁用搜索
en_US: Disable Search
type: boolean
help:
zh_Hans: 禁用模型自行进行外部搜索。
en_US: Disable the model to perform external search.
required: false

View File

@ -138,6 +138,7 @@ class ErnieBotModel:
'ernie-lite-8k-0922': 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant',
'ernie-lite-8k-0308': 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-lite-8k',
'ernie-character-8k-0321': 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-char-8k',
'ernie-4.0-tutbo-8k-preview': 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-4.0-turbo-8k-preview',
}
function_calling_supports = [
@ -149,6 +150,7 @@ class ErnieBotModel:
'ernie-3.5-4k-0205',
'ernie-3.5-128k',
'ernie-4.0-8k'
'ernie-4.0-turbo-8k-preview'
]
api_key: str = ''

View File

@ -5,7 +5,7 @@ from typing import TYPE_CHECKING, Optional
import httpx
from ..core._base_api import BaseAPI
from ..core._base_type import NOT_GIVEN, Headers, NotGiven
from ..core._base_type import NOT_GIVEN, Body, Headers, NotGiven
from ..core._http_client import make_user_request_input
from ..types.image import ImagesResponded
@ -28,7 +28,9 @@ class Images(BaseAPI):
size: Optional[str] | NotGiven = NOT_GIVEN,
style: Optional[str] | NotGiven = NOT_GIVEN,
user: str | NotGiven = NOT_GIVEN,
request_id: Optional[str] | NotGiven = NOT_GIVEN,
extra_headers: Headers | None = None,
extra_body: Body | None = None,
disable_strict_validation: Optional[bool] | None = None,
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
) -> ImagesResponded:
@ -46,9 +48,12 @@ class Images(BaseAPI):
"size": size,
"style": style,
"user": user,
"request_id": request_id,
},
options=make_user_request_input(
extra_headers=extra_headers, timeout=timeout
extra_headers=extra_headers,
extra_body=extra_body,
timeout=timeout
),
cast_type=_cast_type,
enable_stream=False,

View File

@ -11,7 +11,7 @@ from tenacity import retry
from tenacity.stop import stop_after_attempt
from . import _errors
from ._base_type import NOT_GIVEN, Body, Data, Headers, NotGiven, Query, RequestFiles, ResponseT
from ._base_type import NOT_GIVEN, AnyMapping, Body, Data, Headers, NotGiven, Query, RequestFiles, ResponseT
from ._errors import APIResponseValidationError, APIStatusError, APITimeoutError
from ._files import make_httpx_files
from ._request_opt import ClientRequestParam, UserRequestInput
@ -358,6 +358,7 @@ def make_user_request_input(
max_retries: int | None = None,
timeout: float | Timeout | None | NotGiven = NOT_GIVEN,
extra_headers: Headers = None,
extra_body: Body | None = None,
query: Query | None = None,
) -> UserRequestInput:
options: UserRequestInput = {}
@ -370,5 +371,7 @@ def make_user_request_input(
options['timeout'] = timeout
if query is not None:
options["params"] = query
if extra_body is not None:
options["extra_json"] = cast(AnyMapping, extra_body)
return options

View File

@ -1,7 +1,6 @@
from typing import Any
from flask import current_app
from configs import dify_config
from core.rag.datasource.keyword.jieba.jieba import Jieba
from core.rag.datasource.keyword.keyword_base import BaseKeyword
from core.rag.models.document import Document
@ -14,8 +13,8 @@ class Keyword:
self._keyword_processor = self._init_keyword()
def _init_keyword(self) -> BaseKeyword:
config = current_app.config
keyword_type = config.get('KEYWORD_STORE')
config = dify_config
keyword_type = config.KEYWORD_STORE
if not keyword_type:
raise ValueError("Keyword store must be specified.")

View File

@ -0,0 +1,170 @@
import json
import logging
import uuid
from enum import Enum
from typing import Any
from clickhouse_connect import get_client
from flask import current_app
from pydantic import BaseModel
from core.rag.datasource.entity.embedding import Embeddings
from core.rag.datasource.vdb.vector_base import BaseVector
from core.rag.datasource.vdb.vector_factory import AbstractVectorFactory
from core.rag.datasource.vdb.vector_type import VectorType
from core.rag.models.document import Document
from models.dataset import Dataset
class MyScaleConfig(BaseModel):
host: str
port: int
user: str
password: str
database: str
fts_params: str
class SortOrder(Enum):
ASC = "ASC"
DESC = "DESC"
class MyScaleVector(BaseVector):
def __init__(self, collection_name: str, config: MyScaleConfig, metric: str = "Cosine"):
super().__init__(collection_name)
self._config = config
self._metric = metric
self._vec_order = SortOrder.ASC if metric.upper() in ["COSINE", "L2"] else SortOrder.DESC
self._client = get_client(
host=config.host,
port=config.port,
username=config.user,
password=config.password,
)
self._client.command("SET allow_experimental_object_type=1")
def get_type(self) -> str:
return VectorType.MYSCALE
def create(self, texts: list[Document], embeddings: list[list[float]], **kwargs):
dimension = len(embeddings[0])
self._create_collection(dimension)
return self.add_texts(documents=texts, embeddings=embeddings, **kwargs)
def _create_collection(self, dimension: int):
logging.info(f"create MyScale collection {self._collection_name} with dimension {dimension}")
self._client.command(f"CREATE DATABASE IF NOT EXISTS {self._config.database}")
fts_params = f"('{self._config.fts_params}')" if self._config.fts_params else ""
sql = f"""
CREATE TABLE IF NOT EXISTS {self._config.database}.{self._collection_name}(
id String,
text String,
vector Array(Float32),
metadata JSON,
CONSTRAINT cons_vec_len CHECK length(vector) = {dimension},
VECTOR INDEX vidx vector TYPE DEFAULT('metric_type = {self._metric}'),
INDEX text_idx text TYPE fts{fts_params}
) ENGINE = MergeTree ORDER BY id
"""
self._client.command(sql)
def add_texts(self, documents: list[Document], embeddings: list[list[float]], **kwargs):
ids = []
columns = ["id", "text", "vector", "metadata"]
values = []
for i, doc in enumerate(documents):
doc_id = doc.metadata.get("doc_id", str(uuid.uuid4()))
row = (
doc_id,
self.escape_str(doc.page_content),
embeddings[i],
json.dumps(doc.metadata) if doc.metadata else {}
)
values.append(str(row))
ids.append(doc_id)
sql = f"""
INSERT INTO {self._config.database}.{self._collection_name}
({",".join(columns)}) VALUES {",".join(values)}
"""
self._client.command(sql)
return ids
@staticmethod
def escape_str(value: Any) -> str:
return "".join(f"\\{c}" if c in ("\\", "'") else c for c in str(value))
def text_exists(self, id: str) -> bool:
results = self._client.query(f"SELECT id FROM {self._config.database}.{self._collection_name} WHERE id='{id}'")
return results.row_count > 0
def delete_by_ids(self, ids: list[str]) -> None:
self._client.command(
f"DELETE FROM {self._config.database}.{self._collection_name} WHERE id IN {str(tuple(ids))}")
def get_ids_by_metadata_field(self, key: str, value: str):
rows = self._client.query(
f"SELECT DISTINCT id FROM {self._config.database}.{self._collection_name} WHERE metadata.{key}='{value}'"
).result_rows
return [row[0] for row in rows]
def delete_by_metadata_field(self, key: str, value: str) -> None:
self._client.command(
f"DELETE FROM {self._config.database}.{self._collection_name} WHERE metadata.{key}='{value}'"
)
def search_by_vector(self, query_vector: list[float], **kwargs: Any) -> list[Document]:
return self._search(f"distance(vector, {str(query_vector)})", self._vec_order, **kwargs)
def search_by_full_text(self, query: str, **kwargs: Any) -> list[Document]:
return self._search(f"TextSearch(text, '{query}')", SortOrder.DESC, **kwargs)
def _search(self, dist: str, order: SortOrder, **kwargs: Any) -> list[Document]:
top_k = kwargs.get("top_k", 5)
score_threshold = kwargs.get("score_threshold", 0.0)
where_str = f"WHERE dist < {1 - score_threshold}" if \
self._metric.upper() == "COSINE" and order == SortOrder.ASC and score_threshold > 0.0 else ""
sql = f"""
SELECT text, metadata, {dist} as dist FROM {self._config.database}.{self._collection_name}
{where_str} ORDER BY dist {order.value} LIMIT {top_k}
"""
try:
return [
Document(
page_content=r["text"],
metadata=r["metadata"],
)
for r in self._client.query(sql).named_results()
]
except Exception as e:
logging.error(f"\033[91m\033[1m{type(e)}\033[0m \033[95m{str(e)}\033[0m")
return []
def delete(self) -> None:
self._client.command(f"DROP TABLE IF EXISTS {self._config.database}.{self._collection_name}")
class MyScaleVectorFactory(AbstractVectorFactory):
def init_vector(self, dataset: Dataset, attributes: list, embeddings: Embeddings) -> MyScaleVector:
if dataset.index_struct_dict:
class_prefix: str = dataset.index_struct_dict['vector_store']['class_prefix']
collection_name = class_prefix.lower()
else:
dataset_id = dataset.id
collection_name = Dataset.gen_collection_name_by_id(dataset_id).lower()
dataset.index_struct = json.dumps(
self.gen_index_struct_dict(VectorType.MYSCALE, collection_name))
config = current_app.config
return MyScaleVector(
collection_name=collection_name,
config=MyScaleConfig(
host=config.get("MYSCALE_HOST", "localhost"),
port=int(config.get("MYSCALE_PORT", 8123)),
user=config.get("MYSCALE_USER", "default"),
password=config.get("MYSCALE_PASSWORD", ""),
database=config.get("MYSCALE_DATABASE", "default"),
fts_params=config.get("MYSCALE_FTS_PARAMS", ""),
),
)

View File

@ -57,6 +57,9 @@ class Vector:
case VectorType.MILVUS:
from core.rag.datasource.vdb.milvus.milvus_vector import MilvusVectorFactory
return MilvusVectorFactory
case VectorType.MYSCALE:
from core.rag.datasource.vdb.myscale.myscale_vector import MyScaleVectorFactory
return MyScaleVectorFactory
case VectorType.PGVECTOR:
from core.rag.datasource.vdb.pgvector.pgvector import PGVectorFactory
return PGVectorFactory

View File

@ -5,6 +5,7 @@ class VectorType(str, Enum):
ANALYTICDB = 'analyticdb'
CHROMA = 'chroma'
MILVUS = 'milvus'
MYSCALE = 'myscale'
PGVECTOR = 'pgvector'
PGVECTO_RS = 'pgvecto-rs'
QDRANT = 'qdrant'

View File

@ -46,7 +46,6 @@ class FirecrawlApp:
raise Exception(f'Failed to scrape URL. Status code: {response.status_code}')
def crawl_url(self, url, params=None) -> str:
start_time = time.time()
headers = self._prepare_headers()
json_data = {'url': url}
if params:

View File

@ -18,8 +18,8 @@ class MarkdownExtractor(BaseExtractor):
def __init__(
self,
file_path: str,
remove_hyperlinks: bool = True,
remove_images: bool = True,
remove_hyperlinks: bool = False,
remove_images: bool = False,
encoding: Optional[str] = None,
autodetect_encoding: bool = True,
):

View File

@ -8,7 +8,7 @@ We have defined a series of helper methods in the `Tool` class to help developer
### Message Return
Dify supports various message types such as `text`, `link`, `image`, and `file BLOB`. You can return different types of messages to the LLM and users through the following interfaces.
Dify supports various message types such as `text`, `link`, `json`, `image`, and `file BLOB`. You can return different types of messages to the LLM and users through the following interfaces.
Please note, some parameters in the following interfaces will be introduced in later sections.
@ -67,6 +67,18 @@ If you need to return the raw data of a file, such as images, audio, video, PPT,
"""
```
#### JSON
If you need to return a formatted JSON, you can use the following interface. This is commonly used for data transmission between nodes in a workflow, of course, in agent mode, most LLM are also able to read and understand JSON.
- `object` A Python dictionary object will be automatically serialized into JSON
```python
def create_json_message(self, object: dict) -> ToolInvokeMessage:
"""
create a json message
"""
```
### Shortcut Tools
In large model applications, we have two common needs:

View File

@ -145,19 +145,25 @@ parameters: # Parameter list
- The `identity` field is mandatory, it contains the basic information of the tool, including name, author, label, description, etc.
- `parameters` Parameter list
- `name` Parameter name, unique, no duplication with other parameters
- `type` Parameter type, currently supports `string`, `number`, `boolean`, `select`, `secret-input` four types, corresponding to string, number, boolean, drop-down box, and encrypted input box, respectively. For sensitive information, we recommend using `secret-input` type
- `required` Required or not
- `name` (Mandatory) Parameter name, must be unique and not duplicate with other parameters.
- `type` (Mandatory) Parameter type, currently supports `string`, `number`, `boolean`, `select`, `secret-input` five types, corresponding to string, number, boolean, drop-down box, and encrypted input box, respectively. For sensitive information, we recommend using the `secret-input` type
- `label` (Mandatory) Parameter label, for frontend display
- `form` (Mandatory) Form type, currently supports `llm`, `form` two types.
- In an agent app, `llm` indicates that the parameter is inferred by the LLM itself, while `form` indicates that the parameter can be pre-set for the tool.
- In a workflow app, both `llm` and `form` need to be filled out by the front end, but the parameters of `llm` will be used as input variables for the tool node.
- `required` Indicates whether the parameter is required or not
- In `llm` mode, if the parameter is required, the Agent is required to infer this parameter
- In `form` mode, if the parameter is required, the user is required to fill in this parameter on the frontend before the conversation starts
- `options` Parameter options
- In `llm` mode, Dify will pass all options to LLM, LLM can infer based on these options
- In `form` mode, when `type` is `select`, the frontend will display these options
- `default` Default value
- `label` Parameter label, for frontend display
- `min` Minimum value, can be set when the parameter type is `number`.
- `max` Maximum value, can be set when the parameter type is `number`.
- `placeholder` The prompt text for input boxes. It can be set when the form type is `form`, and the parameter type is `string`, `number`, or `secret-input`. It supports multiple languages.
- `human_description` Introduction for frontend display, supports multiple languages
- `llm_description` Introduction passed to LLM, in order to make LLM better understand this parameter, we suggest to write as detailed information about this parameter as possible here, so that LLM can understand this parameter
- `form` Form type, currently supports `llm`, `form` two types, corresponding to Agent self-inference and frontend filling
## 4. Add Tool Logic
@ -196,7 +202,7 @@ The overall logic of the tool is in the `_invoke` method, this method accepts tw
### Return Data
When the tool returns, you can choose to return one message or multiple messages, here we return one message, using `create_text_message` and `create_link_message` can create a text message or a link message.
When the tool returns, you can choose to return one message or multiple messages, here we return one message, using `create_text_message` and `create_link_message` can create a text message or a link message. If you want to return multiple messages, you can use `[self.create_text_message('msg1'), self.create_text_message('msg2')]` to create a list of messages.
## 5. Add Provider Code
@ -205,8 +211,6 @@ Finally, we need to create a provider class under the provider module to impleme
Create `google.py` under the `google` module, the content is as follows.
```python
from core.tools.entities.tool_entities import ToolInvokeMessage, ToolProviderType
from core.tools.tool.tool import Tool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
from core.tools.errors import ToolProviderCredentialValidationError

View File

@ -8,7 +8,7 @@
### 消息返回
Dify支持`文本` `链接` `图片` `文件BLOB` 等多种消息类型你可以通过以下几个接口返回不同类型的消息给LLM和用户。
Dify支持`文本` `链接` `图片` `文件BLOB` `JSON` 等多种消息类型你可以通过以下几个接口返回不同类型的消息给LLM和用户。
注意,在下面的接口中的部分参数将在后面的章节中介绍。
@ -67,6 +67,18 @@ Dify支持`文本` `链接` `图片` `文件BLOB` 等多种消息类型,你可
"""
```
#### JSON
如果你需要返回一个格式化的JSON可以使用以下接口。这通常用于workflow中的节点间的数据传递当然agent模式中大部分大模型也都能够阅读和理解JSON。
- `object` 一个Python的字典对象会被自动序列化为JSON
```python
def create_json_message(self, object: dict) -> ToolInvokeMessage:
"""
create a json message
"""
```
### 快捷工具
在大模型应用中,我们有两种常见的需求:
@ -97,8 +109,8 @@ Dify支持`文本` `链接` `图片` `文件BLOB` 等多种消息类型,你可
```python
def get_url(self, url: str, user_agent: str = None) -> str:
"""
get url
""" the crawled result
get url from the crawled result
"""
```
### 变量池

View File

@ -140,8 +140,12 @@ parameters: # 参数列表
- `identity` 字段是必须的,它包含了工具的基本信息,包括名称、作者、标签、描述等
- `parameters` 参数列表
- `name` 参数名称,唯一,不允许和其他参数重名
- `type` 参数类型,目前支持`string`、`number`、`boolean`、`select`、`secret-input` 五种类型,分别对应字符串、数字、布尔值、下拉框、加密输入框,对于敏感信息,我们建议使用`secret-input`类型
- `name` (必填)参数名称,唯一,不允许和其他参数重名
- `type` (必填)参数类型,目前支持`string`、`number`、`boolean`、`select`、`secret-input` 五种类型,分别对应字符串、数字、布尔值、下拉框、加密输入框,对于敏感信息,我们建议使用`secret-input`类型
- `label`(必填)参数标签,用于前端展示
- `form` (必填)表单类型,目前支持`llm`、`form`两种类型
- 在Agent应用中`llm`表示该参数LLM自行推理`form`表示要使用该工具可提前设定的参数
- 在workflow应用中`llm`和`form`均需要前端填写,但`llm`的参数会做为工具节点的输入变量
- `required` 是否必填
- 在`llm`模式下如果参数为必填则会要求Agent必须要推理出这个参数
- 在`form`模式下,如果参数为必填,则会要求用户在对话开始前在前端填写这个参数
@ -149,10 +153,12 @@ parameters: # 参数列表
- 在`llm`模式下Dify会将所有选项传递给LLMLLM可以根据这些选项进行推理
- 在`form`模式下,`type`为`select`时,前端会展示这些选项
- `default` 默认值
- `label` 参数标签,用于前端展示
- `min` 最小值,当参数类型为`number`时可以设定
- `max` 最大值,当参数类型为`number`时可以设定
- `human_description` 用于前端展示的介绍,支持多语言
- `placeholder` 字段输入框的提示文字,在表单类型为`form`,参数类型为`string`、`number`、`secret-input`时,可以设定,支持多语言
- `llm_description` 传递给LLM的介绍为了使得LLM更好理解这个参数我们建议在这里写上关于这个参数尽可能详细的信息让LLM能够理解这个参数
- `form` 表单类型,目前支持`llm`、`form`两种类型分别对应Agent自行推理和前端填写
## 4. 准备工具代码
当完成工具的配置以后,我们就可以开始编写工具代码了,主要用于实现工具的逻辑。
@ -176,7 +182,6 @@ class GoogleSearchTool(BuiltinTool):
query = tool_parameters['query']
result_type = tool_parameters['result_type']
api_key = self.runtime.credentials['serpapi_api_key']
# TODO: search with serpapi
result = SerpAPI(api_key).run(query, result_type=result_type)
if result_type == 'text':
@ -188,7 +193,7 @@ class GoogleSearchTool(BuiltinTool):
工具的整体逻辑都在`_invoke`方法中,这个方法接收两个参数:`user_id`和`tool_parameters`分别表示用户ID和工具参数
### 返回数据
在工具返回时,你可以选择返回一个消息或者多个消息,这里我们返回一个消息,使用`create_text_message`和`create_link_message`可以创建一个文本消息或者一个链接消息。
在工具返回时,你可以选择返回一条消息或者多个消息,这里我们返回一条消息,使用`create_text_message`和`create_link_message`可以创建一条文本消息或者一条链接消息。如需返回多条消息,可以使用列表构建,例如`[self.create_text_message('msg1'), self.create_text_message('msg2')]`
## 5. 准备供应商代码
最后,我们需要在供应商模块下创建一个供应商类,用于实现供应商的凭据验证逻辑,如果凭据验证失败,将会抛出`ToolProviderCredentialValidationError`异常。
@ -196,8 +201,6 @@ class GoogleSearchTool(BuiltinTool):
在`google`模块下创建`google.py`,内容如下。
```python
from core.tools.entities.tool_entities import ToolInvokeMessage, ToolProviderType
from core.tools.tool.tool import Tool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
from core.tools.errors import ToolProviderCredentialValidationError

View File

@ -142,7 +142,8 @@ class ToolParameter(BaseModel):
name: str = Field(..., description="The name of the parameter")
label: I18nObject = Field(..., description="The label presented to the user")
human_description: I18nObject = Field(..., description="The description presented to the user")
human_description: Optional[I18nObject] = Field(None, description="The description presented to the user")
placeholder: Optional[I18nObject] = Field(None, description="The placeholder presented to the user")
type: ToolParameterType = Field(..., description="The type of the parameter")
form: ToolParameterForm = Field(..., description="The form of the parameter, schema/form/llm")
llm_description: Optional[str] = None

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -0,0 +1,27 @@
""" Provide the input parameters type for the cogview provider class """
from typing import Any
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.cogview.tools.cogview3 import CogView3Tool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
class COGVIEWProvider(BuiltinToolProviderController):
""" cogview provider """
def _validate_credentials(self, credentials: dict[str, Any]) -> None:
try:
CogView3Tool().fork_tool_runtime(
runtime={
"credentials": credentials,
}
).invoke(
user_id='',
tool_parameters={
"prompt": "一个城市在水晶瓶中欢快生活的场景,水彩画风格,展现出微观与珠宝般的美丽。",
"size": "square",
"n": 1
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e)) from e

View File

@ -0,0 +1,61 @@
identity:
author: Waffle
name: cogview
label:
en_US: CogView
zh_Hans: CogView 绘画
pt_BR: CogView
description:
en_US: CogView art
zh_Hans: CogView 绘画
pt_BR: CogView art
icon: icon.png
tags:
- image
- productivity
credentials_for_provider:
zhipuai_api_key:
type: secret-input
required: true
label:
en_US: ZhipuAI API key
zh_Hans: ZhipuAI API key
pt_BR: ZhipuAI API key
help:
en_US: Please input your ZhipuAI API key
zh_Hans: 请输入你的 ZhipuAI API key
pt_BR: Please input your ZhipuAI API key
placeholder:
en_US: Please input your ZhipuAI API key
zh_Hans: 请输入你的 ZhipuAI API key
pt_BR: Please input your ZhipuAI API key
zhipuai_organizaion_id:
type: text-input
required: false
label:
en_US: ZhipuAI organization ID
zh_Hans: ZhipuAI organization ID
pt_BR: ZhipuAI organization ID
help:
en_US: Please input your ZhipuAI organization ID
zh_Hans: 请输入你的 ZhipuAI organization ID
pt_BR: Please input your ZhipuAI organization ID
placeholder:
en_US: Please input your ZhipuAI organization ID
zh_Hans: 请输入你的 ZhipuAI organization ID
pt_BR: Please input your ZhipuAI organization ID
zhipuai_base_url:
type: text-input
required: false
label:
en_US: ZhipuAI base URL
zh_Hans: ZhipuAI base URL
pt_BR: ZhipuAI base URL
help:
en_US: Please input your ZhipuAI base URL
zh_Hans: 请输入你的 ZhipuAI base URL
pt_BR: Please input your ZhipuAI base URL
placeholder:
en_US: Please input your ZhipuAI base URL
zh_Hans: 请输入你的 ZhipuAI base URL
pt_BR: Please input your ZhipuAI base URL

View File

@ -0,0 +1,69 @@
import random
from typing import Any, Union
from core.model_runtime.model_providers.zhipuai.zhipuai_sdk._client import ZhipuAI
from core.tools.entities.tool_entities import ToolInvokeMessage
from core.tools.tool.builtin_tool import BuiltinTool
class CogView3Tool(BuiltinTool):
""" CogView3 Tool """
def _invoke(self,
user_id: str,
tool_parameters: dict[str, Any]
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
"""
Invoke CogView3 tool
"""
client = ZhipuAI(
base_url=self.runtime.credentials['zhipuai_base_url'],
api_key=self.runtime.credentials['zhipuai_api_key'],
)
size_mapping = {
'square': '1024x1024',
'vertical': '1024x1792',
'horizontal': '1792x1024',
}
# prompt
prompt = tool_parameters.get('prompt', '')
if not prompt:
return self.create_text_message('Please input prompt')
# get size
print(tool_parameters.get('prompt', 'square'))
size = size_mapping[tool_parameters.get('size', 'square')]
# get n
n = tool_parameters.get('n', 1)
# get quality
quality = tool_parameters.get('quality', 'standard')
if quality not in ['standard', 'hd']:
return self.create_text_message('Invalid quality')
# get style
style = tool_parameters.get('style', 'vivid')
if style not in ['natural', 'vivid']:
return self.create_text_message('Invalid style')
# set extra body
seed_id = tool_parameters.get('seed_id', self._generate_random_id(8))
extra_body = {'seed': seed_id}
response = client.images.generations(
prompt=prompt,
model="cogview-3",
size=size,
n=n,
extra_body=extra_body,
style=style,
quality=quality,
response_format='b64_json'
)
result = []
for image in response.data:
result.append(self.create_image_message(image=image.url))
result.append(self.create_text_message(
f'\nGenerate image source to Seed ID: {seed_id}'))
return result
@staticmethod
def _generate_random_id(length=8):
characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
random_id = ''.join(random.choices(characters, k=length))
return random_id

View File

@ -0,0 +1,123 @@
identity:
name: cogview3
author: Waffle
label:
en_US: CogView 3
zh_Hans: CogView 3 绘画
pt_BR: CogView 3
description:
en_US: CogView 3 is a powerful drawing tool that can draw the image you want based on your prompt
zh_Hans: CogView 3 是一个强大的绘画工具,它可以根据您的提示词绘制出您想要的图像
pt_BR: CogView 3 is a powerful drawing tool that can draw the image you want based on your prompt
description:
human:
en_US: CogView 3 is a text to image tool
zh_Hans: CogView 3 是一个文本到图像的工具
pt_BR: CogView 3 is a text to image tool
llm: CogView 3 is a tool used to generate images from text
parameters:
- name: prompt
type: string
required: true
label:
en_US: Prompt
zh_Hans: 提示词
pt_BR: Prompt
human_description:
en_US: Image prompt, you can check the official documentation of CogView 3
zh_Hans: 图像提示词您可以查看CogView 3 的官方文档
pt_BR: Image prompt, you can check the official documentation of CogView 3
llm_description: Image prompt of CogView 3, you should describe the image you want to generate as a list of words as possible as detailed
form: llm
- name: size
type: select
required: true
human_description:
en_US: selecting the image size
zh_Hans: 选择图像大小
pt_BR: selecting the image size
label:
en_US: Image size
zh_Hans: 图像大小
pt_BR: Image size
form: form
options:
- value: square
label:
en_US: Squre(1024x1024)
zh_Hans: 方(1024x1024)
pt_BR: Squre(1024x1024)
- value: vertical
label:
en_US: Vertical(1024x1792)
zh_Hans: 竖屏(1024x1792)
pt_BR: Vertical(1024x1792)
- value: horizontal
label:
en_US: Horizontal(1792x1024)
zh_Hans: 横屏(1792x1024)
pt_BR: Horizontal(1792x1024)
default: square
- name: n
type: number
required: true
human_description:
en_US: selecting the number of images
zh_Hans: 选择图像数量
pt_BR: selecting the number of images
label:
en_US: Number of images
zh_Hans: 图像数量
pt_BR: Number of images
form: form
min: 1
max: 1
default: 1
- name: quality
type: select
required: true
human_description:
en_US: selecting the image quality
zh_Hans: 选择图像质量
pt_BR: selecting the image quality
label:
en_US: Image quality
zh_Hans: 图像质量
pt_BR: Image quality
form: form
options:
- value: standard
label:
en_US: Standard
zh_Hans: 标准
pt_BR: Standard
- value: hd
label:
en_US: HD
zh_Hans: 高清
pt_BR: HD
default: standard
- name: style
type: select
required: true
human_description:
en_US: selecting the image style
zh_Hans: 选择图像风格
pt_BR: selecting the image style
label:
en_US: Image style
zh_Hans: 图像风格
pt_BR: Image style
form: form
options:
- value: vivid
label:
en_US: Vivid
zh_Hans: 生动
pt_BR: Vivid
- value: natural
label:
en_US: Natural
zh_Hans: 自然
pt_BR: Natural
default: vivid

View File

@ -1,3 +1,4 @@
import logging
import time
from collections.abc import Mapping
from typing import Any
@ -5,6 +6,7 @@ from typing import Any
import requests
from requests.exceptions import HTTPError
logger = logging.getLogger(__name__)
class FirecrawlApp:
def __init__(self, api_key: str | None = None, base_url: str | None = None):
@ -48,6 +50,7 @@ class FirecrawlApp:
headers = self._prepare_headers()
data = {'url': url, **kwargs}
response = self._request('POST', endpoint, data, headers)
logger.debug(f"Sent request to {endpoint=} body={data}")
if response is None:
raise HTTPError("Failed to scrape URL after multiple retries")
return response
@ -57,6 +60,7 @@ class FirecrawlApp:
headers = self._prepare_headers()
data = {'query': query, **kwargs}
response = self._request('POST', endpoint, data, headers)
logger.debug(f"Sent request to {endpoint=} body={data}")
if response is None:
raise HTTPError("Failed to perform search after multiple retries")
return response
@ -66,8 +70,9 @@ class FirecrawlApp:
):
endpoint = f'{self.base_url}/v0/crawl'
headers = self._prepare_headers(idempotency_key)
data = {'url': url, **kwargs}
data = {'url': url, **kwargs['params']}
response = self._request('POST', endpoint, data, headers)
logger.debug(f"Sent request to {endpoint=} body={data}")
if response is None:
raise HTTPError("Failed to initiate crawl after multiple retries")
job_id: str = response['jobId']

View File

@ -238,7 +238,7 @@ class ApiTool(Tool):
return int(value)
elif property['type'] == 'number':
# check if it is a float
if '.' in value:
if '.' in str(value):
return float(value)
else:
return int(value)

View File

@ -60,6 +60,8 @@ class IfElseNode(BaseNode):
final_result = all(group_result) if node_data.logical_operator == "and" else any(group_result)
selected_case_id = "true" if final_result else "false"
process_datas["condition_results"].append(
{
"group": "default",
@ -78,11 +80,7 @@ class IfElseNode(BaseNode):
error=str(e)
)
outputs = {
"result": final_result
}
if node_data.cases:
outputs["selected_case_id"] = selected_case_id
outputs = {"result": final_result, "selected_case_id": selected_case_id}
data = NodeRunResult(
status=WorkflowNodeExecutionStatus.SUCCEEDED,

View File

@ -38,9 +38,8 @@ class AzureStorage(BaseStorage):
def generate(filename: str = filename) -> Generator:
blob = client.get_blob_client(container=self.bucket_name, blob=filename)
blob_data = blob.download_blob()
for chunk in blob_data.chunks():
yield from chunk
return generate()
yield from blob_data.chunks()
return generate(filename)
def download(self, filename, target_filepath):
client = self._sync_client()

203
api/poetry.lock generated
View File

@ -1398,6 +1398,96 @@ prompt-toolkit = ">=3.0.36"
[package.extras]
testing = ["pytest (>=7.2.1)", "pytest-cov (>=4.0.0)", "tox (>=4.4.3)"]
[[package]]
name = "clickhouse-connect"
version = "0.7.16"
description = "ClickHouse Database Core Driver for Python, Pandas, and Superset"
optional = false
python-versions = "~=3.8"
files = [
{file = "clickhouse-connect-0.7.16.tar.gz", hash = "sha256:253a2089efad5729903d00382f73fa8da2cbbfdb118db498cf708ee9f4a2134f"},
{file = "clickhouse_connect-0.7.16-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:00413deb9e086aabf661d18ac3a3539f25eb773c3675f49353e0d7e6ef1205fc"},
{file = "clickhouse_connect-0.7.16-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:faadaf206ea7753782db017daedbf592e4edc7c71cb985aad787eb9dc516bf21"},
{file = "clickhouse_connect-0.7.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1db8f1168f33fda78adddb733913b211ddf648984d8fef8d934e30df876e5f23"},
{file = "clickhouse_connect-0.7.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fa630bf50fb064cc53b7ea5d862066476d3c6074003f6d39d2594fb1a7abf67"},
{file = "clickhouse_connect-0.7.16-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2cba9547dad41b2d333458615208a3c7db6f56a63473ffea2c05c44225ffa020"},
{file = "clickhouse_connect-0.7.16-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:480f7856fcf42a21f17886e0b42d70499067c865fc2a0ea7c0eb5c0bdca281a8"},
{file = "clickhouse_connect-0.7.16-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b65f3eb570cbcf9fa383b4e0925d1ceb3efd3deba42a435625cad75b3a9ff7f3"},
{file = "clickhouse_connect-0.7.16-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b78d3cc0fe42374bb9d5a05ba71578dc69f7e4b4c771e86dcf292ae0412265cc"},
{file = "clickhouse_connect-0.7.16-cp310-cp310-win32.whl", hash = "sha256:1cb76b26fcde1ba6a8ae68e1db1f9e42d458879a0d4d2c9843cc998f42f445ac"},
{file = "clickhouse_connect-0.7.16-cp310-cp310-win_amd64.whl", hash = "sha256:9298b344168271e952ea41021963ca1b81b9b3c38be8b036cb64a2556edbb4b7"},
{file = "clickhouse_connect-0.7.16-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ae39a765735cc6e786e5f9a0dba799e7f8ee0bbd5dfc5d5ff755dfa9dd13855"},
{file = "clickhouse_connect-0.7.16-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3f32546f65dd234a49310cda454713a5f7fbc8ba978744e070355c7ea8819a5a"},
{file = "clickhouse_connect-0.7.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20865c81a5b378625a528ac8960e08cdca316147f87fad6deb9f16c0d5e5f62f"},
{file = "clickhouse_connect-0.7.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609c076261d779703bf29e7a27dafc8283153403ceab1ec23d50eb2acabc4b9d"},
{file = "clickhouse_connect-0.7.16-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e07862e75ac7419c5671384055f11ca5e76dc2c0be4a6f3aed7bf419997184bc"},
{file = "clickhouse_connect-0.7.16-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d5db7da6f20b9a49b288063de9b3224a56634f8cb94d19d435af518ed81872c3"},
{file = "clickhouse_connect-0.7.16-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:955c567ede68a10325045bb2adf1314ff569dfb7e52f6074c18182f3803279f6"},
{file = "clickhouse_connect-0.7.16-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df517bfe23d85f5aeeb17b262c06d0a5c24e0baea09688a96d02dc8589ef8b07"},
{file = "clickhouse_connect-0.7.16-cp311-cp311-win32.whl", hash = "sha256:7f2c6132fc90df6a8318abb9f257c2b777404908b7d168ac08235d516f65a663"},
{file = "clickhouse_connect-0.7.16-cp311-cp311-win_amd64.whl", hash = "sha256:ca1dba53da86691a11671d846988dc4f6ad02a66f5a0df9a87a46dc4ec9bb0a1"},
{file = "clickhouse_connect-0.7.16-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f8f7260073b6ee63e19d442ebb6954bc7741a5ce4ed563eb8074c8c6a0158eca"},
{file = "clickhouse_connect-0.7.16-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9b3dd93ada1099cb6df244d79973c811e90a4590685e78e60e8846914b3c261e"},
{file = "clickhouse_connect-0.7.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d3c3458bce25fe9c10e1dbf82dbeeeb2f04e382130f9811cc3bedf44c2028ca"},
{file = "clickhouse_connect-0.7.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcc302390b4ea975efd8d2ca53d295d40dc766179dd5e9fc158e808f01d9280d"},
{file = "clickhouse_connect-0.7.16-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a94f6d095d7174c55825e0b5c04b77897a1b2a8a8bbb38f3f773fd3113a7be27"},
{file = "clickhouse_connect-0.7.16-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6b7e2572993ef2e1dee5012875a7a2d08cede319e32ccdd2db90ed26a0d0c037"},
{file = "clickhouse_connect-0.7.16-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e9c35ee425309ed8ef63bae31e1d3c5f35706fa27ae2836e61e7cb9bbe7f00cb"},
{file = "clickhouse_connect-0.7.16-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:eb0471d5a32d07eaa37772871ee9e6b5eb37ab907c3c154833824ed68ee4795b"},
{file = "clickhouse_connect-0.7.16-cp312-cp312-win32.whl", hash = "sha256:b531ee18b4ce16f1d2b8f6249859cbd600f7e0f312f80dda8deb969791a90f17"},
{file = "clickhouse_connect-0.7.16-cp312-cp312-win_amd64.whl", hash = "sha256:38392308344770864843f7f8b914799684c13ce4b272d5a3a55e5512ff8a3ae0"},
{file = "clickhouse_connect-0.7.16-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:052ca80d66e49c94d103c9842d2a5b0ebf4610981b79164660ef6b1bdc4b5e85"},
{file = "clickhouse_connect-0.7.16-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b496059d145c68e956aa10cd04e5c7cb4e97312eb3f7829cec8f4f7024f8ced6"},
{file = "clickhouse_connect-0.7.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de1e423fc9c415b9fdcbb6f23eccae981e3f0f0cf142e518efec709bda7c1394"},
{file = "clickhouse_connect-0.7.16-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:555c64719cbc72675d58ea6dfc144fa8064ea1d673a54afd2d54e34c58f17c6b"},
{file = "clickhouse_connect-0.7.16-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0c3c063ab23df8f71a36505880bf5de6c18aee246938d787447e52b4d9d5531"},
{file = "clickhouse_connect-0.7.16-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5ed62e08cfe445d0430b91c26fb276e2a5175e456e9786594fb6e67c9ebd8c6c"},
{file = "clickhouse_connect-0.7.16-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d9eb056bd14ca3c1d7e3edd7ca79ea970d45e5e536930dbb6179aeb965d5bc3d"},
{file = "clickhouse_connect-0.7.16-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:54e0a03b685ee6c138954846dafb6ec0e0baf8257f2587c61e34c017f3dc9d63"},
{file = "clickhouse_connect-0.7.16-cp38-cp38-win32.whl", hash = "sha256:d8402c3145387726bd19f916ca2890576be70c4493f030c068f6f03a75addff7"},
{file = "clickhouse_connect-0.7.16-cp38-cp38-win_amd64.whl", hash = "sha256:70e376d2ebc0f092fae35f7b50ff7296ee8ffd2dda3536238f6c39a5c949d115"},
{file = "clickhouse_connect-0.7.16-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cee4f91ad22401c3b96f5df3f3149ef2894e7c2d00b5abd9da80119e7b6592f7"},
{file = "clickhouse_connect-0.7.16-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a3009145f35e9ac2535dbd8fdbdc218abfe0971c9bc9b730eb5c3f6c40faeb5f"},
{file = "clickhouse_connect-0.7.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d0ef9f877ffbcb0f526ce9c35c657fc54930d043e45c077d9d886c0f1add727"},
{file = "clickhouse_connect-0.7.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acc437b3ff2f7991b209b861a89c003ac1971c890775190178438780e967a9d3"},
{file = "clickhouse_connect-0.7.16-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ed836dcee4ac097bd83714abe0af987b1ef767675a555e7643d793164c3f1cc"},
{file = "clickhouse_connect-0.7.16-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4c4e0d173239c0b4594c8703fae5c8ba3241c4e0763a8cf436b94564692671f9"},
{file = "clickhouse_connect-0.7.16-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a17a348dd8c00df343a01128497e8c3a6ae431f13c7a88e363ac12c035316ce0"},
{file = "clickhouse_connect-0.7.16-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:805ae7ad39c043af13e2b5af45abb70330f0907749dc87ad4a2481a4ac209cc6"},
{file = "clickhouse_connect-0.7.16-cp39-cp39-win32.whl", hash = "sha256:38fc6ca1bd73cf4dcebd22fbb8dceda267908ff674fc57fbc23c3b5df9c21ac1"},
{file = "clickhouse_connect-0.7.16-cp39-cp39-win_amd64.whl", hash = "sha256:3dc67e99e40b5a8bc493a21016830b0f3800006a6038c1fd881f7cae6246cc44"},
{file = "clickhouse_connect-0.7.16-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b7f526fef71bd5265f47915340a6369a5b5685278b72b5aff281cc521a8ec376"},
{file = "clickhouse_connect-0.7.16-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e00f87ba68bbc63dd32d7a304fd629b759f24b09f88fbc2bac0a9ed1fe7b2938"},
{file = "clickhouse_connect-0.7.16-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09c84f3b64d6bebedcfbbd19e8369b3df2cb7d313afb2a0d64a3e151d344c1c1"},
{file = "clickhouse_connect-0.7.16-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18d104ab78edee26e8cef056e2db83f03e1da918df0946e1ef1ad9a27a024dd0"},
{file = "clickhouse_connect-0.7.16-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:cc1ad53e282ff5b4288fdfcf6df72cda542d9d997de5889d66a1f8e2b9f477f0"},
{file = "clickhouse_connect-0.7.16-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fddc99322054f5d3df8715ab3724bd36ac636f8ceaed4f5f3f60d377abd22d22"},
{file = "clickhouse_connect-0.7.16-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:765a2de98197d1b4f6424611ceaca2ae896a1d7093b943403973888cb7c144e6"},
{file = "clickhouse_connect-0.7.16-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1540e0a93e5f2147400f644606a399c91705066f05d5a91429616ee9812f4521"},
{file = "clickhouse_connect-0.7.16-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba928c4178b0d4a513e1b0ad32a464ab56cb1bc27736a7f41b32e4eb70eb08d6"},
{file = "clickhouse_connect-0.7.16-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a17ffc22e905081f002173b30959089de6987fd40c87e7794da9d978d723e610"},
{file = "clickhouse_connect-0.7.16-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:26df09787232b495285d8358db145b9770f472e2e30147912634c5b56392e73f"},
{file = "clickhouse_connect-0.7.16-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2a3ce33241441dc7c718c19e31645323e6c5da793d46bbb670fd4e8557b8605"},
{file = "clickhouse_connect-0.7.16-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29f9dc9cc1f4ec4a333bf119abb5cee13563e89bc990d4d77b8f43cf630e9fb1"},
{file = "clickhouse_connect-0.7.16-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a16a7ada11996a6fa0959c83e2e46ff32773e57eca40eff86176fd62a30054ca"},
{file = "clickhouse_connect-0.7.16-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ead20e1d4f3c5493dd075b7dc81b5d21be4b876aca6952e1c155824876c621f3"},
]
[package.dependencies]
certifi = "*"
lz4 = "*"
pytz = "*"
urllib3 = ">=1.26"
zstandard = "*"
[package.extras]
arrow = ["pyarrow"]
numpy = ["numpy"]
orjson = ["orjson"]
pandas = ["pandas"]
sqlalchemy = ["sqlalchemy (>1.3.21,<2.0)"]
tzlocal = ["tzlocal (>=4.0)"]
[[package]]
name = "clickhouse-driver"
version = "0.2.8"
@ -4259,6 +4349,56 @@ html5 = ["html5lib"]
htmlsoup = ["BeautifulSoup4"]
source = ["Cython (>=3.0.7)"]
[[package]]
name = "lz4"
version = "4.3.3"
description = "LZ4 Bindings for Python"
optional = false
python-versions = ">=3.8"
files = [
{file = "lz4-4.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b891880c187e96339474af2a3b2bfb11a8e4732ff5034be919aa9029484cd201"},
{file = "lz4-4.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:222a7e35137d7539c9c33bb53fcbb26510c5748779364014235afc62b0ec797f"},
{file = "lz4-4.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f76176492ff082657ada0d0f10c794b6da5800249ef1692b35cf49b1e93e8ef7"},
{file = "lz4-4.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1d18718f9d78182c6b60f568c9a9cec8a7204d7cb6fad4e511a2ef279e4cb05"},
{file = "lz4-4.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6cdc60e21ec70266947a48839b437d46025076eb4b12c76bd47f8e5eb8a75dcc"},
{file = "lz4-4.3.3-cp310-cp310-win32.whl", hash = "sha256:c81703b12475da73a5d66618856d04b1307e43428a7e59d98cfe5a5d608a74c6"},
{file = "lz4-4.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:43cf03059c0f941b772c8aeb42a0813d68d7081c009542301637e5782f8a33e2"},
{file = "lz4-4.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:30e8c20b8857adef7be045c65f47ab1e2c4fabba86a9fa9a997d7674a31ea6b6"},
{file = "lz4-4.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2f7b1839f795315e480fb87d9bc60b186a98e3e5d17203c6e757611ef7dcef61"},
{file = "lz4-4.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edfd858985c23523f4e5a7526ca6ee65ff930207a7ec8a8f57a01eae506aaee7"},
{file = "lz4-4.3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e9c410b11a31dbdc94c05ac3c480cb4b222460faf9231f12538d0074e56c563"},
{file = "lz4-4.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2507ee9c99dbddd191c86f0e0c8b724c76d26b0602db9ea23232304382e1f21"},
{file = "lz4-4.3.3-cp311-cp311-win32.whl", hash = "sha256:f180904f33bdd1e92967923a43c22899e303906d19b2cf8bb547db6653ea6e7d"},
{file = "lz4-4.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:b14d948e6dce389f9a7afc666d60dd1e35fa2138a8ec5306d30cd2e30d36b40c"},
{file = "lz4-4.3.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e36cd7b9d4d920d3bfc2369840da506fa68258f7bb176b8743189793c055e43d"},
{file = "lz4-4.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:31ea4be9d0059c00b2572d700bf2c1bc82f241f2c3282034a759c9a4d6ca4dc2"},
{file = "lz4-4.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33c9a6fd20767ccaf70649982f8f3eeb0884035c150c0b818ea660152cf3c809"},
{file = "lz4-4.3.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca8fccc15e3add173da91be8f34121578dc777711ffd98d399be35487c934bf"},
{file = "lz4-4.3.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d84b479ddf39fe3ea05387f10b779155fc0990125f4fb35d636114e1c63a2e"},
{file = "lz4-4.3.3-cp312-cp312-win32.whl", hash = "sha256:337cb94488a1b060ef1685187d6ad4ba8bc61d26d631d7ba909ee984ea736be1"},
{file = "lz4-4.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:5d35533bf2cee56f38ced91f766cd0038b6abf46f438a80d50c52750088be93f"},
{file = "lz4-4.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:363ab65bf31338eb364062a15f302fc0fab0a49426051429866d71c793c23394"},
{file = "lz4-4.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a136e44a16fc98b1abc404fbabf7f1fada2bdab6a7e970974fb81cf55b636d0"},
{file = "lz4-4.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abc197e4aca8b63f5ae200af03eb95fb4b5055a8f990079b5bdf042f568469dd"},
{file = "lz4-4.3.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56f4fe9c6327adb97406f27a66420b22ce02d71a5c365c48d6b656b4aaeb7775"},
{file = "lz4-4.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0e822cd7644995d9ba248cb4b67859701748a93e2ab7fc9bc18c599a52e4604"},
{file = "lz4-4.3.3-cp38-cp38-win32.whl", hash = "sha256:24b3206de56b7a537eda3a8123c644a2b7bf111f0af53bc14bed90ce5562d1aa"},
{file = "lz4-4.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:b47839b53956e2737229d70714f1d75f33e8ac26e52c267f0197b3189ca6de24"},
{file = "lz4-4.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6756212507405f270b66b3ff7f564618de0606395c0fe10a7ae2ffcbbe0b1fba"},
{file = "lz4-4.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee9ff50557a942d187ec85462bb0960207e7ec5b19b3b48949263993771c6205"},
{file = "lz4-4.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b901c7784caac9a1ded4555258207d9e9697e746cc8532129f150ffe1f6ba0d"},
{file = "lz4-4.3.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d9ec061b9eca86e4dcc003d93334b95d53909afd5a32c6e4f222157b50c071"},
{file = "lz4-4.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4c7bf687303ca47d69f9f0133274958fd672efaa33fb5bcde467862d6c621f0"},
{file = "lz4-4.3.3-cp39-cp39-win32.whl", hash = "sha256:054b4631a355606e99a42396f5db4d22046a3397ffc3269a348ec41eaebd69d2"},
{file = "lz4-4.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:eac9af361e0d98335a02ff12fb56caeb7ea1196cf1a49dbf6f17828a131da807"},
{file = "lz4-4.3.3.tar.gz", hash = "sha256:01fe674ef2889dbb9899d8a67361e0c4a2c833af5aeb37dd505727cf5d2a131e"},
]
[package.extras]
docs = ["sphinx (>=1.6.0)", "sphinx-bootstrap-theme"]
flake8 = ["flake8"]
tests = ["psutil", "pytest (!=3.3.0)", "pytest-cov"]
[[package]]
name = "mailchimp-transactional"
version = "1.0.56"
@ -9190,7 +9330,68 @@ docs = ["Sphinx", "repoze.sphinx.autointerface", "sphinx-rtd-theme"]
test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"]
testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"]
[[package]]
name = "zstandard"
version = "0.22.0"
description = "Zstandard bindings for Python"
optional = false
python-versions = ">=3.8"
files = [
{file = "zstandard-0.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:275df437ab03f8c033b8a2c181e51716c32d831082d93ce48002a5227ec93019"},
{file = "zstandard-0.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ac9957bc6d2403c4772c890916bf181b2653640da98f32e04b96e4d6fb3252a"},
{file = "zstandard-0.22.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe3390c538f12437b859d815040763abc728955a52ca6ff9c5d4ac707c4ad98e"},
{file = "zstandard-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1958100b8a1cc3f27fa21071a55cb2ed32e9e5df4c3c6e661c193437f171cba2"},
{file = "zstandard-0.22.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93e1856c8313bc688d5df069e106a4bc962eef3d13372020cc6e3ebf5e045202"},
{file = "zstandard-0.22.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1a90ba9a4c9c884bb876a14be2b1d216609385efb180393df40e5172e7ecf356"},
{file = "zstandard-0.22.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3db41c5e49ef73641d5111554e1d1d3af106410a6c1fb52cf68912ba7a343a0d"},
{file = "zstandard-0.22.0-cp310-cp310-win32.whl", hash = "sha256:d8593f8464fb64d58e8cb0b905b272d40184eac9a18d83cf8c10749c3eafcd7e"},
{file = "zstandard-0.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:f1a4b358947a65b94e2501ce3e078bbc929b039ede4679ddb0460829b12f7375"},
{file = "zstandard-0.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:589402548251056878d2e7c8859286eb91bd841af117dbe4ab000e6450987e08"},
{file = "zstandard-0.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a97079b955b00b732c6f280d5023e0eefe359045e8b83b08cf0333af9ec78f26"},
{file = "zstandard-0.22.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:445b47bc32de69d990ad0f34da0e20f535914623d1e506e74d6bc5c9dc40bb09"},
{file = "zstandard-0.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33591d59f4956c9812f8063eff2e2c0065bc02050837f152574069f5f9f17775"},
{file = "zstandard-0.22.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:888196c9c8893a1e8ff5e89b8f894e7f4f0e64a5af4d8f3c410f0319128bb2f8"},
{file = "zstandard-0.22.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:53866a9d8ab363271c9e80c7c2e9441814961d47f88c9bc3b248142c32141d94"},
{file = "zstandard-0.22.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4ac59d5d6910b220141c1737b79d4a5aa9e57466e7469a012ed42ce2d3995e88"},
{file = "zstandard-0.22.0-cp311-cp311-win32.whl", hash = "sha256:2b11ea433db22e720758cba584c9d661077121fcf60ab43351950ded20283440"},
{file = "zstandard-0.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:11f0d1aab9516a497137b41e3d3ed4bbf7b2ee2abc79e5c8b010ad286d7464bd"},
{file = "zstandard-0.22.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6c25b8eb733d4e741246151d895dd0308137532737f337411160ff69ca24f93a"},
{file = "zstandard-0.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f9b2cde1cd1b2a10246dbc143ba49d942d14fb3d2b4bccf4618d475c65464912"},
{file = "zstandard-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a88b7df61a292603e7cd662d92565d915796b094ffb3d206579aaebac6b85d5f"},
{file = "zstandard-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466e6ad8caefb589ed281c076deb6f0cd330e8bc13c5035854ffb9c2014b118c"},
{file = "zstandard-0.22.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1d67d0d53d2a138f9e29d8acdabe11310c185e36f0a848efa104d4e40b808e4"},
{file = "zstandard-0.22.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:39b2853efc9403927f9065cc48c9980649462acbdf81cd4f0cb773af2fd734bc"},
{file = "zstandard-0.22.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8a1b2effa96a5f019e72874969394edd393e2fbd6414a8208fea363a22803b45"},
{file = "zstandard-0.22.0-cp312-cp312-win32.whl", hash = "sha256:88c5b4b47a8a138338a07fc94e2ba3b1535f69247670abfe422de4e0b344aae2"},
{file = "zstandard-0.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:de20a212ef3d00d609d0b22eb7cc798d5a69035e81839f549b538eff4105d01c"},
{file = "zstandard-0.22.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d75f693bb4e92c335e0645e8845e553cd09dc91616412d1d4650da835b5449df"},
{file = "zstandard-0.22.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:36a47636c3de227cd765e25a21dc5dace00539b82ddd99ee36abae38178eff9e"},
{file = "zstandard-0.22.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68953dc84b244b053c0d5f137a21ae8287ecf51b20872eccf8eaac0302d3e3b0"},
{file = "zstandard-0.22.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2612e9bb4977381184bb2463150336d0f7e014d6bb5d4a370f9a372d21916f69"},
{file = "zstandard-0.22.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23d2b3c2b8e7e5a6cb7922f7c27d73a9a615f0a5ab5d0e03dd533c477de23004"},
{file = "zstandard-0.22.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d43501f5f31e22baf822720d82b5547f8a08f5386a883b32584a185675c8fbf"},
{file = "zstandard-0.22.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a493d470183ee620a3df1e6e55b3e4de8143c0ba1b16f3ded83208ea8ddfd91d"},
{file = "zstandard-0.22.0-cp38-cp38-win32.whl", hash = "sha256:7034d381789f45576ec3f1fa0e15d741828146439228dc3f7c59856c5bcd3292"},
{file = "zstandard-0.22.0-cp38-cp38-win_amd64.whl", hash = "sha256:d8fff0f0c1d8bc5d866762ae95bd99d53282337af1be9dc0d88506b340e74b73"},
{file = "zstandard-0.22.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2fdd53b806786bd6112d97c1f1e7841e5e4daa06810ab4b284026a1a0e484c0b"},
{file = "zstandard-0.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:73a1d6bd01961e9fd447162e137ed949c01bdb830dfca487c4a14e9742dccc93"},
{file = "zstandard-0.22.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9501f36fac6b875c124243a379267d879262480bf85b1dbda61f5ad4d01b75a3"},
{file = "zstandard-0.22.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48f260e4c7294ef275744210a4010f116048e0c95857befb7462e033f09442fe"},
{file = "zstandard-0.22.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:959665072bd60f45c5b6b5d711f15bdefc9849dd5da9fb6c873e35f5d34d8cfb"},
{file = "zstandard-0.22.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d22fdef58976457c65e2796e6730a3ea4a254f3ba83777ecfc8592ff8d77d303"},
{file = "zstandard-0.22.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a7ccf5825fd71d4542c8ab28d4d482aace885f5ebe4b40faaa290eed8e095a4c"},
{file = "zstandard-0.22.0-cp39-cp39-win32.whl", hash = "sha256:f058a77ef0ece4e210bb0450e68408d4223f728b109764676e1a13537d056bb0"},
{file = "zstandard-0.22.0-cp39-cp39-win_amd64.whl", hash = "sha256:e9e9d4e2e336c529d4c435baad846a181e39a982f823f7e4495ec0b0ec8538d2"},
{file = "zstandard-0.22.0.tar.gz", hash = "sha256:8226a33c542bcb54cd6bd0a366067b610b41713b64c9abec1bc4533d69f51e70"},
]
[package.dependencies]
cffi = {version = ">=1.11", markers = "platform_python_implementation == \"PyPy\""}
[package.extras]
cffi = ["cffi (>=1.11)"]
[metadata]
lock-version = "2.0"
python-versions = "^3.10"
content-hash = "7dc35227a8e2545597f7a9660850e9adb2569d38f97d72dbfdcdff88f3a38bdb"
content-hash = "76374a3483905c3219821ec31cefd75c64e0ccb3f0c5424acf1b8a1322587411"

View File

@ -211,6 +211,7 @@ qdrant-client = "1.7.3"
weaviate-client = "~3.21.0"
alibabacloud_gpdb20160503 = "~3.8.0"
alibabacloud_tea_openapi = "~0.3.9"
clickhouse-connect = "~0.7.16"
############################################################
# Transparent dependencies required by main dependencies

View File

@ -2,10 +2,10 @@ import datetime
import time
import click
from flask import current_app
from werkzeug.exceptions import NotFound
import app
from configs import dify_config
from extensions.ext_database import db
from models.dataset import Embedding
@ -13,7 +13,7 @@ from models.dataset import Embedding
@app.celery.task(queue='dataset')
def clean_embedding_cache_task():
click.echo(click.style('Start clean embedding cache.', fg='green'))
clean_days = int(current_app.config.get('CLEAN_DAY_SETTING'))
clean_days = int(dify_config.CLEAN_DAY_SETTING)
start_at = time.perf_counter()
thirty_days_ago = datetime.datetime.now() - datetime.timedelta(days=clean_days)
page = 1

View File

@ -2,10 +2,10 @@ import datetime
import time
import click
from flask import current_app
from werkzeug.exceptions import NotFound
import app
from configs import dify_config
from core.rag.index_processor.index_processor_factory import IndexProcessorFactory
from extensions.ext_database import db
from models.dataset import Dataset, DatasetQuery, Document
@ -14,7 +14,7 @@ from models.dataset import Dataset, DatasetQuery, Document
@app.celery.task(queue='dataset')
def clean_unused_datasets_task():
click.echo(click.style('Start clean unused datasets indexes.', fg='green'))
clean_days = int(current_app.config.get('CLEAN_DAY_SETTING'))
clean_days = int(dify_config.CLEAN_DAY_SETTING)
start_at = time.perf_counter()
thirty_days_ago = datetime.datetime.now() - datetime.timedelta(days=clean_days)
page = 1

View File

@ -6,10 +6,10 @@ from datetime import datetime, timedelta, timezone
from hashlib import sha256
from typing import Any, Optional
from flask import current_app
from sqlalchemy import func
from werkzeug.exceptions import Unauthorized
from configs import dify_config
from constants.languages import language_timezone_mapping, languages
from events.tenant_event import tenant_was_created
from extensions.ext_redis import redis_client
@ -80,7 +80,7 @@ class AccountService:
payload = {
"user_id": account.id,
"exp": datetime.now(timezone.utc).replace(tzinfo=None) + exp,
"iss": current_app.config['EDITION'],
"iss": dify_config.EDITION,
"sub": 'Console API Passport',
}
@ -524,7 +524,7 @@ class RegisterService:
TenantService.create_owner_tenant_if_not_exist(account)
dify_setup = DifySetup(
version=current_app.config['CURRENT_VERSION']
version=dify_config.CURRENT_VERSION
)
db.session.add(dify_setup)
db.session.commit()
@ -559,7 +559,7 @@ class RegisterService:
if open_id is not None or provider is not None:
AccountService.link_account_integrate(provider, open_id, account)
if current_app.config['EDITION'] != 'SELF_HOSTED':
if dify_config.EDITION != 'SELF_HOSTED':
tenant = TenantService.create_tenant(f"{account.name}'s Workspace")
TenantService.create_tenant_member(tenant, account, role='owner')
@ -623,7 +623,7 @@ class RegisterService:
'email': account.email,
'workspace_id': tenant.id,
}
expiryHours = current_app.config['INVITE_EXPIRY_HOURS']
expiryHours = dify_config.INVITE_EXPIRY_HOURS
redis_client.setex(
cls._get_invitation_token_key(token),
expiryHours * 60 * 60,

View File

@ -1,6 +1,7 @@
from collections.abc import Generator
from typing import Any, Union
from configs import dify_config
from core.app.apps.advanced_chat.app_generator import AdvancedChatAppGenerator
from core.app.apps.agent_chat.app_generator import AgentChatAppGenerator
from core.app.apps.chat.app_generator import ChatAppGenerator
@ -89,8 +90,7 @@ class AppGenerateService:
def _get_max_active_requests(app_model: App) -> int:
max_active_requests = app_model.max_active_requests
if app_model.max_active_requests is None:
from flask import current_app
max_active_requests = int(current_app.config['APP_MAX_ACTIVE_REQUESTS'])
max_active_requests = int(dify_config.APP_MAX_ACTIVE_REQUESTS)
return max_active_requests
@classmethod

View File

@ -4,10 +4,10 @@ from datetime import datetime, timezone
from typing import cast
import yaml
from flask import current_app
from flask_login import current_user
from flask_sqlalchemy.pagination import Pagination
from configs import dify_config
from constants.model_template import default_app_templates
from core.agent.entities import AgentToolEntity
from core.app.features.rate_limiting import RateLimit
@ -446,7 +446,7 @@ class AppService:
# get all tools
tools = agent_config.get('tools', [])
url_prefix = (current_app.config.get("CONSOLE_API_URL")
url_prefix = (dify_config.CONSOLE_API_URL
+ "/console/api/workspaces/current/tool-provider/builtin/")
for tool in tools:

View File

@ -6,10 +6,10 @@ import time
import uuid
from typing import Optional
from flask import current_app
from flask_login import current_user
from sqlalchemy import func
from configs import dify_config
from core.errors.error import LLMBadRequestError, ProviderTokenNotInitError
from core.model_manager import ModelManager
from core.model_runtime.entities.model_entities import ModelType
@ -650,7 +650,7 @@ class DocumentService:
elif document_data["data_source"]["type"] == "website_crawl":
website_info = document_data["data_source"]['info_list']['website_info_list']
count = len(website_info['urls'])
batch_upload_limit = int(current_app.config['BATCH_UPLOAD_LIMIT'])
batch_upload_limit = int(dify_config.BATCH_UPLOAD_LIMIT)
if count > batch_upload_limit:
raise ValueError(f"You have reached the batch upload limit of {batch_upload_limit}.")
@ -1028,7 +1028,7 @@ class DocumentService:
elif document_data["data_source"]["type"] == "website_crawl":
website_info = document_data["data_source"]['info_list']['website_info_list']
count = len(website_info['urls'])
batch_upload_limit = int(current_app.config['BATCH_UPLOAD_LIMIT'])
batch_upload_limit = int(dify_config.BATCH_UPLOAD_LIMIT)
if count > batch_upload_limit:
raise ValueError(f"You have reached the batch upload limit of {batch_upload_limit}.")

View File

@ -1,9 +1,9 @@
from enum import Enum
from typing import Optional
from flask import current_app
from pydantic import BaseModel, ConfigDict
from configs import dify_config
from core.entities.model_entities import ModelWithProviderEntity, ProviderModelWithStatusEntity
from core.entities.provider_entities import QuotaConfiguration
from core.model_runtime.entities.common_entities import I18nObject
@ -67,7 +67,7 @@ class ProviderResponse(BaseModel):
def __init__(self, **data) -> None:
super().__init__(**data)
url_prefix = (current_app.config.get("CONSOLE_API_URL")
url_prefix = (dify_config.CONSOLE_API_URL
+ f"/console/api/workspaces/current/model-providers/{self.provider}")
if self.icon_small is not None:
self.icon_small = I18nObject(
@ -96,7 +96,7 @@ class ProviderWithModelsResponse(BaseModel):
def __init__(self, **data) -> None:
super().__init__(**data)
url_prefix = (current_app.config.get("CONSOLE_API_URL")
url_prefix = (dify_config.CONSOLE_API_URL
+ f"/console/api/workspaces/current/model-providers/{self.provider}")
if self.icon_small is not None:
self.icon_small = I18nObject(
@ -119,7 +119,7 @@ class SimpleProviderEntityResponse(SimpleProviderEntity):
def __init__(self, **data) -> None:
super().__init__(**data)
url_prefix = (current_app.config.get("CONSOLE_API_URL")
url_prefix = (dify_config.CONSOLE_API_URL
+ f"/console/api/workspaces/current/model-providers/{self.provider}")
if self.icon_small is not None:
self.icon_small = I18nObject(

View File

@ -1,6 +1,6 @@
from flask import current_app
from pydantic import BaseModel, ConfigDict
from configs import dify_config
from services.billing_service import BillingService
from services.enterprise.enterprise_service import EnterpriseService
@ -51,7 +51,7 @@ class FeatureService:
cls._fulfill_params_from_env(features)
if current_app.config['BILLING_ENABLED']:
if dify_config.BILLING_ENABLED:
cls._fulfill_params_from_billing_api(features, tenant_id)
return features
@ -60,16 +60,16 @@ class FeatureService:
def get_system_features(cls) -> SystemFeatureModel:
system_features = SystemFeatureModel()
if current_app.config['ENTERPRISE_ENABLED']:
if dify_config.ENTERPRISE_ENABLED:
cls._fulfill_params_from_enterprise(system_features)
return system_features
@classmethod
def _fulfill_params_from_env(cls, features: FeatureModel):
features.can_replace_logo = current_app.config['CAN_REPLACE_LOGO']
features.model_load_balancing_enabled = current_app.config['MODEL_LB_ENABLED']
features.dataset_operator_enabled = current_app.config['DATASET_OPERATOR_ENABLED']
features.can_replace_logo = dify_config.CAN_REPLACE_LOGO
features.model_load_balancing_enabled = dify_config.MODEL_LB_ENABLED
features.dataset_operator_enabled = dify_config.DATASET_OPERATOR_ENABLED
@classmethod
def _fulfill_params_from_billing_api(cls, features: FeatureModel, tenant_id: str):

View File

@ -4,11 +4,11 @@ import uuid
from collections.abc import Generator
from typing import Union
from flask import current_app
from flask_login import current_user
from werkzeug.datastructures import FileStorage
from werkzeug.exceptions import NotFound
from configs import dify_config
from core.file.upload_file_parser import UploadFileParser
from core.rag.extractor.extract_processor import ExtractProcessor
from extensions.ext_database import db
@ -35,7 +35,7 @@ class FileService:
extension = file.filename.split('.')[-1]
if len(filename) > 200:
filename = filename.split('.')[0][:200] + '.' + extension
etl_type = current_app.config['ETL_TYPE']
etl_type = dify_config.ETL_TYPE
allowed_extensions = UNSTRUCTURED_ALLOWED_EXTENSIONS + IMAGE_EXTENSIONS if etl_type == 'Unstructured' \
else ALLOWED_EXTENSIONS + IMAGE_EXTENSIONS
if extension.lower() not in allowed_extensions:
@ -50,9 +50,9 @@ class FileService:
file_size = len(file_content)
if extension.lower() in IMAGE_EXTENSIONS:
file_size_limit = current_app.config.get("UPLOAD_IMAGE_FILE_SIZE_LIMIT") * 1024 * 1024
file_size_limit = dify_config.UPLOAD_IMAGE_FILE_SIZE_LIMIT * 1024 * 1024
else:
file_size_limit = current_app.config.get("UPLOAD_FILE_SIZE_LIMIT") * 1024 * 1024
file_size_limit = dify_config.UPLOAD_FILE_SIZE_LIMIT * 1024 * 1024
if file_size > file_size_limit:
message = f'File size exceeded. {file_size} > {file_size_limit}'
@ -73,10 +73,9 @@ class FileService:
storage.save(file_key, file_content)
# save file to db
config = current_app.config
upload_file = UploadFile(
tenant_id=current_tenant_id,
storage_type=config['STORAGE_TYPE'],
storage_type=dify_config.STORAGE_TYPE,
key=file_key,
name=filename,
size=file_size,
@ -106,10 +105,9 @@ class FileService:
storage.save(file_key, text.encode('utf-8'))
# save file to db
config = current_app.config
upload_file = UploadFile(
tenant_id=current_user.current_tenant_id,
storage_type=config['STORAGE_TYPE'],
storage_type=dify_config.STORAGE_TYPE,
key=file_key,
name=text_name + '.txt',
size=len(text),
@ -138,7 +136,7 @@ class FileService:
# extract text from file
extension = upload_file.extension
etl_type = current_app.config['ETL_TYPE']
etl_type = dify_config.ETL_TYPE
allowed_extensions = UNSTRUCTURED_ALLOWED_EXTENSIONS if etl_type == 'Unstructured' else ALLOWED_EXTENSIONS
if extension.lower() not in allowed_extensions:
raise UnsupportedFileTypeError()

View File

@ -4,8 +4,8 @@ from os import path
from typing import Optional
import requests
from flask import current_app
from configs import dify_config
from constants.languages import languages
from extensions.ext_database import db
from models.model import App, RecommendedApp
@ -25,7 +25,7 @@ class RecommendedAppService:
:param language: language
:return:
"""
mode = current_app.config.get('HOSTED_FETCH_APP_TEMPLATES_MODE', 'remote')
mode = dify_config.HOSTED_FETCH_APP_TEMPLATES_MODE
if mode == 'remote':
try:
result = cls._fetch_recommended_apps_from_dify_official(language)
@ -104,7 +104,7 @@ class RecommendedAppService:
:param language: language
:return:
"""
domain = current_app.config.get('HOSTED_FETCH_APP_TEMPLATES_REMOTE_DOMAIN', 'https://tmpl.dify.ai')
domain = dify_config.HOSTED_FETCH_APP_TEMPLATES_REMOTE_DOMAIN
url = f'{domain}/apps?language={language}'
response = requests.get(url, timeout=(3, 10))
if response.status_code != 200:
@ -134,7 +134,7 @@ class RecommendedAppService:
:param app_id: app id
:return:
"""
mode = current_app.config.get('HOSTED_FETCH_APP_TEMPLATES_MODE', 'remote')
mode = dify_config.HOSTED_FETCH_APP_TEMPLATES_MODE
if mode == 'remote':
try:
result = cls._fetch_recommended_app_detail_from_dify_official(app_id)
@ -157,7 +157,7 @@ class RecommendedAppService:
:param app_id: App ID
:return:
"""
domain = current_app.config.get('HOSTED_FETCH_APP_TEMPLATES_REMOTE_DOMAIN', 'https://tmpl.dify.ai')
domain = dify_config.HOSTED_FETCH_APP_TEMPLATES_REMOTE_DOMAIN
url = f'{domain}/apps/{app_id}'
response = requests.get(url, timeout=(3, 10))
if response.status_code != 200:

View File

@ -429,6 +429,7 @@ class ApiToolManageService:
db_provider=provider,
decrypt_credentials=True
)
user_provider.labels = labels
# add icon
ToolTransformService.repack_provider(user_provider)

View File

@ -2,8 +2,7 @@ import json
import logging
from typing import Optional, Union
from flask import current_app
from configs import dify_config
from core.tools.entities.api_entities import UserTool, UserToolProvider
from core.tools.entities.common_entities import I18nObject
from core.tools.entities.tool_bundle import ApiToolBundle
@ -29,7 +28,7 @@ class ToolTransformService:
"""
get tool provider icon url
"""
url_prefix = (current_app.config.get("CONSOLE_API_URL")
url_prefix = (dify_config.CONSOLE_API_URL
+ "/console/api/workspaces/current/tool-provider/")
if provider_type == ToolProviderType.BUILT_IN.value:

View File

@ -1,7 +1,7 @@
from flask import current_app
from flask_login import current_user
from configs import dify_config
from extensions.ext_database import db
from models.account import Tenant, TenantAccountJoin, TenantAccountJoinRole
from services.account_service import TenantService
@ -35,7 +35,7 @@ class WorkspaceService:
if can_replace_logo and TenantService.has_roles(tenant,
[TenantAccountJoinRole.OWNER, TenantAccountJoinRole.ADMIN]):
base_url = current_app.config.get('FILES_URL')
base_url = dify_config.FILES_URL
replace_webapp_logo = f'{base_url}/files/workspaces/{tenant.id}/webapp-logo' if tenant.custom_config_dict.get('replace_webapp_logo') else None
remove_webapp_brand = tenant.custom_config_dict.get('remove_webapp_brand', False)

View File

@ -4,8 +4,8 @@ import time
import click
from celery import shared_task
from flask import current_app
from configs import dify_config
from core.indexing_runner import DocumentIsPausedException, IndexingRunner
from extensions.ext_database import db
from models.dataset import Dataset, Document
@ -32,7 +32,7 @@ def document_indexing_task(dataset_id: str, document_ids: list):
if features.billing.enabled:
vector_space = features.vector_space
count = len(document_ids)
batch_upload_limit = int(current_app.config['BATCH_UPLOAD_LIMIT'])
batch_upload_limit = int(dify_config.BATCH_UPLOAD_LIMIT)
if count > batch_upload_limit:
raise ValueError(f"You have reached the batch upload limit of {batch_upload_limit}.")
if 0 < vector_space.limit <= vector_space.size:

View File

@ -4,8 +4,8 @@ import time
import click
from celery import shared_task
from flask import current_app
from configs import dify_config
from core.indexing_runner import DocumentIsPausedException, IndexingRunner
from core.rag.index_processor.index_processor_factory import IndexProcessorFactory
from extensions.ext_database import db
@ -33,7 +33,7 @@ def duplicate_document_indexing_task(dataset_id: str, document_ids: list):
if features.billing.enabled:
vector_space = features.vector_space
count = len(document_ids)
batch_upload_limit = int(current_app.config['BATCH_UPLOAD_LIMIT'])
batch_upload_limit = int(dify_config.BATCH_UPLOAD_LIMIT)
if count > batch_upload_limit:
raise ValueError(f"You have reached the batch upload limit of {batch_upload_limit}.")
if 0 < vector_space.limit <= vector_space.size:

View File

@ -3,8 +3,9 @@ import time
import click
from celery import shared_task
from flask import current_app, render_template
from flask import render_template
from configs import dify_config
from extensions.ext_mail import mail
@ -29,7 +30,7 @@ def send_invite_member_mail_task(language: str, to: str, token: str, inviter_nam
# send invite member mail using different languages
try:
url = f'{current_app.config.get("CONSOLE_WEB_URL")}/activate?token={token}'
url = f'{dify_config.CONSOLE_WEB_URL}/activate?token={token}'
if language == 'zh-Hans':
html_content = render_template('invite_member_mail_template_zh-CN.html',
to=to,

View File

@ -3,8 +3,9 @@ import time
import click
from celery import shared_task
from flask import current_app, render_template
from flask import render_template
from configs import dify_config
from extensions.ext_mail import mail
@ -24,7 +25,7 @@ def send_reset_password_mail_task(language: str, to: str, token: str):
# send reset password mail using different languages
try:
url = f'{current_app.config.get("CONSOLE_WEB_URL")}/forgot-password?token={token}'
url = f'{dify_config.CONSOLE_WEB_URL}/forgot-password?token={token}'
if language == 'zh-Hans':
html_content = render_template('reset_password_mail_template_zh-CN.html',
to=to,

View File

@ -0,0 +1,29 @@
from core.rag.datasource.vdb.myscale.myscale_vector import MyScaleConfig, MyScaleVector
from tests.integration_tests.vdb.test_vector_store import (
AbstractVectorTest,
setup_mock_redis,
)
class MyScaleVectorTest(AbstractVectorTest):
def __init__(self):
super().__init__()
self.vector = MyScaleVector(
collection_name=self.collection_name,
config=MyScaleConfig(
host="localhost",
port=8123,
user="default",
password="",
database="dify",
fts_params="",
),
)
def get_ids_by_metadata_field(self):
ids = self.vector.get_ids_by_metadata_field(key='document_id', value=self.example_doc_id)
assert len(ids) == 1
def test_myscale_vector(setup_mock_redis):
MyScaleVectorTest().run_all_tests()

View File

@ -3,6 +3,7 @@ set -x
pytest api/tests/integration_tests/vdb/chroma \
api/tests/integration_tests/vdb/milvus \
api/tests/integration_tests/vdb/myscale \
api/tests/integration_tests/vdb/pgvecto_rs \
api/tests/integration_tests/vdb/pgvector \
api/tests/integration_tests/vdb/qdrant \

View File

@ -40,7 +40,7 @@ services:
# The default value is 300 seconds.
FILES_ACCESS_TIMEOUT: 300
# The maximum number of active requests for the application, where 0 means unlimited, should be a non-negative integer.
APP_MAX_ACTIVE_REQUESTS: ${FILES_ACCESS_TIMEOUT:-0}
APP_MAX_ACTIVE_REQUESTS: 0
# When enabled, migrations will be executed prior to application startup and the application will start after the migrations have completed.
MIGRATION_ENABLED: 'true'
# The configurations of postgres database connection.

View File

@ -243,7 +243,7 @@ TENCENT_COS_SCHEME=your-scheme
# ------------------------------
# The type of vector store to use.
# Supported values are `weaviate`, `qdrant`, `milvus`, `relyt`, `pgvector`, `chroma`, `opensearch`, `tidb_vector`, `oracle`, `tencent`.
# Supported values are `weaviate`, `qdrant`, `milvus`, `myscale`, `relyt`, `pgvector`, `chroma`, `opensearch`, `tidb_vector`, `oracle`, `tencent`.
VECTOR_STORE=weaviate
# The Weaviate endpoint URL. Only available when VECTOR_STORE is `weaviate`.
@ -274,6 +274,16 @@ MILVUS_PASSWORD=Milvus
# The milvus tls switch.
MILVUS_SECURE=false
# MyScale configuration, only available when VECTOR_STORE is `myscale`
# For multi-language support, please set MYSCALE_FTS_PARAMS with referring to:
# https://myscale.com/docs/en/text-search/#understanding-fts-index-parameters
MYSCALE_HOST=myscale
MYSCALE_PORT=8123
MYSCALE_USER=default
MYSCALE_PASSWORD=
MYSCALE_DATABASE=dify
MYSCALE_FTS_PARAMS=
# pgvector configurations, only available when VECTOR_STORE is `pgvecto-rs or pgvector`
PGVECTOR_HOST=pgvector
PGVECTOR_PORT=5432

View File

@ -12,7 +12,7 @@ x-shared-env: &shared-api-worker-env
OPENAI_API_BASE: ${OPENAI_API_BASE:-https://api.openai.com/v1}
FILES_URL: ${FILES_URL:-}
FILES_ACCESS_TIMEOUT: ${FILES_ACCESS_TIMEOUT:-300}
APP_MAX_ACTIVE_REQUESTS: ${FILES_ACCESS_TIMEOUT:-0}
APP_MAX_ACTIVE_REQUESTS: ${APP_MAX_ACTIVE_REQUESTS:-0}
MIGRATION_ENABLED: ${MIGRATION_ENABLED:-true}
DEPLOY_ENV: ${DEPLOY_ENV:-PRODUCTION}
DIFY_BIND_ADDRESS: ${DIFY_BIND_ADDRESS:-0.0.0.0}
@ -83,6 +83,12 @@ x-shared-env: &shared-api-worker-env
MILVUS_USER: ${MILVUS_USER:-root}
MILVUS_PASSWORD: ${MILVUS_PASSWORD:-Milvus}
MILVUS_SECURE: ${MILVUS_SECURE:-false}
MYSCALE_HOST: ${MYSCALE_HOST:-myscale}
MYSCALE_PORT: ${MYSCALE_PORT:-8123}
MYSCALE_USER: ${MYSCALE_USER:-default}
MYSCALE_PASSWORD: ${MYSCALE_PASSWORD:-}
MYSCALE_DATABASE: ${MYSCALE_DATABASE:-dify}
MYSCALE_FTS_PARAMS: ${MYSCALE_FTS_PARAMS:-}
RELYT_HOST: ${RELYT_HOST:-db}
RELYT_PORT: ${RELYT_PORT:-5432}
RELYT_USER: ${RELYT_USER:-postgres}
@ -532,6 +538,21 @@ services:
depends_on:
- opensearch
# MyScale vector database
myscale:
container_name: myscale
image: myscale/myscaledb:1.6
profiles:
- myscale
restart: always
tty: true
volumes:
- ./volumes/myscale/data:/var/lib/clickhouse
- ./volumes/myscale/log:/var/log/clickhouse-server
- ./volumes/myscale/config/users.d/custom_users_config.xml:/etc/clickhouse-server/users.d/custom_users_config.xml
ports:
- "${MYSCALE_PORT:-8123}:${MYSCALE_PORT:-8123}"
networks:
# create a network between sandbox, api and ssrf_proxy, and can not access outside.
ssrf_proxy_network:

View File

@ -0,0 +1,17 @@
<clickhouse>
<users>
<default>
<password></password>
<networks>
<ip>::1</ip> <!-- change to ::/0 to allow access from all addresses -->
<ip>127.0.0.1</ip>
<ip>10.0.0.0/8</ip>
<ip>172.16.0.0/12</ip>
<ip>192.168.0.0/16</ip>
</networks>
<profile>default</profile>
<quota>default</quota>
<access_management>1</access_management>
</default>
</users>
</clickhouse>

View File

@ -17,7 +17,6 @@ import Switch from '@/app/components/base/switch'
import { ChangeType, InputVarType } from '@/app/components/workflow/types'
const TEXT_MAX_LENGTH = 256
const PARAGRAPH_MAX_LENGTH = 1032 * 32
export type IConfigModalProps = {
isCreate?: boolean
@ -167,7 +166,7 @@ const ConfigModal: FC<IConfigModalProps> = ({
{isStringInput && (
<Field title={t('appDebug.variableConig.maxLength')}>
<ConfigString maxLength={type === InputVarType.textInput ? TEXT_MAX_LENGTH : PARAGRAPH_MAX_LENGTH} modelId={modelConfig.model_id} value={max_length} onChange={handlePayloadChange('max_length')} />
<ConfigString maxLength={type === InputVarType.textInput ? TEXT_MAX_LENGTH : Infinity} modelId={modelConfig.model_id} value={max_length} onChange={handlePayloadChange('max_length')} />
</Field>
)}

View File

@ -1,6 +1,8 @@
import React, { useEffect, useRef, useState } from 'react'
import mermaid from 'mermaid'
import { usePrevious } from 'ahooks'
import CryptoJS from 'crypto-js'
import { ExclamationTriangleIcon } from '@heroicons/react/24/outline'
import LoadingAnim from '@/app/components/base/chat/chat/loading-anim'
let mermaidAPI: any
@ -40,32 +42,15 @@ const Flowchart = React.forwardRef((props: {
}, ref) => {
const [svgCode, setSvgCode] = useState(null)
const chartId = useRef(`flowchart_${CryptoJS.MD5(props.PrimitiveCode).toString()}`)
const [isRender, setIsRender] = useState(false)
const prevPrimitiveCode = usePrevious(props.PrimitiveCode)
const [isLoading, setIsLoading] = useState(true)
const clearFlowchartCache = () => {
for (let i = localStorage.length - 1; i >= 0; --i) {
const key = localStorage.key(i)
if (key && key.startsWith('flowchart_'))
localStorage.removeItem(key)
}
}
const timeRef = useRef<NodeJS.Timeout>()
const [errMsg, setErrMsg] = useState('')
const renderFlowchart = async (PrimitiveCode: string) => {
try {
const cachedSvg: any = localStorage.getItem(chartId.current)
if (cachedSvg) {
setSvgCode(cachedSvg)
setIsLoading(false)
return
}
if (typeof window !== 'undefined' && mermaidAPI) {
const svgGraph = await mermaidAPI.render(chartId.current, PrimitiveCode)
const dom = new DOMParser().parseFromString(svgGraph.svg, 'text/xml')
if (!dom.querySelector('g.main'))
throw new Error('empty svg')
const base64Svg: any = await svgToBase64(svgGraph.svg)
setSvgCode(base64Svg)
setIsLoading(false)
@ -74,30 +59,26 @@ const Flowchart = React.forwardRef((props: {
}
}
catch (error) {
clearFlowchartCache()
// eslint-disable-next-line @typescript-eslint/no-use-before-define
handleReRender()
if (prevPrimitiveCode === props.PrimitiveCode) {
setIsLoading(false)
setErrMsg((error as Error).message)
}
}
}
const handleReRender = () => {
setIsRender(false)
setSvgCode(null)
if (chartId.current)
localStorage.removeItem(chartId.current)
setTimeout(() => {
setIsRender(true)
renderFlowchart(props.PrimitiveCode)
}, 100)
}
useEffect(() => {
setIsRender(false)
setTimeout(() => {
setIsRender(true)
const cachedSvg: any = localStorage.getItem(chartId.current)
if (cachedSvg) {
setSvgCode(cachedSvg)
setIsLoading(false)
return
}
if (timeRef.current)
clearTimeout(timeRef.current)
timeRef.current = setTimeout(() => {
renderFlowchart(props.PrimitiveCode)
}, 100)
}, 300)
}, [props.PrimitiveCode])
return (
@ -105,16 +86,24 @@ const Flowchart = React.forwardRef((props: {
// @ts-expect-error
<div ref={ref}>
{
isRender
&& <div className="mermaid" style={style}>
{svgCode && <img src={svgCode} style={{ width: '100%', height: 'auto' }} alt="Mermaid chart" />}
</div>
svgCode
&& <div className="mermaid" style={style}>
{svgCode && <img src={svgCode} style={{ width: '100%', height: 'auto' }} alt="Mermaid chart" />}
</div>
}
{isLoading
&& <div className='py-4 px-[26px]'>
<LoadingAnim type='text' />
</div>
}
{
errMsg
&& <div className='py-4 px-[26px]'>
<ExclamationTriangleIcon className='w-6 h-6 text-red-500' />
&nbsp;
{errMsg}
</div>
}
</div>
)
})

View File

@ -213,7 +213,7 @@ Workflow applications offers non-session support and is ideal for translation, a
---
<Heading
url='/workflows/:task_id/stop'
url='/workflows/tasks/:task_id/stop'
method='POST'
title='Stop Generate'
name='#stop-generatebacks'
@ -231,9 +231,9 @@ Workflow applications offers non-session support and is ideal for translation, a
</Col>
<Col sticky>
### Request Example
<CodeGroup title="Request" tag="POST" label="/workflows/:task_id/stop" targetCode={`curl -X POST '${props.appDetail.api_base_url}/workflows/:task_id/stop' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{"user": "abc-123"}'`}>
<CodeGroup title="Request" tag="POST" label="/workflows/tasks/:task_id/stop" targetCode={`curl -X POST '${props.appDetail.api_base_url}/workflows/tasks/:task_id/stop' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{"user": "abc-123"}'`}>
```bash {{ title: 'cURL' }}
curl -X POST '${props.appDetail.api_base_url}/workflows/:task_id/stop' \
curl -X POST '${props.appDetail.api_base_url}/workflows/tasks/:task_id/stop' \
-H 'Authorization: Bearer {api_key}' \
-H 'Content-Type: application/json' \
--data-raw '{

View File

@ -209,7 +209,7 @@ Workflow 应用无会话支持,适合用于翻译/文章写作/总结 AI 等
---
<Heading
url='/workflows/:task_id/stop'
url='/workflows/tasks/:task_id/stop'
method='POST'
title='停止响应'
name='#stop-generatebacks'
@ -227,9 +227,9 @@ Workflow 应用无会话支持,适合用于翻译/文章写作/总结 AI 等
</Col>
<Col sticky>
### Request Example
<CodeGroup title="Request" tag="POST" label="/workflows/:task_id/stop" targetCode={`curl -X POST '${props.appDetail.api_base_url}/workflows/:task_id/stop' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{"user": "abc-123"}'`}>
<CodeGroup title="Request" tag="POST" label="/workflows/tasks/:task_id/stop" targetCode={`curl -X POST '${props.appDetail.api_base_url}/workflows/tasks/:task_id/stop' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{"user": "abc-123"}'`}>
```bash {{ title: 'cURL' }}
curl -X POST '${props.appDetail.api_base_url}/workflows/:task_id/stop' \
curl -X POST '${props.appDetail.api_base_url}/workflows/tasks/:task_id/stop' \
-H 'Authorization: Bearer {api_key}' \
-H 'Content-Type: application/json' \
--data-raw '{

View File

@ -35,20 +35,25 @@ const ProviderCard: FC<ProviderCardProps> = ({
return (
<div
className='group relative flex flex-col justify-between px-4 py-3 h-[148px] border-[0.5px] border-black/5 rounded-xl shadow-xs hover:shadow-lg'
className='group relative flex flex-col px-4 py-3 h-[148px] border-[0.5px] border-black/5 rounded-xl shadow-xs hover:shadow-lg'
style={{ background: provider.background || DEFAULT_BACKGROUND_COLOR }}
>
<div>
<div className='grow h-0'>
<div className='py-0.5'>
<ProviderIcon provider={provider} />
</div>
{
provider.description && (
<div className='mt-1 leading-4 text-xs text-black/[48]'>{provider.description[language] || provider.description.en_US}</div>
<div
className='mt-1 leading-4 text-xs text-black/[48] line-clamp-4'
title={provider.description[language] || provider.description.en_US}
>
{provider.description[language] || provider.description.en_US}
</div>
)
}
</div>
<div>
<div className='shrink-0'>
<div className={'flex flex-wrap group-hover:hidden gap-0.5'}>
{
provider.supported_model_types.map(modelType => (

View File

@ -17,6 +17,7 @@ import EmojiPicker from '@/app/components/base/emoji-picker'
import AppIcon from '@/app/components/base/app-icon'
import { parseParamsSchema } from '@/service/tools'
import LabelSelector from '@/app/components/tools/labels/selector'
import Toast from '@/app/components/base/toast'
const fieldNameClassNames = 'py-2 leading-5 text-sm font-medium text-gray-900'
type Props = {
@ -136,6 +137,21 @@ const EditCustomCollectionModal: FC<Props> = ({
draft.labels = labels
})
let errorMessage = ''
if (!postData.provider)
errorMessage = t('common.errorMsg.fieldRequired', { field: t('tools.createTool.name') })
if (!postData.schema)
errorMessage = t('common.errorMsg.fieldRequired', { field: t('tools.createTool.schema') })
if (errorMessage) {
Toast.notify({
type: 'error',
message: errorMessage,
})
return
}
if (isAdd) {
onAdd?.(postData)
return
@ -175,7 +191,7 @@ const EditCustomCollectionModal: FC<Props> = ({
<div className='flex flex-col h-full'>
<div className='grow h-0 overflow-y-auto px-6 py-3 space-y-4'>
<div>
<div className={fieldNameClassNames}>{t('tools.createTool.name')}</div>
<div className={fieldNameClassNames}>{t('tools.createTool.name')} <span className='ml-1 text-red-500'>*</span></div>
<div className='flex items-center justify-between gap-3'>
<AppIcon size='large' onClick={() => { setShowEmojiPicker(true) }} className='cursor-pointer' icon={emoji.content} background={emoji.background} />
<input
@ -195,7 +211,7 @@ const EditCustomCollectionModal: FC<Props> = ({
<div className='select-none'>
<div className='flex justify-between items-center'>
<div className='flex items-center'>
<div className={fieldNameClassNames}>{t('tools.createTool.schema')}</div>
<div className={fieldNameClassNames}>{t('tools.createTool.schema')}<span className='ml-1 text-red-500'>*</span></div>
<div className='mx-2 w-px h-3 bg-black/5'></div>
<a
href="https://swagger.io/specification/"

View File

@ -117,7 +117,7 @@ const ProviderDetail = ({
provider: collection.name,
})
setIsDetailLoading(false)
}, [collection.name])
}, [collection.labels, collection.name])
// workflow provider
const [isShowEditWorkflowToolModal, setIsShowEditWorkflowToolModal] = useState(false)
const getWorkflowToolProvider = useCallback(async () => {

View File

@ -63,28 +63,32 @@ const WorkflowToolAsModal: FC<Props> = ({
const [showModal, setShowModal] = useState(false)
const isNameValid = (name: string) => {
// when the user has not input anything, no need for a warning
if (name === '')
return true
return /^[a-zA-Z0-9_]+$/.test(name)
}
const onConfirm = () => {
if (!label) {
return Toast.notify({
let errorMessage = ''
if (!label)
errorMessage = t('common.errorMsg.fieldRequired', { field: t('tools.createTool.name') })
if (!name)
errorMessage = t('common.errorMsg.fieldRequired', { field: t('tools.createTool.nameForToolCall') })
if (!isNameValid(name))
errorMessage = t('tools.createTool.nameForToolCall') + t('tools.createTool.nameForToolCallTip')
if (errorMessage) {
Toast.notify({
type: 'error',
message: 'Please enter the tool name',
})
}
if (!name) {
return Toast.notify({
type: 'error',
message: 'Please enter the name for tool call',
})
}
else if (!isNameValid(name)) {
return Toast.notify({
type: 'error',
message: 'Name for tool call can only contain numbers, letters, and underscores',
message: errorMessage,
})
return
}
const requestParams = {
name,
description,
@ -127,7 +131,7 @@ const WorkflowToolAsModal: FC<Props> = ({
<div className='grow h-0 overflow-y-auto px-6 py-3 space-y-4'>
{/* name & icon */}
<div>
<div className='py-2 leading-5 text-sm font-medium text-gray-900'>{t('tools.createTool.name')}</div>
<div className='py-2 leading-5 text-sm font-medium text-gray-900'>{t('tools.createTool.name')} <span className='ml-1 text-red-500'>*</span></div>
<div className='flex items-center justify-between gap-3'>
<AppIcon size='large' onClick={() => { setShowEmojiPicker(true) }} className='cursor-pointer' icon={emoji.content} background={emoji.background} />
<input
@ -142,7 +146,7 @@ const WorkflowToolAsModal: FC<Props> = ({
{/* name for tool call */}
<div>
<div className='flex items-center py-2 leading-5 text-sm font-medium text-gray-900'>
{t('tools.createTool.nameForToolCall')}
{t('tools.createTool.nameForToolCall')} <span className='ml-1 text-red-500'>*</span>
<Tooltip
htmlContent={
<div className='w-[180px]'>
@ -162,7 +166,7 @@ const WorkflowToolAsModal: FC<Props> = ({
onChange={e => setName(e.target.value)}
/>
{!isNameValid(name) && (
<div className='text-xs leading-[18px] text-[#DC6803]'>{t('tools.createTool.nameForToolCallTip')}</div>
<div className='text-xs leading-[18px] text-red-500'>{t('tools.createTool.nameForToolCallTip')}</div>
)}
</div>
{/* description */}
@ -248,7 +252,7 @@ const WorkflowToolAsModal: FC<Props> = ({
)}
<div className='flex space-x-2 '>
<Button onClick={onHide}>{t('common.operation.cancel')}</Button>
<Button disabled={!label || !name || !isNameValid(name)} variant='primary' onClick={() => {
<Button variant='primary' onClick={() => {
if (isAdd)
onConfirm()
else

View File

@ -174,7 +174,7 @@ html[data-theme="dark"] {
--color-components-badge-status-light-success-halo: #17B26A4D;
--color-components-badge-status-light-border-outer: #222225;
--color-components-badge-status-light-_high-light: #FFFFFF4D;
--color-components-badge-status-light-high-light: #FFFFFF4D;
--color-components-badge-status-light-warning-bg: #F79009;
--color-components-badge-status-light-warning-border-inner: #FDB022;
--color-components-badge-status-light-warning-halo: #F790094D;
@ -249,7 +249,7 @@ html[data-theme="dark"] {
--color-text-accent-secondary: #84ABFF;
--color-text-accent-light-mode-only: #D9D9DE;
--color-text-text-selected: #155AEF4D;
--color-text-_secondary-on-surface: #FFFFFFE5;
--color-text-secondary-on-surface: #FFFFFFE5;
--color-text-logo-text: #E9E9EC;
--color-text-empty-state-icon: #C8CEDA4D;
@ -298,12 +298,12 @@ html[data-theme="dark"] {
--color-shadow-shadow-2: #00000014;
--color-shadow-shadow-10: #00000066;
--color-workflow-block-_border: #FFFFFF14;
--color-workflow-block-_panel-bg: #27272B;
--color-workflow-block-border: #FFFFFF14;
--color-workflow-block-panel-bg: #27272B;
--color-workflow-block-border: #FFFFFF14;
--color-workflow-block-parma-bg: #FFFFFF0D;
--color-workflow-block-_nav-bg: #1D1D20;
--color-workflow-block-_nav-border-right: #FFFFFF0D;
--color-workflow-block-nav-bg: #1D1D20;
--color-workflow-block-nav-border-right: #FFFFFF0D;
--color-workflow-block-bg: #27272B;
--color-workflow-canvas-workflow-dot-color: #8585AD26;
@ -395,167 +395,167 @@ html[data-theme="dark"] {
--color-effects-highlight-lightmode-off: #C8CEDA14;
--color-effects-image-frame: #FFFFFF;
--color-_util-colors-orange-dark-orange-dark-50: #57130A;
--color-_util-colors-orange-dark-orange-dark-100: #771A0D;
--color-_util-colors-orange-dark-orange-dark-200: #97180C;
--color-_util-colors-orange-dark-orange-dark-300: #BC1B06;
--color-_util-colors-orange-dark-orange-dark-400: #E62E05;
--color-_util-colors-orange-dark-orange-dark-500: #FF4405;
--color-_util-colors-orange-dark-orange-dark-600: #FF692E;
--color-_util-colors-orange-dark-orange-dark-700: #FF9C66;
--color-util-colors-orange-dark-orange-dark-50: #57130A;
--color-util-colors-orange-dark-orange-dark-100: #771A0D;
--color-util-colors-orange-dark-orange-dark-200: #97180C;
--color-util-colors-orange-dark-orange-dark-300: #BC1B06;
--color-util-colors-orange-dark-orange-dark-400: #E62E05;
--color-util-colors-orange-dark-orange-dark-500: #FF4405;
--color-util-colors-orange-dark-orange-dark-600: #FF692E;
--color-util-colors-orange-dark-orange-dark-700: #FF9C66;
--color-_util-colors-orange-orange-50: #511C10;
--color-_util-colors-orange-orange-100: #772917;
--color-_util-colors-orange-orange-200: #932F19;
--color-_util-colors-orange-orange-300: #B93815;
--color-_util-colors-orange-orange-400: #E04F16;
--color-_util-colors-orange-orange-500: #EF6820;
--color-_util-colors-orange-orange-600: #F38744;
--color-_util-colors-orange-orange-700: #F7B27A;
--color-util-colors-orange-orange-50: #511C10;
--color-util-colors-orange-orange-100: #772917;
--color-util-colors-orange-orange-200: #932F19;
--color-util-colors-orange-orange-300: #B93815;
--color-util-colors-orange-orange-400: #E04F16;
--color-util-colors-orange-orange-500: #EF6820;
--color-util-colors-orange-orange-600: #F38744;
--color-util-colors-orange-orange-700: #F7B27A;
--color-_util-colors-pink-pink-50: #4E0D30;
--color-_util-colors-pink-pink-100: #851651;
--color-_util-colors-pink-pink-200: #9E165F;
--color-_util-colors-pink-pink-300: #C11574;
--color-_util-colors-pink-pink-400: #DD2590;
--color-_util-colors-pink-pink-500: #EE46BC;
--color-_util-colors-pink-pink-600: #F670C7;
--color-_util-colors-pink-pink-700: #FAA7E0;
--color-util-colors-pink-pink-50: #4E0D30;
--color-util-colors-pink-pink-100: #851651;
--color-util-colors-pink-pink-200: #9E165F;
--color-util-colors-pink-pink-300: #C11574;
--color-util-colors-pink-pink-400: #DD2590;
--color-util-colors-pink-pink-500: #EE46BC;
--color-util-colors-pink-pink-600: #F670C7;
--color-util-colors-pink-pink-700: #FAA7E0;
--color-_util-colors-fuchsia-fuchsia-50: #47104C;
--color-_util-colors-fuchsia-fuchsia-100: #6F1877;
--color-_util-colors-fuchsia-fuchsia-200: #821890;
--color-_util-colors-fuchsia-fuchsia-300: #9F1AB1;
--color-_util-colors-fuchsia-fuchsia-400: #BA24D5;
--color-_util-colors-fuchsia-fuchsia-500: #D444F1;
--color-_util-colors-fuchsia-fuchsia-600: #E478FA;
--color-_util-colors-fuchsia-fuchsia-700: #EEAAFD;
--color-util-colors-fuchsia-fuchsia-50: #47104C;
--color-util-colors-fuchsia-fuchsia-100: #6F1877;
--color-util-colors-fuchsia-fuchsia-200: #821890;
--color-util-colors-fuchsia-fuchsia-300: #9F1AB1;
--color-util-colors-fuchsia-fuchsia-400: #BA24D5;
--color-util-colors-fuchsia-fuchsia-500: #D444F1;
--color-util-colors-fuchsia-fuchsia-600: #E478FA;
--color-util-colors-fuchsia-fuchsia-700: #EEAAFD;
--color-_util-colors-purple-purple-50: #27115F;
--color-_util-colors-purple-purple-100: #3E1C96;
--color-_util-colors-purple-purple-200: #4A1FB8;
--color-_util-colors-purple-purple-300: #5925DC;
--color-_util-colors-purple-purple-400: #6938EF;
--color-_util-colors-purple-purple-500: #7A5AF8;
--color-_util-colors-purple-purple-600: #9B8AFB;
--color-_util-colors-purple-purple-700: #BDB4FE;
--color-util-colors-purple-purple-50: #27115F;
--color-util-colors-purple-purple-100: #3E1C96;
--color-util-colors-purple-purple-200: #4A1FB8;
--color-util-colors-purple-purple-300: #5925DC;
--color-util-colors-purple-purple-400: #6938EF;
--color-util-colors-purple-purple-500: #7A5AF8;
--color-util-colors-purple-purple-600: #9B8AFB;
--color-util-colors-purple-purple-700: #BDB4FE;
--color-_util-colors-indigo-indigo-50: #1F235B;
--color-_util-colors-indigo-indigo-100: #2D3282;
--color-_util-colors-indigo-indigo-200: #2D31A6;
--color-_util-colors-indigo-indigo-300: #3538CD;
--color-_util-colors-indigo-indigo-400: #444CE7;
--color-_util-colors-indigo-indigo-500: #6172F3;
--color-_util-colors-indigo-indigo-600: #8098F9;
--color-_util-colors-indigo-indigo-700: #A4BCFD;
--color-util-colors-indigo-indigo-50: #1F235B;
--color-util-colors-indigo-indigo-100: #2D3282;
--color-util-colors-indigo-indigo-200: #2D31A6;
--color-util-colors-indigo-indigo-300: #3538CD;
--color-util-colors-indigo-indigo-400: #444CE7;
--color-util-colors-indigo-indigo-500: #6172F3;
--color-util-colors-indigo-indigo-600: #8098F9;
--color-util-colors-indigo-indigo-700: #A4BCFD;
--color-_util-colors-blue-blue-50: #102A56;
--color-_util-colors-blue-blue-100: #194185;
--color-_util-colors-blue-blue-200: #1849A9;
--color-_util-colors-blue-blue-300: #175CD3;
--color-_util-colors-blue-blue-400: #1570EF;
--color-_util-colors-blue-blue-500: #2E90FA;
--color-_util-colors-blue-blue-600: #53B1FD;
--color-_util-colors-blue-blue-700: #84CAFF;
--color-util-colors-blue-blue-50: #102A56;
--color-util-colors-blue-blue-100: #194185;
--color-util-colors-blue-blue-200: #1849A9;
--color-util-colors-blue-blue-300: #175CD3;
--color-util-colors-blue-blue-400: #1570EF;
--color-util-colors-blue-blue-500: #2E90FA;
--color-util-colors-blue-blue-600: #53B1FD;
--color-util-colors-blue-blue-700: #84CAFF;
--color-_util-colors-blue-light-blue-light-50: #062C41;
--color-_util-colors-blue-light-blue-light-100: #0B4A6F;
--color-_util-colors-blue-light-blue-light-200: #065986;
--color-_util-colors-blue-light-blue-light-300: #026AA2;
--color-_util-colors-blue-light-blue-light-400: #0086C9;
--color-_util-colors-blue-light-blue-light-500: #0BA5EC;
--color-_util-colors-blue-light-blue-light-600: #36BFFA;
--color-_util-colors-blue-light-blue-light-700: #7CD4FD;
--color-util-colors-blue-light-blue-light-50: #062C41;
--color-util-colors-blue-light-blue-light-100: #0B4A6F;
--color-util-colors-blue-light-blue-light-200: #065986;
--color-util-colors-blue-light-blue-light-300: #026AA2;
--color-util-colors-blue-light-blue-light-400: #0086C9;
--color-util-colors-blue-light-blue-light-500: #0BA5EC;
--color-util-colors-blue-light-blue-light-600: #36BFFA;
--color-util-colors-blue-light-blue-light-700: #7CD4FD;
--color-_util-colors-gray-blue-gray-blue-50: #0D0F1C;
--color-_util-colors-gray-blue-gray-blue-100: #101323;
--color-_util-colors-gray-blue-gray-blue-200: #293056;
--color-_util-colors-gray-blue-gray-blue-300: #363F72;
--color-_util-colors-gray-blue-gray-blue-400: #3E4784;
--color-_util-colors-gray-blue-gray-blue-500: #4E5BA6;
--color-_util-colors-gray-blue-gray-blue-600: #717BBC;
--color-_util-colors-gray-blue-gray-blue-700: #B3B8DB;
--color-util-colors-gray-blue-gray-blue-50: #0D0F1C;
--color-util-colors-gray-blue-gray-blue-100: #101323;
--color-util-colors-gray-blue-gray-blue-200: #293056;
--color-util-colors-gray-blue-gray-blue-300: #363F72;
--color-util-colors-gray-blue-gray-blue-400: #3E4784;
--color-util-colors-gray-blue-gray-blue-500: #4E5BA6;
--color-util-colors-gray-blue-gray-blue-600: #717BBC;
--color-util-colors-gray-blue-gray-blue-700: #B3B8DB;
--color-_util-colors-blue-brand-blue-brand-50: #002066;
--color-_util-colors-blue-brand-blue-brand-100: #00329E;
--color-_util-colors-blue-brand-blue-brand-200: #003DC1;
--color-_util-colors-blue-brand-blue-brand-300: #004AEB;
--color-_util-colors-blue-brand-blue-brand-400: #155AEF;
--color-_util-colors-blue-brand-blue-brand-500: #296DFF;
--color-_util-colors-blue-brand-blue-brand-600: #5289FF;
--color-_util-colors-blue-brand-blue-brand-700: #84ABFF;
--color-util-colors-blue-brand-blue-brand-50: #002066;
--color-util-colors-blue-brand-blue-brand-100: #00329E;
--color-util-colors-blue-brand-blue-brand-200: #003DC1;
--color-util-colors-blue-brand-blue-brand-300: #004AEB;
--color-util-colors-blue-brand-blue-brand-400: #155AEF;
--color-util-colors-blue-brand-blue-brand-500: #296DFF;
--color-util-colors-blue-brand-blue-brand-600: #5289FF;
--color-util-colors-blue-brand-blue-brand-700: #84ABFF;
--color-_util-colors-red-red-50: #55160C;
--color-_util-colors-red-red-100: #7A271A;
--color-_util-colors-red-red-200: #912018;
--color-_util-colors-red-red-300: #B42318;
--color-_util-colors-red-red-400: #D92D20;
--color-_util-colors-red-red-500: #F04438;
--color-_util-colors-red-red-600: #F97066;
--color-_util-colors-red-red-700: #FDA29B;
--color-util-colors-red-red-50: #55160C;
--color-util-colors-red-red-100: #7A271A;
--color-util-colors-red-red-200: #912018;
--color-util-colors-red-red-300: #B42318;
--color-util-colors-red-red-400: #D92D20;
--color-util-colors-red-red-500: #F04438;
--color-util-colors-red-red-600: #F97066;
--color-util-colors-red-red-700: #FDA29B;
--color-_util-colors-green-green-50: #053321;
--color-_util-colors-green-green-100: #074D31;
--color-_util-colors-green-green-200: #085D3A;
--color-_util-colors-green-green-300: #067647;
--color-_util-colors-green-green-400: #079455;
--color-_util-colors-green-green-500: #17B26A;
--color-_util-colors-green-green-600: #47CD89;
--color-_util-colors-green-green-700: #75E0A7;
--color-util-colors-green-green-50: #053321;
--color-util-colors-green-green-100: #074D31;
--color-util-colors-green-green-200: #085D3A;
--color-util-colors-green-green-300: #067647;
--color-util-colors-green-green-400: #079455;
--color-util-colors-green-green-500: #17B26A;
--color-util-colors-green-green-600: #47CD89;
--color-util-colors-green-green-700: #75E0A7;
--color-_util-colors-warning-warning-50: #4E1D09;
--color-_util-colors-warning-warning-100: #7A2E0E;
--color-_util-colors-warning-warning-200: #93370D;
--color-_util-colors-warning-warning-300: #B54708;
--color-_util-colors-warning-warning-400: #DC6803;
--color-_util-colors-warning-warning-500: #F79009;
--color-_util-colors-warning-warning-600: #FDB022;
--color-_util-colors-warning-warning-700: #FEC84B;
--color-util-colors-warning-warning-50: #4E1D09;
--color-util-colors-warning-warning-100: #7A2E0E;
--color-util-colors-warning-warning-200: #93370D;
--color-util-colors-warning-warning-300: #B54708;
--color-util-colors-warning-warning-400: #DC6803;
--color-util-colors-warning-warning-500: #F79009;
--color-util-colors-warning-warning-600: #FDB022;
--color-util-colors-warning-warning-700: #FEC84B;
--color-_util-colors-yellow-yellow-50: #542C0D;
--color-_util-colors-yellow-yellow-100: #713B12;
--color-_util-colors-yellow-yellow-200: #854A0E;
--color-_util-colors-yellow-yellow-300: #A15C07;
--color-_util-colors-yellow-yellow-400: #CA8504;
--color-_util-colors-yellow-yellow-500: #EAAA08;
--color-_util-colors-yellow-yellow-600: #FAC515;
--color-_util-colors-yellow-yellow-700: #FDE272;
--color-util-colors-yellow-yellow-50: #542C0D;
--color-util-colors-yellow-yellow-100: #713B12;
--color-util-colors-yellow-yellow-200: #854A0E;
--color-util-colors-yellow-yellow-300: #A15C07;
--color-util-colors-yellow-yellow-400: #CA8504;
--color-util-colors-yellow-yellow-500: #EAAA08;
--color-util-colors-yellow-yellow-600: #FAC515;
--color-util-colors-yellow-yellow-700: #FDE272;
--color-_util-colors-teal-teal-50: #0A2926;
--color-_util-colors-teal-teal-100: #134E48;
--color-_util-colors-teal-teal-200: #125D56;
--color-_util-colors-teal-teal-300: #107569;
--color-_util-colors-teal-teal-400: #0E9384;
--color-_util-colors-teal-teal-500: #15B79E;
--color-_util-colors-teal-teal-600: #2ED3B7;
--color-_util-colors-teal-teal-700: #5FE9D0;
--color-util-colors-teal-teal-50: #0A2926;
--color-util-colors-teal-teal-100: #134E48;
--color-util-colors-teal-teal-200: #125D56;
--color-util-colors-teal-teal-300: #107569;
--color-util-colors-teal-teal-400: #0E9384;
--color-util-colors-teal-teal-500: #15B79E;
--color-util-colors-teal-teal-600: #2ED3B7;
--color-util-colors-teal-teal-700: #5FE9D0;
--color-_util-colors-cyan-cyan-50: #0D2D3A;
--color-_util-colors-cyan-cyan-100: #164C63;
--color-_util-colors-cyan-cyan-200: #155B75;
--color-_util-colors-cyan-cyan-300: #0E7090;
--color-_util-colors-cyan-cyan-400: #088AB2;
--color-_util-colors-cyan-cyan-500: #06AED4;
--color-_util-colors-cyan-cyan-600: #22CCEE;
--color-_util-colors-cyan-cyan-700: #67E3F9;
--color-util-colors-cyan-cyan-50: #0D2D3A;
--color-util-colors-cyan-cyan-100: #164C63;
--color-util-colors-cyan-cyan-200: #155B75;
--color-util-colors-cyan-cyan-300: #0E7090;
--color-util-colors-cyan-cyan-400: #088AB2;
--color-util-colors-cyan-cyan-500: #06AED4;
--color-util-colors-cyan-cyan-600: #22CCEE;
--color-util-colors-cyan-cyan-700: #67E3F9;
--color-_util-colors-violet-violet-50: #2E125E;
--color-_util-colors-violet-violet-100: #491C96;
--color-_util-colors-violet-violet-200: #5720B7;
--color-_util-colors-violet-violet-300: #6927DA;
--color-_util-colors-violet-violet-400: #7839EE;
--color-_util-colors-violet-violet-500: #875BF7;
--color-_util-colors-violet-violet-600: #A48AFB;
--color-_util-colors-violet-violet-700: #C3B5FD;
--color-util-colors-violet-violet-50: #2E125E;
--color-util-colors-violet-violet-100: #491C96;
--color-util-colors-violet-violet-200: #5720B7;
--color-util-colors-violet-violet-300: #6927DA;
--color-util-colors-violet-violet-400: #7839EE;
--color-util-colors-violet-violet-500: #875BF7;
--color-util-colors-violet-violet-600: #A48AFB;
--color-util-colors-violet-violet-700: #C3B5FD;
--color-_util-colors-gray-gray-50: #0C111C;
--color-_util-colors-gray-gray-100: #101828;
--color-_util-colors-gray-gray-200: #18222F;
--color-_util-colors-gray-gray-300: #354052;
--color-_util-colors-gray-gray-400: #495464;
--color-_util-colors-gray-gray-500: #676F83;
--color-_util-colors-gray-gray-600: #98A2B2;
--color-_util-colors-gray-gray-700: #D0D5DC;
--color-util-colors-gray-gray-50: #0C111C;
--color-util-colors-gray-gray-100: #101828;
--color-util-colors-gray-gray-200: #18222F;
--color-util-colors-gray-gray-300: #354052;
--color-util-colors-gray-gray-400: #495464;
--color-util-colors-gray-gray-500: #676F83;
--color-util-colors-gray-gray-600: #98A2B2;
--color-util-colors-gray-gray-700: #D0D5DC;
--color-third-party-LangChain: #FFFFFF;
--color-third-party-Langfuse: #FFFFFF;

View File

@ -174,7 +174,7 @@ html[data-theme="light"] {
--color-components-badge-status-light-success-halo: #17B26A40;
--color-components-badge-status-light-border-outer: #FFFFFF;
--color-components-badge-status-light-_high-light: #FFFFFF4D;
--color-components-badge-status-light-high-light: #FFFFFF4D;
--color-components-badge-status-light-warning-bg: #FDB022;
--color-components-badge-status-light-warning-border-inner: #F79009;
--color-components-badge-status-light-warning-halo: #F7900940;
@ -249,7 +249,7 @@ html[data-theme="light"] {
--color-text-accent-secondary: #296DFF;
--color-text-accent-light-mode-only: #155AEF;
--color-text-text-selected: #155AEF24;
--color-text-_secondary-on-surface: #FFFFFFE5;
--color-text-secondary-on-surface: #FFFFFFE5;
--color-text-logo-text: #18222F;
--color-text-empty-state-icon: #D0D5DC;
@ -298,12 +298,12 @@ html[data-theme="light"] {
--color-shadow-shadow-2: #09090B0A;
--color-shadow-shadow-10: #09090B0D;
--color-workflow-block-_border: #18181B14;
--color-workflow-block-_panel-bg: #FFFFFF;
--color-workflow-block-border: #18181B14;
--color-workflow-block-panel-bg: #FFFFFF;
--color-workflow-block-border: #FFFFFF;
--color-workflow-block-parma-bg: #F2F4F7;
--color-workflow-block-_nav-bg: #FFFFFF;
--color-workflow-block-_nav-border-right: #FFFFFF;
--color-workflow-block-nav-bg: #FFFFFF;
--color-workflow-block-nav-border-right: #FFFFFF;
--color-workflow-block-bg: #FCFCFD;
--color-workflow-canvas-workflow-dot-color: #8585AD26;
@ -395,167 +395,167 @@ html[data-theme="light"] {
--color-effects-highlight-lightmode-off: #FFFFFF00;
--color-effects-image-frame: #FFFFFF;
--color-_util-colors-orange-dark-orange-dark-50: #FFF4ED;
--color-_util-colors-orange-dark-orange-dark-100: #FFE6D5;
--color-_util-colors-orange-dark-orange-dark-200: #FFD6AE;
--color-_util-colors-orange-dark-orange-dark-300: #FF9C66;
--color-_util-colors-orange-dark-orange-dark-400: #FF692E;
--color-_util-colors-orange-dark-orange-dark-500: #FF4405;
--color-_util-colors-orange-dark-orange-dark-600: #E62E05;
--color-_util-colors-orange-dark-orange-dark-700: #BC1B06;
--color-util-colors-orange-dark-orange-dark-50: #FFF4ED;
--color-util-colors-orange-dark-orange-dark-100: #FFE6D5;
--color-util-colors-orange-dark-orange-dark-200: #FFD6AE;
--color-util-colors-orange-dark-orange-dark-300: #FF9C66;
--color-util-colors-orange-dark-orange-dark-400: #FF692E;
--color-util-colors-orange-dark-orange-dark-500: #FF4405;
--color-util-colors-orange-dark-orange-dark-600: #E62E05;
--color-util-colors-orange-dark-orange-dark-700: #BC1B06;
--color-_util-colors-orange-orange-50: #FEF6EE;
--color-_util-colors-orange-orange-100: #FDEAD7;
--color-_util-colors-orange-orange-200: #F9DBAF;
--color-_util-colors-orange-orange-300: #F7B27A;
--color-_util-colors-orange-orange-400: #F38744;
--color-_util-colors-orange-orange-500: #EF6820;
--color-_util-colors-orange-orange-600: #E04F16;
--color-_util-colors-orange-orange-700: #B93815;
--color-util-colors-orange-orange-50: #FEF6EE;
--color-util-colors-orange-orange-100: #FDEAD7;
--color-util-colors-orange-orange-200: #F9DBAF;
--color-util-colors-orange-orange-300: #F7B27A;
--color-util-colors-orange-orange-400: #F38744;
--color-util-colors-orange-orange-500: #EF6820;
--color-util-colors-orange-orange-600: #E04F16;
--color-util-colors-orange-orange-700: #B93815;
--color-_util-colors-pink-pink-50: #FDF2FA;
--color-_util-colors-pink-pink-100: #FCE7F6;
--color-_util-colors-pink-pink-200: #FCCEEE;
--color-_util-colors-pink-pink-300: #FAA7E0;
--color-_util-colors-pink-pink-400: #F670C7;
--color-_util-colors-pink-pink-500: #EE46BC;
--color-_util-colors-pink-pink-600: #DD2590;
--color-_util-colors-pink-pink-700: #C11574;
--color-util-colors-pink-pink-50: #FDF2FA;
--color-util-colors-pink-pink-100: #FCE7F6;
--color-util-colors-pink-pink-200: #FCCEEE;
--color-util-colors-pink-pink-300: #FAA7E0;
--color-util-colors-pink-pink-400: #F670C7;
--color-util-colors-pink-pink-500: #EE46BC;
--color-util-colors-pink-pink-600: #DD2590;
--color-util-colors-pink-pink-700: #C11574;
--color-_util-colors-fuchsia-fuchsia-50: #FDF4FF;
--color-_util-colors-fuchsia-fuchsia-100: #FBE8FF;
--color-_util-colors-fuchsia-fuchsia-200: #F6D0FE;
--color-_util-colors-fuchsia-fuchsia-300: #EEAAFD;
--color-_util-colors-fuchsia-fuchsia-400: #E478FA;
--color-_util-colors-fuchsia-fuchsia-500: #D444F1;
--color-_util-colors-fuchsia-fuchsia-600: #BA24D5;
--color-_util-colors-fuchsia-fuchsia-700: #9F1AB1;
--color-util-colors-fuchsia-fuchsia-50: #FDF4FF;
--color-util-colors-fuchsia-fuchsia-100: #FBE8FF;
--color-util-colors-fuchsia-fuchsia-200: #F6D0FE;
--color-util-colors-fuchsia-fuchsia-300: #EEAAFD;
--color-util-colors-fuchsia-fuchsia-400: #E478FA;
--color-util-colors-fuchsia-fuchsia-500: #D444F1;
--color-util-colors-fuchsia-fuchsia-600: #BA24D5;
--color-util-colors-fuchsia-fuchsia-700: #9F1AB1;
--color-_util-colors-purple-purple-50: #F4F3FF;
--color-_util-colors-purple-purple-100: #EBE9FE;
--color-_util-colors-purple-purple-200: #D9D6FE;
--color-_util-colors-purple-purple-300: #BDB4FE;
--color-_util-colors-purple-purple-400: #9B8AFB;
--color-_util-colors-purple-purple-500: #7A5AF8;
--color-_util-colors-purple-purple-600: #6938EF;
--color-_util-colors-purple-purple-700: #5925DC;
--color-util-colors-purple-purple-50: #F4F3FF;
--color-util-colors-purple-purple-100: #EBE9FE;
--color-util-colors-purple-purple-200: #D9D6FE;
--color-util-colors-purple-purple-300: #BDB4FE;
--color-util-colors-purple-purple-400: #9B8AFB;
--color-util-colors-purple-purple-500: #7A5AF8;
--color-util-colors-purple-purple-600: #6938EF;
--color-util-colors-purple-purple-700: #5925DC;
--color-_util-colors-indigo-indigo-50: #EEF4FF;
--color-_util-colors-indigo-indigo-100: #E0EAFF;
--color-_util-colors-indigo-indigo-200: #C7D7FE;
--color-_util-colors-indigo-indigo-300: #A4BCFD;
--color-_util-colors-indigo-indigo-400: #8098F9;
--color-_util-colors-indigo-indigo-500: #6172F3;
--color-_util-colors-indigo-indigo-600: #444CE7;
--color-_util-colors-indigo-indigo-700: #3538CD;
--color-util-colors-indigo-indigo-50: #EEF4FF;
--color-util-colors-indigo-indigo-100: #E0EAFF;
--color-util-colors-indigo-indigo-200: #C7D7FE;
--color-util-colors-indigo-indigo-300: #A4BCFD;
--color-util-colors-indigo-indigo-400: #8098F9;
--color-util-colors-indigo-indigo-500: #6172F3;
--color-util-colors-indigo-indigo-600: #444CE7;
--color-util-colors-indigo-indigo-700: #3538CD;
--color-_util-colors-blue-blue-50: #EFF8FF;
--color-_util-colors-blue-blue-100: #D1E9FF;
--color-_util-colors-blue-blue-200: #B2DDFF;
--color-_util-colors-blue-blue-300: #84CAFF;
--color-_util-colors-blue-blue-400: #53B1FD;
--color-_util-colors-blue-blue-500: #2E90FA;
--color-_util-colors-blue-blue-600: #1570EF;
--color-_util-colors-blue-blue-700: #175CD3;
--color-util-colors-blue-blue-50: #EFF8FF;
--color-util-colors-blue-blue-100: #D1E9FF;
--color-util-colors-blue-blue-200: #B2DDFF;
--color-util-colors-blue-blue-300: #84CAFF;
--color-util-colors-blue-blue-400: #53B1FD;
--color-util-colors-blue-blue-500: #2E90FA;
--color-util-colors-blue-blue-600: #1570EF;
--color-util-colors-blue-blue-700: #175CD3;
--color-_util-colors-blue-light-blue-light-50: #F0F9FF;
--color-_util-colors-blue-light-blue-light-100: #E0F2FE;
--color-_util-colors-blue-light-blue-light-200: #B9E6FE;
--color-_util-colors-blue-light-blue-light-300: #7CD4FD;
--color-_util-colors-blue-light-blue-light-400: #36BFFA;
--color-_util-colors-blue-light-blue-light-500: #0BA5EC;
--color-_util-colors-blue-light-blue-light-600: #0086C9;
--color-_util-colors-blue-light-blue-light-700: #026AA2;
--color-util-colors-blue-light-blue-light-50: #F0F9FF;
--color-util-colors-blue-light-blue-light-100: #E0F2FE;
--color-util-colors-blue-light-blue-light-200: #B9E6FE;
--color-util-colors-blue-light-blue-light-300: #7CD4FD;
--color-util-colors-blue-light-blue-light-400: #36BFFA;
--color-util-colors-blue-light-blue-light-500: #0BA5EC;
--color-util-colors-blue-light-blue-light-600: #0086C9;
--color-util-colors-blue-light-blue-light-700: #026AA2;
--color-_util-colors-gray-blue-gray-blue-50: #F8F9FC;
--color-_util-colors-gray-blue-gray-blue-100: #EAECF5;
--color-_util-colors-gray-blue-gray-blue-200: #D5D9EB;
--color-_util-colors-gray-blue-gray-blue-300: #B3B8DB;
--color-_util-colors-gray-blue-gray-blue-400: #717BBC;
--color-_util-colors-gray-blue-gray-blue-500: #4E5BA6;
--color-_util-colors-gray-blue-gray-blue-600: #3E4784;
--color-_util-colors-gray-blue-gray-blue-700: #363F72;
--color-util-colors-gray-blue-gray-blue-50: #F8F9FC;
--color-util-colors-gray-blue-gray-blue-100: #EAECF5;
--color-util-colors-gray-blue-gray-blue-200: #D5D9EB;
--color-util-colors-gray-blue-gray-blue-300: #B3B8DB;
--color-util-colors-gray-blue-gray-blue-400: #717BBC;
--color-util-colors-gray-blue-gray-blue-500: #4E5BA6;
--color-util-colors-gray-blue-gray-blue-600: #3E4784;
--color-util-colors-gray-blue-gray-blue-700: #363F72;
--color-_util-colors-blue-brand-blue-brand-50: #F5F7FF;
--color-_util-colors-blue-brand-blue-brand-100: #D1E0FF;
--color-_util-colors-blue-brand-blue-brand-200: #B2CAFF;
--color-_util-colors-blue-brand-blue-brand-300: #84ABFF;
--color-_util-colors-blue-brand-blue-brand-400: #5289FF;
--color-_util-colors-blue-brand-blue-brand-500: #296DFF;
--color-_util-colors-blue-brand-blue-brand-600: #155AEF;
--color-_util-colors-blue-brand-blue-brand-700: #004AEB;
--color-util-colors-blue-brand-blue-brand-50: #F5F7FF;
--color-util-colors-blue-brand-blue-brand-100: #D1E0FF;
--color-util-colors-blue-brand-blue-brand-200: #B2CAFF;
--color-util-colors-blue-brand-blue-brand-300: #84ABFF;
--color-util-colors-blue-brand-blue-brand-400: #5289FF;
--color-util-colors-blue-brand-blue-brand-500: #296DFF;
--color-util-colors-blue-brand-blue-brand-600: #155AEF;
--color-util-colors-blue-brand-blue-brand-700: #004AEB;
--color-_util-colors-red-red-50: #FEF3F2;
--color-_util-colors-red-red-100: #FEE4E2;
--color-_util-colors-red-red-200: #FECDCA;
--color-_util-colors-red-red-300: #FDA29B;
--color-_util-colors-red-red-400: #F97066;
--color-_util-colors-red-red-500: #F04438;
--color-_util-colors-red-red-600: #D92D20;
--color-_util-colors-red-red-700: #B42318;
--color-util-colors-red-red-50: #FEF3F2;
--color-util-colors-red-red-100: #FEE4E2;
--color-util-colors-red-red-200: #FECDCA;
--color-util-colors-red-red-300: #FDA29B;
--color-util-colors-red-red-400: #F97066;
--color-util-colors-red-red-500: #F04438;
--color-util-colors-red-red-600: #D92D20;
--color-util-colors-red-red-700: #B42318;
--color-_util-colors-green-green-50: #ECFDF3;
--color-_util-colors-green-green-100: #DCFAE6;
--color-_util-colors-green-green-200: #ABEFC6;
--color-_util-colors-green-green-300: #75E0A7;
--color-_util-colors-green-green-400: #47CD89;
--color-_util-colors-green-green-500: #17B26A;
--color-_util-colors-green-green-600: #079455;
--color-_util-colors-green-green-700: #067647;
--color-util-colors-green-green-50: #ECFDF3;
--color-util-colors-green-green-100: #DCFAE6;
--color-util-colors-green-green-200: #ABEFC6;
--color-util-colors-green-green-300: #75E0A7;
--color-util-colors-green-green-400: #47CD89;
--color-util-colors-green-green-500: #17B26A;
--color-util-colors-green-green-600: #079455;
--color-util-colors-green-green-700: #067647;
--color-_util-colors-warning-warning-50: #FFFAEB;
--color-_util-colors-warning-warning-100: #FEF0C7;
--color-_util-colors-warning-warning-200: #FEDF89;
--color-_util-colors-warning-warning-300: #FEC84B;
--color-_util-colors-warning-warning-400: #FDB022;
--color-_util-colors-warning-warning-500: #F79009;
--color-_util-colors-warning-warning-600: #DC6803;
--color-_util-colors-warning-warning-700: #B54708;
--color-util-colors-warning-warning-50: #FFFAEB;
--color-util-colors-warning-warning-100: #FEF0C7;
--color-util-colors-warning-warning-200: #FEDF89;
--color-util-colors-warning-warning-300: #FEC84B;
--color-util-colors-warning-warning-400: #FDB022;
--color-util-colors-warning-warning-500: #F79009;
--color-util-colors-warning-warning-600: #DC6803;
--color-util-colors-warning-warning-700: #B54708;
--color-_util-colors-yellow-yellow-50: #FEFBE8;
--color-_util-colors-yellow-yellow-100: #FEF7C3;
--color-_util-colors-yellow-yellow-200: #FEEE95;
--color-_util-colors-yellow-yellow-300: #FDE272;
--color-_util-colors-yellow-yellow-400: #FAC515;
--color-_util-colors-yellow-yellow-500: #EAAA08;
--color-_util-colors-yellow-yellow-600: #CA8504;
--color-_util-colors-yellow-yellow-700: #A15C07;
--color-util-colors-yellow-yellow-50: #FEFBE8;
--color-util-colors-yellow-yellow-100: #FEF7C3;
--color-util-colors-yellow-yellow-200: #FEEE95;
--color-util-colors-yellow-yellow-300: #FDE272;
--color-util-colors-yellow-yellow-400: #FAC515;
--color-util-colors-yellow-yellow-500: #EAAA08;
--color-util-colors-yellow-yellow-600: #CA8504;
--color-util-colors-yellow-yellow-700: #A15C07;
--color-_util-colors-teal-teal-50: #F0FDF9;
--color-_util-colors-teal-teal-100: #CCFBEF;
--color-_util-colors-teal-teal-200: #99F6E0;
--color-_util-colors-teal-teal-300: #5FE9D0;
--color-_util-colors-teal-teal-400: #2ED3B7;
--color-_util-colors-teal-teal-500: #15B79E;
--color-_util-colors-teal-teal-600: #0E9384;
--color-_util-colors-teal-teal-700: #107569;
--color-util-colors-teal-teal-50: #F0FDF9;
--color-util-colors-teal-teal-100: #CCFBEF;
--color-util-colors-teal-teal-200: #99F6E0;
--color-util-colors-teal-teal-300: #5FE9D0;
--color-util-colors-teal-teal-400: #2ED3B7;
--color-util-colors-teal-teal-500: #15B79E;
--color-util-colors-teal-teal-600: #0E9384;
--color-util-colors-teal-teal-700: #107569;
--color-_util-colors-cyan-cyan-50: #ECFDFF;
--color-_util-colors-cyan-cyan-100: #CFF9FE;
--color-_util-colors-cyan-cyan-200: #A5F0FC;
--color-_util-colors-cyan-cyan-300: #67E3F9;
--color-_util-colors-cyan-cyan-400: #22CCEE;
--color-_util-colors-cyan-cyan-500: #06AED4;
--color-_util-colors-cyan-cyan-600: #088AB2;
--color-_util-colors-cyan-cyan-700: #0E7090;
--color-util-colors-cyan-cyan-50: #ECFDFF;
--color-util-colors-cyan-cyan-100: #CFF9FE;
--color-util-colors-cyan-cyan-200: #A5F0FC;
--color-util-colors-cyan-cyan-300: #67E3F9;
--color-util-colors-cyan-cyan-400: #22CCEE;
--color-util-colors-cyan-cyan-500: #06AED4;
--color-util-colors-cyan-cyan-600: #088AB2;
--color-util-colors-cyan-cyan-700: #0E7090;
--color-_util-colors-violet-violet-50: #F5F3FF;
--color-_util-colors-violet-violet-100: #ECE9FE;
--color-_util-colors-violet-violet-200: #DDD6FE;
--color-_util-colors-violet-violet-300: #C3B5FD;
--color-_util-colors-violet-violet-400: #A48AFB;
--color-_util-colors-violet-violet-500: #875BF7;
--color-_util-colors-violet-violet-600: #7839EE;
--color-_util-colors-violet-violet-700: #6927DA;
--color-util-colors-violet-violet-50: #F5F3FF;
--color-util-colors-violet-violet-100: #ECE9FE;
--color-util-colors-violet-violet-200: #DDD6FE;
--color-util-colors-violet-violet-300: #C3B5FD;
--color-util-colors-violet-violet-400: #A48AFB;
--color-util-colors-violet-violet-500: #875BF7;
--color-util-colors-violet-violet-600: #7839EE;
--color-util-colors-violet-violet-700: #6927DA;
--color-_util-colors-gray-gray-50: #F9FAFB;
--color-_util-colors-gray-gray-100: #F2F4F7;
--color-_util-colors-gray-gray-200: #E9EBF0;
--color-_util-colors-gray-gray-300: #D0D5DC;
--color-_util-colors-gray-gray-400: #98A2B2;
--color-_util-colors-gray-gray-500: #676F83;
--color-_util-colors-gray-gray-600: #495464;
--color-_util-colors-gray-gray-700: #354052;
--color-util-colors-gray-gray-50: #F9FAFB;
--color-util-colors-gray-gray-100: #F2F4F7;
--color-util-colors-gray-gray-200: #E9EBF0;
--color-util-colors-gray-gray-300: #D0D5DC;
--color-util-colors-gray-gray-400: #98A2B2;
--color-util-colors-gray-gray-500: #676F83;
--color-util-colors-gray-gray-600: #495464;
--color-util-colors-gray-gray-700: #354052;
--color-third-party-LangChain: #1C3C3C;
--color-third-party-Langfuse: #000000;

View File

@ -174,7 +174,7 @@ const vars = {
'components-badge-status-light-success-halo': 'var(--color-components-badge-status-light-success-halo)',
'components-badge-status-light-border-outer': 'var(--color-components-badge-status-light-border-outer)',
'components-badge-status-light-_high-light': 'var(--color-components-badge-status-light-_high-light)',
'components-badge-status-light-high-light': 'var(--color-components-badge-status-light-high-light)',
'components-badge-status-light-warning-bg': 'var(--color-components-badge-status-light-warning-bg)',
'components-badge-status-light-warning-border-inner': 'var(--color-components-badge-status-light-warning-border-inner)',
'components-badge-status-light-warning-halo': 'var(--color-components-badge-status-light-warning-halo)',
@ -249,7 +249,7 @@ const vars = {
'text-accent-secondary': 'var(--color-text-accent-secondary)',
'text-accent-light-mode-only': 'var(--color-text-accent-light-mode-only)',
'text-text-selected': 'var(--color-text-text-selected)',
'text-_secondary-on-surface': 'var(--color-text-_secondary-on-surface)',
'text-secondary-on-surface': 'var(--color-text-secondary-on-surface)',
'text-logo-text': 'var(--color-text-logo-text)',
'text-empty-state-icon': 'var(--color-text-empty-state-icon)',
@ -298,12 +298,11 @@ const vars = {
'shadow-shadow-2': 'var(--color-shadow-shadow-2)',
'shadow-shadow-10': 'var(--color-shadow-shadow-10)',
'workflow-block-_border': 'var(--color-workflow-block-_border)',
'workflow-block-_panel-bg': 'var(--color-workflow-block-_panel-bg)',
'workflow-block-border': 'var(--color-workflow-block-border)',
'workflow-block-panel-bg': 'var(--color-workflow-block-panel-bg)',
'workflow-block-parma-bg': 'var(--color-workflow-block-parma-bg)',
'workflow-block-_nav-bg': 'var(--color-workflow-block-_nav-bg)',
'workflow-block-_nav-border-right': 'var(--color-workflow-block-_nav-border-right)',
'workflow-block-nav-bg': 'var(--color-workflow-block-nav-bg)',
'workflow-block-nav-border-right': 'var(--color-workflow-block-nav-border-right)',
'workflow-block-bg': 'var(--color-workflow-block-bg)',
'workflow-canvas-workflow-dot-color': 'var(--color-workflow-canvas-workflow-dot-color)',
@ -395,167 +394,167 @@ const vars = {
'effects-highlight-lightmode-off': 'var(--color-effects-highlight-lightmode-off)',
'effects-image-frame': 'var(--color-effects-image-frame)',
'_util-colors-orange-dark-orange-dark-50': 'var(--color-_util-colors-orange-dark-orange-dark-50)',
'_util-colors-orange-dark-orange-dark-100': 'var(--color-_util-colors-orange-dark-orange-dark-100)',
'_util-colors-orange-dark-orange-dark-200': 'var(--color-_util-colors-orange-dark-orange-dark-200)',
'_util-colors-orange-dark-orange-dark-300': 'var(--color-_util-colors-orange-dark-orange-dark-300)',
'_util-colors-orange-dark-orange-dark-400': 'var(--color-_util-colors-orange-dark-orange-dark-400)',
'_util-colors-orange-dark-orange-dark-500': 'var(--color-_util-colors-orange-dark-orange-dark-500)',
'_util-colors-orange-dark-orange-dark-600': 'var(--color-_util-colors-orange-dark-orange-dark-600)',
'_util-colors-orange-dark-orange-dark-700': 'var(--color-_util-colors-orange-dark-orange-dark-700)',
'util-colors-orange-dark-orange-dark-50': 'var(--color-util-colors-orange-dark-orange-dark-50)',
'util-colors-orange-dark-orange-dark-100': 'var(--color-util-colors-orange-dark-orange-dark-100)',
'util-colors-orange-dark-orange-dark-200': 'var(--color-util-colors-orange-dark-orange-dark-200)',
'util-colors-orange-dark-orange-dark-300': 'var(--color-util-colors-orange-dark-orange-dark-300)',
'util-colors-orange-dark-orange-dark-400': 'var(--color-util-colors-orange-dark-orange-dark-400)',
'util-colors-orange-dark-orange-dark-500': 'var(--color-util-colors-orange-dark-orange-dark-500)',
'util-colors-orange-dark-orange-dark-600': 'var(--color-util-colors-orange-dark-orange-dark-600)',
'util-colors-orange-dark-orange-dark-700': 'var(--color-util-colors-orange-dark-orange-dark-700)',
'_util-colors-orange-orange-50': 'var(--color-_util-colors-orange-orange-50)',
'_util-colors-orange-orange-100': 'var(--color-_util-colors-orange-orange-100)',
'_util-colors-orange-orange-200': 'var(--color-_util-colors-orange-orange-200)',
'_util-colors-orange-orange-300': 'var(--color-_util-colors-orange-orange-300)',
'_util-colors-orange-orange-400': 'var(--color-_util-colors-orange-orange-400)',
'_util-colors-orange-orange-500': 'var(--color-_util-colors-orange-orange-500)',
'_util-colors-orange-orange-600': 'var(--color-_util-colors-orange-orange-600)',
'_util-colors-orange-orange-700': 'var(--color-_util-colors-orange-orange-700)',
'util-colors-orange-orange-50': 'var(--color-util-colors-orange-orange-50)',
'util-colors-orange-orange-100': 'var(--color-util-colors-orange-orange-100)',
'util-colors-orange-orange-200': 'var(--color-util-colors-orange-orange-200)',
'util-colors-orange-orange-300': 'var(--color-util-colors-orange-orange-300)',
'util-colors-orange-orange-400': 'var(--color-util-colors-orange-orange-400)',
'util-colors-orange-orange-500': 'var(--color-util-colors-orange-orange-500)',
'util-colors-orange-orange-600': 'var(--color-util-colors-orange-orange-600)',
'util-colors-orange-orange-700': 'var(--color-util-colors-orange-orange-700)',
'_util-colors-pink-pink-50': 'var(--color-_util-colors-pink-pink-50)',
'_util-colors-pink-pink-100': 'var(--color-_util-colors-pink-pink-100)',
'_util-colors-pink-pink-200': 'var(--color-_util-colors-pink-pink-200)',
'_util-colors-pink-pink-300': 'var(--color-_util-colors-pink-pink-300)',
'_util-colors-pink-pink-400': 'var(--color-_util-colors-pink-pink-400)',
'_util-colors-pink-pink-500': 'var(--color-_util-colors-pink-pink-500)',
'_util-colors-pink-pink-600': 'var(--color-_util-colors-pink-pink-600)',
'_util-colors-pink-pink-700': 'var(--color-_util-colors-pink-pink-700)',
'util-colors-pink-pink-50': 'var(--color-util-colors-pink-pink-50)',
'util-colors-pink-pink-100': 'var(--color-util-colors-pink-pink-100)',
'util-colors-pink-pink-200': 'var(--color-util-colors-pink-pink-200)',
'util-colors-pink-pink-300': 'var(--color-util-colors-pink-pink-300)',
'util-colors-pink-pink-400': 'var(--color-util-colors-pink-pink-400)',
'util-colors-pink-pink-500': 'var(--color-util-colors-pink-pink-500)',
'util-colors-pink-pink-600': 'var(--color-util-colors-pink-pink-600)',
'util-colors-pink-pink-700': 'var(--color-util-colors-pink-pink-700)',
'_util-colors-fuchsia-fuchsia-50': 'var(--color-_util-colors-fuchsia-fuchsia-50)',
'_util-colors-fuchsia-fuchsia-100': 'var(--color-_util-colors-fuchsia-fuchsia-100)',
'_util-colors-fuchsia-fuchsia-200': 'var(--color-_util-colors-fuchsia-fuchsia-200)',
'_util-colors-fuchsia-fuchsia-300': 'var(--color-_util-colors-fuchsia-fuchsia-300)',
'_util-colors-fuchsia-fuchsia-400': 'var(--color-_util-colors-fuchsia-fuchsia-400)',
'_util-colors-fuchsia-fuchsia-500': 'var(--color-_util-colors-fuchsia-fuchsia-500)',
'_util-colors-fuchsia-fuchsia-600': 'var(--color-_util-colors-fuchsia-fuchsia-600)',
'_util-colors-fuchsia-fuchsia-700': 'var(--color-_util-colors-fuchsia-fuchsia-700)',
'util-colors-fuchsia-fuchsia-50': 'var(--color-util-colors-fuchsia-fuchsia-50)',
'util-colors-fuchsia-fuchsia-100': 'var(--color-util-colors-fuchsia-fuchsia-100)',
'util-colors-fuchsia-fuchsia-200': 'var(--color-util-colors-fuchsia-fuchsia-200)',
'util-colors-fuchsia-fuchsia-300': 'var(--color-util-colors-fuchsia-fuchsia-300)',
'util-colors-fuchsia-fuchsia-400': 'var(--color-util-colors-fuchsia-fuchsia-400)',
'util-colors-fuchsia-fuchsia-500': 'var(--color-util-colors-fuchsia-fuchsia-500)',
'util-colors-fuchsia-fuchsia-600': 'var(--color-util-colors-fuchsia-fuchsia-600)',
'util-colors-fuchsia-fuchsia-700': 'var(--color-util-colors-fuchsia-fuchsia-700)',
'_util-colors-purple-purple-50': 'var(--color-_util-colors-purple-purple-50)',
'_util-colors-purple-purple-100': 'var(--color-_util-colors-purple-purple-100)',
'_util-colors-purple-purple-200': 'var(--color-_util-colors-purple-purple-200)',
'_util-colors-purple-purple-300': 'var(--color-_util-colors-purple-purple-300)',
'_util-colors-purple-purple-400': 'var(--color-_util-colors-purple-purple-400)',
'_util-colors-purple-purple-500': 'var(--color-_util-colors-purple-purple-500)',
'_util-colors-purple-purple-600': 'var(--color-_util-colors-purple-purple-600)',
'_util-colors-purple-purple-700': 'var(--color-_util-colors-purple-purple-700)',
'util-colors-purple-purple-50': 'var(--color-util-colors-purple-purple-50)',
'util-colors-purple-purple-100': 'var(--color-util-colors-purple-purple-100)',
'util-colors-purple-purple-200': 'var(--color-util-colors-purple-purple-200)',
'util-colors-purple-purple-300': 'var(--color-util-colors-purple-purple-300)',
'util-colors-purple-purple-400': 'var(--color-util-colors-purple-purple-400)',
'util-colors-purple-purple-500': 'var(--color-util-colors-purple-purple-500)',
'util-colors-purple-purple-600': 'var(--color-util-colors-purple-purple-600)',
'util-colors-purple-purple-700': 'var(--color-util-colors-purple-purple-700)',
'_util-colors-indigo-indigo-50': 'var(--color-_util-colors-indigo-indigo-50)',
'_util-colors-indigo-indigo-100': 'var(--color-_util-colors-indigo-indigo-100)',
'_util-colors-indigo-indigo-200': 'var(--color-_util-colors-indigo-indigo-200)',
'_util-colors-indigo-indigo-300': 'var(--color-_util-colors-indigo-indigo-300)',
'_util-colors-indigo-indigo-400': 'var(--color-_util-colors-indigo-indigo-400)',
'_util-colors-indigo-indigo-500': 'var(--color-_util-colors-indigo-indigo-500)',
'_util-colors-indigo-indigo-600': 'var(--color-_util-colors-indigo-indigo-600)',
'_util-colors-indigo-indigo-700': 'var(--color-_util-colors-indigo-indigo-700)',
'util-colors-indigo-indigo-50': 'var(--color-util-colors-indigo-indigo-50)',
'util-colors-indigo-indigo-100': 'var(--color-util-colors-indigo-indigo-100)',
'util-colors-indigo-indigo-200': 'var(--color-util-colors-indigo-indigo-200)',
'util-colors-indigo-indigo-300': 'var(--color-util-colors-indigo-indigo-300)',
'util-colors-indigo-indigo-400': 'var(--color-util-colors-indigo-indigo-400)',
'util-colors-indigo-indigo-500': 'var(--color-util-colors-indigo-indigo-500)',
'util-colors-indigo-indigo-600': 'var(--color-util-colors-indigo-indigo-600)',
'util-colors-indigo-indigo-700': 'var(--color-util-colors-indigo-indigo-700)',
'_util-colors-blue-blue-50': 'var(--color-_util-colors-blue-blue-50)',
'_util-colors-blue-blue-100': 'var(--color-_util-colors-blue-blue-100)',
'_util-colors-blue-blue-200': 'var(--color-_util-colors-blue-blue-200)',
'_util-colors-blue-blue-300': 'var(--color-_util-colors-blue-blue-300)',
'_util-colors-blue-blue-400': 'var(--color-_util-colors-blue-blue-400)',
'_util-colors-blue-blue-500': 'var(--color-_util-colors-blue-blue-500)',
'_util-colors-blue-blue-600': 'var(--color-_util-colors-blue-blue-600)',
'_util-colors-blue-blue-700': 'var(--color-_util-colors-blue-blue-700)',
'util-colors-blue-blue-50': 'var(--color-util-colors-blue-blue-50)',
'util-colors-blue-blue-100': 'var(--color-util-colors-blue-blue-100)',
'util-colors-blue-blue-200': 'var(--color-util-colors-blue-blue-200)',
'util-colors-blue-blue-300': 'var(--color-util-colors-blue-blue-300)',
'util-colors-blue-blue-400': 'var(--color-util-colors-blue-blue-400)',
'util-colors-blue-blue-500': 'var(--color-util-colors-blue-blue-500)',
'util-colors-blue-blue-600': 'var(--color-util-colors-blue-blue-600)',
'util-colors-blue-blue-700': 'var(--color-util-colors-blue-blue-700)',
'_util-colors-blue-light-blue-light-50': 'var(--color-_util-colors-blue-light-blue-light-50)',
'_util-colors-blue-light-blue-light-100': 'var(--color-_util-colors-blue-light-blue-light-100)',
'_util-colors-blue-light-blue-light-200': 'var(--color-_util-colors-blue-light-blue-light-200)',
'_util-colors-blue-light-blue-light-300': 'var(--color-_util-colors-blue-light-blue-light-300)',
'_util-colors-blue-light-blue-light-400': 'var(--color-_util-colors-blue-light-blue-light-400)',
'_util-colors-blue-light-blue-light-500': 'var(--color-_util-colors-blue-light-blue-light-500)',
'_util-colors-blue-light-blue-light-600': 'var(--color-_util-colors-blue-light-blue-light-600)',
'_util-colors-blue-light-blue-light-700': 'var(--color-_util-colors-blue-light-blue-light-700)',
'util-colors-blue-light-blue-light-50': 'var(--color-util-colors-blue-light-blue-light-50)',
'util-colors-blue-light-blue-light-100': 'var(--color-util-colors-blue-light-blue-light-100)',
'util-colors-blue-light-blue-light-200': 'var(--color-util-colors-blue-light-blue-light-200)',
'util-colors-blue-light-blue-light-300': 'var(--color-util-colors-blue-light-blue-light-300)',
'util-colors-blue-light-blue-light-400': 'var(--color-util-colors-blue-light-blue-light-400)',
'util-colors-blue-light-blue-light-500': 'var(--color-util-colors-blue-light-blue-light-500)',
'util-colors-blue-light-blue-light-600': 'var(--color-util-colors-blue-light-blue-light-600)',
'util-colors-blue-light-blue-light-700': 'var(--color-util-colors-blue-light-blue-light-700)',
'_util-colors-gray-blue-gray-blue-50': 'var(--color-_util-colors-gray-blue-gray-blue-50)',
'_util-colors-gray-blue-gray-blue-100': 'var(--color-_util-colors-gray-blue-gray-blue-100)',
'_util-colors-gray-blue-gray-blue-200': 'var(--color-_util-colors-gray-blue-gray-blue-200)',
'_util-colors-gray-blue-gray-blue-300': 'var(--color-_util-colors-gray-blue-gray-blue-300)',
'_util-colors-gray-blue-gray-blue-400': 'var(--color-_util-colors-gray-blue-gray-blue-400)',
'_util-colors-gray-blue-gray-blue-500': 'var(--color-_util-colors-gray-blue-gray-blue-500)',
'_util-colors-gray-blue-gray-blue-600': 'var(--color-_util-colors-gray-blue-gray-blue-600)',
'_util-colors-gray-blue-gray-blue-700': 'var(--color-_util-colors-gray-blue-gray-blue-700)',
'util-colors-gray-blue-gray-blue-50': 'var(--color-util-colors-gray-blue-gray-blue-50)',
'util-colors-gray-blue-gray-blue-100': 'var(--color-util-colors-gray-blue-gray-blue-100)',
'util-colors-gray-blue-gray-blue-200': 'var(--color-util-colors-gray-blue-gray-blue-200)',
'util-colors-gray-blue-gray-blue-300': 'var(--color-util-colors-gray-blue-gray-blue-300)',
'util-colors-gray-blue-gray-blue-400': 'var(--color-util-colors-gray-blue-gray-blue-400)',
'util-colors-gray-blue-gray-blue-500': 'var(--color-util-colors-gray-blue-gray-blue-500)',
'util-colors-gray-blue-gray-blue-600': 'var(--color-util-colors-gray-blue-gray-blue-600)',
'util-colors-gray-blue-gray-blue-700': 'var(--color-util-colors-gray-blue-gray-blue-700)',
'_util-colors-blue-brand-blue-brand-50': 'var(--color-_util-colors-blue-brand-blue-brand-50)',
'_util-colors-blue-brand-blue-brand-100': 'var(--color-_util-colors-blue-brand-blue-brand-100)',
'_util-colors-blue-brand-blue-brand-200': 'var(--color-_util-colors-blue-brand-blue-brand-200)',
'_util-colors-blue-brand-blue-brand-300': 'var(--color-_util-colors-blue-brand-blue-brand-300)',
'_util-colors-blue-brand-blue-brand-400': 'var(--color-_util-colors-blue-brand-blue-brand-400)',
'_util-colors-blue-brand-blue-brand-500': 'var(--color-_util-colors-blue-brand-blue-brand-500)',
'_util-colors-blue-brand-blue-brand-600': 'var(--color-_util-colors-blue-brand-blue-brand-600)',
'_util-colors-blue-brand-blue-brand-700': 'var(--color-_util-colors-blue-brand-blue-brand-700)',
'util-colors-blue-brand-blue-brand-50': 'var(--color-util-colors-blue-brand-blue-brand-50)',
'util-colors-blue-brand-blue-brand-100': 'var(--color-util-colors-blue-brand-blue-brand-100)',
'util-colors-blue-brand-blue-brand-200': 'var(--color-util-colors-blue-brand-blue-brand-200)',
'util-colors-blue-brand-blue-brand-300': 'var(--color-util-colors-blue-brand-blue-brand-300)',
'util-colors-blue-brand-blue-brand-400': 'var(--color-util-colors-blue-brand-blue-brand-400)',
'util-colors-blue-brand-blue-brand-500': 'var(--color-util-colors-blue-brand-blue-brand-500)',
'util-colors-blue-brand-blue-brand-600': 'var(--color-util-colors-blue-brand-blue-brand-600)',
'util-colors-blue-brand-blue-brand-700': 'var(--color-util-colors-blue-brand-blue-brand-700)',
'_util-colors-red-red-50': 'var(--color-_util-colors-red-red-50)',
'_util-colors-red-red-100': 'var(--color-_util-colors-red-red-100)',
'_util-colors-red-red-200': 'var(--color-_util-colors-red-red-200)',
'_util-colors-red-red-300': 'var(--color-_util-colors-red-red-300)',
'_util-colors-red-red-400': 'var(--color-_util-colors-red-red-400)',
'_util-colors-red-red-500': 'var(--color-_util-colors-red-red-500)',
'_util-colors-red-red-600': 'var(--color-_util-colors-red-red-600)',
'_util-colors-red-red-700': 'var(--color-_util-colors-red-red-700)',
'util-colors-red-red-50': 'var(--color-util-colors-red-red-50)',
'util-colors-red-red-100': 'var(--color-util-colors-red-red-100)',
'util-colors-red-red-200': 'var(--color-util-colors-red-red-200)',
'util-colors-red-red-300': 'var(--color-util-colors-red-red-300)',
'util-colors-red-red-400': 'var(--color-util-colors-red-red-400)',
'util-colors-red-red-500': 'var(--color-util-colors-red-red-500)',
'util-colors-red-red-600': 'var(--color-util-colors-red-red-600)',
'util-colors-red-red-700': 'var(--color-util-colors-red-red-700)',
'_util-colors-green-green-50': 'var(--color-_util-colors-green-green-50)',
'_util-colors-green-green-100': 'var(--color-_util-colors-green-green-100)',
'_util-colors-green-green-200': 'var(--color-_util-colors-green-green-200)',
'_util-colors-green-green-300': 'var(--color-_util-colors-green-green-300)',
'_util-colors-green-green-400': 'var(--color-_util-colors-green-green-400)',
'_util-colors-green-green-500': 'var(--color-_util-colors-green-green-500)',
'_util-colors-green-green-600': 'var(--color-_util-colors-green-green-600)',
'_util-colors-green-green-700': 'var(--color-_util-colors-green-green-700)',
'util-colors-green-green-50': 'var(--color-util-colors-green-green-50)',
'util-colors-green-green-100': 'var(--color-util-colors-green-green-100)',
'util-colors-green-green-200': 'var(--color-util-colors-green-green-200)',
'util-colors-green-green-300': 'var(--color-util-colors-green-green-300)',
'util-colors-green-green-400': 'var(--color-util-colors-green-green-400)',
'util-colors-green-green-500': 'var(--color-util-colors-green-green-500)',
'util-colors-green-green-600': 'var(--color-util-colors-green-green-600)',
'util-colors-green-green-700': 'var(--color-util-colors-green-green-700)',
'_util-colors-warning-warning-50': 'var(--color-_util-colors-warning-warning-50)',
'_util-colors-warning-warning-100': 'var(--color-_util-colors-warning-warning-100)',
'_util-colors-warning-warning-200': 'var(--color-_util-colors-warning-warning-200)',
'_util-colors-warning-warning-300': 'var(--color-_util-colors-warning-warning-300)',
'_util-colors-warning-warning-400': 'var(--color-_util-colors-warning-warning-400)',
'_util-colors-warning-warning-500': 'var(--color-_util-colors-warning-warning-500)',
'_util-colors-warning-warning-600': 'var(--color-_util-colors-warning-warning-600)',
'_util-colors-warning-warning-700': 'var(--color-_util-colors-warning-warning-700)',
'util-colors-warning-warning-50': 'var(--color-util-colors-warning-warning-50)',
'util-colors-warning-warning-100': 'var(--color-util-colors-warning-warning-100)',
'util-colors-warning-warning-200': 'var(--color-util-colors-warning-warning-200)',
'util-colors-warning-warning-300': 'var(--color-util-colors-warning-warning-300)',
'util-colors-warning-warning-400': 'var(--color-util-colors-warning-warning-400)',
'util-colors-warning-warning-500': 'var(--color-util-colors-warning-warning-500)',
'util-colors-warning-warning-600': 'var(--color-util-colors-warning-warning-600)',
'util-colors-warning-warning-700': 'var(--color-util-colors-warning-warning-700)',
'_util-colors-yellow-yellow-50': 'var(--color-_util-colors-yellow-yellow-50)',
'_util-colors-yellow-yellow-100': 'var(--color-_util-colors-yellow-yellow-100)',
'_util-colors-yellow-yellow-200': 'var(--color-_util-colors-yellow-yellow-200)',
'_util-colors-yellow-yellow-300': 'var(--color-_util-colors-yellow-yellow-300)',
'_util-colors-yellow-yellow-400': 'var(--color-_util-colors-yellow-yellow-400)',
'_util-colors-yellow-yellow-500': 'var(--color-_util-colors-yellow-yellow-500)',
'_util-colors-yellow-yellow-600': 'var(--color-_util-colors-yellow-yellow-600)',
'_util-colors-yellow-yellow-700': 'var(--color-_util-colors-yellow-yellow-700)',
'util-colors-yellow-yellow-50': 'var(--color-util-colors-yellow-yellow-50)',
'util-colors-yellow-yellow-100': 'var(--color-util-colors-yellow-yellow-100)',
'util-colors-yellow-yellow-200': 'var(--color-util-colors-yellow-yellow-200)',
'util-colors-yellow-yellow-300': 'var(--color-util-colors-yellow-yellow-300)',
'util-colors-yellow-yellow-400': 'var(--color-util-colors-yellow-yellow-400)',
'util-colors-yellow-yellow-500': 'var(--color-util-colors-yellow-yellow-500)',
'util-colors-yellow-yellow-600': 'var(--color-util-colors-yellow-yellow-600)',
'util-colors-yellow-yellow-700': 'var(--color-util-colors-yellow-yellow-700)',
'_util-colors-teal-teal-50': 'var(--color-_util-colors-teal-teal-50)',
'_util-colors-teal-teal-100': 'var(--color-_util-colors-teal-teal-100)',
'_util-colors-teal-teal-200': 'var(--color-_util-colors-teal-teal-200)',
'_util-colors-teal-teal-300': 'var(--color-_util-colors-teal-teal-300)',
'_util-colors-teal-teal-400': 'var(--color-_util-colors-teal-teal-400)',
'_util-colors-teal-teal-500': 'var(--color-_util-colors-teal-teal-500)',
'_util-colors-teal-teal-600': 'var(--color-_util-colors-teal-teal-600)',
'_util-colors-teal-teal-700': 'var(--color-_util-colors-teal-teal-700)',
'util-colors-teal-teal-50': 'var(--color-util-colors-teal-teal-50)',
'util-colors-teal-teal-100': 'var(--color-util-colors-teal-teal-100)',
'util-colors-teal-teal-200': 'var(--color-util-colors-teal-teal-200)',
'util-colors-teal-teal-300': 'var(--color-util-colors-teal-teal-300)',
'util-colors-teal-teal-400': 'var(--color-util-colors-teal-teal-400)',
'util-colors-teal-teal-500': 'var(--color-util-colors-teal-teal-500)',
'util-colors-teal-teal-600': 'var(--color-util-colors-teal-teal-600)',
'util-colors-teal-teal-700': 'var(--color-util-colors-teal-teal-700)',
'_util-colors-cyan-cyan-50': 'var(--color-_util-colors-cyan-cyan-50)',
'_util-colors-cyan-cyan-100': 'var(--color-_util-colors-cyan-cyan-100)',
'_util-colors-cyan-cyan-200': 'var(--color-_util-colors-cyan-cyan-200)',
'_util-colors-cyan-cyan-300': 'var(--color-_util-colors-cyan-cyan-300)',
'_util-colors-cyan-cyan-400': 'var(--color-_util-colors-cyan-cyan-400)',
'_util-colors-cyan-cyan-500': 'var(--color-_util-colors-cyan-cyan-500)',
'_util-colors-cyan-cyan-600': 'var(--color-_util-colors-cyan-cyan-600)',
'_util-colors-cyan-cyan-700': 'var(--color-_util-colors-cyan-cyan-700)',
'util-colors-cyan-cyan-50': 'var(--color-util-colors-cyan-cyan-50)',
'util-colors-cyan-cyan-100': 'var(--color-util-colors-cyan-cyan-100)',
'util-colors-cyan-cyan-200': 'var(--color-util-colors-cyan-cyan-200)',
'util-colors-cyan-cyan-300': 'var(--color-util-colors-cyan-cyan-300)',
'util-colors-cyan-cyan-400': 'var(--color-util-colors-cyan-cyan-400)',
'util-colors-cyan-cyan-500': 'var(--color-util-colors-cyan-cyan-500)',
'util-colors-cyan-cyan-600': 'var(--color-util-colors-cyan-cyan-600)',
'util-colors-cyan-cyan-700': 'var(--color-util-colors-cyan-cyan-700)',
'_util-colors-violet-violet-50': 'var(--color-_util-colors-violet-violet-50)',
'_util-colors-violet-violet-100': 'var(--color-_util-colors-violet-violet-100)',
'_util-colors-violet-violet-200': 'var(--color-_util-colors-violet-violet-200)',
'_util-colors-violet-violet-300': 'var(--color-_util-colors-violet-violet-300)',
'_util-colors-violet-violet-400': 'var(--color-_util-colors-violet-violet-400)',
'_util-colors-violet-violet-500': 'var(--color-_util-colors-violet-violet-500)',
'_util-colors-violet-violet-600': 'var(--color-_util-colors-violet-violet-600)',
'_util-colors-violet-violet-700': 'var(--color-_util-colors-violet-violet-700)',
'util-colors-violet-violet-50': 'var(--color-util-colors-violet-violet-50)',
'util-colors-violet-violet-100': 'var(--color-util-colors-violet-violet-100)',
'util-colors-violet-violet-200': 'var(--color-util-colors-violet-violet-200)',
'util-colors-violet-violet-300': 'var(--color-util-colors-violet-violet-300)',
'util-colors-violet-violet-400': 'var(--color-util-colors-violet-violet-400)',
'util-colors-violet-violet-500': 'var(--color-util-colors-violet-violet-500)',
'util-colors-violet-violet-600': 'var(--color-util-colors-violet-violet-600)',
'util-colors-violet-violet-700': 'var(--color-util-colors-violet-violet-700)',
'_util-colors-gray-gray-50': 'var(--color-_util-colors-gray-gray-50)',
'_util-colors-gray-gray-100': 'var(--color-_util-colors-gray-gray-100)',
'_util-colors-gray-gray-200': 'var(--color-_util-colors-gray-gray-200)',
'_util-colors-gray-gray-300': 'var(--color-_util-colors-gray-gray-300)',
'_util-colors-gray-gray-400': 'var(--color-_util-colors-gray-gray-400)',
'_util-colors-gray-gray-500': 'var(--color-_util-colors-gray-gray-500)',
'_util-colors-gray-gray-600': 'var(--color-_util-colors-gray-gray-600)',
'_util-colors-gray-gray-700': 'var(--color-_util-colors-gray-gray-700)',
'util-colors-gray-gray-50': 'var(--color-util-colors-gray-gray-50)',
'util-colors-gray-gray-100': 'var(--color-util-colors-gray-gray-100)',
'util-colors-gray-gray-200': 'var(--color-util-colors-gray-gray-200)',
'util-colors-gray-gray-300': 'var(--color-util-colors-gray-gray-300)',
'util-colors-gray-gray-400': 'var(--color-util-colors-gray-gray-400)',
'util-colors-gray-gray-500': 'var(--color-util-colors-gray-gray-500)',
'util-colors-gray-gray-600': 'var(--color-util-colors-gray-gray-600)',
'util-colors-gray-gray-700': 'var(--color-util-colors-gray-gray-700)',
'third-party-LangChain': 'var(--color-third-party-LangChain)',
'third-party-Langfuse': 'var(--color-third-party-Langfuse)',