coze-coding-dev-sdk 0.5.12__tar.gz → 0.5.13__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. {coze_coding_dev_sdk-0.5.12/coze_coding_dev_sdk.egg-info → coze_coding_dev_sdk-0.5.13}/PKG-INFO +1 -1
  2. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/cli.py +2 -0
  3. coze_coding_dev_sdk-0.5.13/coze_coding_dev_sdk/cli/storage.py +241 -0
  4. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13/coze_coding_dev_sdk.egg-info}/PKG-INFO +1 -1
  5. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk.egg-info/SOURCES.txt +1 -0
  6. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/pyproject.toml +1 -1
  7. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/CHANGELOG.md +0 -0
  8. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/LICENSE +0 -0
  9. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/MANIFEST.in +0 -0
  10. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/README.md +0 -0
  11. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/__init__.py +0 -0
  12. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/__init__.py +0 -0
  13. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/chat.py +0 -0
  14. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/constants.py +0 -0
  15. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/db.py +0 -0
  16. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/document.py +0 -0
  17. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/embedding.py +0 -0
  18. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/image.py +0 -0
  19. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/knowledge.py +0 -0
  20. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/search.py +0 -0
  21. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/supabase.py +0 -0
  22. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/utils.py +0 -0
  23. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/video.py +0 -0
  24. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/video_edit.py +0 -0
  25. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/voice.py +0 -0
  26. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/core/__init__.py +0 -0
  27. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/core/client.py +0 -0
  28. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/core/config.py +0 -0
  29. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/core/exceptions.py +0 -0
  30. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/database/__init__.py +0 -0
  31. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/database/client.py +0 -0
  32. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/database/migration.py +0 -0
  33. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/document/__init__.py +0 -0
  34. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/document/client.py +0 -0
  35. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/document/docx_generator.py +0 -0
  36. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/document/models.py +0 -0
  37. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/document/pdf_generator.py +0 -0
  38. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/document/pptx_generator.py +0 -0
  39. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/document/xlsx_generator.py +0 -0
  40. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/embedding/__init__.py +0 -0
  41. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/embedding/client.py +0 -0
  42. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/embedding/models.py +0 -0
  43. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/fetch/__init__.py +0 -0
  44. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/fetch/client.py +0 -0
  45. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/fetch/models.py +0 -0
  46. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/image/__init__.py +0 -0
  47. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/image/client.py +0 -0
  48. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/image/models.py +0 -0
  49. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/knowledge/__init__.py +0 -0
  50. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/knowledge/client.py +0 -0
  51. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/knowledge/models.py +0 -0
  52. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/llm/__init__.py +0 -0
  53. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/llm/client.py +0 -0
  54. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/llm/models.py +0 -0
  55. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/memory/__init__.py +0 -0
  56. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/memory/client.py +0 -0
  57. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/s3/__init__.py +0 -0
  58. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/s3/client.py +0 -0
  59. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/s3/models.py +0 -0
  60. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/search/__init__.py +0 -0
  61. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/search/client.py +0 -0
  62. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/search/models.py +0 -0
  63. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/supabase/__init__.py +0 -0
  64. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/supabase/client.py +0 -0
  65. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/supabase/models.py +0 -0
  66. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/video/__init__.py +0 -0
  67. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/video/client.py +0 -0
  68. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/video/models.py +0 -0
  69. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/video_edit/__init__.py +0 -0
  70. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/video_edit/examples.py +0 -0
  71. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/video_edit/frame_extractor.py +0 -0
  72. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/video_edit/models.py +0 -0
  73. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/video_edit/video_edit.py +0 -0
  74. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/voice/__init__.py +0 -0
  75. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/voice/asr.py +0 -0
  76. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/voice/models.py +0 -0
  77. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/voice/tts.py +0 -0
  78. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk.egg-info/dependency_links.txt +0 -0
  79. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk.egg-info/entry_points.txt +0 -0
  80. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk.egg-info/requires.txt +0 -0
  81. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk.egg-info/top_level.txt +0 -0
  82. {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coze-coding-dev-sdk
3
- Version: 0.5.12
3
+ Version: 0.5.13
4
4
  Summary: Coze Coding Dev SDK - 优雅的多功能 AI SDK,支持图片生成、视频生成、语音合成、语音识别、大语言模型、联网搜索和文本/多模态 Embedding。包含命令行工具 coze-coding-ai,支持 Context 上下文追踪
5
5
  Author-email: Coze Coding Integration Team <support@coze.com>
6
6
  Maintainer-email: Coze Coding Integration Team <support@coze.com>
@@ -3,6 +3,7 @@ import click
3
3
  from .chat import chat
4
4
  from .db import db
5
5
  from .embedding import embedding
6
+ from .storage import storage
6
7
  from .image import image
7
8
  from .knowledge import knowledge
8
9
  from .search import search
@@ -32,6 +33,7 @@ main.add_command(chat)
32
33
  main.add_command(db)
33
34
  main.add_command(embedding)
34
35
  main.add_command(document)
36
+ main.add_command(storage)
35
37
 
36
38
 
37
39
  if __name__ == "__main__":
@@ -0,0 +1,241 @@
1
+ """
2
+ 对象存储 CLI 命令
3
+ """
4
+
5
+ import json
6
+ import mimetypes
7
+ import sys
8
+ import tempfile
9
+ import zipfile
10
+ from concurrent.futures import ThreadPoolExecutor, as_completed
11
+ from pathlib import Path, PurePosixPath
12
+ from typing import Any, Dict, List, Optional, Tuple
13
+ from uuid import uuid4
14
+
15
+ import click
16
+
17
+
18
+ def _normalize_prefix(prefix: str) -> str:
19
+ if not prefix:
20
+ return ""
21
+ prefix = prefix.strip("/")
22
+ return prefix + "/" if prefix else ""
23
+
24
+
25
+ def _build_object_key(prefix: str, name: str, use_uuid: bool, sanitize_fn) -> str:
26
+ sanitized = sanitize_fn(name)
27
+ if use_uuid:
28
+ p = Path(sanitized)
29
+ uniq = uuid4().hex[:8]
30
+ if str(p.parent) != ".":
31
+ sanitized = str(PurePosixPath(p.parent / f"{p.stem}_{uniq}{p.suffix}"))
32
+ else:
33
+ sanitized = f"{p.stem}_{uniq}{p.suffix}"
34
+ return prefix + sanitized
35
+
36
+
37
+ def _resolve_paths(paths: Tuple[str, ...]) -> List[Tuple[Path, str]]:
38
+ """解析目录为 (绝对路径, 相对key) 列表,保留目录名"""
39
+ results: List[Tuple[Path, str]] = []
40
+ seen: set = set()
41
+ for path_str in paths:
42
+ p = Path(path_str).resolve()
43
+ if not p.exists() or not p.is_dir():
44
+ continue
45
+ for f in sorted(p.rglob("*")):
46
+ if f.is_file() and f not in seen:
47
+ seen.add(f)
48
+ rel = f.relative_to(p.parent)
49
+ results.append((f, str(PurePosixPath(rel))))
50
+ return results
51
+
52
+
53
+ def _zip_directory(dir_path: Path) -> Path:
54
+ """将目录打包为临时 zip 文件"""
55
+ zip_name = f"{dir_path.name}.zip"
56
+ tmp_dir = tempfile.mkdtemp()
57
+ zip_path = Path(tmp_dir) / zip_name
58
+ with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zf:
59
+ for f in sorted(dir_path.rglob("*")):
60
+ if f.is_file():
61
+ arcname = str(f.relative_to(dir_path.parent))
62
+ zf.write(f, arcname)
63
+ return zip_path
64
+
65
+
66
+ def _upload_file_to_s3(s3_client, bucket: str, file_path: Path, object_key: str, threshold: int) -> int:
67
+ """上传单个文件到 S3,返回字节数"""
68
+ content_type = mimetypes.guess_type(str(file_path))[0] or "application/octet-stream"
69
+ file_size = file_path.stat().st_size
70
+
71
+ if file_size <= threshold:
72
+ s3_client.put_object(
73
+ Bucket=bucket,
74
+ Key=object_key,
75
+ Body=file_path.read_bytes(),
76
+ ContentType=content_type,
77
+ )
78
+ else:
79
+ from boto3.s3.transfer import TransferConfig
80
+ config = TransferConfig(
81
+ multipart_threshold=threshold,
82
+ multipart_chunksize=threshold,
83
+ max_concurrency=1,
84
+ use_threads=False,
85
+ )
86
+ with open(file_path, "rb") as f:
87
+ s3_client.upload_fileobj(
88
+ Fileobj=f,
89
+ Bucket=bucket,
90
+ Key=object_key,
91
+ ExtraArgs={"ContentType": content_type},
92
+ Config=config,
93
+ )
94
+ return file_size
95
+
96
+
97
+ @click.group()
98
+ def storage():
99
+ """Object storage commands."""
100
+ pass
101
+
102
+
103
+ @storage.command()
104
+ @click.argument("paths", nargs=-1, required=True, type=click.Path())
105
+ @click.option("--prefix", "-p", default="", help="Target S3 key prefix (virtual directory)")
106
+ @click.option("--uuid", "use_uuid", is_flag=True, help="Append UUID suffix to filenames to avoid collisions")
107
+ @click.option("--expire", "-e", default=86400, type=int, help="Presigned URL expiration in seconds (default: 86400 = 24h)")
108
+ @click.option("--threshold", "-t", default=5 * 1024 * 1024, type=int, help="Size threshold (bytes) for streaming upload (default: 5MB)")
109
+ @click.option("--max-concurrency", "-c", default=4, type=int, help="Number of parallel upload threads (default: 4)")
110
+ def upload(paths, prefix, use_uuid, expire, threshold, max_concurrency):
111
+ """Upload files and directories to object storage.
112
+
113
+ PATHS: One or more file or directory paths to upload.
114
+ Files are uploaded directly. Directories are uploaded recursively
115
+ AND also zipped as a single archive.
116
+ Outputs JSON with name-to-URL mappings to stdout.
117
+
118
+ \b
119
+ Examples:
120
+ coze-coding-ai storage upload ./data --prefix my-project/
121
+ coze-coding-ai storage upload file1.txt dir1/ dir2/ --prefix uploads/
122
+ coze-coding-ai storage upload report.csv --prefix reports/ --expire 3600
123
+ """
124
+ from coze_coding_dev_sdk.s3 import S3SyncStorage
125
+
126
+ # 1. 分离文件和目录
127
+ files: List[Path] = []
128
+ dirs: List[Path] = []
129
+
130
+ for path_str in paths:
131
+ p = Path(path_str).resolve()
132
+ if not p.exists():
133
+ print(f"Warning: {path_str} does not exist, skipping", file=sys.stderr)
134
+ continue
135
+ if p.is_file():
136
+ files.append(p)
137
+ elif p.is_dir():
138
+ dirs.append(p)
139
+ else:
140
+ print(f"Warning: {path_str} is not a file or directory, skipping", file=sys.stderr)
141
+
142
+ if not files and not dirs:
143
+ print(json.dumps({"_error": "No files or directories found to upload."}))
144
+ raise SystemExit(1)
145
+
146
+ # 2. 规范化 prefix
147
+ prefix = _normalize_prefix(prefix)
148
+
149
+ # 3. 初始化 S3
150
+ try:
151
+ storage_client = S3SyncStorage()
152
+ target_bucket = storage_client._resolve_bucket(None)
153
+ except Exception as e:
154
+ print(json.dumps({"_error": f"S3 configuration error: {e}"}))
155
+ raise SystemExit(1)
156
+
157
+ sanitize_fn = storage_client._sanitize_file_name
158
+
159
+ # 4. 构建上传任务
160
+ single_file_tasks: List[Tuple[Path, str, str]] = []
161
+ for f in files:
162
+ key = _build_object_key(prefix, f.name, use_uuid, sanitize_fn)
163
+ single_file_tasks.append((f, key, f.name))
164
+
165
+ dir_file_tasks: List[Tuple[Path, str, str]] = []
166
+ for d in dirs:
167
+ dir_files = _resolve_paths((str(d),))
168
+ for file_path, relative_key in dir_files:
169
+ key = _build_object_key(prefix, relative_key, use_uuid, sanitize_fn)
170
+ dir_file_tasks.append((file_path, key, relative_key))
171
+
172
+ zip_tasks: List[Tuple[Path, str, str]] = []
173
+ for d in dirs:
174
+ zip_name = f"{d.name}.zip"
175
+ key = _build_object_key(prefix, zip_name, use_uuid, sanitize_fn)
176
+ zip_tasks.append((d, key, f"{d.name}/"))
177
+
178
+ all_file_tasks = single_file_tasks + dir_file_tasks
179
+
180
+ # 5. 获取 boto3 client
181
+ try:
182
+ s3_client = storage_client._get_client()
183
+ except Exception as e:
184
+ print(json.dumps({"_error": f"Failed to initialize S3 client: {e}"}))
185
+ raise SystemExit(1)
186
+
187
+ result_map: Dict[str, str] = {}
188
+ failures: List[Tuple[str, str]] = []
189
+ single_file_names = {name for _, _, name in single_file_tasks}
190
+
191
+ # 6. 并发上传文件
192
+ def _do_upload(fp: Path, key: str, name: str):
193
+ try:
194
+ _upload_file_to_s3(s3_client, target_bucket, fp, key, threshold)
195
+ if name in single_file_names:
196
+ url = storage_client.generate_presigned_url(key=key, expire_time=expire)
197
+ return (name, url, None)
198
+ return (name, None, None)
199
+ except Exception as e:
200
+ return (name, None, str(e))
201
+
202
+ if all_file_tasks:
203
+ with ThreadPoolExecutor(max_workers=max_concurrency) as executor:
204
+ futures = {
205
+ executor.submit(_do_upload, fp, key, name): name
206
+ for fp, key, name in all_file_tasks
207
+ }
208
+ for future in as_completed(futures):
209
+ name, url, error = future.result()
210
+ if error:
211
+ failures.append((name, error))
212
+ elif url:
213
+ result_map[name] = url
214
+
215
+ # 7. 打包并上传 zip
216
+ for dir_path, object_key, display_name in zip_tasks:
217
+ tmp_zip_path: Optional[Path] = None
218
+ try:
219
+ tmp_zip_path = _zip_directory(dir_path)
220
+ _upload_file_to_s3(s3_client, target_bucket, tmp_zip_path, object_key, threshold)
221
+ url = storage_client.generate_presigned_url(key=object_key, expire_time=expire)
222
+ result_map[display_name] = url
223
+ except Exception as e:
224
+ failures.append((display_name, str(e)))
225
+ finally:
226
+ if tmp_zip_path and tmp_zip_path.exists():
227
+ try:
228
+ tmp_zip_path.unlink()
229
+ tmp_zip_path.parent.rmdir()
230
+ except OSError:
231
+ pass
232
+
233
+ # 8. 输出 JSON
234
+ output: Dict[str, Any] = dict(result_map)
235
+ if failures:
236
+ output["_failures"] = [{"name": n, "error": e} for n, e in failures]
237
+
238
+ print(json.dumps(output, indent=2, ensure_ascii=False))
239
+
240
+ if failures:
241
+ raise SystemExit(1)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coze-coding-dev-sdk
3
- Version: 0.5.12
3
+ Version: 0.5.13
4
4
  Summary: Coze Coding Dev SDK - 优雅的多功能 AI SDK,支持图片生成、视频生成、语音合成、语音识别、大语言模型、联网搜索和文本/多模态 Embedding。包含命令行工具 coze-coding-ai,支持 Context 上下文追踪
5
5
  Author-email: Coze Coding Integration Team <support@coze.com>
6
6
  Maintainer-email: Coze Coding Integration Team <support@coze.com>
@@ -20,6 +20,7 @@ coze_coding_dev_sdk/cli/embedding.py
20
20
  coze_coding_dev_sdk/cli/image.py
21
21
  coze_coding_dev_sdk/cli/knowledge.py
22
22
  coze_coding_dev_sdk/cli/search.py
23
+ coze_coding_dev_sdk/cli/storage.py
23
24
  coze_coding_dev_sdk/cli/supabase.py
24
25
  coze_coding_dev_sdk/cli/utils.py
25
26
  coze_coding_dev_sdk/cli/video.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "coze-coding-dev-sdk"
7
- version = "0.5.12"
7
+ version = "0.5.13"
8
8
  description = "Coze Coding Dev SDK - 优雅的多功能 AI SDK,支持图片生成、视频生成、语音合成、语音识别、大语言模型、联网搜索和文本/多模态 Embedding。包含命令行工具 coze-coding-ai,支持 Context 上下文追踪"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"