docs/config/packages: add v0.1 release prep, security status, and SDK enhancements
- Add Stage 23 roadmap for v0.1 release preparation with PyPI/npm publishing, deployment automation, and security audit milestones - Document competitive differentiators: zkML/FHE integration, hybrid TEE/ZK verification, on-chain model marketplace, and geo-low-latency matching - Update security documentation with smart contract audit results (0 vulnerabilities, 35 OpenZeppelin warnings) - Add security-first setup
This commit is contained in:
@@ -7,6 +7,22 @@ import type {
|
||||
WalletSignRequest,
|
||||
WalletSignResponse,
|
||||
RequestOptions,
|
||||
BlockSummary,
|
||||
BlockListResponse,
|
||||
TransactionSummary,
|
||||
TransactionListResponse,
|
||||
AddressSummary,
|
||||
AddressListResponse,
|
||||
ReceiptSummary,
|
||||
ReceiptListResponse,
|
||||
MarketplaceOffer,
|
||||
MarketplaceStats,
|
||||
MarketplaceBid,
|
||||
MarketplaceSession,
|
||||
JobSubmission,
|
||||
Job,
|
||||
JobStatus,
|
||||
JobResult,
|
||||
} from "./types";
|
||||
|
||||
const DEFAULT_HEADERS = {
|
||||
@@ -19,14 +35,17 @@ export class AitbcClient {
|
||||
private readonly apiKey?: string;
|
||||
private readonly basicAuth?: ClientOptions["basicAuth"];
|
||||
private readonly fetchImpl: typeof fetch;
|
||||
private readonly timeout?: number;
|
||||
|
||||
constructor(options: ClientOptions) {
|
||||
this.baseUrl = options.baseUrl.replace(/\/$/, "");
|
||||
this.apiKey = options.apiKey;
|
||||
this.basicAuth = options.basicAuth;
|
||||
this.fetchImpl = options.fetchImpl ?? fetch;
|
||||
this.timeout = options.timeout;
|
||||
}
|
||||
|
||||
// Coordinator API Methods
|
||||
async match(payload: MatchRequest, options?: RequestOptions): Promise<MatchResponse> {
|
||||
const raw = await this.request<any>("POST", "/v1/match", {
|
||||
...options,
|
||||
@@ -79,6 +98,107 @@ export class AitbcClient {
|
||||
});
|
||||
}
|
||||
|
||||
// Job Management Methods
|
||||
async submitJob(job: JobSubmission, options?: RequestOptions): Promise<Job> {
|
||||
return this.request<Job>("POST", "/v1/jobs", {
|
||||
...options,
|
||||
body: JSON.stringify(job),
|
||||
});
|
||||
}
|
||||
|
||||
async getJob(jobId: string, options?: RequestOptions): Promise<Job> {
|
||||
return this.request<Job>("GET", `/v1/jobs/${jobId}`, options);
|
||||
}
|
||||
|
||||
async getJobStatus(jobId: string, options?: RequestOptions): Promise<JobStatus> {
|
||||
return this.request<JobStatus>("GET", `/v1/jobs/${jobId}/status`, options);
|
||||
}
|
||||
|
||||
async getJobResult(jobId: string, options?: RequestOptions): Promise<JobResult> {
|
||||
return this.request<JobResult>("GET", `/v1/jobs/${jobId}/result`, options);
|
||||
}
|
||||
|
||||
async cancelJob(jobId: string, options?: RequestOptions): Promise<void> {
|
||||
await this.request<void>("DELETE", `/v1/jobs/${jobId}`, options);
|
||||
}
|
||||
|
||||
async listJobs(options?: RequestOptions): Promise<{ items: Job[]; next_offset?: string }> {
|
||||
return this.request<{ items: Job[]; next_offset?: string }>("GET", "/v1/jobs", options);
|
||||
}
|
||||
|
||||
// Receipt Methods
|
||||
async getJobReceipts(jobId: string, options?: RequestOptions): Promise<ReceiptListResponse> {
|
||||
return this.request<ReceiptListResponse>("GET", `/v1/jobs/${jobId}/receipts`, options);
|
||||
}
|
||||
|
||||
async verifyReceipt(receipt: ReceiptSummary, options?: RequestOptions): Promise<{ valid: boolean }> {
|
||||
return this.request<{ valid: boolean }>("POST", "/v1/receipts/verify", {
|
||||
...options,
|
||||
body: JSON.stringify(receipt),
|
||||
});
|
||||
}
|
||||
|
||||
// Blockchain Explorer Methods
|
||||
async getBlocks(options?: RequestOptions): Promise<BlockListResponse> {
|
||||
return this.request<BlockListResponse>("GET", "/v1/explorer/blocks", options);
|
||||
}
|
||||
|
||||
async getBlock(height: string | number, options?: RequestOptions): Promise<BlockSummary> {
|
||||
return this.request<BlockSummary>("GET", `/v1/explorer/blocks/${height}`, options);
|
||||
}
|
||||
|
||||
async getTransactions(options?: RequestOptions): Promise<TransactionListResponse> {
|
||||
return this.request<TransactionListResponse>("GET", "/v1/explorer/transactions", options);
|
||||
}
|
||||
|
||||
async getTransaction(hash: string, options?: RequestOptions): Promise<TransactionSummary> {
|
||||
return this.request<TransactionSummary>("GET", `/v1/explorer/transactions/${hash}`, options);
|
||||
}
|
||||
|
||||
async getAddresses(options?: RequestOptions): Promise<AddressListResponse> {
|
||||
return this.request<AddressListResponse>("GET", "/v1/explorer/addresses", options);
|
||||
}
|
||||
|
||||
async getAddress(address: string, options?: RequestOptions): Promise<AddressSummary> {
|
||||
return this.request<AddressSummary>("GET", `/v1/explorer/addresses/${address}`, options);
|
||||
}
|
||||
|
||||
async getReceipts(options?: RequestOptions): Promise<ReceiptListResponse> {
|
||||
return this.request<ReceiptListResponse>("GET", "/v1/explorer/receipts", options);
|
||||
}
|
||||
|
||||
// Marketplace Methods
|
||||
async getMarketplaceStats(options?: RequestOptions): Promise<MarketplaceStats> {
|
||||
return this.request<MarketplaceStats>("GET", "/v1/marketplace/stats", options);
|
||||
}
|
||||
|
||||
async getMarketplaceOffers(options?: RequestOptions): Promise<MarketplaceOffer[]> {
|
||||
return this.request<MarketplaceOffer[]>("GET", "/v1/marketplace/offers", options);
|
||||
}
|
||||
|
||||
async getMarketplaceOffer(offerId: string, options?: RequestOptions): Promise<MarketplaceOffer> {
|
||||
return this.request<MarketplaceOffer>("GET", `/v1/marketplace/offers/${offerId}`, options);
|
||||
}
|
||||
|
||||
async submitMarketplaceBid(bid: MarketplaceBid, options?: RequestOptions): Promise<void> {
|
||||
await this.request<void>("POST", "/v1/marketplace/bids", {
|
||||
...options,
|
||||
body: JSON.stringify(bid),
|
||||
});
|
||||
}
|
||||
|
||||
// Authentication Methods
|
||||
async login(credentials: { username: string; password: string }, options?: RequestOptions): Promise<MarketplaceSession> {
|
||||
return this.request<MarketplaceSession>("POST", "/v1/users/login", {
|
||||
...options,
|
||||
body: JSON.stringify(credentials),
|
||||
});
|
||||
}
|
||||
|
||||
async logout(options?: RequestOptions): Promise<void> {
|
||||
await this.request<void>("POST", "/v1/users/logout", options);
|
||||
}
|
||||
|
||||
private async request<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {
|
||||
const response = await this.rawRequest(method, path, options);
|
||||
const text = await response.text();
|
||||
@@ -92,11 +212,21 @@ export class AitbcClient {
|
||||
const url = this.buildUrl(path, options.query);
|
||||
const headers = this.buildHeaders(options.headers);
|
||||
|
||||
return this.fetchImpl(url, {
|
||||
method,
|
||||
...options,
|
||||
headers,
|
||||
});
|
||||
const controller = new AbortController();
|
||||
const timeoutId = this.timeout ? setTimeout(() => controller.abort(), this.timeout) : undefined;
|
||||
|
||||
try {
|
||||
return await this.fetchImpl(url, {
|
||||
method,
|
||||
signal: controller.signal,
|
||||
...options,
|
||||
headers,
|
||||
});
|
||||
} finally {
|
||||
if (timeoutId) {
|
||||
clearTimeout(timeoutId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private buildUrl(path: string, query?: RequestOptions["query"]): string {
|
||||
|
||||
47
packages/js/aitbc-sdk/src/index.ts
Normal file
47
packages/js/aitbc-sdk/src/index.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
// Main exports
|
||||
export { AitbcClient } from "./client";
|
||||
|
||||
// Type exports
|
||||
export type {
|
||||
ClientOptions,
|
||||
RequestOptions,
|
||||
MatchRequest,
|
||||
MatchResponse,
|
||||
HealthResponse,
|
||||
MetricsResponse,
|
||||
WalletSignRequest,
|
||||
WalletSignResponse,
|
||||
BlockSummary,
|
||||
BlockListResponse,
|
||||
TransactionSummary,
|
||||
TransactionListResponse,
|
||||
AddressSummary,
|
||||
AddressListResponse,
|
||||
ReceiptSummary,
|
||||
ReceiptListResponse,
|
||||
MarketplaceOffer,
|
||||
MarketplaceStats,
|
||||
MarketplaceBid,
|
||||
MarketplaceSession,
|
||||
JobSubmission,
|
||||
Job,
|
||||
JobStatus,
|
||||
JobResult,
|
||||
} from "./types";
|
||||
|
||||
import { AitbcClient } from "./client";
|
||||
import type { ClientOptions } from "./types";
|
||||
|
||||
// Utility functions
|
||||
export function createClient(options: ClientOptions): AitbcClient {
|
||||
return new AitbcClient(options);
|
||||
}
|
||||
|
||||
// Default configuration
|
||||
export const DEFAULT_CONFIG = {
|
||||
baseUrl: "https://aitbc.bubuit.net",
|
||||
timeout: 30000,
|
||||
} as const;
|
||||
|
||||
// Version
|
||||
export const VERSION = "0.1.0";
|
||||
@@ -44,6 +44,155 @@ export interface WalletSignResponse {
|
||||
signatureBase64: string;
|
||||
}
|
||||
|
||||
// Blockchain Types
|
||||
export interface BlockSummary {
|
||||
height: number;
|
||||
hash: string;
|
||||
timestamp: string;
|
||||
txCount: number;
|
||||
proposer: string;
|
||||
}
|
||||
|
||||
export interface BlockListResponse {
|
||||
items: BlockSummary[];
|
||||
next_offset?: number | string | null;
|
||||
}
|
||||
|
||||
export interface TransactionSummary {
|
||||
hash: string;
|
||||
block: number | string;
|
||||
from: string;
|
||||
to: string | null;
|
||||
value: string;
|
||||
status: string;
|
||||
}
|
||||
|
||||
export interface TransactionListResponse {
|
||||
items: TransactionSummary[];
|
||||
next_offset?: number | string | null;
|
||||
}
|
||||
|
||||
export interface AddressSummary {
|
||||
address: string;
|
||||
balance: string;
|
||||
txCount: number;
|
||||
lastActive: string;
|
||||
recentTransactions?: string[];
|
||||
}
|
||||
|
||||
export interface AddressListResponse {
|
||||
items: AddressSummary[];
|
||||
next_offset?: number | string | null;
|
||||
}
|
||||
|
||||
export interface ReceiptSummary {
|
||||
receiptId: string;
|
||||
jobId?: string;
|
||||
miner: string;
|
||||
coordinator: string;
|
||||
issuedAt: string;
|
||||
status: string;
|
||||
payload?: {
|
||||
job_id?: string;
|
||||
provider?: string;
|
||||
client?: string;
|
||||
units?: number;
|
||||
unit_type?: string;
|
||||
unit_price?: number;
|
||||
price?: number;
|
||||
minerSignature?: string;
|
||||
coordinatorSignature?: string;
|
||||
signature?: {
|
||||
alg?: string;
|
||||
key_id?: string;
|
||||
sig?: string;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
export interface ReceiptListResponse {
|
||||
jobId: string;
|
||||
items: ReceiptSummary[];
|
||||
}
|
||||
|
||||
// Marketplace Types
|
||||
export interface MarketplaceOffer {
|
||||
id: string;
|
||||
provider: string;
|
||||
capacity: number;
|
||||
price: number;
|
||||
sla: string;
|
||||
status: string;
|
||||
created_at?: string;
|
||||
gpu_model?: string;
|
||||
gpu_memory_gb?: number;
|
||||
gpu_count?: number;
|
||||
cuda_version?: string;
|
||||
price_per_hour?: number;
|
||||
region?: string;
|
||||
attributes?: {
|
||||
ollama_host?: string;
|
||||
models?: string[];
|
||||
vram_mb?: number;
|
||||
driver?: string;
|
||||
[key: string]: unknown;
|
||||
};
|
||||
}
|
||||
|
||||
export interface MarketplaceStats {
|
||||
totalOffers: number;
|
||||
openCapacity: number;
|
||||
averagePrice: number;
|
||||
activeBids: number;
|
||||
}
|
||||
|
||||
export interface MarketplaceBid {
|
||||
provider: string;
|
||||
capacity: number;
|
||||
price: number;
|
||||
notes?: string;
|
||||
}
|
||||
|
||||
export interface MarketplaceSession {
|
||||
token: string;
|
||||
expiresAt: number;
|
||||
}
|
||||
|
||||
// Job Management Types
|
||||
export interface JobSubmission {
|
||||
service_type: string;
|
||||
model?: string;
|
||||
parameters?: Record<string, unknown>;
|
||||
requirements?: Record<string, unknown>;
|
||||
}
|
||||
|
||||
export interface Job {
|
||||
id: string;
|
||||
status: "queued" | "running" | "completed" | "failed";
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
serviceType: string;
|
||||
model?: string;
|
||||
parameters?: Record<string, unknown>;
|
||||
result?: unknown;
|
||||
error?: string;
|
||||
}
|
||||
|
||||
export interface JobStatus {
|
||||
id: string;
|
||||
status: Job["status"];
|
||||
progress?: number;
|
||||
estimatedCompletion?: string;
|
||||
}
|
||||
|
||||
export interface JobResult {
|
||||
id: string;
|
||||
output: unknown;
|
||||
metadata?: Record<string, unknown>;
|
||||
receipts?: ReceiptSummary[];
|
||||
}
|
||||
|
||||
// Client Configuration
|
||||
export interface ClientOptions {
|
||||
baseUrl: string;
|
||||
apiKey?: string;
|
||||
@@ -52,6 +201,7 @@ export interface ClientOptions {
|
||||
password: string;
|
||||
};
|
||||
fetchImpl?: typeof fetch;
|
||||
timeout?: number;
|
||||
}
|
||||
|
||||
export interface RequestOptions extends RequestInit {
|
||||
|
||||
Reference in New Issue
Block a user