This release is a pre-release and may not be stable for production use.
quapp-common
Quapp common library supporting Quapp Platform for Quantum Computing.
Overview
quapp-common is a Python library designed to support the Quapp Platform for
Quantum Computing by providing common utilities, configurations, and
abstractions for working with
quantum providers and devices.
Recent improvements add first-class asynchronous job processing with a
cross-process JobManager,
background task execution, and standardized result models for immediate client
responses while work continues in the background.
Features
- Provider and device factory for quantum computing platforms.
- Logging and configuration utilities with improved and detailed log messages.
- Support for AWS Braket, OQC Cloud, Qiskit, PennyLane, DWave Ocean, and Quapp quantum simulators.
- Refactored classes and utilities to remove tenant-specific request, response, and promise classes.
- Standardized naming by renaming
ProjectHeadertoCustomHeader. - Enhanced error handling and job metadata update mechanisms.
- Simplified and cleaner HTTP request/response logging and URL parsing utilities.
- Asynchronous job processing:
- AsyncInvocationTask to run handlers in a background thread pool and return immediate responses.
- JobManager for cross-process job registry with atomic add/update/get and pub-sub updates.
- Standard Event/Result (Success, Error) models for consistent async responses.
- Scheduler integration via callback URL; local updates are patched to the scheduler.
- Safety: updates to jobs already DONE/FAILED are ignored to prevent post-completion mutations.
- Multi-language SDK support:
- Language enum for validating and resolving Python, JavaScript, and Q# runtimes.
- Standalone
dispatch()function (formerlySubprocessDispatcherclass) to delegate tasks to non-Python runtimes via subprocess with timeout management and JSON payload processing; supports Node.js and precompiled Q# binary (./handler_runner_bin/Function[.exe]) runners. - Working directory configurable via
QUAPP_WORKING_DIRenvironment variable; falls back toos.getcwd()when unset. SubprocessBridgeclass integrating standalone dispatcher, circuit adapter, and result serializer for seamless JS/Q#-Python handler interaction.- Standalone
adapt()function (formerlyCircuitAdapterclass) for converting subprocess circuit outputs into native SDK formats (OpenQASM, QUBO, JSON) across Qiskit, Braket, PennyLane, PyQuil, Qibo, Qulacs, and CUDA Quantum. - Standalone
serialize()function (formerlyResultSerializerclass) for converting complex job results into JSON-serializable dictionaries for subprocess communication.
Installation
Install via pip:
pip install quapp-common
Notes:
- From version 0.0.11.dev7,
starletteis a direct dependency to support background execution helpers. - From version 0.0.12.dev1,
qiboanddimodare added as dependencies to support Qibo and D-Wave Ocean SDK integrations.
Recently Changes Highlights
v0.0.14.dev5 — Gỡ toàn bộ dependency SDK lượng tử
quapp-common không còn phụ thuộc SDK nào. SDK thuộc về lib con.
Gỡ khỏi dependencies — 6 package, chỉ được dùng trong circuit_adapter.py:
qiskit, pennylane, qibo, qulacs, dimod, pytket.
Còn lại: loguru, requests, numpy, matplotlib, pylatexenc, starlette
— đều được chính code của quapp-common dùng (matplotlib/pylatexenc cần cho
CircuitExportTask.__convert(), nơi gọi circuit.draw(output='mpl') rồi
savefig()).
circuit_adapter.py: import SDK lazy. Mỗi handler tự import SDK của nó ngay
trước khi dùng, qua helper _require(). Trước đây 7 SDK được import ở module
level, nên:
from quapp_common.component.bridge import SubprocessBridgeđòi có đủ cả 6 SDK cùng lúc, kể cả khi function chỉ chạy Qiskit. Điều này vô hiệu hoá thiết kế lazy-import củajs-*/index.pytrongquapp-sdk-templates— comment trong đó ghi rõ ý định "so the server can start even if optional dependencies are missing";- buộc mọi function image tải cả 6 SDK, và cài chung chúng gây xung đột version
thật (
pytket/lark,pennylane-rigetti/pyquil— xemrevert/pennylane-to-0.0.4.dev6trongqapp-pennylane).
_require() raise ModuleNotFoundError với thông điệp nêu tên package cần thêm
vào requirements.txt. Classifier map nó thành DEPENDENCY_MISSING nên user
nhận được hướng dẫn cụ thể thay vì traceback import.
tests/test_circuit_adapter.py: SDK được import trong từng test qua
pytest.importorskip. Trước đây file này import qiskit + qibo + qulacs ở
module level nên cả file không collect được nếu thiếu một SDK. Test
test_qulacs_falls_back_to_string_on_parse_error đổi target patch từ
circuit_adapter.QiskitCircuit (tên module-level đã bỏ) sang _load_qasm_circuit.
tests/test_no_sdk_dependency.py (mới) — khoá hồi quy bằng AST: quét từng
file, fail nếu có SDK nào được import ở module level; và đọc pyproject.toml,
fail nếu dependencies khai báo SDK.
Đã verify trong venv sạch không có SDK nào: 82/82 module import được, suite
300 passed / 7 skipped. Với venv chỉ có qiskit: 302 passed / 5 skipped.
Lib con cần bổ sung khai báo. Hai lib đang dựa vào
quapp-commonkéo hộ và sẽ vỡ đường OpenQASM sau bản này:
qapp-pyquil— thiếupytket(cần cho_openqasm_to_pyquil);quapp-qulacs— thiếuqiskit(cầu nối OpenQASM → Qulacs đi qua Qiskit).Ngoài ra
qapp-dwave-oceanimportmatplotlibtrực tiếp nhưng không khai báo; hiện vẫn chạy vìquapp-commoncòn giữmatplotlib, nên nên khai báo tường minh để không phụ thuộc may mắn.
pytket-braketvàpytket-pyquilchưa từng được khai báo ở đâu — code dùngimportlib.import_module()cho chúng từ trước. Cần thêm vàoqapp-braketvàqapp-pyquil.
v0.0.14.dev2 — Fix: log lỗi bị nhân đôi
-
Fix: mỗi lần lỗi phát hai dòng ERROR cùng
event=job_failed, mỗi dòng kèm một traceback riêng. Nguyên nhân:build_error_job_response()(thêm ở0.0.13.dev9) tự phát một dòng log tập trung, nhưng 10 call-site vẫn giữself.logger.exception(...)của chúng.Ngoài việc làm ồn Function Log và nhân đôi lượng traceback, nó làm sai metric nếu backend đếm
event=job_failedđể tính tỉ lệ job thất bại.Đã gỡ log ở 10 call-site trong
device.py,custom_device.py,invocation.py(×3),job_fetcher.py(×2),job_fetching.py(×2),post_processing_task.py. Dòng log tập trung mang nhiều thông tin hơn bản bị gỡ:event/category/error_code/phase+ full traceback.phase_failed(WARNING, mốc timeline) là event khác, không bị tính là trùng. -
Fix (security): credential lọt vào log text qua hai đường mà
redact()không chặn được:loguru diagnose=True(default) in giá trị biến cục bộ trong traceback dưới dạng└ 'value'. Không có tên key nênredact()— vốn matchkey: value— không mask. Token provider nằm trong biến cục bộ lọt nguyên. Đã setdiagnose=Falsecho sink text (backtrace=Truevẫn giữ: nó mở rộng call chain nhưng không in giá trị).- Placeholder
{exception}được loguru render trực tiếp từ exception object, không đi qua filter. Secret nằm trongstr(exception)— ví dụ response body của provider bị nhét vàoValueError— lọt nguyên. Sink text nay append traceback đã redact ởextra[_exc_text]thay cho placeholder đó.
Sink JSON không bị ảnh hưởng: nó đã dùng
_exc_textvàdiagnose=False. -
Docs: ghi rõ trong docstring nên chọn
QUAPP_LOG_FORMATnào. Với Grafana/Loki phải dùngjson: ở chế độtext, traceback là các dòng riêng không có prefix[ConsoleJobLog][<job_id>], nên filter theo job_id sẽ mất toàn bộ stack.bothghi mỗi record hai lần — chỉ dùng khi debug. -
Test: thêm
tests/test_log_secret_leak.py— 5 case, test qua sink THẬT doconfigure_logging()tạo (không introspect internals). Có một case khoá lại hành vidiagnose=Truecủa loguru, để nếu upstream đổi thì ta biết. -
Test: thêm
tests/test_error_log_dedupe.py— khoá hồi quy ở hai mức: đếm số dòngjob_failedkhi chạy thật, và quét source để bắt trường hợp ai đó thêm lạilogger.exception()ngay trướcbuild_error_job_response().Kèm test cho trường hợp nhiều job đồng thời: 4 job qua
run_in_threadpool+circuit_running_poolphải có số dòng log đều nhau, không job nào nhận log của job khác, vàphasegiữ được khi đi vào thread pool.
v0.0.14.dev1 — Error taxonomy & error envelope (Phase 1)
Tiếp nối Phase 0. Bổ sung phân loại lỗi có ngữ nghĩa và envelope dùng chung cho
Function Log lẫn Job Log. Additive: job_result chỉ thêm field error,
message và exception giữ nguyên; contract callback URL không đổi.
Taxonomy — hai chiều phân loại độc lập
enum/error_category.py:ErrorCategory13 giá trị, nhóm theo ai xử lý được (owner_of()→ USER / WORKSPACE_ADMIN / PROVIDER / PLATFORM).enum/runtime_phase.py:RuntimePhase9 giá trị. Tách đượcPROVIDER_INVOCATION/COMPILATION/EXECUTION— trước đây auth sai, transpile fail và provider từ chối job đều ra chung nhãnEXECUTION.PHASE_TO_STEPgiữ nguyên contractInvocationStepcủa callback URL.
Classifier (util/error_classifier.py) — tổ hợp 5 tín hiệu theo độ tin cậy:
phase— biết chắc từ context manager, không suy đoán;frame_owner()— code của ai, dựa vào đường dẫn frame sâu nhất (function/= user,quapp_*= platform,site-packages/= SDK);- tên class exception, đi hết cause chain qua cả
__cause__và__context__— cần thiết vì nhiều provider lib bọc lỗi bằngraise ValueError(...)trong khốiexceptmà không cófrom; - attribute đọc được: HTTP status, AWS error code, exit code, signal;
- message pattern (dùng cuối cùng).
register_rules() cho phép lib provider đăng ký rule đặc thù SDK khi import,
nên qapp-common không phải import qiskit/braket. Batch đăng ký sau được xét
trước; trong cùng batch giữ nguyên thứ tự. Rule ném lỗi bị bỏ qua chứ không làm
hỏng đường báo lỗi. 20 rule generic sẵn có.
Fallback nhiều tầng nên không bao giờ trả UNKNOWN một cách mù: không rule
nào khớp thì suy từ frame ownership, rồi tới phase.
Envelope (data/response/error_report.py) — job_result['error'] gồm
code, category, phase, owner, retryable, rootCause (type + detail +
file:line), causeChain, stackTrace (full, đã redact),
handlerStackTrace (stack JS/.NET cho handler không phải Python),
context, resolution (summary + steps + docUrl), retry, traceId.
log_fields() bind cùng vocabulary vào Function Log.
Timeline (config/log_context.py) — context manager phase() phát
phase_start / phase_end / phase_failed kèm duration_ms. Đây là dữ liệu
để UI vẽ timeline và chỉ ra job chết ở bước nào. phase_failed ở mức WARNING để
thấy được khi chạy LOG_LEVEL=INFO.
_FAILED_PHASE ghi lại phase mà exception thoát ra: khối except xử lý lỗi gần
như luôn nằm ngoài with phase(...), lúc đó phase đang mở đã bị reset trong
finally. Không có nó thì mọi ErrorReport đều phase=None và fallback theo
phase không bao giờ chạy. Dùng effective_phase() ở đường báo lỗi.
config/thread_config.py — ContextAwareThreadPoolExecutor copy contextvars
khi submit. ThreadPoolExecutor thuần không làm việc này (khác
asyncio.to_thread), nên analysis + finalization chạy trong
circuit_running_pool sẽ mất job_id / trace_id / phase.
Call-site — phase() bọc PREPROCESSING / DEVICE_SELECTION /
PROVIDER_INVOCATION / COMPILATION / EXECUTION / ANALYSIS; toàn bộ 13 call-site
của build_error_job_response() truyền phase=.
Test — tests/test_error_classifier.py (52 case: cause chain, HTTP/AWS
code, frame ownership, phase fallback, rule ordering) và
tests/test_error_report.py (44 case: envelope, timeline, thread pool).
v0.0.13.dev9 — Error logging & observability (Phase 0)
Mục tiêu: Function Log và Job Log phải chỉ ra được nguyên nhân lỗi. Toàn bộ thay
đổi trong bản này là additive hoặc bug fix — không đổi contract callback,
không đổi schema job_result, không cần frontend/backend sửa gì.
Logging (config/)
- Thêm
config/log_context.py:bind_job()/enrich_job_context()đặtjob_id,trace_id,sdk,provider,devicevàocontextvars. Mọi log sau đó tự có đủ field, kể cả log củaProvider/DeviceSelection/*Factory— những chỗ trước đây rơi vào context"QuappLibs"nên không gắn được vào job nào. configure_logging()idempotent. Trước đâyAsyncInvocationTask.do()gọilogger.add(sink=sys.stderr, ...)cho mỗi request, nên sau N job có N+1 sink và mỗi dòng log in N+1 lần.- Thêm
InterceptHandler+install_stdlib_intercept(): đẩy mọi record của stdlibloggingsang loguru. Cần thiết vì 24/34 template trongquapp-sdk-templatesdùnglogging.getLogger('index')mà không cấu hình handler —debug/infocủa chúng bị drop im lặng vàexceptionin ra không có prefix[ConsoleJobLog]lẫnjob_id. Log của uvicorn/qiskit/botocore cũng về cùng một format. - Thêm JSON sink cho structured logging, bật bằng
QUAPP_LOG_FORMAT=json|both(defaulttext, giữ nguyên hành vi cũ). Field:jobId,traceId,phase,category,errorCode,sdk,provider,device,event,durationMs. - Thêm redaction filter: mask
token/apiKey/authentication/clientSecret/ … trước khi ghi log, áp dụng cả cho stack trace. - Fix: text formatter thiếu
{exception}. Với formatter dạng callable, loguru không tự append traceback — nên trước đây mọilogger.exception()trong codebase không in ra stack trace nào. - Fix:
depthtrong intercept khiến mọi record hiện làlogging:callHandlers:<line>thay vì file:line của nơi gọi log. - Fix: với
enqueue=True, traceback object không picklable nên bị thay bằngNonesau khi qua queue. Traceback nay được format sẵn ở filter.
Error từ runner không phải Python (component/dispatcher.py, bridge.py)
- Bỏ
subprocess.run(..., check=True). Nó raiseCalledProcessErrortrước khi đọc được output, làm nhánh_extract_error_message()thành dead code và user chỉ thấyCommand '[...]' returned non-zero exit status 1. - Thêm
HandlerRuntimeErrormanglanguage,action,error_type,stack(stack của runtime gốc — JS/.NET),exit_code,signal_name. Sáu tình huống được phân biệt: runner không có trong image, timeout, bị signal (handler.c segfault → returncode âm, stdout rỗng), structured error trên stdout, exit code khác 0, và output không phải JSON hợp lệ. - Đọc được cả contract cũ (
errordạng string, stack trên stderr) nên không cần deploy đồng thời với template. _format_exception()đưahandlerStackTrace/language/action/exitCode/signallênjob_resultcho lỗi handler JS/Q#/C.
Đường lỗi (model/device/device.py, util/response_utils.py, …)
Device._on_executiondùngbuild_error_job_response()thay chojob_result = {"error": str(exception)}và log ởERRORthay vìDEBUG. Đây là đường lỗi quan trọng nhất (submit circuit lên device) và trước đây là đường mất thông tin nhiều nhất.build_error_job_response()nay tự phát một logERRORduy nhất cho mọi lỗi, nên Job Log và Function Log không còn lệch nhau.- Truyền
stagecho 8 call-site còn thiếu (trước đây 10/13 call-site rơi vào default'while running your job'). - Fix
generate_response(): nhánhelsetruy cậpjob_response.status_codekhijob_responselà falsy →AttributeError, thay lỗi gốc bằng lỗi khác. - Fix
job_fetching.py:__produce_histogram_data/__get_execution_timekhai báo@staticmethodnhưng dùngself.logger→NameErrorkhi được gọi. DeviceSelection: không log nguyên response (chứa token provider) và không nhétresponse.contentthô vào exception (nội dung này chảy vàojob_resultrồi hiện lên UI).PostProcessingTask: bỏprint()ghi thẳng ra stdout (không qua sink nên không được redact và không cójob_id).
Test
tests/test_logging_config.py— redaction, idempotent sink, job context, intercept stdlib, exception payload.tests/test_dispatcher_runner_error.py— 6 nhánh phân loại lỗi runner.
v0.0.13.dev2
- Fix:
_openqasm_to_braketincircuit_adapter.pynow injects a defaultProbabilityresult type when the Braket circuit produced bytk_to_brakethas no result types. OpenQASM circuits submitted from non-Python runtimes (e.g. Q#) do not carry explicit measurement annotations, so the converted Braket circuit would have an emptyresult_typeslist and fail at execution time. The fix addscircuit.probability(target=list(range(circuit.qubit_count)))before returning, ensuring every Braket job has at least one result type.
v0.0.13.dev1
- Refactor: Replace class-based subprocess components with standalone
module-level functions for simpler imports and testability:
SubprocessDispatcherclass →dispatch()andis_subprocess_language()indispatcher.py.CircuitAdapterclass →adapt()and private helper functions incircuit_adapter.py.ResultSerializerclass →serialize()inresult_serializer.py.SubprocessBridgeretains its class form but delegates internally to the new standalone functions.
- Refactor
dispatcher.py:WORKING_DIRis now read from theQUAPP_WORKING_DIRenvironment variable (previously hardcodedNone); falls back toos.getcwd()when the variable is unset. - Refactor
dispatcher.py: Q# runner command changed fromdotnet run --project HandlerRunner.csprojto a precompiled platform-specific binary —./handler_runner_bin/Function.exeon Windows and./handler_runner_bin/Functionon other platforms — eliminating thedotnettoolchain requirement at runtime. - Refactor
circuit_adapter.py: Extract_load_qasm_circuit(qasm_str)private utility that centralises OpenQASM 2.0 string parsing with Qiskit version compatibility — usesqiskit.qasm2.loads(Qiskit >= 1.0) and falls back toQiskitCircuit.from_qasm_str(Qiskit < 1.0). - Fix:
subprocess.runnow passescheck=Trueso a non-zero exit code raisesCalledProcessErrorbefore the manual return-code branch is reached. - Add unit tests:
tests/test_circuit_adapter.py,tests/test_json_parser_utils.py,tests/test_result_serializer.py.
v0.0.12.dev15
- Extend multi-language SDK support with Q# (QSharp) runtime:
- Add
QSHARPtoLanguageenum. - Add Q# runner configuration to
SubprocessDispatcher(dotnet run --project ., 300 s timeout).
- Add
v0.0.12.dev14
- Fix:
CircuitAdapter._adapt_openqasmforSdk.PENNYLANEnow catches the "Failed to load the qasm plugin" error raised byqml.from_qasmon PennyLane versions that route QASM parsing through the IO plugin registry and requirepennylane-qiskitto be installed (affects both older releases and the current latest). When the error is detected, it falls back to parsing the QASM string via Qiskit (a hard dependency) and emitting native PennyLane operations gate-by-gate through the newCircuitAdapter._qiskit_to_pennylanehelper. Supported gates: H, X, Y, Z, S, Sdg (→ PhaseShift −π/2), T, Tdg (→ PhaseShift −π/4), CX, CZ, SWAP, RX, RY, RZ, P/U1 (→ PhaseShift), U2, U3/U; unrecognized gates are logged as a warning and skipped.
v0.0.12.dev13
- Fix:
CircuitAdapter._adapt_openqasmforSdk.PENNYLANEnow injects string sentinels ("Expectation","Variance","Sample","Probability","State","MidMeasure") back intopennylane.measurementswhen they are absent. PennyLane 0.37 removedObservableReturnTypesfrom that module, but legacy plugins such aspennylane-rigettiimport these names at module level and crash withImportErrorbefore the device is created. The shim is injected inside__pre_execute, beforePennylaneInvocationcreates the device, so the plugin import succeeds and the removed code paths are bypassed at runtime.
v0.0.12.dev12
- Feat: add
QUAPP_HPCtoProviderTagenum to support the Slurm HPC integration. Required byquapp-hpcso itsSlurmProvidercan register itself in the sharedProviderTagnamespace; without this, importingquapp-hpcfails atSlurmProvider.__init__withAttributeErroron the enum lookup.
v0.0.12.dev11
- Enhance:
CircuitAdapternow emits structured debug logs at each routing decision — SDK selected, QASM string length, qubit count, per-SDK adapter chosen,tk_to_braketreturn type (tuple vs bare Circuit), DenseMatrix fallback for unrecognized/parametric gates in_qiskit_to_qulacs, and QUBO entry counts before and after parsing. - Enhance:
SubprocessBridgenow emits debug logs on initialisation (language,sdk),processing()(input keys, JS status, adapted circuit type), andpost_processing()(job-result type, serialised keys, JS status, result type); subprocess failures are additionally promoted tologger.errorbefore theRuntimeErroris raised.
v0.0.12.dev10
- Fix:
CircuitAdapter._adapt_openqasmforSdk.BRAKETnow handles the breaking API change inpytket-braket >= 0.35, wheretk_to_braketreturns a(Circuit, n_shots)tuple instead of a bareCircuit— the method unpacks the first element when a tuple is returned and passes through the value unchanged for older versions.
v0.0.12.dev9
- Fix:
QulacsInvocation._get_qubit_amountnow handles OpenQASM string input — when a JS job submits an OpenQASM 2.0 string circuit, the method parses theqregdeclaration to extract the qubit count instead of raising"Invalid circuit type!".
v0.0.12.dev8
- Add
Sdk.QULACSsupport inCircuitAdapter._adapt_openqasmwith a two-stage fallback strategy:- Qiskit bridge (preferred): parse OpenQASM with
QiskitCircuit.from_qasm_str, then convert gate-by-gate to aqulacs.QuantumCircuitvia the newCircuitAdapter._qiskit_to_qulacshelper. Fixed gates (H, X, Y, Z, S, Sdg, T, Tdg, CX, CZ, SWAP) use named qulacs methods; parametric and unrecognized gates fall back toqulacs.gate.DenseMatrixwithgate.to_matrix(). - Raw pass-through (fallback): if qiskit is not installed or
conversion raises any exception, the raw OpenQASM string is returned
as-is (same approach as
Sdk.CUDA_QUANTUM) and a warning is logged.
- Qiskit bridge (preferred): parse OpenQASM with
- Add
qulacsas a direct dependency inpyproject.toml.
v0.0.12.dev7
- Fix: remove
Sdk.CU_QUANTUMfrom the CUDA-Q branch inCircuitAdapter._adapt_openqasm—CU_QUANTUMis not a member of theSdkenum; the only valid CUDA-Q value isSdk.CUDA_QUANTUM, so the compoundsdk in (Sdk.CUDA_QUANTUM, Sdk.CU_QUANTUM)check is replaced with a plainsdk == Sdk.CUDA_QUANTUM.
v0.0.12.dev6
- Fix: replace direct
from pytket.extensions.braket import ...andfrom pytket.extensions.pyquil import ...withimportlib.import_module()inCircuitAdapter— avoids IDE static-analysis false positives caused bypytket.extensionsbeing a namespace package populated at runtime by separately installedpytket-braket/pytket-pyquilpackages.
v0.0.12.dev5
- Version bump to 0.0.12.dev5.
- Refactor: update logger imports in
SubprocessBridge,CircuitAdapter, andSubprocessDispatcherto use relative paths (from ..config.logging_config import logger) for consistency across modules.
v0.0.12.dev4
- Version bumps to 0.0.12.dev4.
- Fix:
AsyncInvocationTask._on_task_donenow properly fires the step error callback when a background task raises an unhandled exception — readsonErrorCallbackUrlfrom the event'spreparationstep and callsupdate_job_metadatawith a structured error response. - Fix: circuit preparation failure in
Invocation.__pre_executenow returnsNoneinstead of raisingValueError, allowing the caller to handle the empty result gracefully without an unhandled exception propagating. - Refactor: replace stdlib
loggingwith the project’s loguru-based logger (viaconfig.logging_config) inSubprocessBridge,CircuitAdapter, andSubprocessDispatcher; all three now calllogger.bind(context=__name__). - Style: reformat
SubprocessBridgeandSubprocessDispatcherfrom 2-space to 4-space indentation, consistent with the rest of the codebase.
v0.0.12.dev3
- Version bumps to 0.0.12.dev3.
- Add
QUANTUM_HPCSDK enum value (display name"quantum hpc") to support the Quapp HPC backend. - Make
circuitExportUrloptional inInvocationfor SDKs that do not require a circuit-export step.
v0.0.12.dev2
- Version bumps to 0.0.12.dev2.
- Fix: correct JavaScript handler runner path in
SubprocessDispatcher.RUNNER_MAP— removed the erroneousfunction/directory prefix so the subprocess command resolves tohandler_runner.jsrelative to the working directory.
v0.0.12.dev1
- Version bump to 0.0.12.dev1 and dependency update (add
qibo,dimod). - Introduce multi-language SDK support primitives:
Languageenum for validating and resolving Python/JavaScript runtimes.SubprocessDispatcherfor delegating tasks to non-Python runtimes via subprocess with runner configuration and timeout management.SubprocessBridgeintegrating dispatcher, circuit adapter, and result serializer for JS-Python handler interaction.CircuitAdapterfor converting JS subprocess circuit outputs into native SDK formats (OpenQASM, QUBO, JSON) across Qiskit, Braket, PennyLane, etc.ResultSerializerfor converting complex job results (numpy, complex numbers, Enums, datetime) into JSON-serializable dictionaries.
v0.0.11.dev7 – v0.0.11.dev10
- Version bump to 0.0.11.dev7 and dependency update (add
starlette). - Introduce asynchronous job processing primitives:
- AsyncInvocationTask for background execution with immediate client response.
- Event and standardized Result models (Success, Error).
- Introduce JobManager for cross-process job management and update publication.
- Integrate JobManager into Request to register jobs and carry scheduler callback URL.
- Modularize update_job_metadata with clearer helpers; patch scheduler on local state changes.
- Fix: ignore updates for jobs that are already DONE or FAILED.
- Improve logging and error handling (use full tracebacks, cleaner logs).
For detailed usage and API references, please refer to the in-code documentation or contact the maintainers.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file quapp_common-0.0.14.dev8.tar.gz.
File metadata
- Download URL: quapp_common-0.0.14.dev8.tar.gz
- Upload date:
- Size: 108.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b46f1acea11f475df03223b6c7c07e60bc62de61e7e7192e58326ba6bb417ae8
|
|
| MD5 |
a9002243a18ce4d35186301d8e877b8a
|
|
| BLAKE2b-256 |
2fc9b6b5124852b8815ebb945e0aebb75f42d1ed04466f83ca19e44ad9bbc1c6
|
File details
Details for the file quapp_common-0.0.14.dev8-py3-none-any.whl.
File metadata
- Download URL: quapp_common-0.0.14.dev8-py3-none-any.whl
- Upload date:
- Size: 100.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3fd947b00cf8d74c61ad6ce1b694acd160eac0d829acb369a891b44cd73933ca
|
|
| MD5 |
d62798d6342706a85b590fdcb2919319
|
|
| BLAKE2b-256 |
7f31c4180e726bce58d3205b5150454e815abcd52b7d1fb4132a5b129e62b880
|