A Dify App Service-API Client, using for build a webapp by request Service-API
First, installdify-client python sdk package:
Write your code with sdk:
- completion generate with
blocking response_mode
fromdify_clientimportCompletionClientapi_key="your_api_key"# Initialize CompletionClientcompletion_client=CompletionClient(api_key)# Create Completion Message using CompletionClientcompletion_response=completion_client.create_completion_message(inputs={"query":"What's the weather like today?"},response_mode="blocking",user="user_id")completion_response.raise_for_status()result=completion_response.json()print(result.get('answer'))- completion using vision model, like gpt-4-vision
fromdify_clientimportCompletionClientapi_key="your_api_key"# Initialize CompletionClientcompletion_client=CompletionClient(api_key)files= [{"type":"image","transfer_method":"remote_url","url":"your_image_url"}]# files = [{# "type": "image",# "transfer_method": "local_file",# "upload_file_id": "your_file_id"# }]# Create Completion Message using CompletionClientcompletion_response=completion_client.create_completion_message(inputs={"query":"Describe the picture."},response_mode="blocking",user="user_id",files=files)completion_response.raise_for_status()result=completion_response.json()print(result.get('answer'))- chat generate with
streaming response_mode
importjsonfromdify_clientimportChatClientapi_key="your_api_key"# Initialize ChatClientchat_client=ChatClient(api_key)# Create Chat Message using ChatClientchat_response=chat_client.create_chat_message(inputs={},query="Hello",user="user_id",response_mode="streaming")chat_response.raise_for_status()forlineinchat_response.iter_lines(decode_unicode=True):line=line.split('data:',1)[-1]ifline.strip():line=json.loads(line.strip())print(line.get('answer'))- chat using vision model, like gpt-4-vision
fromdify_clientimportChatClientapi_key="your_api_key"# Initialize ChatClientchat_client=ChatClient(api_key)files= [{"type":"image","transfer_method":"remote_url","url":"your_image_url"}]# files = [{# "type": "image",# "transfer_method": "local_file",# "upload_file_id": "your_file_id"# }]# Create Chat Message using ChatClientchat_response=chat_client.create_chat_message(inputs={},query="Describe the picture.",user="user_id",response_mode="blocking",files=files)chat_response.raise_for_status()result=chat_response.json()print(result.get("answer"))- upload file when using vision model
fromdify_clientimportDifyClientapi_key="your_api_key"# Initialize Clientdify_client=DifyClient(api_key)file_path="your_image_file_path"file_name="panda.jpeg"mime_type="image/jpeg"withopen(file_path,"rb")asfile:files= {"file": (file_name,file,mime_type) }response=dify_client.file_upload("user_id",files)result=response.json()print(f'upload_file_id:{result.get("id")}')fromdify_clientimportChatClientapi_key="your_api_key"# Initialize Clientclient=ChatClient(api_key)# Get App parametersparameters=client.get_application_parameters(user="user_id")parameters.raise_for_status()print('[parameters]')print(parameters.json())# Get Conversation List (only for chat)conversations=client.get_conversations(user="user_id")conversations.raise_for_status()print('[conversations]')print(conversations.json())# Get Message List (only for chat)messages=client.get_conversation_messages(user="user_id",conversation_id="conversation_id")messages.raise_for_status()print('[messages]')print(messages.json())# Rename Conversation (only for chat)rename_conversation_response=client.rename_conversation(conversation_id="conversation_id",name="new_name",user="user_id")rename_conversation_response.raise_for_status()print('[rename result]')print(rename_conversation_response.json())- Using the Workflow Client
importjsonimportrequestsfromdify_clientimportWorkflowClientapi_key="your_api_key"# Initialize Workflow Clientclient=WorkflowClient(api_key)# Prepare parameters for Workflow Clientuser_id="your_user_id"context="previous user interaction / metadata"user_prompt="What is the capital of France?"inputs= {"context":context,"user_prompt":user_prompt,# Add other input fields expected by your workflow (e.g., additional context, task parameters)}# Set response mode (default: streaming)response_mode="blocking"# Run the workflowresponse=client.run(inputs=inputs,response_mode=response_mode,user=user_id)response.raise_for_status()# Parse resultresult=json.loads(response.text)answer=result.get("data").get("outputs")print(answer["answer"])fromdify_clientimportKnowledgeBaseClientapi_key="your_api_key"dataset_id="your_dataset_id"# Use context manager to ensure proper resource cleanupwithKnowledgeBaseClient(api_key,dataset_id)askb_client:# Get dataset informationdataset_info=kb_client.get_dataset()dataset_info.raise_for_status()print(dataset_info.json())# Update dataset configurationupdate_response=kb_client.update_dataset(name="Updated Dataset Name",description="Updated description",indexing_technique="high_quality" )update_response.raise_for_status()print(update_response.json())# Batch update document statusbatch_response=kb_client.batch_update_document_status(action="enable",document_ids=["doc_id_1","doc_id_2","doc_id_3"] )batch_response.raise_for_status()print(batch_response.json())
- Conversation Variables Management
fromdify_clientimportChatClientapi_key="your_api_key"# Use context manager to ensure proper resource cleanupwithChatClient(api_key)aschat_client:# Get all conversation variablesvariables=chat_client.get_conversation_variables(conversation_id="conversation_id",user="user_id" )variables.raise_for_status()print(variables.json())# Update a specific conversation variableupdate_var=chat_client.update_conversation_variable(conversation_id="conversation_id",variable_id="variable_id",value="new_value",user="user_id" )update_var.raise_for_status()print(update_var.json())
The SDK provides full async/await support for all API operations usinghttpx.AsyncClient. All async clients mirror their synchronous counterparts but requireawait for method calls.
- async chat with
blocking response_mode
importasynciofromdify_clientimportAsyncChatClientapi_key="your_api_key"asyncdefmain():# Use async context manager for proper resource cleanupasyncwithAsyncChatClient(api_key)asclient:response=awaitclient.create_chat_message(inputs={},query="Hello, how are you?",user="user_id",response_mode="blocking" )response.raise_for_status()result=response.json()print(result.get('answer'))# Run the async functionasyncio.run(main())- async completion with
streaming response_mode
importasyncioimportjsonfromdify_clientimportAsyncCompletionClientapi_key="your_api_key"asyncdefmain():asyncwithAsyncCompletionClient(api_key)asclient:response=awaitclient.create_completion_message(inputs={"query":"What's the weather?"},response_mode="streaming",user="user_id" )response.raise_for_status()# Stream the responseasyncforlineinresponse.aiter_lines():ifline.startswith('data:'):data=line[5:].strip()ifdata:chunk=json.loads(data)print(chunk.get('answer',''),end='',flush=True)asyncio.run(main())importasynciofromdify_clientimportAsyncWorkflowClientapi_key="your_api_key"asyncdefmain():asyncwithAsyncWorkflowClient(api_key)asclient:response=awaitclient.run(inputs={"query":"What is machine learning?"},response_mode="blocking",user="user_id" )response.raise_for_status()result=response.json()print(result.get("data").get("outputs"))asyncio.run(main())importasynciofromdify_clientimportAsyncKnowledgeBaseClientapi_key="your_api_key"dataset_id="your_dataset_id"asyncdefmain():asyncwithAsyncKnowledgeBaseClient(api_key,dataset_id)askb_client:# Get dataset informationdataset_info=awaitkb_client.get_dataset()dataset_info.raise_for_status()print(dataset_info.json())# List documentsdocs=awaitkb_client.list_documents(page=1,page_size=10)docs.raise_for_status()print(docs.json())asyncio.run(main())
Benefits of Async Usage:
- Better Performance: Handle multiple concurrent API requests efficiently
- Non-blocking I/O: Don't block the event loop during network operations
- Scalability: Ideal for applications handling many simultaneous requests
- Modern Python: Leverages Python's native async/await syntax
Available Async Clients:
AsyncDifyClient - Base async clientAsyncChatClient - Async chat operationsAsyncCompletionClient - Async completion operationsAsyncWorkflowClient - Async workflow operationsAsyncKnowledgeBaseClient - Async dataset/knowledge base operationsAsyncWorkspaceClient - Async workspace operations