@aiscene/aiserver 1.2.3 → 1.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQlD,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,CAkG9D;AAID,wBAAgB,SAAS,IAAI,cAAc,CAK1C;AAED,wBAAgB,YAAY,IAAI,cAAc,CAG7C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQlD,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,CAwH9D;AAID,wBAAgB,SAAS,IAAI,cAAc,CAK1C;AAED,wBAAgB,YAAY,IAAI,cAAc,CAG7C"}
@@ -35,9 +35,9 @@ export function loadConfig(configPath) {
35
35
  insightModelName: 'doubao-seed-1-6-vision-250815',
36
36
  insightModelApiKey: 'pk-485b2b56-7334-4bed-bd74-09bb42ca3baf',
37
37
  insightModelBaseUrl: 'https://modelservice.jdcloud.com/v1',
38
- insightModelFamily: cliArgs.modelFamily ?? 'vlm-ui-tars-doubao-1.5',
38
+ insightModelFamily: 'gemini',
39
39
  insightModelTimeout: 60000,
40
- insightModelTemperature: 1,
40
+ insightModelTemperature: 0.1,
41
41
  },
42
42
  storage: {
43
43
  dbPath: path.resolve(process.cwd(), 'data', 'aiserver.db'),
@@ -69,23 +69,44 @@ export function loadConfig(configPath) {
69
69
  deviceStatusUpdateUrl: 'http://nethp-test.jd.com/rest/mobile-devices',
70
70
  },
71
71
  };
72
- // Sync AI model config to process.env so underlying libraries (e.g. @aiscene/android) can read them
73
- // Always sync to ensure dev and production use the same config
72
+ // Sync AI model config to process.env so underlying libraries (e.g. @aiscene/android, @midscene/web) can read them
73
+ // Consistent with electron-shadcn reference project
74
74
  if (config.ai.modelName) {
75
75
  process.env.MIDSCENE_MODEL_NAME = config.ai.modelName;
76
76
  }
77
77
  if (config.ai.baseUrl) {
78
78
  process.env.MIDSCENE_MODEL_BASE_URL = config.ai.baseUrl;
79
+ // Also set OPENAI_BASE_URL for compatibility with @midscene/web
80
+ process.env.OPENAI_BASE_URL = config.ai.baseUrl;
79
81
  }
80
82
  if (config.ai.apiKey) {
81
83
  process.env.MIDSCENE_MODEL_API_KEY = config.ai.apiKey;
84
+ // Also set OPENAI_API_KEY for compatibility with @midscene/web
85
+ process.env.OPENAI_API_KEY = config.ai.apiKey;
86
+ }
87
+ process.env.MIDSCENE_USE_QWEN3_VL = '1';
88
+ // Sync insight model config (断言模型)
89
+ if (config.ai.insightModelName) {
90
+ process.env.MIDSCENE_INSIGHT_MODEL_NAME = config.ai.insightModelName;
91
+ }
92
+ if (config.ai.insightModelApiKey) {
93
+ process.env.MIDSCENE_INSIGHT_MODEL_API_KEY = config.ai.insightModelApiKey;
94
+ }
95
+ if (config.ai.insightModelBaseUrl) {
96
+ process.env.MIDSCENE_INSIGHT_MODEL_BASE_URL = config.ai.insightModelBaseUrl;
82
97
  }
83
98
  if (config.ai.insightModelFamily) {
84
99
  process.env.MIDSCENE_INSIGHT_MODEL_FAMILY = config.ai.insightModelFamily;
85
100
  // Also set MIDSCENE_MODEL_FAMILY which is required by @aiscene/android for VL model detection
86
101
  process.env.MIDSCENE_MODEL_FAMILY = config.ai.insightModelFamily;
87
102
  }
