首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >dify 1.9.1版本更新详解 — 1000位贡献者的里程碑与丰富的功能改进

dify 1.9.1版本更新详解 — 1000位贡献者的里程碑与丰富的功能改进

作者头像
福大大架构师每日一题
发布2025-12-18 13:48:51
发布2025-12-18 13:48:51
610
举报

2025年9月30日,Dify迎来了一个重要的里程碑——第1000位贡献者的加入。伴随着这个里程碑,Dify发布了1.9.1版本,为开发者、运维人员和社区用户带来了多项功能升级、性能优化以及问题修复。本次更新不仅涉及基础设施与构建工具的升级,还针对流水线、引擎、搜索解析、工作流、文件处理、性能网络、UI/UX及代码结构进行了全面优化。下面我们对本次更新的具体内容进行详细梳理。

k3s安装dify1.9.1:

.

代码语言:javascript
复制
###############################################################################
# Author: Winson Li
# Email: mail@winson.dev
# Github: @Winson-030
###############################################################################
# Namespace
apiVersion: v1
kind: Namespace
metadata:
  name: dify  

# Dify Credentials
# apiVersion: v1
# kind: Secret
# metadata:
#   name: dify-credentials
#   namespace: dify
# data:
#   # Base64 encoded postgres username, default is postgres
#   pg-username: cG9zdGdyZXM=
#   # Base64 encoded postgres password, default is difyai123456
#   pg-password: ZGlmeWFpMTIzNDU2
#   # Base64 encoded postgres host, default is dify-postgres
#   pg-host: ZGlmeS1wb3N0Z3Jlcw==
#   # Base64 encoded postgres port 5432
#   pg-port: NTQzMg==
#   # Base64 encoded redis username, default is empty
#   redis-username: ""
#   # Base64 encoded redis password, default is difyai123456
#   redis-password: ZGlmeWFpMTIzNDU2
#   # Base64 encoded redis host, default is dify-redis
#   redis-host: ZGlmeS1yZWRpcw==
#   # Base64 encoded redis port 6379
#   redis-port: NjM3OQ==
#   # Base64 encoded weaviate host, default is dify-weaviate
#   weaviate-host: ZGlmeS13ZWF2aWF0ZQ==
#   # Base64 encoded weaviate port 8080
#   weaviate-port: ODA4MA==
# type: Opaque

# Postgres Server Start
---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app.kubernetes.io/instance: dify-postgres
  name: dify-postgres
  namespace: dify

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  labels:
    app.kubernetes.io/instance: dify-postgres
  name: dify-postgres
  namespace: dify
rules:
- apiGroups:
  - "*"
  resources:
  - "*"
  verbs:
  - "*"

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    app.kubernetes.io/instance: dify-postgres
  name: dify-postgres
  namespace: dify
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: dify-postgres
subjects:
- kind: ServiceAccount
  name: dify-postgres

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: dify-postgres
  namespace: dify
spec:
  selector:
    matchLabels:
      app: dify-postgres 
  serviceName: "dify-postgres"
  replicas: 1
  template:
    metadata:
      labels:
        app: dify-postgres
    spec:
      serviceAccountName: dify-postgres
      terminationGracePeriodSeconds: 10
      nodeSelector:
        kubernetes.io/os: linux
      containers:
      - name: dify-postgres
        image: postgres:15-alpine
        imagePullPolicy: IfNotPresent
        env:
        - name: PGUSER
          value: postgres
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: pg-username
        - name: POSTGRES_PASSWORD
          value: difyai123456
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: pg-password
        - name: POSTGRES_DB
          value: dify
        - name: PGDATA
          value: /var/lib/postgresql/data
        # command:
        # - "postgres"
        # - "-c"
        # - "max_connections=100"
        # - "-c"
        # - "shared_buffers=128MB"
        # - "-c"
        # - "work_mem=4MB"
        # - "-c"
        # - "maintenance_work_mem=64MB"
        # - "-c"
        # - "effective_cache_size=4096MB"

        livenessProbe:
          exec:
            command:
            - "pg_isready"
            - "-U"
            - "$(PGUSER)"
            - "-d"
            - "$(POSTGRES_DB)"
          initialDelaySeconds: 5
          periodSeconds: 5
          timeoutSeconds: 2
          successThreshold: 1
          failureThreshold: 10
        resources:
          limits:
            cpu: 500m
            memory: 1Gi
          requests:
            cpu: 100m
            memory: 128Mi
        ports:
        - containerPort: 5432
          name: postgres-port
        volumeMounts:
        - name: postgres-data
          mountPath: /var/lib/postgresql/data
      volumes:
      - name: postgres-data
        hostPath:
          path: /root/k8s/dify/db/postgres/data
          type: DirectoryOrCreate

---
apiVersion: v1
kind: Service
metadata:
  name: dify-postgres
  namespace: dify
spec:
  selector:
    app: dify-postgres
type: ClusterIP
  clusterIP: None
  ports:
  - name: postgres
    protocol: TCP
    port: 5432
    targetPort: 5432

# Postgres Server End
# Redis Server Start
---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app.kubernetes.io/instance: dify-redis
  name: dify-redis
  namespace: dify
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  labels:
    app.kubernetes.io/instance: dify-redis
  name: dify-redis
  namespace: dify
rules:
- apiGroups:
  - "*"
  resources:
  - "*"
  verbs:
  - "*"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    app.kubernetes.io/instance: dify-redis
  name: dify-redis
  namespace: dify
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: dify-redis
subjects:
- kind: ServiceAccount
  name: dify-redis

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: dify-redis
  namespace: dify
