커서를 사용한 Dify 플러그인 개발을 위한 팁
개발하는 데 도움을 줄 수 있는 선임 개발자입니다. Dify 인공지능 에이전트 개발 도구인 Dify에서 사용할 수 있는 인공지능 에이전트 도구인 플러그인 도구에 대해 설명합니다. 아래 안내에 따라 { }라는 이름의 플러그인 도구 { }. 이 도구의 작성자는 { }입니다. 이 도구의 작성자는 { }입니다. 이 도구는 { }의 기능을 가져야 합니다. 기존 프로젝트 폴더인 { } 및 파일 구조를 기반으로 편집하고 있는지 확인하세요. 가장 중요한 것은 yaml 파일의 들여쓰기 및 가장 중요한 것은 yaml 파일의 들여쓰기 및 서식은 yaml 파일의 예시를 엄격하게 따라야 한다는 것입니다. 플러그인 도구가 준비되면 venv를 설정하고 플러그인 아래에 모든 요구 사항을 설치합니다. 플러그인 도구가 준비되면 venv를 설정하고 플러그인 디렉터리 아래에 모든 요구 사항을 설치합니다. 지침에서 변경하라고 지시한 파일만 변경해야 합니다. 다른 파일은 변경하지 마세요(예: env.example 파일 .
적용하기 전에 {툴의 API 액세스 문서를 읽고}/{툴의 기능이 무엇인지 이해합니다. 도구의 입력은 무엇이고, 어떤 기능을 가지고 있으며, 어떤 출력을 가져오는지}를 이해하세요.
Dify 플러그인 도구의 스캐폴드는 아래와 같으며, 다음 지침에 따라 도구를 빌드해야 합니다.
your_plugin/ ├── _assets/ # 마켓플레이스 목록에 사용되는 시각적 에셋용 디렉토리 │ └── icon.svg # Dify에 표시되는 플러그인 아이콘 마켓플레이스 UI │ ├── provider/ # 인증 구성 및 유효성 검사 │ ├── your_plugin.py # ToolProvider에서 상속하는 클래스, 자격 증명 유효성 검사 │ ├── your_plugin.py # ToolProvider에서 상속하는 클래스. 자격 증명 유효성 검사 │ └── your_plugin.yaml # 인증 UI 필드, 레이블 및 도움말 텍스트 구성 │ ├── tools/ # 도구 구현 파일 │ ├── your_plugin.py your_plugin.py # 도구에서 상속하는 클래스, API 기능 구현 │ └── your_plugin.yaml # 도구 매개변수, 설명을 정의합니다. 마켓플레이스에 게시할 때 제외할 파일 목록 │ ├── .difftyignore # 환경용 템플릿 │ ├── .env.example # 환경용 템플릿 테스트에 필요한 변수 │ # REMOTE_INSTALL_KEY 플레이스홀더 포함 │ ├── .gitignore # 버전 관리를 위한 표준 Git 무시 파일 │ ├── [ GUIDE.md]() # 마켓플레이스에서 사용자에게 표시되는 자세한 사용 지침 │ ├── [main.py]() # 파이썬 -m 메인 테스트를 통한 로컬 테스트를 위한 엔트리 포인트 # 일반적으로 수정해서는 안 되는 사항 │ ├── manifest.yaml # 마켓플레이스 리스팅을 위한 핵심 메타데이터: │ # - 버전 번호 │ # - 호환성 정보 │ # - 플러그인 기능 │ # - 마켓플레이스 분류 │ ├── [PRIVACY.md]() # 마켓플레이스에 표시되는 개인정보처리방침 │ ├── [README .md]() # 개발자를 위한 일반 문서 및 개요 │ └── requirements.txt # 플러그인에 필요한 Python 패키지 종속성
1. 매니페스트.yaml 편집 방법
Dify 플러그인에 대한 manifest.yaml 파일을 생성해야 합니다. 이 파일은 Dify 마켓플레이스의 전체 플러그인을 설명하는 중앙 구성 파일입니다. 이 파일은 Dify 마켓플레이스용 전체 플러그인을 설명하는 중앙 구성 파일입니다. 이 파일을 만드는 과정을 안내하면서 마켓플레이스에서 플러그인의 모양에 영향을 주는 부분을 설명해 드리겠습니다.
파일 용도
manifest.yaml 파일은 플러그인의 기본 구성 파일로 사용되며, 다음과 같이 정의합니다.
마켓플레이스에 표시되는 기본 플러그인 정보
버전 및 리소스 요구 사항
플러그인에 필요한 권한
도구 제공업체에 대한 참조
구현 예(Dropbox)
Dropbox 도구의 매니페스트.yaml 파일은 다음과 같습니다.
버전: 0.0.1
유형: 플러그인
저자: 랑지니어스
이름: 드롭박스
라벨.
en_US: Dropbox
ja_JP: Dropbox
zh_Hans: Dropbox
pt_BR: Dropbox
zh_Hant: Dropbox
설명.
en_US: Dropbox 파일 및 폴더와 상호 작용합니다. 파일을 나열, 검색, 업로드, 다운로드 및 관리할 수 있습니다.
ja_JP: Dropbox의 파일과 폴더를 조작합니다. 파일 목록, 검색, 앱, 다운로드 및 관리가 가능합니다.
zh_Hans: Dropbox 파일 및 폴더와 상호 작용합니다. 파일을 나열하고, 검색하고, 업로드하고, 다운로드하고, 관리할 수 있습니다.
pt_BR: Dropbox의 파일 및 폴더와 연결됩니다. 파일을 보고, 검색하고, 업로드하고, 다운로드하고, 관리할 수 있습니다.
zh_Hant: Dropbox 파일 및 폴더와 상호 작용합니다. 파일을 나열, 검색, 업로드, 다운로드, 관리할 수 있습니다.
아이콘: icon.svg
리소스입니다.
메모리: 268435456
권한을 부여합니다.
도구.
활성화됨: true
모델입니다.
활성화됨: true
llm: true
text_embedding: false
재순위: false
tts: false
speech2text: false
적당히: 거짓
스토리지.
활성화됨: true
크기: 1048576
플러그인.
도구.
- 공급자/dropbox.yaml
메타.
버전: 0.0.1
아치.
- amd64
- arm64
러너.
언어: 파이썬
버전: "3.12"
진입점: 메인
created_at: 2025-04-03T17:41:08.159756+08:00
개인정보 보호: PRIVACY.md
마켓플레이스 디스플레이에 영향을 미치는 주요 구성 요소
기본 정보(플러그인 목록에 표시됨).
버전: 플러그인의 버전 번호
작성자: 마켓플레이스에 표시되는 조직 이름
이름: 플러그인의 내부 이름
레이블: 다른 언어로 이름 표시
created_at: RFC3339 형식의 생성 시간(과거여야 함)
아이콘: 플러그인 아이콘의 경로
설명: 다른 언어로 된 전체 설명
태그: 플러그인의 카테고리. 한 번에 하나의 태그만 설정할 수 있습니다. (현재 태그에는 검색', '이미지', '비디오', '날씨', '금융', '디자인', '. 여행', '소셜', '뉴스', '의료', '생산성', '교육', '비즈니스', '엔터테인먼트', '유틸리티' 또는 '기타').
리소스 요구 사항(요구 사항 섹션에 표시됨).
resource.memory: 최대 메모리 사용량(바이트)(예: 1048576 = 1MB)
resource.permission: 플러그인에 필요한 권한
플러그인 참조.
plugins.tools: 공급자 YAML 파일 경로
마켓플레이스 영향력
제공하신 마켓플레이스 스크린샷을 보면 이러한 필드가 어떻게 표시되는지 확인할 수 있습니다.
플러그인 이름, 아이콘 및 설명이 상단에 표시됩니다.
작성자 이름과 버전 번호는 설명 아래에 표시됩니다.
태그는 '태그' 섹션에 표시됩니다.
메모리 요구 사항은 '요구 사항' 섹션에 표시됩니다.
중요 참고 사항
특히 대부분의 필드는 템플릿에서 처음에 구성한 대로 그대로 둘 수 있습니다.
유형: "플러그인"으로 유지
메타 섹션: 기본값 유지
resource.permission: 플러그인에 특정 권한이 필요한 경우에만 변경합니다.
사용자 지정해야 하는 필드입니다.
버전: 플러그인의 버전 번호
작성자: 조직 이름
이름: 플러그인의 고유 식별자
레이블: 다른 언어로 표시되는 이름
설명: 플러그인의 기능에 대한 명확한 설명
태그: 플러그인 관련 카테고리
plugins.tools: 공급자 YAML 파일 경로
자신만의 매니페스트.yaml 파일을 만들려면 템플릿으로 시작하여 마켓플레이스에서 플러그인이 표시되는 방식에 영향을 주는 필드를 사용자 정의합니다. 핵심은 다음과 같습니다. 를 사용하여 사용자가 플러그인의 기능을 이해하는 데 도움이 되는 명확하고 간결한 정보를 제공하는 것입니다. 그러나 이 모든 것을 말했듯이 모든 것이 설정되어 있는 동안에는 항상 매니페스트 파일은 초기화하는 동안 모든 것이 설정되므로 항상 그대로 두어야 합니다.
2. 공급자/귀하의_플러그인.yaml 편집 방법
Dify 플러그인을 위한 공급자 구성 YAML 파일을 만들어야 합니다. 이 파일은 서비스에 필요한 자격 증명과 그 방법을 정의합니다. Google 검색을 예로 들어 이 파일을 만드는 과정을 단계별로 안내해드리겠습니다.
파일 용도
공급자 YAML 파일(your_plugin.yaml)이 정의합니다.
사용자가 서비스를 이용하기 위해 제공해야 하는 자격 증명
이러한 자격 증명이 수집되고 UI에 표시되는 방법
플러그인에 포함된 도구
이러한 자격 증명의 유효성을 검사하는 Python 파일
필수 구성 요소
ID 섹션: 플러그인의 기본 메타데이터(필수 항목이지만 마켓플레이스 모양에는 영향을 미치지 않음)
credentials_for_provider 섹션: 사용자가 제공해야 하는 인증 자격 증명을 정의합니다.
도구 섹션: 어떤 도구 구성 파일이 포함되어 있는지 나열합니다.
추가 섹션: 자격 증명 유효성 검사에 사용되는 Python 파일을 지정합니다.
구현 예시
Dropbox 도구용 공급자 YAML 파일의 모양은 다음과 같습니다.
신원.
작성자: lcandy
이름: 드롭박스
라벨.
en_US: Dropbox
zh_Hans: Dropbox
pt_BR: Dropbox
ja_JP: Dropbox
zh_Hant: Dropbox
설명.
en_US: Dropbox 파일 및 폴더와 상호 작용하기
zh_Hans: Dropbox 파일 및 폴더와 상호 작용하기
pt_BR: Dropbox 파일 및 폴더 간 공유
ja_jp: Dropbox의 파일과 폴더를 작동합니다.
zh_Hant: Dropbox 파일 및 폴더와 상호 작용하기
아이콘: icon.svg
credentials_for_provider.
access_token.
유형: 비밀 입력
필수: true
라벨.
en_US: 액세스 토큰
zh_Hans: 액세스 토큰
pt_BR: 토큰 데 액세스
ja_jp: 어쿠스틱 스토커
zh_Hant: 홀에 대한 액세스 권한
플레이스홀더.
en_US: Dropbox 액세스 토큰을 입력하세요.
zh_Hans: Dropbox 액세스 토큰을 입력하세요!
pt_BR: Dropbox 액세스 토큰을 입력해 주세요.
ja_jp: Dropbox アクセストークンを入力してください
zh_Hant: Dropbox 액세스 키를 입력하세요.
도움말.
en_US: Dropbox 앱 콘솔에서 액세스 토큰 가져오기
zh_Hans: Dropbox 앱 콘솔에서 액세스 토큰 가져오기
pt_BR: Dropbox 앱 콘솔에서 액세스 토큰을 받습니다.
ja_JP: Dropbox アプリコンソルからアクセストークを取得してください
zh_Hant: Dropbox 앱 콘솔에서 액세스 스틱을 받으세요.
URL.
도구.
- 도구/목록_파일.yaml
- tools/search_files.yaml
- 도구/업로드_파일.yaml
- 도구/다운로드_파일.yaml
- tools/create_folder.yaml
- tools/delete_file.yaml
추가.
python.
출처: provider/dropbox.py
기억해야 할 핵심 사항
신원 섹션: 마켓플레이스에는 영향을 미치지 않지만 파일 구조에는 여전히 필요합니다. 이름, 작성자, 설명과 같은 기본 정보를 포함합니다. 태그는 manifest.yaml 파일에서 상속해야 합니다.
자격증명 섹션.
각 자격증명에는 고유 식별자(예: Dropbox 액세스 토큰)가 필요합니다.
유형 옵션을 입력합니다.
비밀 입력: 암호화할 민감한 정보의 경우
텍스트 입력: 일반 텍스트 정보
선택: 드롭다운 선택의 경우
부울: 토글 스위치의 경우
도구 선택기: 도구 구성 객체의 경우
필수 포함: 참/거짓으로 자격 증명이 필수인지 여부를 나타냅니다.
사용자 친화적인 레이블, 자리 표시자 및 도움말 텍스트를 다양한 언어로 제공하세요.
URL 필드는 자격 증명을 얻기 위한 문서로 연결됩니다.
도구 섹션.
플러그인의 각 도구에 대한 YAML 파일을 나열합니다.
경로는 플러그인 루트를 기준으로 해야 합니다.
추가 섹션.
자격 증명의 유효성을 검사하는 Python 파일을 지정합니다.
이 파일은 "공급자/귀하의_플러그인.py"에 생성된 파일과 일치해야 합니다.
YAML 파일 만들기
이를 여러분의 서비스에 맞게 조정할 수 있습니다.
기본 플러그인 정보로 ID 섹션을 수정합니다.
credentials_for_provider 섹션에서 서비스에 필요한 자격 증명을 정의합니다.
도구 섹션에 도구 YAML 파일을 나열하세요.
추가 섹션에서 Python 유효성 검사 파일을 지정하세요.
이 YAML 파일은 파이썬 유효성 검사 파일과 함께 작동하며, 이 자격 증명을 사용하여 서비스를 인증합니다.
3. 공급자/귀하의_플러그인.py 편집 방법
Dify 플러그인을 위한 공급자 인증 파일을 만들어야 합니다. 이 파일은 타사에 액세스하는 데 필요한 자격 증명의 유효성을 검사합니다. Google 검색 API 연동을 예로 들어 이 파일을 만드는 과정을 안내해 드리겠습니다.
파일 용도
공급자 파이썬 파일(provider_name.py)은 Dify 플러그인의 인증 테스트 모듈 역할을 합니다. 이 파일의 주요 임무는 사용자가 제공한 자격 증명이 유효한지 테스트하는 것입니다. 서비스에 대한 간단한 API 호출을 통해 사용자가 제공한 자격 증명이 유효한지 테스트하는 것입니다.
필수 구성 요소
공급자 클래스는 반드시 dify_plugin을 상속해야 합니다.
validate_credentials 메서드를 구현해야 합니다.
오류 처리를 위해 ToolProviderCredentialValidationError를 사용해야 합니다.
작동 방식
인증 흐름은 다음 단계를 따릅니다.
사용자가 Dify UI에서 자격 증명을 입력합니다.
Dify는 이러한 자격 증명을 _validate_credentials 메서드에 전달합니다.
코드가 제공된 자격 증명을 사용하여 간단한 API 호출을 시도합니다.
성공하면 인증이 유효한 것이고, 그렇지 않으면 오류가 발생합니다.
구현 예시
Dropbox 도구용 공급자 파일을 구현하는 방법은 다음과 같습니다.
import Any를 입력하는 것에서
dify_plugin에서 도구 제공자 가져오기
dify_plugin.errors.tool.import에서 도구 공급자 자격 증명 유효성 검사 오류
Dropbox 가져오기
dropbox.exceptions에서 AuthError를 가져옵니다.
dropbox_utils에서 DropboxUtils 가져오기
DropboxProvider(도구 제공자) 클래스.
def _validate_credentials(self, credentials: dict[str, Any]) -> None.
시도해 보세요.
# 자격 증명에 액세스 토큰이 제공되었는지 확인합니다.
만약 "access_token"이 자격 증명에 없거나 credentials.get("access_token"):.
ToolProviderCredentialValidationError("Dropbox 액세스 토큰이 필요합니다.") 발생
# 액세스 토큰을 사용하여 Dropbox로 인증을 시도합니다.
시도해 보세요.
# 유틸리티 기능을 사용하여 클라이언트 가져오기
DropboxUtils.get_client(credentials.get("access_token"))
AuthError를 e로 제외합니다.
raise ToolProviderCredentialValidationError(f "잘못된 Dropbox 액세스 토큰: {str(e)}")
예외는 e로 제외합니다.
raise ToolProviderCredentialValidationError(f "Dropbox에 연결하지 못했습니다: {str(e)}")
예외는 e로 제외합니다.
도구 제공자 자격 증명 유효성 검사 오류(str(e)) 발생
기억해야 할 핵심 사항
항상 도구 클래스 사용: 공급자는 API 호출을 직접 수행하지 않고, from_credentials 메서드를 통해 도구 클래스를 사용합니다.
최소한의 테스트 쿼리 사용: 자격 증명이 작동하는지 확인할 수 있을 정도로만 유효성 검사 테스트를 단순하게 유지하세요.
적절한 오류 처리: 항상 유효성 검사를 시도/예외 블록으로 감싸고 모든 예외를 표준으로 변환하세요. ToolProviderCredentialValidationError로 변환하세요.
일반 자격증명 사전: 자격증명 매개변수에는 provider_name.yaml 파일에 정의된 모든 인증 매개변수가 포함되어 있습니다.
제너레이터 처리: 호출 메서드에서 반환된 제너레이터를 처리하는 데 사용되는 for _ in ... 구문을 사용하여 호출 메서드에서 반환된 제너레이터를 처리합니다.
도구/귀하의_플러그인.yaml 편집 방법 4.
Dify 플러그인을 위한 도구 구성 YAML 파일을 만들어야 합니다. 이 파일은 도구가 Dify 인터페이스에 표시되는 방식, 허용되는 매개변수 및 매개변수, 그리고 이러한 매개변수가 사용자와 AI 에이전트 모두에게 표시되는 방식을 정의합니다. 이 파일을 만드는 과정을 Google 검색을 예로 들어 이 파일을 만드는 방법을 안내해 드리겠습니다.
tools/your_plugin.yaml의 Yaml 스키마.
base64 가져오기
컨텍스트 라이브러리 가져오기
가져오기 UUID
collections.abc에서 매핑 가져오기
에서 Enum, StrEnum을 가져옵니다.
가져오기 모두, 선택 사항, 유니온을 입력하는 것에서
에서 가져 오기 (
BaseModel.
필드.
필드_직렬화기.
field_validator,
모델_검증자,
)
dify_plugin.core.utils.yaml_loader에서 load_yaml_파일을 가져옵니다.
diffy_plugin.entities에서 I18nObject를 가져옵니다.
from dify_plugin.entities.model.message.import PromptMessageTool
클래스 LogMetadata(str, Enum).
STARTED_AT = "STARTED_AT"
FINISHED_AT = "finished_at"
경과 시간 = "경과 시간"
총 가격 = "총_가격"
총_토큰 = "총_토큰"
공급자 = "공급자"
CURRENCY = "통화"
공통 파라미터 유형(Enum) 클래스.
SECRET_INPUT = "비밀 입력"
TEXT_INPUT = "텍스트 입력"
SELECT = "선택"
문자열 = "문자열"
NUMBER = "숫자"
FILE = "파일"
FILES = "파일"
BOOLEAN = "부울"
앱 셀렉터 = "앱 셀렉터"
MODEL_SELECTOR = "모델 선택기"
# TOOL_SELECTOR = "도구 선택기"
TOOLS_SELECTOR = "array[tools]"
클래스 AppSelectorScope(Enum).
ALL = "모두"
CHAT = "채팅"
워크플로 = "워크플로우"
완료 = "완료"
모델 컨피그 스코프(Enum) 클래스.
LLM = "llm"
텍스트 임베딩 = "텍스트 임베딩"
RERANK = "재랭크"
TTS = "tts"
SPEECH2TEXT = "speech2text"
적당히 = "적당히"
VISION = "비전"
ToolSelectorScope(Enum) 클래스.
ALL = "모두"
플러그인 = "플러그인"
API = "api"
워크플로 = "워크플로"
클래스 ToolRuntime(BaseModel).
자격 증명: dict[str, Any]user_id: 선택 사항[str]session_id: 선택 사항[str]
도구 호출 메시지(BaseModel) 클래스.
TextMessage(BaseModel) 클래스.
텍스트: str
def to_dict(self).
반환 {"text": self.text}
클래스 JsonMessage(BaseModel).
JSON_OBJECT: DICT
def to_dict(self).
반환 {"json_object": self.json_object}
BlobMessage(BaseModel) 클래스.
블롭: 바이트
BlobChunkMessage(BaseModel) 클래스.
id: str = Field(... , description="블롭의 아이디")
시퀀스: int = Field(... , description="청크의 시퀀스")
total_length: int = Field(... , description="블롭의 총 길이")
blob: 바이트 = 필드(... , description="청크의 블롭 데이터")
end: bool = Field(... , description="청크가 마지막 청크인지 여부")
변수 메시지(BaseModel) 클래스.
variable_name: str = 필드(
...,
description="변수 이름, 루트 수준 변수만 지원".
)
variable_value: Any = Field(... , description="변수 값")
stream: bool = Field(default=False, description="변수가 스트리밍되는지 여부")
모델_검증기(모드="이전")
클래스 메서드
def validate_variable_value_and_stream(cls, values).
# 값이 딕셔너리가 아닌 경우 유효성 검사 건너뛰기
IF NOT ISINSTANCE(VALUES, DICT):: IF NOT ISINSTANCE(VALUES, DICT): IF NOT ISINSTANCE(VALUES, DICT).
반환 값
if values.get("stream") and not isinstance(values.get("variable_value"), str).
ValueError("'stream'이 True인 경우, 'variable_value'는 문자열이어야 합니다.")
반환 값
LogMessage(BaseModel) 클래스.
LogStatus(Enum) 클래스.
START = "시작"
오류 = "오류"
성공 = "성공"
id: str = Field(default_factory=lambda: str(uuid.uuid4()), description="로그의 id")
레이블: str = 필드(... , description="로그의 레이블")
parent_id: Optional[str] = 필드(기본값=없음, 설명="루트 로그를 위해 비워둡니다")
error: Optional[str] = 필드(기본값=없음, 설명="오류 메시지")
status: LogStatus = Field(... , description="로그의 상태")
data: Mapping[str, Any] = Field(... , description="상세 로그 데이터")
메타데이터: 선택 사항[매핑[로그메타데이터, 임의]] = 필드(기본값=없음, 설명="로그의 메타데이터")
메시지 유형(Enum) 클래스.
TEXT = "text"
FILE = "파일"
BLOB = "blob"
JSON = "json"
LINK = "링크"
이미지 = "이미지"
IMAGE_LINK = "image_link"
가변 = "변수"
BLOB_CHUNK = "blob_chunk"
LOG = "로그"
유형: 메시지 유형
# TODO: pydantic은 올바른 유형을 찾을 때까지 메시지를 하나씩 유효성 검사하고 구성합니다.
# 구축 프로세스를 최적화해야 합니다.
메시지: 텍스트 메시지 | Json 메시지 | 변수 메시지 | 블롭 메시지 | 블롭 청크 메시지 | 로그 메시지 | 없음
메타: 옵션[딕트] = 없음
@field_validator("message", mode="before")
클래스 메서드
디코드_블롭_메시지(cls, v).
IF ISINSTANCE(V, DICT) 및 V의 "BLOB".
를 contextlib.suppress(예외)로 대체합니다.
v["blob"] = base64.b64decode(v["blob"])
v를 반환합니다.
필드_직렬화기("메시지")
def serialize_message(self, v).
if isinstance(v, self.BlobMessage)::
반환 {"blob": base64.b64encode(v.blob).decode("utf-8")}
elif isinstance(v, self.BlobChunkMessage)::
반환 {
"id": v.id,
"시퀀스": v.sequence,
"총_길이": v.총_길이,
"blob": base64.b64encode(v.blob).decode("utf-8"),
"end": v.end,
}
v를 반환합니다.
도구아이덴티티(BaseModel) 클래스.
작성자: str = 필드(... , description="도구의 작성자")
이름: str = 필드(... , description="도구의 이름")
레이블: I18nObject = 필드(...) , description="도구의 레이블")
툴파라미터옵션(BaseModel) 클래스.
value: str = Field(... , description="옵션의 값")
레이블: I18nObject = 필드(...) , description="옵션의 레이블")
@field_validator("value", mode="before")
클래스 메서드
def transform_id_to_str(cls, value) -> str.
IF NOT ISINSTANCE(VALUE, STR): IF NOT ISINSTANCE(VALUE, STR).
반환 문자열(값)
else.
반환 값
파라미터자동생성(BaseModel) 클래스.
클래스 Type(StrEnum).
프롬프트_지시 = "프롬프트_지시"
유형: 유형
파라미터 템플릿(BaseModel) 클래스.
enabled: bool = Field(... , description="매개변수가 진자 활성화 여부")
ToolParameter(BaseModel) 클래스.
도구 파라미터 유형 클래스(str, Enum).
문자열 = 공통 매개 변수 유형.문자열 값
NUMBER = 공통 매개 변수 유형.NUMBER.값
BOOLEAN = CommonParameterType.BOOLEAN.value
SELECT = 공통 매개 변수 유형.SELECT.값
SECRET_INPUT = CommonParameterType.SECRET_INPUT.value
파일 = 공통 매개 변수 유형.파일 값
파일 = 공통 매개 변수 유형.파일 값
MODEL_SELECTOR = CommonParameterType.MODEL_SELECTOR.value
APP_SELECTOR = CommonParameterType.APP_SELECTOR.value
# TOOL_SELECTOR = CommonParameterType.TOOL_SELECTOR.value
ToolParameterForm(Enum) 클래스.
도구를 추가하는 동안 SCHEMA = "스키마" #를 설정해야 합니다.
도구를 호출하기 전에 FORM = "form" #를 설정해야 합니다.
LLM = "llm" #는 LLM에 의해 설정됩니다.
name: str = Field(... , description="매개변수 이름")
레이블: I18nObject = 필드(...) , description="사용자에게 표시되는 레이블")
human_description: I18nObject = Field(... , description="사용자에게 표시되는 설명")
유형: 도구 매개변수 유형 = 필드(...) , description="매개변수 유형")
자동 생성: 옵션[ParameterAutoGenerate] = 필드(
기본값=없음, 설명="매개변수 자동 생성"
)
template: Optional[ParameterTemplate] = Field(기본값=없음, 설명="매개변수의 템플릿")
범위: str | 없음 = 없음
form: ToolParameterForm = Field(... , 설명="매개변수의 형식, 스키마/폼/llm")
llm_description: 선택 사항[str] = 없음
필수: 옵션[bool] = False
기본값: 선택 사항[Union[int, float, str]] = 없음
최소: 선택 사항[Union[float, int]] = 없음
최대: 선택 사항[Union[float, int]] = 없음
정밀도: 옵션[int] = 없음
옵션: 옵션[목록[도구 매개 변수 옵션]] = 없음
클래스 ToolDescription(BaseModel).
human: I18nObject = Field(... , description="사용자에게 표시되는 설명")
llm: str = Field(... , description="LLM에 제공되는 설명")
ToolConfigurationExtra(BaseModel) 클래스.
파이썬 클래스(BaseModel).
출처: str
python: 파이썬
클래스 ToolConfiguration(BaseModel).
아이덴티티: 도구아이덴티티
매개변수: list[ToolParameter] = Field(default=[], description="도구의 매개변수")
설명: 도구 설명
추가: 도구 구성 추가
has_runtime_parameters: bool = 필드(기본값=False, 설명="도구에 런타임 매개 변수가 있는지 여부")
출력 스키마: 선택 사항[매핑[str, 임의]] = 없음
ToolLabelEnum(Enum) 클래스.
SEARCH = "검색"
이미지 = "이미지"
동영상 = "동영상"
날씨 = "날씨"
금융 = "금융"
DESIGN = "디자인"
TRAVEL = "여행"
소셜 = "소셜"
뉴스 = "뉴스"
MEDICAL = "의료"
생산성 = "생산성"
EDUCATION = "교육"
비즈니스 = "비즈니스"
엔터테인먼트 = "엔터테인먼트"
유틸리티 = "유틸리티"
기타 = "기타"
클래스 ToolCredentialsOption(BaseModel).
value: str = Field(... , description="옵션의 값")
레이블: I18nObject = 필드(...) , description="옵션의 레이블")
ProviderConfig(BaseModel) 클래스.
클래스 구성(Enum).
SECRET_INPUT = CommonParameterType.SECRET_INPUT.value
TEXT_INPUT = CommonParameterType.TEXT_INPUT.value
SELECT = 공통 매개 변수 유형.SELECT.값
BOOLEAN = CommonParameterType.BOOLEAN.value
MODEL_SELECTOR = CommonParameterType.MODEL_SELECTOR.value
APP_SELECTOR = CommonParameterType.APP_SELECTOR.value
# TOOL_SELECTOR = CommonParameterType.TOOL_SELECTOR.value
TOOLS_SELECTOR = CommonParameterType.TOOLS_SELECTOR.value
클래스 메서드
def value_of(cls, value: str) -> "ProviderConfig.
"""
주어진 모드의 값을 가져옵니다.
:매개변수 값: 모드 값
반환: 모드
"""
CLS 모드의 경우.
if mode.value == value.
반환 모드
raise ValueError(f "잘못된 모드 값 {value}")
name: str = 필드(... , description="자격 증명 이름")
유형: 구성 = 필드(... , description="자격 증명 유형")
범위: str | 없음 = 없음
필수: bool = False
기본값: 선택 사항[Union[int, float, str]] = 없음
옵션: 옵션[목록[ToolCredentialsOption]] = 없음
레이블: I18nObject
도움말: 옵션[I18nObject] = 없음
url: 옵션[str] = 없음
플레이스홀더: 옵션[I18nObject] = 없음
툴프로바이더아이덴티티(BaseModel) 클래스.
작성자: str = 필드(... , description="도구의 작성자")
이름: str = 필드(... , description="도구의 이름")
설명: I18nObject = Field(... , description="도구에 대한 설명")
icon: str = 필드(... , description="도구의 아이콘")
레이블: I18nObject = 필드(...) , description="도구의 레이블")
태그: list[ToolLabelEnum] = 필드(
default=[],
description="도구의 태그".
)
툴프로바이더 컨피규레이션 엑스트라 클래스(베이스모델).
파이썬 클래스(BaseModel).
출처: str
python: 파이썬
툴프로바이더컨피규레이션(베이스모델) 클래스.
신원: 도구 제공자 신원
자격 증명 스키마: 목록[공급자 구성] = 필드(
default_factory=list,
alias="credentials_for_provider",
description="도구 공급자의 자격 증명 스키마".
)
tools: list[ToolConfiguration] = Field(default=[], description="도구 제공자의 도구")
추가: 도구 제공자 구성 추가
모델_검증기(모드="이전")
클래스 메서드
def validate_credentials_schema(cls, data: dict) -> dict.
원래_크레딧_제공자_용: dict[str, dict] = data.get("credentials_for_provider", {})
credentials_for_provider: list[dict[str, Any]] = []에 대한 이름, 원래_credentials_for_provider.items()의 자격 증명:
자격증명["이름"] = 이름
credentials_for_provider.append(credential)
데이터["자격증명_제공자"] = 자격증명_제공자
데이터 반환
@field_validator("tools", mode="before")
클래스 메서드
def validate_tools(cls, value) -> list[ToolConfiguration].
IF NOT ISINSTANCE(VALUE, LIST):: IF NOT ISINSTANCE(VALUE, LIST): IF NOT ISINSTANCE(VALUE, LIST).
ValueError("도구는 목록이어야 합니다") 발생
tools: list[ToolConfiguration] = []
도구의 가치:
# yaml에서 읽기
IF NOT ISINSTANCE(TOOL, STR): IF NOT ISINSTANCE(TOOL, STR).
ValueError("도구 경로는 문자열이어야 합니다") 발생
시도해 보세요.
파일 = load_yaml_file(tool)
tools.append(
ToolConfiguration(
identity=ToolIdentity(**file["identity"]),
매개변수=[file.get("parameter", []) 또는 []]에서 param에 대한 ToolParameter(**param),
description=ToolDescription(**file["description"]),
extra=ToolConfigurationExtra(**file.get("extra", {})),
output_schema=file.get("output_schema", None),
)
)
예외는 e로 제외합니다.
raise ValueError(f "도구 구성 로드 중 오류: {str(e)}") from e
반환 도구
툴프로바이더유형(Enum) 클래스.
"""
도구 제공자를 위한 열거형 클래스
"""
BUILT_IN = "builtin"
워크플로 = "워크플로"
API = "api"
앱 = "앱"
데이터셋_검색 = "데이터셋-검색"
클래스 메서드
def value_of(cls, value: str) -> "ToolProviderType".
"""
주어진 모드의 값을 가져옵니다.
:매개변수 값: 모드 값
반환: 모드
"""
CLS 모드의 경우.
if mode.value == value.
반환 모드
raise ValueError(f "잘못된 모드 값 {value}")
클래스 ToolSelector(BaseModel).
파라미터(BaseModel) 클래스.
name: str = Field(... , description="매개변수 이름")
유형: 도구 매개변수.도구 매개변수 유형 = 필드(...) , description="매개변수의 유형")
필수: bool = Field(... , description="매개변수 필수 여부")
설명: str = 필드(... , description="매개변수에 대한 설명")
기본값: 선택 사항[Union[int, float, str]] = 없음
옵션: 옵션[목록[도구 매개 변수 옵션]] = 없음
provider_id: str = Field(... , description="공급자의 아이디")
tool_name: str = Field(... , description="도구의 이름")
tool_description: str = Field(... , description="도구에 대한 설명")
tool_configuration: Mapping[str, Any] = Field(...) , description="구성, 유형 양식")
tool_parameters: 매핑[str, 매개변수] = 필드(...) , description="매개변수, 유형 llm")
def to_prompt_message(self) -> PromptMessageTool.
"""
도구 선택기를 OpenAI 기반 프롬프트 메시지 도구로 변환하기 함수 호출 스키마.
"""
도구 = 프롬프트 메시지 도구(
name=self.tool_name,
description=self.tool_description,
매개변수={
"유형": "객체",
"properties": {},
"required": [],
},
)
self.tool_parameters.items()의 이름, 매개변수에 대해::
tool.parameters[name] = {
"유형": parameter.type.value,
"description": parameter.description,
}
파라미터가 필요한 경우
tool.parameters["required"].append(name)
if parameter.options.
tool.parameters[name]["enum"] = [parameter.options의 옵션에 대한 옵션.값]
반환 도구
파일 용도
도구 YAML 파일(your_plugin.yaml)이 정의합니다.
도구에 대한 기본 신원 정보
인간과 AI 에이전트 모두를 위한 설명
도구에서 허용하는 매개변수
이러한 매개변수가 표시되고 수집되는 방식
구현 예시
Dropbox용 YAML 파일 도구의 모습은 다음과 같습니다.
ceate_folder.yaml.
신원.
이름: create_folder
작성자: lcandy
라벨.
en_US: 폴더 만들기
zh_Hans: 폴더 만들기
pt_BR: 크리아 파스타
ja_jp: 접힌
zh_Hant: 폴더 만들기
설명.
인간.
en_US: Dropbox에 새 폴더 만들기
zh_Hans: Dropbox에 새 폴더 만들기
pt_BR: Dropbox에서 새 폴더 만들기
ja_jp: Dropbox에서 Frida의 새 버전을 출시합니다!
zh_Hant: Dropbox에 새 폴더 만들기
llm: Dropbox에서 지정한 경로에 새 폴더를 만듭니다. 경로와 ID를 포함하여 생성된 폴더에 대한 정보를 반환합니다.
매개변수.
- 이름: 폴더_경로
유형: 문자열
필수: true
라벨.
en_US: 폴더 경로
zh_Hans: 폴더 경로
pt_BR: 카미뇨 다 파스타
ja_jp:ォルダパス
zh_Hant: 폴더 경로
human_description.
en_US: Dropbox에서 폴더가 만들어질 경로입니다.
zh_Hans: Dropbox의 폴더 생성 경로
pt_BR: 붙여넣기 파일이 Dropbox에 만들어집니다.
ja_jp: Dropbox에서 포탈을 만드는 방법
zh_Hant: Dropbox에 만들려는 폴더의 경로입니다.
llm_description: Dropbox에서 폴더가 만들어질 경로입니다. '/Documents/Projects' 또는 '/Photos/' 등 전체 경로로 지정해야 합니다. Vacation2023'과 같이 전체 경로를 지정해야 합니다. 경로는 대소문자를 구분하며 슬래시로 시작해야 합니다.
양식: LLM
추가.
python.
출처: tools/create_folder.py
delete_file.yaml.
신원.
이름: 삭제_파일
작성자: lcandy
라벨.
en_US: 파일/폴더 삭제
zh_Hans: 파일/폴더 삭제
pt_BR: 엑스클루이르 아르키보/파스타
ja_jp: ファイル/フォルダ削除
zh_Hant: 파일/폴더 삭제
설명.
인간.
en_US: Dropbox에서 파일 또는 폴더 삭제
zh_Hans: Dropbox에서 파일 또는 폴더 삭제하기
pt_BR: Dropbox에서 파일 또는 폴더 제거
ja_jp: Dropbox에서 파일과 폴더를 삭제합니다.
zh_Hant: Dropbox에서 파일 또는 폴더 삭제
llm: 지정된 경로에 있는 파일 또는 폴더를 Dropbox에서 영구 삭제합니다. 삭제된 항목에 대한 확인 정보를 반환합니다.
매개변수.
- 이름: 파일_경로
유형: 문자열
필수: true
라벨.
en_US: 파일/폴더 경로
zh_Hans: 파일/폴더 경로
pt_BR: 카미뇨 두 아르키보/파스타
ja_jp:ファイル/フォルダパス
zh_Hant: 파일/폴더 경로
human_description.
en_US: Dropbox에서 삭제할 파일 또는 폴더의 경로입니다.
zh_Hans: Dropbox에서 삭제할 파일 또는 폴더의 경로
pt_BR: Dropbox에서 추출할 파일 또는 폴더의 이름입니다.
ja_jp: Dropbox에서 삭제하는 파일 및 폴더의 패스
zh_Hant: Dropbox에서 삭제하려는 파일 또는 폴더의 경로
llm_description: Dropbox에서 삭제할 파일 또는 폴더의 경로입니다. '/Documents/report.txt' 또는 '/Photos /Vacation2023'과 같이 전체 경로를 지정해야 합니다. 경로는 대소문자를 구분하며 슬래시로 시작해야 합니다. 경고 - 영구 삭제됩니다.
양식: LLM
추가.
python.
출처: tools/delete_file.py
다운로드_파일.py.
신원.
이름: 다운로드_파일
작성자: lcandy
라벨.
en_US: 파일 다운로드
zh_Hans: 파일 다운로드
pt_BR: 바이사 아르키보
ja_jp: ファイルダウンロード
zh_Hant: 파일 다운로드
설명.
인간.
en_US: Dropbox에서 파일 다운로드
zh_Hans: Dropbox에서 파일 다운로드하기
pt_BR: Dropbox에 파일 올리기
ja_jp: Dropbox からファイルをダウンロードします
zh_Hant: Dropbox에서 파일 다운로드
llm: 지정된 경로에 있는 Dropbox에서 파일을 다운로드합니다. 파일 메타데이터와 선택적으로 파일 콘텐츠(바이너리 파일의 경우 base64, 텍스트 파일의 경우 텍스트)를 반환합니다. 파일).
매개변수.
- 이름: 파일_경로
유형: 문자열
필수: true
라벨.
en_US: 파일 경로
zh_Hans: 파일 경로
pt_BR: 카미뇨 두 아르키보
ja_jp: ファイルパス
zh_Hant: 파일 경로
human_description.
en_US: Dropbox에서 다운로드할 파일의 경로입니다.
zh_Hans: Dropbox에서 다운로드할 파일 경로
pt_BR: Dropbox에 저장하는 파일 폴더
ja_JP: Dropbox에서 다운로드를 받는 친구의 패스
zh_Hant: Dropbox에서 다운로드하려는 파일의 경로입니다.
llm_description: Dropbox에서 다운로드할 파일의 경로입니다. 파일 이름과 확장명이 포함된 전체 경로를 포함해야 합니다(예: '/Documents/report. txt'와 같이 전체 경로를 포함해야 합니다. 경로는 대소문자를 구분하며 슬래시로 시작해야 합니다.
양식: LLM
- 이름: 포함_콘텐츠
유형: 부울
필수: false
기본값: false
라벨.
en_US: 콘텐츠 포함
zh_Hans: 내용
pt_BR: 콘텐츠 포함
ja_JP: 콘텐츠
zh_Hant: 콘텐츠 포함
human_description.
en_US: 응답에 파일 콘텐츠를 포함할지 여부
zh_Hans: 응답에 파일 내용을 포함할지 여부
pt_BR: 답장에 파일 내용을 포함해야 합니다.
ja_jp: 리포지토리에 있는 필름의 콘텐츠가 필름에 포함되어 있습니다.
zh_Hant: 응답에 파일 콘텐츠를 포함할지 여부
llm_description: 응답에 파일 콘텐츠를 포함하려면 true로 설정합니다. 작은 텍스트 파일의 경우 콘텐츠가 텍스트로 제공되며, 바이너리 파일의 경우 콘텐츠가 base64로 인코딩된 문자열로 제공됩니다. 콘텐츠가 base64로 인코딩된 문자열로 제공됩니다. 기본값은 false입니다.
양식: LLM
추가.
python.
출처: tools/download_file.py
dropbox.yaml.
신원.
이름: 드롭박스
작성자: lcandy
라벨.
en_US: Dropbox
zh_Hans: Dropbox
pt_BR: Dropbox
ja_JP: Dropbox
zh_Hant: Dropbox
설명.
인간.
en_US: Dropbox와 상호 작용
zh_Hans: Dropbox와 상호 작용하기
pt_BR: Dropbox와 연동하기
ja_JP: Dropbox와 연결성
zh_Hant: Dropbox와 상호 작용하기
llm: Dropbox 서비스에 대한 액세스를 제공하여 Dropbox 계정에 있는 파일 및 폴더와 상호 작용할 수 있도록 합니다.
매개변수.
- 이름: 쿼리
유형: 문자열
필수: true
라벨.
en_US: 쿼리 문자열
zh_Hans: 쿼리 문
pt_BR: 상담 기간
ja_jp: K'eri 텍스트 열
zh_Hant: 문의 내용
human_description.
en_US: Dropbox 작업 쿼리를 입력합니다.
zh_Hans: Dropbox 작업 쿼리를 입력합니다.
pt_BR: Dropbox 운영 상담을 받으세요.
ja_JP: Dropbox Operation Kエリを入力してください
zh_Hant: 수행하려는 Dropbox 작업을 입력하세요.
llm_description: 수행하려는 Dropbox 작업을 설명하는 쿼리입니다.
양식: LLM
추가.
python.
출처: tools/dropbox.py
주요 구성 요소
신원 섹션.
이름: 도구의 내부 이름(파일 이름과 일치해야 함)
작성자: 도구를 만든 사람
레이블: 다른 언어로 이름 표시
설명 섹션.
인간: 인간 사용자에게 다른 언어로 표시되는 설명
llm: 도구의 기능 및 사용 방법을 이해하기 위해 AI 에이전트에게 제공되는 설명입니다.
매개변수 섹션.
도구가 허용하는 매개변수 목록과 각 매개변수입니다.
이름: 매개변수 식별자(파이썬 코드에서 사용)
유형: 데이터 유형(문자열, 숫자, 부울 등)
필수: 이 매개변수가 필수인지 여부
레이블: 다양한 언어로 된 사용자 친화적인 이름
human_description: 다른 언어로 된 인간 사용자를 위한 설명
llm_description: AI 에이전트가 이 매개 변수를 이해할 수 있도록 설명합니다.
양식: 매개변수 수집 방법
llm: 사용자 쿼리에서 추출하는 AI 에이전트
워크플로: 사용자가 UI에서 변수로 제공해야 합니다.
선택 사항: 기본값: 이 매개 변수의 기본값입니다.
추가 섹션.
python.source: 도구의 Python 구현 파일 경로
중요 참고 사항
파일 분리.
중요!!!! 이메일 읽기 및 쓰기, 데이터베이스 읽기 및 업데이트와 같이 도구의 기능이 서로 다른 경우 yaml 파일을 두 개 이상으로 분리해야 합니다. 원칙은 각 yaml 및 코드 파일은 각 도구 실행 유형 전용입니다. 파일 자체는 도구가 실행하는 매개변수만 추출해야 합니다. 파일 자체는 도구의 기능에서 사용할 매개변수만 추출해야 합니다. 예를 들어 데이터베이스를 읽고 업데이트하려면 read_database.yaml과 update_ database.yaml 두 개의 yaml 파일을 각각 따로 사용해야 합니다. database.yaml을 별도로 사용하세요.
LLM 설명.
도구와 매개 변수에 대한 LM 설명은 AI 에이전트에게 도구 사용 방법을 알려주는 매우 중요한 요소입니다.
필요한 매개변수와 도구가 반환할 정보를 명확히 파악하세요.
이를 통해 AI 에이전트가 도구를 사용할 시기와 사용자 쿼리에서 매개 변수를 추출하는 방법을 결정할 수 있습니다.
매개변수 구성.
각 매개변수에 대해 필수 여부를 지정합니다.
적절한 데이터 유형 선택
AI가 사용자 쿼리에서 양식을 추출하도록 하려면 양식을 llm으로 설정하세요.
사용자가 직접 양식을 제공하도록 하려면 워크플로로 설정하세요.
현지화.
필요에 따라 여러 언어로 라벨 및 설명에 대한 번역 제공
최소한 영어(en_US)를 포함하세요.
나만의 도구 YAML 파일을 만들려면 이 구조를 특정 도구에 맞게 조정하여 필요한 매개 변수와 해당 매개 변수가 인간과 AI 에이전트 모두에게 어떻게 표시되어야 하는지 매개변수를 명확하게 정의하세요.
도구/귀하의_플러그인.py 편집 방법 5.
Dify 플러그인을 위한 도구 구현 파일을 만들어야 합니다. 이 파일에는 API 요청을 하고 결과를 처리하는 도구의 실제 로직이 포함되어 있습니다. 이 파일에는 API 요청을 하고 결과를 처리하는 도구의 실제 로직이 포함되어 있습니다. Google 검색을 예로 들어 이 파일을 만드는 과정을 안내해드리겠습니다.
파일 용도
이 도구는 파이썬 파일(your_plugin.py)이 담당합니다.
서비스에 API 요청하기
응답 처리하기
Dify에서 사용할 수 있는 형식으로 결과를 반환합니다.
필수 구성 요소
도구 클래스는 반드시 dify_plugin을 상속해야 합니다.
제너레이터를 반환하는 _invoke 메서드를 구현해야 합니다.
이러한 필수 가져오기를 포함해야 합니다.
에서 컬렉션.abc 가져오기 생성기
import Any를 입력하는 것에서
에서 dify_plugin 가져오기 도구
from dify_plugin.entities.tool.import ToolInvokeMessage
구현 예시
Dropbox 도구의 도구 구현 방식은 다음과 같습니다.
ceate_folder.yaml.
에서 컬렉션.abc 가져오기 생성기
import Any를 입력하는 것에서
에서 dify_plugin 가져오기 도구
from dify_plugin.entities.tool.import ToolInvokeMessage
dropbox.exceptions에서 ApiError, AuthError를 가져옵니다.
dropbox_utils에서 DropboxUtils 가져오기
CreateFolderTool(Tool) 클래스.
def _invoke(self, tool_parameters: dict[str, Any]) -> Generator[ToolInvokeMessage, None, None].
"""
Dropbox에 폴더 만들기
"""
# 매개변수 가져오기
폴더_경로 = tool_parameters.get("폴더_경로", "")
# 매개변수 유효성 검사
FOLDER_경로가 아닌 경우: FOLDER_경로가 아닌 경우: FOLDER_경로가 아닌 경우.
yield self.create_text_message("Dropbox의 폴더 경로가 필요합니다.")
반환
# 폴더 경로가 /로 시작하는지 확인합니다.
if not folder_path.startswith("/"):.
폴더_경로 = "/" + 폴더_경로
시도해 보세요.
# 자격 증명에서 액세스 토큰 가져오기
access_token = self.runtime.credentials.get("access_token")
액세스_토큰이 아닌 경우
yield self.create_text_message("Dropbox 액세스 토큰이 필요합니다.")
반환
# Dropbox 클라이언트 받기
시도해 보세요.
dbx = DropboxUtils.get_client(access_token)
AuthError를 e로 제외합니다.
yield self.create_text_message(f "인증 실패: {str(e)}")
반환
예외는 e로 제외합니다.
yield self.create_text_message(f "Dropbox에 연결하지 못했습니다: {str(e)}")
반환
# 폴더 만들기
시도해 보세요.
결과 = DropboxUtils.create_folder(dbx, 폴더_경로)
# 응답 만들기
summary = f "폴더 '{result['name']}'이 '{result['path']}'에 성공적으로 생성되었습니다."
yield self.create_text_message(summary)
yield self.create_json_message(result)
에서 ApiError를 제외합니다.
만약 "경로/충돌"이 str(e)에 있다면.
yield self.create_text_message(f "폴더가 '{폴더_경로}'에 이미 존재합니다.")
else.
yield self.create_text_message(f "폴더 생성 오류: {str(e)}")
반환
예외는 e로 제외합니다.
yield self.create_text_message(f "오류: {str(e)}")
반환
delete_file.py
에서 컬렉션.abc 가져오기 생성기
import Any를 입력하는 것에서
에서 dify_plugin 가져오기 도구
from dify_plugin.entities.tool.import ToolInvokeMessage
dropbox.exceptions에서 ApiError, AuthError를 가져옵니다.
dropbox_utils에서 DropboxUtils 가져오기
삭제 파일 도구(도구) 클래스.
def _invoke(self, tool_parameters: dict[str, Any]) -> Generator[ToolInvokeMessage, None, None].
"""
Dropbox에서 파일 또는 폴더 삭제
"""
# 매개변수 가져오기
file_path = tool_parameters.get("file_path", "")
# 매개변수 유효성 검사
file_경로가 아닌 경우: file_경로가 아닌 경우: file_경로가 아닌 경우.
yield self.create_text_message("Dropbox의 파일 또는 폴더 경로가 필요합니다.")
반환
# 경로가 /로 시작해야 합니다.
file_path.startswith("/"):.
파일_경로 = "/" + 파일_경로
시도해 보세요.
# 자격 증명에서 액세스 토큰 가져오기
access_token = self.runtime.credentials.get("access_token")
액세스_토큰이 아닌 경우
yield self.create_text_message("Dropbox 액세스 토큰이 필요합니다.")
반환
# Dropbox 클라이언트 받기
시도해 보세요.
dbx = DropboxUtils.get_client(access_token)
AuthError를 e로 제외합니다.
yield self.create_text_message(f "인증 실패: {str(e)}")
반환
예외는 e로 제외합니다.
yield self.create_text_message(f "Dropbox에 연결하지 못했습니다: {str(e)}")
반환
# 파일 또는 폴더 삭제
시도해 보세요.
결과 = DropboxUtils.delete_file(dbx, 파일_경로)
# 응답 만들기
summary = f"'{result['name']}' 삭제 성공"
yield self.create_text_message(summary)
yield self.create_json_message(result)
에서 ApiError를 제외합니다.
IF "경로/못찾음" IN STR(E)::
yield self.create_text_message(f "'{파일_경로}'에서 파일 또는 폴더를 찾을 수 없습니다.")
else.
yield self.create_text_message(f "파일/폴더 삭제 중 오류: {str(e)}")
반환
예외는 e로 제외합니다.
yield self.create_text_message(f "오류: {str(e)}")
반환
다운로드_파일.yaml.
에서 컬렉션.abc 가져오기 생성기
base64 가져오기
import Any를 입력하는 것에서
에서 dify_plugin 가져오기 도구
from dify_plugin.entities.tool.import ToolInvokeMessage
dropbox.exceptions에서 ApiError, AuthError를 가져옵니다.
dropbox_utils에서 DropboxUtils 가져오기
다운로드 파일 도구(도구) 클래스.
def _invoke(self, tool_parameters: dict[str, Any]) -> Generator[ToolInvokeMessage, None, None].
"""
Dropbox에서 파일 다운로드
"""
# 매개변수 가져오기
file_path = tool_parameters.get("file_path", "")
include_content = tool_parameters.get("include_content", False)
# 매개변수 유효성 검사
file_경로가 아닌 경우: file_경로가 아닌 경우: file_경로가 아닌 경우.
yield self.create_text_message("Dropbox의 파일 경로가 필요합니다.")
반환
# 파일 경로가 /로 시작하는지 확인합니다.
file_path.startswith("/"):.
파일_경로 = "/" + 파일_경로
시도해 보세요.
# 자격 증명에서 액세스 토큰 가져오기
access_token = self.runtime.credentials.get("access_token")
액세스_토큰이 아닌 경우
yield self.create_text_message("Dropbox 액세스 토큰이 필요합니다.")
반환
# Dropbox 클라이언트 받기
시도해 보세요.
dbx = DropboxUtils.get_client(access_token)
AuthError를 e로 제외합니다.
yield self.create_text_message(f "인증 실패: {str(e)}")
반환
예외는 e로 제외합니다.
yield self.create_text_message(f "Dropbox에 연결하지 못했습니다: {str(e)}")
반환
# 파일 다운로드
시도해 보세요.
결과 = DropboxUtils.download_file(dbx, file_path)
# 응답 만들기
응답 = {
"name": result["name"],
"경로": result["경로"],
"id": result["id"],
"size": result["size"],
"modified": result["modified"]}
# 요청이 있는 경우 콘텐츠 포함
if include_content.
# 바이너리 콘텐츠를 base64로 인코딩하기
response["content_base64"] = base64.b64encode(result["content"]).decode('utf-8')
# 충분히 작은 경우 텍스트로 디코딩을 시도합니다.
if result["size"] < 1024 * 1024: # 1MB 미만
시도해 보세요.
text_content = result["content"].decode('utf-8')
응답["content_text"] = text_content
유니코드 디코딩 오류를 제외합니다.
# 텍스트 파일이 아닌 base64만 포함하세요.
통과
summary = f "파일 '{result['name']}' 다운로드에 성공했습니다."
yield self.create_text_message(summary)
yield self.create_json_message(response)
에서 ApiError를 제외합니다.
yield self.create_text_message(f "파일 다운로드 중 오류: {str(e)}")
반환
예외는 e로 제외합니다.
yield self.create_text_message(f "오류: {str(e)}")
반환
기억해야 할 핵심 사항
파일 분리.
중요: 이메일 읽기 및 쓰기, 데이터베이스 읽기 또는 업데이트와 같이 도구의 기능이 서로 다른 경우에는 yaml 파일을 여러 개로 분리해야 합니다. 원칙은 각 yaml 및 코드 파일은 도구 실행 유형별로 전용으로 사용하는 것입니다. 파일 자체는 도구의 기능에 사용할 매개변수만 추출해야 합니다. 예를 들어 데이터베이스를 읽고 업데이트하려면 read_database.py와 update_ database.py라는 두 개의 yaml 파일을 따로 사용해야 합니다. database.py를 별도로 사용해야 합니다.
필수 가져오기: 항상 파일 상단에 필수 가져오기를 포함하세요.
클래스 상속: 도구 클래스는 반드시 dify_plugin에서 상속해야 합니다.
매개변수 추출하기.
tool_parameters 딕셔너리에는 도구의 YAML 파일에 정의된 모든 매개변수가 포함되어 있습니다.
사전 키를 사용하여 이러한 매개변수에 직접 액세스(예: tool_parameters["query"] 이러한 매개변수는 사용자로부터 자동으로 추출됩니다. 이 매개변수는 AI 에이전트가 사용자 쿼리에서 자동으로 추출합니다.
필수 매개 변수를 처리하고 누락된 경우 적절한 오류 처리를 제공해야 합니다.
예시.
query = tool_parameters["query"] # 쿼리 매개변수 추출limit = tool_parameters.get("limit", 10) # 기본값으로 추출# 선택적 유효성 검사쿼리가 아닌 경우: ValueError("쿼리 매개변수가 비어있을 수 없습니다") 발생
자격 증명에 액세스하기.
self.runtime.credentials를 사용하여 인증 자격 증명에 액세스합니다.
키는 공급자 YAML 파일에 정의된 키와 일치합니다.
예: self.runtime.credentials["serpapi_api_key"] 응답 처리: 다음에서 관련 정보만 추출하는 헬퍼 메서드를 생성합니다. API 응답에서 관련 정보만 추출합니다.
결과 산출: 데이터를 반환하려면 메시지 작성 방법 중 하나인 산출을 사용해야 합니다.
자체 도구를 구현할 때는 tool_parameters 사전에서 필요한 모든 매개변수를 올바르게 추출하고 필요한 경우 유효성을 검사하세요. 사용 가능한 매개변수는 도구의 YAML 파일에 정의되어 있으며 AI 에이전트가 사용자 쿼리에서 자동으로 추출합니다.
6. PRIVACY.md 및 README.md 생성 방법
Dify 플러그인에 대한 개인정보처리방침과 readme 파일을 작성해야 합니다. 이 파일은 마크다운 형식으로 작성되며 중요한 역할을 합니다. 이 파일은 마크다운 형식으로 작성되며 플러그인 사용자와 개발자에게 중요한 역할을 합니다.
PRIVACY.md
PRIVACY.md 파일 개요 수집하는 데이터와 해당 데이터의 사용 방법을 포함하여 플러그인의 개인정보 보호 관행에 대한 정보를 제공합니다. 이는 개인정보 보호에 대해 우려하는 사용자에게 중요한 정보입니다. 이는 데이터 개인정보 보호에 대해 우려하는 사용자에게 중요한 정보입니다.
포함할 내용
공유한 플레이스홀더 텍스트("!!!!!. 플러그인의 개인정보 처리방침을 입력하세요.")을 포함해야 합니다.
플러그인이 수집하는 데이터
이 데이터가 저장 및 처리되는 방식
사용되는 타사 서비스(있는 경우)
데이터 관련 사용자 권한
데이터 보존 기간
개인정보 보호 관련 문의를 위한 연락처 정보
구조 예시
# 개인정보 보호정책
## 데이터 수집
[플러그인이 수집하는 사용자 데이터와 그 이유 설명]
## 데이터 처리
[수집된 데이터가 처리되는 방식 설명]
## 타사 서비스
[플러그인에서 사용하는 타사 서비스를 나열하고 해당 타사의 개인정보처리방침에 링크]
## 데이터 보존
[사용자 데이터가 저장되는 기간 설명]
## 사용자 권한
[사용자가 자신의 데이터에 대해 어떤 권한을 가지고 있는지 설명]
## 연락처 정보
[개인정보 관련 문의를 위한 연락처 정보 제공]
최종 업데이트: [날짜]README.md
README.md 파일은 플러그인의 기능, 설치 방법, 사용 방법 등 플러그인에 대한 필수 정보를 제공합니다. 대부분의 사용자가 가장 먼저 참조하는 대부분의 사용자와 개발자가 참조하는 문서입니다.
포함할 내용
공유한 예제(Jira 플러그인 readme)에 따라 다음을 포함해야 합니다.
플러그인 이름을 기본 제목으로 사용
작성자 정보
버전 정보
플러그인 유형
플러그인의 기능에 대한 자세한 설명
설치 지침
사용 예
구성 옵션
문제 해결 정보
구조 예시
# 플러그인 이름
**저자:** [이름 또는 조직]**버전:** [현재 버전 번호]**유형:** [플러그인 유형]
## 설명
[플러그인의 기능에 대한 자세한 설명 제공]
## 특징
- [기능 1]- [기능 2]- [기능 3]
## 설치
[단계별 설치 지침 제공]
## 구성
[플러그인 구성 방법 설명하기]
## 사용 예시
[플러그인 사용 방법 예시 제공]
## 문제 해결
[일반적인 문제와 해결 방법 나열]
## 기여하기
[다른 사람들이 플러그인에 기여할 수 있는 방법 설명하기]
## 라이선스
[플러그인이 릴리스되는 라이선스 지정]이미지 사용
말씀하신 것처럼 두 문서에 이미지를 포함하려는 경우.
assets 폴더에 이미지를 저장합니다.
마크다운에서 상대 경로를 사용하여 참조하세요.
! [이미지 설명](_자산/이미지_이름.png)
이 두 파일은 모두 마크다운 형식(.md 확장자)으로 작성하여 플러그인 프로젝트의 루트 디렉터리에 저장해야 합니다. 플러그인이 발전함에 따라 최신 상태로 유지해야 합니다. 플러그인이 발전함에 따라 이 파일들을 최신 상태로 유지하세요.
요구 사항.txt
txt 파일에 항상 ~=를 사용하여 최신 종속성을 사용해야 하며, dify_plugin~=0.0.1b72는 반드시 사용해야 합니다.
© 저작권 정책
기사 저작권 AI 공유 서클 모두 무단 복제하지 마세요.
관련 문서
댓글 없음...