z-ai-sdk-python/examples/glm4_5_thinking.py
wellenzheng 49ca5af5cb
chore: update version to 0.0.3 and refactor ZaiSampler error handling (#24)
Co-authored-by: zhengweijun <weijun.zheng@aminer.cn>
2025-08-05 17:55:38 +08:00

109 lines
No EOL
3.4 KiB
Python

import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import time
import traceback
from typing import Optional
from example_types import MessageList, SamplerBase
from zai import ZhipuAiClient, ZaiClient
class ZaiSampler(SamplerBase):
"""
Sample from TGI's completion API
"""
def __init__(
self,
model: str = "glm-4.5",
api_key: str = '',
system_message: Optional[str] = None,
temperature: float = 0.0,
max_tokens: int = 4096,
stream: bool = False,
):
self.system_message = system_message
self.temperature = temperature
self.max_tokens = max_tokens
self.model = model
self.client = ZaiClient(api_key=api_key)
self.stream = stream
def get_resp(self, message_list):
try:
chat_completion = self.client.chat.completions.create(
messages=message_list,
model=self.model,
temperature=self.temperature,
top_p=self.top_p,
max_tokens=self.max_tokens
)
output = chat_completion.choices[0].message.content
return output
except Exception as e:
print(f"Exception: {e}\nTraceback: {traceback.format_exc()}")
raise
def get_resp_stream(self, message_list, top_p=-1, temperature=-1):
temperature = temperature if temperature > 0 else self.temperature
top_p = top_p if top_p > 0 else 0.95
final = ''
try:
chat_completion_res = self.client.chat.completions.create(
model=self.model,
messages=message_list,
thinking={
"type": "enabled",
},
stream=True,
max_tokens=self.max_tokens,
temperature=temperature
)
for chunk in chat_completion_res:
if chunk.choices[0].delta.content:
final += chunk.choices[0].delta.content
except Exception as e:
print(f"Exception: {e}\nTraceback: {traceback.format_exc()}")
raise
if final == '':
print(f"failed in get_resp, no content received")
return ''
content = ''
if '</think>' in final:
content = final.split("</think>")[-1].strip()
if not content:
content = final[-512:].strip()
else:
content = final[-512:].strip()
return content
def __call__(self, message_list: MessageList, top_p=0.95, temperature=0.6) -> str:
if self.system_message:
message_list = [
{
"role": "system", "content": self.system_message
}
] + message_list
if not self.stream:
return self.get_resp(message_list, top_p, temperature)
else:
return self.get_resp_stream(message_list, top_p, temperature)
if __name__ == "__main__":
try:
client = ZaiSampler(model="glm-4.5", api_key=os.getenv("ZAI_API_KEY"), stream=True)
messages = [
{"role": "user", "content": "Hi? Tell me a joke."},
]
response = client(messages)
print(response)
except Exception as e:
print(f"Fatal error: {e}\nTraceback: {traceback.format_exc()}")
sys.exit(1)