spec:
  selector:
    matchLabels:
      app: dify-redis
  serviceName: "dify-redis"
  replicas: 1
  template:
    metadata:
      labels:
        app: dify-redis
    spec:
      terminationGracePeriodSeconds: 10
      nodeSelector:
        kubernetes.io/os: linux
      serviceAccountName: dify-redis
      containers:
      - name: dify-redis
        image: redis:6-alpine
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 6379
          name: redis-p
        command: ["redis-server", "--save", "20", "1", "--loglevel", "warning", "--requirepass", "$(REDIS_PASSWORD)"]
        resources:
          limits:
            cpu: 500m
            memory: 1024Mi
          requests:
            cpu: 100m
            memory: 102Mi
        env:
        - name: REDIS_PASSWORD
          value: difyai123456
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: redis-password
        livenessProbe:
          exec:
            command:
            - redis-cli
            - ping
        volumeMounts:
        - name: redis-data
          mountPath: /data
      volumes:
      - name: redis-data
        hostPath:
          path: /root/k8s/dify/db/redis/data
          type: DirectoryOrCreate

---
apiVersion: v1
kind: Service
metadata:
  name: dify-redis
  namespace: dify
spec:
  selector:
    app: dify-redis
type: ClusterIP
  clusterIP: None
  ports:
  - name: redis
    protocol: TCP
    port: 6379
    targetPort: 6379

# Redis Server End

# Weaviate Server Start
---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app.kubernetes.io/instance: dify-weaviate
  name: dify-weaviate
  namespace: dify

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  labels:
    app.kubernetes.io/instance: dify-weaviate
  name: dify-weaviate
  namespace: dify
rules:
- apiGroups:
  - "*"
  resources:
  - "*"
  verbs:
  - "*"

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    app.kubernetes.io/instance: dify-weaviate
  name: dify-weaviate
  namespace: dify
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: dify-weaviate
subjects:
- kind: ServiceAccount
  name: dify-weaviate

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: dify-weaviate
  namespace: dify
spec:
  selector:
    matchLabels:
      app: dify-weaviate
  serviceName: "dify-weaviate"
  replicas: 1
  template:
    metadata:
      labels:
        app: dify-weaviate
    spec:
      terminationGracePeriodSeconds: 10
      nodeSelector:
        kubernetes.io/os: linux
      serviceAccountName: dify-weaviate
      volumes:
      - name: weaviate-data
        hostPath:
          path: /root/k8s/dify/db/weaviate/data
          type: DirectoryOrCreate
      containers:
      - name: dify-weaviate
        image: semitechnologies/weaviate:1.19.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
          name: weaviate-p
        resources:
          limits:
            cpu: 500m
            memory: 1024Mi
          requests:
            cpu: 100m
            memory: 102Mi
        env:
        - name: QUERY_DEFAULTS_LIMIT
          value: "25"
        - name: AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED
          value: "false"
        - name: PERSISTENCE_DATA_PATH
          value: "/var/lib/weaviate"
        - name: "DEFAULT_VECTORIZER_MODULE"
          value: "none"
        - name: "AUTHENTICATION_APIKEY_ENABLED"
          value: "true"
        - name: "AUTHENTICATION_APIKEY_ALLOWED_KEYS"
          value: "WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih"
        - name: "AUTHENTICATION_APIKEY_USERS"
          value: "hello@dify.ai"
        - name: "AUTHORIZATION_ADMINLIST_ENABLED"
          value: "true"
        - name: "AUTHORIZATION_ADMINLIST_USERS"
          value: "hello@dify.ai"

        volumeMounts:
        - name: weaviate-data
          mountPath: /var/lib/weaviate

---
apiVersion: v1
kind: Service
metadata:
  name: dify-weaviate
  namespace: dify
spec:
  selector:
    app: dify-weaviate
type: ClusterIP
  clusterIP: None
  ports:
  - name: weaviate
    protocol: TCP
    port: 8080
    targetPort: 8080

# Weaviate Server End

# Dify Sandbox Server Start

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dify-sandbox
  namespace: dify
  labels:
    app: dify-sandbox
spec:
  replicas: 1
  revisionHistoryLimit: 1
  selector:
    matchLabels:
      app: dify-sandbox
  template:
    metadata:
      labels:
        app: dify-sandbox
    spec:
      automountServiceAccountToken: false
      nodeSelector:
        kubernetes.io/os: linux
      containers:
      - name: dify-sandbox
        image: langgenius/dify-sandbox:0.2.12
        imagePullPolicy: IfNotPresent
        env:
        - name: API_KEY
          value: "dify-sandbox"
        - name: GIN_MODE
          value: "release"
        - name: WORKER_TIMEOUT
          value: "15"
        - name: ENABLE_NETWORK
          value: "true"
        - name: SANDBOX_PORT
          value: "8194"
          # uncomment if you want to use proxy
        - name: HTTP_PROXY
          value: 'http://dify-ssrf:3128'
        - name: HTTPS_PROXY
          value: 'http://dify-ssrf:3128'
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 500m
            memory: 1Gi
        livenessProbe:
          exec:
            command:
            - "curl"
            - "-f"
            - "http://localhost:8194/health"
        ports:
        - containerPort: 8194

---
apiVersion: v1
kind: Service
metadata:
  name: dify-sandbox
  namespace: dify
spec:
  ports:
  - port: 8194
    targetPort: 8194
    protocol: TCP
    name: dify-sandbox
type: ClusterIP
  clusterIP: None
  selector:
    app: dify-sandbox

# Dify Sandbox Server End

# Dify SSRF Proxy Start
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: ssrf-proxy-config
  namespace: dify
