GLM Lambda API

基于 AWS Lambda 和智谱 GLM 的无服务器聊天 API

glm-4.7-flash | DynamoDB | Serverless
打开聊天界面

项目概述

本项目是一个基于 AWS Lambda 的无服务器聊天 API,集成了智谱 AI 的 GLM 大语言模型。支持多轮对话、会话管理和对话历史存储。

架构图

客户端 AWS Lambda GLM API

AWS Lambda DynamoDB

核心功能

部署信息

资源 详情
Lambda Function glm-chat
DynamoDB Table glm-conversations
Region us-east-1
Model glm-4.7-flash
Function URL https://kjkwvmbpiaxnzdnehfyjxcuela0twmre.lambda-url.us-east-1.on.aws/

API 使用说明

请求格式

POST https://kjkwvmbpiaxnzdnehfyjxcuela0twmre.lambda-url.us-east-1.on.aws/
Content-Type: application/json

{
    "message": "你的消息",
    "session_id": "用户会话ID",
    "model": "glm-4.7-flash",      // 可选,默认 glm-4.7-flash
    "new_session": false           // 可选,设为 true 开启新会话
}

请求参数

参数 类型 必填 说明
message string 用户发送的消息内容
session_id string 会话标识符,用于区分不同对话,默认 "default"
model string 使用的模型,默认 "glm-4.7-flash"
new_session boolean 是否开启新会话(忽略历史记录)

响应格式

{
    "reply": "AI 的回复内容",
    "session_id": "会话ID",
    "model": "使用的模型",
    "usage": {
        "prompt_tokens": 17,
        "completion_tokens": 634,
        "total_tokens": 651
    }
}

测试过程详解

测试 1:基础对话

请求

curl -X POST https://kjkwvmbpiaxnzdnehfyjxcuela0twmre.lambda-url.us-east-1.on.aws/ \
  -H 'Content-Type: application/json' \
  -d '{"message": "你好,介绍一下你自己", "session_id": "test123"}'

响应结果

{
    "reply": "你好!很高兴见到你。

我是一个由Z.ai训练的大型语言模型,名叫GLM。我的设计初衷是利用人工智能技术,
通过自然语言处理与你进行流畅的交互。

我旨在成为一个既专业又友好的助手,能够协助你处理各种任务。具体来说,我可以:

* 回答问题:无论是科学知识、历史事件还是生活常识。
* 提供信息:总结文章、翻译语言或解释复杂的概念。
* 协助创作:撰写邮件、诗歌、报告或进行头脑风暴。
* 提供建议:在学习和工作方法上给你一些启发。

我的目标是成为你学习、工作和生活中的得力助手。请问有什么我可以为你做的吗?",
    "session_id": "test123",
    "model": "glm-4.7-flash",
    "usage": {
        "completion_tokens": 634,
        "prompt_tokens": 17,
        "total_tokens": 651
    }
}

响应字段解析

测试 2:对话历史验证

请求

curl -X POST https://kjkwvmbpiaxnzdnehfyjxcuela0twmre.lambda-url.us-east-1.on.aws/ \
  -H 'Content-Type: application/json' \
  -d '{"message": "我刚才问了你什么问题?", "session_id": "test123"}'

响应结果

{
    "reply": "回顾我们刚才的对话,你只是向我问好,并让我介绍一下我自己。
除此之外,你还没有提出其他具体的问题。

你现在想问什么呢?或者有什么需要我协助的吗?",
    "session_id": "test123",
    "model": "glm-4.7-flash",
    "usage": {
        "completion_tokens": 535,
        "prompt_tokens": 175,
        "total_tokens": 710
    }
}
关键观察:
  • GLM 成功记住了之前的对话内容("你只是向我问好,并让我介绍一下我自己")
  • prompt_tokens 从 17 增加到 175,因为包含了历史对话
  • 这证明 DynamoDB 成功存储并检索了对话历史

Lambda 代码详解

完整代码

import json
import urllib.request
import os
import boto3
import time
import uuid

# 初始化 DynamoDB
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(os.environ.get('DYNAMODB_TABLE', 'glm-conversations'))
初始化部分:
  • boto3 - AWS SDK,用于操作 DynamoDB
  • urllib.request - 原生 HTTP 库,无需额外依赖
  • 表名从环境变量读取,便于配置管理

获取对话历史

def get_conversation_history(session_id, limit=10):
    """获取对话历史"""
    try:
        response = table.query(
            KeyConditionExpression='session_id = :sid',
            ExpressionAttributeValues={':sid': session_id},
            ScanIndexForward=False,  # 按时间倒序
            Limit=limit
        )
        items = response.get('Items', [])
        items.reverse()  # 恢复正序

        messages = []
        for item in items:
            messages.append({'role': 'user', 'content': item['user_message']})
            messages.append({'role': 'assistant', 'content': item['assistant_message']})
        return messages
    except Exception as e:
        print(f"Error getting history: {e}")
        return []
代码解析:
  • ScanIndexForward=False - 按时间戳倒序查询,获取最近的对话
  • Limit=10 - 限制返回最近 10 轮对话,避免 token 超限
  • items.reverse() - 恢复时间正序,符合对话流程
  • 将每条记录转换为 userassistant 消息对

保存对话记录

def save_conversation(session_id, user_message, assistant_message):
    """保存对话记录"""
    try:
        table.put_item(Item={
            'session_id': session_id,
            'timestamp': int(time.time() * 1000),
            'message_id': str(uuid.uuid4()),
            'user_message': user_message,
            'assistant_message': assistant_message,
            'ttl': int(time.time()) + 86400 * 7  # 7天后自动删除
        })
    except Exception as e:
        print(f"Error saving conversation: {e}")
