langgenius / dify

Dify is an open-source LLM app development platform. Dify's intuitive interface combines AI workflow, RAG pipeline, agent capabilities, model management, observability features and more, letting you quickly go from prototype to production.
https://dify.ai
Other
42.73k stars 5.91k forks source link

api error: name 'requests' is not defined #6044

Closed eskaviam closed 1 week ago

eskaviam commented 1 month ago

Self Checks

Dify version

0.6.12-fix1

Cloud or Self Hosted

Cloud

Steps to reproduce

Curl curl -X POST 'https://api.dify.ai/v1/chat-messages' \ --header 'Authorization: Bearer {api_key}' \ --header 'Content-Type: application/json' \ --data-raw '{ "inputs": {}, "query": "describe image", "response_mode": "blocking", "conversation_id": "", "user": "abc-123", "files": [ { "type": "image", "transfer_method": "remote_url", "url": "https://cloud.dify.ai/logo/logo-site.png" } ] }'

✔️ Expected Behavior

Expected behaviour is returning the correct response

❌ Actual Behavior

Got this response instead

{ "code": "completion_request_error", "message": "[vertex_ai] Error: Failed to fetch image data from url https://cloud.dify.ai/logo/logo-site.png, name 'requests' is not defined", "status": 400 }

dosubot[bot] commented 1 month ago

@eskaviam Hello there! I'm a bot designed to help you with bug reports, questions, and contributing to the repository. I'm here to assist you while waiting for a human maintainer.

To resolve the 'requests' library not being defined error when making a POST request to the chat-messages endpoint in the Dify API version 0.6.12-fix1, ensure that the requests library is imported at the beginning of your script. The provided code already includes the necessary import statement:

import requests

Make sure this import statement is present at the top of your script. If it is missing, add it to avoid the 'requests' library not being defined error. Here is the relevant part of the code with the import statement:

import requests

class DifyClient:
    def __init__(self, api_key):
        self.api_key = api_key
        self.base_url = "https://api.dify.ai/v1"

    def _send_request(self, method, endpoint, json=None, params=None, stream=False):
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }

        url = f"{self.base_url}{endpoint}"
        response = requests.request(method, url, json=json, params=params, headers=headers, stream=stream)

        return response

    def _send_request_with_files(self, method, endpoint, data, files):
        headers = {
            "Authorization": f"Bearer {self.api_key}"
        }

        url = f"{self.base_url}{endpoint}"
        response = requests.request(method, url, data=data, headers=headers, files=files)

        return response

    def message_feedback(self, message_id, rating, user):
        data = {
            "rating": rating,
            "user": user
        }
        return self._send_request("POST", f"/messages/{message_id}/feedbacks", data)

    def get_application_parameters(self, user):
        params = {"user": user}
        return self._send_request("GET", "/parameters", params=params)

    def file_upload(self, user, files):
        data = {
            "user": user
        }
        return self._send_request_with_files("POST", "/files/upload", data=data, files=files)

class CompletionClient(DifyClient):
    def create_completion_message(self, inputs, response_mode, user, files=None):
        data = {
            "inputs": inputs,
            "response_mode": response_mode,
            "user": user,
            "files": files
        }
        return self._send_request("POST", "/completion-messages", data,
                                  stream=True if response_mode == "streaming" else False)

class ChatClient(DifyClient):
    def create_chat_message(self, inputs, query, user, response_mode="blocking", conversation_id=None, files=None):
        data = {
            "inputs": inputs,
            "query": query,
            "user": user,
            "response_mode": response_mode,
            "files": files
        }
        if conversation_id:
            data["conversation_id"] = conversation_id

        return self._send_request("POST", "/chat-messages", data,
                                  stream=True if response_mode == "streaming" else False)

    def get_conversation_messages(self, user, conversation_id=None, first_id=None, limit=None):
        params = {"user": user}

        if conversation_id:
            params["conversation_id"] = conversation_id
        if first_id:
            params["first_id"] = first_id
        if limit:
            params["limit"] = limit

        return self._send_request("GET", "/messages", params=params)

    def get_conversations(self, user, last_id=None, limit=None, pinned=None):
        params = {"user": user, "last_id": last_id, "limit": limit, "pinned": pinned}
        return self._send_request("GET", "/conversations", params=params)

    def rename_conversation(self, conversation_id, name, user):
        data = {"name": name, "user": user}
        return self._send_request("POST", f"/conversations/{conversation_id}/name", data)

Ensure that the requests library is installed in your environment. You can install it using pip if it is not already installed:

pip install requests

Additionally, you can refer to the Dify API documentation for more details on making API requests. Here is an example of making a POST request to the chat-messages endpoint using the requests library in Python:

import requests
import json

url = 'https://api.dify.ai/v1/chat-messages'
headers = {
    'Authorization': 'Bearer ENTER-YOUR-SECRET-KEY',
    'Content-Type': 'application/json',
}
data = {
    "inputs": {},
    "query": "describe image",
    "response_mode": "blocking",
    "conversation_id": "",
    "user": "abc-123",
    "files": [
        {
            "type": "image",
            "transfer_method": "remote_url",
            "url": "https://cloud.dify.ai/logo/logo-site.png"
        }
    ]
}

response = requests.post(url, headers=headers, data=json.dumps(data))

print(response.json())

Make sure to replace ENTER-YOUR-SECRET-KEY with your actual API key [1][2].

To continue talking to Dosu, mention @dosu.