diff --git a/en/.gitbook/assets/screenshot-20231128-104353 (1).png b/en/.gitbook/assets/screenshot-20231128-104353 (1).png
new file mode 100644
index 0000000..cf9c94d
Binary files /dev/null and b/en/.gitbook/assets/screenshot-20231128-104353 (1).png differ
diff --git a/en/.gitbook/assets/screenshot-20231128-104353.png b/en/.gitbook/assets/screenshot-20231128-104353.png
new file mode 100644
index 0000000..cf9c94d
Binary files /dev/null and b/en/.gitbook/assets/screenshot-20231128-104353.png differ
diff --git a/en/.gitbook/assets/spaces_CdDIVDY6AtAz028MFT4d_uploads_8EgAgdMcArHAaJJFEEWA_ngrock copy.jpg b/en/.gitbook/assets/spaces_CdDIVDY6AtAz028MFT4d_uploads_8EgAgdMcArHAaJJFEEWA_ngrock copy.jpg
new file mode 100644
index 0000000..a759113
Binary files /dev/null and b/en/.gitbook/assets/spaces_CdDIVDY6AtAz028MFT4d_uploads_8EgAgdMcArHAaJJFEEWA_ngrock copy.jpg differ
diff --git a/en/.gitbook/assets/spaces_CdDIVDY6AtAz028MFT4d_uploads_Z1SpULkGZ0xDBnSXOhC1_8000.webp b/en/.gitbook/assets/spaces_CdDIVDY6AtAz028MFT4d_uploads_Z1SpULkGZ0xDBnSXOhC1_8000.webp
new file mode 100644
index 0000000..fcb794c
Binary files /dev/null and b/en/.gitbook/assets/spaces_CdDIVDY6AtAz028MFT4d_uploads_Z1SpULkGZ0xDBnSXOhC1_8000.webp differ
diff --git a/en/.gitbook/assets/spaces_CdDIVDY6AtAz028MFT4d_uploads_kLpE7vN8jg1KrzeCWZtn_download.webp b/en/.gitbook/assets/spaces_CdDIVDY6AtAz028MFT4d_uploads_kLpE7vN8jg1KrzeCWZtn_download.webp
new file mode 100644
index 0000000..174eabd
Binary files /dev/null and b/en/.gitbook/assets/spaces_CdDIVDY6AtAz028MFT4d_uploads_kLpE7vN8jg1KrzeCWZtn_download.webp differ
diff --git a/en/advanced/extension/api_based_extension/README.md b/en/advanced/extension/api_based_extension/README.md
index 26dfa3e..3fdb4f2 100644
--- a/en/advanced/extension/api_based_extension/README.md
+++ b/en/advanced/extension/api_based_extension/README.md
@@ -5,52 +5,57 @@ Developers can extend module capabilities through the API extension module. Curr
* `moderation`
* `external_data_tool`
-Before extending module capabilities, you need to prepare an API and an API Key for authentication (which can also be automatically generated by Dify, optional). In addition to developing the corresponding module capabilities, you also need to follow the specifications below so that Dify can invoke the API correctly.\
+Before extending module capabilities, prepare an API and an API Key for authentication, which can also be automatically generated by Dify. In addition to developing the corresponding module capabilities, follow the specifications below so that Dify can invoke the API correctly.
+ Add API Extension
pip install 'fastapi[all]' uvicorn
+
+
+#### Write code according to the interface specifications.
+
+from fastapi import FastAPI, Body, HTTPException, Header
+from pydantic import BaseModel
+
+app = FastAPI()
- class InputData(BaseModel):
- point: str
- params: dict
+class InputData(BaseModel):
+ point: str
+ params: dict
- @app.post("/api/dify/receive")
- async def dify_receive(data: InputData = Body(...), authorization: str = Header(None)):
- """
- Receive API query data from Dify.
- """
- expected_api_key = "123456" # TODO Your API key of this API
- auth_scheme, _, api_key = authorization.partition(' ')
+@app.post("/api/dify/receive")
+async def dify_receive(data: InputData = Body(...), authorization: str = Header(None)):
+ """
+ Receive API query data from Dify.
+ """
+ expected_api_key = "123456" # TODO Your API key of this API
+ auth_scheme, _, api_key = authorization.partition(' ')
- if auth_scheme.lower() != "bearer" or api_key != expected_api_key:
- raise HTTPException(status_code=401, detail="Unauthorized")
+ if auth_scheme.lower() != "bearer" or api_key != expected_api_key:
+ raise HTTPException(status_code=401, detail="Unauthorized")
- point = data.point
+ point = data.point
- # for debug
- print(f"point: {point}")
+ # for debug
+ print(f"point: {point}")
- if point == "ping":
- return {
- "result": "pong"
- }
- if point == "app.external_data_tool.query":
- return handle_app_external_data_tool_query(params=data.params)
- # elif point == "{point name}":
- # TODO other point implementation here
+ if point == "ping":
+ return {
+ "result": "pong"
+ }
+ if point == "app.external_data_tool.query":
+ return handle_app_external_data_tool_query(params=data.params)
+ # elif point == "{point name}":
+ # TODO other point implementation here
- raise HTTPException(status_code=400, detail="Not implemented")
+ raise HTTPException(status_code=400, detail="Not implemented")
- def handle_app_external_data_tool_query(params: dict):
- app_id = params.get("app_id")
- tool_variable = params.get("tool_variable")
- inputs = params.get("inputs")
- query = params.get("query")
+def handle_app_external_data_tool_query(params: dict):
+ app_id = params.get("app_id")
+ tool_variable = params.get("tool_variable")
+ inputs = params.get("inputs")
+ query = params.get("query")
- # for debug
- print(f"app_id: {app_id}")
- print(f"tool_variable: {tool_variable}")
- print(f"inputs: {inputs}")
- print(f"query: {query}")
+ # for debug
+ print(f"app_id: {app_id}")
+ print(f"tool_variable: {tool_variable}")
+ print(f"inputs: {inputs}")
+ print(f"query: {query}")
- # TODO your external data tool query implementation here,
- # return must be a dict with key "result", and the value is the query result
- if inputs.get("location") == "London":
- return {
- "result": "City: London\nTemperature: 10°C\nRealFeel®: 8°C\nAir Quality: Poor\nWind Direction: ENE\nWind "
- "Speed: 8 km/h\nWind Gusts: 14 km/h\nPrecipitation: Light rain"
- }
- else:
- return {"result": "Unknown city"}
- ```
+ # TODO your external data tool query implementation here,
+ # return must be a dict with key "result", and the value is the query result
+ if inputs.get("location") == "London":
+ return {
+ "result": "City: London\nTemperature: 10°C\nRealFeel®: 8°C\nAir Quality: Poor\nWind Direction: ENE\nWind "
+ "Speed: 8 km/h\nWind Gusts: 14 km/h\nPrecipitation: Light rain"
+ }
+ else:
+ return {"result": "Unknown city"}
+
+
+#### Launch the API service.
+
+The default port is 8000. The complete address of the API is: `http://127.0.0.1:8000/api/dify/receive`with the configured API Key '123456'.
+
+uvicorn main:app --reload --host 0.0.0.0
+
+
+#### Configure this API in Dify.
+
+
.png)


