Django连接Azure服务器里的gpt-4o并实现聊天功能

View.py

python 复制代码
# 配置OpenAI API
api_key = ""
# 配置OpenAI APIURL
endpoint = ""
# 配置模型名称
deployment_name = "gpt-4o-0312"
# 配置API版本
api_version = "2023-03-15-preview"
# 初始化 tiktoken 编码器,计算详细token值
encoding = tiktoken.encoding_for_model("gpt-4o")


# 计算token数量
def count_tokens(text):
    return len(encoding.encode(text))


# 连接Openai并发送请求传递到页面
def dify_Azure(request):
    b_token = request.COOKIES.get('b_token')
    if b_token is None:
        return redirect("B_Login:b_login")
    else:
        b_token = request.COOKIES.get('b_token')
        A = B_user.objects.using('default').filter(b_power="1").filter(b_token=b_token).values_list('b_user',
                                                                                                    flat=True).first()
        B = B_usertwo.objects.using('default').filter(b_power="2").filter(b_token=b_token).values_list('b_user',
                                                                                                       flat=True).first()
        if A or B:
            # 发送请求到OpenAI API
            headers = {
                "Content-Type": "application/json",
                "api-key": api_key
            }
            speak = request.GET.get('speak')
            data = {
                # 与OpenAI对话
                "messages": [
                    {"role": "user", "content": speak}
                ],
                # 限制max_tokens的合理值
                "max_tokens": 10000
            }

            try:
                url = f"{endpoint}openai/deployments/{deployment_name}/chat/completions?api-version={api_version}"
                response = requests.post(url, headers=headers, data=json.dumps(data))
                if response.status_code == 200:
                    response_data = response.json()
                    content = response_data['choices'][0]['message']['content']
                    # 计算token数量
                    user_tokens = count_tokens(data['messages'][0]['content'])
                    response_tokens = count_tokens(content)
                    # 计算总token数量并输出页面
                    total_tokens = user_tokens + response_tokens
                    return render(request, 'dify_AzureAI.html', {'response': content, 'speak': speak, 'A': A, 'B': B})
                else:
                    # 捕获连接、请求失败、账户资金缺少错误信息
                    errorcontent = f"Error: {response.status_code} - {response.text}"
                    return render(request, 'dify_AzureAI.html')
            # 捕获其他异常错误
            except requests.exceptions.RequestException as e:
                errorcontent = f"Request failed: {str(e)}"
                return render(request, 'dify_AzureAI.html', {'response': errorcontent})
        else:
            return redirect("Error_Page:authority_warn")

dify_AzureAI.html

python 复制代码
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta content="width=device-width, initial-scale=1, maximum-scale=1, shrink-to-fit=no" name="viewport">
    <meta name="robots" content="noindex, nofollow">
    <link href="{% static 'plugin/assets/lib/perfect-scrollbar/css/perfect-scrollbar.css' %}" rel="stylesheet">
    <link href="{% static 'plugin/assets/lib/metismenu/css/metisMenu.min.css' %}" rel="stylesheet">
    <link href="{% static 'plugin/assets/lib/bootstrap/bootstrap.min.css' %}" rel="stylesheet">
    <link href="{% static 'plugin/assets/css/main.css' %}" rel="stylesheet">
    <style>
        html, body {
            margin: 0;
            padding: 0;
            overflow: hidden;
        }

        .chat-container {
            height: 80vh;
            overflow-y: auto;
            border: 1px solid #dee2e6;
            border-radius: .375rem;
            background-color: #ffffff;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
            padding: 20px;
            margin-bottom: 20px;
        }

        .message {
            margin-bottom: 1rem;
            display: flex;
            align-items: flex-end;
        }

        .message.user {
            flex-direction: row-reverse;
        }

        .message-content {
            padding: 10px 15px;
            border-radius: .375rem;
            position: relative;
            max-width: 75%;
            word-wrap: break-word;
            box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
        }

        .message.user .message-content {
            background-color: #39BAF5;
            color: white;
            border-top-right-radius: 0;
            word-wrap: break-word;
        }

        .message .message-content {
            background-color: #f1f1f1;
            color: #212529;
            border-top-left-radius: 0;
            word-wrap: break-word;
        }

        .typing-indicator {
            font-style: italic;
            color: #6c757d;
            margin-top: 5px;
            text-align: right;
        }

        .rr {
            display: flex;
            justify-content: center;
        }
    </style>