data:
  squid.conf: |
    acl localnet src 0.0.0.1-0.255.255.255    # RFC 1122"this" network (LAN)
    acl localnet src 10.0.0.0/8        # RFC 1918 local private network (LAN)
    acl localnet src 100.64.0.0/10        # RFC 6598 shared address space (CGN)
    acl localnet src 169.254.0.0/16     # RFC 3927 link-local (directly plugged) machines
    acl localnet src 172.16.0.0/12        # RFC 1918 local private network (LAN)
    acl localnet src 192.168.0.0/16        # RFC 1918 local private network (LAN)
    acl localnet src fc00::/7           # RFC 4193 local private network range
    acl localnet src fe80::/10          # RFC 4291 link-local (directly plugged) machines
    acl SSL_ports port 443
    # acl SSL_ports port 1025-65535   # Enable the configuration to resolve this issue: https://github.com/langgenius/dify/issues/12792
    acl Safe_ports port 80        # http
    acl Safe_ports port 21        # ftp
    acl Safe_ports port 443        # https
    acl Safe_ports port 70        # gopher
    acl Safe_ports port 210        # wais
    acl Safe_ports port 1025-65535    # unregistered ports
    acl Safe_ports port 280        # http-mgmt
    acl Safe_ports port 488        # gss-http
    acl Safe_ports port 591        # filemaker
    acl Safe_ports port 777        # multiling http
    acl CONNECT method CONNECT
    http_access deny !Safe_ports
    http_access deny CONNECT !SSL_ports
    http_access allow localhost manager
    http_access deny manager
    http_access allow localhost
    http_access allow localnet
    http_access deny all

    ################################## Proxy Server ################################
    http_port 3128
    coredump_dir /var/spool/squid
    refresh_pattern ^ftp:        1440    20%    10080
    refresh_pattern ^gopher:    1440    0%    1440
    refresh_pattern -i (/cgi-bin/|\?) 0    0%    0
    refresh_pattern \/(Packages|Sources)(|\.bz2|\.gz|\.xz)$ 00% 0 refresh-ims
    refresh_pattern \/Release(|\.gpg)$ 00% 0 refresh-ims
    refresh_pattern \/InRelease$ 00% 0 refresh-ims
    refresh_pattern \/(Translation-.*)(|\.bz2|\.gz|\.xz)$ 00% 0 refresh-ims
    refresh_pattern .        0    20%    4320
    

    # upstream proxy, set to your own upstream proxy IP to avoid SSRF attacks
    # cache_peer 172.1.1.1 parent 31280 no-query no-digest no-netdb-exchange default


    ################################## Reverse Proxy To Sandbox ################################
    http_port 8194 accel vhost
    # Notice:
    # default is 'sandbox' in dify's github repo, here is 'dify-sandbox' because the service name of sandbox is 'dify-sandbox'
    # you can change it to your own service name
    cache_peer dify-sandbox parent 8194 0 no-query originserver
    acl src_all src all
    http_access allow src_all

---  
apiVersion: v1
kind: ConfigMap
metadata:
  name: ssrf-proxy-entrypoint
  namespace: dify
data:
  docker-entrypoint-mount.sh: |
    #!/bin/bash

    # Modified based on Squid OCI image entrypoint
    
    # This entrypoint aims to forward the squid logs to stdout to assist users of
    # common container related tooling (e.g., kubernetes, docker-compose, etc) to
    # access the service logs.
    
    # Moreover, it invokes the squid binary, leaving all the desired parameters to
    # be provided by the "command" passed to the spawned container. If no command
    # is provided by the user, the default behavior (as per the CMD statement in
    # the Dockerfile) will be to use Ubuntu's default configuration [1] and run
    # squid with the "-NYC" options to mimic the behavior of the Ubuntu provided
    # systemd unit.
    
    # [1] The default configuration is changed in the Dockerfile to allow local
    # network connections. See the Dockerfile for further information.
    
    echo "[ENTRYPOINT] re-create snakeoil self-signed certificate removed in the build process"
    if [ ! -f /etc/ssl/private/ssl-cert-snakeoil.key ]; then
        /usr/sbin/make-ssl-cert generate-default-snakeoil --force-overwrite > /dev/null 2>&1
    fi
    
    tail -F /var/log/squid/access.log 2>/dev/null &
    tail -F /var/log/squid/error.log 2>/dev/null &
    tail -F /var/log/squid/store.log 2>/dev/null &
    tail -F /var/log/squid/cache.log 2>/dev/null &
    
    # Replace environment variables in the template and output to the squid.conf
    echo "[ENTRYPOINT] replacing environment variables in the template"
    awk '{
        while(match($0, /\${[A-Za-z_][A-Za-z_0-9]*}/)) {
            var = substr($0, RSTART+2, RLENGTH-3)
            val = ENVIRON[var]
            $0 = substr($0, 1, RSTART-1) val substr($0, RSTART+RLENGTH)
        }
        print
    }' /etc/squid/squid.conf.template > /etc/squid/squid.conf
    
    /usr/sbin/squid -Nz
    echo "[ENTRYPOINT] starting squid"
    /usr/sbin/squid -f /etc/squid/squid.conf -NYC 1
   
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name:  dify-ssrf
  namespace: dify
  labels:
    app:  dify-ssrf
spec:
  selector:
    matchLabels:
      app: dify-ssrf
  replicas: 1
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app:  dify-ssrf
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      containers:
      - name: dify-ssrf
        image: ubuntu/squid:latest
        imagePullPolicy: IfNotPresent
        env:
        - name: HTTP_PORT
          value: "3128"
        - name: COREDUMP_DIR
          value: "/var/spool/squid"    
        - name: REVERSE_PROXY_PORT
          value: "8194"
        - name: SANDBOX_HOST
          value: "dify-sandbox"
        - name: SANDBOX_PORT
          value: "8194"
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
          limits:
            cpu: 300m
            memory: 300Mi
        ports:
        - containerPort:  3128
          name:  dify-ssrf
        volumeMounts:
        - name: ssrf-proxy-config
          mountPath: /etc/squid/
        - name: ssrf-proxy-entrypoint
          mountPath: /tmp/
        command: [ "sh", "-c", "cp /tmp/docker-entrypoint-mount.sh /docker-entrypoint.sh && sed -i 's/\r$$//' /docker-entrypoint.sh && chmod +x /docker-entrypoint.sh && /docker-entrypoint.sh" ]
      volumes:
        - name: ssrf-proxy-config
          configMap:
            name: ssrf-proxy-config
        - name: ssrf-proxy-entrypoint
          configMap:
            name: ssrf-proxy-entrypoint

---
apiVersion: v1
kind: Service
metadata:
  name: dify-ssrf
  namespace: dify
spec:
  selector:
    app: dify-ssrf
  ports:
  - protocol: TCP
    port: 3128
    targetPort: 3128
