【DeepSeek】Python的一个demo,调用DS API

Python程序调用Deepseek的API(使用requests而非openai)


贴主在使用Python编写某功能时,尝试了使用Deepseek的API进行服务。官网没有给相关的demo,或者demo使用的openai的框架,不够灵活。
同时,网络上暂未出现合适的博客,讲授这个基础功能。于是写这个博客用来简单写几个demo,供各位使用。

A0_请求DS服务器状态.py

根据status.deepseek.com得到Deepseek官网服务器情况
在这里插入图片描述

# 该程序用于向status页请求服务器状态
#   可作为调用API,却返回超时后,自动筛查的脚本
## AIGC声明:DeepSeek v3- 网页

import requests

def check_deepseek_status():
    url = "https://status.deepseek.com/api/v2/status.json"
    # 2025/03 可用
    
    try:
        response = requests.get(url)
        response.raise_for_status()  # 检查请求是否成功
        
        data = response.json()
        
        # 解析并打印状态信息
        status = data.get('status', {
    
    })
        description = status.get('description', 'No description available')
        indicator = status.get('indicator', 'No indicator available')
        # 良好的时候,该json返回的全文是;该报文是2025/03/12 15:15 东八区时区申请的。
        '''
        {
            "page": {
                "id": "0db0rq26tg1l",
                "name": "DeepSeek Service",
                "url": "https://status.deepseek.com",
                "time_zone": "Asia/Shanghai",
                "updated_at": "2025-03-12T10:59:30.245+08:00"
            },
            "status": {
                "indicator": "none",
                "description": "All Systems Operational"
            }
        }                
        '''
        
        print(f"Current DeepSeek Status: {
      
      indicator}")
        print(f"Description: {
      
      description}")
    
    except requests.exceptions.RequestException as e:
        print(f"An error occurred: {
      
      e}")

if __name__ == "__main__":
    check_deepseek_status()

A1_deepseek问答.py

无日志、无上下文的简单问答

# 该程序用于进行deepseek进行简单的访问
#       需要重新更改API
# 1. 无日志
# 2. 无上下文(即每一次问答互不相关)
## AIGC声明:DeepSeek v3- 网页


import requests

# 替换为你的 DeepSeek API 密钥
DEFAULT_API_KEY = 'Change with Your apikey'
API_URL = 'https://api.deepseek.com/v1/chat/completions'  # 确认正确的 API 端点

def get_deepseek_response(user_input,API_KEY):
    headers = {
    
    
        'Authorization': f'Bearer {
      
      API_KEY}',
        'Content-Type': 'application/json'
    }
    
    data = {
    
    
        'model': 'deepseek-chat',  # 模型名称
        'messages': [
            {
    
    'role': 'user', 'content': user_input}
        ],
        'max_tokens': 150,  # 返回token最大值
        'temperature': 0.7 # 温度,代码类使用0,数据分析1,创意、诗歌1.5
    }
    
    response = requests.post(API_URL, headers=headers, json=data)
    
    if response.status_code == 200:
        return response.json()['choices'][0]['message']['content'].strip()
    else:
        return f"Error: {
      
      response.status_code}, {
      
      response.text}"

def main():
    # 提示用户输入 API 密钥
    api_key = input("请输入你的 DeepSeek API 密钥(直接按回车使用默认密钥):").strip()
    if not api_key:
        api_key = DEFAULT_API_KEY
        print("使用默认 API 密钥。")

    print("DeepSeek Chatbot (输入 'exit' 或 'quit' 退出)")

    while True:
        user_input = input("You: ")
        if user_input.lower() in ['exit', 'quit']:
            print("Goodbye!")
            break
        
        response = get_deepseek_response(user_input,api_key)
        print(f"DeepSeek: {
      
      response}")

if __name__ == "__main__":
    main()

A2_DS-无上下文-含提示信息.py

有实时日志、无上下文的简单测试问答

# 该程序用于进行deepseek进行简单的访问
#       需要重新更改API
#       输出时带有请求信息
# 1. 有日志,实时显示,不会存储
# 2. 无上下文(即每一次问答互不相关)
## AIGC声明:DeepSeek v3- 网页


