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.
- {coze_coding_dev_sdk-0.5.12/coze_coding_dev_sdk.egg-info → coze_coding_dev_sdk-0.5.13}/PKG-INFO +1 -1
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/cli.py +2 -0
- coze_coding_dev_sdk-0.5.13/coze_coding_dev_sdk/cli/storage.py +241 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13/coze_coding_dev_sdk.egg-info}/PKG-INFO +1 -1
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk.egg-info/SOURCES.txt +1 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/pyproject.toml +1 -1
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/CHANGELOG.md +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/LICENSE +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/MANIFEST.in +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/README.md +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/__init__.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/__init__.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/chat.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/constants.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/db.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/document.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/embedding.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/image.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/knowledge.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/search.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/supabase.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/utils.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/video.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/video_edit.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/voice.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/core/__init__.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/core/client.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/core/config.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/core/exceptions.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/database/__init__.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/database/client.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/database/migration.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/document/__init__.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/document/client.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/document/docx_generator.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/document/models.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/document/pdf_generator.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/document/pptx_generator.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/document/xlsx_generator.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/embedding/__init__.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/embedding/client.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/embedding/models.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/fetch/__init__.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/fetch/client.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/fetch/models.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/image/__init__.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/image/client.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/image/models.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/knowledge/__init__.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/knowledge/client.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/knowledge/models.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/llm/__init__.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/llm/client.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/llm/models.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/memory/__init__.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/memory/client.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/s3/__init__.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/s3/client.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/s3/models.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/search/__init__.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/search/client.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/search/models.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/supabase/__init__.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/supabase/client.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/supabase/models.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/video/__init__.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/video/client.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/video/models.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/video_edit/__init__.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/video_edit/examples.py +0 -0
- {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
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/video_edit/models.py +0 -0
- {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
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/voice/__init__.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/voice/asr.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/voice/models.py +0 -0
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/voice/tts.py +0 -0
- {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
- {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
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk.egg-info/requires.txt +0 -0
- {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
- {coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/setup.cfg +0 -0
{coze_coding_dev_sdk-0.5.12/coze_coding_dev_sdk.egg-info → coze_coding_dev_sdk-0.5.13}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: coze-coding-dev-sdk
|
|
3
|
-
Version: 0.5.
|
|
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)
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13/coze_coding_dev_sdk.egg-info}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: coze-coding-dev-sdk
|
|
3
|
-
Version: 0.5.
|
|
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>
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk.egg-info/SOURCES.txt
RENAMED
|
@@ -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.
|
|
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"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/constants.py
RENAMED
|
File without changes
|
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/document.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/embedding.py
RENAMED
|
File without changes
|
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/knowledge.py
RENAMED
|
File without changes
|
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/supabase.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/cli/video_edit.py
RENAMED
|
File without changes
|
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/core/__init__.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/core/client.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/core/config.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/core/exceptions.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/database/__init__.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/database/client.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/database/migration.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/document/__init__.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/document/client.py
RENAMED
|
File without changes
|
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/document/models.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/embedding/__init__.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/embedding/client.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/embedding/models.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/fetch/__init__.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/fetch/client.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/fetch/models.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/image/__init__.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/image/client.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/image/models.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/knowledge/__init__.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/knowledge/client.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/knowledge/models.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/llm/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/memory/__init__.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/memory/client.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/s3/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/search/__init__.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/search/client.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/search/models.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/supabase/__init__.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/supabase/client.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/supabase/models.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/video/__init__.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/video/client.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/video/models.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/video_edit/__init__.py
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/video_edit/examples.py
RENAMED
|
File without changes
|
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/video_edit/models.py
RENAMED
|
File without changes
|
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/voice/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk/voice/models.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk.egg-info/requires.txt
RENAMED
|
File without changes
|
{coze_coding_dev_sdk-0.5.12 → coze_coding_dev_sdk-0.5.13}/coze_coding_dev_sdk.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|