Update Live Tennis API plugin to v0.0.2 - #2773
Merged
crazywoola merged 1 commit intoJul 28, 2026
Merged
Conversation
crazywoola
approved these changes
Jul 28, 2026
crazywoola
left a comment
Member
There was a problem hiding this comment.
✅ LGTM
Decision: Approve
Local Check Results
| Check | Status | Detail | Required action |
|---|---|---|---|
PR content language |
✅ Pass | PR title/body CJK ratio=0.0% (zh=0, en=5220, ignored_zh=0, allowed_zh<=0) | None. |
Project structure |
✅ Pass | All expected files present: manifest.yaml, README.md, PRIVACY.md. _assets/: yes. | None. |
Manifest author |
✅ Pass | author is valid. | None. |
Icon validation |
✅ Pass | icon exists: _assets/icon.png | None. |
Version check |
✅ Pass | version 0.0.2 is available. | None. |
README language |
✅ Pass | README.md CJK ratio=0.0% (zh=0, en=3574, allowed_zh<=0) | None. |
PRIVACY.md |
✅ Pass | PRIVACY.md exists and is non-empty. | None. |
Dependency install |
✅ Pass | requirements installed successfully. | None. |
dify_plugin version |
✅ Pass | dify_plugin version 0.10.0 satisfies >= 0.9.0. | None. |
Install test |
✅ Pass | plugin install test passed. | None. |
Packaging test |
✅ Pass | packaging check passed. | None. |
bensynapse
added a commit
to livetennisapi/livetennisapi-dify-plugin
that referenced
this pull request
Aug 2, 2026
…#2773 The 0.0.2 release was built, submitted and merged upstream (langgenius/dify-plugins#2773, 2026-07-28) without its source ever landing here -- this repo still described 0.0.1. This commit imports the plugin/ tree byte-for-byte from the merged livetennisapi-0.0.2.difypkg, checks that package into dist/, and brings the tests and this README along: - plugin/: twelve tools become six (get_matches absorbs get_live_matches, get_upcoming_matches and get_recent_results; get_match_events, get_match_odds, get_match_analysis and check_api_status are removed, their data now embedded in get_match); the key moves to the x-api-key header; get_match's output_schema indentation fix. Verified identical to the shipped package with diff -r. - test/: the suite now drives the six-tool surface, asserts x-api-key on the wire (and the absence of Authorization) on every request, covers the tour/status forwarding and fallback, and keeps the no-raise passes over 403/401/404/429. The stub records request headers and embeds the market and analysis blocks in the match detail, as the API does since 0.0.2. - README.md: layout diagram matches the tree again (PR_BODY.md and BUILD_PLAN.md left it in c0bcb06), and the Submit section records the lesson of 0.0.2: merged is not published -- the upstream upload workflow failed on a Marketplace 'database error' after the merge, so 0.0.2 never reached the Marketplace and 0.0.1 stayed live. Note for the record: 0.0.2 as merged links livetennisapi.com/docs, which redirects to the homepage. Fixed in the next version, not here -- this commit is the shipped bytes, nothing else. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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
Version update, 0.0.1 → 0.0.2. This release narrows the plugin to the Live
Tennis API's six documented public endpoints, one tool each, and fixes two
defects in 0.0.1. Twelve tools become six.
get_matchesGET /matches?status=&tour=&limit=get_matchGET /matches/{id}get_match_scoreGET /matches/{id}/scoresearch_playersGET /players?search=&limit=get_playerGET /players/{id}get_fixturesGET /fixtures?limit=Removed (they wrapped endpoints outside the documented public surface, or
inferred state by trial):
get_match_events,get_match_odds,get_match_analysis,check_api_status. The market and analysis data is notlost — the API embeds both in
GET /matches/{id}, andget_matchstill returnsthem.
Merged:
get_live_matches,get_upcoming_matchesandget_recent_resultsbecome the single
get_matcheswith astatusparameter, because they werethree tools over one endpoint. (
get_recent_resultswas additionally reading adifferent, undocumented path.)
Added: the documented
tourfilter (atp/wta/challenger/itf)on
get_matches.Changed — the API key is now sent in the
x-api-keyheader. 0.0.1 sentAuthorization: Bearer, inherited from the client library's default. Both work:the API accepts
Authorization: Bearer, a rawAuthorizationvalue, andx-api-key. So this is an alignment with the documented convention, not afix for a broken 0.0.1 — 0.0.1 authenticates correctly today. The header is now
set explicitly rather than inherited, and the test suite asserts it on the wire
so a library default can't silently move it.
PRIVACY.mdis updated to match.Fixed —
get_match's declaredoutput_schemawas structurally wrong. Amis-indented block left
market.prices.itemsnull and leaked two junk keys intomarket.properties. It was valid YAML, so it parsed; it just parsed into thewrong shape, and a workflow reading the schema saw the wrong contract.
This is a breaking change for existing 0.0.1 workflows — tool names change.
The shipped README carries a migration section.
Every tool is a
GET. The plugin has no write path of any kind.Two things worth a reviewer's attention:
or an unusable parameter all return
ok: falsewith areasonand aplain-English message, so a workflow node never dies on a state the author
should be branching on. Handed a bare 403, an agent invents a reason or
retries pointlessly; handed a sentence, it relays the remedy and moves on.
JSON message with the identical facts for a workflow to consume without
re-parsing English. Both are declared in each tool's
output_schema.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
Vendor disclosure. I am the operator of the Live Tennis API, the service this
plugin wraps, and the publisher of the
livetennisapiPyPI package it dependson. This is a first-party integration, not a third-party wrapper. Stating it
plainly so the dependency and the risk classification can be judged with that in
view.
Network destinations. One, fixed and documented:
https://api.livetennisapi.com/api/public/v1. It is a module constant inlivetennisapi_client.py, deliberately not exposed as a credential or atool parameter, so the destination cannot be redirected by a user, a workflow or
a model. No arbitrary URL fetching, proxying, crawling or webhook forwarding.
Sensitive capabilities: none. No command or code execution, no shell, no
SQL, no database access, no SSH/SFTP, no filesystem operations, no browser
automation, no bundled binaries. Every tool issues a
GETand formats theresponse.
Credentials. A single
api_key(secret-input), sent in thex-api-keyheader to the one host above. It is never logged, never included in an error
message, and never returned in tool output. The plugin writes no files and keeps
no cache or state between invocations.
Input constraints.
limitis coerced and clamped to 1–200 (the API's ownceiling) rather than rejected.
statusandtourare case-folded and matchedagainst a fixed allow-list, falling back to a default instead of being forwarded.
Id parameters are coerced to integers and answered with a normal result if
unusable — no request leaves the plugin for a bad parameter. Requests carry a
30-second timeout.
Note on the previous version's risk profile. 0.0.1 included a
get_match_oddstool reporting match-winner market prices, which I flagged forre-classification at the time. That tool is removed in 0.0.2. Market prices
now appear only as an optional embedded block inside
get_match, stillread-only reporting of publicly published prices. The plugin cannot place,
modify, settle or transact anything and moves no money or assets; there is no
write path to any venue. I have kept the Low risk label on that basis — happy for
it to be raised if you read it differently.
Data returned is public professional-sport information: player names,
nationalities, rankings, handedness, dates of birth, match results and scores. No
Dify user identity, conversation content, prompt or workflow variable is sent
anywhere. See
PRIVACY.md.Dependencies: two lines.