# Dify SSRF Proxy End

# Dify API Server End
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: dify-api
  labels:
    app.kubernetes.io/instance: dify-api
    app: dify-api
  namespace: dify
spec:
  replicas: 1
  revisionHistoryLimit: 1
  minReadySeconds: 10
  serviceName: dify-api
  selector:
    matchLabels:
      app: dify-api
  template:
    metadata:
      labels:
        app: dify-api
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      volumes:
      - name: dify-api-storage
        hostPath:
          path: /root/k8s/dify/app/api/storage
          type: DirectoryOrCreate
      containers:
      - name: dify-api
        image: langgenius/dify-api:1.9.1
        imagePullPolicy: IfNotPresent
        env:
        - name: MODE
          value: api
        - name: LOG_LEVEL
          value: DEBUG
        - name: SECRET_KEY
          value: "sk-9f73s3ljTXVcMT3Blb3ljTqtsKiGHXVcMT3BlbkFJLK7U"
        - name: CONSOLE_WEB_URL
          value: ""
        - name: INIT_PASSWORD
          value: password
        - name: CONSOLE_API_URL
          value: ""
        - name: SERVICE_API_URL
          value: ""
        - name: APP_WEB_URL
          value: ""
        - name: FILES_URL
          value: ""
        - name: MIGRATION_ENABLED
          value: "true"
        - name: DB_USERNAME
          value: postgres
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: pg-username
        - name: DB_PASSWORD
          value: difyai123456
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: pg-password
        - name: DB_HOST
          value: dify-postgres
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: pg-host
        - name: DB_PORT
          value: '5432'
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: pg-port
        - name: DB_DATABASE
          value: dify
        - name: REDIS_HOST
          value: dify-redis
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: redis-host
        - name: REDIS_PORT
          value: '6379'
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: redis-port
          # default redis username is empty
        - name: REDIS_USERNAME
          value: ''
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: redis-username
        - name: REDIS_PASSWORD
          value: difyai123456
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: redis-password
        - name: REDIS_USE_SSL
          value: "false"
        - name: REDIS_DB
          value: "0"
        - name: CELERY_BROKER_URL
          value: >-
            redis://$(REDIS_USERNAME):$(REDIS_PASSWORD)@$(REDIS_HOST):$(REDIS_PORT)/1
        - name: WEB_API_CORS_ALLOW_ORIGINS
          value: "*"
        - name: CONSOLE_CORS_ALLOW_ORIGINS
          value: "*"
        - name: STORAGE_TYPE
          value: opendal
        - name: OPENDAL_SCHEME
          value: fs
        - name: OPENDAL_FS_ROOT
          value: storage
        - name: STORAGE_LOCAL_PATH
          value: /app/api/storage
        - name: VECTOR_STORE
          value: weaviate
        - name: WEAVIATE_HOST
          value: dify-weaviate
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: weaviate-host
        - name: WEAVIATE_PORT
          value: '8080'
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: weaviate-port
        - name: WEAVIATE_ENDPOINT
          value: http://$(WEAVIATE_HOST):$(WEAVIATE_PORT)
        - name: WEAVIATE_API_KEY
          value: "WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih"
        - name: CODE_EXECUTION_ENDPOINT
          value: http://dify-sandbox:8194
        - name: CODE_EXECUTION_API_KEY
          value: dify-sandbox
        - name: CODE_MAX_NUMBER
          value: "9223372036854775807"
        - name: CODE_MIN_NUMBER
          value: "-9223372036854775808"
        - name: CODE_MAX_STRING_LENGTH
          value: "80000"
        - name: TEMPLATE_TRANSFORM_MAX_LENGTH
          value: "80000"
        - name: CODE_MAX_STRING_ARRAY_LENGTH
          value: "30"
        - name: CODE_MAX_OBJECT_ARRAY_LENGTH
          value: "30"
        - name: CODE_MAX_NUMBER_ARRAY_LENGTH
          value: "1000"
        - name: INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH
          value: "1000"
          # uncommect to enable SSRF
        - name: SSRF_PROXY_HTTP_URL
          value: 'http://dify-ssrf:3128'
        - name: SSRF_PROXY_HTTPS_URL
          value: 'http://dify-ssrf:3128'
        - name: SENTRY_DSN
          value: ''
        - name: SENTRY_TRACES_SAMPLE_RATE
          value: '1.0'
        - name: SENTRY_PROFILES_SAMPLE_RATE
          value: '1.0'
          # plugin settings
        - name: 'PLUGIN_MAX_PACKAGE_SIZE'
          value: '52428800'
        - name: 'INNER_API_KEY_FOR_PLUGIN'
          value: 'QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1'
        - name: 'PLUGIN_DAEMON_KEY'
          value: 'lYkiYYT6owG+71oLerGzA7GXCgOT++6ovaezWAjpCjf+Sjc3ZtU+qUEi'
        - name: 'PLUGIN_DAEMON_URL'
          value: 'http://dify-plugin-daemon:5002'
        - name: 'MARKETPLACE_ENABLED'
          value: 'true'
        - name: 'MARKETPLACE_API_URL'
          value: 'https://marketplace.dify.ai'
        resources:
          requests:
            cpu: 200m
            memory: 256Mi
          limits:
            cpu: 1000m
            memory: 2Gi
        ports:
        - containerPort: 5001
        volumeMounts:
        - name: dify-api-storage
          mountPath: /app/api/storage
---
apiVersion: v1
kind: Service
metadata:
  name: dify-api
  namespace: dify
spec:
  ports:
  - port: 5001
    targetPort: 5001
    protocol: TCP
    name: dify-api
type: ClusterIP
  selector:
    app: dify-api

# Dify API Server End
# Dify Worker Server Start
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: dify-worker
  namespace: dify
  labels:
    app: dify-worker
    app.kubernetes.io/instance: dify-worker
