Flutter 仓库深度解析:flutter_analyzer_plugin 自定义静态分析插件的配置、规则体系与规则开发实战
本篇围绕 Flutter 仓库中的 dev/flutter_analyzer_plugin/README.md 展开,系统介绍 flutter_analyzer_plugin 这个自定义 Dart Analysis Server 插件的定位与配置方式、其 12 条内置静态分析规则的完整规格与设计动机,以及如何基于 package:analyzer 的 AnalysisRule API 从零实现、注册、测试一条新规则。读完本文,你能够在 IDE(VS Code、Android Studio)与 flutter analyze CLI 中获得实时、原生的 Flutter 仓库专属静态诊断,并具备为该插件新增自定义规则并编写单元测试的完整能力。
一、插件定位与整体架构
dev/flutter_analyzer_plugin 是一个专门为 flutter/flutter 仓库定制的 Dart Analysis Server 插件,提供面向该仓库的自定义静态分析规则与 lint。它的核心价值在于:替代过去基于正则表达式和手工 AST 遍历的脚本检查(原先位于 dev/bots/analyze.dart 中的验证逻辑),将这些检查升级为原生的、实时的分析器诊断,直接集成到开发者的 IDE 和 flutter analyze 命令行工具中。
从源码结构看,插件由三部分组成(见 dev/flutter_analyzer_plugin/lib/main.dart):
- 规则实现层:
lib/src/rules/目录下每条规则一个 Dart 文件,如 no_stopwatches.dart、no_double_clamp.dart、skip_test_comments.dart 等; - 公共基类层:flutter_analysis_rule.dart 中的
FlutterAnalysisRule抽象基类,负责统一的只读区域排除逻辑(见下文); - 注册入口层:main.dart 中的
FlutterAnalyzerPlugin类,通过PluginRegistry将全部规则注册到分析器。
插件的依赖约束(见 dev/flutter_analyzer_plugin/pubspec.yaml):运行需要 Dart SDK ^3.7.0,依赖 analysis_server_plugin 与固定版本 analyzer: 14.3.0;测试侧依赖 analyzer_testing 与 test_reflective_loader。
分析配置文件的层级结构
Flutter 仓库的 analysis_options.yaml 采用三级层次结构,插件配置位于该层次的最外层:
- 基础选项文件
analysis_options_common.yaml:定义跨仓库、跨子树共享的基线 lint 规则与分析器设置; - 根
analysis_options.yaml:仓库根目录入口,包含公共基线选项并配置仓库级分析器行为与排除项; - 子包
analysis_options.yaml:packages/flutter/lib、packages/flutter/test、packages/flutter_tools、dev/等包和目录各自 include 父级选项,并通过plugins:块按相应的相对目录深度加载flutter_analyzer_plugin。
例如 dev/analysis_options.yaml 以深度 1 的路径加载插件,同时通过 dependency_overrides 固定了 analysis_server_plugin: ^0.3.22:
include: ../analysis_options.yaml
plugins:
flutter_analyzer_plugin:
path: flutter_analyzer_plugin
dependency_overrides:
analysis_server_plugin: ^0.3.22
二、插件配置:加载、激活与多仓路径解析
加载插件
要在某个包或目录的 analysis_options.yaml 中加载 flutter_analyzer_plugin,在 plugins: 段落下添加插件条目:
plugins:
flutter_analyzer_plugin:
path: ../../dev/flutter_analyzer_plugin
Monorepo 路径解析(目录深度对照表)
分析器要求所有引用 flutter_analyzer_plugin 的 analysis_options.yaml 解析到磁盘上完全相同的规范目录路径,相对路径必须正确反映目录嵌套深度:
| 包 / 目录深度 | 示例 | 配置的插件路径 |
|---|---|---|
| 深度 1 | dev/ |
path: flutter_analyzer_plugin |
| 深度 2 | packages/flutter_tools/、packages/flutter_test/ |
path: ../../dev/flutter_analyzer_plugin |
| 深度 3 | packages/flutter/lib/、packages/flutter/test/ |
path: ../../../dev/flutter_analyzer_plugin |
仓库中确实存在深度 2 与深度 3 的实例:packages/flutter_tools/analysis_options.yaml、packages/flutter/lib/analysis_options.yaml、packages/flutter/test/analysis_options.yaml 等,均可作为真实参照。
规则激活与显式退出(Opt-Out)
README 指出:所有在 flutter_analyzer_plugin 中注册的 warning 与 error 规则,在插件加载后默认启用。包或目录可以通过 diagnostics: 段显式退出(或重新启用)特定规则:
plugins:
flutter_analyzer_plugin:
path: ../../dev/flutter_analyzer_plugin
diagnostics:
# 如有必要可退出特定规则
no_stopwatches: false
avoid_future_catch_error: false
仓库中已有三处真实使用了 diagnostics: 段做按包开关:packages/flutter/lib/analysis_options.yaml、packages/flutter/test/analysis_options.yaml 与 packages/flutter_tools/analysis_options.yaml。
从 main.dart 的源码注释看,注册入口还区分了两类规则的适用面:一类是"仓库级 warning 规则(从 dev/bots/analyze.dart 的验证逻辑迁移而来)",通过 registerWarningRule 注册;另一类是"包级 lint 规则(通过 analysis_options.yaml 的 diagnostics: 段按需开启)",通过 registerLintRule 注册。理解这一区分有助于正确判断某条规则在哪个目录范围内生效。
源码级细节:只读区域的统一豁免
值得注意的一个实现细节是:仓库内所有规则实际都继承自 FlutterAnalysisRule(而非直接继承 AnalysisRule)。该基类在 flutter_analysis_rule.dart 中覆写了 registerNodeProcessors,在文件路径命中"只读区域"时直接跳过注册——即 Material 和 Cupertino 的实现与测试目录(/material/、/cupertino/、src/material、test/material 等)对所有 Flutter 自定义规则免疫;同时通过 /home/test 前缀识别 package:analyzer_testing 的内存测试文件,避免误判。这意味着新增规则时应覆写的是 registerCustomNodeProcessors,让基类统一处理豁免逻辑。
三、规则参考总表
| 规则名 | 严重级别 | 默认 | 作用域 | 概述 |
|---|---|---|---|---|
avoid_future_catch_error |
ERROR |
启用 | 全局 | 禁止在 Future 上调用 .catchError / .onError(应使用 try/catch)。 |
no_double_clamp |
ERROR |
启用 | 全局 | 禁止 double.clamp / num.clamp(应使用 clampDouble)。 |
no_stopwatches |
ERROR |
启用 | 全局 | 禁止直接实例化 Stopwatch(应使用 clock.stopwatch())。 |
deprecation_syntax |
ERROR |
启用 | 全局 | 强制 @Deprecated 注解使用标准多行格式。 |
no_runtimetype_in_tostring |
ERROR |
启用 | 全局 | 禁止在 toString() 中调用 runtimeType.toString()。 |
no_sync_async_star |
ERROR |
启用 | 全局 | 禁止无解释性注释的 sync* 与 async* 方法。 |
no_bad_imports_in_flutter |
ERROR |
启用 | packages/flutter/lib/src/ |
强制分层依赖、禁止循环导入,禁止在 foundation 之外导入 meta。 |
protect_public_state_subtypes |
ERROR |
启用 | packages/flutter |
要求公开 State 类中被覆写的生命周期方法标注 @protected。 |
render_box_intrinsics |
ERROR |
启用 | packages/flutter/lib/src/rendering/ |
禁止直接调用 compute* 固有尺寸方法(应使用 get*)。 |
null_initialized_debug_expensive_fields |
ERROR |
启用 | packages/flutter |
要求 @_debugOnly 字段通过 kDebugMode ? <value> : null; 条件初始化。 |
skip_test_comments |
ERROR |
启用 | 测试文件 | 要求被跳过的测试附带理由注释(如 // [intended] 或 issue 链接)。 |
integration_test_timeouts |
ERROR |
启用 | test_driver/ 文件 |
要求 test_driver/ 下的集成测试设置 timeout: Timeout.none。 |
以下逐条给出完整规格。
通用与全局规则
avoid_future_catch_error
- 严重级别:
ERROR;作用域:全局(插件启用范围内的所有 Dart 文件) - 说明:禁止在
Future实例上调用.catchError()或.onError()。 - 动机:
Future.catchError与Future.onError不具备类型安全性,可能绕过强类型检查或返回意外的 dynamic 类型,引入隐蔽的运行时缺陷。应使用标准的异步try/catch块配合await,或将onError直接传入Future.then()。 - 参考:Dart SDK Issue #51248
// BAD:
future.catchError((Object error) {
handleError(error);
});
// GOOD:
try {
await future;
} catch (error) {
handleError(error);
}
no_double_clamp
- 严重级别:
ERROR;作用域:全局 - 说明:禁止直接调用或 tear-off
double.clamp()与num.clamp()。 - 动机:在 web 与 VM 运行时上,对数字调用
double.clamp会产生装箱/拆箱开销;num.clamp的 tear-off 还会丢失整数类型提升。使用dart:ui或package:flutter/foundation.dart中的clampDouble(val, min, max)可避免运行时开销并保留原生浮点性能。 - 参考:Flutter PR #103559、Flutter Issue #103917
// BAD:
final double clamped = value.clamp(0.0, 1.0);
// GOOD:
final double clamped = clampDouble(value, 0.0, 1.0);
从实现看,no_double_clamp.dart 通过 SimpleAstVisitor 的 visitSimpleIdentifier 同时覆盖方法调用与 tear-off(PropertyAccess/PrefixedIdentifier 形式)两种命中形态。
no_stopwatches
- 严重级别:
ERROR;作用域:全局 - 说明:禁止直接实例化
Stopwatch(),或调用任何返回Stopwatch的函数。 - 动机:直接使用
Stopwatch依赖宿主机系统时钟,在单元测试与 widget 测试中会与FakeAsync失去同步,导致非确定性的测试抖动。代码应改用package:clock的clock.stopwatch()(它在测试期间会与FakeAsync绑定),或使用dart:developer的 timeline 事件做性能剖析。 - 内联豁免:标准分析器忽略注释(
// ignore: no_stopwatches)或遗留内联指令// flutter_ignore: stopwatch (see analyze.dart)。
// BAD:
final Stopwatch stopwatch = Stopwatch()..start();
// GOOD:
final Stopwatch stopwatch = clock.stopwatch()..start();
源码印证(no_stopwatches.dart):该规则注册了两个访问器——addConstructorName 与 addSimpleIdentifier,分别拦截构造调用点与"返回 Stopwatch 的外部函数/构造 tear-off"引用;_implementsStopwatch 通过递归检查 allSupertypes 并配合 Map<ClassElement, bool> 缓存识别 Stopwatch 的子类(因此连外部包的 MyStopwatch 也会被拦截);遗留豁免注释则用正则 // flutter_ignore: .*stopwatch .*\(see analyze\.dart\) 匹配节点行尾文本。其测试 no_stopwatches_test.dart 还通过 PackageConfigFileBuilder 与 test/package_mixins/external_stopwatches_mixin.dart 构造了"外部包"场景来验证跨库识别。
deprecation_syntax
- 严重级别:
ERROR;作用域:全局(所有库声明与公开 API) - 说明:强制
@Deprecated注解采用标准多行字符串格式。 - 动机:统一弃用消息格式,确保所有被弃用 API 都提供可执行的迁移指引、标明确切的弃用版本,并链接到 Flutter 弃用政策。
- 内联豁免:
// ignore: deprecation_syntax或// flutter_ignore: deprecation_syntax (see analyze.dart)。
// BAD:
@Deprecated('Use newMethod instead')
void oldMethod() {}
// GOOD:
@Deprecated(
'Use newMethod instead. '
'This feature was deprecated after v3.18.0-0.1.pre.'
)
void oldMethod() {}
no_runtimetype_in_tostring
- 严重级别:
ERROR;作用域:全局(所有toString()实现) - 说明:禁止在
toString()中求值runtimeType.toString()或插值$runtimeType。 - 动机:调用
runtimeType.toString()会阻碍编译器 tree-shaking 与死代码消除,在 release 构建中泄漏混淆后的符号名,并产生不必要的字符串分配开销。若确需类名反射用于调试诊断,必须包裹在assert()内或以kDebugMode守护。
// BAD:
@override
String toString() => '$runtimeType(value: $value)';
// GOOD:
@override
String toString() => 'MyClass(value: $value)';
// GOOD (Debug-only):
@override
String toString() {
String? header;
assert(() {
header = '$runtimeType';
return true;
}());
return '${header ?? 'MyClass'}(value: $value)';
}
no_sync_async_star
- 严重级别:
ERROR;作用域:全局(所有函数、方法与闭包) - 说明:禁止使用
sync*与async*生成器函数,除非附带解释性注释。 - 动机:生成器函数在 Dart 中引入较重的状态机与迭代器分配,通常标准循环、集合或 StreamController 性能更好。确有必要使用生成器时,必须用注释说明理由。
- 参考:Flutter 风格指南中的 "Avoid sync*/async*" 一节(docs/contributing/Style-guide-for-Flutter-repo.md)。
// BAD:
Iterable<int> countTo(int n) sync* {
for (int i = 0; i < n; i++) yield i;
}
// GOOD:
// Uses sync* to lazily evaluate large datasets on demand.
Iterable<int> countTo(int n) sync* {
for (int i = 0; i < n; i++) yield i;
}
框架与架构规则
no_bad_imports_in_flutter
- 严重级别:
ERROR;作用域:packages/flutter/lib/src/ - 说明:强制 Flutter 分层依赖体系,禁止循环或递归导入,强制
lib/*.dart与lib/src/*/之间的一致性,并禁止在foundation之外导入package:meta/meta.dart。 - 动机:Flutter 遵循严格的分层架构:
foundation->animation->painting->gestures->rendering->widgets->material/cupertino低层绝不允许导入高层;循环的分层导入以及绕过foundation的直接package:meta导入(必须经 foundation 再导出)都会破坏模块性与包封装。
// BAD (in packages/flutter/lib/src/painting/):
import 'package:flutter/src/widgets/basic.dart'; // Upward layer import
import 'package:meta/meta.dart'; // Meta imported outside foundation
// GOOD (in packages/flutter/lib/src/painting/):
import 'package:flutter/foundation.dart';
protect_public_state_subtypes
- 严重级别:
ERROR;作用域:packages/flutter(继承State的类) - 说明:要求公开类中继承
State后覆写的生命周期方法标注@protected。 - 动机:公开
State子类中被覆写的生命周期方法(initState、build、dispose、setState、didUpdateWidget、didChangeDependencies、activate、deactivate、reassemble、debugFillProperties)会成为公共接口的一部分。添加@protected可阻止外部消费者直接调用内部生命周期逻辑。
// BAD:
class MyPublicWidgetState extends State<MyPublicWidget> {
@override
void initState() {
super.initState();
}
}
// GOOD:
class MyPublicWidgetState extends State<MyPublicWidget> {
@override
@protected
void initState() {
super.initState();
}
}
render_box_intrinsics
- 严重级别:
ERROR;作用域:packages/flutter/lib/src/rendering/(RenderBox子类) - 说明:禁止在
RenderBox子类中直接调用固有尺寸计算(compute*)方法,要求改调对应的带缓存的get*方法。 - 动机:
compute*方法执行的是原始的、无缓存的几何求值。直接调用会绕过RenderBox的固有尺寸缓存,可能导致布局重算时间指数级增长( 量级的布局遍次)。
| 无缓存方法(禁止) | 带缓存替代(要求) |
|---|---|
computeDryBaseline |
getDryBaseline |
computeDryLayout |
getDryLayout |
computeDistanceToActualBaseline |
getDistanceToBaseline 或 getDistanceToActualBaseline |
computeMaxIntrinsicHeight |
getMaxIntrinsicHeight |
computeMinIntrinsicHeight |
getMinIntrinsicHeight |
computeMaxIntrinsicWidth |
getMaxIntrinsicWidth |
computeMinIntrinsicWidth |
getMinIntrinsicWidth |
// BAD (inside a RenderBox subclass):
final double width = child.computeMinIntrinsicWidth(height);
// GOOD:
final double width = child.getMinIntrinsicWidth(height);
null_initialized_debug_expensive_fields
- 严重级别:
ERROR;作用域:packages/flutter - 说明:要求所有标注
@_debugOnly的字段都通过kDebugMode ? <value> : null;条件初始化。 - 动机:昂贵的诊断对象与调试追踪器不应在 profile 与 release 构建中分配堆内存或执行昂贵的初始化逻辑。以
kDebugMode ? <value> : null初始化可让编译器与 tree-shaker 在 release 构建中同时消除该字段及其初始化器。
// BAD:
@_debugOnly
List<StackTrace> _creationStackTraces = <StackTrace>[];
// GOOD:
@_debugOnly
List<StackTrace>? _creationStackTraces = kDebugMode ? <StackTrace>[] : null;
测试规则
skip_test_comments
- 严重级别:
ERROR;作用域:仓库所有测试文件(*_test.dart) - 说明:要求所有被跳过的测试(
test(..., skip: ...))都包含行内理由注释,解释跳过原因。 - 动机:测试不应被静默跳过、也不应无限期搁置而无跟踪。每个
skip:参数必须提供有意标记(如// [intended])或引用活跃的 GitHub 跟踪 issue 链接。
// BAD:
test('flaky network test', () {}, skip: true);
// GOOD:
test('flaky network test', () {}, skip: true); // https://github.com/flutter/flutter/issues/<issue-number>
// GOOD:
test('platform specific test', () {},
// [intended] Not supported on Windows.
skip: !Platform.isLinux,
);
integration_test_timeouts
- 严重级别:
ERROR;作用域:test_driver/下的集成测试套件 - 说明:要求
test_driver/下的集成测试显式设置timeout: Timeout.none。 - 动机:宿主驱动的集成测试与 devicelab 测试涉及应用启动、模拟器交互与金截图比对,常常超出 30 秒的标准单元测试超时。显式指定
timeout: Timeout.none可防止高负载 CI 测试机上的误报超时失败。
// BAD (in test_driver/app_test.dart):
void main() {
test('starts app', () async {
...
});
}
// GOOD (in test_driver/app_test.dart):
void main() {
test('starts app', () async {
...
}, timeout: Timeout.none);
}
四、编写与测试自定义规则
1. 实现一条 AnalysisRule
自定义规则基于 package:analyzer/analysis_rule/analysis_rule.dart 的 AnalysisRule。README 给出的骨架如下:
- 将新规则放入
dev/flutter_analyzer_plugin/lib/src/rules/<rule_name>.dart; - 定义
LintCode,指明诊断名、消息、修正建议与DiagnosticSeverity; - 实现
registerNodeProcessors,把 AST 访问器挂到感兴趣的节点类型上。
import 'package:analyzer/analysis_rule/analysis_rule.dart';
import 'package:analyzer/analysis_rule/rule_context.dart';
import 'package:analyzer/analysis_rule/rule_visitor_registry.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/error/error.dart';
class MyCustomRule extends AnalysisRule {
MyCustomRule()
: super(
name: code.name,
description: 'Verify adherence to Flutter repository practices.',
);
static const LintCode code = LintCode(
'my_custom_rule',
'Explanation of why the pattern is disallowed.',
correctionMessage: 'Recommended fix or alternatives.',
severity: DiagnosticSeverity.ERROR,
);
@override
DiagnosticCode get diagnosticCode => code;
@override
void registerNodeProcessors(RuleVisitorRegistry registry, RuleContext context) {
final visitor = _Visitor(this, context);
registry.addMethodInvocation(this, visitor);
}
}
class _Visitor extends SimpleAstVisitor<void> {
_Visitor(this.rule, this.context);
final AnalysisRule rule;
final RuleContext context;
@override
void visitMethodInvocation(MethodInvocation node) {
if (/* condition */ false) {
rule.reportAtNode(node);
}
}
}
结合仓库现状的一个实践要点:现有规则普遍改为继承 FlutterAnalysisRule 并覆写 registerCustomNodeProcessors,从而自动获得 Material/Cupertino 只读区域豁免;新增规则时建议沿用这一模式,保持与既有 16 个规则文件的风格一致。
2. 注册规则
在 dev/flutter_analyzer_plugin/lib/main.dart 中注册规则。骨架如下:
import 'package:analysis_server_plugin/plugin.dart';
import 'package:analysis_server_plugin/registry.dart';
import 'src/rules/my_custom_rule.dart';
class FlutterAnalyzerPlugin extends Plugin {
@override
void register(PluginRegistry registry) {
registry
..registerWarningRule(MyCustomRule());
}
@override
String get name => 'flutter/flutter analyzer plugin';
}
实际仓库中的 register() 方法区分 registerWarningRule(仓库级规则)与 registerLintRule(包级、可通过 diagnostics: 开关的规则)两种注册方式,新规则应按其适用面选择其一。
3. 编写单元测试
规则必须使用 package:analyzer_testing 编写反射式测试:
- 在
dev/flutter_analyzer_plugin/test/<rule_name>_test.dart创建测试文件; - 继承
AnalysisRuleTest并为测试类添加@reflectiveTest注解; - 在
setUp()中通过Registry.ruleRegistry.registerWarningRule(...)注册规则,并用assertDiagnostics()定义用例。
import 'package:analyzer/src/lint/registry.dart';
import 'package:analyzer_testing/analysis_rule/analysis_rule.dart';
import 'package:flutter_analyzer_plugin/src/rules/my_custom_rule.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@reflectiveTest
class MyCustomRuleTest extends AnalysisRuleTest {
@override
void setUp() {
// Registers the custom AnalysisRule with the test registry prior to running tests.
Registry.ruleRegistry.registerWarningRule(MyCustomRule());
super.setUp();
}
@override
String get analysisRule => MyCustomRule.code.name;
Future<void> test_disallowedPattern() async {
await assertDiagnostics(
'''
void test() {
badFunction();
}
''',
<ExpectedDiagnostic>[
lint(16, 13),
],
);
}
Future<void> test_allowedPattern() async {
await assertNoDiagnostics(
'''
void test() {
goodFunction();
}
''',
);
}
}
void main() {
defineReflectiveSuite(() {
defineReflectiveTests(MyCustomRuleTest);
});
}
从真实测试(如 no_stopwatches_test.dart)看,若规则需要识别"外部包"类型(例如返回 Stopwatch 的外部库),还会借助 PackageConfigFileBuilder 与 test/package_mixins/ 下的 mixin 构造虚拟包配置;这些 mixin(external_stopwatches_mixin.dart、meta_mixin.dart、widgets_mixin.dart)正是为跨包场景准备的公共设施。
4. 运行单元测试
由于测试使用了 test_reflective_loader(依赖 dart:mirrors),测试必须用独立 Dart VM SDK 执行,而不能使用 flutter test:
# 1. 解析插件依赖
cd dev/flutter_analyzer_plugin
../../bin/flutter pub get
# 2. 使用 Dart SDK 运行单元测试
../../bin/cache/dart-sdk/bin/dart test test/my_custom_rule_test.dart
5. 最佳实践与迁移建议
- 按文件路径过滤:通过
context.currentUnit!.file.path获取当前文件路径,而不是依赖declaredElement(后者在 AST 节点注册期间可能尚未填充)。 - 检查泛型基类:判断某个类是否继承泛型基类(如
State<T>)时,应缓存InterfaceElement(superType.element)而非DartType,这样才能让子类型检查在不同类型实参(State<WidgetA>与State<WidgetB>)下依然成立。no_stopwatches.dart 中对 Stopwatch 子类的递归判断配合Map<ClassElement, bool>缓存,正是这一模式的实例。 - 验证编译:提交插件改动前,确认插件能干净编译并通过分析:
bin/cache/dart-sdk/bin/dart analyze --fatal-infos dev/flutter_analyzer_plugin
五、小结:从脚本检查到实时诊断
flutter_analyzer_plugin 把 Flutter 仓库多年沉淀在 CI 脚本里的架构约束(分层导入、State 生命周期保护、渲染层缓存纪律)与性能/测试卫生约定(禁用 Stopwatch 直建、clampDouble、跳过测试理由等)统一收敛到 Dart Analysis Server 插件体系中。对仓库贡献者而言,掌握 plugins:/diagnostics: 配置与目录深度解析,可以在本地 IDE 中获得与 CI 一致的错误级诊断;对希望扩展检查逻辑的开发者,FlutterAnalysisRule 基类 + analyzer_testing 反射式测试框架提供了从规则实现、注册到单元测试验证的完整闭环,且全部测试均可在 dev/flutter_analyzer_plugin/test/ 目录下逐条对照参考。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0629
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python07
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00