88
- // Sync planning model config to process.env (consistent with electron-shadcn reference project)
103
+ if (config.ai.insightModelTimeout) {
104
+ process.env.MIDSCENE_INSIGHT_MODEL_TIMEOUT = String(config.ai.insightModelTimeout);
105
+ }
106
+ if (config.ai.insightModelTemperature !== undefined) {
107
+ process.env.MIDSCENE_INSIGHT_MODEL_TEMPERATURE = String(config.ai.insightModelTemperature);
108
+ }
109
+ // Sync planning model config (规划模型)
89
110
  process.env.MIDSCENE_PLANNING_MODEL_API_KEY = 'pk-485b2b56-7334-4bed-bd74-09bb42ca3baf';
90
111
  process.env.MIDSCENE_PLANNING_MODEL_BASE_URL = 'https://modelservice.jdcloud.com/v1';
91
112
  process.env.MIDSCENE_PLANNING_MODEL_NAME = 'Qwen3-235B-A22B';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAgB,MAAM,UAAU,CAAC;AAEtD,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;AAEtC,MAAM,aAAa,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;AAEpC,MAAM,UAAU,UAAU,CAAC,UAAmB;IAC5C,yCAAyC;IACzC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAE/B,mCAAmC;IACnC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;IAElD,MAAM,MAAM,GAAmB;QAC7B,MAAM,EAAE;YACN,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;YAC1B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;YAChC,IAAI,EAAE,SAAS;SAChB;QACD,MAAM,EAAE;YACN,iBAAiB,EAAE,KAAK;YACxB,iBAAiB,EAAE,CAAC;YACpB,kBAAkB,EAAE,EAAE;SACvB;QACD,IAAI,EAAE;YACJ,YAAY,EAAE,IAAI;YAClB,MAAM,EAAE,0BAA0B;YAClC,MAAM,EAAE,aAAa;YACrB,aAAa,EAAE,aAAa;YAC5B,OAAO,EAAE,OAAO;SACjB;QACD,EAAE,EAAE;YACF,OAAO,EAAE,OAAO,CAAC,YAAY,IAAI,qCAAqC;YACtE,MAAM,EAAE,OAAO,CAAC,WAAW,IAAI,yCAAyC;YACxE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,+BAA+B;YAC/D,UAAU,EAAE,IAAI;YAChB,gBAAgB,EAAE,+BAA+B;YACjD,kBAAkB,EAAE,yCAAyC;YAC7D,mBAAmB,EAAE,qCAAqC;YAC1D,kBAAkB,EAAE,QAAQ;YAC5B,mBAAmB,EAAE,KAAK;YAC1B,uBAAuB,EAAE,GAAG;SAC7B;QACD,OAAO,EAAE;YACP,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,aAAa,CAAC;SAC3D;QACD,IAAI,EAAE;YACJ,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,aAAa;YAC3C,SAAS,EAAE,EAAE;YACb,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,UAAU;YACxC,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,MAAM;YAC1C,kBAAkB,EAAE,aAAa;YACjC,MAAM,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC;YAC/B,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,iBAAiB;YACzD,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;YAC5B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;YACtC,WAAW,EAAE,wDAAwD;YACrE,YAAY,EAAE,yDAAyD;YACvE,iBAAiB,EAAE,KAAK;YACxB,UAAU,EAAE;gBACV,iBAAiB,EAAE,KAAK;aACzB;SACF;QACD,QAAQ,EAAE;YACR,eAAe,EAAE,qDAAqD;YACtE,eAAe,EAAE,8DAA8D;YAC/E,kBAAkB,EAAE,wDAAwD;YAC5E,qBAAqB,EAAE,8CAA8C;SACtE;KACF,CAAC;IAEF,mHAAmH;IACnH,oDAAoD;IACpD,IAAI,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC;IACxD,CAAC;IACD,IAAI,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC;QACxD,gEAAgE;QAChE,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC;IAClD,CAAC;IACD,IAAI,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC;QACtD,+DAA+D;QAC/D,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC;IAChD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,GAAG,CAAC;IAExC,mCAAmC;IACnC,IAAI,MAAM,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,2BAA2B,GAAG,MAAM,CAAC,EAAE,CAAC,gBAAgB,CAAC;IACvE,CAAC;IACD,IAAI,MAAM,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,8BAA8B,GAAG,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC;IAC5E,CAAC;IACD,IAAI,MAAM,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,+BAA+B,GAAG,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC;IAC9E,CAAC;IACD,IAAI,MAAM,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,6BAA6B,GAAG,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC;QACzE,8FAA8F;QAC9F,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC;IACnE,CAAC;IACD,IAAI,MAAM,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,8BAA8B,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,MAAM,CAAC,EAAE,CAAC,uBAAuB,KAAK,SAAS,EAAE,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,kCAAkC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC;IAC7F,CAAC;IAED,oCAAoC;IACpC,OAAO,CAAC,GAAG,CAAC,+BAA+B,GAAG,yCAAyC,CAAC;IACxF,OAAO,CAAC,GAAG,CAAC,gCAAgC,GAAG,qCAAqC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,iBAAiB,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,8BAA8B,GAAG,UAAU,CAAC;IAExD,qCAAqC;IACrC,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACjD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,IAAI,OAAO,GAA0B,IAAI,CAAC;AAE1C,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,UAAU,EAAE,CAAC;IACzB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,GAAG,UAAU,EAAE,CAAC;IACvB,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -27,6 +27,15 @@ export interface AIConfig {
27
27
  insightModelTimeout?: number;
28
28
  insightModelTemperature?: number;
29
29
  }
