# 会话亲和 (/docs/cloud/services/model/guides/session-affinity)



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

会话 ID 不会替你保存 Chat Completions 的历史。每轮仍需发送必要消息；如需按响应 ID 接续，使用 [Responses](/docs/cloud/services/model/guides/responses-api)。

## 1. 准备终端 [#1-准备终端]

准备 Python 3.10+ 和 [uv](https://docs.astral.sh/uv/getting-started/installation/)。将 [Praxis 云 API Key](/docs/cloud/account/api-keys) 放入环境变量 `PRAXIS_API_KEY`，不要写入代码或日志。

```bash
test -n "$PRAXIS_API_KEY"
```

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

## 2. 两轮使用同一个 ID [#2-两轮使用同一个-id]

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

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

```python
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 指南](/docs/cloud/services/model/guides/prompt-cache)检查。

## 实测失败与处理 [#实测失败与处理]

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

字段细节：[Chat Completions](/docs/api/compatible/openai/createChatCompletion)。

[API 参考 →](/docs/api/compatible/openai) · [Cookbook →](/docs/cookbook)
