Dify-1.16.0で新型エージェントを動かしたい人へ

Artificial Intelligence

新しいコンテナが2種類ほど増える。

Dify-1.16.0が出ました。以前から取り組んでたようなのですが、とうとう新しいエージェント機構が生まれたようです。そのために、2つほど新しいコンテナが誕生しています。

  • docker-local_sandbox
  • docker-agent_backend

これらのコンテナと連携するのは api と worker です。

docker-compose.yaml の変更

よって、docker-compose.yaml に対して以下の設定が必要です。

agent_backend の追加

  # Dify Agent backend service.
  agent_backend:
    image: langgenius/dify-agent-backend:1.16.0
    restart: always
    env_file:
      - path: ./envs/core-services/dify-agent.env
        required: false
      - path: ./envs/security.env
        required: false
      - path: ./envs/databases/redis.env
        required: false
      - ./.env
    environment:
      DIFY_AGENT_REDIS_URL: ${DIFY_AGENT_REDIS_URL:-redis://:${REDIS_PASSWORD:-difyai123456}@redis:6379/2}
      DIFY_AGENT_REDIS_PREFIX: ${DIFY_AGENT_REDIS_PREFIX:-dify-agent}
      DIFY_AGENT_PLUGIN_DAEMON_URL: ${DIFY_AGENT_PLUGIN_DAEMON_URL:-${PLUGIN_DAEMON_URL:-http://plugin_daemon:5002}}
      DIFY_AGENT_PLUGIN_DAEMON_API_KEY: ${DIFY_AGENT_PLUGIN_DAEMON_API_KEY:-${PLUGIN_DAEMON_KEY:-lYkiYYT6owG+71oLerGzA7GXCgOT++6ovaezWAjpCjf+Sjc3ZtU+qUEi}}
      DIFY_AGENT_INNER_API_URL: ${DIFY_AGENT_INNER_API_URL:-${PLUGIN_DIFY_INNER_API_URL:-http://api:5001}}
      DIFY_AGENT_INNER_API_KEY: ${DIFY_AGENT_INNER_API_KEY:-${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1}}
      DIFY_AGENT_SHELLCTL_ENTRYPOINT: ${DIFY_AGENT_SHELLCTL_ENTRYPOINT:-http://local_sandbox:5004}
      DIFY_AGENT_SHELLCTL_AUTH_TOKEN: ${DIFY_AGENT_SHELLCTL_AUTH_TOKEN:-}
      DIFY_AGENT_STUB_API_BASE_URL: ${DIFY_AGENT_STUB_API_BASE_URL:-http://agent_backend:5050/agent-stub}
      # This is security-sensitive: it derives the JWE encryption key for Agent Stub bearer tokens.
      # Replace this development default in production.
      # Generate one with: python -c 'import secrets; print(secrets.token_urlsafe(32))'
      DIFY_AGENT_SERVER_SECRET_KEY: ${DIFY_AGENT_SERVER_SECRET_KEY:-MDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWY}
      DIFY_AGENT_SHUTDOWN_GRACE_SECONDS: ${DIFY_AGENT_SHUTDOWN_GRACE_SECONDS:-30}
      DIFY_AGENT_RUN_RETENTION_SECONDS: ${DIFY_AGENT_RUN_RETENTION_SECONDS:-259200}
    depends_on:
      redis:
        condition: service_started
      plugin_daemon:
        condition: service_started
      local_sandbox:
        condition: service_started
    networks:
      - default

local_sandbox の追加

  # Local sandbox for Dify Agent shell workspaces.
  local_sandbox:
    image: langgenius/dify-agent-local-sandbox:1.16.0
    restart: always
    env_file:
      - path: ./envs/core-services/local-sandbox.env
        required: false
    environment:
      - SHELLCTL_AUTH_TOKEN=${DIFY_AGENT_SHELLCTL_AUTH_TOKEN:-}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:5004/healthz"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 10s
    networks:
      - default

apiに追加

42行目から47行目は既存設定を入れ替えました。

  # API service
  api:
    <<: *shared-api-worker-config
    image: langgenius/dify-api:1.16.0
    environment:
      MODE: api
      SENTRY_DSN: ${API_SENTRY_DSN:-}
      SENTRY_TRACES_SAMPLE_RATE: ${API_SENTRY_TRACES_SAMPLE_RATE:-1.0}
      SENTRY_PROFILES_SAMPLE_RATE: ${API_SENTRY_PROFILES_SAMPLE_RATE:-1.0}
      PLUGIN_REMOTE_INSTALL_HOST: ${EXPOSE_PLUGIN_DEBUGGING_HOST:-localhost}
      PLUGIN_REMOTE_INSTALL_PORT: ${EXPOSE_PLUGIN_DEBUGGING_PORT:-5003}
      PLUGIN_MAX_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800}
      PLUGIN_DAEMON_TIMEOUT: ${PLUGIN_DAEMON_TIMEOUT:-600.0}
      INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1}
      AGENT_BACKEND_BASE_URL: ${AGENT_BACKEND_BASE_URL:-http://agent_backend:5050}
      AGENT_BACKEND_STREAM_READ_TIMEOUT_SECONDS: ${AGENT_BACKEND_STREAM_READ_TIMEOUT_SECONDS:-30}
      AGENT_BACKEND_STREAM_MAX_RECONNECTS: ${AGENT_BACKEND_STREAM_MAX_RECONNECTS:-3}
      AGENT_BACKEND_RUN_TIMEOUT_SECONDS: ${AGENT_BACKEND_RUN_TIMEOUT_SECONDS:-1200}
    depends_on:
      init_permissions:
        condition: service_completed_successfully
      db_postgres:
        condition: service_healthy
        required: false
      db_mysql:
        condition: service_healthy
        required: false
      oceanbase:
        condition: service_healthy
        required: false
      seekdb:
        condition: service_healthy
        required: false
      redis:
        condition: service_started
      agent_backend:
        condition: service_started
    volumes:
      # Mount the storage directory to the container, for storing user files.
      - ./volumes/app/storage:/app/api/storage
    healthcheck:
      test: ["CMD-SHELL", "celery -A celery_healthcheck.celery inspect ping"]
      interval: ${COMPOSE_WORKER_HEALTHCHECK_INTERVAL:-30s}
      timeout: ${COMPOSE_WORKER_HEALTHCHECK_TIMEOUT:-30s}
      retries: 3
      start_period: 60s
      disable: ${COMPOSE_WORKER_HEALTHCHECK_DISABLED:-true}
    networks:
      - ssrf_proxy_network
      - default

workerに追加

  # worker service
  # The Celery worker for processing all queues (dataset, workflow, mail, etc.)
  worker:
    <<: *shared-worker-config
    image: langgenius/dify-api:1.16.0
    environment:
      MODE: worker
      SENTRY_DSN: ${API_SENTRY_DSN:-}
      SENTRY_TRACES_SAMPLE_RATE: ${API_SENTRY_TRACES_SAMPLE_RATE:-1.0}
      SENTRY_PROFILES_SAMPLE_RATE: ${API_SENTRY_PROFILES_SAMPLE_RATE:-1.0}
      PLUGIN_MAX_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800}
      INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1}
      AGENT_BACKEND_BASE_URL: ${AGENT_BACKEND_BASE_URL:-http://agent_backend:5050}
      AGENT_BACKEND_STREAM_READ_TIMEOUT_SECONDS: ${AGENT_BACKEND_STREAM_READ_TIMEOUT_SECONDS:-30}
      AGENT_BACKEND_STREAM_MAX_RECONNECTS: ${AGENT_BACKEND_STREAM_MAX_RECONNECTS:-3}
      AGENT_BACKEND_RUN_TIMEOUT_SECONDS: ${AGENT_BACKEND_RUN_TIMEOUT_SECONDS:-1200}
    depends_on:
      init_permissions:
        condition: service_completed_successfully
      db_postgres:
        condition: service_healthy
        required: false
      db_mysql:
        condition: service_healthy
        required: false
      oceanbase:
        condition: service_healthy
        required: false
      seekdb:
        condition: service_healthy
        required: false
      redis:
        condition: service_started
      agent_backend:
        condition: service_started
    volumes:
      # Mount the storage directory to the container, for storing user files.
      - ./volumes/app/storage:/app/api/storage
    healthcheck:
      test: ["CMD-SHELL", "celery -A celery_healthcheck.celery inspect ping"]
      interval: ${COMPOSE_WORKER_HEALTHCHECK_INTERVAL:-30s}
      timeout: ${COMPOSE_WORKER_HEALTHCHECK_TIMEOUT:-30s}
      retries: 3
      start_period: 60s
      disable: ${COMPOSE_WORKER_HEALTHCHECK_DISABLED:-true}
    networks:
      - ssrf_proxy_network
      - default

環境変数の追加

以下の設定追加が必要です。なお、単純に探索してるだけではわかりませんでしたが、最後の NEXT_PUBLIC_ENABLE_AGENT_V2 を true に設定することも必須要素になります。これを実行しない場合は、旧エージェントモードで動作することになります。

# Dify Agent backend
AGENT_BACKEND_BASE_URL=http://agent_backend:5050
AGENT_BACKEND_STREAM_READ_TIMEOUT_SECONDS=30
AGENT_BACKEND_STREAM_MAX_RECONNECTS=3
AGENT_BACKEND_RUN_TIMEOUT_SECONDS=1200
# Leave empty to derive from REDIS_PASSWORD.
DIFY_AGENT_REDIS_URL=
DIFY_AGENT_REDIS_PREFIX=dify-agent
DIFY_AGENT_SHUTDOWN_GRACE_SECONDS=30
DIFY_AGENT_RUN_RETENTION_SECONDS=259200
# Leave empty to derive from PLUGIN_DAEMON_URL and PLUGIN_DAEMON_KEY.
DIFY_AGENT_PLUGIN_DAEMON_URL=
DIFY_AGENT_PLUGIN_DAEMON_API_KEY=
# Leave empty to derive from PLUGIN_DIFY_INNER_API_URL and PLUGIN_DIFY_INNER_API_KEY.
# DIFY_AGENT_INNER_API_KEY must match API/worker INNER_API_KEY_FOR_PLUGIN, not INNER_API_KEY.
DIFY_AGENT_INNER_API_URL=
DIFY_AGENT_INNER_API_KEY=
DIFY_AGENT_SHELLCTL_ENTRYPOINT=http://local_sandbox:5004
DIFY_AGENT_SHELLCTL_AUTH_TOKEN=
DIFY_AGENT_STUB_API_BASE_URL=http://agent_backend:5050/agent-stub
# This is security-sensitive: it derives the JWE encryption key for Agent Stub bearer tokens.
# Replace this development default in production.
# Generate one with: python -c 'import secrets; print(secrets.token_urlsafe(32))'
DIFY_AGENT_SERVER_SECRET_KEY=MDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWY

NEXT_PUBLIC_ENABLE_AGENT_V2=true

何が変わったか?

以下画面の左側メニューを見てください。スタジオとナレッジの間に「Agents(ベータ版)」という表記が追加されました。

これをクリックするとエージェント作成用スタジオがお目見えするようです。

作成をクリックするとこんな風にメニューが出ます。作成したエージェントは、DSLフォーマットで他のサーバにも適用できるようになってるみたいです。

デフォルトのくまさんがかわいいっすねぇ∑d=(´∀`*)グッ

作成すると以下のように設定が開始されまして、新しいエージェントの仕組みに従い、設定していくことになるようです。要は、いろいろ使いまわしがきくようになり、加えてSkillsにも対応したということで、エージェントの仕組みはよりつぶしが効くようになりそうです。

従来のエージェントの扱いはどう変わったか?

既存のエージェントアプリのオーケストレーション画面を開いてみると、以下のように【レガシーAGENT】という表示が出て、「非推奨となっている」という旨のメッセージが確認できました。今後、この形式のエージェントは消えていくことになるのでしょう。

ワークフローへの影響はそれなりにあります。なんと以前の方式でのエージェントブロックを新規で用意することができなくなりました。完全にこちらはAgent側に舵を切ったようです。

慎重な選択をお勧めします。

後方互換をかなり限定する形で新しいAgentロジックが生まれました。新しい仕組みに乗り換えるのはいずれ必要になると思われますが、これにより、旧エージェントアプリはともかく、ワークフロー、チャットフローアプリに対してはかなり厳しい制約がかかることになるため、いきなりぱっと切り替えられるのはなかなか難しいものがあろうかと思います。

ですが、仕組みまではあらかじめ整備して起き、NEXT_PUBLIC_ENABLE_AGENT_V2の変更をもって機能を眠らせ、準備が整ったところで新型に切り替えるというのもまた一つのやり方かなと思います。特にアーキテクチャ変更はここ最近のバージョンでは頻繁に発生しています。一気にやり替えるのは SQL Alchemy の性質から見てもあまり積極的にやるには難しい(バージョンを隔てた更新も順序はあれど一気に行ってしまう点など)ところがあるかなと思いますので、それを踏まえたうえでの移行計画を立てて移行させたほうが良いかなと思います。

コメント

タイトルとURLをコピーしました