@empiricalrun/test-gen 0.57.1 → 0.58.0

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.
Files changed (124) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/actions/index.d.ts.map +1 -1
  3. package/dist/actions/skill.js +2 -2
  4. package/dist/actions/utils/index.js +2 -3
  5. package/dist/agent/browsing/index.js +1 -2
  6. package/dist/agent/browsing/run.js +2 -3
  7. package/dist/agent/browsing/utils.js +10 -10
  8. package/dist/agent/chat/agent-loop.d.ts +5 -3
  9. package/dist/agent/chat/agent-loop.d.ts.map +1 -1
  10. package/dist/agent/chat/agent-loop.js +3 -4
  11. package/dist/agent/chat/exports.d.ts +4 -4
  12. package/dist/agent/chat/exports.d.ts.map +1 -1
  13. package/dist/agent/chat/exports.js +19 -9
  14. package/dist/agent/chat/index.d.ts +1 -1
  15. package/dist/agent/chat/index.d.ts.map +1 -1
  16. package/dist/agent/chat/index.js +10 -7
  17. package/dist/agent/chat/prompt.d.ts +2 -1
  18. package/dist/agent/chat/prompt.d.ts.map +1 -1
  19. package/dist/agent/chat/prompt.js +3 -4
  20. package/dist/agent/chat/repo.d.ts +2 -1
  21. package/dist/agent/chat/repo.d.ts.map +1 -1
  22. package/dist/agent/chat/repo.js +32 -36
  23. package/dist/agent/chat/state.d.ts +1 -2
  24. package/dist/agent/chat/state.d.ts.map +1 -1
  25. package/dist/agent/chat/state.js +8 -8
  26. package/dist/agent/codegen/create-test-block.js +1 -2
  27. package/dist/agent/codegen/fix-ts-errors.js +1 -2
  28. package/dist/agent/codegen/generate-code-apply-changes.js +2 -3
  29. package/dist/agent/codegen/lexical-scoped-vars.js +1 -2
  30. package/dist/agent/codegen/repo-edit.js +2 -3
  31. package/dist/agent/codegen/run.js +2 -3
  32. package/dist/agent/codegen/skills-retriever.d.ts +3 -3
  33. package/dist/agent/codegen/skills-retriever.d.ts.map +1 -1
  34. package/dist/agent/codegen/skills-retriever.js +2 -2
  35. package/dist/agent/codegen/test-update-feedback.js +1 -2
  36. package/dist/agent/codegen/update-flow.js +4 -5
  37. package/dist/agent/codegen/use-skill.js +1 -2
  38. package/dist/agent/codegen/utils.js +9 -10
  39. package/dist/agent/cua/computer.js +3 -4
  40. package/dist/agent/cua/index.js +2 -3
  41. package/dist/agent/cua/model.js +1 -2
  42. package/dist/agent/diagnosis-agent/index.js +2 -3
  43. package/dist/agent/diagnosis-agent/strict-mode-violation.js +1 -2
  44. package/dist/agent/enrich-prompt/index.d.ts +1 -1
  45. package/dist/agent/enrich-prompt/index.d.ts.map +1 -1
  46. package/dist/agent/enrich-prompt/utils.js +1 -2
  47. package/dist/agent/infer-agent/index.js +1 -2
  48. package/dist/agent/master/action-tool-calls.js +3 -3
  49. package/dist/agent/master/element-annotation.js +2 -3
  50. package/dist/agent/master/execute-browser-action.d.ts +1 -1
  51. package/dist/agent/master/execute-browser-action.d.ts.map +1 -1
  52. package/dist/agent/master/execute-browser-action.js +1 -2
  53. package/dist/agent/master/execute-skill-action.js +1 -2
  54. package/dist/agent/master/icon-descriptor/index.js +6 -7
  55. package/dist/agent/master/icon-descriptor/normalize-svg.js +1 -2
  56. package/dist/agent/master/next-action.js +1 -2
  57. package/dist/agent/master/planner.d.ts.map +1 -1
  58. package/dist/agent/master/planner.js +1 -2
  59. package/dist/agent/master/run.js +3 -3
  60. package/dist/agent/master/scroller.js +1 -2
  61. package/dist/agent/master/with-hints.d.ts +1 -1
  62. package/dist/agent/master/with-hints.d.ts.map +1 -1
  63. package/dist/agent/planner/run-time-planner.d.ts.map +1 -1
  64. package/dist/agent/planner/run-time-planner.js +1 -2
  65. package/dist/agent/planner/run.js +1 -2
  66. package/dist/bin/logger/index.js +2 -2
  67. package/dist/bin/utils/context.js +5 -6
  68. package/dist/bin/utils/fs/index.d.ts.map +1 -1
  69. package/dist/bin/utils/fs/index.js +4 -5
  70. package/dist/bin/utils/index.js +2 -3
  71. package/dist/bin/utils/platform/web/index.d.ts.map +1 -1
  72. package/dist/bin/utils/platform/web/index.js +21 -21
  73. package/dist/bin/utils/scenarios/index.js +3 -4
  74. package/dist/constants/index.js +1 -1
  75. package/dist/file/server.js +2 -2
  76. package/dist/human-in-the-loop/cli.js +1 -2
  77. package/dist/human-in-the-loop/ipc.js +2 -3
  78. package/dist/index.js +1 -2
  79. package/dist/prompts/lib/ts-transformer.js +17 -7
  80. package/dist/reporter/index.js +3 -3
  81. package/dist/reporter/lib.js +1 -1
  82. package/dist/session/index.js +6 -7
  83. package/dist/test-build/index.js +2 -3
  84. package/dist/tool-call-service/index.d.ts +1 -2
  85. package/dist/tool-call-service/index.d.ts.map +1 -1
  86. package/dist/tools/commit-and-create-pr.js +2 -2
  87. package/dist/tools/grep/index.d.ts.map +1 -1
  88. package/dist/tools/grep/index.js +8 -4
  89. package/dist/tools/grep/ripgrep/index.d.ts +2 -2
  90. package/dist/tools/grep/ripgrep/index.d.ts.map +1 -1
  91. package/dist/tools/grep/ripgrep/index.js +25 -26
  92. package/dist/tools/grep/ripgrep/types.d.ts +1 -3
  93. package/dist/tools/grep/ripgrep/types.d.ts.map +1 -1
  94. package/dist/tools/str_replace_editor.js +3 -3
  95. package/dist/tools/test-run-fetcher/index.js +2 -2
  96. package/dist/tools/utils/index.js +2 -3
  97. package/dist/types/index.d.ts +8 -0
  98. package/dist/types/index.d.ts.map +1 -1
  99. package/dist/uploader/index.js +6 -6
  100. package/dist/uploader/utils.d.ts.map +1 -1
  101. package/dist/uploader/utils.js +2 -2
  102. package/dist/utils/checkpoint.js +2 -3
  103. package/dist/utils/env.js +1 -2
  104. package/dist/utils/exec.js +2 -2
  105. package/dist/utils/file-tree.d.ts +3 -0
  106. package/dist/utils/file-tree.d.ts.map +1 -0
  107. package/dist/utils/file-tree.js +42 -0
  108. package/dist/utils/file.js +1 -2
  109. package/dist/utils/git.d.ts +0 -1
  110. package/dist/utils/git.d.ts.map +1 -1
  111. package/dist/utils/git.js +8 -15
  112. package/dist/utils/html.d.ts.map +1 -1
  113. package/dist/utils/pw-test.js +1 -2
  114. package/dist/utils/repo-tree.d.ts +2 -1
  115. package/dist/utils/repo-tree.d.ts.map +1 -1
  116. package/dist/utils/repo-tree.js +62 -53
  117. package/dist/utils/slug.d.ts.map +1 -1
  118. package/dist/utils/slug.js +1 -1
  119. package/dist/utils/string.js +1 -2
  120. package/package.json +5 -5
  121. package/tsconfig.tsbuildinfo +1 -0
  122. package/dist/agent/chat/model.d.ts +0 -4
  123. package/dist/agent/chat/model.d.ts.map +0 -1
  124. package/dist/agent/chat/model.js +0 -17
