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
|
|||
|
|
''';
|
|||
|
|
}
|
|||
|
|
}
|