30
+ export interface ScriptGenerationConfig {
31
+ enabled: boolean;
32
+ baseUrl: string;
33
+ agentId: string;
34
+ token: string;
35
+ connectTimeout: number;
36
+ requestTimeout: number;
37
+ socketTimeout: number;
38
+ }
30
39
  export interface StorageConfig {
31
40
  dbPath: string;
32
41
  }
@@ -59,6 +68,7 @@ export interface AIServerConfig {
59
68
  device: DeviceConfig;
60
69
  task: TaskConfig;
61
70
  ai: AIConfig;
71
+ scriptGeneration?: ScriptGenerationConfig;
62
72
  storage: StorageConfig;
63
73
  node: NodeConfig;
64
74
  callback: CallbackConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,QAAQ,CAAC;IACb,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,cAAc,CAAC;CAC1B"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,QAAQ,CAAC;IACb,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,cAAc,CAAC;CAC1B"}
@@ -0,0 +1,37 @@
1
+ export interface AutobotsConfig {
2
+ enabled: boolean;
3
+ baseUrl: string;
4
+ agentId: string;
5
+ token: string;
6
+ connectTimeout: number;
7
+ requestTimeout: number;
8
+ socketTimeout: number;
9
+ }
10
+ export interface AutobotsStreamChunk {
11
+ data?: {
12
+ response?: string;
13
+ responseAll?: string;
14
+ thinkContent?: string;
15
+ content?: string;
16
+ };
17
+ }
18
+ export declare class AutobotsClient {
19
+ private config;
20
+ constructor(config: AutobotsConfig);
21
+ /**
22
+ * 检查配置是否有效
23
+ */
24
+ validateConfig(): {
25
+ valid: boolean;
26
+ errors: string[];
27
+ };
28
+ /**
29
+ * 生成脚本(流式)
30
+ */
31
+ generateScriptStream(keyword: string, erp?: string): AsyncGenerator<{
32
+ success: boolean;
33
+ content: string;
34
+ error?: string;
35
+ }>;
36
+ }
37
+ //# sourceMappingURL=autobots-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autobots-client.d.ts","sourceRoot":"","sources":["../../src/core/autobots-client.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE;QACL,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;IAIlC;;OAEG;IACH,cAAc,IAAI;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAmBtD;;OAEG;IACI,oBAAoB,CACzB,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,GACX,cAAc,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CA2GzE"}
@@ -0,0 +1,132 @@
1
+ import axios from 'axios';
2
+ import { createLogger } from './logger.js';
3
+ const logger = createLogger('AutobotsClient');
4
+ export class AutobotsClient {
5
+ config;
6
+ constructor(config) {
7
+ this.config = config;
8
+ }
9
+ /**
10
+ * 检查配置是否有效
11
+ */
12
+ validateConfig() {
13
+ const errors = [];
14
+ if (!this.config.baseUrl || this.config.baseUrl.trim() === '') {
15
+ errors.push('base_url 为空');
16
+ }
17
+ if (!this.config.agentId || this.config.agentId.trim() === '') {
18
+ errors.push('agent_id 为空');
19
+ }
20
+ if (!this.config.token || this.config.token.trim() === '') {
21
+ errors.push('token 为空');
22
+ }
23
+ return {
24
+ valid: errors.length === 0,
25
+ errors,
26
+ };
27
+ }
28
+ /**
29
+ * 生成脚本(流式)
30
+ */
31
+ async *generateScriptStream(keyword, erp) {
32
+ // 验证配置
33
+ const validation = this.validateConfig();
34
+ if (!validation.valid) {
35
+ yield {
36
+ success: false,
37
+ content: '',
38
+ error: `配置错误: ${validation.errors.join(', ')}`,
39
+ };
40
+ return;
41
+ }
42
+ const traceId = crypto.randomUUID();
43
+ const reqId = Date.now().toString();
44
+ const erpValue = erp || 'system';
45
+ // 构建请求
46
+ const request = {
47
+ prompt: keyword,
48
+ config: {
49
+ traceId: traceId,
50
+ reqId: reqId
51
+ },
52
+ traceId: traceId,
53
+ reqId: reqId,
54
+ erp: erpValue,
55
+ keyword: keyword,
56
+ };
57
+ logger.info('[AutobotsClient] 发送请求到 Autobots, baseUrl: ' + this.config.baseUrl + ', agentId: ' + this.config.agentId);
58
+ try {
59
+ // 使用 any 类型绕过类型检查,因为 axios 的类型定义可能不兼容
60
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
61
+ const axiosConfig = {
62
+ baseURL: this.config.baseUrl,
63
+ timeout: this.config.socketTimeout,
64
+ headers: {
65
+ 'Content-Type': 'application/json',
66
+ 'autobots-agent-id': this.config.agentId,
67
+ 'autobots-token': this.config.token,
68
+ },
69
+ responseType: 'stream',
70
+ };
71
+ const response = await axios.post('', request, axiosConfig);
72
+ // 处理 SSE 流
73
+ let buffer = '';
74
+ const stream = response.data;
75
+ for await (const chunk of stream) {
76
+ const chunkStr = chunk.toString();
77
+ buffer += chunkStr;
78
+ // 按行分割处理
79
+ let lineEndIndex;
80
+ while ((lineEndIndex = buffer.indexOf('\n')) !== -1) {
81
+ const line = buffer.slice(0, lineEndIndex).trim();
82
+ buffer = buffer.slice(lineEndIndex + 1);
83
+ if (!line)
84
+ continue;
85
+ // 查找 data: 行
86
+ if (line.startsWith('data:')) {
87
+ const dataContent = line.slice(5).trim();
88
+ logger.debug('[AutobotsClient] 收到SSE数据: ' + dataContent.substring(0, 100));
89
+ try {
90
+ const jsonData = JSON.parse(dataContent);
91
+ // 优先发送增量内容(response 字段)
92
+ if (jsonData.data?.response) {
93
+ yield {
94
+ success: true,
95
+ content: jsonData.data.response,
96
+ };
97
+ }
98
+ // 如果没有增量内容但有完整内容
99
+ else if (jsonData.data?.responseAll) {
100
+ // 发送特殊标记,让前端知道这是完整内容
101
+ yield {
102
+ success: true,
103
+ content: `FULL_CONTENT:${jsonData.data.responseAll}`,
104
+ };
105
+ }
106
+ // 检查 content 字段
107
+ else if (jsonData.data?.content) {
108
+ yield {
109
+ success: true,
110
+ content: jsonData.data.content,
111
+ };
112
+ }
113
+ }
114
+ catch (parseError) {
115
+ logger.warn('Failed to parse SSE data');
116
+ }
117
+ }
118
+ }
119
+ }
120
+ }
121
+ catch (error) {
122
+ const errorMessage = error instanceof Error ? error.message : '未知错误';
123
+ logger.error('Autobots API error: ' + errorMessage);
124
+ yield {
125
+ success: false,
126
+ content: '',
127
+ error: `API错误: ${errorMessage}`,
128
+ };
129
+ }
130
+ }
131
+ }
132
+ //# sourceMappingURL=autobots-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autobots-client.js","sourceRoot":"","sources":["../../src/core/autobots-client.ts"],"names":[],"mappings":"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"}
@@ -33,7 +33,13 @@ export declare class DebugWebSocketServer {
33
33
  private handleMessage;
34
34
  private handleSubscribeTaskLogs;
35
35
  private handleUnsubscribeTaskLogs;
36
+ /** 判断 naturalLanguage 是否为可执行代码(而非自然语言描述) */
37
+ private isCodeScript;
36
38
  private handleStartDebug;
39
+ /** 代码模式:在主进程内使用 ActionExecutor 执行 runCode */
40
+ private executeRunCodeInProcess;
41
+ /** 自然语言模式:Fork worker 进程执行 aiAction */
42
+ private executeWithWorkerProcess;
37
43
  private handleExecuteAction;
38
44
  private handleExecuteAiAct;
39
45
  private handleExecuteWebAction;
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-server.d.ts","sourceRoot":"","sources":["../../src/debug/websocket-server.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAgBrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAmB1D,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAkB;IAGnC,OAAO,CAAC,kBAAkB,CAA0C;IAEpE,OAAO,CAAC,uBAAuB,CAA0C;gBAE7D,IAAI,GAAE,MAAa;IAIzB,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAoDlD;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAmB5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAexB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAUlC,OAAO,CAAC,uBAAuB;YA0BjB,aAAa;IAyC3B,OAAO,CAAC,uBAAuB;IAS/B,OAAO,CAAC,yBAAyB;YAUnB,gBAAgB;YAiFhB,mBAAmB;YA0DnB,kBAAkB;YAwDlB,sBAAsB;YA+RtB,qBAAqB;YA4BrB,oBAAoB;YAuBpB,qBAAqB;YAoCrB,eAAe;YA6Bf,aAAa;IAU3B,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,cAAc;IAMtB,WAAW,IAAI,YAAY,EAAE;IAIvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAW7B"}
1
+ {"version":3,"file":"websocket-server.d.ts","sourceRoot":"","sources":["../../src/debug/websocket-server.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAgBrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAmB1D,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAkB;IAGnC,OAAO,CAAC,kBAAkB,CAA0C;IAEpE,OAAO,CAAC,uBAAuB,CAA0C;gBAE7D,IAAI,GAAE,MAAa;IAIzB,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAoDlD;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAmB5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAexB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAUlC,OAAO,CAAC,uBAAuB;YA0BjB,aAAa;IAyC3B,OAAO,CAAC,uBAAuB;IAS/B,OAAO,CAAC,yBAAyB;IAWjC,4CAA4C;IAC5C,OAAO,CAAC,YAAY;YAMN,gBAAgB;IA2B9B,6CAA6C;YAC/B,uBAAuB;IAmDrC,uCAAuC;YACzB,wBAAwB;YAoExB,mBAAmB;YA0DnB,kBAAkB;YAwDlB,sBAAsB;YA+RtB,qBAAqB;YA4BrB,oBAAoB;YAuBpB,qBAAqB;YAoCrB,eAAe;YA6Bf,aAAa;IAU3B,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,cAAc;IAMtB,WAAW,IAAI,YAAY,EAAE;IAIvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAW7B"}
@@ -242,6 +242,13 @@ export class DebugWebSocketServer {
242
242
  });
243
243
  }