spec:
  serviceName: "dify-worker"
  replicas: 1
  selector:
    matchLabels:
      app: dify-worker
  template:
    metadata:
      labels:
        app: dify-worker
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      volumes:
      - name: dify-api-storage
        hostPath:
          path: /root/k8s/dify/app/api/storage
          type: DirectoryOrCreate
      containers:
      - name: dify-worker
        image: langgenius/dify-api:1.9.1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 5001
          protocol: TCP
        env:
        - name: CONSOLE_WEB_URL
          value: ""
        - name: MODE
          value: worker
        - name: LOG_LEVEL
          value: INFO
        - name: SECRET_KEY
          value: "sk-9f73s3ljTXVcMT3Blb3ljTqtsKiGHXVcMT3BlbkFJLK7U"
        - name: DB_USERNAME
          value: postgres
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: pg-username
        - name: DB_PASSWORD
          value: difyai123456
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: pg-password
        - name: DB_HOST
          value: dify-postgres
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: pg-host
        - name: DB_PORT
          value: '5432'
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: pg-port
        - name: DB_DATABASE
          value: dify
        - name: REDIS_HOST
          value: dify-redis
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: redis-host
        - name: REDIS_PORT
          value: '6379'
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: redis-port
          # default redis username is empty
        - name: REDIS_USERNAME
          value: ''
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: redis-username
        - name: REDIS_PASSWORD
          value: difyai123456
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: redis-password
        - name: REDIS_USE_SSL
          value: "false"
        - name: REDIS_DB
          value: "0"
        - name: CELERY_BROKER_URL
          value: >-
            redis://$(REDIS_USERNAME):$(REDIS_PASSWORD)@$(REDIS_HOST):$(REDIS_PORT)/1
        - name: WEB_API_CORS_ALLOW_ORIGINS
          value: "*"
        - name: CONSOLE_CORS_ALLOW_ORIGINS
          value: "*"
        - name: STORAGE_TYPE
          value: opendal
        - name: OPENDAL_SCHEME
          value: fs
        - name: OPENDAL_FS_ROOT
          value: storage
        - name: STORAGE_LOCAL_PATH
          value: /app/api/storage
        - name: VECTOR_STORE
          value: weaviate
        - name: WEAVIATE_HOST
          value: dify-weaviate
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: weaviate-host
        - name: WEAVIATE_PORT
          value: '8080'
          # valueFrom:
          #   secretKeyRef:
          #     name: dify-credentials
          #     key: weaviate-port
        - name: WEAVIATE_ENDPOINT
          value: http://$(WEAVIATE_HOST):$(WEAVIATE_PORT)
        - name: WEAVIATE_API_KEY
          value: "WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih"
        - name: SSRF_PROXY_HTTP_URL
          value: 'http://dify-ssrf:3128'
        - name: SSRF_PROXY_HTTPS_URL
          value: 'http://dify-ssrf:3128'
        - name: SENTRY_DSN
          value: ''
        - name: SENTRY_TRACES_SAMPLE_RATE
          value: '1.0'
        - name: SENTRY_PROFILES_SAMPLE_RATE
          value: '1.0'
          # plugin settings
        - name: 'PLUGIN_MAX_PACKAGE_SIZE'
          value: '52428800'
        - name: 'PLUGIN_DAEMON_URL'
          value: 'http://dify-plugin-daemon:5002'
        - name: 'PLUGIN_DAEMON_KEY'
          value: 'lYkiYYT6owG+71oLerGzA7GXCgOT++6ovaezWAjpCjf+Sjc3ZtU+qUEi'
        - name: 'INNER_API_KEY_FOR_PLUGIN'
          value: 'QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1'
        - name: 'MARKETPLACE_ENABLED'
          value: 'true'
        - name: 'MARKETPLACE_API_URL'
          value: 'https://marketplace.dify.ai'
        resources:
          requests:
            cpu: 200m
            memory: 256Mi
          limits:
            cpu: 1000m
            memory: 2Gi
        volumeMounts:
        - name: dify-api-storage
          mountPath: /app/api/storage
      restartPolicy: Always

---
apiVersion: v1
kind: Service
metadata:
  name: dify-worker
  namespace: dify
spec:
  ports:
  - protocol: TCP
    port: 5001
    targetPort: 5001
  selector:
    app: dify-worker
type: ClusterIP

# Dify Worker Server End

# Dify Web Server Start
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dify-web
  namespace: dify
  labels:
    app: dify-web
spec:
  replicas: 1
  revisionHistoryLimit: 1
  selector:
    matchLabels:
      app: dify-web
  template:
    metadata:
      labels:
        app: dify-web
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      automountServiceAccountToken: false
      containers:
      - name: dify-web
        image: langgenius/dify-web:1.9.1
        imagePullPolicy: IfNotPresent
        env:
        - name: EDITION
          value: SELF_HOSTED
        - name: CONSOLE_API_URL
          value: ""
        - name: APP_API_URL
          value: ""
        - name: SENTRY_DSN
          value: ""
        - name: NEXT_TELEMETRY_DISABLED
          value: "0"
        - name: TEXT_GENERATION_TIMEOUT_MS
          value: "60000"
        - name: CSP_WHITELIST
          value: ""
          # dify marketplace
        - name: 'MARKETPLACE_API_URL'
          value: 'https://marketplace.dify.ai'
        - name: 'MARKETPLACE_URL'
          value: 'https://marketplace.dify.ai'
        - name: 'TOP_K_MAX_VALUE'
          value: ''
        - name: 'INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH'
          value: ''
        - name: 'PM2_INSTANCES'
          value: '2'
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 500m
            memory: 1Gi
        ports:
        - containerPort: 3000

---
apiVersion: v1
kind: Service
metadata:
  name: dify-web
  namespace: dify
spec:
  ports:
  - port: 3000
    targetPort: 3000
    protocol: TCP
    name: dify-web
type: ClusterIP
  selector:
    app: dify-web

# Dify Web Server End
# Dify Nginx Server Start
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: dify-nginx
  namespace: dify
