114 lines
2.7 KiB
Dart
114 lines
2.7 KiB
Dart
import 'dart:io';
|
||
|
||
import 'aris_bundle.dart';
|
||
import 'runtime_models.dart';
|
||
|
||
abstract class FrameworkPreset {
|
||
const FrameworkPreset();
|
||
|
||
String get id;
|
||
String get label;
|
||
|
||
Future<String> roleInstructionBlock({
|
||
required MultiAgentRole role,
|
||
required String tool,
|
||
required List<String> selectedSkills,
|
||
});
|
||
}
|
||
|
||
class NativeFrameworkPreset extends FrameworkPreset {
|
||
const NativeFrameworkPreset();
|
||
|
||
@override
|
||
String get id => MultiAgentFramework.native.name;
|
||
|
||
@override
|
||
String get label => MultiAgentFramework.native.label;
|
||
|
||
@override
|
||
Future<String> roleInstructionBlock({
|
||
required MultiAgentRole role,
|
||
required String tool,
|
||
required List<String> selectedSkills,
|
||
}) async {
|
||
final selected = selectedSkills.isEmpty
|
||
? '- 无'
|
||
: selectedSkills.map((item) => '- $item').join('\n');
|
||
return '''
|
||
当前协作框架:$label
|
||
当前角色:${role.label}
|
||
当前工具:$tool
|
||
|
||
用户当前选中的技能:
|
||
$selected
|
||
''';
|
||
}
|
||
}
|
||
|
||
class ArisFrameworkPreset extends FrameworkPreset {
|
||
ArisFrameworkPreset(this._bundleRepository);
|
||
|
||
final ArisBundleRepository _bundleRepository;
|
||
|
||
@override
|
||
String get id => MultiAgentFramework.aris.name;
|
||
|
||
@override
|
||
String get label => MultiAgentFramework.aris.label;
|
||
|
||
@override
|
||
Future<String> roleInstructionBlock({
|
||
required MultiAgentRole role,
|
||
required String tool,
|
||
required List<String> selectedSkills,
|
||
}) async {
|
||
final bundle = await _bundleRepository.ensureReady();
|
||
final preferCodex = tool.trim().toLowerCase() == 'codex';
|
||
final skillPaths = bundle.skillPathsForRole(role, preferCodex: preferCodex);
|
||
final skillDocs = await _bundleRepository.loadSkillContents(skillPaths);
|
||
final selected = selectedSkills.isEmpty
|
||
? '- 无'
|
||
: selectedSkills.map((item) => '- $item').join('\n');
|
||
final excerpts = skillDocs.entries
|
||
.map(
|
||
(entry) => _formatSkillExcerpt(
|
||
path: entry.key,
|
||
content: entry.value,
|
||
),
|
||
)
|
||
.join('\n\n');
|
||
return '''
|
||
当前协作框架:$label
|
||
当前角色:${role.label}
|
||
当前工具:$tool
|
||
ARIS bundle:${bundle.manifest.bundleVersion}
|
||
|
||
用户当前选中的技能:
|
||
$selected
|
||
|
||
请优先遵循以下内嵌 ARIS 技能方法:
|
||
$excerpts
|
||
''';
|
||
}
|
||
|
||
String _formatSkillExcerpt({
|
||
required String path,
|
||
required String content,
|
||
}) {
|
||
final label = File(path).parent.uri.pathSegments
|
||
.where((item) => item.isNotEmpty)
|
||
.last;
|
||
final lines = content
|
||
.split('\n')
|
||
.map((line) => line.trimRight())
|
||
.where((line) => line.isNotEmpty)
|
||
.take(60)
|
||
.join('\n');
|
||
return '''
|
||
## $label
|
||
来源:$path
|
||
$lines
|
||
''';
|
||
}
|
||
}
|