会话亲和

复用会话标识,并随请求发送对话历史。

同一对话的请求复用 x-session-id,新对话使用新 ID。会话亲和帮助符合条件的请求复用供应商,但不保证固定供应商或缓存命中。

会话 ID 不会替你保存 Chat Completions 的历史。每轮仍需发送必要消息;如需按响应 ID 接续,使用 Responses。

1. 准备终端

准备 Python 3.10+ 和 uv。将 Praxis 云 API Key 放入环境变量 PRAXIS_API_KEY,不要写入代码或日志。

test -n "$PRAXIS_API_KEY"

期望:退出码为 0。退出码 1 表示变量未设置,先设置再继续。示例默认使用 https://api.deepraxis.ai。切换环境时,将 PRAXIS_API_BASE 设为相应 API 域名,不带末尾斜杠或 API 路径。

2. 两轮使用同一个 ID

示例生成一个 UUID,两轮都发送该请求头,并在第二轮带上第一轮的消息。

保存为 session-affinity.py,运行 uv run -q --no-project --with openai --with anthropic --with google-genai python session-affinity.py。

import os
import uuid
from openai import OpenAI

client = OpenAI(api_key=os.environ['PRAXIS_API_KEY'],
    base_url=os.environ.get('PRAXIS_API_BASE', 'https://api.deepraxis.ai') + '/openai/v1')
session_id = str(uuid.uuid4())
messages = [{'role': 'user', 'content': 'Remember this code: LIME-742. Reply OK.'}]
for turn in range(2):
    response = client.chat.completions.create(model='deepseek-flash',
        messages=messages, reasoning_effort='none', max_tokens=256,
        extra_headers={'x-session-id': session_id})
    print('X-Request-Id:', response._request_id)
    assert response.choices[0].finish_reason == 'stop'
    answer = response.choices[0].message.content or ''
    assert answer
    print('turn', turn + 1, answer)
    if turn == 0:
        messages.append({'role': 'assistant', 'content': answer})
        messages.append({'role': 'user', 'content': 'What was the code? Reply with only the code.'})
    else:
        assert 'LIME-742' in answer, answer

期望:得到两条完成的响应、两个请求 ID,第二轮回答包含 LIME-742,退出码 0。这验证了请求和历史传递,不证明某个供应商或缓存命中;缓存用量另按 Prompt Cache 指南检查。

实测失败与处理

请求体传空 session_id 实测返回 HTTP 400:session_id must not be empty。使用非空会话 ID。请求体同时提供 session_id 时优先于请求头;避免在两个位置维护不同值,也不要让无关对话共用一个全局 ID。

字段细节:Chat Completions。

API 参考 → · Cookbook →

导出

本页内容