Add plugin: enconvert/enconvert v0.0.1 - #2999
Merged
Merged
Conversation
crazywoola
approved these changes
Sep 2, 2026
14 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Plugin Submission
Plugin information
Submission type
What changed
First submission. A tool plugin for the EnConvert API with six tools behind a single BYO API-key credential:
POST /v2/perceiverender_qualityscore from 0.0 to 1.0 so a blocked or empty page is flagged rather than passed off as content.POST /v2/lookupPOST /v2/discoverPOST /v2/distillPOST /v1/convert/anything-to-markdownPOST /v1/convert/anything-to-pdfThe plugin ships no key and no default credential. Each user supplies their own private EnConvert key (
sk_), validated on connect againstGET /v1/whoami, which rejects publicpk_keys. It is free on the Marketplace; EnConvert bills the user on their own key.Risk level
Required checks
.envfiles,.gitdirectories, virtual environments, caches, logs, or IDE files.PRIVACY.mdor a hosted privacy policy, andmanifest.yamlreferences it.Security and privacy notes
Outbound network requests. Two hosts, both declared in
manifest.yamlundernetwork.domains. Every API call goes tohttps://api.enconvert.com, built from the module-levelBASE_URLconstant intools/enconvert_client.py— no user input reaches the host or scheme. Perceive additionally reads back the signed storage URL the API returns (nyc3.digitaloceanspaces.com) so a page's markdown lands in the tool result instead of a 15-minute link an agent cannot open; that read is capped at 256 KB and falls back to emitting the link.www.enconvert.comappears in the declaration only because it is named in a credential-error message. All requests set an explicit timeout (30s for credential validation, 120s for tool calls and artifact reads).The plugin never fetches a user-supplied URL itself. URLs passed to Perceive, Discover and Extract Structured are sent to the EnConvert API as request data and are fetched, rendered and crawled by EnConvert's servers — not by the Dify host running the plugin. There is no SSRF path from a tool parameter into the deployment's network. The two convert tools take a Dify file object (
type: file) and upload its bytes, so they do not fetch a URL either.Data sent to a third party. The user's API key (
X-API-Keyheader), the tool parameters they or their agent supply, and — for the convert tools — the bytes of the file they wire in. EnConvert processes these under its own terms and privacy policy, both linked fromPRIVACY.md.Not present: no command, shell or code execution; no SQL or database access; no SSH/SFTP; no local filesystem operations; no browser automation inside the plugin; no webhook forwarding; no proxying; no bundled binaries; no analytics or telemetry. The plugin is stateless and stores nothing — the API key is held only for the duration of a request, in Dify's encrypted credential store. No health, financial, biometric, children's or location data is handled.
Local validation
Packaged with
dify-plugin-windows-amd64.exev0.6.10:Manifest metadata was checked field-by-field against
toolkit/checks/manifest.py(all required fields present, contact is a valid address, repo host allowed,PRIVACY.mdpresent and non-templated) —check-manifest-metadata.pyitself needsyq, which is not available on the packaging machine.Package contents: 24 files, no
.env,.venv,__pycache__,.git, caches or OS files.All six tools were then run for real against
api.enconvert.comunder the plugin runtime, driven over the daemon's own stdio protocol (INSTALL_METHOD=local, newline-delimited JSON on stdin/stdout — the same interface the daemon uses when it runs a plugin as a subprocess). Credential validation returns{"result": true}for a valid key and the provider's error for an invalid one; Perceive rendersexample.comatrender_quality 0.85and inlines its markdown; Web Search returns ranked results; Discover returns URLs from sitemap plus crawl; Extract Structured returns{"title": "Example Domain"}on the LLM tier; both convert tools upload a file and return a signed result URL.That run found and fixed two defects a stubbed test could not: Perceive emitted only a signed URL for markdown (and markdown was not in the link-message set at all), and Extract Structured always reported
tier: Nonebecauseextraction_tieris per result, not top level. The package in this PR is the fixed build.Behaviour is also pinned by an offline test with a stubbed transport: each of the six tools invoked through its real
_invokeand asserted to POST to the correct endpoint, with the convert tools asserted to senddirect_download=falseand the uploaded filename and bytes.Reviewer notes
Testing limitation, stated plainly: every tool has been run for real, but not through a Dify server — the plugin was driven directly over the daemon's stdio protocol rather than by a Dify instance, so the "I tested this plugin on Community Edition and Cloud" box above is left unchecked. What that leaves unverified is the Dify-side surface only: how the parameters render in the UI (in particular the
type: fileinput on the two convert tools) and the install flow itself. Tool logic, credential validation, endpoints, payloads and response handling are all confirmed against the live API — see Local validation. Happy to do a UI pass and push a follow-up if you would rather review after that.Source for every file in the package is at https://github.com/enconvert/dify-enconvert (release
v0.0.1carries the identical.difypkg).