</head>
<body>
<div class="page-content">
    <div class="card">
        <div class="card-body">
            <div class="chat-container" id="chat-container">
                {% if response == None %}
                {% else %}
                    <div class="message">
                        <img src="{% static 'AI_head.jpg' %}" width="48" height="48" class="rounded-circle">
                        <div class="message-content">
                            &nbsp;{{ response }}&nbsp;
                        </div>
                    </div>
                {% endif %}
                {% if response == None %}
                {% else %}
                    <div class="message user">
                        <img src="{% static A.b_head %}" width="48" height="48" class="rounded-circle">
                        <div class="message-content">
                            {{ speak }}&nbsp;
                        </div>
                    </div>
                    <div id="typing-indicator" class="typing-indicator" style="display:none;">AI正在输入...</div>
                {% endif %}
            </div>
        </div>
        <div class="card-footer" style="margin-top: -30px;">
            <form method="get" id="chat-form" class="form-inline"
                  action="{% url 'Core_dify:dify_Azure' %}">{% csrf_token %}
                <div class="row rr">
                    <div class="col-auto col-sm-10">
                        <input type="text" class="form-control" name="speak" placeholder="请输入你与AI对话的消息...">
                    </div>
                    <div class="col-auto">
                        <button type="submit" class="btn btn-primary form-control"><i class="fas fa-sign-in-alt"></i>发送对话
                        </button>
                    </div>
                </div>
            </form>
        </div>
    </div>
</div>
<script src="{% static 'plugin/assets/lib/metismenu/js/metisMenu.min.js' %}"></script>
<script src="{% static 'plugin/assets/lib/perfect-scrollbar/js/perfect-scrollbar.js' %}"></script>
<script src="{% static 'plugin/assets/js/main.js' %}"></script>
<script>
    $(document).ready(function () {
        $('#chat-form').on('submit', function (e) {
            e.preventDefault();
            const message = $(this).find('input').val();
            if (message) {
                $('.chat-container').append(`
                    <div class="message user">
                        <img src="https://via.placeholder.com/40" class="avatar">
                        <div class="message-content">
                            ${message}
                        </div>
                    </div>
                `);
                $(this).find('input').val('');
                $('.chat-container').scrollTop($('.chat-container')[0].scrollHeight);
                showTypingIndicator();
            }
        });

        function showTypingIndicator() {
            $('#typing-indicator').show();
            setTimeout(() => {
                $('#typing-indicator').hide();
                const botMessage = "这是AI的自动回复。";
                $('.chat-container').append(`
                    <div class="message">
                        <img src="{% static 'AI_head.jpg' %}" width="48" height="48" class="rounded-circle">
                        <div class="message-content">
                            ${botMessage}
                        </div>
                    </div>
                `);
                $('.chat-container').scrollTop($('.chat-container')[0].scrollHeight);
            }, 2000);
        }
    });
</script>
</body>
</html>
相关推荐
小七-七牛开发者3 小时前
周一上线 | SpaceX 收购 Cursor、支付宝进入 AI 时代、DeepSeek 完成 500 亿元融资
ai·agent·token·glm·智谱·claudecode·ai coding·周一上线
doiito1 天前
【Agent Harness】为什么我把 JSON‑LD “编译成 DAG” 后,整个 Agent 平台立刻聪明了
ai·rust·架构设计·系统设计·ai agent
xiezhr1 天前
折腾半小时,终于让AI 能直接帮我写飞书文档了
ai·飞书·ai agent·飞书cli·飞书文档
岳小哥AI1 天前
Claude Fable和Claude Mythos 5同时发布:注意力机制下愈加强大的AI大模型
ai·ai基础
Artech1 天前
[MAF预定义的AIContextProvider-04]Mem0Provider——长期记忆基于的云端解决方案
ai·agent·maf·aicontextprovider·chathistorymemoryprovider·mem0provider
哥不是小萝莉2 天前
一文读懂 OpenAI Codex 源码的原理、架构与未来
ai
AlfredZhao2 天前
AI 编程工作总结:从体验问题到模块能力建设
ai·codex
zzzzzz3102 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
cup113 天前
[技术复盘] Windows Python 打包实战:Nuitka 环境踩坑总结与 CI 自动化构建全指南
python·ai·环境变量·ci·nuitka·skill
IT王师傅3 天前
从 豆包 到 Codex CLI:一名普通开发者的 AI 工具进化路线
ai·codex cli·openclaw