import requests
import logging
from typing import Dict, Optional, Any

# 配置日志记录
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
logger = logging.getLogger(__name__)

class DeepSeekClient:
    def __init__(self, api_key: str, api_url: str = "https://api.deepseek.com/v1/chat/completions"):
        """
        初始化 DeepSeek 客户端。

        :param api_key: DeepSeek API 密钥。
        :param api_url: DeepSeek API 端点 URL,默认为聊天补全 API。
        """
        self.api_key = api_key
        self.api_url = api_url
        self.session = requests.Session()  # 使用会话以复用连接
        self.session.headers.update({
    
    
            'Authorization': f'Bearer {
      
      self.api_key}',
            'Content-Type': 'application/json'
        })

    def get_response(self, prompt: str, model: str = "deepseek-chat", max_tokens: int = 150, temperature: float = 0.7) -> Optional[str]:
        """
        调用 DeepSeek API 获取响应。

        :param prompt: 用户输入的提示文本。
        :param model: 使用的模型名称,默认为 "deepseek-chat"。
        :param max_tokens: 生成文本的最大 token 数,默认为 150。
        :param temperature: 控制生成文本的随机性,默认为 0.7。
        :return: 返回生成的文本,如果出错则返回 None。
        """
        data = {
    
    
            'model': model,
            'messages': [{
    
    'role': 'user', 'content': prompt}],
            'max_tokens': max_tokens,
            'temperature': temperature
        }

        try:
            logger.info(f"Sending request to {
      
      self.api_url} with data: {
      
      data}")
            response = self.session.post(self.api_url, json=data)
            response.raise_for_status()  # 如果响应状态码不是 200,抛出异常

            result = response.json()
            logger.info(f"Received response: {
      
      result}")

            # 提取生成的文本
            if 'choices' in result and len(result['choices']) > 0:
                return result['choices'][0]['message']['content'].strip()
            else:
                logger.error("No choices found in the response.")
                return None

        except requests.exceptions.RequestException as e:
            logger.error(f"Request failed: {
      
      e}")
            return None
        except KeyError as e:
            logger.error(f"Invalid response format: {
      
      e}")
            return None

    def close(self):
        """关闭会话,释放资源。"""
        self.session.close()

def main():
    # 替换为你的 DeepSeek API 密钥
    DEFAULT_API_KEY = 'Change with Your apikey'
    # 提示用户输入 API 密钥
    api_key = input("请输入你的 DeepSeek API 密钥(直接按回车使用默认密钥):").strip()
    if not api_key:
        api_key = DEFAULT_API_KEY
        print("使用默认 API 密钥。")

    client = DeepSeekClient(api_key=api_key)

    print("DeepSeek Chatbot (Type 'exit' or 'quit' to end)")
    while True:
        user_input = input("You: ")
        if user_input.lower() in ['exit', 'quit']:
            print("Goodbye!")
            break

        response = client.get_response(user_input)
        if response:
            print(f"DeepSeek: {
      
      response}")
        else:
            print("Sorry, an error occurred while processing your request.")

    client.close()

if __name__ == "__main__":
    main()

A3_DS含有上下文.py

有实时日志、有上下文的简单测试问答

# 该程序用于进行deepseek进行简单的访问
#       需要重新更改API
#       输出时带有请求信息
#       带有上下文(使用clear清除上下文)
# 1. 有日志,实时显示,不会存储
# 2. 有上下文
## AIGC声明:DeepSeek v3- 网页


import requests
import logging
from typing import Dict, List, Optional, Any

# 配置日志记录
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
logger = logging.getLogger(__name__)

