dify-client-python is a typed Python SDK for Dify Runtime APIs, covering chat, completion, workflow, file upload, feedback, and audio conversion endpoints.
- Python
>=3.8 - Dify Runtime API (cloud or self-hosted) compatible with
/v1endpoints
pip install dify-client-python- Sync and async clients:
Client,AsyncClient - Blocking and streaming response modes
- Chat and completion message APIs
- Workflow run/stream/stop APIs
- File upload APIs
- Message feedback and suggestion APIs
- Audio APIs:
audio-to-texttext-to-audio
- Updated stream event support for newer workflow/chatflow runtimes:
workflow_paused,iteration_*,loop_*,text_chunk,text_replacehuman_input_*,node_retry,agent_log,tts_message
import uuid from dify_client import Client, models client = Client( api_key="your-api-key", api_base="https://api.dify.ai/v1", ) user = str(uuid.uuid4()) req = models.ChatRequest( query="Hello from dify-client-python", inputs={}, user=user, response_mode=models.ResponseMode.BLOCKING, ) res = client.chat_messages(req, timeout=60.0) print(res.answer)stream_req = models.ChatRequest( query="Stream this answer", inputs={}, user=user, response_mode=models.ResponseMode.STREAMING, ) for event in client.chat_messages(stream_req, timeout=60.0): print(event.event, getattr(event, "answer", None))audio_text = client.audio_to_text( ("sample.wav", open("sample.wav", "rb"), "audio/wav"), models.AudioToTextRequest(user=user), ) print(audio_text.text) audio_bytes = client.text_to_audio( models.TextToAudioRequest(text="Hello world", user=user) ) with open("speech.mp3", "wb") as f: f.write(audio_bytes)import asyncio from dify_client import AsyncClient, models async_client = AsyncClient(api_key="your-api-key", api_base="https://api.dify.ai/v1") async def main(): req = models.ChatRequest( query="hello", inputs={}, user="user-1", response_mode=models.ResponseMode.STREAMING, ) async for chunk in await async_client.achat_messages(req, timeout=60.0): print(chunk.event) asyncio.run(main())- Do not hardcode production API keys in source code.
- Prefer environment variables or secret managers for
api_key. - The SDK injects
Authorization: Bearer ...headers, but does not log keys by default. - If you add your own logging middleware around requests, redact
Authorizationheaders.
python -m pip install -e . pytest pytest-cov flake8 build twine setuptools wheel python -m flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics python -m pytest -q --cov=dify_client --cov-report=term-missing python -m build --no-isolation python -m twine check --strict dist/*Use RELEASE.md for the release checklist and commands.