@@ -1,3 +1,4 @@
1
+ import { FileInfo } from "../types";
1
2
  export declare const DEFAULT_EXCLUDE: (string | RegExp)[];
2
- export declare function generateAsciiTree(dirPath: string, options?: {}): string;
3
+ export declare function generateAsciiTree(root: FileInfo, options?: {}): string;
3
4
  //# sourceMappingURL=repo-tree.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repo-tree.d.ts","sourceRoot":"","sources":["../../src/utils/repo-tree.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe,qBAW3B,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,KAAK,UAsE9D"}
1
+ {"version":3,"file":"repo-tree.d.ts","sourceRoot":"","sources":["../../src/utils/repo-tree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,eAAO,MAAM,eAAe,qBAW3B,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,KAAK,UAqF7D"}
@@ -1,11 +1,7 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.generateAsciiTree = exports.DEFAULT_EXCLUDE = void 0;
7
- const fs_1 = __importDefault(require("fs"));
8
- const path_1 = __importDefault(require("path"));
3
+ exports.DEFAULT_EXCLUDE = void 0;
4
+ exports.generateAsciiTree = generateAsciiTree;
9
5
  exports.DEFAULT_EXCLUDE = [
10
6
  "node_modules",
11
7
  "dist",
@@ -18,62 +14,75 @@ exports.DEFAULT_EXCLUDE = [
18
14
  "auth",
19
15
  "package-lock.json",
20
16
  ];
21
- function generateAsciiTree(dirPath, options = {}) {
17
+ function generateAsciiTree(root, options = {}) {
22
18
  const defaultOptions = {
23
19
  showHidden: false,
24
20
  exclude: exports.DEFAULT_EXCLUDE,
25
21
  maxDepth: 10,
26
22
  };
27
23
  const opts = { ...defaultOptions, ...options };
28
- // Make sure the path exists and is a directory
29
- if (!fs_1.default.existsSync(dirPath) || !fs_1.default.statSync(dirPath).isDirectory()) {
30
- throw new Error(`"${dirPath}" is not a valid directory path`);
24
+ if (!root.isDirectory) {
25
+ throw new Error(`"${root.path}" is not a valid directory`);
26
+ }
27
+ let result = root.name + "\n";
28
+ const stack = [];
29
+ // Add root's children to stack in reverse order
30
+ const rootChildren = [...root.children]
31
+ .filter((child) => child !== undefined)
32
+ .sort((a, b) => {
33
+ // Files first, then directories
34
+ if (!a.isDirectory && b.isDirectory)
35
+ return -1;
36
+ if (a.isDirectory && !b.isDirectory)
37
+ return 1;
38
+ return a.name.localeCompare(b.name);
39
+ });
40
+ for (let i = rootChildren.length - 1; i >= 0; i--) {
41
+ const child = rootChildren[i];
42
+ if (child) {
43
+ stack.push([child, "", 1, i === 0]);
44
+ }
31
45
  }
32
- // Start with the root directory name
33
- const rootName = path_1.default.basename(dirPath);
34
- let result = rootName + "\n";
35
- function processDirectory(currentPath, prefix = "", depth = 1) {
46
+ while (stack.length > 0) {
47
+ const current = stack.pop();
48
+ if (!current)
49
+ continue;
50
+ const [node, prefix, depth, isLast] = current;
36
51
  if (depth > opts.maxDepth)
37
- return;
38
- const items = fs_1.default.readdirSync(currentPath);
39
- // Sort items: directories first, then files
40
- const sortedItems = items.sort((a, b) => {
41
- const aIsDir = fs_1.default.statSync(path_1.default.join(currentPath, a)).isDirectory();
42
- const bIsDir = fs_1.default.statSync(path_1.default.join(currentPath, b)).isDirectory();
43
- if (aIsDir && !bIsDir)
44
- return -1;
45
- if (!aIsDir && bIsDir)
46
- return 1;
47
- return a.localeCompare(b);
48
- });
49
- // Process each item
50
- sortedItems.forEach((item, index) => {
51
- // Skip hidden files if not showing hidden
52
- if (!opts.showHidden && item.startsWith("."))
53
- return;
54
- // Skip excluded patterns
55
- if (opts.exclude.some((pattern) => typeof pattern === "string"
56
- ? item === pattern
57
- : pattern instanceof RegExp
58
- ? pattern.test(item)
59
- : false))
60
- return;
61
- const itemPath = path_1.default.join(currentPath, item);
62
- const isDirectory = fs_1.default.statSync(itemPath).isDirectory();
63
- const isLast = index === sortedItems.length - 1;
64
- // Current item symbols
65
- const symbol = isLast ? "└── " : "├── ";
66
- const nextPrefix = isLast ? " " : "│ ";
67
- // Add the current item to the result
68
- result += `${prefix}${symbol}${item}${isDirectory ? "/" : ""}\n`;
69
- // Process subdirectories
70
- if (isDirectory) {
71
- processDirectory(itemPath, prefix + nextPrefix, depth + 1);
52
+ continue;
53
+ // Skip hidden files if not showing hidden
54
+ if (!opts.showHidden && node.name.startsWith("."))
55
+ continue;
56
+ // Skip excluded patterns
57
+ if (opts.exclude.some((pattern) => typeof pattern === "string"
58
+ ? node.path === pattern
59
+ : pattern instanceof RegExp
60
+ ? pattern.test(node.path)
61
+ : false))
62
+ continue;
63
+ // Add the current item to the result
64
+ const symbol = isLast ? "└── " : "├── ";
65
+ result += `${prefix}${symbol}${node.name}${node.isDirectory ? "/" : ""}\n`;
66
+ if (node.isDirectory && node.children.length > 0) {
67
+ const nextPrefix = prefix + (isLast ? " " : "│ ");
68
+ // Sort and add children to stack in reverse order
69
+ const children = [...node.children]
70
+ .filter((child) => child !== undefined)
71
+ .sort((a, b) => {
72
+ // Files first, then directories
73
+ if (!a.isDirectory && b.isDirectory)
74
+ return -1;
75
+ if (a.isDirectory && !b.isDirectory)
76
+ return 1;
77
+ return a.name.localeCompare(b.name);
78
+ });
79
+ for (let i = children.length - 1; i >= 0; i--) {
80
+ const child = children[i];
81
+ if (child) {
82
+ stack.push([child, nextPrefix, depth + 1, i === 0]);
83
+ }
72
84
  }
73
- });
85
+ }
74
86
  }
75
- // Start the recursive processing
76
- processDirectory(dirPath);
77
87
  return result;
78
88
  }
79
- exports.generateAsciiTree = generateAsciiTree;
@@ -1 +1 @@
1
- {"version":3,"file":"slug.d.ts","sourceRoot":"","sources":["../../src/utils/slug.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,uBAAuB,SAAgB,MAAM,oBAOzD,CAAC"}
1
+ {"version":3,"file":"slug.d.ts","sourceRoot":"","sources":["../../src/utils/slug.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,uBAAuB,GAAU,MAAM,MAAM,oBAOzD,CAAC"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.asyncGenerateRandomSlug = void 0;
4
- // @ts-expect-error
4
+ // @ts-ignore
5
5
  let customAlphabet;
6
6
  const loadNanoid = async () => {
7
7
  const { customAlphabet: importedCustomAlphabet } = await import("nanoid");
@@ -1,9 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.convertTextToJsComments = void 0;
3
+ exports.convertTextToJsComments = convertTextToJsComments;
4
4
  function convertTextToJsComments(text) {
5
5
  const lines = text.split("\n");
6
6
  const commentedLines = lines.map((line) => `// ${line}`);
7
7
  return commentedLines.join("\n");
8
8
  }
9
- exports.convertTextToJsComments = convertTextToJsComments;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@empiricalrun/test-gen",
3
- "version": "0.57.1",
3
+ "version": "0.58.0",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org/",
6
6
  "access": "public"
@@ -60,9 +60,9 @@
60
60
  "tsx": "^4.16.2",
61
61
  "typescript": "^5.3.3",
62
62
  "zod": "^3.23.8",
63
- "@empiricalrun/llm": "^0.15.3",
64
- "@empiricalrun/r2-uploader": "^0.3.8",
65
- "@empiricalrun/test-run": "^0.8.4"
63
+ "@empiricalrun/llm": "^0.15.4",
64
+ "@empiricalrun/r2-uploader": "^0.3.9",
65
+ "@empiricalrun/test-run": "^0.8.5"
66
66
  },
67
67
  "devDependencies": {
68
68
  "@playwright/test": "1.47.1",
@@ -76,7 +76,7 @@
76
76
  "playwright": "1.47.1",
77
77
  "serve-handler": "^6.1.6",
78
78
  "ts-patch": "^3.3.0",
79
- "@empiricalrun/shared-types": "0.0.7"
79
+ "@empiricalrun/shared-types": "0.0.8"
80
80
  },
81
81
  "scripts": {
82
82
  "dev": "tspc --build --watch",
@@ -0,0 +1 @@
1
+ {"root":["./src/index.ts","./src/actions/assert.ts","./src/actions/click.ts","./src/actions/done.ts","./src/actions/fill.ts","./src/actions/goto.ts","./src/actions/hover.ts","./src/actions/index.ts","./src/actions/next-task.ts","./src/actions/press.ts","./src/actions/skill.ts","./src/actions/text-content.ts","./src/actions/constants/index.ts","./src/actions/utils/index.ts","./src/agent/browsing/index.ts","./src/agent/browsing/run.ts","./src/agent/browsing/utils.ts","./src/agent/chat/agent-loop.ts","./src/agent/chat/exports.ts","./src/agent/chat/index.ts","./src/agent/chat/prompt.ts","./src/agent/chat/repo.ts","./src/agent/chat/state.ts","./src/agent/chat/types.ts","./src/agent/codegen/create-test-block.ts","./src/agent/codegen/fix-ts-errors.ts","./src/agent/codegen/generate-code-apply-changes.ts","./src/agent/codegen/lexical-scoped-vars.ts","./src/agent/codegen/repo-edit.ts","./src/agent/codegen/run.ts","./src/agent/codegen/skills-retriever.ts","./src/agent/codegen/test-update-feedback.ts","./src/agent/codegen/types.ts","./src/agent/codegen/update-flow.ts","./src/agent/codegen/use-skill.ts","./src/agent/codegen/utils.ts","./src/agent/cua/computer.ts","./src/agent/cua/index.ts","./src/agent/cua/model.ts","./src/agent/diagnosis-agent/index.ts","./src/agent/diagnosis-agent/strict-mode-violation.ts","./src/agent/enrich-prompt/index.ts","./src/agent/enrich-prompt/utils.ts","./src/agent/infer-agent/index.ts","./src/agent/master/action-tool-calls.ts","./src/agent/master/element-annotation.ts","./src/agent/master/execute-browser-action.ts","./src/agent/master/execute-skill-action.ts","./src/agent/master/next-action.ts","./src/agent/master/planner.ts","./src/agent/master/run.ts","./src/agent/master/scroller.ts","./src/agent/master/with-hints.ts","./src/agent/master/browser-tests/cua.spec.ts","./src/agent/master/browser-tests/fixtures.ts","./src/agent/master/browser-tests/index.spec.ts","./src/agent/master/browser-tests/skills.spec.ts","./src/agent/master/icon-descriptor/index.ts","./src/agent/master/icon-descriptor/normalize-svg.ts","./src/agent/planner/run-time-planner.ts","./src/agent/planner/run.ts","./src/bin/index.ts","./src/bin/logger/index.ts","./src/bin/utils/context.ts","./src/bin/utils/index.ts","./src/bin/utils/fs/index.ts","./src/bin/utils/platform/web/index.ts","./src/bin/utils/platform/web/test-files/ts-path-import-validate.ts","./src/bin/utils/scenarios/index.ts","./src/browser-injected-scripts/annotate-elements.spec.ts","./src/constants/index.ts","./src/errors/index.ts","./src/evals/add-scenario-agent.evals.ts","./src/evals/append-create-test-agent.evals.ts","./src/evals/fetch-pom-skills-agent.evals.ts","./src/evals/infer-master-or-code-agent.evals.ts","./src/evals/master-agent.evals.ts","./src/evals/type.ts","./src/evals/update-scenario-agent.evals.ts","./src/file/client.ts","./src/file/server.ts","./src/human-in-the-loop/cli.ts","./src/human-in-the-loop/index.ts","./src/human-in-the-loop/ipc.ts","./src/page/index.ts","./src/prompts/lib/ts-transformer.ts","./src/reporter/index.ts","./src/reporter/lib.ts","./src/session/index.ts","./src/test-build/index.ts","./src/tool-call-service/index.ts","./src/tools/codegen-agent.ts","./src/tools/commit-and-create-pr.ts","./src/tools/diagnosis-fetcher.ts","./src/tools/download-build.ts","./src/tools/environment-crud.ts","./src/tools/str_replace_editor.ts","./src/tools/test-gen-browser.ts","./src/tools/test-run.ts","./src/tools/grep/index.ts","./src/tools/grep/ripgrep/index.ts","./src/tools/grep/ripgrep/types.ts","./src/tools/test-run-fetcher/index.ts","./src/tools/test-run-fetcher/types.ts","./src/tools/utils/index.ts","./src/types/handlebars.d.ts","./src/types/index.ts","./src/uploader/index.ts","./src/uploader/utils.ts","./src/utils/checkpoint.ts","./src/utils/env.ts","./src/utils/exec.ts","./src/utils/file-tree.ts","./src/utils/file.ts","./src/utils/git.ts","./src/utils/html.ts","./src/utils/index.ts","./src/utils/pw-test.ts","./src/utils/repo-tree.ts","./src/utils/slug.ts","./src/utils/string.ts"],"version":"5.8.3"}
@@ -1,4 +0,0 @@
1
- import { IChatModel } from "@empiricalrun/llm/chat";
2
- import { SupportedChatModels } from "./types";
3
- export declare function createChatModel(messages: any[], selectedModel: SupportedChatModels): IChatModel<any>;
4
- //# sourceMappingURL=model.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/agent/chat/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,UAAU,EAEX,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE9C,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,GAAG,EAAE,EACf,aAAa,EAAE,mBAAmB,GACjC,UAAU,CAAC,GAAG,CAAC,CAWjB"}
@@ -1,17 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createChatModel = void 0;
4
- const chat_1 = require("@empiricalrun/llm/chat");
5
- function createChatModel(messages, selectedModel) {
6
- if (selectedModel.startsWith("claude")) {
7
- return new chat_1.ClaudeChatModel(messages);
8
- }
9
- if (selectedModel.startsWith("gemini")) {
10
- return new chat_1.GeminiChatModel(messages);
11
- }
12
- if (selectedModel.startsWith("o4")) {
13
- return new chat_1.OpenAIChatModel(messages);
14
- }
15
- throw new Error(`Unsupported model: ${selectedModel}`);
16
- }
17
- exports.createChatModel = createChatModel;