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
}
}
响应字段解析
- reply - GLM 模型生成的回复文本
- session_id - 返回的会话 ID,用于后续对话
- model - 实际使用的模型名称
- usage.prompt_tokens - 输入 token 数(包括系统提示和用户消息)
- usage.completion_tokens - 输出 token 数(AI 回复)
- usage.total_tokens - 总 token 消耗
测试 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() - 恢复时间正序,符合对话流程
- 将每条记录转换为
user 和 assistant 消息对
保存对话记录
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)})
}
处理流程:
- 验证环境变量中的 API Key
- 解析请求参数(兼容 API Gateway 和直接调用)
- 构建 system prompt
- 从 DynamoDB 加载对话历史
- 添加用户当前消息
- 调用 GLM API 获取回复
- 保存本轮对话到 DynamoDB
- 返回格式化响应
使用示例
基本对话
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"}'