Skip to content

Commit a6951d3

Browse files
authored
批处理业务及分页处理代码,文件流响应包装器 (#33)
* 增加分页处理代码,重写部分相应类的实例化规则 增加类型转换校验 批处理任务相关api 单元测试修改 * 批处理任务相关 单元测试 * 文件流响应包装器 * 批处理对话单元测试 * 参数错误温桶 * 文件流响应包装器 * 批处理对话测试
1 parent 879a9c0 commit a6951d3

33 files changed

+2266
-265
lines changed

.gitignore

Lines changed: 4 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -17,53 +17,7 @@ test/
1717
examples/
1818
.pypirc
1919
/poetry.lock
20-
/logs/local_1714381518619/zhipuai.log
21-
/logs/local_1714381521241/zhipuai.log
22-
/logs/local_1714381523244/zhipuai.log
23-
/logs/local_1714381534486/zhipuai.log
24-
/logs/local_1714381536161/zhipuai.log
25-
/logs/local_1714381537762/zhipuai.log
26-
/logs/local_1714381540228/zhipuai.log
27-
/logs/local_1714381541675/zhipuai.log
28-
/logs/local_1714381544183/zhipuai.log
29-
/logs/local_1714381554442/zhipuai.log
30-
/logs/local_1714381557457/zhipuai.log
31-
/logs/local_1714381560830/zhipuai.log
32-
/logs/local_1714381561389/zhipuai.log
33-
/logs/local_1714381570760/zhipuai.log
34-
/logs/local_1714381572227/zhipuai.log
35-
/logs/local_1714381574060/zhipuai.log
36-
/logs/local_1714381574645/zhipuai.log
37-
/logs/local_1714381586122/zhipuai.log
38-
/logs/local_1714381596219/zhipuai.log
39-
/logs/local_1714381598857/zhipuai.log
40-
/logs/local_1714381599471/zhipuai.log
41-
/logs/local_1714381609065/zhipuai.log
42-
/logs/local_1714381621513/zhipuai.log
43-
/logs/local_1714381622121/zhipuai.log
44-
/logs/local_1714381833346/zhipuai.log
45-
/logs/local_1714381918707/zhipuai.log
46-
/logs/local_1714382871154/zhipuai.log
47-
/logs/local_1714382884150/zhipuai.log
48-
/logs/local_1714382885846/zhipuai.log
49-
/logs/local_1714382887557/zhipuai.log
50-
/logs/local_1714382889632/zhipuai.log
51-
/logs/local_1714382891424/zhipuai.log
52-
/logs/local_1714382893632/zhipuai.log
53-
/logs/local_1714382904235/zhipuai.log
54-
/logs/local_1714382907134/zhipuai.log
55-
/logs/local_1714382908915/zhipuai.log
56-
/logs/local_1714382912290/zhipuai.log
57-
/logs/local_1714382915919/zhipuai.log
58-
/logs/local_1714382935679/zhipuai.log
59-
/logs/local_1714382945693/zhipuai.log
60-
/logs/local_1714382951968/zhipuai.log
61-
/logs/local_1714382953236/zhipuai.log
62-
/logs/local_1714382954392/zhipuai.log
63-
/logs/local_1714382957260/zhipuai.log
64-
/logs/local_1714382958299/zhipuai.log
65-
/logs/local_1714382959178/zhipuai.log
66-
/logs/local_1714382963052/zhipuai.log
67-
/logs/local_1714382964289/zhipuai.log
68-
/logs/local_1714382975167/zhipuai.log
69-
/logs/local_1714382979034/zhipuai.log
20+
logs
21+
/tests/integration_tests/batchoutput.jsonl
22+
/tests/integration_tests/content_batchoutput.jsonl
23+
/tests/integration_tests/write_to_file_batchoutput.jsonl

tests/conftest.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Configuration for unit tests."""
22
import logging
33
from importlib import util
4+
from pathlib import Path
45
from typing import Dict, List, Sequence
56

67
import pytest
@@ -97,14 +98,14 @@ def test_something():
9798
@pytest.fixture
9899
def logging_conf() -> dict:
99100
return get_config_dict(
100-
"DEBUG",
101+
"info",
101102
get_log_file(log_path="logs", sub_dir=f"local_{get_timestamp_ms()}"),
102103
1024*1024,
103104
1024*1024*1024,
104105
)
105106

106107
@pytest.fixture
107-
def test_file_path(request) -> str:
108+
def test_file_path(request) -> Path:
108109
from pathlib import Path
109110
import os
110111
# 当前执行目录
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
{"custom_id": "request-1", "method": "POST", "url": "/v4/chat/completions", "body": {"model": "glm-4", "messages": [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "Hello world!"}],"max_tokens": 1000}}
2+
{"custom_id": "request-2", "method": "POST", "url": "/v4/chat/completions", "body": {"model": "glm-4", "messages": [{"role": "system", "content": "You are an unhelpful assistant."},{"role": "user", "content": "Hello world!"}],"max_tokens": 1000}}
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
import os
2+
import logging
3+
import logging.config
4+
import zhipuai
5+
from zhipuai import ZhipuAI
6+
7+
8+
def test_batch_input_file(test_file_path, logging_conf) -> None:
9+
logging.config.dictConfig(logging_conf) # type: ignore
10+
client = ZhipuAI() # 填写您自己的APIKey
11+
12+
try:
13+
batch_input_file = client.files.create(
14+
file=open(os.path.join(test_file_path, "batchinput.jsonl"), "rb"),
15+
purpose="batch"
16+
)
17+
18+
print(batch_input_file)
19+
20+
# FileObject(id='20240514_ea19d21b-d256-4586-b0df-e80a45e3c286', bytes=490, created_at=1715673494, filename=None, object='file', purpose='batch', status=None, status_details=None, fileName='batchinput.jsonl')
21+
22+
except zhipuai.core._errors.APIRequestFailedError as err:
23+
print(err)
24+
except zhipuai.core._errors.APIInternalError as err:
25+
print(err)
26+
except zhipuai.core._errors.APIStatusError as err:
27+
print(err)
28+
29+
30+
def test_batch_create(logging_conf) -> None:
31+
logging.config.dictConfig(logging_conf) # type: ignore
32+
client = ZhipuAI() # 填写您自己的APIKey
33+
try:
34+
create = client.batches.create(
35+
input_file_id="20240514_ea19d21b-d256-4586-b0df-e80a45e3c286",
36+
endpoint="/v4/chat/completions",
37+
completion_window="24h",
38+
metadata={
39+
"description": "job test"
40+
}
41+
)
42+
print(create)
43+
# Batch(id='batch_1790292763050508288', completion_window='24h', created_at=1715674031399, endpoint='/v4/chat/completions', input_file_id='20240514_ea19d21b-d256-4586-b0df-e80a45e3c286', object='batch', status='validating', cancelled_at=None, cancelling_at=None, completed_at=None, error_file_id=None, errors=None, expired_at=None, expires_at=None, failed_at=None, finalizing_at=None, in_progress_at=None, metadata={'description': 'job test'}, output_file_id=None, request_counts=BatchRequestCounts(completed=None, failed=None, total=None))
44+
45+
except zhipuai.core._errors.APIRequestFailedError as err:
46+
print(err)
47+
except zhipuai.core._errors.APIInternalError as err:
48+
print(err)
49+
except zhipuai.core._errors.APIStatusError as err:
50+
print(err)
51+
52+
53+
def test_batch_retrieve(logging_conf) -> None:
54+
logging.config.dictConfig(logging_conf) # type: ignore
55+
client = ZhipuAI() # 填写您自己的APIKey
56+
try:
57+
retrieve = client.batches.retrieve("batch_1790291013237211136")
58+
print(retrieve)
59+
60+
# Batch(id='batch_1790291013237211136', completion_window='24h', created_at=1715673614000, endpoint='/v4/chat/completions', input_file_id='20240514_ea19d21b-d256-4586-b0df-e80a45e3c286', object='batch', status='validating', cancelled_at=None, cancelling_at=None, completed_at=None, error_file_id='', errors=None, expired_at=None, expires_at=None, failed_at=None, finalizing_at=None, in_progress_at=None, metadata={'description': 'job test'}, output_file_id='', request_counts=BatchRequestCounts(completed=None, failed=None, total=None))
61+
except zhipuai.core._errors.APIRequestFailedError as err:
62+
print(err)
63+
except zhipuai.core._errors.APIInternalError as err:
64+
print(err)
65+
except zhipuai.core._errors.APIStatusError as err:
66+
print(err)
67+
68+
69+
def test_batch_cancel(logging_conf) -> None:
70+
logging.config.dictConfig(logging_conf) # type: ignore
71+
client = ZhipuAI() # 填写您自己的APIKey
72+
try:
73+
cancel = client.batches.cancel("batch_1790291013237211136")
74+
print(cancel)
75+
# Batch(id='batch_1790291013237211136', completion_window='24h', created_at=1715673614000, endpoint='/v4/chat/completions', input_file_id='20240514_ea19d21b-d256-4586-b0df-e80a45e3c286', object='batch', status='cancelling', cancelled_at=None, cancelling_at=1715673698775, completed_at=None, error_file_id='', errors=None, expired_at=None, expires_at=None, failed_at=None, finalizing_at=None, in_progress_at=None, metadata={'description': 'job test'}, output_file_id='', request_counts=BatchRequestCounts(completed=None, failed=None, total=None))
76+
except zhipuai.core._errors.APIRequestFailedError as err:
77+
print(err)
78+
except zhipuai.core._errors.APIInternalError as err:
79+
print(err)
80+
except zhipuai.core._errors.APIStatusError as err:
81+
print(err)
82+
83+
84+
def test_batch_list(logging_conf) -> None:
85+
logging.config.dictConfig(logging_conf) # type: ignore
86+
client = ZhipuAI() # 填写您自己的APIKey
87+
try:
88+
list = client.batches.list(limit=10)
89+
print(list)
90+
print("_________get_next_page___________")
91+
batch = list.get_next_page()
92+
print(batch)
93+
print("_________iter_pages___________")
94+
for batch in list.iter_pages():
95+
print(batch)
96+
except zhipuai.core._errors.APIRequestFailedError as err:
97+
print(err)
98+
except zhipuai.core._errors.APIInternalError as err:
99+
print(err)
100+
except zhipuai.core._errors.APIStatusError as err:
101+
print(err)
102+
103+
104+
def test_batch_result(test_file_path, logging_conf) -> None:
105+
logging.config.dictConfig(logging_conf) # type: ignore
106+
client = ZhipuAI() # 填写您自己的APIKey
107+
try:
108+
content = client.files.content("file-QDpVyDIhxj8mcFiduUydNqQN")
109+
with open(os.path.join(test_file_path, "content_batchoutput.jsonl"), "wb") as f:
110+
f.write(content.content)
111+
content.write_to_file(os.path.join(test_file_path, "write_to_file_batchoutput.jsonl"))
112+
113+
assert content.content == open(os.path.join(test_file_path, "batchoutput.jsonl"), "rb").read()
114+
assert content.content == open(os.path.join(test_file_path, "write_to_file_batchoutput.jsonl"), "rb").read()
115+
except zhipuai.core._errors.APIRequestFailedError as err:
116+
print(err)
117+
except zhipuai.core._errors.APIInternalError as err:
118+
print(err)
119+
except zhipuai.core._errors.APIStatusError as err:
120+
print(err)
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# -*- coding: utf-8 -*-
2+
import unittest
3+
from typing import Type, cast, Iterable, TypedDict
4+
import pytest
5+
import httpx
6+
import inspect
7+
8+
from zhipuai.core import maybe_transform
9+
from zhipuai.types import batch_create_params
10+
11+
12+
def test_response_joblist_model_cast() -> None:
13+
params = maybe_transform(
14+
{
15+
"completion_window": "/v1/chat/completions",
16+
"endpoint": None,
17+
"metadata": {
18+
"key": "value"
19+
},
20+
},
21+
batch_create_params.BatchCreateParams,
22+
)
23+
assert isinstance(params, dict)

0 commit comments

Comments
 (0)