class DeepSeekClient:
    def __init__(self, api_key: str, api_url: str = "https://api.deepseek.com/v1/chat/completions"):
        """
        初始化 DeepSeek 客户端。

        :param api_key: DeepSeek API 密钥。
        :param api_url: DeepSeek API 端点 URL,默认为聊天补全 API。
        """
        self.api_key = api_key
        self.api_url = api_url
        self.session = requests.Session()  # 使用会话以复用连接
        self.session.headers.update({
    
    
            'Authorization': f'Bearer {
      
      self.api_key}',
            'Content-Type': 'application/json'
        })
        self.messages = []  # 存储对话上下文

    def get_response(self, prompt: str, model: str = "deepseek-chat", max_tokens: int = 150, temperature: float = 0.7) -> Optional[str]:
        """
        调用 DeepSeek API 获取响应,并维护对话上下文。

        :param prompt: 用户输入的提示文本。
        :param model: 使用的模型名称,默认为 "deepseek-chat"。
        :param max_tokens: 生成文本的最大 token 数,默认为 150。
        :param temperature: 控制生成文本的随机性,默认为 0.7。
        :return: 返回生成的文本,如果出错则返回 None。
        """
        # 将用户输入添加到上下文
        self.messages.append({
    
    'role': 'user', 'content': prompt})

        data = {
    
    
            'model': model,
            'messages': self.messages,  # 包含上下文的对话记录
            'max_tokens': max_tokens,
            'temperature': temperature
        }

        try:
            logger.info(f"Sending request to {
      
      self.api_url} with data: {
      
      data}")
            response = self.session.post(self.api_url, json=data)
            response.raise_for_status()  # 如果响应状态码不是 200,抛出异常

            result = response.json()
            logger.info(f"Received response: {
      
      result}")

            # 提取生成的文本
            if 'choices' in result and len(result['choices']) > 0:
                assistant_reply = result['choices'][0]['message']['content'].strip()
                # 将助手的回复添加到上下文
                self.messages.append({
    
    'role': 'assistant', 'content': assistant_reply})
                return assistant_reply
            else:
                logger.error("No choices found in the response.")
                return None

        except requests.exceptions.RequestException as e:
            logger.error(f"Request failed: {
      
      e}")
            return None
        except KeyError as e:
            logger.error(f"Invalid response format: {
      
      e}")
            return None

    def clear_context(self):
        """清空对话上下文。"""
        self.messages = []

    def close(self):
        """关闭会话,释放资源。"""
        self.session.close()

def main():
    # 替换为你的 DeepSeek API 密钥
    DEFAULT_API_KEY = 'Change with Your apikey'
    # 提示用户输入 API 密钥
    api_key = input("请输入你的 DeepSeek API 密钥(直接按回车使用默认密钥):").strip()
    if not api_key:
        api_key = DEFAULT_API_KEY
        print("使用默认 API 密钥。")
    client = DeepSeekClient(api_key=api_key)

    print("DeepSeek Chatbot (Type 'exit' or 'quit' to end, 'clear' to reset context)")
    while True:
        user_input = input("You: ")
        if user_input.lower() in ['exit', 'quit']:
            print("Goodbye!")
            break
        elif user_input.lower() == 'clear':
            client.clear_context()
            print("Context cleared.")
            continue

        response = client.get_response(user_input)
        if response:
            print(f"DeepSeek: {
      
      response}")
        else:
            print("Sorry, an error occurred while processing your request.")

    client.close()

if __name__ == "__main__":
    main()

A4_DS含有上下文-存log.py

有实时日志、有上下文的简单测试问答;使用clear清除上下文;使用exit退出时写入日志
在这里插入图片描述

# 该程序用于进行deepseek进行简单的访问
#       需要重新更改API
#       输出不带有请求信息
#       带有上下文(使用clear清除上下文)
# 1. 有日志,不实时显示,存储
# 2. 有上下文
## AIGC声明:DeepSeek v3- 网页


import requests
import logging
import time
from typing import Optional

# 默认的 API 密钥和端点
DEFAULT_API_KEY = 'Change with Your apikey'
API_URL = 'https://api.deepseek.com/v1/chat/completions'  # 确认正确的 API 端点