data:
  nginx.conf: |-
    user  nginx;
    worker_processes  auto;

    error_log  /var/log/nginx/error.log notice;
    pid        /var/run/nginx.pid;


    events {
        worker_connections  1024;
    }


    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;

        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';

        access_log  /var/log/nginx/access.log  main;

        sendfile        on;
        #tcp_nopush     on;

        keepalive_timeout  65;

        #gzip  on;
        client_max_body_size 15M;

        server {
        listen 80;
        server_name _;

        location /console/api {
          proxy_pass http://dify-api:5001;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;
          proxy_set_header X-Forwarded-Port $server_port;
          proxy_http_version 1.1;
          proxy_set_header Connection "";
          proxy_buffering off;
          proxy_read_timeout 3600s;
          proxy_send_timeout 3600s;
        }

        location /api {
          proxy_pass http://dify-api:5001;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;
          proxy_set_header X-Forwarded-Port $server_port;
          proxy_http_version 1.1;
          proxy_set_header Connection "";
          proxy_buffering off;
          proxy_read_timeout 3600s;
          proxy_send_timeout 3600s;
        }

        location /v1 {
          proxy_pass http://dify-api:5001;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;
          proxy_set_header X-Forwarded-Port $server_port;
          proxy_http_version 1.1;
          proxy_set_header Connection "";
          proxy_buffering off;
          proxy_read_timeout 3600s;
          proxy_send_timeout 3600s;
        }

        location /files {
          proxy_pass http://dify-api:5001;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;
          proxy_set_header X-Forwarded-Port $server_port;
          proxy_http_version 1.1;
          proxy_set_header Connection "";
          proxy_buffering off;
          proxy_read_timeout 3600s;
          proxy_send_timeout 3600s;
        }

        location /explore {
          proxy_pass http://dify-web:3000;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;
          proxy_set_header X-Forwarded-Port $server_port;
          proxy_http_version 1.1;
          proxy_set_header Connection "";
          proxy_buffering off;
          proxy_read_timeout 3600s;
          proxy_send_timeout 3600s;
        }
        
        location /e/ {
          proxy_pass http://dify-plugin-daemon:5002;
          proxy_set_header Dify-Hook-Url ://;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;
          proxy_set_header X-Forwarded-Port $server_port;
          proxy_http_version 1.1;
          proxy_set_header Connection "";
          proxy_buffering off;
          proxy_read_timeout 3600s;
          proxy_send_timeout 3600s;
      }

        location / {
          proxy_pass http://dify-web:3000;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;
          proxy_set_header X-Forwarded-Port $server_port;
          proxy_http_version 1.1;
          proxy_set_header Connection "";
          proxy_buffering off;
          proxy_read_timeout 3600s;
          proxy_send_timeout 3600s;
        }

        # If you want to support HTTPS, please uncomment the code snippet below
        #listen 443 ssl;
        #ssl_certificate ./../ssl/your_cert_file.cer;
        #ssl_certificate_key ./../ssl/your_cert_key.key;
        #ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
        #ssl_prefer_server_ciphers on;
        #ssl_session_cache shared:SSL:10m;
        #ssl_session_timeout 10m;
    }
    }
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dify-nginx
  namespace: dify
  labels:
    app: dify-nginx
spec:
  replicas: 1
  revisionHistoryLimit: 1
  selector:
    matchLabels:
      app: dify-nginx
  template:
    metadata:
      labels:
        app: dify-nginx
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      automountServiceAccountToken: false
      containers:
      - name: dify-nginx
        image: nginx:stable
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 50m
            memory: 128Mi
          limits:
            cpu: 500m
            memory: 1Gi
        ports:
        - containerPort: 80
        volumeMounts:
        - name: dify-nginx
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
        - name: dify-nginx-config
          mountPath: /etc/nginx/conf.d
        imagePullPolicy: IfNotPresent
      volumes:
      - name: dify-nginx
        configMap:
          name: dify-nginx
      # Persistent volume could be better
      - name: dify-nginx-config
        emptyDir: {}
---
kind: Service
apiVersion: v1
metadata:
  name: dify-nginx
  namespace: dify
spec:
  selector:
    app: dify-nginx
type: ClusterIP
  ports:
  - name: dify-nginx
    port: 80
    targetPort: 80

# ---
kind: Service
apiVersion: v1
metadata:
  name: dify-nginx-nodeport
  namespace: dify
spec:
  selector:
    app: dify-nginx
type: NodePort
  ports:
  - name: dify-nginx
    port: 80
    targetPort: 80
    nodePort: 30000
# Dify Nginx Server End

# Dify plugin daemon Start

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dify-plugin-daemon
  namespace: dify
  labels:
    app: dify-plugin-daemon
