Python请求LM Studio本地模型返回503 Service Unavailable错误但Curl请求成功的原因及解决方法
问题场景
我尝试用以下Python代码请求本地部署的大语言模型,但收到了503 Service Unavailable错误:
import requests import json url = 'http://localhost:1234/v1/chat/completions' headers = { 'Content-Type': 'application/json' } data = { 'model': 'deepseek-r1-distill-qwen-7b', 'messages': [ {'role': 'system', 'content': 'Always answer in rhymes. Today is Thursday'}, {'role': 'user', 'content': 'What day is it today?'} ], 'temperature': 0.7, 'max_tokens': -1, 'stream': False } response = requests.post(url, headers=headers, data=json.dumps(data)) if response.status_code == 200: print('Response:', response.json()) else: print('Error:', response.status_code, response.text)
错误信息:503 service unavailable
但用以下Curl命令却能成功请求:
curl http://localhost:1234/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-r1-distill-qwen-7b", "messages": [ { "role": "system", "content": "Always answer in rhymes. Today is Thursday" }, { "role": "user", "content": "What day is it today?" } ], "temperature": 0.7, "max_tokens": -1, "stream": false }'
可能的原因及解决方法
1. Python请求的JSON序列化方式不够稳妥
Curl是直接传递格式化好的JSON字符串,而Python代码用json.dumps(data)生成字符串后通过data参数传递,虽然逻辑看似没问题,但requests库提供了更可靠的json参数来自动处理JSON请求,能避免手动序列化可能带来的编码、格式细节问题。
修复方法:
把requests.post中的data=json.dumps(data)替换为json=data,修改后的请求代码如下:
# 替换原post请求行 response = requests.post(url, headers=headers, json=data)
甚至可以省略手动设置的Content-Type头,因为使用json参数时,requests会自动添加正确的application/json请求头。
2. 字符编码不匹配
手动用json.dumps生成的字符串,可能默认编码不是服务端预期的UTF-8,导致服务端无法正确解析请求,进而返回503错误。
修复方法:
如果坚持用data参数,明确指定编码:
response = requests.post(url, headers=headers, data=json.dumps(data).encode('utf-8'))
3. 本地服务的请求处理差异
部分本地大模型服务(比如LM Studio)对不同客户端的请求可能存在细微处理差异,比如请求超时时间、连接复用等。可以尝试给Python请求添加超时参数,避免因连接等待过久被服务端判定为无效请求。
修复方法:
在requests.post中添加timeout参数(比如设置为30秒):
response = requests.post(url, headers=headers, json=data, timeout=30)
4. 检查本地服务状态
偶尔503错误也可能是本地服务临时负载过高或状态异常,虽然Curl能成功,但Python请求的时机可能刚好遇到服务忙碌。可以打开LM Studio的控制台日志,查看是否有对应Python请求的错误记录,确认服务是否稳定运行。

