From de1525a2d6eea8bcd9bf1e0210691e83477669f0 Mon Sep 17 00:00:00 2001 From: Caihaohan Date: Sat, 28 Mar 2026 17:00:53 +0800 Subject: [PATCH] feat(shared): add domain schemas implementation --- packages/shared/package.json | 3 +- packages/shared/src/domain/experiment.ts | 15 +++++++++ packages/shared/src/domain/market.ts | 13 ++++++++ packages/shared/src/domain/model-profile.ts | 21 +++++++++++++ packages/shared/src/domain/strategy.ts | 35 +++++++++++++++++++++ packages/shared/src/domain/trade.ts | 26 +++++++++++++++ packages/shared/src/index.ts | 5 +++ 7 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 packages/shared/src/domain/experiment.ts create mode 100644 packages/shared/src/domain/market.ts create mode 100644 packages/shared/src/domain/model-profile.ts create mode 100644 packages/shared/src/domain/strategy.ts create mode 100644 packages/shared/src/domain/trade.ts create mode 100644 packages/shared/src/index.ts diff --git a/packages/shared/package.json b/packages/shared/package.json index 818736d..2bdc995 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -7,7 +7,8 @@ "test": "vitest run --" }, "dependencies": { - "@aiquant/agent-runtime": "workspace:*" + "@aiquant/agent-runtime": "workspace:*", + "zod": "^3.24.1" }, "devDependencies": { "typescript": "^5.9.2", diff --git a/packages/shared/src/domain/experiment.ts b/packages/shared/src/domain/experiment.ts new file mode 100644 index 0000000..eae4195 --- /dev/null +++ b/packages/shared/src/domain/experiment.ts @@ -0,0 +1,15 @@ +import { z } from "zod"; + +export const experimentResultSchema = z.object({ + id: z.string().min(1), + strategyId: z.string().min(1), + strategyVersion: z.number().int().positive(), + sampleSize: z.number().int().nonnegative(), + score: z.number(), + netReturn: z.number(), + maxDrawdown: z.number().nonnegative(), + hitRate: z.number().min(0).max(1), + evaluatedAt: z.string().datetime() +}); + +export type ExperimentResult = z.infer; diff --git a/packages/shared/src/domain/market.ts b/packages/shared/src/domain/market.ts new file mode 100644 index 0000000..1831469 --- /dev/null +++ b/packages/shared/src/domain/market.ts @@ -0,0 +1,13 @@ +import { z } from "zod"; + +export const marketSnapshotSchema = z.object({ + id: z.string().min(1), + symbol: z.string().min(1), + contractId: z.string().min(1), + timeframe: z.string().min(1), + observedAt: z.string().datetime(), + price: z.number().positive(), + volume: z.number().nonnegative().optional() +}); + +export type MarketSnapshot = z.infer; diff --git a/packages/shared/src/domain/model-profile.ts b/packages/shared/src/domain/model-profile.ts new file mode 100644 index 0000000..4b56589 --- /dev/null +++ b/packages/shared/src/domain/model-profile.ts @@ -0,0 +1,21 @@ +import { z } from "zod"; + +export const modelCapabilitySchema = z.object({ + structuredOutputs: z.boolean().default(false), + jsonMode: z.boolean().default(false) +}); + +export const modelProfileSchema = z.object({ + name: z.string().min(1), + provider: z.string().min(1), + apiBase: z.string().url(), + apiKeyRef: z.string().min(1), + model: z.string().min(1), + temperature: z.number().min(0).max(2).optional(), + maxTokens: z.number().int().positive().optional(), + timeoutMs: z.number().int().positive().optional(), + capabilities: modelCapabilitySchema, + tags: z.array(z.string().min(1)).default([]) +}); + +export type ModelProfile = z.infer; diff --git a/packages/shared/src/domain/strategy.ts b/packages/shared/src/domain/strategy.ts new file mode 100644 index 0000000..aa20e7b --- /dev/null +++ b/packages/shared/src/domain/strategy.ts @@ -0,0 +1,35 @@ +import { z } from "zod"; + +export const strategyStateSchema = z.enum([ + "draft", + "candidate", + "dry-run", + "approved-for-live", + "archived" +]); + +export const strategyDefinitionSchema = z.object({ + id: z.string().min(1), + version: z.number().int().positive(), + name: z.string().min(1), + state: strategyStateSchema, + agentProfile: z.object({ + signal: z.string().min(1), + risk: z.string().min(1), + evaluator: z.string().min(1), + optimizer: z.string().min(1) + }), + featureConfig: z.object({ + windows: z.array(z.string().min(1)).min(1) + }), + riskConfig: z.object({ + minConfidence: z.number().min(0).max(1) + }), + scoringConfig: z.object({ + objective: z.literal("risk-adjusted-return") + }), + createdAt: z.string().datetime() +}); + +export type StrategyState = z.infer; +export type StrategyDefinition = z.infer; diff --git a/packages/shared/src/domain/trade.ts b/packages/shared/src/domain/trade.ts new file mode 100644 index 0000000..b70f249 --- /dev/null +++ b/packages/shared/src/domain/trade.ts @@ -0,0 +1,26 @@ +import { z } from "zod"; + +export const tradeModeSchema = z.enum(["dry-run", "live"]); +export const tradeSideSchema = z.enum(["up", "down"]); +export const tradeStatusSchema = z.enum([ + "proposed", + "confirmed", + "rejected", + "settled" +]); + +export const tradeRecordSchema = z.object({ + id: z.string().min(1), + strategyId: z.string().min(1), + strategyVersion: z.number().int().positive(), + mode: tradeModeSchema, + contractId: z.string().min(1), + side: tradeSideSchema, + confidence: z.number().min(0).max(1), + status: tradeStatusSchema, + createdAt: z.string().datetime(), + settledAt: z.string().datetime().optional(), + pnl: z.number().optional() +}); + +export type TradeRecord = z.infer; diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts new file mode 100644 index 0000000..fcc7589 --- /dev/null +++ b/packages/shared/src/index.ts @@ -0,0 +1,5 @@ +export * from "./domain/experiment"; +export * from "./domain/market"; +export * from "./domain/model-profile"; +export * from "./domain/strategy"; +export * from "./domain/trade";