[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"tool-Gabriella439--grace":3,"similar-Gabriella439--grace":99},{"id":4,"github_repo":5,"name":6,"description_en":7,"description_zh":8,"ai_summary_zh":8,"readme_en":9,"readme_zh":10,"quickstart_zh":11,"use_case_zh":12,"hero_image_url":13,"owner_login":14,"owner_name":15,"owner_avatar_url":16,"owner_bio":17,"owner_company":17,"owner_location":18,"owner_email":19,"owner_twitter":20,"owner_website":21,"owner_url":22,"languages":23,"stars":44,"forks":45,"last_commit_at":46,"license":47,"difficulty_score":48,"env_os":49,"env_gpu":50,"env_ram":49,"env_deps":51,"category_tags":57,"github_topics":62,"view_count":31,"oss_zip_url":17,"oss_zip_packed_at":17,"status":69,"created_at":70,"updated_at":71,"faqs":72,"releases":98},3594,"Gabriella439\u002Fgrace","grace","A prompt engineering functional programming language","Grace 是一门专为提示工程（Prompt Engineering）设计的函数式编程语言，旨在帮助开发者高效构建和自动生成复杂的提示链。它解决了传统提示工程中手动拼接字符串、难以结构化输出以及缺乏类型安全保障的痛点，让与大模型的交互像编写普通代码一样严谨且流畅。\n\nGrace 非常适合需要频繁调用大模型进行数据生成、逻辑处理或代码辅助的开发者及技术研究人员。其核心亮点在于“开箱即用”的集成体验：无需安装依赖，内置的 `prompt` 函数可直接调用模型。更独特的是，Grace 拥有强大的类型推导能力，能根据代码中变量的使用方式自动反推所需的 JSON Schema，从而精准约束模型输出格式，甚至在无需编写具体提示词的情况下也能获得结构化数据。此外，它还支持通过 `import prompt` 语法直接让模型生成可执行的 Grace 代码片段，实现了从自然语言到可运行逻辑的无缝转化。用户可以通过浏览器访问 trygrace.dev 立即体验其交互式教程，快速上手这一创新的开发工具。","# Grace\n\n[![built with garnix](https:\u002F\u002Fimg.shields.io\u002Fendpoint.svg?url=https%3A%2F%2Fgarnix.io%2Fapi%2Fbadges%2FGabriella439%2Fgrace)](https:\u002F\u002Fgarnix.io\u002Frepo\u002FGabriella439\u002Fgrace)\n[![BlueSky | @trygrace.dev](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FBluesky-@trygrace.dev-blue)](https:\u002F\u002Fbsky.app\u002Fprofile\u002Ftrygrace.dev)\n\nGrace (short for [Fall-from-Grace](#name)) is a domain-specific programming\nlanguage for prompting models.  In particular, Grace is well-suited for building\nand auto-generating elaborate prompt chains\n\nYou can use Grace in your browser without installing anything by visiting\n[trygrace.dev](https:\u002F\u002Ftrygrace.dev\u002F).  That website includes an interactive\ntutorial and is the recommended way to both learn and get started with using\nGrace.\n\n## Features\n\n- Integrated language support for models\n\n  You don't need to install any dependencies or import anything to get started.\n  Everything you need is built directly into the language.\n\n  The language provides a built-in `prompt` function for prompting a model:\n\n  ```haskell\n  >>> let key = .\u002Fopenai.key : Key\n\n  >>> prompt{ key, text: \"Generate a list of names\" }\n  \"\n  Here are 40 varied first names (mixed genders and cultures):\n\n  - Aiden\n  - Sofia\n  - Mateo\n  …\n  - Mabel\n  - Imani\n  - Zane\n\n  Want names filtered by gender, culture, style (modern\u002Fvintage), or as full names\u002Fsurnames?\"\n  ```\n\n  … and you can structure the output by giving a type annotation:\n\n  ```haskell\n  >>> prompt{ key, text: \"Generate a list of names\" } : List Text\n  [ \"Ava Thompson\"\n  , \"Liam Patel\"\n  , \"Sophia Martinez\"\n  …\n  , \"Jackson Rivera\"\n  , \"Zoe Wilson\"\n  , \"Aiden Park\"\n  ]\n  ```\n\n  If the type is sufficiently self-explanatory, you can even omit the prompt:\n\n  ```haskell\n  >>> prompt{ key } : List { name: Text }\n  [ { \"name\": \"Alice\" }\n  , { \"name\": \"Bob\" }\n  , { \"name\": \"Charlie\" }\n  , { \"name\": \"Diana\" }\n  , { \"name\": \"Evan\" }\n  ]\n  ```\n\n  In fact, you can omit the type, too, if the type can be inferred from use:\n\n  ```haskell\n  >>> for { name } of prompt{ key } in \"Hello, ${name}!\"\n  [ \"Hello, Alice!\"\n  , \"Hello, Bob!\"\n  , \"Hello, Carol!\"\n  , \"Hello, Dave!\"\n  , \"Hello, Eve!\"\n  ]\n  ```\n\n- JSON schemas inferred from use\n\n  That last example works even without a prompt, schema, or type because Grace's\n  type checker reasons backwards from how the output is used to infer the\n  correct JSON schem, like this:\n\n  - the type checker infers that the `name` variable must be `Text`\n\n    … because the `name` variable is interpolated into `\"Hello, ${name}!\"`\n\n  - the type checker infers that the `prompt` function must generate a `List`\n\n    … because the program loops over the output using a `for … of` loop.\n\n  - the type checker infers each element of the `List` has type `{ name: Text }`\n\n    … because the `for … of` loop destructures each element using `{ name }`\n\n  - therefore the `prompt` function outputs a value of type `List{ name: Text }`\n\n  … which you can read as \"a `List` of records, each of which has a `name` field\n  containing `Text`\".\n\n  The interpreter then converts that Grace type into the following matching JSON\n  schema to constrain the model's output:\n\n  ```json\n  {\n    \"type\": \"array\",\n    \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": {\n          \"type\": \"string\"\n        }\n      },\n      \"required\": [\"name\"],\n      \"additionalProperties\": false\n    }\n  }\n  ```\n\n  Finally, the model infers from that JSON schema alone (without any additional\n  prompt) that it should generate a JSON-encoded list of names.\n\n- Code generation\n\n  You can prefix the `prompt` keyword with `import` to ask the model to generate\n  a Grace expression of any type.  For example:\n\n  ```haskell\n  >>> import prompt{ key, text: \"increment\" }\n  \\n -> n + 1\n  ```\n\n  You can use an explicit type annotation to guide the generated code:\n\n  ```haskell\n  >>> import prompt{ key, text: \"increment\" } : { input: Natural } -> { output: Natural }\n  \\{ input } -> { \"output\": input + 1 }\n  ```\n\n  … and if the type is informative enough then you can omit the prompt:\n\n  ```haskell\n  >>> import prompt{ key } : { \"Job Description\": Text } -> { \"Is Finance?\": Bool }\n  let key = 🔒\n\n  in  \\{ \"Job Description\" } ->\n        prompt\n          { \"key\":\n              key\n          , \"text\":\n              \"\n              Determine whether the following job description is for a finance role.\n              Return a JSON object with a single boolean field \\\"Is Finance?\\\": true if it is a finance role, otherwise false.\n              Answer only valid JSON, nothing else.\n  \n              Job description:\n              ${.'Job Description'}\n              \"\n          , \"model\":\n              null\n          , \"search\":\n              null\n          , \"effort\":\n              null\n          }\n          : { \"Is Finance?\": Bool }\n  ```\n\n  Notice in that last example how the model can generate code which itself\n  `prompt`s an model.  Neat!\n\n  Inferred types also guide the code generation process, too!\n\n  ```haskell\n  >>> let upper = import prompt{ key, text: \"uppercase\" } in \"Hello, ${upper \"gabby\"}!\"\n  \"Hello, GABBY!\"\n  ```\n\n  There the model infers that the type of the `upper` function needs to be\n  `Text -> Text` (a function whose input is `Text` and whose output is `Text`)\n  and generates an function matching that type which uppercases `Text`.\n\n### Command line\n\nThis Haskell package builds a `grace` executable with the following command-line\nAPI:\n\n```bash\n$ grace --help\nUsage: grace COMMAND\n  Command-line utility for the Grace language\n\nAvailable options:\n  -h,--help                Show this help text\n\nAvailable commands:\n  interpret                Interpret a Grace file\n  text                     Render a Grace text literal\n  format                   Format Grace code\n  builtins                 List all built-in functions and their types\n  repl                     Enter a REPL for Grace\n```\n\nYou can use the `interpret` subcommand for interpreting a single file:\n\n```haskell\n# .\u002Fgreet.ffg\n\nfor { name } of prompt{ key: .\u002Fopenai-key.txt }\n\nin  \"Hello, ${name}!\"\n```\n\n```bash\n$ grace interpret .\u002Fgreet.ffg\n```\n```json\n[ \"Hello, Alice!\", \"Hello, Bob!\", \"Hello, Charlie!\" ]\n```\n\n… and you can specify `-` to process standard input instead of a file, like\nthis:\n\n```bash\n$ grace interpret - \u003C\u003C\u003C '2 + 2'\n```\n```haskell\n4\n```\n\nYou can also use the `repl` subcommand for interactive usage:\n\n```bash\n$ grace repl\n```\n```haskell\n>>> let key = .\u002Fopenai-key.txt\n>>> prompt{ key } : List { \"First Name\": Text, \"Last Name\": Text }\n[ { \"First Name\": \"John\", \"Last Name\": \"Doe\" }\n, { \"First Name\": \"Jane\", \"Last Name\": \"Smith\" }\n, { \"First Name\": \"Alice\", \"Last Name\": \"Johnson\" }\n, { \"First Name\": \"Michael\", \"Last Name\": \"Brown\" }\n, { \"First Name\": \"Emily\", \"Last Name\": \"Davis\" }\n]\n```\n\n## Name\n\nLike all of my programming language projects, Grace is named after a character\nfrom PlaneScape: Torment, specifically\n[Fall-from-Grace](https:\u002F\u002Ftorment.fandom.com\u002Fwiki\u002FFall-from-Grace).\n\nThe name of this programming language conflicts with\n[another programming language](http:\u002F\u002Fgracelang.org\u002Fapplications\u002F), so use the\nlonger name, \"Fall-from-Grace\", to disambiguate when it's not clear from the\ncontext.\n","# Grace\n\n[![由 garnix 构建](https:\u002F\u002Fimg.shields.io\u002Fendpoint.svg?url=https%3A%2F%2Fgarnix.io%2Fapi%2Fbadges%2FGabriella439%2Fgrace)](https:\u002F\u002Fgarnix.io\u002Frepo\u002FGabriella439\u002Fgrace)\n[![BlueSky | @trygrace.dev](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FBluesky-@trygrace.dev-blue)](https:\u002F\u002Fbsky.app\u002Fprofile\u002Ftrygrace.dev)\n\nGrace（“Fall-from-Grace”的缩写，见下文）是一种用于提示模型的领域特定编程语言。特别地，Grace 非常适合构建和自动生成复杂的提示链。\n\n您无需安装任何东西，只需访问 [trygrace.dev](https:\u002F\u002Ftrygrace.dev\u002F) 即可在浏览器中使用 Grace。该网站包含一个交互式教程，是学习和开始使用 Grace 的推荐方式。\n\n## 特性\n\n- 针对模型的集成语言支持\n\n  您无需安装任何依赖或导入任何内容即可开始使用。所需的一切都直接内置于语言中。\n\n  该语言提供了一个内置的 `prompt` 函数来向模型发出提示：\n\n  ```haskell\n  >>> let key = .\u002Fopenai.key : Key\n\n  >>> prompt{ key, text: \"生成一份名字列表\" }\n  \"\n  这里有40个风格各异的常见名字（男女兼有，文化背景多样）：\n\n  - 艾登\n  - 索菲娅\n  - 马特奥\n  …\n  - 梅贝尔\n  - 伊玛尼\n  - 泽恩\n\n  您是否希望按性别、文化、风格（现代\u002F复古）筛选，或者以全名\u002F姓氏的形式呈现这些名字？\"\n  ```\n\n  … 并且您可以通过提供类型注解来组织输出：\n\n  ```haskell\n  >>> prompt{ key, text: \"生成一份名字列表\" } : List Text\n  [ \"艾娃·汤普森\"\n  , \"利亚姆·帕特尔\"\n  , \"索菲娅·马丁内斯\"\n  …\n  , \"杰克逊·里维拉\"\n  , \"佐伊·威尔逊\"\n  , \"艾登·帕克\"\n  ]\n  ```\n\n  如果类型足够明确，甚至可以省略提示：\n\n  ```haskell\n  >>> prompt{ key } : List { name: Text }\n  [ { \"name\": \"爱丽丝\" }\n  , { \"name\": \"鲍勃\" }\n  , { \"name\": \"查理\" }\n  , { \"name\": \"黛安娜\" }\n  , { \"name\": \"伊芙\" }\n  ]\n  ```\n\n  实际上，如果类型可以从用法中推断出来，连类型也可以省略：\n\n  ```haskell\n  >>> for { name } of prompt{ key } in \"你好，${name}！\"\n  [ \"你好，爱丽丝！\"\n  , \"你好，鲍勃！\"\n  , \"你好，卡罗尔！\"\n  , \"你好，戴夫！\"\n  , \"你好，伊芙！\"\n  ]\n  ```\n\n- 根据用法推断出的 JSON 模式\n\n  上面最后一个例子即使没有提示、模式或类型也能正常工作，因为 Grace 的类型检查器会根据输出的使用方式反向推理出正确的 JSON 模式，如下所示：\n\n  - 类型检查器推断出变量 `name` 必须是 `Text` 类型，\n\n    因为 `name` 变量被插值到 `\"你好，${name}！\"` 中。\n\n  - 类型检查器推断出 `prompt` 函数必须生成一个 `List` 类型的值，\n\n    因为程序使用 `for … of` 循环遍历了输出。\n\n  - 类型检查器推断出 `List` 中的每个元素都是 `{ name: Text }` 类型，\n\n    因为 `for … of` 循环通过 `{ name }` 解构了每个元素。\n\n  - 因此，`prompt` 函数的输出类型是 `List{ name: Text }`，\n\n    你可以将其理解为“一个记录列表，其中每个记录都有一个名为 `name` 的字段，字段值为 `Text`”。\n\n  解释器随后会将这个 Grace 类型转换为以下匹配的 JSON 模式，以约束模型的输出：\n\n  ```json\n  {\n    \"type\": \"array\",\n    \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": {\n          \"type\": \"string\"\n        }\n      },\n      \"required\": [\"name\"],\n      \"additionalProperties\": false\n    }\n  }\n  ```\n\n  最后，模型仅从这个 JSON 模式中（无需任何额外提示）推断出它应该生成一个包含名字的 JSON 编码列表。\n\n- 代码生成\n\n  您可以在 `prompt` 关键字前加上 `import`，要求模型生成任意类型的 Grace 表达式。例如：\n\n  ```haskell\n  >>> import prompt{ key, text: \"increment\" }\n  \\n -> n + 1\n  ```\n\n  您还可以使用显式的类型注解来指导生成的代码：\n\n  ```haskell\n  >>> import prompt{ key, text: \"increment\" } : { input: Natural } -> { output: Natural }\n  \\{ input } -> { \"output\": input + 1 }\n  ```\n\n  … 如果类型足够清晰，甚至可以省略提示：\n\n  ```haskell\n  >>> import prompt{ key } : { \"职位描述\": Text } -> { \"是否属于金融行业？\": Bool }\n  let key = 🔒\n\n  in  \\{ \"职位描述\" } ->\n        prompt\n          { \"key\":\n              key\n          , \"text\":\n              \"\n              判断以下职位描述是否属于金融行业。请返回一个只包含布尔型字段 '是否属于金融行业？' 的 JSON 对象：如果是金融行业，则为 true；否则为 false。请仅回答有效的 JSON，不要添加其他内容。\n\n              职位描述：\n              ${.'Job Description'}\n              \"\n          , \"model\":\n              null\n          , \"search\":\n              null\n          , \"effort\":\n              null\n          }\n          : { \"是否属于金融行业？\": Bool }\n  ```\n\n  在最后一个例子中，您会注意到模型能够生成一段自身还会再次调用 `prompt` 的代码。真巧妙！\n\n  推断出的类型同样也会指导代码生成过程！\n\n  ```haskell\n  >>> let upper = import prompt{ key, text: \"uppercase\" } in \"你好，${upper \"gabby\"}！\"\n  \"你好，GABBY！\"\n  ```\n\n  在这里，模型推断出 `upper` 函数的类型应该是 `Text -> Text`（即输入为 `Text`、输出也为 `Text` 的函数），并生成了一个符合该类型、能够将文本转为大写的函数。\n\n### 命令行工具\n\n这个 Haskell 包构建了一个名为 `grace` 的可执行文件，其命令行 API 如下：\n\n```bash\n$ grace --help\n用法：grace COMMAND\n  Grace 语言的命令行工具\n\n可用选项：\n  -h,--help                显示此帮助文本\n\n可用命令：\n  interpret                解释一个 Grace 文件\n  text                     渲染一个 Grace 文本字面量\n  format                   格式化 Grace 代码\n  builtins                 列出所有内置函数及其类型\n  repl                     进入 Grace 的 REPL 环境\n```\n\n您可以使用 `interpret` 子命令来解释单个文件：\n\n```bash\n# .\u002Fgreet.ffg\n\nfor { name } of prompt{ key: .\u002Fopenai-key.txt }\n\nin  \"你好，${name}！\"\n```\n\n```bash\n$ grace interpret .\u002Fgreet.ffg\n```\n```json\n[ \"你好，Alice！\", \"你好，Bob！\", \"你好，Charlie！\" ]\n```\n\n… 您也可以指定 `-` 来处理标准输入而不是文件，例如：\n\n```bash\n$ grace interpret - \u003C\u003C\u003C '2 + 2'\n```\n```haskell\n4\n```\n\n此外，您还可以使用 `repl` 子命令进行交互式使用：\n\n```bash\n$ grace repl\n```\n```haskell\n>>> let key = .\u002Fopenai-key.txt\n>>> prompt{ key } : List { \"First Name\": Text, \"Last Name\": Text }\n[ { \"First Name\": \"John\", \"Last Name\": \"Doe\" }\n, { \"First Name\": \"Jane\", \"Last Name\": \"Smith\" }\n, { \"First Name\": \"Alice\", \"Last Name\": \"Johnson\" }\n, { \"First Name\": \"Michael\", \"Last Name\": \"Brown\" }\n, { \"First Name\": \"Emily\", \"Last Name\": \"Davis\" }\n]\n```\n\n## 名称\n\n和我所有的编程语言项目一样，Grace 的名字来源于《无主之地：折磨》中的一个角色，具体来说就是\n[堕落者](https:\u002F\u002Ftorment.fandom.com\u002Fwiki\u002FFall-from-Grace)。\n\n由于这个编程语言的名称与另一个编程语言\n[grace](http:\u002F\u002Fgracelang.org\u002Fapplications\u002F) 重名，在上下文不够明确的情况下，请使用全称“Fall-from-Grace”以避免混淆。","# Grace 快速上手指南\n\nGrace（全称 Fall-from-Grace）是一门专为提示工程（Prompt Engineering）设计的领域特定语言（DSL）。它内置了对大模型的原生支持，能够自动推断类型和 JSON Schema，非常适合构建复杂的提示链和自动生成代码。\n\n## 环境准备\n\n*   **操作系统**：支持 Linux、macOS 及 Windows（通过 WSL）。\n*   **前置依赖**：\n    *   无需安装额外的编程语言运行时或依赖库（Grace 是自包含的可执行文件）。\n    *   需要准备一个大模型 API 密钥（如 OpenAI Key），保存为文本文件（例如 `openai.key`）。\n*   **在线体验（推荐）**：\n    如果你不想在本地安装，可以直接访问 [trygrace.dev](https:\u002F\u002Ftrygrace.dev\u002F) 使用浏览器内的交互式教程和 REPL 环境，这是最快捷的上手方式。\n\n## 安装步骤\n\n目前主要通过 Haskell 生态或直接下载预编译二进制文件进行安装。\n\n### 方式一：使用 Garnix\u002FCachix (推荐，适用于 Nix 用户)\n如果你使用 Nix 包管理器，可以通过 Garnix 缓存快速安装：\n\n```bash\nnix-env -iA grace -f https:\u002F\u002Fgithub.com\u002FGabriella439\u002Fgrace\u002Farchive\u002Fmain.tar.gz\n```\n\n### 方式二：从源码构建 (需要 Haskell 环境)\n如果你已安装 `cabal` 或 `stack`：\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FGabriella439\u002Fgrace.git\ncd grace\ncabal install\n```\n\n### 验证安装\n安装完成后，运行以下命令查看帮助信息以确认安装成功：\n\n```bash\ngrace --help\n```\n\n## 基本使用\n\nGrace 的核心在于使用 `prompt` 函数调用模型，并利用类型系统自动约束输出格式。\n\n### 1. 启动交互式 REPL\n运行以下命令进入交互模式：\n\n```bash\ngrace repl\n```\n\n### 2. 基础提示与类型推断\n在 REPL 中，你可以直接加载密钥并调用模型。Grace 会根据你提供的类型注解自动构建 JSON Schema 并约束模型输出。\n\n**示例：生成指定类型的列表**\n\n```haskell\n>>> let key = .\u002Fopenai.key : Key\n\n>>> prompt{ key, text: \"Generate a list of names\" } : List Text\n[ \"Ava Thompson\"\n, \"Liam Patel\"\n, \"Sophia Martinez\"\n]\n```\n\n**示例：省略提示词，仅靠类型推断**\n如果类型定义足够清晰，甚至可以省略具体的提示文本，模型会根据类型自行生成内容：\n\n```haskell\n>>> prompt{ key } : List { name: Text }\n[ { \"name\": \"Alice\" }\n, { \"name\": \"Bob\" }\n, { \"name\": \"Charlie\" }\n]\n```\n\n**示例：在使用场景中自动推断**\n你还可以完全不写类型注解，让编译器根据代码的使用方式反向推断：\n\n```haskell\n>>> for { name } of prompt{ key } in \"Hello, ${name}!\"\n[ \"Hello, Alice!\"\n, \"Hello, Bob!\"\n, \"Hello, Carol!\"\n]\n```\n*原理：编译器发现 `name` 被用于字符串插值推断为 `Text`，发现使用了 `for` 循环推断为 `List`，从而自动生成对应的 Schema。*\n\n### 3. 代码生成\n使用 `import prompt` 可以让模型直接生成 Grace 代码片段。\n\n**示例：生成一个简单的函数**\n\n```haskell\n>>> import prompt{ key, text: \"increment\" }\n\\n -> n + 1\n```\n\n**示例：结合类型注解生成复杂逻辑**\n\n```haskell\n>>> import prompt{ key } : { \"Job Description\": Text } -> { \"Is Finance?\": Bool }\n\\{ \"Job Description\" } ->\n  prompt\n    { \"key\": key\n    , \"text\": \"Determine whether the following job description is for a finance role...\"\n    }\n    : { \"Is Finance?\": Bool }\n```\n\n### 4. 运行脚本文件\n你可以将逻辑写入 `.ffg` 文件并通过命令行执行。\n\n**创建文件 `greet.ffg`：**\n```haskell\nfor { name } of prompt{ key: .\u002Fopenai-key.txt }\n\nin  \"Hello, ${name}!\"\n```\n\n**执行脚本：**\n```bash\ngrace interpret .\u002Fgreet.ffg\n```\n\n**输出结果：**\n```json\n[ \"Hello, Alice!\", \"Hello, Bob!\", \"Hello, Charlie!\" ]\n```","某电商数据团队需要每日从非结构化的用户评论中提取商品特征、情感倾向及改进建议，并自动生成标准化的 JSON 报告供下游分析系统使用。\n\n### 没有 grace 时\n- 开发人员需手动编写冗长的 Prompt 模板，反复调试才能勉强让模型输出合法的 JSON 格式，极易出现括号不匹配或字段缺失。\n- 当业务需求变更（如新增“适用人群”字段）时，必须同时修改 Prompt 文本和后端的 JSON 解析逻辑，维护成本高昂且容易出错。\n- 缺乏类型安全保障，模型偶尔输出的自由文本会导致后端程序崩溃，团队不得不花费大量时间编写额外的异常捕获和清洗代码。\n- 构建复杂的多步处理链（如先提取关键词再分类）时，脚本变得臃肿不堪，难以阅读和复用。\n\n### 使用 grace 后\n- 利用类型推导机制，开发者只需定义目标数据结构（如 `List { feature: Text, sentiment: Text }`），grace 自动将其转换为精准的 JSON Schema 约束模型输出，彻底杜绝格式错误。\n- 业务字段变更时，仅需调整类型定义，grace 会自动反向推导并更新隐含的 Prompt 指令与校验逻辑，实现“改一处而动全身”的安全迭代。\n- 内置的类型检查器在运行前即可发现数据结构不匹配的问题，确保模型输出永远符合预期，完全消除了运行时解析异常的风险。\n- 借助函数式特性，复杂的提取与分析流程可被拆解为简洁的组合函数，通过 `import prompt` 直接生成处理逻辑，代码清晰且易于测试。\n\ngrace 通过将数据类型作为提示工程的核心，把不可控的自然语言交互转变为类型安全、可自动推导的可靠软件开发流程。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FGabriella439_grace_faa4013a.png","Gabriella439","gabby","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002FGabriella439_6f5ec9b1.jpg",null,"San Jose, CA","GenuineGabriella@gmail.com","GabriellaG439","haskellforall.com","https:\u002F\u002Fgithub.com\u002FGabriella439",[24,28,32,36,40],{"name":25,"color":26,"percentage":27},"Haskell","#5e5086",96.2,{"name":29,"color":30,"percentage":31},"Nix","#7e7eff",2,{"name":33,"color":34,"percentage":35},"CSS","#663399",1.4,{"name":37,"color":38,"percentage":39},"HTML","#e34c26",0.4,{"name":41,"color":42,"percentage":43},"Shell","#89e051",0,552,42,"2026-04-03T18:30:56","BSD-3-Clause",1,"未说明","不需要 GPU",{"notes":52,"python":53,"dependencies":54},"该工具是一个基于 Haskell 的领域特定语言（DSL），用于构建提示词链，并非本地运行的 AI 模型，因此无需 GPU 或特定 Python 环境。用户可通过浏览器 (trygrace.dev) 直接使用，或通过命令行安装 Haskell 包运行。运行时需配置 OpenAI API Key。","不适用",[55,56],"Haskell (编译环境)","garnix (构建工具)",[58,59,60,61],"图像","语言模型","开发框架","Agent",[63,64,65,66,67,68],"ai","functional-programming","llm","programming-language","prompt-engineering","interpreter","ready","2026-03-27T02:49:30.150509","2026-04-06T05:32:23.480876",[73,78,83,88,93],{"id":74,"question_zh":75,"answer_zh":76,"source_url":77},16457,"如何理解和使用 JSON\u002Ffold 处理递归数据结构？","JSON 值被建模为一个函数，该函数接受一个包含所有构造函数（如 bool, natural, array 等）的记录作为参数。`JSON\u002Ffold` 的作用是将你提供的处理器（handlers）作为这些构造函数的替换函数传入。\n\n例如，列表 `[true, 1]` 在内部表示为：\n`\\constructors -> constructors.array [constructors.bool true, constructors.natural 1]`\n\n当你调用 `JSON\u002Ffold` 时，你提供的记录 `{ \"bool\": ..., \"array\": ... }` 就成为了这个 `constructors` 参数。这种机制允许在不支持原生递归的语言中通过折叠（fold）来模拟递归计算。你可以参考这篇博客文章加深理解：https:\u002F\u002Fwww.haskellforall.com\u002F2021\u002F02\u002Ffolds-are-constructor-substitution.html","https:\u002F\u002Fgithub.com\u002FGabriella439\u002Fgrace\u002Fissues\u002F44",{"id":79,"question_zh":80,"answer_zh":81,"source_url":82},16458,"为什么在记录类型注解中包含多态类型（forall）时会报错 'Unbound type variable'？","这是一个已知的问题，通常发生在尝试将具有多态字段的记录直接注解为包含 `forall` 的类型时（例如 `{ wrapped: forall (a: Type). a -> a }`）。\n\n目前的变通方法是将 `forall` 量词移到整个记录类型的外部。例如，将类型注解从：\n`{ wrapped: forall (a: Type). a -> a }`\n改为：\n`forall (a: Type). { wrapped: a -> a }`\n\n维护者已确认这是一个需要修复的问题，并欢迎提交相关的 Pull Request。","https:\u002F\u002Fgithub.com\u002FGabriella439\u002Fgrace\u002Fissues\u002F61",{"id":84,"question_zh":85,"answer_zh":86,"source_url":87},16459,"grace interpret 命令在执行时卡住不动（特别是在调用 prompt 函数时）怎么办？","这通常是因为 `prompt` 函数中的 HTTP 请求重试机制配置问题。默认情况下，某些分支可能配置了无限重试或过长的退避时间，导致在网络错误或 API 密钥问题时程序看似挂起。\n\n解决方案是修改重试策略以限制重试次数。你可以在源码 `src\u002FGrace\u002FHTTP.hs` 中找到相关配置，将其修改为限制重试次数，例如：\n`retryPolicy = Retry.fullJitterBackoff 1000000 \u003C> Retry.limitRetries 3`\n\n此外，有用户反馈在遇到此类问题时，轮换（更换）OpenAI API Key 也能解决问题。","https:\u002F\u002Fgithub.com\u002FGabriella439\u002Fgrace\u002Fissues\u002F156",{"id":89,"question_zh":90,"answer_zh":91,"source_url":92},16460,"Grace 是否支持远程导入（Remote Imports）？","是的，Grace 已经支持远程导入功能（相关代码已合并）。\n\n关于导入的元数据（如完整性校验 sha256 或 HTTP 头），目前的理念是保持语言核心的简洁，仅支持无修饰的导入。对于需要安全保证、自定义头或完整性检查的高级用例，建议通过语言的 Fork 版本或特定的资源操作符来实现，而不是全部内置到核心语法中。只要能够导入类似 Prelude 的标准库包，即视为满足基本需求。","https:\u002F\u002Fgithub.com\u002FGabriella439\u002Fgrace\u002Fissues\u002F10",{"id":94,"question_zh":95,"answer_zh":96,"source_url":97},16461,"如何在 Grace 中为子表达式添加类型注解（Annotating subexpressions）？","虽然算法本身不直接开箱即用支持所有复杂的子表达式注解场景，但可以通过以下策略实现：\n\n1. 收集一个只写的上下文日志，记录所有类型信息（包括 Lambda 参数注解）。\n2. 使用自顶向下的方式利用该上下文来“完成”（complete）每个子表达式的类型推导。\n3. 确保所有变量具有唯一名称以避免冲突。\n\n当遇到泛化问题时，可以利用已完成的多态类型（如 `forall (a : Type) . a -> a`）来反推具体变量的类型约束（例如推导 `a? = a`）。具体的实现逻辑可以参考 Elara 语言的源代码：https:\u002F\u002Fgithub.com\u002FElaraLang\u002Felara\u002Fblob\u002Ff0f677f9f20e323d2b17a01997bebc62dbf3af2d\u002Fsrc\u002FElara\u002FTypeInfer.hs#L242","https:\u002F\u002Fgithub.com\u002FGabriella439\u002Fgrace\u002Fissues\u002F60",[],[100,109,117,125,133,146],{"id":101,"name":102,"github_repo":103,"description_zh":104,"stars":105,"difficulty_score":106,"last_commit_at":107,"category_tags":108,"status":69},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,3,"2026-04-05T11:01:52",[60,58,61],{"id":110,"name":111,"github_repo":112,"description_zh":113,"stars":114,"difficulty_score":31,"last_commit_at":115,"category_tags":116,"status":69},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",138956,"2026-04-05T11:33:21",[60,61,59],{"id":118,"name":119,"github_repo":120,"description_zh":121,"stars":122,"difficulty_score":31,"last_commit_at":123,"category_tags":124,"status":69},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107662,"2026-04-03T11:11:01",[60,58,61],{"id":126,"name":127,"github_repo":128,"description_zh":129,"stars":130,"difficulty_score":31,"last_commit_at":131,"category_tags":132,"status":69},3704,"NextChat","ChatGPTNextWeb\u002FNextChat","NextChat 是一款轻量且极速的 AI 助手，旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性，以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发，NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。\n\n这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言，它也提供了便捷的自托管方案，支持一键部署到 Vercel 或 Zeabur 等平台。\n\nNextChat 的核心亮点在于其广泛的模型兼容性，原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型，让用户在一个界面即可自由切换不同 AI 能力。此外，它还率先支持 MCP（Model Context Protocol）协议，增强了上下文处理能力。针对企业用户，NextChat 提供专业版解决方案，具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能，满足公司对数据隐私和个性化管理的高标准要求。",87618,"2026-04-05T07:20:52",[60,59],{"id":134,"name":135,"github_repo":136,"description_zh":137,"stars":138,"difficulty_score":31,"last_commit_at":139,"category_tags":140,"status":69},2268,"ML-For-Beginners","microsoft\u002FML-For-Beginners","ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程，旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周，包含 26 节精炼课程和 52 道配套测验，内容涵盖从基础概念到实际应用的完整流程，有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。\n\n无论是希望转型的开发者、需要补充算法背景的研究人员，还是对人工智能充满好奇的普通爱好者，都能从中受益。课程不仅提供了清晰的理论讲解，还强调动手实践，让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持，通过自动化机制提供了包括简体中文在内的 50 多种语言版本，极大地降低了全球不同背景用户的学习门槛。此外，项目采用开源协作模式，社区活跃且内容持续更新，确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路，ML-For-Beginners 将是理想的起点。",84991,"2026-04-05T10:45:23",[58,141,142,143,61,144,59,60,145],"数据工具","视频","插件","其他","音频",{"id":147,"name":148,"github_repo":149,"description_zh":150,"stars":151,"difficulty_score":106,"last_commit_at":152,"category_tags":153,"status":69},3128,"ragflow","infiniflow\u002Fragflow","RAGFlow 是一款领先的开源检索增强生成（RAG）引擎，旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体（Agent）能力相结合，不仅支持从各类文档中高效提取知识，还能让模型基于这些知识进行逻辑推理和任务执行。\n\n在大模型应用中，幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构（如表格、图表及混合排版），显著提升了信息检索的准确度，从而有效减少模型“胡编乱造”的现象，确保回答既有据可依又具备时效性。其内置的智能体机制更进一步，使系统不仅能回答问题，还能自主规划步骤解决复杂问题。\n\n这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统，还是致力于探索大模型在垂直领域落地的创新者，都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口，既降低了非算法背景用户的上手门槛，也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目，它正成为连接通用大模型与行业专有知识之间的重要桥梁。",77062,"2026-04-04T04:44:48",[61,58,60,59,144]]