244
244
  // ==================== Start Debug (fork worker process) ====================
245
+ /** 判断 naturalLanguage 是否为可执行代码(而非自然语言描述) */
246
+ isCodeScript(text) {
247
+ if (!text)
248
+ return false;
249
+ // 包含 await/this.agent/this.sleep 等 JS 代码特征则视为代码
250
+ return /\bawait\b/.test(text) || /\bthis\.(agent|sleep|page)\b/.test(text);
251
+ }
245
252
  async handleStartDebug(ws, request) {
246
253
  const sessionId = `debug-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
247
254
  const session = sessionManager.create(sessionId, ws, request.deviceId);
@@ -249,68 +256,130 @@ export class DebugWebSocketServer {
249
256
  try {
250
257
  sessionManager.updateStatus(sessionId, 'running');
251
258
  this.sendMessage(ws, { type: 'debug_started', sessionId }, request.deviceId);
252
- // Build executor config from debug request
253
- const execConfig = {
254
- type: request.platform || 'android',
255
- testName: 'debugtest',
256
- url: request.url,
257
- udid: request.deviceId,
258
- packageName: request.packageName,
259
- bundleId: request.bundleId,
260
- mobileMode: request.mobileMode,
261
- requirement: request.naturalLanguage,
262
- executionId: sessionId,
263
- taskId: sessionId,
264
- nodeId: this.config.task.nodeId,
265
- };
266
- // Fork worker process for long-running debug
267
- const workerPath = new URL('../executor/worker-entry.js', import.meta.url).pathname;
268
- const workerEnv = {
269
- ...process.env,
270
- WORKER_CONFIG: JSON.stringify(execConfig),
271
- OPENAI_BASE_URL: this.config.ai.baseUrl,
272
- OPENAI_API_KEY: this.config.ai.apiKey,
273
- MIDSCENE_MODEL_NAME: this.config.ai.modelName,
274
- MIDSCENE_USE_QWEN3_VL: this.config.ai.useQwen3Vl ? '1' : '0',
275
- // Planning model config (consistent with electron-shadcn reference project)
276
- MIDSCENE_PLANNING_MODEL_API_KEY: 'pk-485b2b56-7334-4bed-bd74-09bb42ca3baf',
277
- MIDSCENE_PLANNING_MODEL_BASE_URL: 'https://modelservice.jdcloud.com/v1',
278
- MIDSCENE_PLANNING_MODEL_NAME: 'Qwen3-235B-A22B',
279
- MIDSCENE_PLANNING_MODEL_FAMILY: 'qwen3-vl',
280
- };
281
- const childProcess = fork(workerPath, ['--worker'], {
282
- env: workerEnv,
283
- stdio: ['inherit', 'inherit', 'inherit', 'ipc'],
284
- });
285
- session.process = childProcess;
286
- childProcess.stdout?.on('data', (data) => {
287
- const output = data.toString();
288
- sessionManager.addLog(sessionId, output);
289
- this.sendMessage(ws, { type: 'log_output', sessionId, content: output }, request.deviceId);
290
- });
291
- childProcess.stderr?.on('data', (data) => {
292
- const errorOutput = data.toString();
293
- sessionManager.addLog(sessionId, `ERROR: ${errorOutput}`);
294
- this.sendMessage(ws, { type: 'log_output', sessionId, content: `ERROR: ${errorOutput}`, level: 'error' }, request.deviceId);
295
- });
296
- childProcess.on('exit', (code) => {
297
- const success = code === 0;
298
- sessionManager.updateStatus(sessionId, success ? 'completed' : 'failed');
299
- this.sendMessage(ws, { type: 'debug_completed', sessionId, success, exitCode: code }, request.deviceId);
300
- });
301
- childProcess.on('message', (message) => {
302
- this.sendMessage(ws, { type: 'execution_result', sessionId, ...(typeof message === 'object' && message ? message : {}) }, request.deviceId);
303
- });
304
- childProcess.on('error', (error) => {
305
- sessionManager.updateStatus(sessionId, 'failed');
306
- this.sendMessage(ws, { type: 'debug_error', sessionId, error: error.message }, request.deviceId);
307
- });
259
+ // 判断 naturalLanguage 是代码还是自然语言
260
+ const isCode = this.isCodeScript(request.naturalLanguage || '');
261
+ logger.info(`[Debug] naturalLanguage mode: ${isCode ? 'runCode' : 'aiAction'}, preview: ${(request.naturalLanguage || '').substring(0, 50)}...`);
262
+ if (isCode) {
263
+ // ===== 代码模式:直接在主进程内用 ActionExecutor 执行(与 handleExecuteAction 一致) =====
264
+ await this.executeRunCodeInProcess(ws, sessionId, request);
265
+ }
266
+ else {
267
+ // ===== 自然语言模式:Fork worker 进程,走 aiAction 路径 =====
268
+ await this.executeWithWorkerProcess(ws, sessionId, request);
269
+ }
308
270
  }
309
271
  catch (error) {
310
272
  sessionManager.updateStatus(sessionId, 'failed');
311
273
  this.sendMessage(ws, { type: 'debug_error', sessionId, error: error.message }, request.deviceId);
312
274
  }
313
275
  }
276
+ /** 代码模式:在主进程内使用 ActionExecutor 执行 runCode */
277
+ async executeRunCodeInProcess(ws, sessionId, request) {
278
+ const executor = ExecutorFactory.create('action', {
279
+ sessionId,
280
+ onLog: (msg) => {
281
+ sessionManager.addLog(sessionId, msg);
282
+ this.sendMessage(ws, { type: 'log_output', sessionId, content: msg }, request.deviceId);
283
+ },
284
+ onDump: (dump) => {
285
+ this.sendMessage(ws, { type: 'action_dump', sessionId, dump }, request.deviceId);
286
+ },
287
+ onExecutionLine: (line) => {
288
+ this.sendMessage(ws, { type: 'execution_line', sessionId, line }, request.deviceId);
289
+ },
290
+ });
291
+ const config = {
292
+ type: request.platform || 'android',
293
+ testName: 'debug-runCode',
294
+ actionType: 'runCode',
295
+ actionParams: { code: request.naturalLanguage },
296
+ udid: request.deviceId,
297
+ packageName: request.packageName,
298
+ testUrl: request.url,
299
+ url: request.url,
300
+ modelConfig: undefined,
301
+ executionId: sessionId,
302
+ };
303
+ const result = await executor.execute(config);
304
+ sessionManager.updateStatus(sessionId, result.success ? 'completed' : 'failed');
305
+ this.sendMessage(ws, {
306
+ type: 'action_result',
307
+ sessionId,
308
+ actionType: 'runCode',
309
+ success: result.success,
310
+ result: result.result,
311
+ dump: result.dump || '',
312
+ reportHTML: result.reportHTML || '',
313
+ error: result.errorMessage,
314
+ platform: request.platform || 'android',
315
+ }, request.deviceId);
316
+ // 同时发一份 debug_completed,让前端调试面板能正确更新状态
317
+ this.sendMessage(ws, {
318
+ type: 'debug_completed',
319
+ sessionId,
320
+ success: result.success,
321
+ }, request.deviceId);
322
+ }
323
+ /** 自然语言模式:Fork worker 进程执行 aiAction */
324
+ async executeWithWorkerProcess(ws, sessionId, request) {
325
+ const execConfig = {
326
+ type: request.platform || 'android',
327
+ testName: 'debugtest',
328
+ url: request.url,
329
+ udid: request.deviceId,
330
+ packageName: request.packageName,
331
+ bundleId: request.bundleId,
332
+ mobileMode: request.mobileMode,
333
+ requirement: request.naturalLanguage,
334
+ executionId: sessionId,
335
+ taskId: sessionId,
336
+ nodeId: this.config.task.nodeId,
337
+ };
338
+ // Fork worker process for long-running debug
339
+ const workerPath = new URL('../executor/worker-entry.js', import.meta.url).pathname;
340
+ const workerEnv = {
341
+ ...process.env,
342
+ WORKER_CONFIG: JSON.stringify(execConfig),
343
+ OPENAI_BASE_URL: this.config.ai.baseUrl,
344
+ OPENAI_API_KEY: this.config.ai.apiKey,
345
+ MIDSCENE_MODEL_NAME: this.config.ai.modelName,
346
+ MIDSCENE_USE_QWEN3_VL: this.config.ai.useQwen3Vl ? '1' : '0',
347
+ // Planning model config (consistent with electron-shadcn reference project)
348
+ MIDSCENE_PLANNING_MODEL_API_KEY: 'pk-485b2b56-7334-4bed-bd74-09bb42ca3baf',
349
+ MIDSCENE_PLANNING_MODEL_BASE_URL: 'https://modelservice.jdcloud.com/v1',
350
+ MIDSCENE_PLANNING_MODEL_NAME: 'Qwen3-235B-A22B',
351
+ MIDSCENE_PLANNING_MODEL_FAMILY: 'qwen3-vl',
352
+ };
353
+ const childProcess = fork(workerPath, ['--worker'], {
354
+ env: workerEnv,
355
+ stdio: ['inherit', 'inherit', 'inherit', 'ipc'],
356
+ });
357
+ const session = sessionManager.get(sessionId);
358
+ if (session)
359
+ session.process = childProcess;
360
+ childProcess.stdout?.on('data', (data) => {
361
+ const output = data.toString();
362
+ sessionManager.addLog(sessionId, output);
363
+ this.sendMessage(ws, { type: 'log_output', sessionId, content: output }, request.deviceId);
364
+ });
365
+ childProcess.stderr?.on('data', (data) => {
366
+ const errorOutput = data.toString();
367
+ sessionManager.addLog(sessionId, `ERROR: ${errorOutput}`);
368
+ this.sendMessage(ws, { type: 'log_output', sessionId, content: `ERROR: ${errorOutput}`, level: 'error' }, request.deviceId);
369
+ });
370
+ childProcess.on('exit', (code) => {
371
+ const success = code === 0;
372
+ sessionManager.updateStatus(sessionId, success ? 'completed' : 'failed');
373
+ this.sendMessage(ws, { type: 'debug_completed', sessionId, success, exitCode: code }, request.deviceId);
374
+ });
375
+ childProcess.on('message', (message) => {
376
+ this.sendMessage(ws, { type: 'execution_result', sessionId, ...(typeof message === 'object' && message ? message : {}) }, request.deviceId);
377
+ });
378
+ childProcess.on('error', (error) => {
379
+ sessionManager.updateStatus(sessionId, 'failed');
380
+ this.sendMessage(ws, { type: 'debug_error', sessionId, error: error.message }, request.deviceId);
381
+ });
382
+ }
314
383
  // ==================== Execute Action (direct in-process) ====================
315
384
  async handleExecuteAction(ws, request) {
316
385
  const sessionId = `action-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
@@ -339,7 +408,7 @@ export class DebugWebSocketServer {
339
408
  udid: request.deviceId,
340
409
  packageName: request.packageName,
341
410
  testUrl: request.testUrl,
342
- modelConfig: request.modelConfig,
411
+ modelConfig: undefined,
343
412
  executionId: sessionId,
344
413
  };
345
414
  const result = await executor.execute(config);
@@ -387,7 +456,7 @@ export class DebugWebSocketServer {
387
456
  naturalLanguage: request.naturalLanguage,
388
457
  udid: request.deviceId,
389
458
  packageName: request.packageName,
390
- modelConfig: request.modelConfig,
459
+ modelConfig: undefined,
391
460
  actionParams: {
392
461
  deepLocate: request.deepLocate,
393
462
  deepThink: request.deepThink,
@@ -443,7 +512,7 @@ export class DebugWebSocketServer {
443
512
  session.context = context;
444
513
  session.page = page;
445
514
  session.webAgent = new midscene.PlaywrightAgent(page, {
446
- modelConfig: request.modelConfig,
515
+ modelConfig: undefined,
447
516
  });
448
517
  logger.info(`[WebAction] Browser launched, web session ready: ${sessionId}`);
449
518
  // 自动开启投屏