spec:
  replicas: 1
  revisionHistoryLimit: 1
  selector:
    matchLabels:
      app: dify-plugin-daemon
  template:
    metadata:
      labels:
        app: dify-plugin-daemon
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      automountServiceAccountToken: false
      volumes:
      - name: dify-plugin-daemon-storage
        hostPath:
          path: /root/k8s/dify/app/plugin/storage
          type: DirectoryOrCreate
      containers:
      - name: dify-plugin-daemon
        image: langgenius/dify-plugin-daemon:0.3.0-local
        imagePullPolicy: IfNotPresent
        resources:
          limits:
            memory: "1024Mi"
            cpu: "2000m"
          requests:
            memory: "256Mi"
            cpu: "500m"
        ports:
        - containerPort: 5003
          protocol: TCP
          name: debug-port
          
        - containerPort: 5002
          protocol: TCP
          name: service-port
        env:
          - name: DB_USERNAME
            value: postgres

          - name: DB_PASSWORD
            value: difyai123456

          - name: DB_HOST
            value: dify-postgres

          - name: DB_PORT
            value: '5432'

          - name: REDIS_HOST
            value: dify-redis

          - name: REDIS_PORT
            value: '6379'

          - name: REDIS_USERNAME
            value: ''

          - name: REDIS_PASSWORD
            value: difyai123456
          - name: REDIS_USE_SSL
            value: "false"
          - name: REDIS_DB
            value: "0"
          - name: CELERY_BROKER_URL
            value: >-
              redis://$(REDIS_USERNAME):$(REDIS_PASSWORD)@$(REDIS_HOST):$(REDIS_PORT)/1
          - name: 'DB_DATABASE'
            value: 'dify_plugin'
          - name: 'SERVER_PORT'
            value: '5002'
          - name: 'EXPOSE_PLUGIN_DAEMON_PORT'
            value: '5002'
          - name: 'SERVER_KEY'
            value: 'lYkiYYT6owG+71oLerGzA7GXCgOT++6ovaezWAjpCjf+Sjc3ZtU+qUEi'
          - name: 'MAX_PLUGIN_PACKAGE_SIZE'
            value: '52428800'
          - name: 'PPROF_ENABLED'
            value: 'false'
          - name: 'DIFY_INNER_API_URL'
            value: 'http://dify-api:5001'
          - name: 'DIFY_INNER_API_KEY'
            value: 'QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1'
          - name: 'PLUGIN_REMOTE_INSTALLING_HOST'
            value: '0.0.0.0'
          - name: 'PLUGIN_REMOTE_INSTALLING_PORT'
            value: '5003'
          - name: 'PLUGIN_WORKING_PATH'
            value: '/app/storage/cwd'
          - name: 'FORCE_VERIFYING_SIGNATURE'
            value: 'true'
          - name: 'EXPOSE_PLUGIN_DEBUGGING_HOST'
            value: 'localhost'
          - name: 'EXPOSE_PLUGIN_DEBUGGING_PORT'
            value: '5003'
          # - name: 'ENDPOINT_URL_TEMPLATE'
          #   value: 'http://localhost/e/{hook_id}'
        volumeMounts:
        - name: dify-plugin-daemon-storage
          mountPath: /app/storage

---
apiVersion: v1
kind: Service
metadata:
  name: dify-plugin-daemon
  namespace: dify
spec:
type: ClusterIP
  selector:
    app: dify-plugin-daemon
  ports:
  - port: 5003
    targetPort: 5003
    protocol: TCP
    name: debug-port
  - port: 5002
    targetPort: 5002
    protocol: TCP
    name: service-port

# Dify Plugin Daemon End
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

🚀 新功能

基础设施与 DevOps:

  • • Next.js 升级到 15.5,在开发模式中启用 Turbopack,为构建流程带来更快、更现代化的体验。
  • • 在市场 API 访问中提供 X-Dify-Version 响应头,用于更好的可追溯性。
  • • 改进安全问题报告流程,新增安全报告工作流。

流水线与引擎:

  • • 内置的流水线模板现已支持语言配置,实现多语言部署能力。
  • • 图引擎在流式传输过程中会阻止响应节点,避免出现非预期输出。

社区与文档:

  • • 精简 AGENTS.md 的贡献指南。
  • • 更新图引擎 README 文档以提高清晰度。

🛠 修复与改进

调试与日志:

  • • 修复图引擎中 NodeRunRetryEvent 调试日志无效的问题。
  • • 修复 LLM 节点在并行迭代时丢失 Flask 上下文的问题,确保并发运行稳定性。
  • • 修复 agent-strategy 提示生成器错误。

搜索与解析:

  • • 修复 full_text_search 名称的稳定性问题。
  • • 修复在搜索输入字段的 IME 输入法组合中提取值的处理问题。
  • • 补充并解释 OceanBase 解析器选择的说明。

流水线与工作流:

  • • 修复工作流变量拆分逻辑(必须至少包含两个部分)。
  • • 修复工具节点属性 tool_node_version 判断错误引发的兼容性问题。
  • • 修复迭代会话变量不同步的问题。
  • • 修复检索模型为 null 时知识库节点崩溃的问题。
  • • 修复工作流节点属性被错误更改的问题,防止节点属性被意外修改。
  • • 移除添加工作流节点的限制。

文件处理:

  • • 修复远程文件名解析,使 Content-Disposition: inline 能正确为 inline。
  • • 同步 FileUploader 的上下文与属性,解决缓存变量视图中的文件参数不一致问题。
  • • 修复 “变量未找到” 错误。
  • • 修复 embed_documents() 中数据库连接错误。
  • • 修复更改凭证时模型列表不刷新的问题。
  • • 修复数据集组件中检索配置处理不当和缺失 vector_setting 的问题。
  • • 修复 ChatClient audio_to_text 文件关键词错误的问题。
  • • 补充 client.py 中缺失的 IO 引入。
  • • 默认 .yaml 配置中移除了 FILES_URL 设置。

性能与网络:

  • • 改进 httpx 客户端池化,用于代码沙箱请求并增加 SSRF 防护。
  • • 分布式插件自动升级任务支持并发控制。
  • • 插件自动升级缓存切换到 Redis,提高稳定性。
  • • 修复在插件数量超过 100 时插件详情面板不显示的问题。
  • • 优化防抖引用以提升性能稳定性。

UI/UX 与显示:

  • • 修复悬留的显示问题(翻译、界面一致性)。
  • • 修复在 Turbopack 下 CSS 动画失效的问题,为 CSS 模块中的未命名动画加上名称。
  • • 修复验证码输入框使用错误的 maxLength 属性。
  • • 修复列表操作器选择器中仅数组过滤的问题,移除 file-children 兜底方案并统一子类型。
  • • 修复日语 ja-JP 本地化中“ナレッジベース”与“ナレッジの名前とアイコン”翻译不一致的问题。
  • • 改进“距现在时间”的国际化支持。
  • • 标准化数据集-流水线的国际化术语。

代码与组件:

  • • 重构组件导出实现一致性。
  • • 重构路由以应用 ns.route 风格。
  • • 重构 lint 脚本,删除重复部分并简化命名。
  • • 为 RAG 流水线控制器应用 @console_ns.route 装饰器(内部重构)。
  • • 在组件中新增缺失的 type="button" 属性。

升级指南

Docker Compose 部署:

  1. 1. 备份自定义的 docker-compose YAML 文件(可选) .