class DeepSeekClient:
    def __init__(self, api_key: str, api_url: str = API_URL):
        """
        初始化 DeepSeek 客户端。

        :param api_key: DeepSeek API 密钥。
        :param api_url: DeepSeek API 端点 URL,默认为聊天补全 API。
        """
        self.api_key = api_key
        self.api_url = api_url
        self.session = requests.Session()  # 使用会话以复用连接
        self.session.headers.update({
    
    
            'Authorization': f'Bearer {
      
      self.api_key}',
            'Content-Type': 'application/json'
        })
        self.messages = []  # 存储对话上下文

    def get_response(self, prompt: str, model: str = "deepseek-chat", max_tokens: int = 150, temperature: float = 0.7) -> Optional[str]:
        """
        调用 DeepSeek API 获取响应,并维护对话上下文。

        :param prompt: 用户输入的提示文本。
        :param model: 使用的模型名称,默认为 "deepseek-chat"。
        :param max_tokens: 生成文本的最大 token 数,默认为 150。
        :param temperature: 控制生成文本的随机性,默认为 0.7。
        :return: 返回生成的文本,如果出错则返回 None。
        """
        # 将用户输入添加到上下文
        self.messages.append({
    
    'role': 'user', 'content': prompt})

        data = {
    
    
            'model': model,
            'messages': self.messages,  # 包含上下文的对话记录
            'max_tokens': max_tokens,
            'temperature': temperature
        }

        try:
            logging.info(f"Sending request to {
      
      self.api_url} with data: {
      
      data}")
            response = self.session.post(self.api_url, json=data)
            response.raise_for_status()  # 如果响应状态码不是 200,抛出异常

            result = response.json()
            logging.info(f"Received response: {
      
      result}")

            # 提取生成的文本
            if 'choices' in result and len(result['choices']) > 0:
                assistant_reply = result['choices'][0]['message']['content'].strip()
                # 将助手的回复添加到上下文
                self.messages.append({
    
    'role': 'assistant', 'content': assistant_reply})
                return assistant_reply
            else:
                logging.error("No choices found in the response.")
                return None

        except requests.exceptions.RequestException as e:
            logging.error(f"Request failed: {
      
      e}")
            return None
        except KeyError as e:
            logging.error(f"Invalid response format: {
      
      e}")
            return None

    def clear_context(self):
        """清空对话上下文。"""
        self.messages = []
        logging.info("Context cleared.")

    def close(self):
        """关闭会话,释放资源。"""
        self.session.close()
        logging.info("Session closed.")

def setup_logging():
    """
    配置日志记录,将日志保存到以时间戳命名的文件中。
    """
    timestamp = time.strftime("%Y%m%d_%H%M%S")
    log_filename = f"deepseek_chatbot_{
      
      timestamp}.log"
    
    # 创建日志记录器
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    
    # 创建文件处理器
    file_handler = logging.FileHandler(log_filename)
    file_handler.setLevel(logging.INFO)
    
    # 创建日志格式
    formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
    file_handler.setFormatter(formatter)
    
    # 添加文件处理器到日志记录器
    logger.addHandler(file_handler)

def main():
    # 配置日志记录
    setup_logging()

    # 提示用户输入 API 密钥
    api_key = input("请输入你的 DeepSeek API 密钥(直接按回车使用默认密钥):").strip()
    if not api_key:
        api_key = DEFAULT_API_KEY
        print("使用默认 API 密钥。")
        logging.info("Using default API key.")

    client = DeepSeekClient(api_key=api_key)

    print("DeepSeek Chatbot (输入 'exit' 或 'quit' 退出, 输入 'clear' 清空上下文)")
    while True:
        user_input = input("You: ")
        if user_input.lower() in ['exit', 'quit']:
            print("Goodbye!")
            logging.info("Exiting program.")
            break
        elif user_input.lower() == 'clear':
            client.clear_context()
            print("上下文已清空。")
            continue

        response = client.get_response(user_input)
        if response:
            print(f"DeepSeek: {
      
      response}")
        else:
            print("抱歉,处理你的请求时出错了。")

    client.close()

if __name__ == "__main__":
    main()

备注

  • AIGC声明:使用Deepseek V3 模型,在官方网页版使用。
  • 需使用自己的API_KEY