代码解析:
  • session_id - 分区键,用于区分不同会话
  • timestamp - 排序键,毫秒级时间戳
  • message_id - UUID,确保唯一性
  • ttl - 7 天后自动删除,节省存储成本

调用 GLM API

def call_glm_api(messages, model, api_key):
    """调用 GLM API"""
    url = os.environ.get('GLM_API_URL',
        'https://api.z.ai/api/paas/v4/chat/completions')

    payload = {
        'model': model,
        'messages': messages,
        'max_tokens': 2048,
        'temperature': 0.7
    }

    headers = {
        'Authorization': f'Bearer {api_key}',
        'Content-Type': 'application/json'
    }

    req = urllib.request.Request(
        url,
        data=json.dumps(payload).encode('utf-8'),
        headers=headers,
        method='POST'
    )

    with urllib.request.urlopen(req, timeout=60) as response:
        return json.loads(response.read().decode('utf-8'))
代码解析:
  • 使用 Z.AI 国际版 API(api.z.ai),避免国内访问限制
  • max_tokens: 2048 - 限制回复长度
  • temperature: 0.7 - 控制创造性,0.7 是平衡值
  • timeout=60 - 60 秒超时,匹配 Lambda 配置

主处理函数

def lambda_handler(event, context):
    """Lambda 入口函数"""

    # 1. 获取 API Key
    api_key = os.environ.get('ZHIPU_API_KEY')
    if not api_key:
        return {
            'statusCode': 500,
            'body': json.dumps({'error': 'ZHIPU_API_KEY not configured'})
        }

    # 2. 解析请求(支持 API Gateway 和直接调用)
    if 'body' in event:
        body = json.loads(event.get('body', '{}'))
    else:
        body = event

    user_message = body.get('message', '你好')
    default_model = os.environ.get('DEFAULT_MODEL', 'glm-4.7-flash')
    model = body.get('model', default_model)
    session_id = body.get('session_id', 'default')
    new_session = body.get('new_session', False)

    try:
        # 3. 构建消息列表
        messages = [{'role': 'system', 'content': '你是一个有帮助的AI助手。'}]

        # 4. 获取历史对话(除非是新会话)
        if not new_session:
            history = get_conversation_history(session_id)
            messages.extend(history)

        # 5. 添加当前消息
        messages.append({'role': 'user', 'content': user_message})

        # 6. 调用 GLM API
        result = call_glm_api(messages, model, api_key)
        assistant_message = result['choices'][0]['message']['content']

        # 7. 保存对话
        save_conversation(session_id, user_message, assistant_message)

        # 8. 返回响应
        return {
            'statusCode': 200,
            'headers': {
                'Content-Type': 'application/json',
                'Access-Control-Allow-Origin': '*'  # 支持跨域
            },
            'body': json.dumps({
                'reply': assistant_message,
                'session_id': session_id,
                'model': model,
                'usage': result.get('usage', {})
            }, ensure_ascii=False)
        }

    except Exception as e:
        return {
            'statusCode': 500,
            'body': json.dumps({'error': str(e)})
        }
处理流程:
  1. 验证环境变量中的 API Key
  2. 解析请求参数(兼容 API Gateway 和直接调用)
  3. 构建 system prompt
  4. 从 DynamoDB 加载对话历史
  5. 添加用户当前消息
  6. 调用 GLM API 获取回复
  7. 保存本轮对话到 DynamoDB
  8. 返回格式化响应

DynamoDB 数据结构

表设计

属性 类型 说明
session_id (PK) String 分区键,会话标识符
timestamp (SK) Number 排序键,毫秒级时间戳
message_id String 消息唯一 ID (UUID)
user_message String 用户消息内容
assistant_message String AI 回复内容
ttl Number 过期时间戳(Unix 秒)

示例数据

{
    "session_id": "test123",
    "timestamp": 1737356158000,
    "message_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "user_message": "你好,介绍一下你自己",
    "assistant_message": "你好!很高兴见到你...",
    "ttl": 1737960958
}

使用示例

基本对话

curl -X POST https://kjkwvmbpiaxnzdnehfyjxcuela0twmre.lambda-url.us-east-1.on.aws/ \
  -H 'Content-Type: application/json' \
  -d '{"message": "什么是机器学习?", "session_id": "user001"}'

继续对话

curl -X POST https://kjkwvmbpiaxnzdnehfyjxcuela0twmre.lambda-url.us-east-1.on.aws/ \
  -H 'Content-Type: application/json' \
  -d '{"message": "能举个例子吗?", "session_id": "user001"}'

开启新会话

curl -X POST https://kjkwvmbpiaxnzdnehfyjxcuela0twmre.lambda-url.us-east-1.on.aws/ \
  -H 'Content-Type: application/json' \
  -d '{"message": "你好", "session_id": "user001", "new_session": true}'

指定模型

curl -X POST https://kjkwvmbpiaxnzdnehfyjxcuela0twmre.lambda-url.us-east-1.on.aws/ \
  -H 'Content-Type: application/json' \
  -d '{"message": "写一首诗", "model": "glm-4.7"}'

可用模型

模型 ID 说明 适用场景
glm-4.7-flash 轻量高效,免费版 日常对话、快速响应
glm-4.7 最新旗舰模型 复杂推理、代码生成
glm-4.6 200K 上下文 长文档处理

错误处理

常见错误码

状态码 错误类型 说明
500 ZHIPU_API_KEY not configured Lambda 环境变量未配置
401 Authentication failed API Key 无效
1211 Unknown Model 模型名称错误
注意: 国内版 API(open.bigmodel.cn)和国际版 API(api.z.ai)的模型名称不同。本项目使用国际版,模型名为 glm-4.7-flash 而非 glm-4-flash