代码语言:javascript
复制
cd docker
cp docker-compose.yaml docker-compose.yaml.$(date +%s).bak
  1. 2. 从 main 分支获取最新代码 .
代码语言:javascript
复制
git checkout main
git pull origin main
  1. 3. 停止服务(在 docker 目录执行) .
代码语言:javascript
复制
docker compose down
  1. 4. 备份数据 .
代码语言:javascript
复制
tar -cvf volumes-$(date +%s).tgz volumes
  1. 5. 升级服务 .
代码语言:javascript
复制
docker compose up -d

源码部署:

  1. 1. 停止 API 服务器、Worker 和 Web 前端服务器。
  2. 2. 从 release 分支获取最新代码: .
代码语言:javascript
复制
git checkout 1.9.1
  1. 3. 更新 Python 依赖: .
代码语言:javascript
复制
cd api
uv sync
  1. 4. 运行数据库迁移脚本: .
代码语言:javascript
复制
uv run flask db upgrade
  1. 5. 重新运行 API 服务器、Worker 和 Web 前端服务器。

更新内容

  • • 修复 API 中图引擎的 NodeRunRetryEvent 调试日志无效的问题。
  • • 修复 full_text_search 名称问题。
  • • 将 Next.js 升级到 15.5,并在开发模式启用 Turbopack。
  • • 重构组件导出以保持一致性。
  • • 增加 OceanBase 解析器选择的说明。
  • • 为内置流水线模板添加语言支持,并更新相关组件。
  • • 在构建推送工作流触发器中新增 hotfix/** 分支支持。
  • • 修复 API 输出映射中 list[File] 类型值被截断的问题。
  • • 增加 Session 示例。
  • • 修复 API 中 LLM 节点在并行迭代时丢失 Flask 上下文的问题。
  • • 修复搜索输入框在组合结束处理中的值提取问题。
  • • 删除 end_user 检查逻辑。
  • • 改进 HTTPX 客户端池化,用于代码沙箱请求并增加 SSRF 防护。
  • • 修复远程文件名解析,使 Content-Disposition 为 inline 时保持正确。
  • • 为市场 API 访问提供 X-Dify-Version 版本信息。
  • • 移除工作流中添加节点的限制。
  • • 修复列表操作器选择器中仅数组过滤的问题,移除文件子节点兜底策略并统一子类型。
  • • 同步 FileUploader 上下文与属性,修复缓存变量视图中文件参数状态不一致的问题。
  • • 修复 ESM 模式下 echarts 和 zrender 的兼容性。
  • • 修复日语翻译文本不准确的问题。
  • • 统一阿里云追踪的 span 属性,并兼容 CMS 2.0 端点。
  • • 修复 agent-strategy 提示生成器错误。
  • • 修复日语翻译中「ナレッジの名前とアイコン」与「ナレッジベース」不一致的问题。
  • • 重构 Web 端 lint 脚本,删除重复并统一命名。
  • • 修复默认用户会话查找时 UUID 解析错误。
  • • 修复节点属性被错误修改的问题。
  • • 更新阿里云追踪的 gen_ai 语义约定。
  • • 精简 AGENTS.md 指南内容。
  • • 移除未使用变量。
  • • 新增安全报告功能。
  • • 修复 ChatClient audio_to_text 文件关键词错误。
  • • 优化插件自动升级任务的并发分发。
  • • 修复工具节点属性 tool_node_version 判断错误导致的兼容性问题。
  • • 重构路由以应用 ns.route 风格。
  • • 修复部分显示相关问题。
  • • 改进“距现在时间”国际化支持。
  • • 修复并更新图引擎 README 文档。
  • • 在组件中添加缺失的 type="button" 属性。
  • • 修复验证码输入框使用错误的 maxLength。
  • • 修复 embed_documents() 数据库连接错误。
  • • 标准化数据集-流水线的国际化术语。
  • • 修复工作流变量拆分判断逻辑。
  • • 图引擎在流式传输时阻止响应节点。
  • • 知识库节点在 retrieval_model 为 null 时修复崩溃问题。
  • • 插件自动升级缓存切换到 Redis。
  • • 修复安装插件超过 100 个时插件详情面板不显示的问题。
  • • 修复在 Turbopack 下 CSS 模块中未命名动画的播放问题。
  • • 升级依赖 oracledb 到 3.3.0。
  • • 升级依赖 cos-python-sdk-v5 到 1.9.38。
  • • 升级依赖 @testing-library/jest-dom 到 6.8.0。
  • • 升级依赖 @eslint/js 到 9.36.0。
  • • 补充 client.py 中缺失的 IO 引用。
  • • 修复更改凭证时模型列表不刷新的问题。
  • • 移除默认 .yaml 设置中的 FILES_URL。
  • • 修复数据集组件中检索配置处理问题。
  • • 修复数据集 API 类型错误问题。
  • • 修复 vector_setting 不存在的错误。
  • • 修复防抖引用问题。
  • • 修复变量不存在的错误。
  • • 修复工作流迭代会话变量不同步的问题。
  • • 移除 pyrightconfig.json 中的 core/tools 并修复类型错误。
  • • 增强 Python SDK,增加 27 个新的 Service API 接口。
  • • 移除 pyright exclude 中的 libs,并修复类型错误。
  • • 更新版本号引用至 1.9.1。

🔍 总结

Dify 1.9.1不仅是一个功能改进版本,更是一个值得铭记的里程碑版本。在保持性能优化和用户体验提升的同时,它为多语言部署、插件管理、文件处理和工作流等核心功能提供了更稳定和可扩展的支持。

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-09-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • k3s安装dify1.9.1:
  • 🚀 新功能
    • 基础设施与 DevOps:
    • 流水线与引擎:
    • 社区与文档:
  • 🛠 修复与改进
    • 调试与日志:
    • 搜索与解析:
    • 流水线与工作流:
    • 文件处理:
    • 性能与网络:
    • UI/UX 与显示:
    • 代码与组件:
  • 升级指南
    • Docker Compose 部署:
    • 源码部署:
  • 更新内容
  • 🔍 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档