Upload 92 files
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .gitattributes +35 -35
- .gitignore +14 -0
- .python-version +1 -0
- Dockerfile +30 -0
- README.md +11 -10
- proto/attachment.proto +57 -0
- proto/citations.proto +20 -0
- proto/debug.proto +12 -0
- proto/file_content.proto +18 -0
- proto/input_context.proto +64 -0
- proto/options.proto +12 -0
- proto/request.proto +173 -0
- proto/response.proto +159 -0
- proto/suggestions.proto +22 -0
- proto/task.proto +503 -0
- proto/todo.proto +23 -0
- protobuf2openai/__init__.py +3 -0
- protobuf2openai/__pycache__/__init__.cpython-312.pyc +0 -0
- protobuf2openai/__pycache__/app.cpython-312.pyc +0 -0
- protobuf2openai/__pycache__/bridge.cpython-312.pyc +0 -0
- protobuf2openai/__pycache__/config.cpython-312.pyc +0 -0
- protobuf2openai/__pycache__/helpers.cpython-312.pyc +0 -0
- protobuf2openai/__pycache__/logging.cpython-312.pyc +0 -0
- protobuf2openai/__pycache__/models.cpython-312.pyc +0 -0
- protobuf2openai/__pycache__/packets.cpython-312.pyc +0 -0
- protobuf2openai/__pycache__/reorder.cpython-312.pyc +0 -0
- protobuf2openai/__pycache__/router.cpython-312.pyc +0 -0
- protobuf2openai/__pycache__/sse_transform.cpython-312.pyc +0 -0
- protobuf2openai/__pycache__/state.cpython-312.pyc +0 -0
- protobuf2openai/app.py +42 -0
- protobuf2openai/bridge.py +111 -0
- protobuf2openai/config.py +16 -0
- protobuf2openai/helpers.py +54 -0
- protobuf2openai/logging.py +23 -0
- protobuf2openai/models.py +31 -0
- protobuf2openai/packets.py +137 -0
- protobuf2openai/reorder.py +96 -0
- protobuf2openai/router.py +207 -0
- protobuf2openai/sse_transform.py +297 -0
- protobuf2openai/state.py +23 -0
- pyproject.toml +24 -0
- server.py +357 -0
- uv.lock +863 -0
- warp2protobuf/__init__.py +4 -0
- warp2protobuf/__pycache__/__init__.cpython-312.pyc +0 -0
- warp2protobuf/__pycache__/__init__.cpython-313.pyc +0 -0
- warp2protobuf/api/__init__.py +3 -0
- warp2protobuf/api/__pycache__/__init__.cpython-312.pyc +0 -0
- warp2protobuf/api/__pycache__/__init__.cpython-313.pyc +0 -0
- warp2protobuf/api/__pycache__/protobuf_routes.cpython-312.pyc +0 -0
.gitattributes
CHANGED
|
@@ -1,35 +1,35 @@
|
|
| 1 |
-
*.7z filter=lfs diff=lfs merge=lfs -text
|
| 2 |
-
*.arrow filter=lfs diff=lfs merge=lfs -text
|
| 3 |
-
*.bin filter=lfs diff=lfs merge=lfs -text
|
| 4 |
-
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
| 5 |
-
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
| 6 |
-
*.ftz filter=lfs diff=lfs merge=lfs -text
|
| 7 |
-
*.gz filter=lfs diff=lfs merge=lfs -text
|
| 8 |
-
*.h5 filter=lfs diff=lfs merge=lfs -text
|
| 9 |
-
*.joblib filter=lfs diff=lfs merge=lfs -text
|
| 10 |
-
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
| 11 |
-
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
| 12 |
-
*.model filter=lfs diff=lfs merge=lfs -text
|
| 13 |
-
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
| 14 |
-
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 15 |
-
*.npz filter=lfs diff=lfs merge=lfs -text
|
| 16 |
-
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 17 |
-
*.ot filter=lfs diff=lfs merge=lfs -text
|
| 18 |
-
*.parquet filter=lfs diff=lfs merge=lfs -text
|
| 19 |
-
*.pb filter=lfs diff=lfs merge=lfs -text
|
| 20 |
-
*.pickle filter=lfs diff=lfs merge=lfs -text
|
| 21 |
-
*.pkl filter=lfs diff=lfs merge=lfs -text
|
| 22 |
-
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 23 |
-
*.pth filter=lfs diff=lfs merge=lfs -text
|
| 24 |
-
*.rar filter=lfs diff=lfs merge=lfs -text
|
| 25 |
-
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 26 |
-
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
| 27 |
-
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
| 28 |
-
*.tar filter=lfs diff=lfs merge=lfs -text
|
| 29 |
-
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 30 |
-
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 31 |
-
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 32 |
-
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 33 |
-
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
-
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
-
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
| 1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
| 2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
| 4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
| 5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
| 6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
| 7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
| 8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
| 9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
| 10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
| 11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
| 12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
| 13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
| 14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
| 16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
| 18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
| 19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
| 20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
| 21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
| 22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
| 24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
| 25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
| 27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
| 28 |
+
*.tar filter=lfs diff=lfs merge=lfs -text
|
| 29 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 30 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 31 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 32 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 33 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
.gitignore
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Python-generated files
|
| 2 |
+
__pycache__/
|
| 3 |
+
*.py[oc]
|
| 4 |
+
build/
|
| 5 |
+
dist/
|
| 6 |
+
wheels/
|
| 7 |
+
*.egg-info
|
| 8 |
+
|
| 9 |
+
# Virtual environments
|
| 10 |
+
.venv
|
| 11 |
+
.env
|
| 12 |
+
|
| 13 |
+
logs/
|
| 14 |
+
packets_docs/
|
.python-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
3.13
|
Dockerfile
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 使用官方 Python 3.13 镜像
|
| 2 |
+
FROM python:3.13-slim
|
| 3 |
+
|
| 4 |
+
# 设置工作目录
|
| 5 |
+
WORKDIR /app
|
| 6 |
+
|
| 7 |
+
# 设置环境变量
|
| 8 |
+
ENV PYTHONUNBUFFERED=1
|
| 9 |
+
ENV PYTHONDONTWRITEBYTECODE=1
|
| 10 |
+
|
| 11 |
+
# 安装系统依赖
|
| 12 |
+
RUN apt-get update && apt-get install -y \
|
| 13 |
+
gcc \
|
| 14 |
+
g++ \
|
| 15 |
+
&& rm -rf /var/lib/apt/lists/*
|
| 16 |
+
|
| 17 |
+
# 复制项目文件
|
| 18 |
+
COPY . .
|
| 19 |
+
|
| 20 |
+
# 安装 uv (更快的 Python 包管理器)
|
| 21 |
+
RUN pip install uv
|
| 22 |
+
|
| 23 |
+
# 使用 uv 安装依赖
|
| 24 |
+
RUN uv pip install --system -r pyproject.toml
|
| 25 |
+
|
| 26 |
+
# 暴露端口
|
| 27 |
+
EXPOSE 8000
|
| 28 |
+
|
| 29 |
+
# 启动命令
|
| 30 |
+
CMD ["python", "server.py"]
|
README.md
CHANGED
|
@@ -1,10 +1,11 @@
|
|
| 1 |
-
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
-
sdk: docker
|
| 7 |
-
pinned: false
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: VkjlwnvbioWBV
|
| 3 |
+
emoji: 📚
|
| 4 |
+
colorFrom: indigo
|
| 5 |
+
colorTo: gray
|
| 6 |
+
sdk: docker
|
| 7 |
+
pinned: false
|
| 8 |
+
app_port: 8000
|
| 9 |
+
---
|
| 10 |
+
|
| 11 |
+
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
proto/attachment.proto
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
syntax = "proto3";
|
| 2 |
+
|
| 3 |
+
package warp.multi_agent.v1;
|
| 4 |
+
|
| 5 |
+
import "options.proto";
|
| 6 |
+
|
| 7 |
+
option go_package = "github.com/warp/warp-proto-apis/multi_agent/v1";
|
| 8 |
+
|
| 9 |
+
message Attachment {
|
| 10 |
+
oneof value {
|
| 11 |
+
string plain_text = 1;
|
| 12 |
+
ExecutedShellCommand executed_shell_command = 2;
|
| 13 |
+
RunningShellCommand running_shell_command = 3;
|
| 14 |
+
DriveObject drive_object = 4;
|
| 15 |
+
}
|
| 16 |
+
}
|
| 17 |
+
|
| 18 |
+
message ExecutedShellCommand {
|
| 19 |
+
string command = 1;
|
| 20 |
+
string output = 2;
|
| 21 |
+
int32 exit_code = 3;
|
| 22 |
+
}
|
| 23 |
+
|
| 24 |
+
message RunningShellCommand {
|
| 25 |
+
string command = 1;
|
| 26 |
+
LongRunningShellCommandSnapshot snapshot = 2;
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
+
message LongRunningShellCommandSnapshot {
|
| 30 |
+
string output = 1;
|
| 31 |
+
}
|
| 32 |
+
|
| 33 |
+
message DriveObject {
|
| 34 |
+
string uid = 1;
|
| 35 |
+
|
| 36 |
+
oneof object_payload {
|
| 37 |
+
Workflow workflow = 2;
|
| 38 |
+
Notebook notebook = 3;
|
| 39 |
+
GenericStringObject generic_string_object = 4;
|
| 40 |
+
}
|
| 41 |
+
}
|
| 42 |
+
|
| 43 |
+
message Workflow {
|
| 44 |
+
string name = 1;
|
| 45 |
+
string description = 2;
|
| 46 |
+
string command = 3;
|
| 47 |
+
}
|
| 48 |
+
|
| 49 |
+
message Notebook {
|
| 50 |
+
string title = 1;
|
| 51 |
+
string content = 2;
|
| 52 |
+
}
|
| 53 |
+
|
| 54 |
+
message GenericStringObject {
|
| 55 |
+
string payload = 1;
|
| 56 |
+
string object_type = 2;
|
| 57 |
+
}
|
proto/citations.proto
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
syntax = "proto3";
|
| 2 |
+
|
| 3 |
+
package warp.multi_agent.v1;
|
| 4 |
+
|
| 5 |
+
option go_package = "github.com/warp/warp-proto-apis/multi_agent/v1";
|
| 6 |
+
|
| 7 |
+
message Citation {
|
| 8 |
+
string document_id = 1;
|
| 9 |
+
DocumentType document_type = 2;
|
| 10 |
+
}
|
| 11 |
+
|
| 12 |
+
enum DocumentType {
|
| 13 |
+
WARP_DRIVE_WORKFLOW = 0;
|
| 14 |
+
WARP_DRIVE_NOTEBOOK = 1;
|
| 15 |
+
WARP_DRIVE_ENV_VAR = 2;
|
| 16 |
+
RULE = 3;
|
| 17 |
+
WARP_DOCUMENTATION = 4;
|
| 18 |
+
WEB_PAGE = 5;
|
| 19 |
+
UNKNOWN = 6;
|
| 20 |
+
}
|
proto/debug.proto
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
syntax = "proto3";
|
| 2 |
+
|
| 3 |
+
package warp.multi_agent.v1;
|
| 4 |
+
|
| 5 |
+
import "task.proto";
|
| 6 |
+
|
| 7 |
+
option go_package = "github.com/warp/warp-proto-apis/multi_agent/v1";
|
| 8 |
+
|
| 9 |
+
message TaskList {
|
| 10 |
+
repeated Task tasks = 1;
|
| 11 |
+
repeated string ordered_message_ids = 2;
|
| 12 |
+
}
|
proto/file_content.proto
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
syntax = "proto3";
|
| 2 |
+
|
| 3 |
+
package warp.multi_agent.v1;
|
| 4 |
+
|
| 5 |
+
import "options.proto";
|
| 6 |
+
|
| 7 |
+
option go_package = "github.com/warp/warp-proto-apis/multi_agent/v1";
|
| 8 |
+
|
| 9 |
+
message FileContentLineRange {
|
| 10 |
+
uint32 start = 1;
|
| 11 |
+
uint32 end = 2;
|
| 12 |
+
}
|
| 13 |
+
|
| 14 |
+
message FileContent {
|
| 15 |
+
string file_path = 1;
|
| 16 |
+
string content = 2;
|
| 17 |
+
FileContentLineRange line_range = 3;
|
| 18 |
+
}
|
proto/input_context.proto
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
syntax = "proto3";
|
| 2 |
+
|
| 3 |
+
package warp.multi_agent.v1;
|
| 4 |
+
|
| 5 |
+
import "google/protobuf/timestamp.proto";
|
| 6 |
+
import "file_content.proto";
|
| 7 |
+
import "attachment.proto";
|
| 8 |
+
import "options.proto";
|
| 9 |
+
|
| 10 |
+
option go_package = "github.com/warp/warp-proto-apis/multi_agent/v1";
|
| 11 |
+
|
| 12 |
+
message InputContext {
|
| 13 |
+
Directory directory = 1;
|
| 14 |
+
message Directory {
|
| 15 |
+
string pwd = 1;
|
| 16 |
+
string home = 2;
|
| 17 |
+
bool pwd_file_symbols_indexed = 3;
|
| 18 |
+
}
|
| 19 |
+
|
| 20 |
+
OperatingSystem operating_system = 2;
|
| 21 |
+
message OperatingSystem {
|
| 22 |
+
string platform = 1;
|
| 23 |
+
string distribution = 2;
|
| 24 |
+
}
|
| 25 |
+
|
| 26 |
+
Shell shell = 3;
|
| 27 |
+
message Shell {
|
| 28 |
+
string name = 1;
|
| 29 |
+
string version = 2;
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
google.protobuf.Timestamp current_time = 4;
|
| 33 |
+
|
| 34 |
+
repeated Codebase codebases = 8;
|
| 35 |
+
message Codebase {
|
| 36 |
+
string name = 1;
|
| 37 |
+
string path = 2;
|
| 38 |
+
}
|
| 39 |
+
|
| 40 |
+
repeated ProjectRules project_rules = 10;
|
| 41 |
+
message ProjectRules {
|
| 42 |
+
string root_path = 1;
|
| 43 |
+
repeated FileContent active_rule_files = 2;
|
| 44 |
+
repeated string additional_rule_file_paths = 3;
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
repeated ExecutedShellCommand executed_shell_commands = 5 [deprecated = true];
|
| 48 |
+
|
| 49 |
+
repeated SelectedText selected_text = 6;
|
| 50 |
+
message SelectedText {
|
| 51 |
+
string text = 1;
|
| 52 |
+
}
|
| 53 |
+
|
| 54 |
+
repeated Image images = 7;
|
| 55 |
+
message Image {
|
| 56 |
+
bytes data = 1;
|
| 57 |
+
string mime_type = 2;
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
repeated File files = 9;
|
| 61 |
+
message File {
|
| 62 |
+
FileContent content = 1;
|
| 63 |
+
}
|
| 64 |
+
}
|
proto/options.proto
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
syntax = "proto3";
|
| 2 |
+
|
| 3 |
+
package warp.multi_agent.v1;
|
| 4 |
+
|
| 5 |
+
import "google/protobuf/descriptor.proto";
|
| 6 |
+
|
| 7 |
+
option go_package = "github.com/warp/warp-proto-apis/multi_agent/v1";
|
| 8 |
+
|
| 9 |
+
extend google.protobuf.FieldOptions {
|
| 10 |
+
bool sensitive = 50000;
|
| 11 |
+
bool internal = 50001;
|
| 12 |
+
}
|
proto/request.proto
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
syntax = "proto3";
|
| 2 |
+
|
| 3 |
+
package warp.multi_agent.v1;
|
| 4 |
+
|
| 5 |
+
import "google/protobuf/struct.proto";
|
| 6 |
+
import "input_context.proto";
|
| 7 |
+
import "attachment.proto";
|
| 8 |
+
import "options.proto";
|
| 9 |
+
import "suggestions.proto";
|
| 10 |
+
import "task.proto";
|
| 11 |
+
|
| 12 |
+
option go_package = "github.com/warp/warp-proto-apis/multi_agent/v1";
|
| 13 |
+
|
| 14 |
+
message Request {
|
| 15 |
+
TaskContext task_context = 1;
|
| 16 |
+
message TaskContext {
|
| 17 |
+
repeated Task tasks = 1;
|
| 18 |
+
string active_task_id = 2;
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
Input input = 2;
|
| 22 |
+
message Input {
|
| 23 |
+
InputContext context = 1;
|
| 24 |
+
|
| 25 |
+
oneof type {
|
| 26 |
+
UserInputs user_inputs = 6;
|
| 27 |
+
QueryWithCannedResponse query_with_canned_response = 4;
|
| 28 |
+
AutoCodeDiffQuery auto_code_diff_query = 5;
|
| 29 |
+
ResumeConversation resume_conversation = 7;
|
| 30 |
+
InitProjectRules init_project_rules = 8;
|
| 31 |
+
UserQuery user_query = 2 [deprecated = true];
|
| 32 |
+
ToolCallResult tool_call_result = 3 [deprecated = true];
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
message UserQuery {
|
| 36 |
+
string query = 1;
|
| 37 |
+
map<string, Attachment> referenced_attachments = 2;
|
| 38 |
+
}
|
| 39 |
+
|
| 40 |
+
message UserInputs {
|
| 41 |
+
repeated UserInput inputs = 1;
|
| 42 |
+
message UserInput {
|
| 43 |
+
oneof input {
|
| 44 |
+
UserQuery user_query = 1;
|
| 45 |
+
ToolCallResult tool_call_result = 2;
|
| 46 |
+
}
|
| 47 |
+
}
|
| 48 |
+
}
|
| 49 |
+
|
| 50 |
+
message ToolCallResult {
|
| 51 |
+
string tool_call_id = 1;
|
| 52 |
+
|
| 53 |
+
oneof result {
|
| 54 |
+
RunShellCommandResult run_shell_command = 2;
|
| 55 |
+
ReadFilesResult read_files = 3;
|
| 56 |
+
SearchCodebaseResult search_codebase = 4;
|
| 57 |
+
ApplyFileDiffsResult apply_file_diffs = 5;
|
| 58 |
+
SuggestPlanResult suggest_plan = 6;
|
| 59 |
+
SuggestCreatePlanResult suggest_create_plan = 7;
|
| 60 |
+
GrepResult grep = 8;
|
| 61 |
+
FileGlobResult file_glob = 9;
|
| 62 |
+
RefineResult refine = 10;
|
| 63 |
+
ReadMCPResourceResult read_mcp_resource = 11;
|
| 64 |
+
CallMCPToolResult call_mcp_tool = 12;
|
| 65 |
+
WriteToLongRunningShellCommandResult write_to_long_running_shell_command = 13;
|
| 66 |
+
SuggestNewConversationResult suggest_new_conversation = 14;
|
| 67 |
+
FileGlobV2Result file_glob_v2 = 15;
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
message RefineResult {
|
| 71 |
+
UserQuery user_query = 1;
|
| 72 |
+
}
|
| 73 |
+
}
|
| 74 |
+
|
| 75 |
+
message QueryWithCannedResponse {
|
| 76 |
+
string query = 1;
|
| 77 |
+
|
| 78 |
+
oneof type {
|
| 79 |
+
Install install = 2;
|
| 80 |
+
Code code = 3;
|
| 81 |
+
Deploy deploy = 4;
|
| 82 |
+
SomethingElse something_else = 5;
|
| 83 |
+
CustomOnboardingRequest custom_onboarding_request = 6;
|
| 84 |
+
AgenticOnboardingKickoff agentic_onboarding_kickoff = 7;
|
| 85 |
+
}
|
| 86 |
+
|
| 87 |
+
message Install {
|
| 88 |
+
|
| 89 |
+
}
|
| 90 |
+
|
| 91 |
+
message Code {
|
| 92 |
+
|
| 93 |
+
}
|
| 94 |
+
|
| 95 |
+
message Deploy {
|
| 96 |
+
|
| 97 |
+
}
|
| 98 |
+
|
| 99 |
+
message SomethingElse {
|
| 100 |
+
|
| 101 |
+
}
|
| 102 |
+
|
| 103 |
+
message CustomOnboardingRequest {
|
| 104 |
+
|
| 105 |
+
}
|
| 106 |
+
|
| 107 |
+
message AgenticOnboardingKickoff {
|
| 108 |
+
|
| 109 |
+
}
|
| 110 |
+
}
|
| 111 |
+
|
| 112 |
+
message AutoCodeDiffQuery {
|
| 113 |
+
string query = 1;
|
| 114 |
+
}
|
| 115 |
+
|
| 116 |
+
message ResumeConversation {
|
| 117 |
+
|
| 118 |
+
}
|
| 119 |
+
|
| 120 |
+
message InitProjectRules {
|
| 121 |
+
|
| 122 |
+
}
|
| 123 |
+
}
|
| 124 |
+
|
| 125 |
+
Settings settings = 3;
|
| 126 |
+
message Settings {
|
| 127 |
+
ModelConfig model_config = 1;
|
| 128 |
+
message ModelConfig {
|
| 129 |
+
string base = 1;
|
| 130 |
+
string planning = 2;
|
| 131 |
+
string coding = 3;
|
| 132 |
+
}
|
| 133 |
+
|
| 134 |
+
bool rules_enabled = 2;
|
| 135 |
+
bool web_context_retrieval_enabled = 3;
|
| 136 |
+
bool supports_parallel_tool_calls = 4;
|
| 137 |
+
bool use_anthropic_text_editor_tools = 5;
|
| 138 |
+
bool planning_enabled = 6;
|
| 139 |
+
bool warp_drive_context_enabled = 7;
|
| 140 |
+
bool supports_create_files = 8;
|
| 141 |
+
repeated ToolType supported_tools = 9;
|
| 142 |
+
bool supports_long_running_commands = 10;
|
| 143 |
+
bool should_preserve_file_content_in_history = 11;
|
| 144 |
+
bool supports_todos_ui = 12;
|
| 145 |
+
bool supports_linked_code_blocks = 13;
|
| 146 |
+
}
|
| 147 |
+
|
| 148 |
+
Metadata metadata = 4;
|
| 149 |
+
message Metadata {
|
| 150 |
+
string conversation_id = 1;
|
| 151 |
+
map<string, google.protobuf.Value> logging = 2;
|
| 152 |
+
}
|
| 153 |
+
|
| 154 |
+
Suggestions existing_suggestions = 5;
|
| 155 |
+
|
| 156 |
+
MCPContext mcp_context = 6;
|
| 157 |
+
message MCPContext {
|
| 158 |
+
repeated MCPResource resources = 1;
|
| 159 |
+
message MCPResource {
|
| 160 |
+
string uri = 1;
|
| 161 |
+
string name = 2;
|
| 162 |
+
string description = 3;
|
| 163 |
+
string mime_type = 4;
|
| 164 |
+
}
|
| 165 |
+
|
| 166 |
+
repeated MCPTool tools = 2;
|
| 167 |
+
message MCPTool {
|
| 168 |
+
string name = 1;
|
| 169 |
+
string description = 2;
|
| 170 |
+
google.protobuf.Struct input_schema = 3;
|
| 171 |
+
}
|
| 172 |
+
}
|
| 173 |
+
}
|
proto/response.proto
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
syntax = "proto3";
|
| 2 |
+
|
| 3 |
+
package warp.multi_agent.v1;
|
| 4 |
+
|
| 5 |
+
import "google/protobuf/field_mask.proto";
|
| 6 |
+
import "options.proto";
|
| 7 |
+
import "suggestions.proto";
|
| 8 |
+
import "task.proto";
|
| 9 |
+
|
| 10 |
+
option go_package = "github.com/warp/warp-proto-apis/multi_agent/v1";
|
| 11 |
+
|
| 12 |
+
message ResponseEvent {
|
| 13 |
+
oneof type {
|
| 14 |
+
StreamInit init = 1;
|
| 15 |
+
ClientActions client_actions = 2;
|
| 16 |
+
StreamFinished finished = 3;
|
| 17 |
+
}
|
| 18 |
+
|
| 19 |
+
message StreamInit {
|
| 20 |
+
string conversation_id = 1;
|
| 21 |
+
string request_id = 2;
|
| 22 |
+
}
|
| 23 |
+
|
| 24 |
+
message ClientActions {
|
| 25 |
+
repeated ClientAction actions = 1;
|
| 26 |
+
}
|
| 27 |
+
|
| 28 |
+
message StreamFinished {
|
| 29 |
+
repeated TokenUsage token_usage = 8;
|
| 30 |
+
message TokenUsage {
|
| 31 |
+
string model_id = 1;
|
| 32 |
+
uint32 total_input = 2;
|
| 33 |
+
uint32 output = 3;
|
| 34 |
+
uint32 input_cache_read = 4;
|
| 35 |
+
uint32 input_cache_write = 5;
|
| 36 |
+
float cost_in_cents = 6;
|
| 37 |
+
}
|
| 38 |
+
|
| 39 |
+
bool should_refresh_model_config = 9;
|
| 40 |
+
|
| 41 |
+
RequestCost request_cost = 10;
|
| 42 |
+
message RequestCost {
|
| 43 |
+
float exact = 1;
|
| 44 |
+
}
|
| 45 |
+
|
| 46 |
+
ContextWindowInfo context_window_info = 11;
|
| 47 |
+
message ContextWindowInfo {
|
| 48 |
+
float context_window_usage = 1;
|
| 49 |
+
bool summarized = 2;
|
| 50 |
+
}
|
| 51 |
+
|
| 52 |
+
oneof reason {
|
| 53 |
+
Other other = 1;
|
| 54 |
+
Done done = 2;
|
| 55 |
+
ReachedMaxTokenLimit max_token_limit = 3;
|
| 56 |
+
QuotaLimit quota_limit = 4;
|
| 57 |
+
ContextWindowExceeded context_window_exceeded = 5;
|
| 58 |
+
LLMUnavailable llm_unavailable = 6;
|
| 59 |
+
InternalError internal_error = 7;
|
| 60 |
+
}
|
| 61 |
+
|
| 62 |
+
message Other {
|
| 63 |
+
|
| 64 |
+
}
|
| 65 |
+
|
| 66 |
+
message Done {
|
| 67 |
+
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
message ReachedMaxTokenLimit {
|
| 71 |
+
|
| 72 |
+
}
|
| 73 |
+
|
| 74 |
+
message QuotaLimit {
|
| 75 |
+
|
| 76 |
+
}
|
| 77 |
+
|
| 78 |
+
message ContextWindowExceeded {
|
| 79 |
+
|
| 80 |
+
}
|
| 81 |
+
|
| 82 |
+
message LLMUnavailable {
|
| 83 |
+
|
| 84 |
+
}
|
| 85 |
+
|
| 86 |
+
message InternalError {
|
| 87 |
+
string message = 1;
|
| 88 |
+
}
|
| 89 |
+
}
|
| 90 |
+
}
|
| 91 |
+
|
| 92 |
+
message ClientAction {
|
| 93 |
+
oneof action {
|
| 94 |
+
CreateTask create_task = 1;
|
| 95 |
+
UpdateTaskStatus update_task_status = 2;
|
| 96 |
+
AddMessagesToTask add_messages_to_task = 3;
|
| 97 |
+
UpdateTaskMessage update_task_message = 4;
|
| 98 |
+
AppendToMessageContent append_to_message_content = 5;
|
| 99 |
+
Suggestions show_suggestions = 6;
|
| 100 |
+
UpdateTaskSummary update_task_summary = 7;
|
| 101 |
+
UpdateTaskDescription update_task_description = 8;
|
| 102 |
+
BeginTransaction begin_transaction = 9;
|
| 103 |
+
CommitTransaction commit_transaction = 10;
|
| 104 |
+
RollbackTransaction rollback_transaction = 11;
|
| 105 |
+
StartNewConversation start_new_conversation = 12;
|
| 106 |
+
}
|
| 107 |
+
|
| 108 |
+
message CreateTask {
|
| 109 |
+
Task task = 1;
|
| 110 |
+
}
|
| 111 |
+
|
| 112 |
+
message UpdateTaskStatus {
|
| 113 |
+
string task_id = 1;
|
| 114 |
+
TaskStatus task_status = 2;
|
| 115 |
+
}
|
| 116 |
+
|
| 117 |
+
message UpdateTaskDescription {
|
| 118 |
+
string task_id = 1;
|
| 119 |
+
string description = 2;
|
| 120 |
+
}
|
| 121 |
+
|
| 122 |
+
message AddMessagesToTask {
|
| 123 |
+
string task_id = 1;
|
| 124 |
+
repeated Message messages = 2;
|
| 125 |
+
}
|
| 126 |
+
|
| 127 |
+
message UpdateTaskMessage {
|
| 128 |
+
string task_id = 3;
|
| 129 |
+
Message message = 1;
|
| 130 |
+
google.protobuf.FieldMask mask = 2;
|
| 131 |
+
}
|
| 132 |
+
|
| 133 |
+
message AppendToMessageContent {
|
| 134 |
+
string task_id = 3;
|
| 135 |
+
Message message = 1;
|
| 136 |
+
google.protobuf.FieldMask mask = 2;
|
| 137 |
+
}
|
| 138 |
+
|
| 139 |
+
message UpdateTaskSummary {
|
| 140 |
+
string task_id = 1;
|
| 141 |
+
string summary = 2;
|
| 142 |
+
}
|
| 143 |
+
|
| 144 |
+
message BeginTransaction {
|
| 145 |
+
|
| 146 |
+
}
|
| 147 |
+
|
| 148 |
+
message CommitTransaction {
|
| 149 |
+
|
| 150 |
+
}
|
| 151 |
+
|
| 152 |
+
message RollbackTransaction {
|
| 153 |
+
|
| 154 |
+
}
|
| 155 |
+
|
| 156 |
+
message StartNewConversation {
|
| 157 |
+
string start_from_message_id = 1;
|
| 158 |
+
}
|
| 159 |
+
}
|
proto/suggestions.proto
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
syntax = "proto3";
|
| 2 |
+
|
| 3 |
+
package warp.multi_agent.v1;
|
| 4 |
+
|
| 5 |
+
option go_package = "github.com/warp/warp-proto-apis/multi_agent/v1";
|
| 6 |
+
|
| 7 |
+
message Suggestions {
|
| 8 |
+
repeated SuggestedRule rules = 1;
|
| 9 |
+
repeated SuggestedAgentModeWorkflow workflows = 2;
|
| 10 |
+
}
|
| 11 |
+
|
| 12 |
+
message SuggestedRule {
|
| 13 |
+
string name = 1;
|
| 14 |
+
string content = 2;
|
| 15 |
+
string logging_id = 3;
|
| 16 |
+
}
|
| 17 |
+
|
| 18 |
+
message SuggestedAgentModeWorkflow {
|
| 19 |
+
string name = 1;
|
| 20 |
+
string prompt = 2;
|
| 21 |
+
string logging_id = 3;
|
| 22 |
+
}
|
proto/task.proto
ADDED
|
@@ -0,0 +1,503 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
syntax = "proto3";
|
| 2 |
+
|
| 3 |
+
package warp.multi_agent.v1;
|
| 4 |
+
|
| 5 |
+
import "google/protobuf/empty.proto";
|
| 6 |
+
import "google/protobuf/descriptor.proto";
|
| 7 |
+
import "google/protobuf/struct.proto";
|
| 8 |
+
import "citations.proto";
|
| 9 |
+
import "input_context.proto";
|
| 10 |
+
import "attachment.proto";
|
| 11 |
+
import "file_content.proto";
|
| 12 |
+
import "options.proto";
|
| 13 |
+
import "todo.proto";
|
| 14 |
+
|
| 15 |
+
option go_package = "github.com/warp/warp-proto-apis/multi_agent/v1";
|
| 16 |
+
|
| 17 |
+
message Task {
|
| 18 |
+
string id = 1;
|
| 19 |
+
string description = 2;
|
| 20 |
+
|
| 21 |
+
Dependencies dependencies = 3;
|
| 22 |
+
message Dependencies {
|
| 23 |
+
string parent_task_id = 1;
|
| 24 |
+
repeated string sibling_dependencies = 2;
|
| 25 |
+
}
|
| 26 |
+
|
| 27 |
+
TaskStatus status = 4;
|
| 28 |
+
repeated Message messages = 5;
|
| 29 |
+
string summary = 6;
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
message TaskStatus {
|
| 33 |
+
oneof status {
|
| 34 |
+
Pending pending = 1;
|
| 35 |
+
InProgress in_progress = 2;
|
| 36 |
+
Blocked blocked = 3;
|
| 37 |
+
Succeeded succeeded = 4;
|
| 38 |
+
Failed failed = 5;
|
| 39 |
+
Aborted aborted = 6;
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
+
message Pending {
|
| 43 |
+
|
| 44 |
+
}
|
| 45 |
+
|
| 46 |
+
message InProgress {
|
| 47 |
+
|
| 48 |
+
}
|
| 49 |
+
|
| 50 |
+
message Blocked {
|
| 51 |
+
|
| 52 |
+
}
|
| 53 |
+
|
| 54 |
+
message Succeeded {
|
| 55 |
+
|
| 56 |
+
}
|
| 57 |
+
|
| 58 |
+
message Failed {
|
| 59 |
+
|
| 60 |
+
}
|
| 61 |
+
|
| 62 |
+
message Aborted {
|
| 63 |
+
|
| 64 |
+
}
|
| 65 |
+
}
|
| 66 |
+
|
| 67 |
+
message Message {
|
| 68 |
+
string id = 1;
|
| 69 |
+
string task_id = 11;
|
| 70 |
+
string server_message_data = 7;
|
| 71 |
+
repeated Citation citations = 8;
|
| 72 |
+
|
| 73 |
+
oneof message {
|
| 74 |
+
UserQuery user_query = 2;
|
| 75 |
+
AgentOutput agent_output = 3;
|
| 76 |
+
ToolCall tool_call = 4;
|
| 77 |
+
ToolCallResult tool_call_result = 5;
|
| 78 |
+
ServerEvent server_event = 6;
|
| 79 |
+
SystemQuery system_query = 9;
|
| 80 |
+
UpdateTodos update_todos = 10;
|
| 81 |
+
}
|
| 82 |
+
|
| 83 |
+
message UserQuery {
|
| 84 |
+
string query = 1;
|
| 85 |
+
InputContext context = 2;
|
| 86 |
+
map<string, Attachment> referenced_attachments = 3;
|
| 87 |
+
}
|
| 88 |
+
|
| 89 |
+
message SystemQuery {
|
| 90 |
+
InputContext context = 2;
|
| 91 |
+
|
| 92 |
+
oneof type {
|
| 93 |
+
AutoCodeDiff auto_code_diff = 1;
|
| 94 |
+
ResumeConversation resume_conversation = 3;
|
| 95 |
+
}
|
| 96 |
+
}
|
| 97 |
+
|
| 98 |
+
message AutoCodeDiff {
|
| 99 |
+
string query = 1;
|
| 100 |
+
}
|
| 101 |
+
|
| 102 |
+
message ResumeConversation {
|
| 103 |
+
|
| 104 |
+
}
|
| 105 |
+
|
| 106 |
+
message AgentOutput {
|
| 107 |
+
string text = 1;
|
| 108 |
+
string reasoning = 2;
|
| 109 |
+
}
|
| 110 |
+
|
| 111 |
+
message ToolCall {
|
| 112 |
+
string tool_call_id = 1;
|
| 113 |
+
|
| 114 |
+
oneof tool {
|
| 115 |
+
RunShellCommand run_shell_command = 2;
|
| 116 |
+
SearchCodebase search_codebase = 3;
|
| 117 |
+
Server server = 4;
|
| 118 |
+
ReadFiles read_files = 5;
|
| 119 |
+
ApplyFileDiffs apply_file_diffs = 6;
|
| 120 |
+
SuggestPlan suggest_plan = 7;
|
| 121 |
+
SuggestCreatePlan suggest_create_plan = 8;
|
| 122 |
+
Grep grep = 9;
|
| 123 |
+
FileGlob file_glob = 10 [deprecated = true];
|
| 124 |
+
ReadMCPResource read_mcp_resource = 11;
|
| 125 |
+
CallMCPTool call_mcp_tool = 12;
|
| 126 |
+
WriteToLongRunningShellCommand write_to_long_running_shell_command = 13;
|
| 127 |
+
SuggestNewConversation suggest_new_conversation = 14;
|
| 128 |
+
FileGlobV2 file_glob_v2 = 15;
|
| 129 |
+
}
|
| 130 |
+
|
| 131 |
+
message Server {
|
| 132 |
+
string payload = 1;
|
| 133 |
+
}
|
| 134 |
+
|
| 135 |
+
message RunShellCommand {
|
| 136 |
+
string command = 1;
|
| 137 |
+
bool is_read_only = 2;
|
| 138 |
+
bool uses_pager = 3;
|
| 139 |
+
repeated Citation citations = 4;
|
| 140 |
+
bool is_risky = 5;
|
| 141 |
+
}
|
| 142 |
+
|
| 143 |
+
message WriteToLongRunningShellCommand {
|
| 144 |
+
bytes input = 1;
|
| 145 |
+
}
|
| 146 |
+
|
| 147 |
+
message SuggestNewConversation {
|
| 148 |
+
string message_id = 1;
|
| 149 |
+
}
|
| 150 |
+
|
| 151 |
+
message ReadFiles {
|
| 152 |
+
repeated File files = 1;
|
| 153 |
+
message File {
|
| 154 |
+
string name = 1;
|
| 155 |
+
repeated FileContentLineRange line_ranges = 2;
|
| 156 |
+
}
|
| 157 |
+
}
|
| 158 |
+
|
| 159 |
+
message SearchCodebase {
|
| 160 |
+
string query = 1;
|
| 161 |
+
repeated string path_filters = 2;
|
| 162 |
+
string codebase_path = 3;
|
| 163 |
+
}
|
| 164 |
+
|
| 165 |
+
message ApplyFileDiffs {
|
| 166 |
+
string summary = 1;
|
| 167 |
+
|
| 168 |
+
repeated FileDiff diffs = 2;
|
| 169 |
+
message FileDiff {
|
| 170 |
+
string file_path = 1;
|
| 171 |
+
string search = 2;
|
| 172 |
+
string replace = 3;
|
| 173 |
+
}
|
| 174 |
+
|
| 175 |
+
repeated NewFile new_files = 3;
|
| 176 |
+
message NewFile {
|
| 177 |
+
string file_path = 1;
|
| 178 |
+
string content = 2;
|
| 179 |
+
}
|
| 180 |
+
}
|
| 181 |
+
|
| 182 |
+
message SuggestPlan {
|
| 183 |
+
string summary = 1;
|
| 184 |
+
repeated Task proposed_tasks = 2;
|
| 185 |
+
}
|
| 186 |
+
|
| 187 |
+
message SuggestCreatePlan {
|
| 188 |
+
|
| 189 |
+
}
|
| 190 |
+
|
| 191 |
+
message Grep {
|
| 192 |
+
repeated string queries = 1;
|
| 193 |
+
string path = 2;
|
| 194 |
+
}
|
| 195 |
+
|
| 196 |
+
message FileGlob {
|
| 197 |
+
repeated string patterns = 1;
|
| 198 |
+
string path = 2;
|
| 199 |
+
}
|
| 200 |
+
|
| 201 |
+
message FileGlobV2 {
|
| 202 |
+
repeated string patterns = 1;
|
| 203 |
+
string search_dir = 2;
|
| 204 |
+
int32 max_matches = 3;
|
| 205 |
+
int32 max_depth = 4;
|
| 206 |
+
int32 min_depth = 5;
|
| 207 |
+
}
|
| 208 |
+
|
| 209 |
+
message ReadMCPResource {
|
| 210 |
+
string uri = 1;
|
| 211 |
+
}
|
| 212 |
+
|
| 213 |
+
message CallMCPTool {
|
| 214 |
+
string name = 1;
|
| 215 |
+
google.protobuf.Struct args = 2;
|
| 216 |
+
}
|
| 217 |
+
}
|
| 218 |
+
|
| 219 |
+
message ToolCallResult {
|
| 220 |
+
string tool_call_id = 1;
|
| 221 |
+
InputContext context = 11;
|
| 222 |
+
|
| 223 |
+
oneof result {
|
| 224 |
+
RunShellCommandResult run_shell_command = 2;
|
| 225 |
+
SearchCodebaseResult search_codebase = 3;
|
| 226 |
+
ServerResult server = 4;
|
| 227 |
+
ReadFilesResult read_files = 5;
|
| 228 |
+
ApplyFileDiffsResult apply_file_diffs = 6;
|
| 229 |
+
SuggestPlanResult suggest_plan = 7;
|
| 230 |
+
SuggestCreatePlanResult suggest_create_plan = 8;
|
| 231 |
+
GrepResult grep = 9;
|
| 232 |
+
FileGlobResult file_glob = 10 [deprecated = true];
|
| 233 |
+
RefineResult refine = 13;
|
| 234 |
+
google.protobuf.Empty cancel = 14;
|
| 235 |
+
ReadMCPResourceResult read_mcp_resource = 15;
|
| 236 |
+
CallMCPToolResult call_mcp_tool = 16;
|
| 237 |
+
WriteToLongRunningShellCommandResult write_to_long_running_shell_command = 17;
|
| 238 |
+
SuggestNewConversationResult suggest_new_conversation = 18;
|
| 239 |
+
FileGlobV2Result file_glob_v2 = 19;
|
| 240 |
+
}
|
| 241 |
+
|
| 242 |
+
message ServerResult {
|
| 243 |
+
string serialized_result = 1;
|
| 244 |
+
}
|
| 245 |
+
|
| 246 |
+
message RefineResult {
|
| 247 |
+
UserQuery user_query = 1;
|
| 248 |
+
}
|
| 249 |
+
}
|
| 250 |
+
|
| 251 |
+
message ServerEvent {
|
| 252 |
+
string payload = 1;
|
| 253 |
+
}
|
| 254 |
+
|
| 255 |
+
message UpdateTodos {
|
| 256 |
+
oneof operation {
|
| 257 |
+
CreateTodoList create_todo_list = 1;
|
| 258 |
+
UpdatePendingTodos update_pending_todos = 2;
|
| 259 |
+
MarkTodosCompleted mark_todos_completed = 3;
|
| 260 |
+
}
|
| 261 |
+
}
|
| 262 |
+
}
|
| 263 |
+
|
| 264 |
+
message RunShellCommandResult {
|
| 265 |
+
string command = 3;
|
| 266 |
+
string output = 1 [deprecated = true];
|
| 267 |
+
int32 exit_code = 2 [deprecated = true];
|
| 268 |
+
|
| 269 |
+
oneof result {
|
| 270 |
+
LongRunningShellCommandSnapshot long_running_command_snapshot = 4;
|
| 271 |
+
ShellCommandFinished command_finished = 5;
|
| 272 |
+
}
|
| 273 |
+
}
|
| 274 |
+
|
| 275 |
+
message ReadFilesResult {
|
| 276 |
+
oneof result {
|
| 277 |
+
Success success = 1;
|
| 278 |
+
Error error = 2;
|
| 279 |
+
}
|
| 280 |
+
|
| 281 |
+
message Success {
|
| 282 |
+
repeated FileContent files = 1;
|
| 283 |
+
}
|
| 284 |
+
|
| 285 |
+
message Error {
|
| 286 |
+
string message = 1;
|
| 287 |
+
}
|
| 288 |
+
}
|
| 289 |
+
|
| 290 |
+
message SearchCodebaseResult {
|
| 291 |
+
oneof result {
|
| 292 |
+
Success success = 1;
|
| 293 |
+
Error error = 2;
|
| 294 |
+
}
|
| 295 |
+
|
| 296 |
+
message Success {
|
| 297 |
+
repeated FileContent files = 1;
|
| 298 |
+
}
|
| 299 |
+
|
| 300 |
+
message Error {
|
| 301 |
+
string message = 1;
|
| 302 |
+
}
|
| 303 |
+
}
|
| 304 |
+
|
| 305 |
+
message ApplyFileDiffsResult {
|
| 306 |
+
oneof result {
|
| 307 |
+
Success success = 1;
|
| 308 |
+
Error error = 2;
|
| 309 |
+
}
|
| 310 |
+
|
| 311 |
+
message Success {
|
| 312 |
+
repeated FileContent updated_files = 1 [deprecated = true];
|
| 313 |
+
|
| 314 |
+
repeated UpdatedFileContent updated_files_v2 = 2;
|
| 315 |
+
message UpdatedFileContent {
|
| 316 |
+
FileContent file = 1;
|
| 317 |
+
bool was_edited_by_user = 2;
|
| 318 |
+
}
|
| 319 |
+
}
|
| 320 |
+
|
| 321 |
+
message Error {
|
| 322 |
+
string message = 1;
|
| 323 |
+
}
|
| 324 |
+
}
|
| 325 |
+
|
| 326 |
+
message SuggestCreatePlanResult {
|
| 327 |
+
bool accepted = 1;
|
| 328 |
+
}
|
| 329 |
+
|
| 330 |
+
message SuggestPlanResult {
|
| 331 |
+
oneof result {
|
| 332 |
+
google.protobuf.Empty accepted = 1;
|
| 333 |
+
UserEditedPlan user_edited_plan = 2;
|
| 334 |
+
}
|
| 335 |
+
|
| 336 |
+
message UserEditedPlan {
|
| 337 |
+
string plan_text = 1;
|
| 338 |
+
}
|
| 339 |
+
}
|
| 340 |
+
|
| 341 |
+
message GrepResult {
|
| 342 |
+
oneof result {
|
| 343 |
+
Success success = 1;
|
| 344 |
+
Error error = 2;
|
| 345 |
+
}
|
| 346 |
+
|
| 347 |
+
message Success {
|
| 348 |
+
repeated GrepFileMatch matched_files = 1;
|
| 349 |
+
message GrepFileMatch {
|
| 350 |
+
string file_path = 1;
|
| 351 |
+
|
| 352 |
+
repeated GrepLineMatch matched_lines = 2;
|
| 353 |
+
message GrepLineMatch {
|
| 354 |
+
uint32 line_number = 1;
|
| 355 |
+
}
|
| 356 |
+
}
|
| 357 |
+
}
|
| 358 |
+
|
| 359 |
+
message Error {
|
| 360 |
+
string message = 1;
|
| 361 |
+
}
|
| 362 |
+
}
|
| 363 |
+
|
| 364 |
+
message FileGlobResult {
|
| 365 |
+
oneof result {
|
| 366 |
+
Success success = 1;
|
| 367 |
+
Error error = 2;
|
| 368 |
+
}
|
| 369 |
+
|
| 370 |
+
message Success {
|
| 371 |
+
string matched_files = 1;
|
| 372 |
+
}
|
| 373 |
+
|
| 374 |
+
message Error {
|
| 375 |
+
string message = 1;
|
| 376 |
+
}
|
| 377 |
+
}
|
| 378 |
+
|
| 379 |
+
message FileGlobV2Result {
|
| 380 |
+
oneof result {
|
| 381 |
+
Success success = 1;
|
| 382 |
+
Error error = 2;
|
| 383 |
+
}
|
| 384 |
+
|
| 385 |
+
message Success {
|
| 386 |
+
repeated FileGlobMatch matched_files = 1;
|
| 387 |
+
message FileGlobMatch {
|
| 388 |
+
string file_path = 1;
|
| 389 |
+
}
|
| 390 |
+
}
|
| 391 |
+
|
| 392 |
+
message Error {
|
| 393 |
+
string message = 1;
|
| 394 |
+
}
|
| 395 |
+
}
|
| 396 |
+
|
| 397 |
+
message MCPResourceContent {
|
| 398 |
+
string uri = 1;
|
| 399 |
+
|
| 400 |
+
oneof content_type {
|
| 401 |
+
Text text = 2;
|
| 402 |
+
Binary binary = 3;
|
| 403 |
+
}
|
| 404 |
+
|
| 405 |
+
message Text {
|
| 406 |
+
string content = 1;
|
| 407 |
+
string mime_type = 2;
|
| 408 |
+
}
|
| 409 |
+
|
| 410 |
+
message Binary {
|
| 411 |
+
bytes data = 1;
|
| 412 |
+
string mime_type = 2;
|
| 413 |
+
}
|
| 414 |
+
}
|
| 415 |
+
|
| 416 |
+
message ReadMCPResourceResult {
|
| 417 |
+
oneof result {
|
| 418 |
+
Success success = 1;
|
| 419 |
+
Error error = 2;
|
| 420 |
+
}
|
| 421 |
+
|
| 422 |
+
message Success {
|
| 423 |
+
repeated MCPResourceContent contents = 1;
|
| 424 |
+
}
|
| 425 |
+
|
| 426 |
+
message Error {
|
| 427 |
+
string message = 1;
|
| 428 |
+
}
|
| 429 |
+
}
|
| 430 |
+
|
| 431 |
+
message WriteToLongRunningShellCommandResult {
|
| 432 |
+
oneof result {
|
| 433 |
+
LongRunningShellCommandSnapshot long_running_command_snapshot = 1;
|
| 434 |
+
ShellCommandFinished command_finished = 2;
|
| 435 |
+
}
|
| 436 |
+
}
|
| 437 |
+
|
| 438 |
+
message SuggestNewConversationResult {
|
| 439 |
+
oneof result {
|
| 440 |
+
Accepted accepted = 1;
|
| 441 |
+
Rejected rejected = 2;
|
| 442 |
+
}
|
| 443 |
+
|
| 444 |
+
message Accepted {
|
| 445 |
+
string message_id = 1;
|
| 446 |
+
}
|
| 447 |
+
|
| 448 |
+
message Rejected {
|
| 449 |
+
|
| 450 |
+
}
|
| 451 |
+
}
|
| 452 |
+
|
| 453 |
+
message ShellCommandFinished {
|
| 454 |
+
string output = 1;
|
| 455 |
+
int32 exit_code = 2;
|
| 456 |
+
}
|
| 457 |
+
|
| 458 |
+
message CallMCPToolResult {
|
| 459 |
+
oneof result {
|
| 460 |
+
Success success = 1;
|
| 461 |
+
Error error = 2;
|
| 462 |
+
}
|
| 463 |
+
|
| 464 |
+
message Success {
|
| 465 |
+
repeated Result results = 1;
|
| 466 |
+
message Result {
|
| 467 |
+
oneof result {
|
| 468 |
+
Text text = 1;
|
| 469 |
+
Image image = 2;
|
| 470 |
+
MCPResourceContent resource = 3;
|
| 471 |
+
}
|
| 472 |
+
|
| 473 |
+
message Text {
|
| 474 |
+
string text = 1;
|
| 475 |
+
}
|
| 476 |
+
|
| 477 |
+
message Image {
|
| 478 |
+
bytes data = 1;
|
| 479 |
+
string mime_type = 2;
|
| 480 |
+
}
|
| 481 |
+
}
|
| 482 |
+
}
|
| 483 |
+
|
| 484 |
+
message Error {
|
| 485 |
+
string message = 1;
|
| 486 |
+
}
|
| 487 |
+
}
|
| 488 |
+
|
| 489 |
+
enum ToolType {
|
| 490 |
+
RUN_SHELL_COMMAND = 0;
|
| 491 |
+
SEARCH_CODEBASE = 1;
|
| 492 |
+
READ_FILES = 2;
|
| 493 |
+
APPLY_FILE_DIFFS = 3;
|
| 494 |
+
SUGGEST_PLAN = 4;
|
| 495 |
+
SUGGEST_CREATE_PLAN = 5;
|
| 496 |
+
GREP = 6;
|
| 497 |
+
FILE_GLOB = 7;
|
| 498 |
+
READ_MCP_RESOURCE = 8;
|
| 499 |
+
CALL_MCP_TOOL = 9;
|
| 500 |
+
WRITE_TO_LONG_RUNNING_SHELL_COMMAND = 10;
|
| 501 |
+
SUGGEST_NEW_CONVERSATION = 11;
|
| 502 |
+
FILE_GLOB_V2 = 12;
|
| 503 |
+
}
|
proto/todo.proto
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
syntax = "proto3";
|
| 2 |
+
|
| 3 |
+
package warp.multi_agent.v1;
|
| 4 |
+
|
| 5 |
+
option go_package = "github.com/warp/warp-proto-apis/multi_agent/v1";
|
| 6 |
+
|
| 7 |
+
message TodoItem {
|
| 8 |
+
string id = 1;
|
| 9 |
+
string title = 2;
|
| 10 |
+
string description = 3;
|
| 11 |
+
}
|
| 12 |
+
|
| 13 |
+
message CreateTodoList {
|
| 14 |
+
repeated TodoItem initial_todos = 1;
|
| 15 |
+
}
|
| 16 |
+
|
| 17 |
+
message UpdatePendingTodos {
|
| 18 |
+
repeated TodoItem updated_pending_todos = 1;
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
message MarkTodosCompleted {
|
| 22 |
+
repeated string todo_ids = 1;
|
| 23 |
+
}
|
protobuf2openai/__init__.py
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Package for converting between Warp protobuf JSON and OpenAI Chat Completions API
|
| 2 |
+
|
| 3 |
+
__all__ = []
|
protobuf2openai/__pycache__/__init__.cpython-312.pyc
ADDED
|
Binary file (164 Bytes). View file
|
|
|
protobuf2openai/__pycache__/app.cpython-312.pyc
ADDED
|
Binary file (3.08 kB). View file
|
|
|
protobuf2openai/__pycache__/bridge.cpython-312.pyc
ADDED
|
Binary file (5.15 kB). View file
|
|
|
protobuf2openai/__pycache__/config.cpython-312.pyc
ADDED
|
Binary file (742 Bytes). View file
|
|
|
protobuf2openai/__pycache__/helpers.cpython-312.pyc
ADDED
|
Binary file (2.95 kB). View file
|
|
|
protobuf2openai/__pycache__/logging.cpython-312.pyc
ADDED
|
Binary file (1.04 kB). View file
|
|
|
protobuf2openai/__pycache__/models.cpython-312.pyc
ADDED
|
Binary file (1.87 kB). View file
|
|
|
protobuf2openai/__pycache__/packets.cpython-312.pyc
ADDED
|
Binary file (6.16 kB). View file
|
|
|
protobuf2openai/__pycache__/reorder.cpython-312.pyc
ADDED
|
Binary file (4.27 kB). View file
|
|
|
protobuf2openai/__pycache__/router.cpython-312.pyc
ADDED
|
Binary file (11.2 kB). View file
|
|
|
protobuf2openai/__pycache__/sse_transform.cpython-312.pyc
ADDED
|
Binary file (14 kB). View file
|
|
|
protobuf2openai/__pycache__/state.cpython-312.pyc
ADDED
|
Binary file (1.13 kB). View file
|
|
|
protobuf2openai/app.py
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from __future__ import annotations
|
| 2 |
+
|
| 3 |
+
import asyncio
|
| 4 |
+
import json
|
| 5 |
+
from contextlib import asynccontextmanager
|
| 6 |
+
|
| 7 |
+
from fastapi import FastAPI
|
| 8 |
+
|
| 9 |
+
from .logging import logger
|
| 10 |
+
|
| 11 |
+
from .config import WARMUP_INIT_RETRIES, WARMUP_INIT_DELAY_S
|
| 12 |
+
from .bridge import initialize_once
|
| 13 |
+
from .router import router
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
@asynccontextmanager
|
| 17 |
+
async def lifespan(app: FastAPI):
|
| 18 |
+
"""应用生命周期管理"""
|
| 19 |
+
# 启动时执行
|
| 20 |
+
try:
|
| 21 |
+
logger.info("[OpenAI Compat] Server starting with direct module integration")
|
| 22 |
+
logger.info("[OpenAI Compat] Endpoints: GET /healthz, GET /v1/models, POST /v1/chat/completions")
|
| 23 |
+
except Exception:
|
| 24 |
+
pass
|
| 25 |
+
|
| 26 |
+
# 移除HTTP健康检查,现在使用直接模块调用
|
| 27 |
+
logger.info("[OpenAI Compat] 跳过HTTP健康检查,使用直接模块集成")
|
| 28 |
+
|
| 29 |
+
try:
|
| 30 |
+
await initialize_once()
|
| 31 |
+
except Exception as e:
|
| 32 |
+
logger.warning(f"[OpenAI Compat] Warmup initialize_once on startup failed: {e}")
|
| 33 |
+
|
| 34 |
+
yield
|
| 35 |
+
# 关闭时执行(如果需要的话)
|
| 36 |
+
|
| 37 |
+
|
| 38 |
+
app = FastAPI(
|
| 39 |
+
title="OpenAI Chat Completions (Warp bridge) - Streaming",
|
| 40 |
+
lifespan=lifespan
|
| 41 |
+
)
|
| 42 |
+
app.include_router(router)
|
protobuf2openai/bridge.py
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from __future__ import annotations
|
| 2 |
+
|
| 3 |
+
import json
|
| 4 |
+
import time
|
| 5 |
+
import uuid
|
| 6 |
+
from typing import Any, Dict, Optional
|
| 7 |
+
|
| 8 |
+
from .logging import logger
|
| 9 |
+
|
| 10 |
+
from .config import (
|
| 11 |
+
WARMUP_INIT_RETRIES,
|
| 12 |
+
WARMUP_INIT_DELAY_S,
|
| 13 |
+
WARMUP_REQUEST_RETRIES,
|
| 14 |
+
WARMUP_REQUEST_DELAY_S,
|
| 15 |
+
)
|
| 16 |
+
from .packets import packet_template
|
| 17 |
+
from .state import STATE, ensure_tool_ids
|
| 18 |
+
|
| 19 |
+
# 导入warp2protobuf模块的函数,替代HTTP调用
|
| 20 |
+
from warp2protobuf.core.protobuf_utils import dict_to_protobuf_bytes
|
| 21 |
+
from warp2protobuf.warp.api_client import send_protobuf_to_warp_api_parsed
|
| 22 |
+
from warp2protobuf.core.schema_sanitizer import sanitize_mcp_input_schema_in_packet
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
async def bridge_send_stream(packet: Dict[str, Any]) -> Dict[str, Any]:
|
| 26 |
+
"""直接调用warp2protobuf模块,替代HTTP调用"""
|
| 27 |
+
try:
|
| 28 |
+
logger.info("[OpenAI Compat] Bridge request (direct call)")
|
| 29 |
+
logger.info("[OpenAI Compat] Bridge request payload: %s", json.dumps(packet, ensure_ascii=False))
|
| 30 |
+
|
| 31 |
+
# 应用schema清理
|
| 32 |
+
wrapped = {"json_data": packet}
|
| 33 |
+
wrapped = sanitize_mcp_input_schema_in_packet(wrapped)
|
| 34 |
+
actual_data = wrapped.get("json_data", packet)
|
| 35 |
+
|
| 36 |
+
# 转换为protobuf
|
| 37 |
+
protobuf_bytes = dict_to_protobuf_bytes(actual_data, "warp.multi_agent.v1.Request")
|
| 38 |
+
logger.info(f"[OpenAI Compat] JSON编码为protobuf成功: {len(protobuf_bytes)} 字节")
|
| 39 |
+
|
| 40 |
+
# 直接调用API客户端
|
| 41 |
+
response_text, conversation_id, task_id, parsed_events = await send_protobuf_to_warp_api_parsed(protobuf_bytes)
|
| 42 |
+
|
| 43 |
+
# 构造响应
|
| 44 |
+
result = {
|
| 45 |
+
"response": response_text,
|
| 46 |
+
"conversation_id": conversation_id,
|
| 47 |
+
"task_id": task_id,
|
| 48 |
+
"request_size": len(protobuf_bytes),
|
| 49 |
+
"response_size": len(response_text),
|
| 50 |
+
"message_type": "warp.multi_agent.v1.Request",
|
| 51 |
+
"parsed_events": parsed_events,
|
| 52 |
+
"events_count": len(parsed_events),
|
| 53 |
+
"events_summary": {}
|
| 54 |
+
}
|
| 55 |
+
|
| 56 |
+
if parsed_events:
|
| 57 |
+
event_type_counts = {}
|
| 58 |
+
for event in parsed_events:
|
| 59 |
+
event_data = event.get("parsed_data", {})
|
| 60 |
+
event_type = event.get("event_type", "UNKNOWN")
|
| 61 |
+
event_type_counts[event_type] = event_type_counts.get(event_type, 0) + 1
|
| 62 |
+
result["events_summary"] = event_type_counts
|
| 63 |
+
|
| 64 |
+
logger.info(f"[OpenAI Compat] Bridge调用成功,响应长度: {len(response_text)} 字符,事件数量: {len(parsed_events)}")
|
| 65 |
+
return result
|
| 66 |
+
|
| 67 |
+
except Exception as e:
|
| 68 |
+
import traceback
|
| 69 |
+
error_details = {
|
| 70 |
+
"error": str(e),
|
| 71 |
+
"error_type": type(e).__name__,
|
| 72 |
+
"traceback": traceback.format_exc(),
|
| 73 |
+
}
|
| 74 |
+
logger.error(f"[OpenAI Compat] Bridge调用失败: {e}")
|
| 75 |
+
raise Exception(f"bridge_error: {e}")
|
| 76 |
+
|
| 77 |
+
|
| 78 |
+
async def initialize_once() -> None:
|
| 79 |
+
"""初始化函数,现在使用直接调用,无需HTTP健康检查"""
|
| 80 |
+
if STATE.conversation_id:
|
| 81 |
+
return
|
| 82 |
+
|
| 83 |
+
ensure_tool_ids()
|
| 84 |
+
|
| 85 |
+
first_task_id = STATE.baseline_task_id or str(uuid.uuid4())
|
| 86 |
+
STATE.baseline_task_id = first_task_id
|
| 87 |
+
|
| 88 |
+
# 移除HTTP健康检查,因为现在是直接调用模块函数
|
| 89 |
+
logger.info("[OpenAI Compat] 使用直接模块调用,跳过HTTP健康检查")
|
| 90 |
+
|
| 91 |
+
pkt = packet_template()
|
| 92 |
+
pkt["task_context"]["active_task_id"] = first_task_id
|
| 93 |
+
pkt["input"]["user_inputs"]["inputs"].append({"user_query": {"query": "warmup"}})
|
| 94 |
+
|
| 95 |
+
last_exc: Optional[Exception] = None
|
| 96 |
+
for attempt in range(1, WARMUP_REQUEST_RETRIES + 1):
|
| 97 |
+
try:
|
| 98 |
+
resp = await bridge_send_stream(pkt)
|
| 99 |
+
break
|
| 100 |
+
except Exception as e:
|
| 101 |
+
last_exc = e
|
| 102 |
+
logger.warning(f"[OpenAI Compat] Warmup attempt {attempt}/{WARMUP_REQUEST_RETRIES} failed: {e}")
|
| 103 |
+
if attempt < WARMUP_REQUEST_RETRIES:
|
| 104 |
+
time.sleep(WARMUP_REQUEST_DELAY_S)
|
| 105 |
+
else:
|
| 106 |
+
raise
|
| 107 |
+
|
| 108 |
+
STATE.conversation_id = resp.get("conversation_id") or STATE.conversation_id
|
| 109 |
+
ret_task_id = resp.get("task_id")
|
| 110 |
+
if isinstance(ret_task_id, str) and ret_task_id:
|
| 111 |
+
STATE.baseline_task_id = ret_task_id
|
protobuf2openai/config.py
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from __future__ import annotations
|
| 2 |
+
|
| 3 |
+
import os
|
| 4 |
+
|
| 5 |
+
# 移除HTTP相关配置,现在使用直接模块调用
|
| 6 |
+
# BRIDGE_BASE_URL = os.getenv("WARP_BRIDGE_URL", "http://127.0.0.1:8000")
|
| 7 |
+
# FALLBACK_BRIDGE_URLS = [
|
| 8 |
+
# BRIDGE_BASE_URL,
|
| 9 |
+
# "http://127.0.0.1:8000",
|
| 10 |
+
# ]
|
| 11 |
+
|
| 12 |
+
# 保留重试配置,用于warmup
|
| 13 |
+
WARMUP_INIT_RETRIES = int(os.getenv("WARP_COMPAT_INIT_RETRIES", "10"))
|
| 14 |
+
WARMUP_INIT_DELAY_S = float(os.getenv("WARP_COMPAT_INIT_DELAY", "0.5"))
|
| 15 |
+
WARMUP_REQUEST_RETRIES = int(os.getenv("WARP_COMPAT_WARMUP_RETRIES", "3"))
|
| 16 |
+
WARMUP_REQUEST_DELAY_S = float(os.getenv("WARP_COMPAT_WARMUP_DELAY", "1.5"))
|
protobuf2openai/helpers.py
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from __future__ import annotations
|
| 2 |
+
|
| 3 |
+
from typing import Any, Dict, List
|
| 4 |
+
|
| 5 |
+
|
| 6 |
+
def _get(d: Dict[str, Any], *names: str) -> Any:
|
| 7 |
+
for n in names:
|
| 8 |
+
if isinstance(d, dict) and n in d:
|
| 9 |
+
return d[n]
|
| 10 |
+
return None
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
def normalize_content_to_list(content: Any) -> List[Dict[str, Any]]:
|
| 14 |
+
segments: List[Dict[str, Any]] = []
|
| 15 |
+
try:
|
| 16 |
+
if isinstance(content, str):
|
| 17 |
+
return [{"type": "text", "text": content}]
|
| 18 |
+
if isinstance(content, list):
|
| 19 |
+
for item in content:
|
| 20 |
+
if isinstance(item, dict):
|
| 21 |
+
t = item.get("type") or ("text" if isinstance(item.get("text"), str) else None)
|
| 22 |
+
if t == "text" and isinstance(item.get("text"), str):
|
| 23 |
+
segments.append({"type": "text", "text": item.get("text")})
|
| 24 |
+
else:
|
| 25 |
+
seg: Dict[str, Any] = {}
|
| 26 |
+
if t:
|
| 27 |
+
seg["type"] = t
|
| 28 |
+
if isinstance(item.get("text"), str):
|
| 29 |
+
seg["text"] = item.get("text")
|
| 30 |
+
if seg:
|
| 31 |
+
segments.append(seg)
|
| 32 |
+
return segments
|
| 33 |
+
if isinstance(content, dict):
|
| 34 |
+
if isinstance(content.get("text"), str):
|
| 35 |
+
return [{"type": "text", "text": content.get("text")}]
|
| 36 |
+
except Exception:
|
| 37 |
+
return []
|
| 38 |
+
return []
|
| 39 |
+
|
| 40 |
+
|
| 41 |
+
def segments_to_text(segments: List[Dict[str, Any]]) -> str:
|
| 42 |
+
parts: List[str] = []
|
| 43 |
+
for seg in segments:
|
| 44 |
+
if isinstance(seg, dict) and seg.get("type") == "text" and isinstance(seg.get("text"), str):
|
| 45 |
+
parts.append(seg.get("text") or "")
|
| 46 |
+
return "".join(parts)
|
| 47 |
+
|
| 48 |
+
|
| 49 |
+
def segments_to_warp_results(segments: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
|
| 50 |
+
results: List[Dict[str, Any]] = []
|
| 51 |
+
for seg in segments:
|
| 52 |
+
if isinstance(seg, dict) and seg.get("type") == "text" and isinstance(seg.get("text"), str):
|
| 53 |
+
results.append({"text": {"text": seg.get("text")}})
|
| 54 |
+
return results
|
protobuf2openai/logging.py
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
# -*- coding: utf-8 -*-
|
| 3 |
+
"""
|
| 4 |
+
Local logging for protobuf2openai package to avoid cross-package dependencies.
|
| 5 |
+
"""
|
| 6 |
+
import logging
|
| 7 |
+
|
| 8 |
+
_logger = logging.getLogger("protobuf2openai")
|
| 9 |
+
_logger.setLevel(logging.INFO)
|
| 10 |
+
|
| 11 |
+
# Remove existing handlers to prevent duplication
|
| 12 |
+
for h in _logger.handlers[:]:
|
| 13 |
+
_logger.removeHandler(h)
|
| 14 |
+
|
| 15 |
+
console_handler = logging.StreamHandler()
|
| 16 |
+
console_handler.setLevel(logging.INFO)
|
| 17 |
+
|
| 18 |
+
fmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s')
|
| 19 |
+
console_handler.setFormatter(fmt)
|
| 20 |
+
|
| 21 |
+
_logger.addHandler(console_handler)
|
| 22 |
+
|
| 23 |
+
logger = _logger
|
protobuf2openai/models.py
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from __future__ import annotations
|
| 2 |
+
|
| 3 |
+
from typing import Any, Dict, List, Optional, Union
|
| 4 |
+
from pydantic import BaseModel, Field
|
| 5 |
+
|
| 6 |
+
|
| 7 |
+
class ChatMessage(BaseModel):
|
| 8 |
+
role: str
|
| 9 |
+
content: Optional[Union[str, List[Dict[str, Any]]]] = ""
|
| 10 |
+
tool_call_id: Optional[str] = None
|
| 11 |
+
tool_calls: Optional[List[Dict[str, Any]]] = None
|
| 12 |
+
name: Optional[str] = None
|
| 13 |
+
|
| 14 |
+
|
| 15 |
+
class OpenAIFunctionDef(BaseModel):
|
| 16 |
+
name: str
|
| 17 |
+
description: Optional[str] = None
|
| 18 |
+
parameters: Optional[Dict[str, Any]] = None
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
class OpenAITool(BaseModel):
|
| 22 |
+
type: str = Field("function", description="Only 'function' is supported")
|
| 23 |
+
function: OpenAIFunctionDef
|
| 24 |
+
|
| 25 |
+
|
| 26 |
+
class ChatCompletionsRequest(BaseModel):
|
| 27 |
+
model: Optional[str] = None
|
| 28 |
+
messages: List[ChatMessage]
|
| 29 |
+
stream: Optional[bool] = False
|
| 30 |
+
tools: Optional[List[OpenAITool]] = None
|
| 31 |
+
tool_choice: Optional[Any] = None
|
protobuf2openai/packets.py
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from __future__ import annotations
|
| 2 |
+
|
| 3 |
+
import uuid
|
| 4 |
+
from typing import Any, Dict, List, Optional
|
| 5 |
+
import json
|
| 6 |
+
|
| 7 |
+
from .state import STATE, ensure_tool_ids
|
| 8 |
+
from .helpers import normalize_content_to_list, segments_to_text, segments_to_warp_results
|
| 9 |
+
from .models import ChatMessage
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
def packet_template() -> Dict[str, Any]:
|
| 13 |
+
return {
|
| 14 |
+
"task_context": {"active_task_id": ""},
|
| 15 |
+
"input": {"context": {}, "user_inputs": {"inputs": []}},
|
| 16 |
+
"settings": {
|
| 17 |
+
"model_config": {
|
| 18 |
+
"base": "claude-4.1-opus",
|
| 19 |
+
"planning": "gpt-5 (high reasoning)",
|
| 20 |
+
"coding": "auto",
|
| 21 |
+
},
|
| 22 |
+
"rules_enabled": False,
|
| 23 |
+
"web_context_retrieval_enabled": False,
|
| 24 |
+
"supports_parallel_tool_calls": False,
|
| 25 |
+
"planning_enabled": False,
|
| 26 |
+
"warp_drive_context_enabled": False,
|
| 27 |
+
"supports_create_files": False,
|
| 28 |
+
"use_anthropic_text_editor_tools": False,
|
| 29 |
+
"supports_long_running_commands": False,
|
| 30 |
+
"should_preserve_file_content_in_history": False,
|
| 31 |
+
"supports_todos_ui": False,
|
| 32 |
+
"supports_linked_code_blocks": False,
|
| 33 |
+
"supported_tools": [9],
|
| 34 |
+
},
|
| 35 |
+
"metadata": {"logging": {"is_autodetected_user_query": True, "entrypoint": "USER_INITIATED"}},
|
| 36 |
+
}
|
| 37 |
+
|
| 38 |
+
|
| 39 |
+
def map_history_to_warp_messages(history: List[ChatMessage], task_id: str, system_prompt_for_last_user: Optional[str] = None, attach_to_history_last_user: bool = False) -> List[Dict[str, Any]]:
|
| 40 |
+
ensure_tool_ids()
|
| 41 |
+
msgs: List[Dict[str, Any]] = []
|
| 42 |
+
# Insert server tool_call preamble as first message
|
| 43 |
+
msgs.append({
|
| 44 |
+
"id": (STATE.tool_message_id or str(uuid.uuid4())),
|
| 45 |
+
"task_id": task_id,
|
| 46 |
+
"tool_call": {
|
| 47 |
+
"tool_call_id": (STATE.tool_call_id or str(uuid.uuid4())),
|
| 48 |
+
"server": {"payload": "IgIQAQ=="},
|
| 49 |
+
},
|
| 50 |
+
})
|
| 51 |
+
|
| 52 |
+
# Determine the last input message index (either last 'user' or last 'tool' with tool_call_id)
|
| 53 |
+
last_input_index: Optional[int] = None
|
| 54 |
+
for idx in range(len(history) - 1, -1, -1):
|
| 55 |
+
_m = history[idx]
|
| 56 |
+
if _m.role == "user":
|
| 57 |
+
last_input_index = idx
|
| 58 |
+
break
|
| 59 |
+
if _m.role == "tool" and _m.tool_call_id:
|
| 60 |
+
last_input_index = idx
|
| 61 |
+
break
|
| 62 |
+
|
| 63 |
+
for i, m in enumerate(history):
|
| 64 |
+
mid = str(uuid.uuid4())
|
| 65 |
+
# Skip the final input message; it will be placed into input.user_inputs
|
| 66 |
+
if (last_input_index is not None) and (i == last_input_index):
|
| 67 |
+
continue
|
| 68 |
+
if m.role == "user":
|
| 69 |
+
user_query_obj: Dict[str, Any] = {"query": segments_to_text(normalize_content_to_list(m.content))}
|
| 70 |
+
msgs.append({"id": mid, "task_id": task_id, "user_query": user_query_obj})
|
| 71 |
+
elif m.role == "assistant":
|
| 72 |
+
_assistant_text = segments_to_text(normalize_content_to_list(m.content))
|
| 73 |
+
if _assistant_text:
|
| 74 |
+
msgs.append({"id": mid, "task_id": task_id, "agent_output": {"text": _assistant_text}})
|
| 75 |
+
for tc in (m.tool_calls or []):
|
| 76 |
+
msgs.append({
|
| 77 |
+
"id": str(uuid.uuid4()),
|
| 78 |
+
"task_id": task_id,
|
| 79 |
+
"tool_call": {
|
| 80 |
+
"tool_call_id": tc.get("id") or str(uuid.uuid4()),
|
| 81 |
+
"call_mcp_tool": {
|
| 82 |
+
"name": (tc.get("function", {}) or {}).get("name", ""),
|
| 83 |
+
"args": (json.loads((tc.get("function", {}) or {}).get("arguments", "{}")) if isinstance((tc.get("function", {}) or {}).get("arguments"), str) else (tc.get("function", {}) or {}).get("arguments", {})) or {},
|
| 84 |
+
},
|
| 85 |
+
},
|
| 86 |
+
})
|
| 87 |
+
elif m.role == "tool":
|
| 88 |
+
# Preserve tool_result adjacency by placing it directly in task_context
|
| 89 |
+
if m.tool_call_id:
|
| 90 |
+
msgs.append({
|
| 91 |
+
"id": str(uuid.uuid4()),
|
| 92 |
+
"task_id": task_id,
|
| 93 |
+
"tool_call_result": {
|
| 94 |
+
"tool_call_id": m.tool_call_id,
|
| 95 |
+
"call_mcp_tool": {
|
| 96 |
+
"success": {
|
| 97 |
+
"results": segments_to_warp_results(normalize_content_to_list(m.content))
|
| 98 |
+
}
|
| 99 |
+
},
|
| 100 |
+
},
|
| 101 |
+
})
|
| 102 |
+
return msgs
|
| 103 |
+
|
| 104 |
+
|
| 105 |
+
def attach_user_and_tools_to_inputs(packet: Dict[str, Any], history: List[ChatMessage], system_prompt_text: Optional[str]) -> None:
|
| 106 |
+
# Use the final post-reorder message as input (user or tool result)
|
| 107 |
+
if not history:
|
| 108 |
+
assert False, "post-reorder 必须至少包含一条消息"
|
| 109 |
+
last = history[-1]
|
| 110 |
+
if last.role == "user":
|
| 111 |
+
user_query_payload: Dict[str, Any] = {"query": segments_to_text(normalize_content_to_list(last.content))}
|
| 112 |
+
if system_prompt_text:
|
| 113 |
+
user_query_payload["referenced_attachments"] = {
|
| 114 |
+
"SYSTEM_PROMPT": {
|
| 115 |
+
"plain_text": f"""<ALERT>you are not allowed to call following tools: - `read_files`
|
| 116 |
+
- `write_files`
|
| 117 |
+
- `run_commands`
|
| 118 |
+
- `list_files`
|
| 119 |
+
- `str_replace_editor`
|
| 120 |
+
- `ask_followup_question`
|
| 121 |
+
- `attempt_completion`</ALERT>{system_prompt_text}"""
|
| 122 |
+
}
|
| 123 |
+
}
|
| 124 |
+
packet["input"]["user_inputs"]["inputs"].append({"user_query": user_query_payload})
|
| 125 |
+
return
|
| 126 |
+
if last.role == "tool" and last.tool_call_id:
|
| 127 |
+
packet["input"]["user_inputs"]["inputs"].append({
|
| 128 |
+
"tool_call_result": {
|
| 129 |
+
"tool_call_id": last.tool_call_id,
|
| 130 |
+
"call_mcp_tool": {
|
| 131 |
+
"success": {"results": segments_to_warp_results(normalize_content_to_list(last.content))}
|
| 132 |
+
},
|
| 133 |
+
}
|
| 134 |
+
})
|
| 135 |
+
return
|
| 136 |
+
# If neither, assert to catch protocol violations
|
| 137 |
+
assert False, "post-reorder 最后一条必须是 user 或 tool 结果"
|
protobuf2openai/reorder.py
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from __future__ import annotations
|
| 2 |
+
|
| 3 |
+
from typing import Dict, List, Optional
|
| 4 |
+
from .models import ChatMessage
|
| 5 |
+
from .helpers import normalize_content_to_list, segments_to_text
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
def reorder_messages_for_anthropic(history: List[ChatMessage]) -> List[ChatMessage]:
|
| 9 |
+
if not history:
|
| 10 |
+
return []
|
| 11 |
+
|
| 12 |
+
expanded: List[ChatMessage] = []
|
| 13 |
+
for m in history:
|
| 14 |
+
if m.role == "user":
|
| 15 |
+
items = normalize_content_to_list(m.content)
|
| 16 |
+
if isinstance(m.content, list) and len(items) > 1:
|
| 17 |
+
for seg in items:
|
| 18 |
+
if isinstance(seg, dict) and seg.get("type") == "text" and isinstance(seg.get("text"), str):
|
| 19 |
+
expanded.append(ChatMessage(role="user", content=seg.get("text")))
|
| 20 |
+
else:
|
| 21 |
+
expanded.append(ChatMessage(role="user", content=[seg] if isinstance(seg, dict) else seg))
|
| 22 |
+
else:
|
| 23 |
+
expanded.append(m)
|
| 24 |
+
elif m.role == "assistant" and m.tool_calls and len(m.tool_calls) > 1:
|
| 25 |
+
_assistant_text = segments_to_text(normalize_content_to_list(m.content))
|
| 26 |
+
if _assistant_text:
|
| 27 |
+
expanded.append(ChatMessage(role="assistant", content=_assistant_text))
|
| 28 |
+
for tc in (m.tool_calls or []):
|
| 29 |
+
expanded.append(ChatMessage(role="assistant", content=None, tool_calls=[tc]))
|
| 30 |
+
else:
|
| 31 |
+
expanded.append(m)
|
| 32 |
+
|
| 33 |
+
last_input_tool_id: Optional[str] = None
|
| 34 |
+
last_input_is_tool = False
|
| 35 |
+
for m in reversed(expanded):
|
| 36 |
+
if m.role == "tool" and m.tool_call_id:
|
| 37 |
+
last_input_tool_id = m.tool_call_id
|
| 38 |
+
last_input_is_tool = True
|
| 39 |
+
break
|
| 40 |
+
if m.role == "user":
|
| 41 |
+
break
|
| 42 |
+
|
| 43 |
+
tool_results_by_id: Dict[str, ChatMessage] = {}
|
| 44 |
+
assistant_tc_ids: set[str] = set()
|
| 45 |
+
for m in expanded:
|
| 46 |
+
if m.role == "tool" and m.tool_call_id and m.tool_call_id not in tool_results_by_id:
|
| 47 |
+
tool_results_by_id[m.tool_call_id] = m
|
| 48 |
+
if m.role == "assistant" and m.tool_calls:
|
| 49 |
+
try:
|
| 50 |
+
for tc in (m.tool_calls or []):
|
| 51 |
+
_id = (tc or {}).get("id")
|
| 52 |
+
if isinstance(_id, str) and _id:
|
| 53 |
+
assistant_tc_ids.add(_id)
|
| 54 |
+
except Exception:
|
| 55 |
+
pass
|
| 56 |
+
|
| 57 |
+
result: List[ChatMessage] = []
|
| 58 |
+
trailing_assistant_msg: Optional[ChatMessage] = None
|
| 59 |
+
for m in expanded:
|
| 60 |
+
if m.role == "tool":
|
| 61 |
+
# Preserve unmatched tool results inline
|
| 62 |
+
if not m.tool_call_id or m.tool_call_id not in assistant_tc_ids:
|
| 63 |
+
result.append(m)
|
| 64 |
+
if m.tool_call_id:
|
| 65 |
+
tool_results_by_id.pop(m.tool_call_id, None)
|
| 66 |
+
continue
|
| 67 |
+
if m.role == "assistant" and m.tool_calls:
|
| 68 |
+
ids: List[str] = []
|
| 69 |
+
try:
|
| 70 |
+
for tc in (m.tool_calls or []):
|
| 71 |
+
_id = (tc or {}).get("id")
|
| 72 |
+
if isinstance(_id, str) and _id:
|
| 73 |
+
ids.append(_id)
|
| 74 |
+
except Exception:
|
| 75 |
+
pass
|
| 76 |
+
|
| 77 |
+
if last_input_is_tool and last_input_tool_id and (last_input_tool_id in ids):
|
| 78 |
+
if trailing_assistant_msg is None:
|
| 79 |
+
trailing_assistant_msg = m
|
| 80 |
+
continue
|
| 81 |
+
|
| 82 |
+
result.append(m)
|
| 83 |
+
for _id in ids:
|
| 84 |
+
tr = tool_results_by_id.pop(_id, None)
|
| 85 |
+
if tr is not None:
|
| 86 |
+
result.append(tr)
|
| 87 |
+
continue
|
| 88 |
+
result.append(m)
|
| 89 |
+
|
| 90 |
+
if last_input_is_tool and last_input_tool_id and trailing_assistant_msg is not None:
|
| 91 |
+
result.append(trailing_assistant_msg)
|
| 92 |
+
tr = tool_results_by_id.pop(last_input_tool_id, None)
|
| 93 |
+
if tr is not None:
|
| 94 |
+
result.append(tr)
|
| 95 |
+
|
| 96 |
+
return result
|
protobuf2openai/router.py
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from __future__ import annotations
|
| 2 |
+
|
| 3 |
+
import asyncio
|
| 4 |
+
import json
|
| 5 |
+
import time
|
| 6 |
+
import uuid
|
| 7 |
+
from typing import Any, Dict, List, Optional
|
| 8 |
+
|
| 9 |
+
from fastapi import APIRouter, HTTPException
|
| 10 |
+
from fastapi.responses import StreamingResponse
|
| 11 |
+
|
| 12 |
+
from .logging import logger
|
| 13 |
+
|
| 14 |
+
from .models import ChatCompletionsRequest, ChatMessage
|
| 15 |
+
from .reorder import reorder_messages_for_anthropic
|
| 16 |
+
from .helpers import normalize_content_to_list, segments_to_text
|
| 17 |
+
from .packets import packet_template, map_history_to_warp_messages, attach_user_and_tools_to_inputs
|
| 18 |
+
from .state import STATE
|
| 19 |
+
from .bridge import initialize_once, bridge_send_stream
|
| 20 |
+
from .sse_transform import stream_openai_sse
|
| 21 |
+
|
| 22 |
+
# 导入warp2protobuf模块,替代HTTP调用
|
| 23 |
+
from warp2protobuf.config.models import get_all_unique_models
|
| 24 |
+
from warp2protobuf.core.auth import refresh_jwt_if_needed
|
| 25 |
+
|
| 26 |
+
|
| 27 |
+
router = APIRouter()
|
| 28 |
+
|
| 29 |
+
|
| 30 |
+
@router.get("/")
|
| 31 |
+
def root():
|
| 32 |
+
return {"service": "OpenAI Chat Completions (Warp bridge) - Streaming", "status": "ok"}
|
| 33 |
+
|
| 34 |
+
|
| 35 |
+
@router.get("/healthz")
|
| 36 |
+
def health_check():
|
| 37 |
+
return {"status": "ok", "service": "OpenAI Chat Completions (Warp bridge) - Streaming"}
|
| 38 |
+
|
| 39 |
+
|
| 40 |
+
@router.get("/v1/models")
|
| 41 |
+
def list_models():
|
| 42 |
+
"""OpenAI-compatible model listing. Direct call to get_all_unique_models."""
|
| 43 |
+
try:
|
| 44 |
+
models = get_all_unique_models()
|
| 45 |
+
return {"object": "list", "data": models}
|
| 46 |
+
except Exception as e:
|
| 47 |
+
logger.error(f"❌ 获取模型列表失败: {e}")
|
| 48 |
+
raise HTTPException(500, f"获取模型列表失败: {str(e)}")
|
| 49 |
+
|
| 50 |
+
|
| 51 |
+
@router.post("/v1/chat/completions")
|
| 52 |
+
async def chat_completions(req: ChatCompletionsRequest):
|
| 53 |
+
try:
|
| 54 |
+
await initialize_once()
|
| 55 |
+
except Exception as e:
|
| 56 |
+
logger.warning(f"[OpenAI Compat] initialize_once failed or skipped: {e}")
|
| 57 |
+
|
| 58 |
+
if not req.messages:
|
| 59 |
+
raise HTTPException(400, "messages 不能为空")
|
| 60 |
+
|
| 61 |
+
# 1) 打印接收到的 Chat Completions 原始请求体
|
| 62 |
+
try:
|
| 63 |
+
logger.info("[OpenAI Compat] 接收到的 Chat Completions 请求体(原始): %s", json.dumps(req.dict(), ensure_ascii=False))
|
| 64 |
+
except Exception:
|
| 65 |
+
logger.info("[OpenAI Compat] 接收到的 Chat Completions 请求体(原始) 序列化失败")
|
| 66 |
+
|
| 67 |
+
# 整理消息
|
| 68 |
+
history: List[ChatMessage] = reorder_messages_for_anthropic(list(req.messages))
|
| 69 |
+
|
| 70 |
+
# 2) 打印整理后的请求体(post-reorder)
|
| 71 |
+
try:
|
| 72 |
+
logger.info("[OpenAI Compat] 整理后的请求体(post-reorder): %s", json.dumps({
|
| 73 |
+
**req.dict(),
|
| 74 |
+
"messages": [m.dict() for m in history]
|
| 75 |
+
}, ensure_ascii=False))
|
| 76 |
+
except Exception:
|
| 77 |
+
logger.info("[OpenAI Compat] 整理后的请求体(post-reorder) 序列化失败")
|
| 78 |
+
|
| 79 |
+
system_prompt_text: Optional[str] = None
|
| 80 |
+
try:
|
| 81 |
+
chunks: List[str] = []
|
| 82 |
+
for _m in history:
|
| 83 |
+
if _m.role == "system":
|
| 84 |
+
_txt = segments_to_text(normalize_content_to_list(_m.content))
|
| 85 |
+
if _txt.strip():
|
| 86 |
+
chunks.append(_txt)
|
| 87 |
+
if chunks:
|
| 88 |
+
system_prompt_text = "\n\n".join(chunks)
|
| 89 |
+
except Exception:
|
| 90 |
+
system_prompt_text = None
|
| 91 |
+
|
| 92 |
+
task_id = STATE.baseline_task_id or str(uuid.uuid4())
|
| 93 |
+
packet = packet_template()
|
| 94 |
+
packet["task_context"] = {
|
| 95 |
+
"tasks": [{
|
| 96 |
+
"id": task_id,
|
| 97 |
+
"description": "",
|
| 98 |
+
"status": {"in_progress": {}},
|
| 99 |
+
"messages": map_history_to_warp_messages(history, task_id, None, False),
|
| 100 |
+
}],
|
| 101 |
+
"active_task_id": task_id,
|
| 102 |
+
}
|
| 103 |
+
|
| 104 |
+
packet.setdefault("settings", {}).setdefault("model_config", {})
|
| 105 |
+
packet["settings"]["model_config"]["base"] = req.model or packet["settings"]["model_config"].get("base") or "claude-4.1-opus"
|
| 106 |
+
|
| 107 |
+
if STATE.conversation_id:
|
| 108 |
+
packet.setdefault("metadata", {})["conversation_id"] = STATE.conversation_id
|
| 109 |
+
|
| 110 |
+
attach_user_and_tools_to_inputs(packet, history, system_prompt_text)
|
| 111 |
+
|
| 112 |
+
if req.tools:
|
| 113 |
+
mcp_tools: List[Dict[str, Any]] = []
|
| 114 |
+
for t in req.tools:
|
| 115 |
+
if t.type != "function" or not t.function:
|
| 116 |
+
continue
|
| 117 |
+
mcp_tools.append({
|
| 118 |
+
"name": t.function.name,
|
| 119 |
+
"description": t.function.description or "",
|
| 120 |
+
"input_schema": t.function.parameters or {},
|
| 121 |
+
})
|
| 122 |
+
if mcp_tools:
|
| 123 |
+
packet.setdefault("mcp_context", {}).setdefault("tools", []).extend(mcp_tools)
|
| 124 |
+
|
| 125 |
+
# 3) 打印转换成 protobuf JSON 的请求体(发送到 bridge 的数据包)
|
| 126 |
+
try:
|
| 127 |
+
logger.info("[OpenAI Compat] 转换成 Protobuf JSON 的请求体: %s", json.dumps(packet, ensure_ascii=False))
|
| 128 |
+
except Exception:
|
| 129 |
+
logger.info("[OpenAI Compat] 转换成 Protobuf JSON 的请求体 序列化失败")
|
| 130 |
+
|
| 131 |
+
created_ts = int(time.time())
|
| 132 |
+
completion_id = str(uuid.uuid4())
|
| 133 |
+
model_id = req.model or "warp-default"
|
| 134 |
+
|
| 135 |
+
if req.stream:
|
| 136 |
+
async def _agen():
|
| 137 |
+
async for chunk in stream_openai_sse(packet, completion_id, created_ts, model_id):
|
| 138 |
+
yield chunk
|
| 139 |
+
return StreamingResponse(_agen(), media_type="text/event-stream", headers={"Cache-Control": "no-cache", "Connection": "keep-alive"})
|
| 140 |
+
|
| 141 |
+
try:
|
| 142 |
+
bridge_resp = await bridge_send_stream(packet)
|
| 143 |
+
except Exception as e:
|
| 144 |
+
# 如果是429错误(配额用尽),尝试刷新JWT
|
| 145 |
+
if "429" in str(e):
|
| 146 |
+
try:
|
| 147 |
+
await refresh_jwt_if_needed()
|
| 148 |
+
logger.warning("[OpenAI Compat] Tried JWT refresh after 429 error")
|
| 149 |
+
bridge_resp = await bridge_send_stream(packet)
|
| 150 |
+
except Exception as _e:
|
| 151 |
+
logger.warning("[OpenAI Compat] JWT refresh attempt failed after 429: %s", _e)
|
| 152 |
+
raise HTTPException(429, f"bridge_error: {e}")
|
| 153 |
+
else:
|
| 154 |
+
raise HTTPException(502, f"bridge_error: {e}")
|
| 155 |
+
|
| 156 |
+
try:
|
| 157 |
+
STATE.conversation_id = bridge_resp.get("conversation_id") or STATE.conversation_id
|
| 158 |
+
ret_task_id = bridge_resp.get("task_id")
|
| 159 |
+
if isinstance(ret_task_id, str) and ret_task_id:
|
| 160 |
+
STATE.baseline_task_id = ret_task_id
|
| 161 |
+
except Exception:
|
| 162 |
+
pass
|
| 163 |
+
|
| 164 |
+
tool_calls: List[Dict[str, Any]] = []
|
| 165 |
+
try:
|
| 166 |
+
parsed_events = bridge_resp.get("parsed_events", []) or []
|
| 167 |
+
for ev in parsed_events:
|
| 168 |
+
evd = ev.get("parsed_data") or ev.get("raw_data") or {}
|
| 169 |
+
client_actions = evd.get("client_actions") or evd.get("clientActions") or {}
|
| 170 |
+
actions = client_actions.get("actions") or client_actions.get("Actions") or []
|
| 171 |
+
for action in actions:
|
| 172 |
+
add_msgs = action.get("add_messages_to_task") or action.get("addMessagesToTask") or {}
|
| 173 |
+
if not isinstance(add_msgs, dict):
|
| 174 |
+
continue
|
| 175 |
+
for message in add_msgs.get("messages", []) or []:
|
| 176 |
+
tc = message.get("tool_call") or message.get("toolCall") or {}
|
| 177 |
+
call_mcp = tc.get("call_mcp_tool") or tc.get("callMcpTool") or {}
|
| 178 |
+
if isinstance(call_mcp, dict) and call_mcp.get("name"):
|
| 179 |
+
try:
|
| 180 |
+
args_obj = call_mcp.get("args", {}) or {}
|
| 181 |
+
args_str = json.dumps(args_obj, ensure_ascii=False)
|
| 182 |
+
except Exception:
|
| 183 |
+
args_str = "{}"
|
| 184 |
+
tool_calls.append({
|
| 185 |
+
"id": tc.get("tool_call_id") or str(uuid.uuid4()),
|
| 186 |
+
"type": "function",
|
| 187 |
+
"function": {"name": call_mcp.get("name"), "arguments": args_str},
|
| 188 |
+
})
|
| 189 |
+
except Exception:
|
| 190 |
+
pass
|
| 191 |
+
|
| 192 |
+
if tool_calls:
|
| 193 |
+
msg_payload = {"role": "assistant", "content": "", "tool_calls": tool_calls}
|
| 194 |
+
finish_reason = "tool_calls"
|
| 195 |
+
else:
|
| 196 |
+
response_text = bridge_resp.get("response", "")
|
| 197 |
+
msg_payload = {"role": "assistant", "content": response_text}
|
| 198 |
+
finish_reason = "stop"
|
| 199 |
+
|
| 200 |
+
final = {
|
| 201 |
+
"id": completion_id,
|
| 202 |
+
"object": "chat.completion",
|
| 203 |
+
"created": created_ts,
|
| 204 |
+
"model": model_id,
|
| 205 |
+
"choices": [{"index": 0, "message": msg_payload, "finish_reason": finish_reason}],
|
| 206 |
+
}
|
| 207 |
+
return final
|
protobuf2openai/sse_transform.py
ADDED
|
@@ -0,0 +1,297 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from __future__ import annotations
|
| 2 |
+
|
| 3 |
+
import json
|
| 4 |
+
import uuid
|
| 5 |
+
from typing import Any, AsyncGenerator, Dict
|
| 6 |
+
|
| 7 |
+
from .logging import logger
|
| 8 |
+
from .helpers import _get
|
| 9 |
+
|
| 10 |
+
# 导入内部模块,替代HTTP调用
|
| 11 |
+
from warp2protobuf.core.protobuf_utils import dict_to_protobuf_bytes
|
| 12 |
+
from warp2protobuf.warp.api_client import send_protobuf_to_warp_api_parsed
|
| 13 |
+
import httpx
|
| 14 |
+
import os
|
| 15 |
+
from warp2protobuf.core.protobuf_utils import protobuf_to_dict
|
| 16 |
+
from warp2protobuf.core.auth import get_valid_jwt, acquire_anonymous_access_token, refresh_jwt_if_needed
|
| 17 |
+
from warp2protobuf.config.settings import WARP_URL as CONFIG_WARP_URL
|
| 18 |
+
from warp2protobuf.core.schema_sanitizer import sanitize_mcp_input_schema_in_packet
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def _get_event_type(event_data: dict) -> str:
|
| 22 |
+
"""获取事件类型"""
|
| 23 |
+
if "init" in event_data:
|
| 24 |
+
return "INIT"
|
| 25 |
+
elif "client_actions" in event_data or "clientActions" in event_data:
|
| 26 |
+
return "CLIENT_ACTIONS"
|
| 27 |
+
elif "finished" in event_data:
|
| 28 |
+
return "FINISHED"
|
| 29 |
+
else:
|
| 30 |
+
return "UNKNOWN_EVENT"
|
| 31 |
+
|
| 32 |
+
|
| 33 |
+
async def stream_openai_sse(packet: Dict[str, Any], completion_id: str, created_ts: int, model_id: str) -> AsyncGenerator[str, None]:
|
| 34 |
+
"""使用直接模块调用实现的SSE流处理,替代HTTP调用"""
|
| 35 |
+
try:
|
| 36 |
+
# 发出首个OpenAI格式的SSE事件
|
| 37 |
+
first = {
|
| 38 |
+
"id": completion_id,
|
| 39 |
+
"object": "chat.completion.chunk",
|
| 40 |
+
"created": created_ts,
|
| 41 |
+
"model": model_id,
|
| 42 |
+
"choices": [{"index": 0, "delta": {"role": "assistant"}}],
|
| 43 |
+
}
|
| 44 |
+
logger.info("[OpenAI Compat] 转换后的 SSE(emit): %s", json.dumps(first, ensure_ascii=False))
|
| 45 |
+
yield f"data: {json.dumps(first, ensure_ascii=False)}\n\n"
|
| 46 |
+
|
| 47 |
+
# 应用schema清理
|
| 48 |
+
wrapped = {"json_data": packet}
|
| 49 |
+
wrapped = sanitize_mcp_input_schema_in_packet(wrapped)
|
| 50 |
+
actual_data = wrapped.get("json_data", packet)
|
| 51 |
+
|
| 52 |
+
# 转换为protobuf
|
| 53 |
+
protobuf_bytes = dict_to_protobuf_bytes(actual_data, "warp.multi_agent.v1.Request")
|
| 54 |
+
logger.info(f"[OpenAI Compat] JSON编码为protobuf成功: {len(protobuf_bytes)} 字节")
|
| 55 |
+
|
| 56 |
+
tool_calls_emitted = False
|
| 57 |
+
|
| 58 |
+
try:
|
| 59 |
+
# 直接处理SSE流,实时返回事件
|
| 60 |
+
warp_url = CONFIG_WARP_URL
|
| 61 |
+
|
| 62 |
+
verify_opt = True
|
| 63 |
+
insecure_env = os.getenv("WARP_INSECURE_TLS", "").lower()
|
| 64 |
+
if insecure_env in ("1", "true", "yes"):
|
| 65 |
+
verify_opt = False
|
| 66 |
+
logger.warning("TLS verification disabled via WARP_INSECURE_TLS for OpenAI SSE streaming")
|
| 67 |
+
|
| 68 |
+
async with httpx.AsyncClient(http2=True, timeout=httpx.Timeout(60.0), verify=verify_opt, trust_env=True) as client:
|
| 69 |
+
# 最多尝试两次:第一次失败且为401/429时尝试刷新token并重试一次
|
| 70 |
+
for attempt in range(2):
|
| 71 |
+
jwt = await get_valid_jwt() if attempt == 0 else jwt
|
| 72 |
+
headers = {
|
| 73 |
+
"accept": "text/event-stream",
|
| 74 |
+
"content-type": "application/x-protobuf",
|
| 75 |
+
"x-warp-client-version": "v0.2025.08.06.08.12.stable_02",
|
| 76 |
+
"x-warp-os-category": "Windows",
|
| 77 |
+
"x-warp-os-name": "Windows",
|
| 78 |
+
"x-warp-os-version": "11 (26100)",
|
| 79 |
+
"authorization": f"Bearer {jwt}",
|
| 80 |
+
"content-length": str(len(protobuf_bytes)),
|
| 81 |
+
}
|
| 82 |
+
|
| 83 |
+
async with client.stream("POST", warp_url, headers=headers, content=protobuf_bytes) as response:
|
| 84 |
+
if response.status_code != 200:
|
| 85 |
+
error_text = await response.aread()
|
| 86 |
+
error_content = error_text.decode('utf-8') if error_text else "No error content"
|
| 87 |
+
|
| 88 |
+
# 检测JWT token无效错误并在第一次失败时尝试刷新token
|
| 89 |
+
if response.status_code == 401 and attempt == 0:
|
| 90 |
+
logger.warning("WARP API 返回 401 (token无效, OpenAI SSE)。尝试刷新JWT token并重试一次…")
|
| 91 |
+
try:
|
| 92 |
+
refresh_success = await refresh_jwt_if_needed()
|
| 93 |
+
if refresh_success:
|
| 94 |
+
jwt = await get_valid_jwt()
|
| 95 |
+
logger.info("JWT token刷新成功,重试API调用 (OpenAI SSE)")
|
| 96 |
+
continue
|
| 97 |
+
else:
|
| 98 |
+
logger.warning("JWT token刷新失败,尝试申请匿名token (OpenAI SSE)")
|
| 99 |
+
new_jwt = await acquire_anonymous_access_token()
|
| 100 |
+
if new_jwt:
|
| 101 |
+
jwt = new_jwt
|
| 102 |
+
continue
|
| 103 |
+
except Exception as e:
|
| 104 |
+
logger.warning(f"JWT token刷新异常 (OpenAI SSE): {e}")
|
| 105 |
+
|
| 106 |
+
# 检测配额耗尽错误并在第一次失败时尝试获取新token
|
| 107 |
+
elif response.status_code == 429 and attempt == 0 and (
|
| 108 |
+
("No remaining quota" in error_content) or ("No AI requests remaining" in error_content)
|
| 109 |
+
):
|
| 110 |
+
logger.warning("WARP API 返回 429 (配额用尽, OpenAI SSE)。删除当前token并重新获取…")
|
| 111 |
+
try:
|
| 112 |
+
from warp2protobuf.core.auth import remove_token_from_pool
|
| 113 |
+
remove_token_from_pool(jwt)
|
| 114 |
+
new_jwt = await get_valid_jwt()
|
| 115 |
+
if new_jwt and new_jwt != jwt:
|
| 116 |
+
jwt = new_jwt
|
| 117 |
+
continue
|
| 118 |
+
except Exception as e:
|
| 119 |
+
logger.warning(f"获取新token失败 (OpenAI SSE): {e}")
|
| 120 |
+
|
| 121 |
+
# 其他错误或第二次失败
|
| 122 |
+
logger.error(f"WARP API HTTP ERROR (OpenAI SSE) {response.status_code}: {error_content}")
|
| 123 |
+
raise Exception(f"Warp API Error (HTTP {response.status_code}): {error_content}")
|
| 124 |
+
|
| 125 |
+
logger.info(f"✅ 收到HTTP {response.status_code}响应 (OpenAI SSE)")
|
| 126 |
+
logger.info("开始实时处理SSE事件流...")
|
| 127 |
+
|
| 128 |
+
import re as _re
|
| 129 |
+
def _parse_payload_bytes(data_str: str):
|
| 130 |
+
s = _re.sub(r"\s+", "", data_str or "")
|
| 131 |
+
if not s:
|
| 132 |
+
return None
|
| 133 |
+
if _re.fullmatch(r"[0-9a-fA-F]+", s or ""):
|
| 134 |
+
try:
|
| 135 |
+
return bytes.fromhex(s)
|
| 136 |
+
except Exception:
|
| 137 |
+
pass
|
| 138 |
+
pad = "=" * ((4 - (len(s) % 4)) % 4)
|
| 139 |
+
try:
|
| 140 |
+
import base64 as _b64
|
| 141 |
+
return _b64.urlsafe_b64decode(s + pad)
|
| 142 |
+
except Exception:
|
| 143 |
+
try:
|
| 144 |
+
return _b64.b64decode(s + pad)
|
| 145 |
+
except Exception:
|
| 146 |
+
return None
|
| 147 |
+
|
| 148 |
+
current_data = ""
|
| 149 |
+
event_count = 0
|
| 150 |
+
|
| 151 |
+
async for line in response.aiter_lines():
|
| 152 |
+
if line.startswith("data:"):
|
| 153 |
+
payload = line[5:].strip()
|
| 154 |
+
if not payload:
|
| 155 |
+
continue
|
| 156 |
+
if payload == "[DONE]":
|
| 157 |
+
logger.info("收到[DONE]标记,结束处理")
|
| 158 |
+
break
|
| 159 |
+
current_data += payload
|
| 160 |
+
continue
|
| 161 |
+
|
| 162 |
+
if (line.strip() == "") and current_data:
|
| 163 |
+
raw_bytes = _parse_payload_bytes(current_data)
|
| 164 |
+
current_data = ""
|
| 165 |
+
if raw_bytes is None:
|
| 166 |
+
continue
|
| 167 |
+
|
| 168 |
+
try:
|
| 169 |
+
event_data = protobuf_to_dict(raw_bytes, "warp.multi_agent.v1.ResponseEvent")
|
| 170 |
+
event_count += 1
|
| 171 |
+
event_type = _get_event_type(event_data)
|
| 172 |
+
logger.info(f"🔄 实时处理 Event #{event_count}: {event_type}")
|
| 173 |
+
|
| 174 |
+
# 实时处理每个事件
|
| 175 |
+
async for chunk in _process_single_event(event_data, completion_id, created_ts, model_id, tool_calls_emitted):
|
| 176 |
+
if chunk.get("tool_calls_emitted"):
|
| 177 |
+
tool_calls_emitted = True
|
| 178 |
+
if chunk.get("sse_data"):
|
| 179 |
+
yield chunk["sse_data"]
|
| 180 |
+
|
| 181 |
+
except Exception as parse_err:
|
| 182 |
+
logger.debug(f"解析事件失败,跳过: {str(parse_err)[:100]}")
|
| 183 |
+
continue
|
| 184 |
+
|
| 185 |
+
logger.info(f"✅ 实时流处理完成,共处理 {event_count} 个事件")
|
| 186 |
+
break # 成功处理,跳出重试循环
|
| 187 |
+
|
| 188 |
+
except Exception as e:
|
| 189 |
+
logger.error(f"[OpenAI Compat] Stream processing failed: {e}")
|
| 190 |
+
raise e
|
| 191 |
+
|
| 192 |
+
# 发出完成标记
|
| 193 |
+
logger.info("[OpenAI Compat] 转换后的 SSE(emit): [DONE]")
|
| 194 |
+
yield "data: [DONE]\n\n"
|
| 195 |
+
|
| 196 |
+
except Exception as e:
|
| 197 |
+
logger.error(f"[OpenAI Compat] Stream processing failed: {e}")
|
| 198 |
+
error_chunk = {
|
| 199 |
+
"id": completion_id,
|
| 200 |
+
"object": "chat.completion.chunk",
|
| 201 |
+
"created": created_ts,
|
| 202 |
+
"model": model_id,
|
| 203 |
+
"choices": [{"index": 0, "delta": {}, "finish_reason": "error"}],
|
| 204 |
+
"error": {"message": str(e)},
|
| 205 |
+
}
|
| 206 |
+
logger.info("[OpenAI Compat] 转换后的 SSE(emit error): %s", json.dumps(error_chunk, ensure_ascii=False))
|
| 207 |
+
yield f"data: {json.dumps(error_chunk, ensure_ascii=False)}\n\n"
|
| 208 |
+
yield "data: [DONE]\n\n"
|
| 209 |
+
|
| 210 |
+
|
| 211 |
+
async def _process_single_event(event_data: dict, completion_id: str, created_ts: int, model_id: str, tool_calls_emitted: bool) -> AsyncGenerator[dict, None]:
|
| 212 |
+
"""处理单个事件并生成SSE数据"""
|
| 213 |
+
if "init" in event_data:
|
| 214 |
+
return
|
| 215 |
+
|
| 216 |
+
# 处理完成事件
|
| 217 |
+
if "finished" in event_data:
|
| 218 |
+
done_chunk = {
|
| 219 |
+
"id": completion_id,
|
| 220 |
+
"object": "chat.completion.chunk",
|
| 221 |
+
"created": created_ts,
|
| 222 |
+
"model": model_id,
|
| 223 |
+
"choices": [{"index": 0, "delta": {}, "finish_reason": ("tool_calls" if tool_calls_emitted else "stop")}],
|
| 224 |
+
}
|
| 225 |
+
logger.info("[OpenAI Compat] 转换后的 SSE(emit done): %s", json.dumps(done_chunk, ensure_ascii=False))
|
| 226 |
+
yield {"sse_data": f"data: {json.dumps(done_chunk, ensure_ascii=False)}\n\n"}
|
| 227 |
+
return
|
| 228 |
+
|
| 229 |
+
client_actions = _get(event_data, "client_actions", "clientActions")
|
| 230 |
+
if isinstance(client_actions, dict):
|
| 231 |
+
actions = _get(client_actions, "actions", "Actions") or []
|
| 232 |
+
for action in actions:
|
| 233 |
+
# 处理文本追加
|
| 234 |
+
append_data = _get(action, "append_to_message_content", "appendToMessageContent")
|
| 235 |
+
if isinstance(append_data, dict):
|
| 236 |
+
message = append_data.get("message", {})
|
| 237 |
+
agent_output = _get(message, "agent_output", "agentOutput") or {}
|
| 238 |
+
text_content = agent_output.get("text", "")
|
| 239 |
+
if text_content:
|
| 240 |
+
delta = {
|
| 241 |
+
"id": completion_id,
|
| 242 |
+
"object": "chat.completion.chunk",
|
| 243 |
+
"created": created_ts,
|
| 244 |
+
"model": model_id,
|
| 245 |
+
"choices": [{"index": 0, "delta": {"content": text_content}}],
|
| 246 |
+
}
|
| 247 |
+
logger.info("[OpenAI Compat] 转换后的 SSE(emit): %s", json.dumps(delta, ensure_ascii=False))
|
| 248 |
+
yield {"sse_data": f"data: {json.dumps(delta, ensure_ascii=False)}\n\n"}
|
| 249 |
+
|
| 250 |
+
# 处理消息添加
|
| 251 |
+
messages_data = _get(action, "add_messages_to_task", "addMessagesToTask")
|
| 252 |
+
if isinstance(messages_data, dict):
|
| 253 |
+
messages = messages_data.get("messages", [])
|
| 254 |
+
for message in messages:
|
| 255 |
+
# 处理工具调用
|
| 256 |
+
tool_call = _get(message, "tool_call", "toolCall") or {}
|
| 257 |
+
call_mcp = _get(tool_call, "call_mcp_tool", "callMcpTool") or {}
|
| 258 |
+
if isinstance(call_mcp, dict) and call_mcp.get("name"):
|
| 259 |
+
try:
|
| 260 |
+
args_obj = call_mcp.get("args", {}) or {}
|
| 261 |
+
args_str = json.dumps(args_obj, ensure_ascii=False)
|
| 262 |
+
except Exception:
|
| 263 |
+
args_str = "{}"
|
| 264 |
+
tool_call_id = tool_call.get("tool_call_id") or str(uuid.uuid4())
|
| 265 |
+
delta = {
|
| 266 |
+
"id": completion_id,
|
| 267 |
+
"object": "chat.completion.chunk",
|
| 268 |
+
"created": created_ts,
|
| 269 |
+
"model": model_id,
|
| 270 |
+
"choices": [{
|
| 271 |
+
"index": 0,
|
| 272 |
+
"delta": {
|
| 273 |
+
"tool_calls": [{
|
| 274 |
+
"index": 0,
|
| 275 |
+
"id": tool_call_id,
|
| 276 |
+
"type": "function",
|
| 277 |
+
"function": {"name": call_mcp.get("name"), "arguments": args_str},
|
| 278 |
+
}]
|
| 279 |
+
}
|
| 280 |
+
}],
|
| 281 |
+
}
|
| 282 |
+
logger.info("[OpenAI Compat] 转换后的 SSE(emit tool_calls): %s", json.dumps(delta, ensure_ascii=False))
|
| 283 |
+
yield {"sse_data": f"data: {json.dumps(delta, ensure_ascii=False)}\n\n", "tool_calls_emitted": True}
|
| 284 |
+
else:
|
| 285 |
+
# 处理文本消息
|
| 286 |
+
agent_output = _get(message, "agent_output", "agentOutput") or {}
|
| 287 |
+
text_content = agent_output.get("text", "")
|
| 288 |
+
if text_content:
|
| 289 |
+
delta = {
|
| 290 |
+
"id": completion_id,
|
| 291 |
+
"object": "chat.completion.chunk",
|
| 292 |
+
"created": created_ts,
|
| 293 |
+
"model": model_id,
|
| 294 |
+
"choices": [{"index": 0, "delta": {"content": text_content}}],
|
| 295 |
+
}
|
| 296 |
+
logger.info("[OpenAI Compat] 转换后的 SSE(emit): %s", json.dumps(delta, ensure_ascii=False))
|
| 297 |
+
yield {"sse_data": f"data: {json.dumps(delta, ensure_ascii=False)}\n\n"}
|
protobuf2openai/state.py
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from __future__ import annotations
|
| 2 |
+
|
| 3 |
+
import uuid
|
| 4 |
+
from typing import Optional
|
| 5 |
+
from pydantic import BaseModel
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
class BridgeState(BaseModel):
|
| 9 |
+
conversation_id: Optional[str] = None
|
| 10 |
+
baseline_task_id: Optional[str] = None
|
| 11 |
+
tool_call_id: Optional[str] = None
|
| 12 |
+
tool_message_id: Optional[str] = None
|
| 13 |
+
|
| 14 |
+
|
| 15 |
+
STATE = BridgeState()
|
| 16 |
+
|
| 17 |
+
# Initialize tool ids lazily when needed
|
| 18 |
+
|
| 19 |
+
def ensure_tool_ids():
|
| 20 |
+
if not STATE.tool_call_id:
|
| 21 |
+
STATE.tool_call_id = str(uuid.uuid4())
|
| 22 |
+
if not STATE.tool_message_id:
|
| 23 |
+
STATE.tool_message_id = str(uuid.uuid4())
|
pyproject.toml
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[project]
|
| 2 |
+
name = "warptestui"
|
| 3 |
+
version = "0.1.0"
|
| 4 |
+
description = "Test UI for Warp"
|
| 5 |
+
readme = "README.md"
|
| 6 |
+
requires-python = ">=3.13"
|
| 7 |
+
dependencies = [
|
| 8 |
+
"fastapi[standard]",
|
| 9 |
+
"uvicorn[standard]",
|
| 10 |
+
"httpx[http2]",
|
| 11 |
+
"protobuf",
|
| 12 |
+
"grpcio-tools",
|
| 13 |
+
"python-dotenv",
|
| 14 |
+
"websockets>=15.0.1",
|
| 15 |
+
"requests>=2.32.5",
|
| 16 |
+
"openai>=1.106.0",
|
| 17 |
+
]
|
| 18 |
+
|
| 19 |
+
[project.scripts]
|
| 20 |
+
warp-server = "server:main"
|
| 21 |
+
|
| 22 |
+
[[tool.uv.index]]
|
| 23 |
+
url = "https://mirrors.ustc.edu.cn/pypi/simple"
|
| 24 |
+
default = true
|
server.py
ADDED
|
@@ -0,0 +1,357 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
# -*- coding: utf-8 -*-
|
| 3 |
+
"""
|
| 4 |
+
Warp Protobuf 桥接服务器启动文件
|
| 5 |
+
|
| 6 |
+
提供 Warp API 桥接端点(/api/warp/send_stream、/api/warp/send_stream_sse)、/healthz 与 /v1/models。已移除 GUI、静态文件与 WebSocket 功能。
|
| 7 |
+
"""
|
| 8 |
+
|
| 9 |
+
import os
|
| 10 |
+
import asyncio
|
| 11 |
+
import json
|
| 12 |
+
from pathlib import Path
|
| 13 |
+
|
| 14 |
+
import uvicorn
|
| 15 |
+
from fastapi import FastAPI, HTTPException
|
| 16 |
+
from contextlib import asynccontextmanager
|
| 17 |
+
# 新增:类型导入
|
| 18 |
+
from typing import Any, Dict, List
|
| 19 |
+
|
| 20 |
+
from warp2protobuf.api.protobuf_routes import app as protobuf_app
|
| 21 |
+
from warp2protobuf.core.logging import logger
|
| 22 |
+
|
| 23 |
+
from warp2protobuf.core.auth import acquire_anonymous_access_token
|
| 24 |
+
from warp2protobuf.config.models import get_all_unique_models
|
| 25 |
+
|
| 26 |
+
# 导入OpenAI兼容路由
|
| 27 |
+
from protobuf2openai.router import router as openai_router
|
| 28 |
+
|
| 29 |
+
|
| 30 |
+
# ============= JSON Schema 清理函数已移至 warp2protobuf.core.schema_sanitizer 模块 =============
|
| 31 |
+
|
| 32 |
+
|
| 33 |
+
# ============= 应用创建 =============
|
| 34 |
+
|
| 35 |
+
def create_app() -> FastAPI:
|
| 36 |
+
"""创建FastAPI应用"""
|
| 37 |
+
|
| 38 |
+
# 使用protobuf路由的应用作为主应用
|
| 39 |
+
app = protobuf_app
|
| 40 |
+
|
| 41 |
+
# 挂载OpenAI兼容路由
|
| 42 |
+
app.include_router(openai_router)
|
| 43 |
+
|
| 44 |
+
# 挂载输入 schema 清理中间件(覆盖 Warp 相关端点)
|
| 45 |
+
|
| 46 |
+
|
| 47 |
+
|
| 48 |
+
|
| 49 |
+
# ============= OpenAI 兼容:模型列表接口(通过router提供) =============
|
| 50 |
+
|
| 51 |
+
return app
|
| 52 |
+
|
| 53 |
+
|
| 54 |
+
def create_app_with_lifespan() -> FastAPI:
|
| 55 |
+
"""创建带有lifespan事件处理的FastAPI应用"""
|
| 56 |
+
app = FastAPI(
|
| 57 |
+
title="Warp Protobuf Bridge Server",
|
| 58 |
+
description="Warp API 桥接服务器,提供 Protobuf 编解码与 OpenAI 兼容接口",
|
| 59 |
+
version="1.0.0",
|
| 60 |
+
lifespan=lifespan
|
| 61 |
+
)
|
| 62 |
+
|
| 63 |
+
# 添加CORS中间件
|
| 64 |
+
from fastapi.middleware.cors import CORSMiddleware
|
| 65 |
+
app.add_middleware(
|
| 66 |
+
CORSMiddleware,
|
| 67 |
+
allow_origins=["*"],
|
| 68 |
+
allow_credentials=True,
|
| 69 |
+
allow_methods=["*"],
|
| 70 |
+
allow_headers=["*"],
|
| 71 |
+
)
|
| 72 |
+
|
| 73 |
+
# 挂载子应用
|
| 74 |
+
app.mount("/api", protobuf_app)
|
| 75 |
+
|
| 76 |
+
# 包含OpenAI兼容路由
|
| 77 |
+
app.include_router(openai_router)
|
| 78 |
+
|
| 79 |
+
# ============= 根路径与健康检查 =============
|
| 80 |
+
@app.get("/")
|
| 81 |
+
async def root():
|
| 82 |
+
return {
|
| 83 |
+
"service": "Warp Protobuf Bridge Server",
|
| 84 |
+
"status": "running",
|
| 85 |
+
"endpoints": {
|
| 86 |
+
"health": "/healthz",
|
| 87 |
+
"models": "/v1/models",
|
| 88 |
+
"protobuf_bridge": "/api/warp/send_stream",
|
| 89 |
+
"sse_bridge": "/api/warp/send_stream_sse",
|
| 90 |
+
"auth_refresh": "/api/auth/refresh"
|
| 91 |
+
}
|
| 92 |
+
}
|
| 93 |
+
|
| 94 |
+
@app.get("/healthz")
|
| 95 |
+
async def health_check():
|
| 96 |
+
return {"status": "ok", "service": "Warp Protobuf Bridge Server"}
|
| 97 |
+
|
| 98 |
+
return app
|
| 99 |
+
|
| 100 |
+
|
| 101 |
+
############################################################
|
| 102 |
+
# server_message_data 深度编解码工具
|
| 103 |
+
############################################################
|
| 104 |
+
|
| 105 |
+
# 说明:
|
| 106 |
+
# 根据抓包与分析,server_message_data 是 Base64URL 编码的 proto3 消息:
|
| 107 |
+
# - 字段 1:string(通常为 36 字节 UUID)
|
| 108 |
+
# - 字段 3:google.protobuf.Timestamp(字段1=seconds,字段2=nanos)
|
| 109 |
+
# 可能出现:仅 Timestamp、仅 UUID、或 UUID + Timestamp。
|
| 110 |
+
|
| 111 |
+
from typing import Dict, Optional, Tuple
|
| 112 |
+
import base64
|
| 113 |
+
from datetime import datetime, timezone
|
| 114 |
+
try:
|
| 115 |
+
from zoneinfo import ZoneInfo # Python 3.9+
|
| 116 |
+
except Exception:
|
| 117 |
+
ZoneInfo = None # type: ignore
|
| 118 |
+
|
| 119 |
+
|
| 120 |
+
def _b64url_decode_padded(s: str) -> bytes:
|
| 121 |
+
t = s.replace("-", "+").replace("_", "/")
|
| 122 |
+
pad = (-len(t)) % 4
|
| 123 |
+
if pad:
|
| 124 |
+
t += "=" * pad
|
| 125 |
+
return base64.b64decode(t)
|
| 126 |
+
|
| 127 |
+
|
| 128 |
+
def _b64url_encode_nopad(b: bytes) -> str:
|
| 129 |
+
return base64.urlsafe_b64encode(b).decode("ascii").rstrip("=")
|
| 130 |
+
|
| 131 |
+
|
| 132 |
+
def _read_varint(buf: bytes, i: int) -> Tuple[int, int]:
|
| 133 |
+
shift = 0
|
| 134 |
+
val = 0
|
| 135 |
+
while i < len(buf):
|
| 136 |
+
b = buf[i]
|
| 137 |
+
i += 1
|
| 138 |
+
val |= (b & 0x7F) << shift
|
| 139 |
+
if not (b & 0x80):
|
| 140 |
+
return val, i
|
| 141 |
+
shift += 7
|
| 142 |
+
if shift > 63:
|
| 143 |
+
break
|
| 144 |
+
raise ValueError("invalid varint")
|
| 145 |
+
|
| 146 |
+
|
| 147 |
+
def _write_varint(v: int) -> bytes:
|
| 148 |
+
out = bytearray()
|
| 149 |
+
vv = int(v)
|
| 150 |
+
while True:
|
| 151 |
+
to_write = vv & 0x7F
|
| 152 |
+
vv >>= 7
|
| 153 |
+
if vv:
|
| 154 |
+
out.append(to_write | 0x80)
|
| 155 |
+
else:
|
| 156 |
+
out.append(to_write)
|
| 157 |
+
break
|
| 158 |
+
return bytes(out)
|
| 159 |
+
|
| 160 |
+
|
| 161 |
+
def _make_key(field_no: int, wire_type: int) -> bytes:
|
| 162 |
+
return _write_varint((field_no << 3) | wire_type)
|
| 163 |
+
|
| 164 |
+
|
| 165 |
+
def _decode_timestamp(buf: bytes) -> Tuple[Optional[int], Optional[int]]:
|
| 166 |
+
# google.protobuf.Timestamp: field 1 = seconds (int64 varint), field 2 = nanos (int32 varint)
|
| 167 |
+
i = 0
|
| 168 |
+
seconds: Optional[int] = None
|
| 169 |
+
nanos: Optional[int] = None
|
| 170 |
+
while i < len(buf):
|
| 171 |
+
key, i = _read_varint(buf, i)
|
| 172 |
+
field_no = key >> 3
|
| 173 |
+
wt = key & 0x07
|
| 174 |
+
if wt == 0: # varint
|
| 175 |
+
val, i = _read_varint(buf, i)
|
| 176 |
+
if field_no == 1:
|
| 177 |
+
seconds = int(val)
|
| 178 |
+
elif field_no == 2:
|
| 179 |
+
nanos = int(val)
|
| 180 |
+
elif wt == 2: # length-delimited (not expected inside Timestamp)
|
| 181 |
+
ln, i2 = _read_varint(buf, i)
|
| 182 |
+
i = i2 + ln
|
| 183 |
+
elif wt == 1:
|
| 184 |
+
i += 8
|
| 185 |
+
elif wt == 5:
|
| 186 |
+
i += 4
|
| 187 |
+
else:
|
| 188 |
+
break
|
| 189 |
+
return seconds, nanos
|
| 190 |
+
|
| 191 |
+
|
| 192 |
+
def _encode_timestamp(seconds: Optional[int], nanos: Optional[int]) -> bytes:
|
| 193 |
+
parts = bytearray()
|
| 194 |
+
if seconds is not None:
|
| 195 |
+
parts += _make_key(1, 0) # field 1, varint
|
| 196 |
+
parts += _write_varint(int(seconds))
|
| 197 |
+
if nanos is not None:
|
| 198 |
+
parts += _make_key(2, 0) # field 2, varint
|
| 199 |
+
parts += _write_varint(int(nanos))
|
| 200 |
+
return bytes(parts)
|
| 201 |
+
|
| 202 |
+
|
| 203 |
+
def decode_server_message_data(b64url: str) -> Dict:
|
| 204 |
+
"""解码 Base64URL 的 server_message_data,返回结构化信息。"""
|
| 205 |
+
try:
|
| 206 |
+
raw = _b64url_decode_padded(b64url)
|
| 207 |
+
except Exception as e:
|
| 208 |
+
return {"error": f"base64url decode failed: {e}", "raw_b64url": b64url}
|
| 209 |
+
|
| 210 |
+
i = 0
|
| 211 |
+
uuid: Optional[str] = None
|
| 212 |
+
seconds: Optional[int] = None
|
| 213 |
+
nanos: Optional[int] = None
|
| 214 |
+
|
| 215 |
+
while i < len(raw):
|
| 216 |
+
key, i = _read_varint(raw, i)
|
| 217 |
+
field_no = key >> 3
|
| 218 |
+
wt = key & 0x07
|
| 219 |
+
if wt == 2: # length-delimited
|
| 220 |
+
ln, i2 = _read_varint(raw, i)
|
| 221 |
+
i = i2
|
| 222 |
+
data = raw[i:i+ln]
|
| 223 |
+
i += ln
|
| 224 |
+
if field_no == 1: # uuid string
|
| 225 |
+
try:
|
| 226 |
+
uuid = data.decode("utf-8")
|
| 227 |
+
except Exception:
|
| 228 |
+
uuid = None
|
| 229 |
+
elif field_no == 3: # google.protobuf.Timestamp
|
| 230 |
+
seconds, nanos = _decode_timestamp(data)
|
| 231 |
+
elif wt == 0: # varint -> not expected, skip
|
| 232 |
+
_, i = _read_varint(raw, i)
|
| 233 |
+
elif wt == 1:
|
| 234 |
+
i += 8
|
| 235 |
+
elif wt == 5:
|
| 236 |
+
i += 4
|
| 237 |
+
else:
|
| 238 |
+
break
|
| 239 |
+
|
| 240 |
+
out: Dict[str, Any] = {}
|
| 241 |
+
if uuid is not None:
|
| 242 |
+
out["uuid"] = uuid
|
| 243 |
+
if seconds is not None:
|
| 244 |
+
out["seconds"] = seconds
|
| 245 |
+
if nanos is not None:
|
| 246 |
+
out["nanos"] = nanos
|
| 247 |
+
return out
|
| 248 |
+
|
| 249 |
+
|
| 250 |
+
def encode_server_message_data(uuid: str = None, seconds: int = None, nanos: int = None) -> str:
|
| 251 |
+
"""将 uuid/seconds/nanos 组合编码为 Base64URL 字符串。"""
|
| 252 |
+
parts = bytearray()
|
| 253 |
+
if uuid:
|
| 254 |
+
b = uuid.encode("utf-8")
|
| 255 |
+
parts += _make_key(1, 2) # field 1, length-delimited
|
| 256 |
+
parts += _write_varint(len(b))
|
| 257 |
+
parts += b
|
| 258 |
+
|
| 259 |
+
if seconds is not None or nanos is not None:
|
| 260 |
+
ts = _encode_timestamp(seconds, nanos)
|
| 261 |
+
parts += _make_key(3, 2) # field 3, length-delimited
|
| 262 |
+
parts += _write_varint(len(ts))
|
| 263 |
+
parts += ts
|
| 264 |
+
|
| 265 |
+
return _b64url_encode_nopad(bytes(parts))
|
| 266 |
+
|
| 267 |
+
|
| 268 |
+
async def startup_tasks():
|
| 269 |
+
"""启动时执行的任务"""
|
| 270 |
+
logger.info("="*60)
|
| 271 |
+
logger.info("Warp Protobuf编解码服务器启动")
|
| 272 |
+
logger.info("="*60)
|
| 273 |
+
|
| 274 |
+
# 检查protobuf运行时
|
| 275 |
+
try:
|
| 276 |
+
from warp2protobuf.core.protobuf import ensure_proto_runtime
|
| 277 |
+
ensure_proto_runtime()
|
| 278 |
+
logger.info("✅ Protobuf运行时初始化成功")
|
| 279 |
+
except Exception as e:
|
| 280 |
+
logger.error(f"❌ Protobuf运行时初始化失败: {e}")
|
| 281 |
+
raise
|
| 282 |
+
|
| 283 |
+
# 检查JWT token
|
| 284 |
+
try:
|
| 285 |
+
from warp2protobuf.core.auth import get_jwt_token, is_token_expired, refresh_jwt_if_needed
|
| 286 |
+
token = get_jwt_token()
|
| 287 |
+
if token and not is_token_expired(token):
|
| 288 |
+
logger.info("✅ JWT token有效")
|
| 289 |
+
elif not token:
|
| 290 |
+
logger.warning("⚠️ 未找到JWT token,尝试申请匿名访问token用于额度初始化…")
|
| 291 |
+
try:
|
| 292 |
+
new_token = await acquire_anonymous_access_token()
|
| 293 |
+
if new_token:
|
| 294 |
+
logger.info("✅ 匿名访问token申请成功")
|
| 295 |
+
else:
|
| 296 |
+
logger.warning("⚠️ 匿名访问token申请失败")
|
| 297 |
+
except Exception as e2:
|
| 298 |
+
logger.warning(f"⚠️ 匿名访问token申请异常: {e2}")
|
| 299 |
+
else:
|
| 300 |
+
logger.warning("⚠️ JWT token无效或已过期,尝试自动刷新…")
|
| 301 |
+
try:
|
| 302 |
+
refresh_success = await refresh_jwt_if_needed()
|
| 303 |
+
if refresh_success:
|
| 304 |
+
logger.info("✅ JWT token自动刷新成功")
|
| 305 |
+
else:
|
| 306 |
+
logger.warning("⚠️ JWT token自动刷新失败,建议手动运行: uv run refresh_jwt.py")
|
| 307 |
+
except Exception as e3:
|
| 308 |
+
logger.warning(f"⚠️ JWT token自动刷新异常: {e3},建议手动运行: uv run refresh_jwt.py")
|
| 309 |
+
except Exception as e:
|
| 310 |
+
logger.warning(f"⚠️ JWT检查失败: {e}")
|
| 311 |
+
|
| 312 |
+
# OpenAI 兼容层已集成到当前服务器中
|
| 313 |
+
|
| 314 |
+
# 显示可用端点
|
| 315 |
+
logger.info("-"*40)
|
| 316 |
+
logger.info("可用的API端点:")
|
| 317 |
+
logger.info(" GET / - 服务信息")
|
| 318 |
+
logger.info(" GET /healthz - 健康检查")
|
| 319 |
+
logger.info(" GET /v1/models - 模型列表(OpenAI兼容)")
|
| 320 |
+
logger.info(" POST /api/warp/send_stream - Warp API 转发(返回解析事件)")
|
| 321 |
+
logger.info(" POST /api/warp/send_stream_sse - Warp API 转发(实时SSE)")
|
| 322 |
+
logger.info(" POST /api/auth/refresh - 刷新JWT token")
|
| 323 |
+
logger.info("="*60)
|
| 324 |
+
|
| 325 |
+
|
| 326 |
+
@asynccontextmanager
|
| 327 |
+
async def lifespan(app: FastAPI):
|
| 328 |
+
"""应用生命周期管理"""
|
| 329 |
+
# 启动时执行
|
| 330 |
+
await startup_tasks()
|
| 331 |
+
yield
|
| 332 |
+
# 关闭时执行(如果需要的话)
|
| 333 |
+
|
| 334 |
+
|
| 335 |
+
def main():
|
| 336 |
+
"""主函数"""
|
| 337 |
+
# 创建应用(使用lifespan)
|
| 338 |
+
app = create_app_with_lifespan()
|
| 339 |
+
|
| 340 |
+
# 启动服务器
|
| 341 |
+
try:
|
| 342 |
+
uvicorn.run(
|
| 343 |
+
app,
|
| 344 |
+
host="0.0.0.0",
|
| 345 |
+
port=8000,
|
| 346 |
+
log_level="info",
|
| 347 |
+
access_log=True
|
| 348 |
+
)
|
| 349 |
+
except KeyboardInterrupt:
|
| 350 |
+
logger.info("服务器被用户停止")
|
| 351 |
+
except Exception as e:
|
| 352 |
+
logger.error(f"服务器启动失败: {e}")
|
| 353 |
+
raise
|
| 354 |
+
|
| 355 |
+
|
| 356 |
+
if __name__ == "__main__":
|
| 357 |
+
main()
|
uv.lock
ADDED
|
@@ -0,0 +1,863 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version = 1
|
| 2 |
+
revision = 1
|
| 3 |
+
requires-python = ">=3.13"
|
| 4 |
+
|
| 5 |
+
[[package]]
|
| 6 |
+
name = "annotated-types"
|
| 7 |
+
version = "0.7.0"
|
| 8 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 9 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 }
|
| 10 |
+
wheels = [
|
| 11 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 },
|
| 12 |
+
]
|
| 13 |
+
|
| 14 |
+
[[package]]
|
| 15 |
+
name = "anyio"
|
| 16 |
+
version = "4.10.0"
|
| 17 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 18 |
+
dependencies = [
|
| 19 |
+
{ name = "idna" },
|
| 20 |
+
{ name = "sniffio" },
|
| 21 |
+
]
|
| 22 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/f1/b4/636b3b65173d3ce9a38ef5f0522789614e590dab6a8d505340a4efe4c567/anyio-4.10.0.tar.gz", hash = "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6", size = 213252 }
|
| 23 |
+
wheels = [
|
| 24 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213 },
|
| 25 |
+
]
|
| 26 |
+
|
| 27 |
+
[[package]]
|
| 28 |
+
name = "certifi"
|
| 29 |
+
version = "2025.8.3"
|
| 30 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 31 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386 }
|
| 32 |
+
wheels = [
|
| 33 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216 },
|
| 34 |
+
]
|
| 35 |
+
|
| 36 |
+
[[package]]
|
| 37 |
+
name = "charset-normalizer"
|
| 38 |
+
version = "3.4.3"
|
| 39 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 40 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/83/2d/5fd176ceb9b2fc619e63405525573493ca23441330fcdaee6bef9460e924/charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", size = 122371 }
|
| 41 |
+
wheels = [
|
| 42 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/65/ca/2135ac97709b400c7654b4b764daf5c5567c2da45a30cdd20f9eefe2d658/charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", size = 205326 },
|
| 43 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/71/11/98a04c3c97dd34e49c7d247083af03645ca3730809a5509443f3c37f7c99/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", size = 146008 },
|
| 44 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/60/f5/4659a4cb3c4ec146bec80c32d8bb16033752574c20b1252ee842a95d1a1e/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", size = 159196 },
|
| 45 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/86/9e/f552f7a00611f168b9a5865a1414179b2c6de8235a4fa40189f6f79a1753/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", size = 156819 },
|
| 46 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/7e/95/42aa2156235cbc8fa61208aded06ef46111c4d3f0de233107b3f38631803/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", size = 151350 },
|
| 47 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/c2/a9/3865b02c56f300a6f94fc631ef54f0a8a29da74fb45a773dfd3dcd380af7/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", size = 148644 },
|
| 48 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/77/d9/cbcf1a2a5c7d7856f11e7ac2d782aec12bdfea60d104e60e0aa1c97849dc/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9", size = 160468 },
|
| 49 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/f6/42/6f45efee8697b89fda4d50580f292b8f7f9306cb2971d4b53f8914e4d890/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", size = 158187 },
|
| 50 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/70/99/f1c3bdcfaa9c45b3ce96f70b14f070411366fa19549c1d4832c935d8e2c3/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", size = 152699 },
|
| 51 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/a3/ad/b0081f2f99a4b194bcbb1934ef3b12aa4d9702ced80a37026b7607c72e58/charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", size = 99580 },
|
| 52 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/9a/8f/ae790790c7b64f925e5c953b924aaa42a243fb778fed9e41f147b2a5715a/charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", size = 107366 },
|
| 53 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/8e/91/b5a06ad970ddc7a0e513112d40113e834638f4ca1120eb727a249fb2715e/charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", size = 204342 },
|
| 54 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/ce/ec/1edc30a377f0a02689342f214455c3f6c2fbedd896a1d2f856c002fc3062/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", size = 145995 },
|
| 55 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/17/e5/5e67ab85e6d22b04641acb5399c8684f4d37caf7558a53859f0283a650e9/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", size = 158640 },
|
| 56 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/f1/e5/38421987f6c697ee3722981289d554957c4be652f963d71c5e46a262e135/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", size = 156636 },
|
| 57 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/a0/e4/5a075de8daa3ec0745a9a3b54467e0c2967daaaf2cec04c845f73493e9a1/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", size = 150939 },
|
| 58 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/02/f7/3611b32318b30974131db62b4043f335861d4d9b49adc6d57c1149cc49d4/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", size = 148580 },
|
| 59 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/7e/61/19b36f4bd67f2793ab6a99b979b4e4f3d8fc754cbdffb805335df4337126/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", size = 159870 },
|
| 60 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/06/57/84722eefdd338c04cf3030ada66889298eaedf3e7a30a624201e0cbe424a/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", size = 157797 },
|
| 61 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224 },
|
| 62 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/b7/8c/9839225320046ed279c6e839d51f028342eb77c91c89b8ef2549f951f3ec/charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", size = 100086 },
|
| 63 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/ee/7a/36fbcf646e41f710ce0a563c1c9a343c6edf9be80786edeb15b6f62e17db/charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", size = 107400 },
|
| 64 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175 },
|
| 65 |
+
]
|
| 66 |
+
|
| 67 |
+
[[package]]
|
| 68 |
+
name = "click"
|
| 69 |
+
version = "8.2.1"
|
| 70 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 71 |
+
dependencies = [
|
| 72 |
+
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
| 73 |
+
]
|
| 74 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342 }
|
| 75 |
+
wheels = [
|
| 76 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215 },
|
| 77 |
+
]
|
| 78 |
+
|
| 79 |
+
[[package]]
|
| 80 |
+
name = "colorama"
|
| 81 |
+
version = "0.4.6"
|
| 82 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 83 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 }
|
| 84 |
+
wheels = [
|
| 85 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
|
| 86 |
+
]
|
| 87 |
+
|
| 88 |
+
[[package]]
|
| 89 |
+
name = "distro"
|
| 90 |
+
version = "1.9.0"
|
| 91 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 92 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722 }
|
| 93 |
+
wheels = [
|
| 94 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277 },
|
| 95 |
+
]
|
| 96 |
+
|
| 97 |
+
[[package]]
|
| 98 |
+
name = "dnspython"
|
| 99 |
+
version = "2.7.0"
|
| 100 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 101 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197 }
|
| 102 |
+
wheels = [
|
| 103 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632 },
|
| 104 |
+
]
|
| 105 |
+
|
| 106 |
+
[[package]]
|
| 107 |
+
name = "email-validator"
|
| 108 |
+
version = "2.2.0"
|
| 109 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 110 |
+
dependencies = [
|
| 111 |
+
{ name = "dnspython" },
|
| 112 |
+
{ name = "idna" },
|
| 113 |
+
]
|
| 114 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/48/ce/13508a1ec3f8bb981ae4ca79ea40384becc868bfae97fd1c942bb3a001b1/email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7", size = 48967 }
|
| 115 |
+
wheels = [
|
| 116 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", size = 33521 },
|
| 117 |
+
]
|
| 118 |
+
|
| 119 |
+
[[package]]
|
| 120 |
+
name = "fastapi"
|
| 121 |
+
version = "0.116.1"
|
| 122 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 123 |
+
dependencies = [
|
| 124 |
+
{ name = "pydantic" },
|
| 125 |
+
{ name = "starlette" },
|
| 126 |
+
{ name = "typing-extensions" },
|
| 127 |
+
]
|
| 128 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/78/d7/6c8b3bfe33eeffa208183ec037fee0cce9f7f024089ab1c5d12ef04bd27c/fastapi-0.116.1.tar.gz", hash = "sha256:ed52cbf946abfd70c5a0dccb24673f0670deeb517a88b3544d03c2a6bf283143", size = 296485 }
|
| 129 |
+
wheels = [
|
| 130 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/e5/47/d63c60f59a59467fda0f93f46335c9d18526d7071f025cb5b89d5353ea42/fastapi-0.116.1-py3-none-any.whl", hash = "sha256:c46ac7c312df840f0c9e220f7964bada936781bc4e2e6eb71f1c4d7553786565", size = 95631 },
|
| 131 |
+
]
|
| 132 |
+
|
| 133 |
+
[package.optional-dependencies]
|
| 134 |
+
standard = [
|
| 135 |
+
{ name = "email-validator" },
|
| 136 |
+
{ name = "fastapi-cli", extra = ["standard"] },
|
| 137 |
+
{ name = "httpx" },
|
| 138 |
+
{ name = "jinja2" },
|
| 139 |
+
{ name = "python-multipart" },
|
| 140 |
+
{ name = "uvicorn", extra = ["standard"] },
|
| 141 |
+
]
|
| 142 |
+
|
| 143 |
+
[[package]]
|
| 144 |
+
name = "fastapi-cli"
|
| 145 |
+
version = "0.0.8"
|
| 146 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 147 |
+
dependencies = [
|
| 148 |
+
{ name = "rich-toolkit" },
|
| 149 |
+
{ name = "typer" },
|
| 150 |
+
{ name = "uvicorn", extra = ["standard"] },
|
| 151 |
+
]
|
| 152 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/c6/94/3ef75d9c7c32936ecb539b9750ccbdc3d2568efd73b1cb913278375f4533/fastapi_cli-0.0.8.tar.gz", hash = "sha256:2360f2989b1ab4a3d7fc8b3a0b20e8288680d8af2e31de7c38309934d7f8a0ee", size = 16884 }
|
| 153 |
+
wheels = [
|
| 154 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/e0/3f/6ad3103c5f59208baf4c798526daea6a74085bb35d1c161c501863470476/fastapi_cli-0.0.8-py3-none-any.whl", hash = "sha256:0ea95d882c85b9219a75a65ab27e8da17dac02873e456850fa0a726e96e985eb", size = 10770 },
|
| 155 |
+
]
|
| 156 |
+
|
| 157 |
+
[package.optional-dependencies]
|
| 158 |
+
standard = [
|
| 159 |
+
{ name = "fastapi-cloud-cli" },
|
| 160 |
+
{ name = "uvicorn", extra = ["standard"] },
|
| 161 |
+
]
|
| 162 |
+
|
| 163 |
+
[[package]]
|
| 164 |
+
name = "fastapi-cloud-cli"
|
| 165 |
+
version = "0.1.5"
|
| 166 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 167 |
+
dependencies = [
|
| 168 |
+
{ name = "httpx" },
|
| 169 |
+
{ name = "pydantic", extra = ["email"] },
|
| 170 |
+
{ name = "rich-toolkit" },
|
| 171 |
+
{ name = "rignore" },
|
| 172 |
+
{ name = "sentry-sdk" },
|
| 173 |
+
{ name = "typer" },
|
| 174 |
+
{ name = "uvicorn", extra = ["standard"] },
|
| 175 |
+
]
|
| 176 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/a9/2e/3b6e5016affc310e5109bc580f760586eabecea0c8a7ab067611cd849ac0/fastapi_cloud_cli-0.1.5.tar.gz", hash = "sha256:341ee585eb731a6d3c3656cb91ad38e5f39809bf1a16d41de1333e38635a7937", size = 22710 }
|
| 177 |
+
wheels = [
|
| 178 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/e5/a6/5aa862489a2918a096166fd98d9fe86b7fd53c607678b3fa9d8c432d88d5/fastapi_cloud_cli-0.1.5-py3-none-any.whl", hash = "sha256:d80525fb9c0e8af122370891f9fa83cf5d496e4ad47a8dd26c0496a6c85a012a", size = 18992 },
|
| 179 |
+
]
|
| 180 |
+
|
| 181 |
+
[[package]]
|
| 182 |
+
name = "grpcio"
|
| 183 |
+
version = "1.74.0"
|
| 184 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 185 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/38/b4/35feb8f7cab7239c5b94bd2db71abb3d6adb5f335ad8f131abb6060840b6/grpcio-1.74.0.tar.gz", hash = "sha256:80d1f4fbb35b0742d3e3d3bb654b7381cd5f015f8497279a1e9c21ba623e01b1", size = 12756048 }
|
| 186 |
+
wheels = [
|
| 187 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/d4/d8/1004a5f468715221450e66b051c839c2ce9a985aa3ee427422061fcbb6aa/grpcio-1.74.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:2bc2d7d8d184e2362b53905cb1708c84cb16354771c04b490485fa07ce3a1d89", size = 5449488 },
|
| 188 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/94/0e/33731a03f63740d7743dced423846c831d8e6da808fcd02821a4416df7fa/grpcio-1.74.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:c14e803037e572c177ba54a3e090d6eb12efd795d49327c5ee2b3bddb836bf01", size = 10974059 },
|
| 189 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/0d/c6/3d2c14d87771a421205bdca991467cfe473ee4c6a1231c1ede5248c62ab8/grpcio-1.74.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f6ec94f0e50eb8fa1744a731088b966427575e40c2944a980049798b127a687e", size = 5945647 },
|
| 190 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/c5/83/5a354c8aaff58594eef7fffebae41a0f8995a6258bbc6809b800c33d4c13/grpcio-1.74.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:566b9395b90cc3d0d0c6404bc8572c7c18786ede549cdb540ae27b58afe0fb91", size = 6626101 },
|
| 191 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/3f/ca/4fdc7bf59bf6994aa45cbd4ef1055cd65e2884de6113dbd49f75498ddb08/grpcio-1.74.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1ea6176d7dfd5b941ea01c2ec34de9531ba494d541fe2057c904e601879f249", size = 6182562 },
|
| 192 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/fd/48/2869e5b2c1922583686f7ae674937986807c2f676d08be70d0a541316270/grpcio-1.74.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:64229c1e9cea079420527fa8ac45d80fc1e8d3f94deaa35643c381fa8d98f362", size = 6303425 },
|
| 193 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/a6/0e/bac93147b9a164f759497bc6913e74af1cb632c733c7af62c0336782bd38/grpcio-1.74.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:0f87bddd6e27fc776aacf7ebfec367b6d49cad0455123951e4488ea99d9b9b8f", size = 6996533 },
|
| 194 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/84/35/9f6b2503c1fd86d068b46818bbd7329db26a87cdd8c01e0d1a9abea1104c/grpcio-1.74.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3b03d8f2a07f0fea8c8f74deb59f8352b770e3900d143b3d1475effcb08eec20", size = 6491489 },
|
| 195 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/75/33/a04e99be2a82c4cbc4039eb3a76f6c3632932b9d5d295221389d10ac9ca7/grpcio-1.74.0-cp313-cp313-win32.whl", hash = "sha256:b6a73b2ba83e663b2480a90b82fdae6a7aa6427f62bf43b29912c0cfd1aa2bfa", size = 3805811 },
|
| 196 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/34/80/de3eb55eb581815342d097214bed4c59e806b05f1b3110df03b2280d6dfd/grpcio-1.74.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd3c71aeee838299c5887230b8a1822795325ddfea635edd82954c1eaa831e24", size = 4489214 },
|
| 197 |
+
]
|
| 198 |
+
|
| 199 |
+
[[package]]
|
| 200 |
+
name = "grpcio-tools"
|
| 201 |
+
version = "1.74.0"
|
| 202 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 203 |
+
dependencies = [
|
| 204 |
+
{ name = "grpcio" },
|
| 205 |
+
{ name = "protobuf" },
|
| 206 |
+
{ name = "setuptools" },
|
| 207 |
+
]
|
| 208 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/90/c8/bca79cb8c14bb63027831039919c801db9f593c7504c09433934f5dff6a4/grpcio_tools-1.74.0.tar.gz", hash = "sha256:88ab9eb18b6ac1b4872add6b394073bd8d44eee7c32e4dc60a022e25ffaffb95", size = 5390007 }
|
| 209 |
+
wheels = [
|
| 210 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/2f/65/307a72cf4bfa553a25e284bd1f27b94a53816ac01ddf432c398117b91b2a/grpcio_tools-1.74.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:e2e22460355adbd0f25fdd7ed8b9ae53afb3875b9d5f34cdf1cf12559418245e", size = 2545750 },
|
| 211 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/5b/8e/9b2217c15baadc7cfca3eba9f980e147452ca82f41767490f619edea3489/grpcio_tools-1.74.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:0cab5a2c6ae75b555fee8a1a9a9b575205171e1de392fe2d4139a29e67d8f5bb", size = 5838169 },
|
| 212 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/ea/42/a6a158b7e91c0a358cddf3f9088b004c2bfa42d1f96154b9b8eb17e16d73/grpcio_tools-1.74.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:9b18afca48b55832402a716ea4634ef2b68927a8a17ddf4038f51812299255c9", size = 2517140 },
|
| 213 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/05/db/d4576a07b2d1211822a070f76a99a9f4f4cb63496a02964ce77c88df8a28/grpcio_tools-1.74.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85f442a9e89e276bf89a0c9c76ea71647a927d967759333c1fa40300c27f7bd", size = 2905214 },
|
| 214 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/77/dc/3713e75751f862d8c84f823ba935d486c0aac0b6f789fa61fbde04ad5019/grpcio_tools-1.74.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051ce925b0b99ae2daf61b3cba19962b8655cc2a72758ce4081b89272206f5a3", size = 2656245 },
|
| 215 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/bd/e4/01f9e8e0401d8e11a70ae8aff6899eb8c16536f69a0a9ffb25873588721c/grpcio_tools-1.74.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:98c7b8eb0de6984cd7fa7335ce3383b3bb9a1559edc238c811df88008d5d3593", size = 3052327 },
|
| 216 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/28/c2/264b4e705375a834c9c7462847ae435c0be1644f03a705d3d7464af07bd5/grpcio_tools-1.74.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f8f7d17b7573b9a2a6b4183fa4a56a2ab17370c8d0541e1424cf0c9c6f863434", size = 3500706 },
|
| 217 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/ee/c0/cc034cec5871a1918e7888e8ce700e06fab5bbb328f998a2f2750cd603b5/grpcio_tools-1.74.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:db08b91ea0cd66dc4b1b929100e7aa84c9c10c51573c8282ec1ba05b41f887ef", size = 3125098 },
|
| 218 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/69/55/5792b681af82b3ff1e50ce0ccfbb6d52fc68a13932ed3da57e58d7dfb67b/grpcio_tools-1.74.0-cp313-cp313-win32.whl", hash = "sha256:4b6c5efb331ae9e5f614437f4a5938459a8a5a1ab3dfe133d2bbdeaba39b894d", size = 992431 },
|
| 219 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/94/9f/626f0fe6bfc1c6917785c6a5ee2eb8c07b5a30771e4bf4cff3c1ab5b431b/grpcio_tools-1.74.0-cp313-cp313-win_amd64.whl", hash = "sha256:b8324cd67f61f7900d227b36913ee5f0302ba3ba8777c8bc705afa8174098d28", size = 1157064 },
|
| 220 |
+
]
|
| 221 |
+
|
| 222 |
+
[[package]]
|
| 223 |
+
name = "h11"
|
| 224 |
+
version = "0.16.0"
|
| 225 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 226 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250 }
|
| 227 |
+
wheels = [
|
| 228 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515 },
|
| 229 |
+
]
|
| 230 |
+
|
| 231 |
+
[[package]]
|
| 232 |
+
name = "h2"
|
| 233 |
+
version = "4.2.0"
|
| 234 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 235 |
+
dependencies = [
|
| 236 |
+
{ name = "hpack" },
|
| 237 |
+
{ name = "hyperframe" },
|
| 238 |
+
]
|
| 239 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/1b/38/d7f80fd13e6582fb8e0df8c9a653dcc02b03ca34f4d72f34869298c5baf8/h2-4.2.0.tar.gz", hash = "sha256:c8a52129695e88b1a0578d8d2cc6842bbd79128ac685463b887ee278126ad01f", size = 2150682 }
|
| 240 |
+
wheels = [
|
| 241 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/d0/9e/984486f2d0a0bd2b024bf4bc1c62688fcafa9e61991f041fb0e2def4a982/h2-4.2.0-py3-none-any.whl", hash = "sha256:479a53ad425bb29af087f3458a61d30780bc818e4ebcf01f0b536ba916462ed0", size = 60957 },
|
| 242 |
+
]
|
| 243 |
+
|
| 244 |
+
[[package]]
|
| 245 |
+
name = "hpack"
|
| 246 |
+
version = "4.1.0"
|
| 247 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 248 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/2c/48/71de9ed269fdae9c8057e5a4c0aa7402e8bb16f2c6e90b3aa53327b113f8/hpack-4.1.0.tar.gz", hash = "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca", size = 51276 }
|
| 249 |
+
wheels = [
|
| 250 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/07/c6/80c95b1b2b94682a72cbdbfb85b81ae2daffa4291fbfa1b1464502ede10d/hpack-4.1.0-py3-none-any.whl", hash = "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496", size = 34357 },
|
| 251 |
+
]
|
| 252 |
+
|
| 253 |
+
[[package]]
|
| 254 |
+
name = "httpcore"
|
| 255 |
+
version = "1.0.9"
|
| 256 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 257 |
+
dependencies = [
|
| 258 |
+
{ name = "certifi" },
|
| 259 |
+
{ name = "h11" },
|
| 260 |
+
]
|
| 261 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484 }
|
| 262 |
+
wheels = [
|
| 263 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784 },
|
| 264 |
+
]
|
| 265 |
+
|
| 266 |
+
[[package]]
|
| 267 |
+
name = "httptools"
|
| 268 |
+
version = "0.6.4"
|
| 269 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 270 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639 }
|
| 271 |
+
wheels = [
|
| 272 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214 },
|
| 273 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431 },
|
| 274 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121 },
|
| 275 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805 },
|
| 276 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858 },
|
| 277 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042 },
|
| 278 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682 },
|
| 279 |
+
]
|
| 280 |
+
|
| 281 |
+
[[package]]
|
| 282 |
+
name = "httpx"
|
| 283 |
+
version = "0.28.1"
|
| 284 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 285 |
+
dependencies = [
|
| 286 |
+
{ name = "anyio" },
|
| 287 |
+
{ name = "certifi" },
|
| 288 |
+
{ name = "httpcore" },
|
| 289 |
+
{ name = "idna" },
|
| 290 |
+
]
|
| 291 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 }
|
| 292 |
+
wheels = [
|
| 293 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 },
|
| 294 |
+
]
|
| 295 |
+
|
| 296 |
+
[package.optional-dependencies]
|
| 297 |
+
http2 = [
|
| 298 |
+
{ name = "h2" },
|
| 299 |
+
]
|
| 300 |
+
|
| 301 |
+
[[package]]
|
| 302 |
+
name = "hyperframe"
|
| 303 |
+
version = "6.1.0"
|
| 304 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 305 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/02/e7/94f8232d4a74cc99514c13a9f995811485a6903d48e5d952771ef6322e30/hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08", size = 26566 }
|
| 306 |
+
wheels = [
|
| 307 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5", size = 13007 },
|
| 308 |
+
]
|
| 309 |
+
|
| 310 |
+
[[package]]
|
| 311 |
+
name = "idna"
|
| 312 |
+
version = "3.10"
|
| 313 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 314 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 }
|
| 315 |
+
wheels = [
|
| 316 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
|
| 317 |
+
]
|
| 318 |
+
|
| 319 |
+
[[package]]
|
| 320 |
+
name = "jinja2"
|
| 321 |
+
version = "3.1.6"
|
| 322 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 323 |
+
dependencies = [
|
| 324 |
+
{ name = "markupsafe" },
|
| 325 |
+
]
|
| 326 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 }
|
| 327 |
+
wheels = [
|
| 328 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 },
|
| 329 |
+
]
|
| 330 |
+
|
| 331 |
+
[[package]]
|
| 332 |
+
name = "jiter"
|
| 333 |
+
version = "0.10.0"
|
| 334 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 335 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/ee/9d/ae7ddb4b8ab3fb1b51faf4deb36cb48a4fbbd7cb36bad6a5fca4741306f7/jiter-0.10.0.tar.gz", hash = "sha256:07a7142c38aacc85194391108dc91b5b57093c978a9932bd86a36862759d9500", size = 162759 }
|
| 336 |
+
wheels = [
|
| 337 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/2e/b0/279597e7a270e8d22623fea6c5d4eeac328e7d95c236ed51a2b884c54f70/jiter-0.10.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e0588107ec8e11b6f5ef0e0d656fb2803ac6cf94a96b2b9fc675c0e3ab5e8644", size = 311617 },
|
| 338 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/91/e3/0916334936f356d605f54cc164af4060e3e7094364add445a3bc79335d46/jiter-0.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cafc4628b616dc32530c20ee53d71589816cf385dd9449633e910d596b1f5c8a", size = 318947 },
|
| 339 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/6a/8e/fd94e8c02d0e94539b7d669a7ebbd2776e51f329bb2c84d4385e8063a2ad/jiter-0.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:520ef6d981172693786a49ff5b09eda72a42e539f14788124a07530f785c3ad6", size = 344618 },
|
| 340 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/6f/b0/f9f0a2ec42c6e9c2e61c327824687f1e2415b767e1089c1d9135f43816bd/jiter-0.10.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:554dedfd05937f8fc45d17ebdf298fe7e0c77458232bcb73d9fbbf4c6455f5b3", size = 368829 },
|
| 341 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/e8/57/5bbcd5331910595ad53b9fd0c610392ac68692176f05ae48d6ce5c852967/jiter-0.10.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bc299da7789deacf95f64052d97f75c16d4fc8c4c214a22bf8d859a4288a1c2", size = 491034 },
|
| 342 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/9b/be/c393df00e6e6e9e623a73551774449f2f23b6ec6a502a3297aeeece2c65a/jiter-0.10.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5161e201172de298a8a1baad95eb85db4fb90e902353b1f6a41d64ea64644e25", size = 388529 },
|
| 343 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/42/3e/df2235c54d365434c7f150b986a6e35f41ebdc2f95acea3036d99613025d/jiter-0.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2227db6ba93cb3e2bf67c87e594adde0609f146344e8207e8730364db27041", size = 350671 },
|
| 344 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/c6/77/71b0b24cbcc28f55ab4dbfe029f9a5b73aeadaba677843fc6dc9ed2b1d0a/jiter-0.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15acb267ea5e2c64515574b06a8bf393fbfee6a50eb1673614aa45f4613c0cca", size = 390864 },
|
| 345 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/6a/d3/ef774b6969b9b6178e1d1e7a89a3bd37d241f3d3ec5f8deb37bbd203714a/jiter-0.10.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:901b92f2e2947dc6dfcb52fd624453862e16665ea909a08398dde19c0731b7f4", size = 522989 },
|
| 346 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/0c/41/9becdb1d8dd5d854142f45a9d71949ed7e87a8e312b0bede2de849388cb9/jiter-0.10.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d0cb9a125d5a3ec971a094a845eadde2db0de85b33c9f13eb94a0c63d463879e", size = 513495 },
|
| 347 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/9c/36/3468e5a18238bdedae7c4d19461265b5e9b8e288d3f86cd89d00cbb48686/jiter-0.10.0-cp313-cp313-win32.whl", hash = "sha256:48a403277ad1ee208fb930bdf91745e4d2d6e47253eedc96e2559d1e6527006d", size = 211289 },
|
| 348 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/7e/07/1c96b623128bcb913706e294adb5f768fb7baf8db5e1338ce7b4ee8c78ef/jiter-0.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:75f9eb72ecb640619c29bf714e78c9c46c9c4eaafd644bf78577ede459f330d4", size = 205074 },
|
| 349 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/54/46/caa2c1342655f57d8f0f2519774c6d67132205909c65e9aa8255e1d7b4f4/jiter-0.10.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:28ed2a4c05a1f32ef0e1d24c2611330219fed727dae01789f4a335617634b1ca", size = 318225 },
|
| 350 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/43/84/c7d44c75767e18946219ba2d703a5a32ab37b0bc21886a97bc6062e4da42/jiter-0.10.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14a4c418b1ec86a195f1ca69da8b23e8926c752b685af665ce30777233dfe070", size = 350235 },
|
| 351 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/01/16/f5a0135ccd968b480daad0e6ab34b0c7c5ba3bc447e5088152696140dcb3/jiter-0.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d7bfed2fe1fe0e4dda6ef682cee888ba444b21e7a6553e03252e4feb6cf0adca", size = 207278 },
|
| 352 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/1c/9b/1d646da42c3de6c2188fdaa15bce8ecb22b635904fc68be025e21249ba44/jiter-0.10.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:5e9251a5e83fab8d87799d3e1a46cb4b7f2919b895c6f4483629ed2446f66522", size = 310866 },
|
| 353 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/ad/0e/26538b158e8a7c7987e94e7aeb2999e2e82b1f9d2e1f6e9874ddf71ebda0/jiter-0.10.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:023aa0204126fe5b87ccbcd75c8a0d0261b9abdbbf46d55e7ae9f8e22424eeb8", size = 318772 },
|
| 354 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/7b/fb/d302893151caa1c2636d6574d213e4b34e31fd077af6050a9c5cbb42f6fb/jiter-0.10.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c189c4f1779c05f75fc17c0c1267594ed918996a231593a21a5ca5438445216", size = 344534 },
|
| 355 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/01/d8/5780b64a149d74e347c5128d82176eb1e3241b1391ac07935693466d6219/jiter-0.10.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:15720084d90d1098ca0229352607cd68256c76991f6b374af96f36920eae13c4", size = 369087 },
|
| 356 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/e8/5b/f235a1437445160e777544f3ade57544daf96ba7e96c1a5b24a6f7ac7004/jiter-0.10.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4f2fb68e5f1cfee30e2b2a09549a00683e0fde4c6a2ab88c94072fc33cb7426", size = 490694 },
|
| 357 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/85/a9/9c3d4617caa2ff89cf61b41e83820c27ebb3f7b5fae8a72901e8cd6ff9be/jiter-0.10.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce541693355fc6da424c08b7edf39a2895f58d6ea17d92cc2b168d20907dee12", size = 388992 },
|
| 358 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/68/b1/344fd14049ba5c94526540af7eb661871f9c54d5f5601ff41a959b9a0bbd/jiter-0.10.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31c50c40272e189d50006ad5c73883caabb73d4e9748a688b216e85a9a9ca3b9", size = 351723 },
|
| 359 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/41/89/4c0e345041186f82a31aee7b9d4219a910df672b9fef26f129f0cda07a29/jiter-0.10.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fa3402a2ff9815960e0372a47b75c76979d74402448509ccd49a275fa983ef8a", size = 392215 },
|
| 360 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/55/58/ee607863e18d3f895feb802154a2177d7e823a7103f000df182e0f718b38/jiter-0.10.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:1956f934dca32d7bb647ea21d06d93ca40868b505c228556d3373cbd255ce853", size = 522762 },
|
| 361 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/15/d0/9123fb41825490d16929e73c212de9a42913d68324a8ce3c8476cae7ac9d/jiter-0.10.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:fcedb049bdfc555e261d6f65a6abe1d5ad68825b7202ccb9692636c70fcced86", size = 513427 },
|
| 362 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/d8/b3/2bd02071c5a2430d0b70403a34411fc519c2f227da7b03da9ba6a956f931/jiter-0.10.0-cp314-cp314-win32.whl", hash = "sha256:ac509f7eccca54b2a29daeb516fb95b6f0bd0d0d8084efaf8ed5dfc7b9f0b357", size = 210127 },
|
| 363 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/03/0c/5fe86614ea050c3ecd728ab4035534387cd41e7c1855ef6c031f1ca93e3f/jiter-0.10.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5ed975b83a2b8639356151cef5c0d597c68376fc4922b45d0eb384ac058cfa00", size = 318527 },
|
| 364 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/b3/4a/4175a563579e884192ba6e81725fc0448b042024419be8d83aa8a80a3f44/jiter-0.10.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa96f2abba33dc77f79b4cf791840230375f9534e5fac927ccceb58c5e604a5", size = 354213 },
|
| 365 |
+
]
|
| 366 |
+
|
| 367 |
+
[[package]]
|
| 368 |
+
name = "markdown-it-py"
|
| 369 |
+
version = "4.0.0"
|
| 370 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 371 |
+
dependencies = [
|
| 372 |
+
{ name = "mdurl" },
|
| 373 |
+
]
|
| 374 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070 }
|
| 375 |
+
wheels = [
|
| 376 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321 },
|
| 377 |
+
]
|
| 378 |
+
|
| 379 |
+
[[package]]
|
| 380 |
+
name = "markupsafe"
|
| 381 |
+
version = "3.0.2"
|
| 382 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 383 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 }
|
| 384 |
+
wheels = [
|
| 385 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 },
|
| 386 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 },
|
| 387 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 },
|
| 388 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 },
|
| 389 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 },
|
| 390 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 },
|
| 391 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 },
|
| 392 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 },
|
| 393 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 },
|
| 394 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 },
|
| 395 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 },
|
| 396 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 },
|
| 397 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 },
|
| 398 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 },
|
| 399 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 },
|
| 400 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 },
|
| 401 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 },
|
| 402 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 },
|
| 403 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 },
|
| 404 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 },
|
| 405 |
+
]
|
| 406 |
+
|
| 407 |
+
[[package]]
|
| 408 |
+
name = "mdurl"
|
| 409 |
+
version = "0.1.2"
|
| 410 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 411 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 }
|
| 412 |
+
wheels = [
|
| 413 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 },
|
| 414 |
+
]
|
| 415 |
+
|
| 416 |
+
[[package]]
|
| 417 |
+
name = "openai"
|
| 418 |
+
version = "1.106.0"
|
| 419 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 420 |
+
dependencies = [
|
| 421 |
+
{ name = "anyio" },
|
| 422 |
+
{ name = "distro" },
|
| 423 |
+
{ name = "httpx" },
|
| 424 |
+
{ name = "jiter" },
|
| 425 |
+
{ name = "pydantic" },
|
| 426 |
+
{ name = "sniffio" },
|
| 427 |
+
{ name = "tqdm" },
|
| 428 |
+
{ name = "typing-extensions" },
|
| 429 |
+
]
|
| 430 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/11/3a/ef6c6842ea4df48453f5ff7b624178273d9137acb318afba3872a5f3da49/openai-1.106.0.tar.gz", hash = "sha256:8c5ae2ae61a619cd8ba22aeda8fdff00428280041eff5be5555287634ea6f460", size = 561133 }
|
| 431 |
+
wheels = [
|
| 432 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/01/66/465e4e8095becd1cd8c0a32283d530e7866f434031eafdc93cc1f04869d7/openai-1.106.0-py3-none-any.whl", hash = "sha256:47bf9d07df203cd2b7f90ac2da84aea40340dbdebb2da2f4f70e3a133c605d57", size = 930767 },
|
| 433 |
+
]
|
| 434 |
+
|
| 435 |
+
[[package]]
|
| 436 |
+
name = "protobuf"
|
| 437 |
+
version = "6.32.0"
|
| 438 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 439 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/c0/df/fb4a8eeea482eca989b51cffd274aac2ee24e825f0bf3cbce5281fa1567b/protobuf-6.32.0.tar.gz", hash = "sha256:a81439049127067fc49ec1d36e25c6ee1d1a2b7be930675f919258d03c04e7d2", size = 440614 }
|
| 440 |
+
wheels = [
|
| 441 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/33/18/df8c87da2e47f4f1dcc5153a81cd6bca4e429803f4069a299e236e4dd510/protobuf-6.32.0-cp310-abi3-win32.whl", hash = "sha256:84f9e3c1ff6fb0308dbacb0950d8aa90694b0d0ee68e75719cb044b7078fe741", size = 424409 },
|
| 442 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/e1/59/0a820b7310f8139bd8d5a9388e6a38e1786d179d6f33998448609296c229/protobuf-6.32.0-cp310-abi3-win_amd64.whl", hash = "sha256:a8bdbb2f009cfc22a36d031f22a625a38b615b5e19e558a7b756b3279723e68e", size = 435735 },
|
| 443 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/cc/5b/0d421533c59c789e9c9894683efac582c06246bf24bb26b753b149bd88e4/protobuf-6.32.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d52691e5bee6c860fff9a1c86ad26a13afbeb4b168cd4445c922b7e2cf85aaf0", size = 426449 },
|
| 444 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/ec/7b/607764ebe6c7a23dcee06e054fd1de3d5841b7648a90fd6def9a3bb58c5e/protobuf-6.32.0-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:501fe6372fd1c8ea2a30b4d9be8f87955a64d6be9c88a973996cef5ef6f0abf1", size = 322869 },
|
| 445 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/40/01/2e730bd1c25392fc32e3268e02446f0d77cb51a2c3a8486b1798e34d5805/protobuf-6.32.0-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:75a2aab2bd1aeb1f5dc7c5f33bcb11d82ea8c055c9becbb41c26a8c43fd7092c", size = 322009 },
|
| 446 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/9c/f2/80ffc4677aac1bc3519b26bc7f7f5de7fce0ee2f7e36e59e27d8beb32dd1/protobuf-6.32.0-py3-none-any.whl", hash = "sha256:ba377e5b67b908c8f3072a57b63e2c6a4cbd18aea4ed98d2584350dbf46f2783", size = 169287 },
|
| 447 |
+
]
|
| 448 |
+
|
| 449 |
+
[[package]]
|
| 450 |
+
name = "pydantic"
|
| 451 |
+
version = "2.11.7"
|
| 452 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 453 |
+
dependencies = [
|
| 454 |
+
{ name = "annotated-types" },
|
| 455 |
+
{ name = "pydantic-core" },
|
| 456 |
+
{ name = "typing-extensions" },
|
| 457 |
+
{ name = "typing-inspection" },
|
| 458 |
+
]
|
| 459 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350 }
|
| 460 |
+
wheels = [
|
| 461 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782 },
|
| 462 |
+
]
|
| 463 |
+
|
| 464 |
+
[package.optional-dependencies]
|
| 465 |
+
email = [
|
| 466 |
+
{ name = "email-validator" },
|
| 467 |
+
]
|
| 468 |
+
|
| 469 |
+
[[package]]
|
| 470 |
+
name = "pydantic-core"
|
| 471 |
+
version = "2.33.2"
|
| 472 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 473 |
+
dependencies = [
|
| 474 |
+
{ name = "typing-extensions" },
|
| 475 |
+
]
|
| 476 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195 }
|
| 477 |
+
wheels = [
|
| 478 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688 },
|
| 479 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808 },
|
| 480 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580 },
|
| 481 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859 },
|
| 482 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810 },
|
| 483 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498 },
|
| 484 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611 },
|
| 485 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924 },
|
| 486 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196 },
|
| 487 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389 },
|
| 488 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223 },
|
| 489 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473 },
|
| 490 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269 },
|
| 491 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921 },
|
| 492 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162 },
|
| 493 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560 },
|
| 494 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777 },
|
| 495 |
+
]
|
| 496 |
+
|
| 497 |
+
[[package]]
|
| 498 |
+
name = "pygments"
|
| 499 |
+
version = "2.19.2"
|
| 500 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 501 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631 }
|
| 502 |
+
wheels = [
|
| 503 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217 },
|
| 504 |
+
]
|
| 505 |
+
|
| 506 |
+
[[package]]
|
| 507 |
+
name = "python-dotenv"
|
| 508 |
+
version = "1.1.1"
|
| 509 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 510 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978 }
|
| 511 |
+
wheels = [
|
| 512 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556 },
|
| 513 |
+
]
|
| 514 |
+
|
| 515 |
+
[[package]]
|
| 516 |
+
name = "python-multipart"
|
| 517 |
+
version = "0.0.20"
|
| 518 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 519 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158 }
|
| 520 |
+
wheels = [
|
| 521 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546 },
|
| 522 |
+
]
|
| 523 |
+
|
| 524 |
+
[[package]]
|
| 525 |
+
name = "pyyaml"
|
| 526 |
+
version = "6.0.2"
|
| 527 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 528 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 }
|
| 529 |
+
wheels = [
|
| 530 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 },
|
| 531 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 },
|
| 532 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 },
|
| 533 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 },
|
| 534 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 },
|
| 535 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 },
|
| 536 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 },
|
| 537 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 },
|
| 538 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 },
|
| 539 |
+
]
|
| 540 |
+
|
| 541 |
+
[[package]]
|
| 542 |
+
name = "requests"
|
| 543 |
+
version = "2.32.5"
|
| 544 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 545 |
+
dependencies = [
|
| 546 |
+
{ name = "certifi" },
|
| 547 |
+
{ name = "charset-normalizer" },
|
| 548 |
+
{ name = "idna" },
|
| 549 |
+
{ name = "urllib3" },
|
| 550 |
+
]
|
| 551 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517 }
|
| 552 |
+
wheels = [
|
| 553 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738 },
|
| 554 |
+
]
|
| 555 |
+
|
| 556 |
+
[[package]]
|
| 557 |
+
name = "rich"
|
| 558 |
+
version = "14.1.0"
|
| 559 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 560 |
+
dependencies = [
|
| 561 |
+
{ name = "markdown-it-py" },
|
| 562 |
+
{ name = "pygments" },
|
| 563 |
+
]
|
| 564 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/fe/75/af448d8e52bf1d8fa6a9d089ca6c07ff4453d86c65c145d0a300bb073b9b/rich-14.1.0.tar.gz", hash = "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8", size = 224441 }
|
| 565 |
+
wheels = [
|
| 566 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl", hash = "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f", size = 243368 },
|
| 567 |
+
]
|
| 568 |
+
|
| 569 |
+
[[package]]
|
| 570 |
+
name = "rich-toolkit"
|
| 571 |
+
version = "0.15.0"
|
| 572 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 573 |
+
dependencies = [
|
| 574 |
+
{ name = "click" },
|
| 575 |
+
{ name = "rich" },
|
| 576 |
+
{ name = "typing-extensions" },
|
| 577 |
+
]
|
| 578 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/65/36/cdb3d51371ad0cccbf1541506304783bd72d55790709b8eb68c0d401a13a/rich_toolkit-0.15.0.tar.gz", hash = "sha256:3f5730e9f2d36d0bfe01cf723948b7ecf4cc355d2b71e2c00e094f7963128c09", size = 115118 }
|
| 579 |
+
wheels = [
|
| 580 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/75/e4/b0794eefb3cf78566b15e5bf576492c1d4a92ce5f6da55675bc11e9ef5d8/rich_toolkit-0.15.0-py3-none-any.whl", hash = "sha256:ddb91008283d4a7989fd8ff0324a48773a7a2276229c6a3070755645538ef1bb", size = 29062 },
|
| 581 |
+
]
|
| 582 |
+
|
| 583 |
+
[[package]]
|
| 584 |
+
name = "rignore"
|
| 585 |
+
version = "0.6.4"
|
| 586 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 587 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/73/46/05a94dc55ac03cf931d18e43b86ecee5ee054cb88b7853fffd741e35009c/rignore-0.6.4.tar.gz", hash = "sha256:e893fdd2d7fdcfa9407d0b7600ef2c2e2df97f55e1c45d4a8f54364829ddb0ab", size = 11633 }
|
| 588 |
+
wheels = [
|
| 589 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/db/a3/edd7d0d5cc0720de132b6651cef95ee080ce5fca11c77d8a47db848e5f90/rignore-0.6.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2b3b1e266ce45189240d14dfa1057f8013ea34b9bc8b3b44125ec8d25fdb3985", size = 885304 },
|
| 590 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/93/a1/d8d2fb97a6548307507d049b7e93885d4a0dfa1c907af5983fd9f9362a21/rignore-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45fe803628cc14714df10e8d6cdc23950a47eb9eb37dfea9a4779f4c672d2aa0", size = 818799 },
|
| 591 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/b1/cd/949981fcc180ad5ba7b31c52e78b74b2dea6b7bf744ad4c0c4b212f6da78/rignore-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e439f034277a947a4126e2da79dbb43e33d73d7c09d3d72a927e02f8a16f59aa", size = 892024 },
|
| 592 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/b0/d3/9042d701a8062d9c88f87760bbc2695ee2c23b3f002d34486b72a85f8efe/rignore-0.6.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:84b5121650ae24621154c7bdba8b8970b0739d8146505c9f38e0cda9385d1004", size = 871430 },
|
| 593 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/eb/50/3370249b984212b7355f3d9241aa6d02e706067c6d194a2614dfbc0f5b27/rignore-0.6.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52b0957b585ab48a445cf8ac1dbc33a272ab060835e583b4f95aa8c67c23fb2b", size = 1160559 },
|
| 594 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/6c/6f/2ad7f925838091d065524f30a8abda846d1813eee93328febf262b5cda21/rignore-0.6.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50359e0d5287b5e2743bd2f2fbf05df619c8282fd3af12f6628ff97b9675551d", size = 939947 },
|
| 595 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/1f/01/626ec94d62475ae7ef8b00ef98cea61cbea52a389a666703c97c4673d406/rignore-0.6.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe18096dcb1596757dfe0b412aab6d32564473ae7ee58dea0a8b4be5b1a2e3b", size = 949471 },
|
| 596 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/e8/c3/699c4f03b3c46f4b5c02f17a0a339225da65aad547daa5b03001e7c6a382/rignore-0.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b79c212d9990a273ad91e8d9765e1766ef6ecedd3be65375d786a252762ba385", size = 974912 },
|
| 597 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/cd/35/04626c12f9f92a9fc789afc2be32838a5d9b23b6fa8b2ad4a8625638d15b/rignore-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6ffa7f2a8894c65aa5dc4e8ac8bbdf39a326c0c6589efd27686cfbb48f0197d", size = 1067281 },
|
| 598 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/fe/9c/8f17baf3b984afea151cb9094716f6f1fb8e8737db97fc6eb6d494bd0780/rignore-0.6.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a63f5720dffc8d8fb0a4d02fafb8370a4031ebf3f99a4e79f334a91e905b7349", size = 1134414 },
|
| 599 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/10/88/ef84ffa916a96437c12cefcc39d474122da9626d75e3a2ebe09ec5d32f1b/rignore-0.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ce33982da47ac5dc09d19b04fa8d7c9aa6292fc0bd1ecf33076989faa8886094", size = 1109330 },
|
| 600 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/27/43/2ada5a2ec03b82e903610a1c483f516f78e47700ee6db9823f739e08b3af/rignore-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d899621867aa266824fbd9150e298f19d25b93903ef0133c09f70c65a3416eca", size = 1120381 },
|
| 601 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/3b/99/e7bcc643085131cb14dbea772def72bf1f6fe9037171ebe177c4f228abc8/rignore-0.6.4-cp313-cp313-win32.whl", hash = "sha256:d0615a6bf4890ec5a90b5fb83666822088fbd4e8fcd740c386fcce51e2f6feea", size = 641761 },
|
| 602 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/d9/25/7798908044f27dea1a8abdc75c14523e33770137651e5f775a15143f4218/rignore-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:145177f0e32716dc2f220b07b3cde2385b994b7ea28d5c96fbec32639e9eac6f", size = 719876 },
|
| 603 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/b4/e3/ae1e30b045bf004ad77bbd1679b9afff2be8edb166520921c6f29420516a/rignore-0.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e55bf8f9bbd186f58ab646b4a08718c77131d28a9004e477612b0cbbd5202db2", size = 891776 },
|
| 604 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/45/a9/1193e3bc23ca0e6eb4f17cf4b99971237f97cfa6f241d98366dff90a6d09/rignore-0.6.4-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2521f7bf3ee1f2ab22a100a3a4eed39a97b025804e5afe4323528e9ce8f084a5", size = 871442 },
|
| 605 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/20/83/4c52ae429a0b2e1ce667e35b480e9a6846f9468c443baeaed5d775af9485/rignore-0.6.4-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cc35773a8a9c119359ef974d0856988d4601d4daa6f532c05f66b4587cf35bc", size = 1159844 },
|
| 606 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/c1/2f/c740f5751f464c937bfe252dc15a024ae081352cfe80d94aa16d6a617482/rignore-0.6.4-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b665b1ea14457d7b49e834baabc635a3b8c10cfb5cca5c21161fabdbfc2b850e", size = 939456 },
|
| 607 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/fc/dd/68dbb08ac0edabf44dd144ff546a3fb0253c5af708e066847df39fc9188f/rignore-0.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c7fd339f344a8548724f289495b835bed7b81174a0bc1c28c6497854bd8855db", size = 1067070 },
|
| 608 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/3b/3a/7e7ea6f0d31d3f5beb0f2cf2c4c362672f5f7f125714458673fc579e2bed/rignore-0.6.4-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:91dc94b1cc5af8d6d25ce6edd29e7351830f19b0a03b75cb3adf1f76d00f3007", size = 1134598 },
|
| 609 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/7e/06/1b3307f6437d29bede5a95738aa89e6d910ba68d4054175c9f60d8e2c6b1/rignore-0.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4d1918221a249e5342b60fd5fa513bf3d6bf272a8738e66023799f0c82ecd788", size = 1108862 },
|
| 610 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/b0/d5/b37c82519f335f2c472a63fc6215c6f4c51063ecf3166e3acf508011afbd/rignore-0.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:240777332b859dc89dcba59ab6e3f1e062bc8e862ffa3e5f456e93f7fd5cb415", size = 1120002 },
|
| 611 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/ac/72/2f05559ed5e69bdfdb56ea3982b48e6c0017c59f7241f7e1c5cae992b347/rignore-0.6.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b0e548753e55cc648f1e7b02d9f74285fe48bb49cec93643d31e563773ab3f", size = 949454 },
|
| 612 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/0b/92/186693c8f838d670510ac1dfb35afbe964320fbffb343ba18f3d24441941/rignore-0.6.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6971ac9fdd5a0bd299a181096f091c4f3fd286643adceba98eccc03c688a6637", size = 974663 },
|
| 613 |
+
]
|
| 614 |
+
|
| 615 |
+
[[package]]
|
| 616 |
+
name = "sentry-sdk"
|
| 617 |
+
version = "2.35.0"
|
| 618 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 619 |
+
dependencies = [
|
| 620 |
+
{ name = "certifi" },
|
| 621 |
+
{ name = "urllib3" },
|
| 622 |
+
]
|
| 623 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/31/83/055dc157b719651ef13db569bb8cf2103df11174478649735c1b2bf3f6bc/sentry_sdk-2.35.0.tar.gz", hash = "sha256:5ea58d352779ce45d17bc2fa71ec7185205295b83a9dbb5707273deb64720092", size = 343014 }
|
| 624 |
+
wheels = [
|
| 625 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/36/3d/742617a7c644deb0c1628dcf6bb2d2165ab7c6aab56fe5222758994007f8/sentry_sdk-2.35.0-py2.py3-none-any.whl", hash = "sha256:6e0c29b9a5d34de8575ffb04d289a987ff3053cf2c98ede445bea995e3830263", size = 363806 },
|
| 626 |
+
]
|
| 627 |
+
|
| 628 |
+
[[package]]
|
| 629 |
+
name = "setuptools"
|
| 630 |
+
version = "80.9.0"
|
| 631 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 632 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958 }
|
| 633 |
+
wheels = [
|
| 634 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486 },
|
| 635 |
+
]
|
| 636 |
+
|
| 637 |
+
[[package]]
|
| 638 |
+
name = "shellingham"
|
| 639 |
+
version = "1.5.4"
|
| 640 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 641 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 }
|
| 642 |
+
wheels = [
|
| 643 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 },
|
| 644 |
+
]
|
| 645 |
+
|
| 646 |
+
[[package]]
|
| 647 |
+
name = "sniffio"
|
| 648 |
+
version = "1.3.1"
|
| 649 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 650 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 }
|
| 651 |
+
wheels = [
|
| 652 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 },
|
| 653 |
+
]
|
| 654 |
+
|
| 655 |
+
[[package]]
|
| 656 |
+
name = "starlette"
|
| 657 |
+
version = "0.47.2"
|
| 658 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 659 |
+
dependencies = [
|
| 660 |
+
{ name = "anyio" },
|
| 661 |
+
]
|
| 662 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/04/57/d062573f391d062710d4088fa1369428c38d51460ab6fedff920efef932e/starlette-0.47.2.tar.gz", hash = "sha256:6ae9aa5db235e4846decc1e7b79c4f346adf41e9777aebeb49dfd09bbd7023d8", size = 2583948 }
|
| 663 |
+
wheels = [
|
| 664 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/f7/1f/b876b1f83aef204198a42dc101613fefccb32258e5428b5f9259677864b4/starlette-0.47.2-py3-none-any.whl", hash = "sha256:c5847e96134e5c5371ee9fac6fdf1a67336d5815e09eb2a01fdb57a351ef915b", size = 72984 },
|
| 665 |
+
]
|
| 666 |
+
|
| 667 |
+
[[package]]
|
| 668 |
+
name = "tqdm"
|
| 669 |
+
version = "4.67.1"
|
| 670 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 671 |
+
dependencies = [
|
| 672 |
+
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
| 673 |
+
]
|
| 674 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 }
|
| 675 |
+
wheels = [
|
| 676 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 },
|
| 677 |
+
]
|
| 678 |
+
|
| 679 |
+
[[package]]
|
| 680 |
+
name = "typer"
|
| 681 |
+
version = "0.16.0"
|
| 682 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 683 |
+
dependencies = [
|
| 684 |
+
{ name = "click" },
|
| 685 |
+
{ name = "rich" },
|
| 686 |
+
{ name = "shellingham" },
|
| 687 |
+
{ name = "typing-extensions" },
|
| 688 |
+
]
|
| 689 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/c5/8c/7d682431efca5fd290017663ea4588bf6f2c6aad085c7f108c5dbc316e70/typer-0.16.0.tar.gz", hash = "sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b", size = 102625 }
|
| 690 |
+
wheels = [
|
| 691 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/76/42/3efaf858001d2c2913de7f354563e3a3a2f0decae3efe98427125a8f441e/typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855", size = 46317 },
|
| 692 |
+
]
|
| 693 |
+
|
| 694 |
+
[[package]]
|
| 695 |
+
name = "typing-extensions"
|
| 696 |
+
version = "4.14.1"
|
| 697 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 698 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673 }
|
| 699 |
+
wheels = [
|
| 700 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906 },
|
| 701 |
+
]
|
| 702 |
+
|
| 703 |
+
[[package]]
|
| 704 |
+
name = "typing-inspection"
|
| 705 |
+
version = "0.4.1"
|
| 706 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 707 |
+
dependencies = [
|
| 708 |
+
{ name = "typing-extensions" },
|
| 709 |
+
]
|
| 710 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726 }
|
| 711 |
+
wheels = [
|
| 712 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552 },
|
| 713 |
+
]
|
| 714 |
+
|
| 715 |
+
[[package]]
|
| 716 |
+
name = "urllib3"
|
| 717 |
+
version = "2.5.0"
|
| 718 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 719 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185 }
|
| 720 |
+
wheels = [
|
| 721 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795 },
|
| 722 |
+
]
|
| 723 |
+
|
| 724 |
+
[[package]]
|
| 725 |
+
name = "uvicorn"
|
| 726 |
+
version = "0.35.0"
|
| 727 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 728 |
+
dependencies = [
|
| 729 |
+
{ name = "click" },
|
| 730 |
+
{ name = "h11" },
|
| 731 |
+
]
|
| 732 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/5e/42/e0e305207bb88c6b8d3061399c6a961ffe5fbb7e2aa63c9234df7259e9cd/uvicorn-0.35.0.tar.gz", hash = "sha256:bc662f087f7cf2ce11a1d7fd70b90c9f98ef2e2831556dd078d131b96cc94a01", size = 78473 }
|
| 733 |
+
wheels = [
|
| 734 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/d2/e2/dc81b1bd1dcfe91735810265e9d26bc8ec5da45b4c0f6237e286819194c3/uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a", size = 66406 },
|
| 735 |
+
]
|
| 736 |
+
|
| 737 |
+
[package.optional-dependencies]
|
| 738 |
+
standard = [
|
| 739 |
+
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
| 740 |
+
{ name = "httptools" },
|
| 741 |
+
{ name = "python-dotenv" },
|
| 742 |
+
{ name = "pyyaml" },
|
| 743 |
+
{ name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" },
|
| 744 |
+
{ name = "watchfiles" },
|
| 745 |
+
{ name = "websockets" },
|
| 746 |
+
]
|
| 747 |
+
|
| 748 |
+
[[package]]
|
| 749 |
+
name = "uvloop"
|
| 750 |
+
version = "0.21.0"
|
| 751 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 752 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741 }
|
| 753 |
+
wheels = [
|
| 754 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123 },
|
| 755 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325 },
|
| 756 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806 },
|
| 757 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068 },
|
| 758 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428 },
|
| 759 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018 },
|
| 760 |
+
]
|
| 761 |
+
|
| 762 |
+
[[package]]
|
| 763 |
+
name = "warptestui"
|
| 764 |
+
version = "0.1.0"
|
| 765 |
+
source = { virtual = "." }
|
| 766 |
+
dependencies = [
|
| 767 |
+
{ name = "fastapi", extra = ["standard"] },
|
| 768 |
+
{ name = "grpcio-tools" },
|
| 769 |
+
{ name = "httpx", extra = ["http2"] },
|
| 770 |
+
{ name = "openai" },
|
| 771 |
+
{ name = "protobuf" },
|
| 772 |
+
{ name = "python-dotenv" },
|
| 773 |
+
{ name = "requests" },
|
| 774 |
+
{ name = "uvicorn", extra = ["standard"] },
|
| 775 |
+
{ name = "websockets" },
|
| 776 |
+
]
|
| 777 |
+
|
| 778 |
+
[package.metadata]
|
| 779 |
+
requires-dist = [
|
| 780 |
+
{ name = "fastapi", extras = ["standard"] },
|
| 781 |
+
{ name = "grpcio-tools" },
|
| 782 |
+
{ name = "httpx", extras = ["http2"] },
|
| 783 |
+
{ name = "openai", specifier = ">=1.106.0" },
|
| 784 |
+
{ name = "protobuf" },
|
| 785 |
+
{ name = "python-dotenv" },
|
| 786 |
+
{ name = "requests", specifier = ">=2.32.5" },
|
| 787 |
+
{ name = "uvicorn", extras = ["standard"] },
|
| 788 |
+
{ name = "websockets", specifier = ">=15.0.1" },
|
| 789 |
+
]
|
| 790 |
+
|
| 791 |
+
[[package]]
|
| 792 |
+
name = "watchfiles"
|
| 793 |
+
version = "1.1.0"
|
| 794 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 795 |
+
dependencies = [
|
| 796 |
+
{ name = "anyio" },
|
| 797 |
+
]
|
| 798 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/2a/9a/d451fcc97d029f5812e898fd30a53fd8c15c7bbd058fd75cfc6beb9bd761/watchfiles-1.1.0.tar.gz", hash = "sha256:693ed7ec72cbfcee399e92c895362b6e66d63dac6b91e2c11ae03d10d503e575", size = 94406 }
|
| 799 |
+
wheels = [
|
| 800 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/d3/42/fae874df96595556a9089ade83be34a2e04f0f11eb53a8dbf8a8a5e562b4/watchfiles-1.1.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5007f860c7f1f8df471e4e04aaa8c43673429047d63205d1630880f7637bca30", size = 402004 },
|
| 801 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/fa/55/a77e533e59c3003d9803c09c44c3651224067cbe7fb5d574ddbaa31e11ca/watchfiles-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:20ecc8abbd957046f1fe9562757903f5eaf57c3bce70929fda6c7711bb58074a", size = 393671 },
|
| 802 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/05/68/b0afb3f79c8e832e6571022611adbdc36e35a44e14f129ba09709aa4bb7a/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2f0498b7d2a3c072766dba3274fe22a183dbea1f99d188f1c6c72209a1063dc", size = 449772 },
|
| 803 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/ff/05/46dd1f6879bc40e1e74c6c39a1b9ab9e790bf1f5a2fe6c08b463d9a807f4/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:239736577e848678e13b201bba14e89718f5c2133dfd6b1f7846fa1b58a8532b", size = 456789 },
|
| 804 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/8b/ca/0eeb2c06227ca7f12e50a47a3679df0cd1ba487ea19cf844a905920f8e95/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eff4b8d89f444f7e49136dc695599a591ff769300734446c0a86cba2eb2f9895", size = 482551 },
|
| 805 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/31/47/2cecbd8694095647406645f822781008cc524320466ea393f55fe70eed3b/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12b0a02a91762c08f7264e2e79542f76870c3040bbc847fb67410ab81474932a", size = 597420 },
|
| 806 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/d9/7e/82abc4240e0806846548559d70f0b1a6dfdca75c1b4f9fa62b504ae9b083/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29e7bc2eee15cbb339c68445959108803dc14ee0c7b4eea556400131a8de462b", size = 477950 },
|
| 807 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/25/0d/4d564798a49bf5482a4fa9416dea6b6c0733a3b5700cb8a5a503c4b15853/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9481174d3ed982e269c090f780122fb59cee6c3796f74efe74e70f7780ed94c", size = 451706 },
|
| 808 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/81/b5/5516cf46b033192d544102ea07c65b6f770f10ed1d0a6d388f5d3874f6e4/watchfiles-1.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:80f811146831c8c86ab17b640801c25dc0a88c630e855e2bef3568f30434d52b", size = 625814 },
|
| 809 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/0c/dd/7c1331f902f30669ac3e754680b6edb9a0dd06dea5438e61128111fadd2c/watchfiles-1.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:60022527e71d1d1fda67a33150ee42869042bce3d0fcc9cc49be009a9cded3fb", size = 622820 },
|
| 810 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/1b/14/36d7a8e27cd128d7b1009e7715a7c02f6c131be9d4ce1e5c3b73d0e342d8/watchfiles-1.1.0-cp313-cp313-win32.whl", hash = "sha256:32d6d4e583593cb8576e129879ea0991660b935177c0f93c6681359b3654bfa9", size = 279194 },
|
| 811 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/25/41/2dd88054b849aa546dbeef5696019c58f8e0774f4d1c42123273304cdb2e/watchfiles-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:f21af781a4a6fbad54f03c598ab620e3a77032c5878f3d780448421a6e1818c7", size = 292349 },
|
| 812 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/c8/cf/421d659de88285eb13941cf11a81f875c176f76a6d99342599be88e08d03/watchfiles-1.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:5366164391873ed76bfdf618818c82084c9db7fac82b64a20c44d335eec9ced5", size = 283836 },
|
| 813 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/45/10/6faf6858d527e3599cc50ec9fcae73590fbddc1420bd4fdccfebffeedbc6/watchfiles-1.1.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:17ab167cca6339c2b830b744eaf10803d2a5b6683be4d79d8475d88b4a8a4be1", size = 400343 },
|
| 814 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/03/20/5cb7d3966f5e8c718006d0e97dfe379a82f16fecd3caa7810f634412047a/watchfiles-1.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:328dbc9bff7205c215a7807da7c18dce37da7da718e798356212d22696404339", size = 392916 },
|
| 815 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/8c/07/d8f1176328fa9e9581b6f120b017e286d2a2d22ae3f554efd9515c8e1b49/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7208ab6e009c627b7557ce55c465c98967e8caa8b11833531fdf95799372633", size = 449582 },
|
| 816 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/66/e8/80a14a453cf6038e81d072a86c05276692a1826471fef91df7537dba8b46/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a8f6f72974a19efead54195bc9bed4d850fc047bb7aa971268fd9a8387c89011", size = 456752 },
|
| 817 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/5a/25/0853b3fe0e3c2f5af9ea60eb2e781eade939760239a72c2d38fc4cc335f6/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d181ef50923c29cf0450c3cd47e2f0557b62218c50b2ab8ce2ecaa02bd97e670", size = 481436 },
|
| 818 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/fe/9e/4af0056c258b861fbb29dcb36258de1e2b857be4a9509e6298abcf31e5c9/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adb4167043d3a78280d5d05ce0ba22055c266cf8655ce942f2fb881262ff3cdf", size = 596016 },
|
| 819 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/c5/fa/95d604b58aa375e781daf350897aaaa089cff59d84147e9ccff2447c8294/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5701dc474b041e2934a26d31d39f90fac8a3dee2322b39f7729867f932b1d4", size = 476727 },
|
| 820 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/65/95/fe479b2664f19be4cf5ceeb21be05afd491d95f142e72d26a42f41b7c4f8/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b067915e3c3936966a8607f6fe5487df0c9c4afb85226613b520890049deea20", size = 451864 },
|
| 821 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/d3/8a/3c4af14b93a15ce55901cd7a92e1a4701910f1768c78fb30f61d2b79785b/watchfiles-1.1.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:9c733cda03b6d636b4219625a4acb5c6ffb10803338e437fb614fef9516825ef", size = 625626 },
|
| 822 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/da/f5/cf6aa047d4d9e128f4b7cde615236a915673775ef171ff85971d698f3c2c/watchfiles-1.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:cc08ef8b90d78bfac66f0def80240b0197008e4852c9f285907377b2947ffdcb", size = 622744 },
|
| 823 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/2c/00/70f75c47f05dea6fd30df90f047765f6fc2d6eb8b5a3921379b0b04defa2/watchfiles-1.1.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:9974d2f7dc561cce3bb88dfa8eb309dab64c729de85fba32e98d75cf24b66297", size = 402114 },
|
| 824 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/53/03/acd69c48db4a1ed1de26b349d94077cca2238ff98fd64393f3e97484cae6/watchfiles-1.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c68e9f1fcb4d43798ad8814c4c1b61547b014b667216cb754e606bfade587018", size = 393879 },
|
| 825 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/2f/c8/a9a2a6f9c8baa4eceae5887fecd421e1b7ce86802bcfc8b6a942e2add834/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95ab1594377effac17110e1352989bdd7bdfca9ff0e5eeccd8c69c5389b826d0", size = 450026 },
|
| 826 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/fe/51/d572260d98388e6e2b967425c985e07d47ee6f62e6455cefb46a6e06eda5/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fba9b62da882c1be1280a7584ec4515d0a6006a94d6e5819730ec2eab60ffe12", size = 457917 },
|
| 827 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/c6/2d/4258e52917bf9f12909b6ec314ff9636276f3542f9d3807d143f27309104/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3434e401f3ce0ed6b42569128b3d1e3af773d7ec18751b918b89cd49c14eaafb", size = 483602 },
|
| 828 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/84/99/bee17a5f341a4345fe7b7972a475809af9e528deba056f8963d61ea49f75/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa257a4d0d21fcbca5b5fcba9dca5a78011cb93c0323fb8855c6d2dfbc76eb77", size = 596758 },
|
| 829 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/40/76/e4bec1d59b25b89d2b0716b41b461ed655a9a53c60dc78ad5771fda5b3e6/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fd1b3879a578a8ec2076c7961076df540b9af317123f84569f5a9ddee64ce92", size = 477601 },
|
| 830 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/1f/fa/a514292956f4a9ce3c567ec0c13cce427c158e9f272062685a8a727d08fc/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62cc7a30eeb0e20ecc5f4bd113cd69dcdb745a07c68c0370cea919f373f65d9e", size = 451936 },
|
| 831 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/32/5d/c3bf927ec3bbeb4566984eba8dd7a8eb69569400f5509904545576741f88/watchfiles-1.1.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:891c69e027748b4a73847335d208e374ce54ca3c335907d381fde4e41661b13b", size = 626243 },
|
| 832 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/e6/65/6e12c042f1a68c556802a84d54bb06d35577c81e29fba14019562479159c/watchfiles-1.1.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:12fe8eaffaf0faa7906895b4f8bb88264035b3f0243275e0bf24af0436b27259", size = 623073 },
|
| 833 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/89/ab/7f79d9bf57329e7cbb0a6fd4c7bd7d0cee1e4a8ef0041459f5409da3506c/watchfiles-1.1.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:bfe3c517c283e484843cb2e357dd57ba009cff351edf45fb455b5fbd1f45b15f", size = 400872 },
|
| 834 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/df/d5/3f7bf9912798e9e6c516094db6b8932df53b223660c781ee37607030b6d3/watchfiles-1.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a9ccbf1f129480ed3044f540c0fdbc4ee556f7175e5ab40fe077ff6baf286d4e", size = 392877 },
|
| 835 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/0d/c5/54ec7601a2798604e01c75294770dbee8150e81c6e471445d7601610b495/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba0e3255b0396cac3cc7bbace76404dd72b5438bf0d8e7cefa2f79a7f3649caa", size = 449645 },
|
| 836 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/0a/04/c2f44afc3b2fce21ca0b7802cbd37ed90a29874f96069ed30a36dfe57c2b/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4281cd9fce9fc0a9dbf0fc1217f39bf9cf2b4d315d9626ef1d4e87b84699e7e8", size = 457424 },
|
| 837 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/9f/b0/eec32cb6c14d248095261a04f290636da3df3119d4040ef91a4a50b29fa5/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d2404af8db1329f9a3c9b79ff63e0ae7131986446901582067d9304ae8aaf7f", size = 481584 },
|
| 838 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/d1/e2/ca4bb71c68a937d7145aa25709e4f5d68eb7698a25ce266e84b55d591bbd/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e78b6ed8165996013165eeabd875c5dfc19d41b54f94b40e9fff0eb3193e5e8e", size = 596675 },
|
| 839 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/a1/dd/b0e4b7fb5acf783816bc950180a6cd7c6c1d2cf7e9372c0ea634e722712b/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:249590eb75ccc117f488e2fabd1bfa33c580e24b96f00658ad88e38844a040bb", size = 477363 },
|
| 840 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/69/c4/088825b75489cb5b6a761a4542645718893d395d8c530b38734f19da44d2/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d05686b5487cfa2e2c28ff1aa370ea3e6c5accfe6435944ddea1e10d93872147", size = 452240 },
|
| 841 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/10/8c/22b074814970eeef43b7c44df98c3e9667c1f7bf5b83e0ff0201b0bd43f9/watchfiles-1.1.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:d0e10e6f8f6dc5762adee7dece33b722282e1f59aa6a55da5d493a97282fedd8", size = 625607 },
|
| 842 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/32/fa/a4f5c2046385492b2273213ef815bf71a0d4c1943b784fb904e184e30201/watchfiles-1.1.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:af06c863f152005c7592df1d6a7009c836a247c9d8adb78fef8575a5a98699db", size = 623315 },
|
| 843 |
+
]
|
| 844 |
+
|
| 845 |
+
[[package]]
|
| 846 |
+
name = "websockets"
|
| 847 |
+
version = "15.0.1"
|
| 848 |
+
source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" }
|
| 849 |
+
sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016 }
|
| 850 |
+
wheels = [
|
| 851 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440 },
|
| 852 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098 },
|
| 853 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329 },
|
| 854 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111 },
|
| 855 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054 },
|
| 856 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496 },
|
| 857 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829 },
|
| 858 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217 },
|
| 859 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195 },
|
| 860 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393 },
|
| 861 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837 },
|
| 862 |
+
{ url = "https://mirrors.ustc.edu.cn/pypi/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743 },
|
| 863 |
+
]
|
warp2protobuf/__init__.py
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Re-exported compatibility package for legacy src.* modules
|
| 2 |
+
# This package proxies to existing code under src to enable gradual migration.
|
| 3 |
+
|
| 4 |
+
__all__ = []
|
warp2protobuf/__pycache__/__init__.cpython-312.pyc
ADDED
|
Binary file (162 Bytes). View file
|
|
|
warp2protobuf/__pycache__/__init__.cpython-313.pyc
ADDED
|
Binary file (163 Bytes). View file
|
|
|
warp2protobuf/api/__init__.py
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# API subpackage for warp2protobuf
|
| 2 |
+
|
| 3 |
+
__all__ = []
|
warp2protobuf/api/__pycache__/__init__.cpython-312.pyc
ADDED
|
Binary file (166 Bytes). View file
|
|
|
warp2protobuf/api/__pycache__/__init__.cpython-313.pyc
ADDED
|
Binary file (167 Bytes). View file
|
|
|
warp2protobuf/api/__pycache__/protobuf_routes.cpython-312.pyc
ADDED
|
Binary file (20.6 kB). View file
|
|
|