diff --git a/Dockerfile b/Dockerfile index fdc5f4c4bba..9b7b6398b2e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ ARG NEED_MIRROR=0 WORKDIR /ragflow # copy models downloaded via download_deps.py -RUN mkdir -p /ragflow/rag/res/deepdoc /root/.ragflow +RUN mkdir -p /ragflow/rag/res/deepdoc /opt/ragflow_home RUN --mount=type=bind,from=infiniflow/ragflow_deps:latest,source=/huggingface.co,target=/huggingface.co \ tar --exclude='.*' -cf - \ /huggingface.co/InfiniFlow/text_concat_xgb_v1.0 \ @@ -18,12 +18,15 @@ RUN --mount=type=bind,from=infiniflow/ragflow_deps:latest,source=/huggingface.co # https://github.com/chrismattmann/tika-python # This is the only way to run python-tika without internet access. Without this set, the default is to check the tika version and pull latest every time from Apache. RUN --mount=type=bind,from=infiniflow/ragflow_deps:latest,source=/,target=/deps \ - cp -r /deps/nltk_data /root/ && \ + mkdir -p /opt/nltk_data && \ + cp -r /deps/nltk_data/* /opt/nltk_data/ && \ cp /deps/tika-server-standard-3.3.0.jar /deps/tika-server-standard-3.3.0.jar.md5 /ragflow/ && \ cp /deps/cl100k_base.tiktoken /ragflow/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +ENV TIKTOKEN_CACHE_DIR=/ragflow ENV TIKA_SERVER_JAR="file:///ragflow/tika-server-standard-3.3.0.jar" ENV DEBIAN_FRONTEND=noninteractive +ENV NLTK_DATA=/opt/nltk_data # Setup apt # Python package and implicit dependencies: @@ -35,15 +38,30 @@ RUN --mount=type=cache,id=ragflow_apt,target=/var/cache/apt,sharing=locked \ apt update && \ apt --no-install-recommends install -y ca-certificates; \ if [ "$NEED_MIRROR" == "1" ]; then \ - sed -i 's|http://archive.ubuntu.com/ubuntu|https://mirrors.aliyun.com/ubuntu|g' /etc/apt/sources.list.d/ubuntu.sources; \ - sed -i 's|http://security.ubuntu.com/ubuntu|https://mirrors.aliyun.com/ubuntu|g' /etc/apt/sources.list.d/ubuntu.sources; \ + sed -i 's|http://archive.ubuntu.com/ubuntu|https://mirrors.tuna.tsinghua.edu.cn/ubuntu|g' /etc/apt/sources.list.d/ubuntu.sources; \ + sed -i 's|http://security.ubuntu.com/ubuntu|https://mirrors.tuna.tsinghua.edu.cn/ubuntu|g' /etc/apt/sources.list.d/ubuntu.sources; \ fi; \ rm -f /etc/apt/apt.conf.d/docker-clean && \ echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache && \ chmod 1777 /tmp && \ apt update && \ - apt install -y \ - build-essential libglib2.0-0 libglx-mesa0 libgl1 pkg-config libicu-dev libgdiplus default-jdk libatk-bridge2.0-0 libpython3-dev libgtk-4-1 libnss3 xdg-utils libgbm-dev libjemalloc-dev gnupg unzip curl wget git vim less ghostscript pandoc texlive texlive-latex-extra texlive-xetex texlive-lang-chinese fonts-freefont-ttf fonts-noto-cjk postgresql-client + apt install -y build-essential && \ + apt install -y libglib2.0-0 libglx-mesa0 libgl1 && \ + apt install -y pkg-config libicu-dev libgdiplus && \ + apt install -y default-jdk && \ + apt install -y libatk-bridge2.0-0 && \ + apt install -y libpython3-dev libgtk-4-1 libnss3 xdg-utils libgbm-dev && \ + apt install -y libjemalloc-dev && \ + apt install -y gnupg unzip curl wget git vim less && \ + apt install -y ghostscript && \ + apt install -y pandoc && \ + apt install -y texlive && \ + apt install -y fonts-freefont-ttf fonts-noto-cjk && \ + apt install -y postgresql-client + +RUN wget -q -O /ragflow/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 \ + https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken && \ + echo "tiktoken cl100k_base encoding cached successfully" # Download resource from GitHub to /usr/share/infinity RUN mkdir -p /usr/share/infinity/resource && \ @@ -77,13 +95,16 @@ RUN --mount=type=bind,from=infiniflow/ragflow_deps:latest,source=/,target=/deps if [ "$arch" = "x86_64" ]; then uv_arch="x86_64"; else uv_arch="aarch64"; fi; \ tar xzf "/deps/uv-${uv_arch}-unknown-linux-gnu.tar.gz" \ && cp "uv-${uv_arch}-unknown-linux-gnu/"* /usr/local/bin/ \ - && rm -rf "uv-${uv_arch}-unknown-linux-gnu" \ - && uv python install 3.12 + && rm -rf "uv-${uv_arch}-unknown-linux-gnu" + + + +ENV UV_PYTHON_INSTALL_DIR=/opt/uv/python +RUN uv python install 3.12 ENV PYTHONDONTWRITEBYTECODE=1 DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 \ UV_HTTP_TIMEOUT=200 \ UV_HTTP_RETRIES=3 -ENV PATH=/root/.local/bin:$PATH # nodejs 12.22 on Ubuntu 22.04 is too old RUN --mount=type=cache,id=ragflow_apt,target=/var/cache/apt,sharing=locked \ @@ -148,14 +169,21 @@ RUN --mount=type=cache,id=ragflow_uv,target=/root/.cache/uv,sharing=locked \ sed -i 's|mirrors.aliyun.com/pypi|pypi.org|g' uv.lock; \ fi; \ uv sync --python 3.12 --frozen && \ - # Ensure pip is available in the venv for runtime package installation (fixes #12651) .venv/bin/python3 -m ensurepip --upgrade + # Ensure pip is available in the venv for runtime package installation (fixes #12651) + +# Pre-install docling at build time (runtime install impossible in airgapped environments) +ARG DOCLING_VERSION=2.71.0 +RUN --mount=type=cache,id=ragflow_uv,target=/root/.cache/uv,sharing=locked \ + uv pip install --no-cache-dir "docling==${DOCLING_VERSION}" easyocr + +RUN .venv/bin/docling-tools models download --all -o /ragflow/docling_models COPY web web COPY docs docs RUN --mount=type=cache,id=ragflow_npm,target=/root/.npm,sharing=locked \ - cd web && NODE_OPTIONS="--max-old-space-size=8192" npm install && \ - NODE_OPTIONS="--max-old-space-size=8192" VITE_BUILD_SOURCEMAP=false VITE_MINIFY=esbuild npm run build + export NODE_OPTIONS="--max-old-space-size=4096" && \ + cd web && npm install && npm run build COPY .git /ragflow/.git @@ -173,7 +201,9 @@ WORKDIR /ragflow # Copy Python environment and packages ENV VIRTUAL_ENV=/ragflow/.venv COPY --from=builder ${VIRTUAL_ENV} ${VIRTUAL_ENV} -ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" +COPY --from=builder /ragflow/docling_models /ragflow/docling_models +ENV DOCLING_ARTIFACTS_PATH="/ragflow/docling_models" +ENV PATH="${VIRTUAL_ENV}/bin:/usr/local/bin:/usr/bin:/bin" ENV PYTHONPATH=/ragflow/ @@ -205,4 +235,48 @@ RUN mv /etc/nginx/ragflow.conf.golang /etc/nginx/conf.d/ragflow.conf.golang && \ COPY --from=builder /ragflow/web/dist /ragflow/web/dist COPY --from=builder /ragflow/VERSION /ragflow/VERSION + +# ============================================================================= +# OPENSHIFT RESTRICTED-V2 COMPATIBILITY +# ============================================================================= + +RUN rm -rf /root/nltk_data /root/.ragflow 2>/dev/null || true + +# 2. Configure nginx for non-root: +RUN sed -i -E 's/listen\s+80(\s|;)/listen 8080\1/g' /etc/nginx/conf.d/*.conf* /etc/nginx/conf.d/* 2>/dev/null || true && \ + sed -i 's|pid\s\+/var/run/nginx.pid|pid /tmp/nginx.pid|g' /etc/nginx/nginx.conf && \ + grep -q '^\s*pid ' /etc/nginx/nginx.conf || sed -i '1i pid /tmp/nginx.pid;' /etc/nginx/nginx.conf && \ + echo 'client_body_temp_path /tmp/nginx_client_body;' > /etc/nginx/conf.d/00-temp-paths.conf && \ + echo 'proxy_temp_path /tmp/nginx_proxy;' >> /etc/nginx/conf.d/00-temp-paths.conf && \ + echo 'fastcgi_temp_path /tmp/nginx_fastcgi;' >> /etc/nginx/conf.d/00-temp-paths.conf && \ + echo 'uwsgi_temp_path /tmp/nginx_uwsgi;' >> /etc/nginx/conf.d/00-temp-paths.conf && \ + echo 'scgi_temp_path /tmp/nginx_scgi;' >> /etc/nginx/conf.d/00-temp-paths.conf + +# 3. Set HOME to /tmp +ENV HOME=/tmp + +# 4. Set group ownership to GID 0 and mirror permissions +RUN chgrp -R 0 /ragflow \ + /opt/nltk_data \ + /opt/ragflow_home \ + /opt/chrome \ + /opt/uv \ + /var/log/nginx \ + /var/cache/nginx \ + /var/run \ + /etc/nginx \ + && chmod -R g=u /ragflow \ + /opt/nltk_data \ + /opt/ragflow_home \ + /opt/chrome \ + /opt/uv \ + /var/log/nginx \ + /var/cache/nginx \ + /var/run \ + /etc/nginx \ + && chmod -R g=u /tmp + +# 5. Set non-root user +USER 1000 + ENTRYPOINT ["./entrypoint.sh"] diff --git a/docker/.env b/docker/.env index ff5b781cbc3..797c7e8fa09 100644 --- a/docker/.env +++ b/docker/.env @@ -192,7 +192,7 @@ TEI_HOST=tei TEI_PORT=6380 # The local time zone. -TZ=Asia/Shanghai +TZ=${TZ:-Europe/Berlin} # Uncomment the following line if you have limited access to huggingface.co: # HF_ENDPOINT=https://hf-mirror.com @@ -237,7 +237,7 @@ EMBEDDING_BATCH_SIZE=${EMBEDDING_BATCH_SIZE:-16} # A user registration switch: # - Enable registration: 1 # - Disable registration: 0 -REGISTER_ENABLED=1 +REGISTER_ENABLED=${REGISTER_ENABLED:-0} # Important: To enable sandbox, you need to uncomment following two lines: # SANDBOX_ENABLED=1 @@ -267,7 +267,7 @@ SANDBOX_ARTIFACT_BUCKET=sandbox-artifacts SANDBOX_ARTIFACT_EXPIRE_DAYS=7 # Enable DocLing -USE_DOCLING=false +USE_DOCLING=${USE_DOCLING:-true} # Enable Mineru # Uncommenting these lines will automatically add MinerU to the model provider whenever possible. diff --git a/helm/templates/_helpers.tpl b/helm/templates/_helpers.tpl index c751d8f9092..bb1602541d4 100644 --- a/helm/templates/_helpers.tpl +++ b/helm/templates/_helpers.tpl @@ -84,4 +84,4 @@ Create the name of the service account to use {{- else }} {{- default "default" .Values.serviceAccount.name }} {{- end }} -{{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/templates/elasticsearch.yaml b/helm/templates/elasticsearch.yaml index df9fe10ee52..27ab77fe3a4 100644 --- a/helm/templates/elasticsearch.yaml +++ b/helm/templates/elasticsearch.yaml @@ -53,28 +53,6 @@ spec: {{- toYaml . | nindent 8 }} {{- end }} {{- end }} - initContainers: - - name: fix-data-volume-permissions - image: {{ include "ragflow.imageRepo" (dict "root" . "repo" .Values.elasticsearch.initContainers.alpine.repository) }}:{{ .Values.elasticsearch.initContainers.alpine.tag }} - {{- with .Values.elasticsearch.initContainers.alpine.pullPolicy }} - imagePullPolicy: {{ . }} - {{- end }} - command: - - sh - - -c - - "chown -R 1000:0 /usr/share/elasticsearch/data" - volumeMounts: - - mountPath: /usr/share/elasticsearch/data - name: es-data - - name: sysctl - image: {{ include "ragflow.imageRepo" (dict "root" . "repo" .Values.elasticsearch.initContainers.busybox.repository) }}:{{ .Values.elasticsearch.initContainers.busybox.tag }} - {{- with .Values.elasticsearch.initContainers.busybox.pullPolicy }} - imagePullPolicy: {{ . }} - {{- end }} - securityContext: - privileged: true - runAsUser: 0 - command: ["sysctl", "-w", "vm.max_map_count=262144"] containers: - name: elasticsearch image: {{ include "ragflow.imageRepo" (dict "root" . "repo" .Values.elasticsearch.image.repository) }}:{{ .Values.elasticsearch.image.tag }} @@ -98,15 +76,6 @@ spec: resources: {{- . | toYaml | nindent 10 }} {{- end }} - securityContext: - capabilities: - add: - - "IPC_LOCK" - runAsUser: 1000 - # NOTE: fsGroup doesn't seem to - # work so use init container instead - # fsGroup: 1000 - allowPrivilegeEscalation: false volumes: - name: es-data persistentVolumeClaim: diff --git a/helm/templates/env.yaml b/helm/templates/env.yaml index 4121a39ee8d..ea65e518baa 100644 --- a/helm/templates/env.yaml +++ b/helm/templates/env.yaml @@ -1,11 +1,7 @@ -{{- /* -TODO: Split env vars into separate secrets so that each pod - only gets passed the secrets it really needs. -*/}} apiVersion: v1 kind: Secret metadata: - name: {{ include "ragflow.fullname" . }}-env-config + name: {{ include "ragflow.fullname" . }} type: Opaque stringData: {{- range $key, $val := .Values.env }} @@ -13,39 +9,29 @@ stringData: {{ $key }}: {{ quote $val }} {{- end }} {{- end }} - {{- /* - Use host names derived from internal cluster DNS - */}} {{- if .Values.redis.enabled }} - REDIS_HOST: {{ printf "%s-redis.%s.svc" (include "ragflow.fullname" .) .Release.Namespace }} + REDIS_HOST: {{ printf "%s" .Values.env.REDIS_HOST }} REDIS_PORT: "6379" {{- else }} - REDIS_HOST: {{ required "env.REDIS_HOST is required when redis.enabled=false" .Values.env.REDIS_HOST | quote }} + REDIS_HOST: {{ printf "%s" .Values.env.REDIS_HOST }} REDIS_PORT: {{ default "6379" .Values.env.REDIS_PORT | quote }} {{- end }} {{- if .Values.mysql.enabled }} - MYSQL_HOST: {{ printf "%s-mysql.%s.svc" (include "ragflow.fullname" .) .Release.Namespace }} + MYSQL_HOST: {{ printf "%s" .Values.env.MYSQL_HOST }} MYSQL_PORT: "3306" {{- else }} - MYSQL_HOST: {{ required "env.MYSQL_HOST is required when mysql.enabled=false" .Values.env.MYSQL_HOST | quote }} + MYSQL_HOST: {{ printf "%s" .Values.env.MYSQL_HOST }} MYSQL_PORT: {{ default "3306" .Values.env.MYSQL_PORT | quote }} MYSQL_USER: {{ default "root" .Values.env.MYSQL_USER | quote }} {{- end }} {{- if .Values.minio.enabled }} - MINIO_HOST: {{ printf "%s-minio.%s.svc" (include "ragflow.fullname" .) .Release.Namespace }} + MINIO_HOST: {{ printf "%s" .Values.env.MINIO_HOST }} MINIO_PORT: "9000" {{- else }} - MINIO_HOST: {{ default "" .Values.env.MINIO_HOST | quote }} + MINIO_HOST: {{ printf "%s" .Values.env.MINIO_HOST }} MINIO_PORT: {{ default "9000" .Values.env.MINIO_PORT | quote }} {{- end }} - {{- /* - Fail if passwords are not provided in release values - */}} REDIS_PASSWORD: {{ default "" .Values.env.REDIS_PASSWORD }} - {{- /* - NOTE: MySQL uses MYSQL_ROOT_PASSWORD env var but Ragflow container expects - MYSQL_PASSWORD so we need to define both as the same value here. - */}} {{- with .Values.env.MYSQL_PASSWORD | required "MYSQL_PASSWORD is required" }} MYSQL_PASSWORD: {{ . }} MYSQL_ROOT_PASSWORD: {{ . }} @@ -53,11 +39,8 @@ stringData: {{- $minioPass := default "" .Values.env.MINIO_PASSWORD }} MINIO_PASSWORD: {{ $minioPass }} MINIO_ROOT_PASSWORD: {{ $minioPass }} - {{- /* - Only provide env vars for enabled doc engine - */}} {{- if eq .Values.env.DOC_ENGINE "elasticsearch" }} - ES_HOST: {{ printf "%s-es.%s.svc" (include "ragflow.fullname" .) .Release.Namespace }} + ES_HOST: {{ printf "%s" .Values.env.ES_HOST }} ELASTIC_PASSWORD: {{ .Values.env.ELASTIC_PASSWORD | required "ELASTIC_PASSWORD is required" }} {{- else if eq .Values.env.DOC_ENGINE "infinity" }} INFINITY_HOST: {{ printf "%s-infinity.%s.svc" (include "ragflow.fullname" .) .Release.Namespace }} diff --git a/helm/templates/infinity.yaml b/helm/templates/infinity.yaml index dcf38c904af..f7183efd5e7 100644 --- a/helm/templates/infinity.yaml +++ b/helm/templates/infinity.yaml @@ -60,7 +60,7 @@ spec: {{- end }} envFrom: - secretRef: - name: {{ include "ragflow.fullname" . }}-env-config + name: {{ include "ragflow.fullname" . }} ports: - containerPort: 23817 name: thrift diff --git a/helm/templates/minio.yaml b/helm/templates/minio.yaml index 01170dce7b1..ea861e15371 100644 --- a/helm/templates/minio.yaml +++ b/helm/templates/minio.yaml @@ -61,7 +61,7 @@ spec: {{- end }} envFrom: - secretRef: - name: {{ include "ragflow.fullname" . }}-env-config + name: {{ include "ragflow.fullname" . }} args: - server - "--console-address=:9001" diff --git a/helm/templates/mysql.yaml b/helm/templates/mysql.yaml index a35b2aa048d..18779d65cec 100644 --- a/helm/templates/mysql.yaml +++ b/helm/templates/mysql.yaml @@ -27,6 +27,7 @@ metadata: {{- include "ragflow.labels" . | nindent 4 }} app.kubernetes.io/component: mysql spec: + serviceName: {{ include "ragflow.fullname" . }}-mysql replicas: 1 selector: matchLabels: @@ -62,15 +63,15 @@ spec: {{- end }} envFrom: - secretRef: - name: {{ include "ragflow.fullname" . }}-env-config + name: {{ include "ragflow.fullname" . }} args: - --max_connections=1000 - --character-set-server=utf8mb4 - --collation-server=utf8mb4_general_ci - - --default-authentication-plugin=mysql_native_password + - --authentication_policy=caching_sha2_password - --tls_version=TLSv1.2,TLSv1.3 - - --init-file=/data/application/init.sql - --disable-log-bin + - --host_cache_size=0 ports: - containerPort: 3306 name: mysql @@ -81,7 +82,8 @@ spec: volumeMounts: - mountPath: /var/lib/mysql name: mysql-data - - mountPath: /data/application/init.sql + subPath: data + - mountPath: /docker-entrypoint-initdb.d/init.sql subPath: init.sql readOnly: true name: init-script-volume @@ -108,5 +110,5 @@ spec: - protocol: TCP port: 3306 targetPort: mysql - type: {{ .Values.mysql.service.type }} + type: {{ .Values.mysql.service.type | default "ClusterIP" }} {{- end }} diff --git a/helm/templates/opensearch.yaml b/helm/templates/opensearch.yaml index 1c504804af5..a748cda38ec 100644 --- a/helm/templates/opensearch.yaml +++ b/helm/templates/opensearch.yaml @@ -83,7 +83,7 @@ spec: {{- end }} envFrom: - secretRef: - name: {{ include "ragflow.fullname" . }}-env-config + name: {{ include "ragflow.fullname" . }} - configMapRef: name: {{ include "ragflow.fullname" . }}-opensearch-config ports: diff --git a/helm/templates/ragflow.yaml b/helm/templates/ragflow.yaml index 62f3242fefa..6ccd4c0ec0f 100644 --- a/helm/templates/ragflow.yaml +++ b/helm/templates/ragflow.yaml @@ -46,7 +46,7 @@ spec: - "--enable-adminserver" {{- end }} ports: - - containerPort: 80 + - containerPort: 8080 name: http - containerPort: 9380 name: http-api @@ -55,7 +55,7 @@ spec: name: admin {{- end }} volumeMounts: - - mountPath: /etc/nginx/conf.d/ragflow.conf + - mountPath: /etc/nginx/ragflow-helm.conf subPath: ragflow.conf name: nginx-config-volume - mountPath: /etc/nginx/proxy.conf diff --git a/helm/templates/ragflow_config.yaml b/helm/templates/ragflow_config.yaml index 01f94937612..222bfb96af0 100644 --- a/helm/templates/ragflow_config.yaml +++ b/helm/templates/ragflow_config.yaml @@ -20,7 +20,7 @@ metadata: data: ragflow.conf: | server { - listen 80; + listen 8080; server_name _; root /ragflow/web/dist; @@ -62,17 +62,22 @@ data: proxy_read_timeout 3600s; proxy_send_timeout 3600s; nginx.conf: | - user root; worker_processes auto; error_log /var/log/nginx/error.log notice; - pid /var/run/nginx.pid; + pid /tmp/nginx.pid; events { worker_connections 1024; } http { + client_body_temp_path /tmp/nginx_client_body; + proxy_temp_path /tmp/nginx_proxy; + fastcgi_temp_path /tmp/nginx_fastcgi; + uwsgi_temp_path /tmp/nginx_uwsgi; + scgi_temp_path /tmp/nginx_scgi; + include /etc/nginx/mime.types; default_type application/octet-stream; @@ -90,5 +95,5 @@ data: #gzip on; client_max_body_size 128M; - include /etc/nginx/conf.d/ragflow.conf; + include /etc/nginx/ragflow-helm.conf; } diff --git a/helm/templates/redis.yaml b/helm/templates/redis.yaml index 6ca77ab6a11..cc1c58ac98d 100644 --- a/helm/templates/redis.yaml +++ b/helm/templates/redis.yaml @@ -63,7 +63,7 @@ spec: - "exec redis-server --requirepass ${REDIS_PASSWORD} --maxmemory 128mb --maxmemory-policy allkeys-lru" envFrom: - secretRef: - name: {{ include "ragflow.fullname" . }}-env-config + name: {{ include "ragflow.fullname" . }} ports: - containerPort: 6379 name: redis diff --git a/helm/values.yaml b/helm/values.yaml index af90af59caf..a9c6ae11fdb 100644 --- a/helm/values.yaml +++ b/helm/values.yaml @@ -11,20 +11,23 @@ global: imagePullSecrets: [] env: + SSL_CERT_FILE: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt # The type of doc engine to use. # Available options: # - `elasticsearch` (default) # - `infinity` (https://github.com/infiniflow/infinity) # - `opensearch` (https://github.com/opensearch-project/OpenSearch) # DOC_ENGINE: elasticsearch - DOC_ENGINE: infinity + DOC_ENGINE: elasticsearch # DOC_ENGINE: opensearch # The version of Elasticsearch. STACK_VERSION: "8.11.3" - + USE_DOCLING: true + REGISTER_ENABLED: "0" # The password for Elasticsearch ELASTIC_PASSWORD: infini_rag_flow_helm + ES_HOST: "ragflow-es.ragflow.svc.cluster.local" # The password for OpenSearch. # At least one uppercase letter, one lowercase letter, one digit, and one special character @@ -35,7 +38,7 @@ env: # The database of the MySQL service to use MYSQL_DBNAME: rag_flow # External MySQL host (only required when mysql.enabled=false) - # MYSQL_HOST: "" + MYSQL_HOST: "ragflow-mysql.ragflow.svc.cluster.local" # External MySQL port (defaults to 3306 if not set) # MYSQL_PORT: "3306" # External MySQL user (only when mysql.enabled=false), default is root if omitted @@ -46,19 +49,19 @@ env: # The password for MinIO MINIO_PASSWORD: infini_rag_flow_helm # External MinIO host - # MINIO_HOST: "" + MINIO_HOST: "ragflow-minio.ragflow.svc.cluster.local" # External MinIO port (defaults to 9000 if not set) # MINIO_PORT: "9000" # The password for Redis REDIS_PASSWORD: infini_rag_flow_helm # External Redis host (only required when redis.enabled=false) - # REDIS_HOST: "" + REDIS_HOST: "ragflow-redis-svc.ragflow.svc.cluster.local" # External Redis port (defaults to 6379 if not set) # REDIS_PORT: "6379" # The local time zone. - TZ: "Asia/Shanghai" + TZ: "Europe/Berlin" # Uncomment the following line if you have limited access to huggingface.co: # HF_ENDPOINT: https://hf-mirror.com @@ -69,15 +72,15 @@ env: # After making the change, ensure you update `client_max_body_size` in nginx/nginx.conf correspondingly. # The number of document chunks processed in a single batch during document parsing. - DOC_BULK_SIZE: 4 + DOC_BULK_SIZE: 64 # The number of text chunks processed in a single batch during embedding vectorization. - EMBEDDING_BATCH_SIZE: 16 + EMBEDDING_BATCH_SIZE: 128 ragflow: image: - repository: infiniflow/ragflow - tag: v0.24.0 + repository: quay-etaps.registry.intern/dap/kira + tag: testv24.3 pullPolicy: IfNotPresent pullSecrets: [] # Optional service configuration overrides @@ -123,8 +126,8 @@ ragflow: infinity: image: - repository: infiniflow/infinity - tag: v0.7.0-dev5 + repository: quay-etaps.registry.intern/dap/infiniflow/infinity + tag: v0.7.0-dev2 pullPolicy: IfNotPresent pullSecrets: [] storage: @@ -138,17 +141,17 @@ infinity: elasticsearch: image: - repository: elasticsearch - tag: "8.11.3" + repository: quay-etaps.registry.intern/dap/elasticsearch + tag: 8.11.3 pullPolicy: IfNotPresent pullSecrets: [] initContainers: alpine: - repository: alpine + repository: quay-etaps.registry.intern/dap/alpine tag: latest pullPolicy: IfNotPresent busybox: - repository: busybox + repository: quay-etaps.registry.intern/dap/busybox tag: latest pullPolicy: IfNotPresent storage: @@ -158,24 +161,24 @@ elasticsearch: strategy: resources: requests: - cpu: "4" - memory: "16Gi" + cpu: "8" + memory: "32Gi" service: type: ClusterIP opensearch: image: - repository: opensearchproject/opensearch + repository: quay-etaps.registry.intern/dap/opensearch tag: 2.19.1 pullPolicy: IfNotPresent pullSecrets: [] initContainers: alpine: - repository: alpine + repository: quay-etaps.registry.intern/dap/alpine tag: latest pullPolicy: IfNotPresent busybox: - repository: busybox + repository: quay-etaps.registry.intern/dap/busybox tag: latest pullPolicy: IfNotPresent storage: @@ -193,7 +196,7 @@ opensearch: minio: enabled: true image: - repository: quay.io/minio/minio + repository: quay-etaps.registry.intern/dap/minio tag: RELEASE.2023-12-20T01-00-02Z pullPolicy: IfNotPresent pullSecrets: [] @@ -209,7 +212,7 @@ minio: mysql: enabled: true image: - repository: mysql + repository: quay-etaps.registry.intern/dap/mysql tag: 8.0.39 pullPolicy: IfNotPresent pullSecrets: [] @@ -225,7 +228,7 @@ mysql: redis: enabled: true image: - repository: valkey/valkey + repository: quay-etaps.registry.intern/dap/valkey tag: 8 pullPolicy: IfNotPresent pullSecrets: [] @@ -249,17 +252,17 @@ redis: # This block is for setting up web service ingress. For more information, see: # https://kubernetes.io/docs/concepts/services-networking/ingress/ ingress: - enabled: false + enabled: true className: "" annotations: {} # kubernetes.io/ingress.class: nginx # kubernetes.io/tls-acme: "true" hosts: - - host: chart-example.local + - host: kira-ragflow.apps.ocmtdx05.dyn.mtd.openshift.intern paths: - path: / pathType: ImplementationSpecific tls: [] # - secretName: chart-example-tls # hosts: - # - chart-example.local + # - chart-example.local \ No newline at end of file diff --git a/web/index.html b/web/index.html index 5aea7c664b7..003776d7337 100644 --- a/web/index.html +++ b/web/index.html @@ -4,7 +4,7 @@ - RAGFlow + KIRA diff --git a/web/public/fonts/SparBd.ttf b/web/public/fonts/SparBd.ttf new file mode 100644 index 00000000000..4726d6282e4 Binary files /dev/null and b/web/public/fonts/SparBd.ttf differ diff --git a/web/public/fonts/SparRg.ttf b/web/public/fonts/SparRg.ttf new file mode 100644 index 00000000000..a72982c434e Binary files /dev/null and b/web/public/fonts/SparRg.ttf differ diff --git a/web/public/logo.svg b/web/public/logo.svg index 54167d2fb3f..965b62d5ed6 100644 --- a/web/public/logo.svg +++ b/web/public/logo.svg @@ -1,29 +1 @@ - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/web/src/components/floating-chat-widget.tsx b/web/src/components/floating-chat-widget.tsx index 30f548c8a9a..211a2d82504 100644 --- a/web/src/components/floating-chat-widget.tsx +++ b/web/src/components/floating-chat-widget.tsx @@ -4,10 +4,10 @@ import { MessageType, SharedFrom } from '@/constants/chat'; import { useFetchExternalAgentInputs } from '@/hooks/use-agent-request'; import { useFetchExternalChatInfo } from '@/hooks/use-chat-request'; import i18n, { changeLanguageAsync } from '@/locales/config'; -import { useTranslation } from 'react-i18next'; import { useSendNextSharedMessage } from '@/pages/agent/hooks/use-send-shared-message'; import { MessageCircle, Minimize2, Send, X } from 'lucide-react'; import React, { useCallback, useEffect, useRef, useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { useGetSharedChatSearchParams, useSendSharedMessage, diff --git a/web/src/components/ragflow-avatar.tsx b/web/src/components/ragflow-avatar.tsx index 0141a99666d..62966abe655 100644 --- a/web/src/components/ragflow-avatar.tsx +++ b/web/src/components/ragflow-avatar.tsx @@ -3,12 +3,7 @@ import * as AvatarPrimitive from '@radix-ui/react-avatar'; import { forwardRef, memo, useMemo } from 'react'; import { Avatar, AvatarFallback, AvatarImage } from './ui/avatar'; -const PREDEFINED_COLORS = [ - { from: '#4F6DEE', to: '#67BDF9' }, - { from: '#38A04D', to: '#93DCA2' }, - { from: '#C35F2B', to: '#EDB395' }, - { from: '#633897', to: '#CBA1FF' }, -]; +const PREDEFINED_COLORS = [{ from: '#9B348E', to: '#ee0000' }]; const getStringHash = (str: string): number => { if (typeof str !== 'string') return 0; @@ -54,8 +49,8 @@ export const RAGFlowAvatar = memo( const { initials, from, to } = useMemo( () => ({ initials: getInitials(name), - from: 'hsl(0, 0%, 30%)', - to: 'hsl(0, 0%, 80%)', + from: 'hsl(0, 100%, 46.7%)', + to: 'hsl(308, 49.8%, 40.6%)', ...(name ? getColorForName(name) : {}), }), [name], diff --git a/web/src/global.less b/web/src/global.less index ddf5a1d893e..2e3a8fc8391 100644 --- a/web/src/global.less +++ b/web/src/global.less @@ -1,26 +1,23 @@ @import url(./inter.less); -:root { - --font-sans: 'Inter'; +html { + height: 100%; + overflow: hidden; // The content of the DatasetSettings page is too high, which will cause scroll bars to appear on the html tags. Setting the maximum height in DatasetSettings does not work either. I don't understand. } -@supports (font-variation-settings: normal) { - :root { - --font-sans: 'InterVariable'; - } +body { + font-family: 'Spar', sans-serif; + margin: 0; + height: 100%; } -html, -body, #root { - width: 100vw; - width: 100dvw; - height: 100vh; - height: 100dvh; - overflow: hidden; + height: 100%; +} - margin: 0; - padding: 0; +.ant-app { + height: 100%; + width: 100%; } .vue-office-excel { diff --git a/web/src/inter.less b/web/src/inter.less index aa8e2f33112..8253d91446a 100644 --- a/web/src/inter.less +++ b/web/src/inter.less @@ -4,270 +4,16 @@ :root { font-family: "InterVariable", sans-serif; font-optical-sizing: auto; } } */ @font-face { - font-family: InterVariable; + font-family: 'Spar'; font-style: normal; - font-weight: 100 900; - font-display: swap; - src: url('@/assets/inter/InterVariable.woff2') format('woff2'); -} -@font-face { - font-family: InterVariable; - font-style: italic; - font-weight: 100 900; - font-display: swap; - src: url('@/assets/inter/InterVariable-Italic.woff2') format('woff2'); -} - -/* static fonts */ -@font-face { - font-family: 'Inter'; - font-style: normal; - font-weight: 100; - font-display: swap; - src: url('@/assets/inter/Inter-Thin.woff2') format('woff2'); -} -@font-face { - font-family: 'Inter'; - font-style: italic; - font-weight: 100; - font-display: swap; - src: url('@/assets/inter/Inter-ThinItalic.woff2') format('woff2'); -} -@font-face { - font-family: 'Inter'; - font-style: normal; - font-weight: 200; - font-display: swap; - src: url('@/assets/inter/Inter-ExtraLight.woff2') format('woff2'); -} -@font-face { - font-family: 'Inter'; - font-style: italic; - font-weight: 200; - font-display: swap; - src: url('@/assets/inter/Inter-ExtraLightItalic.woff2') format('woff2'); -} -@font-face { - font-family: 'Inter'; - font-style: normal; - font-weight: 300; - font-display: swap; - src: url('@/assets/inter/Inter-Light.woff2') format('woff2'); -} -@font-face { - font-family: 'Inter'; - font-style: italic; - font-weight: 300; - font-display: swap; - src: url('@/assets/inter/Inter-LightItalic.woff2') format('woff2'); -} -@font-face { - font-family: 'Inter'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url('@/assets/inter/Inter-Regular.woff2') format('woff2'); -} -@font-face { - font-family: 'Inter'; - font-style: italic; font-weight: 400; font-display: swap; - src: url('@/assets/inter/Inter-Italic.woff2') format('woff2'); -} -@font-face { - font-family: 'Inter'; - font-style: normal; - font-weight: 500; - font-display: swap; - src: url('@/assets/inter/Inter-Medium.woff2') format('woff2'); + src: url('/fonts/SparRg.ttf') format('truetype'); } @font-face { - font-family: 'Inter'; - font-style: italic; - font-weight: 500; - font-display: swap; - src: url('@/assets/inter/Inter-MediumItalic.woff2') format('woff2'); -} -@font-face { - font-family: 'Inter'; + font-family: 'Spar'; font-style: normal; - font-weight: 600; - font-display: swap; - src: url('@/assets/inter/Inter-SemiBold.woff2') format('woff2'); -} -@font-face { - font-family: 'Inter'; - font-style: italic; - font-weight: 600; - font-display: swap; - src: url('@/assets/inter/Inter-SemiBoldItalic.woff2') format('woff2'); -} -@font-face { - font-family: 'Inter'; - font-style: normal; - font-weight: 700; - font-display: swap; - src: url('@/assets/inter/Inter-Bold.woff2') format('woff2'); -} -@font-face { - font-family: 'Inter'; - font-style: italic; font-weight: 700; font-display: swap; - src: url('@/assets/inter/Inter-BoldItalic.woff2') format('woff2'); -} -@font-face { - font-family: 'Inter'; - font-style: normal; - font-weight: 800; - font-display: swap; - src: url('@/assets/inter/Inter-ExtraBold.woff2') format('woff2'); -} -@font-face { - font-family: 'Inter'; - font-style: italic; - font-weight: 800; - font-display: swap; - src: url('@/assets/inter/Inter-ExtraBoldItalic.woff2') format('woff2'); -} -@font-face { - font-family: 'Inter'; - font-style: normal; - font-weight: 900; - font-display: swap; - src: url('@/assets/inter/Inter-Black.woff2') format('woff2'); -} -@font-face { - font-family: 'Inter'; - font-style: italic; - font-weight: 900; - font-display: swap; - src: url('@/assets/inter/Inter-BlackItalic.woff2') format('woff2'); -} -@font-face { - font-family: 'InterDisplay'; - font-style: normal; - font-weight: 100; - font-display: swap; - src: url('@/assets/inter/InterDisplay-Thin.woff2') format('woff2'); -} -@font-face { - font-family: 'InterDisplay'; - font-style: italic; - font-weight: 100; - font-display: swap; - src: url('@/assets/inter/InterDisplay-ThinItalic.woff2') format('woff2'); -} -@font-face { - font-family: 'InterDisplay'; - font-style: normal; - font-weight: 200; - font-display: swap; - src: url('@/assets/inter/InterDisplay-ExtraLight.woff2') format('woff2'); -} -@font-face { - font-family: 'InterDisplay'; - font-style: italic; - font-weight: 200; - font-display: swap; - src: url('@/assets/inter/InterDisplay-ExtraLightItalic.woff2') format('woff2'); -} -@font-face { - font-family: 'InterDisplay'; - font-style: normal; - font-weight: 300; - font-display: swap; - src: url('@/assets/inter/InterDisplay-Light.woff2') format('woff2'); -} -@font-face { - font-family: 'InterDisplay'; - font-style: italic; - font-weight: 300; - font-display: swap; - src: url('@/assets/inter/InterDisplay-LightItalic.woff2') format('woff2'); -} -@font-face { - font-family: 'InterDisplay'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url('@/assets/inter/InterDisplay-Regular.woff2') format('woff2'); -} -@font-face { - font-family: 'InterDisplay'; - font-style: italic; - font-weight: 400; - font-display: swap; - src: url('@/assets/inter/InterDisplay-Italic.woff2') format('woff2'); -} -@font-face { - font-family: 'InterDisplay'; - font-style: normal; - font-weight: 500; - font-display: swap; - src: url('@/assets/inter/InterDisplay-Medium.woff2') format('woff2'); -} -@font-face { - font-family: 'InterDisplay'; - font-style: italic; - font-weight: 500; - font-display: swap; - src: url('@/assets/inter/InterDisplay-MediumItalic.woff2') format('woff2'); -} -@font-face { - font-family: 'InterDisplay'; - font-style: normal; - font-weight: 600; - font-display: swap; - src: url('@/assets/inter/InterDisplay-SemiBold.woff2') format('woff2'); -} -@font-face { - font-family: 'InterDisplay'; - font-style: italic; - font-weight: 600; - font-display: swap; - src: url('@/assets/inter/InterDisplay-SemiBoldItalic.woff2') format('woff2'); -} -@font-face { - font-family: 'InterDisplay'; - font-style: normal; - font-weight: 700; - font-display: swap; - src: url('@/assets/inter/InterDisplay-Bold.woff2') format('woff2'); -} -@font-face { - font-family: 'InterDisplay'; - font-style: italic; - font-weight: 700; - font-display: swap; - src: url('@/assets/inter/InterDisplay-BoldItalic.woff2') format('woff2'); -} -@font-face { - font-family: 'InterDisplay'; - font-style: normal; - font-weight: 800; - font-display: swap; - src: url('@/assets/inter/InterDisplay-ExtraBold.woff2') format('woff2'); -} -@font-face { - font-family: 'InterDisplay'; - font-style: italic; - font-weight: 800; - font-display: swap; - src: url('@/assets/inter/InterDisplay-ExtraBoldItalic.woff2') format('woff2'); -} -@font-face { - font-family: 'InterDisplay'; - font-style: normal; - font-weight: 900; - font-display: swap; - src: url('@/assets/inter/InterDisplay-Black.woff2') format('woff2'); -} -@font-face { - font-family: 'InterDisplay'; - font-style: italic; - font-weight: 900; - font-display: swap; - src: url('@/assets/inter/InterDisplay-BlackItalic.woff2') format('woff2'); + src: url('/fonts/SparBd.ttf') format('truetype'); } diff --git a/web/src/layouts/components/global-navbar.tsx b/web/src/layouts/components/global-navbar.tsx index f52ed492870..6839f3cc9a5 100644 --- a/web/src/layouts/components/global-navbar.tsx +++ b/web/src/layouts/components/global-navbar.tsx @@ -30,11 +30,6 @@ const menuItems = [ name: 'header.search', /* icon: Search, */ 'data-testid': 'nav-search', }, - { - path: Routes.Agents, - name: 'header.flow', - /* icon: Cpu, */ 'data-testid': 'nav-agent', - }, { path: Routes.Memories, name: 'header.memories' /* icon: Cpu, */ }, { path: Routes.Files, name: 'header.fileManager' /* icon: File, */ }, ]; diff --git a/web/src/layouts/components/header.tsx b/web/src/layouts/components/header.tsx index 0db9ad138d3..c182d24524b 100644 --- a/web/src/layouts/components/header.tsx +++ b/web/src/layouts/components/header.tsx @@ -1,4 +1,3 @@ -import { IconFontFill } from '@/components/icon-font'; import { RAGFlowAvatar } from '@/components/ragflow-avatar'; import { Button } from '@/components/ui/button'; import { @@ -73,24 +72,6 @@ export function Header({ className="flex items-center justify-end gap-4 text-text-badge" data-testid="auth-status" > - - - - - - - - + + +
+ + {/* Temporarily hidden */} + {/* + Pro + */} +
+ + + ); +} diff --git a/web/src/locales/de.ts b/web/src/locales/de.ts index 39b6f5a07a4..c9d94117df7 100644 --- a/web/src/locales/de.ts +++ b/web/src/locales/de.ts @@ -371,7 +371,7 @@ Beispiel: Eine 1 KB Nachricht mit 1024-dim Einbettung verwendet ~9 KB. Das Stand changeSpecificCategory: 'Spezifische Kategorie ändern', uploadTitle: 'Ziehen Sie Ihre Datei hierher, um sie hochzuladen', uploadDescription: - 'RAGFlow unterstützt das Hochladen von Dateien einzeln oder in Batches. Für lokal bereitgestelltes RAGFlow: Die maximale Dateigröße pro Upload beträgt 1 GB, mit einem Batch-Upload-Limit von 32 Dateien. Es gibt keine Begrenzung der Gesamtanzahl an Dateien pro Konto. Für cloud.ragflow.io: Die maximale Dateigröße pro Upload beträgt 10 MB, wobei jede Datei nicht größer als 10 MB sein darf und maximal 128 Dateien pro Konto erlaubt sind.', + 'RAGFlow unterstützt das Hochladen von Dateien einzeln oder in Batches. Die maximale Dateigröße pro Upload beträgt 1 GB, mit einem Batch-Upload-Limit von 32 Dateien. Es gibt keine Begrenzung der Gesamtanzahl an Dateien pro Konto.', chunk: 'Chunk', bulk: 'Masse', cancel: 'Abbrechen', @@ -722,7 +722,7 @@ Diese Auto-Tag-Funktion verbessert den Abruf, indem sie eine weitere Schicht dom function: 'Funktion', chunkMessage: 'Bitte Wert eingeben!', full: 'Volltext', - ellipse: 'Ellipse', + ellipse: 'Zusammenfassung', graph: 'Wissensgraph', mind: 'Mind Map', question: 'Frage', diff --git a/web/src/pages/404.tsx b/web/src/pages/404.tsx index 25d326a70cb..19227264e12 100644 --- a/web/src/pages/404.tsx +++ b/web/src/pages/404.tsx @@ -7,9 +7,12 @@ const NoFoundPage = () => { const navigate = useNavigate(); return (
-
404
+

+ 404 +

- Page not found, please enter a correct address. + Seite nicht gefunden. Bitte überprüfen Sie die URL oder kehren Sie zur + Startseite zurück.
); diff --git a/web/src/pages/home/applications.tsx b/web/src/pages/home/applications.tsx index 46b6654bcfe..a3eb6ec668f 100644 --- a/web/src/pages/home/applications.tsx +++ b/web/src/pages/home/applications.tsx @@ -7,7 +7,6 @@ import { Routes } from '@/routes'; import { useCallback, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router'; -import { Agents } from './agent-list'; import { SeeAllAppCard } from './application-card'; import { ChatList } from './chat-list'; import { MemoryList } from './memory-list'; @@ -16,14 +15,12 @@ import { SearchList } from './search-list'; const IconMap = { [Routes.Chats]: 'chats', [Routes.Searches]: 'searches', - [Routes.Agents]: 'agents', [Routes.Memories]: 'memory', }; const EmptyTypeMap = { [Routes.Chats]: EmptyCardType.Chat, [Routes.Searches]: EmptyCardType.Search, - [Routes.Agents]: EmptyCardType.Agent, [Routes.Memories]: EmptyCardType.Memory, }; @@ -47,10 +44,9 @@ export function Applications() { const options = useMemo( () => [ - { value: Routes.Chats, label: t('header.chat') }, - { value: Routes.Searches, label: t('header.search') }, - { value: Routes.Agents, label: t('header.flow') }, - { value: Routes.Memories, label: t('header.memories') }, + { value: Routes.Chats, label: t('chat.chatApps') }, + { value: Routes.Searches, label: t('search.searchApps') }, + { value: Routes.Memories, label: t('memories.memory') }, ], [t], ); @@ -85,12 +81,6 @@ export function Applications() { {/*
*/} - {val === Routes.Agents && ( - setListLength(length)} - setLoading={(loading: boolean) => setLoading(loading)} - /> - )} {val === Routes.Chats && ( setListLength(length)} diff --git a/web/src/pages/home/banner.tsx b/web/src/pages/home/banner.tsx index 8beeb2e76bf..8ed0c432e1e 100644 --- a/web/src/pages/home/banner.tsx +++ b/web/src/pages/home/banner.tsx @@ -49,8 +49,8 @@ export function NextBanner() { {t('header.welcome')}{' '} - - RAGFlow + + KIRA ); diff --git a/web/src/pages/login-next/bg.tsx b/web/src/pages/login-next/bg.tsx index 2ac801e4a3e..06ab221bfec 100644 --- a/web/src/pages/login-next/bg.tsx +++ b/web/src/pages/login-next/bg.tsx @@ -27,9 +27,9 @@ export const BgSvg = ({ isPaused = false }: { isPaused?: boolean }) => { > - - - + + + { {title === 'login' ? t('login') : t('continue')} @@ -209,7 +209,7 @@ function LoginFormContent({ )} {!disablePasswordLogin && title === 'login' && registerEnabled && ( -
+

{t('signInTip')}

{t('title')} diff --git a/web/src/pages/next-search/search-home.tsx b/web/src/pages/next-search/search-home.tsx index 05ee5a1244c..2c7f6910f82 100644 --- a/web/src/pages/next-search/search-home.tsx +++ b/web/src/pages/next-search/search-home.tsx @@ -2,11 +2,11 @@ import { Input } from '@/components/originui/input'; import Spotlight from '@/components/spotlight'; import message from '@/components/ui/message'; import { IUserInfo } from '@/interfaces/database/user-setting'; +import { cn } from '@/lib/utils.ts'; import { Search } from 'lucide-react'; import { Dispatch, SetStateAction } from 'react'; import { useTranslation } from 'react-i18next'; import './index.less'; -import { RAGFlowLogo } from './ragflow-log'; export default function SearchHome({ isSearching, @@ -28,13 +28,22 @@ export default function SearchHome({ return (
- +

+ KIRA +

+
{!isSearching && }
{!isSearching && ( <> -

👋 Hi there

+

+ 👋 Hallo! Was möchtest du suchen? +

{userInfo && ( <> diff --git a/web/src/pages/next-search/search-view.tsx b/web/src/pages/next-search/search-view.tsx index 388d78605e2..07e729080ba 100644 --- a/web/src/pages/next-search/search-view.tsx +++ b/web/src/pages/next-search/search-view.tsx @@ -25,7 +25,6 @@ import { ISearchReturnProps } from './hooks'; import './index.less'; import MarkdownContent from './markdown-content'; import MindMapDrawer from './mindmap-drawer'; -import { RAGFlowLogo } from './ragflow-log'; import RetrievalDocuments from './retrieval-documents'; export default function SearchingView({ @@ -81,11 +80,16 @@ export default function SearchingView({ 'relative z-10 px-8 pt-8 flex text-transparent justify-start items-start w-full h-full', )} > - { setIsSearching?.(false); }} - > + > + KIRA +

[ label: t('setting.dataSources'), key: Routes.DataSource, }, - { - icon: , - label: t('setting.model'), - key: Routes.Model, - 'data-testid': 'settings-nav-model-providers', - }, - { - icon: , - label: 'MCP', - key: Routes.Mcp, - }, { icon: , label: t('setting.team'), @@ -49,11 +31,6 @@ const menuItems = (t: TFunction) => [ label: t('setting.profile'), key: Routes.Profile, }, - { - icon: , - label: t('setting.api'), - key: Routes.Api, - }, // { // icon: MessageSquareQuote, // label: 'Prompt Templates', diff --git a/web/src/routes.tsx b/web/src/routes.tsx index 90c6a9a074a..7a7f9fe62a4 100644 --- a/web/src/routes.tsx +++ b/web/src/routes.tsx @@ -129,10 +129,6 @@ const routeConfigOptions = [ Component: () => import('@/pages/next-chats/widget'), layout: false, }, - { - path: Routes.AgentList, - Component: () => import('@/pages/agents'), - }, { path: '/document/:id', Component: () => import('@/pages/document-viewer'), diff --git a/web/tailwind.css b/web/tailwind.css index 6cbf2a6d48b..6ea949eda3d 100644 --- a/web/tailwind.css +++ b/web/tailwind.css @@ -25,7 +25,7 @@ --secondary: 210 40% 96.1%; --secondary-foreground: 222.2 47.4% 11.2%; - --accent: 210 40% 96.1%; + --accent: 238 0 0; --accent-foreground: 222.2 47.4% 11.2%; --destructive: 0 100% 50%; @@ -109,10 +109,10 @@ /* Input default color */ --border-default: rgba(0, 0, 0, 0.2); /* Input accent color */ - --border-accent: #000000; + --border-accent: #ee0000; --border-button: rgba(0, 0, 0, 0.1); /* Regulators, parsing, switches, variables */ - --accent-primary: 0 190 180; + --accent-primary: 238 0 0; /* Output Variables Box */ --bg-accent: rgba(76, 164, 231, 0.05); @@ -122,7 +122,7 @@ --state-warning: 250 173 20; --state-error: 216 73 75; - --team-group: #5ab77e; + --team-group: #ee0000; --team-member: #5c96c8; --team-department: #8866d3; --bg-group: rgba(90, 183, 126, 0.1);