feat: complete TASK-WP3-01 model configuration

This commit is contained in:
suyx
2026-08-03 02:40:48 +08:00
parent 1b0a05bbcf
commit d79ac74fdd
19 changed files with 7018 additions and 3 deletions
+79
View File
@@ -0,0 +1,79 @@
import { Type, type Static } from "@sinclair/typebox";
const isoTimestampPattern = "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3}Z$";
export const ModelIdSchema = Type.String({ maxLength: 80, minLength: 1, pattern: "^[a-z0-9][a-z0-9.-]+$", $id: "ModelId" });
export const ModelContractValidationStatusSchema = Type.Union([
Type.Literal("blocked"), Type.Literal("unverified"), Type.Literal("verified"),
], { $id: "ModelContractValidationStatus" });
export const ModelRuntimeReasonSchema = Type.Union([
Type.Literal("available"), Type.Literal("configured_disabled"), Type.Literal("contract_unverified"),
Type.Literal("contract_blocked"), Type.Literal("gateway_balance_insufficient"), Type.Literal("gateway_paused"),
Type.Literal("worker_degraded"),
], { $id: "ModelRuntimeReason" });
export const ModelReferenceLimitsSchema = Type.Object({
max_file_bytes: Type.Integer({ minimum: 1 }),
max_files: Type.Integer({ minimum: 0 }),
max_total_bytes: Type.Integer({ minimum: 1 }),
}, { additionalProperties: false, $id: "ModelReferenceLimits" });
export const ModelRuntimeAvailabilitySchema = Type.Object({
available_for_new_jobs: Type.Boolean(),
checked_at: Type.String({ pattern: isoTimestampPattern }),
reason: Type.Ref(ModelRuntimeReasonSchema),
}, { additionalProperties: false, $id: "ModelRuntimeAvailability" });
export const ModelConfigSchema = Type.Object({
config_version: Type.Integer({ minimum: 1 }),
contract_evidence_ref: Type.Union([Type.String({ maxLength: 160, minLength: 1 }), Type.Null()]),
contract_validation_status: Type.Ref(ModelContractValidationStatusSchema),
credit_cost: Type.Integer({ minimum: 1 }),
display_name: Type.String({ maxLength: 160, minLength: 1 }),
enabled: Type.Boolean(),
error_mapping_profile: Type.Record(Type.String(), Type.String()),
gateway_account_ref: Type.String({ maxLength: 160, minLength: 1 }),
is_default: Type.Boolean(),
model_id: Type.Ref(ModelIdSchema),
prompt_max_length: Type.Integer({ minimum: 1 }),
recommendation_priority: Type.Integer({ minimum: 1 }),
reference_limits: Type.Ref(ModelReferenceLimitsSchema),
route_profile: Type.Record(Type.String(), Type.Unknown()),
runtime_availability: Type.Ref(ModelRuntimeAvailabilitySchema),
safety_source: Type.String({ maxLength: 160, minLength: 1 }),
supported_ratios: Type.Array(Type.String({ maxLength: 20, minLength: 1 }), { minItems: 1, maxItems: 8 }),
}, { additionalProperties: false, $id: "ModelConfig" });
export const ModelConfigCandidateSchema = Type.Object({
credit_cost: Type.Integer({ minimum: 1 }),
display_name: Type.String({ maxLength: 160, minLength: 1 }),
enabled: Type.Boolean(),
error_mapping_profile: Type.Record(Type.String(), Type.String()),
gateway_account_ref: Type.String({ maxLength: 160, minLength: 1 }),
is_default: Type.Boolean(),
model_id: Type.Ref(ModelIdSchema),
prompt_max_length: Type.Integer({ minimum: 1 }),
recommendation_priority: Type.Number(),
reference_limits: Type.Ref(ModelReferenceLimitsSchema),
route_profile: Type.Record(Type.String(), Type.Unknown()),
safety_source: Type.String({ maxLength: 160, minLength: 1 }),
supported_ratios: Type.Array(Type.String({ maxLength: 20, minLength: 1 }), { minItems: 1, maxItems: 8 }),
}, { additionalProperties: false, $id: "ModelConfigCandidate" });
export const ModelConfigurationResponseSchema = Type.Object({
config_set_version: Type.Integer({ minimum: 1 }),
configured_default_model_id: Type.Ref(ModelIdSchema),
models: Type.Array(Type.Ref(ModelConfigSchema), { minItems: 3, maxItems: 3 }),
recommended_model_id: Type.Union([Type.Ref(ModelIdSchema), Type.Null()]),
}, { additionalProperties: false, $id: "ModelConfigurationResponse" });
export const ModelConfigUpdateRequestSchema = Type.Object({
expected_config_set_version: Type.Integer({ minimum: 1 }),
models: Type.Array(Type.Ref(ModelConfigCandidateSchema), { minItems: 3, maxItems: 3 }),
}, { additionalProperties: false, $id: "ModelConfigUpdateRequest" });
export const ModelConfigUpdateHeadersSchema = Type.Object({
"idempotency-key": Type.String({ maxLength: 200, minLength: 32, pattern: "^[A-Za-z0-9_-]+$" }),
"x-csrf-token": Type.String({ maxLength: 64, minLength: 43, pattern: "^[A-Za-z0-9_-]+$" }),
}, { additionalProperties: true, $id: "ModelConfigUpdateHeaders" });
export const ModelParamsSchema = Type.Object({ model_id: Type.Ref(ModelIdSchema) }, { additionalProperties: false, $id: "ModelParams" });
export type ModelConfig = Static<typeof ModelConfigSchema>;
export type ModelConfigCandidate = Static<typeof ModelConfigCandidateSchema>;
export type ModelConfigurationResponse = Static<typeof ModelConfigurationResponseSchema>;
export type ModelConfigUpdateRequest = Static<typeof ModelConfigUpdateRequestSchema>;
export type ModelConfigUpdateHeaders = Static<typeof ModelConfigUpdateHeadersSchema>;
export type ModelParams = Static<typeof ModelParamsSchema>;