Версия: v0.2.0-alpha
English | Deutsch | 中文 | 繁體中文 | Español | 日本語 | 한국어 | Čeština | Русский
SiliconLifeCollective следует архитектуре Тело-Мозг, со строгим разделением основных интерфейсов и реализаций по умолчанию.
SiliconLifeCollective/
├── src/
│ ├── SiliconLife.Core/ # Интерфейсы, абстрактные классы, общая инфраструктура
│ ├── SiliconLife.Common/ # Общие реализации (используются обеими версиями)
│ ├── SiliconLife.Default/ # Реализация по умолчанию, точка входа (проверка архитектуры)
│ ├── SiliconLife.Fast/ # Высокопроизводительная реализация, точка входа (основная производственная версия)
│ ├── SiliconLife.Speedy/ # Высокопроизводительный Движок Хранения SpeedyPack
│ └── SiliconLife.Speedy.Manager/ # Менеджер SpeedyPack (Avalonia UI)
└── docs/ # Многоязычная документация
Направление зависимостей:
SiliconLife.Default→SiliconLife.Common→SiliconLife.CoreSiliconLife.Fast→SiliconLife.Common→SiliconLife.CoreSiliconLife.Common→SiliconLife.Core(однонаправленная)
Описание ролей версий:
- SiliconLife.Default: реализация по умолчанию, в основном для проверки жизнеспособности архитектуры. Предоставляет простую и надёжную реализацию хранения в файловой системе, подходит для отладки разработки и проверки архитектуры.
- SiliconLife.Fast: основная производственная версия. На основе архитектуры, проверенной Default, использует хранение в памяти SpeedyPack + асинхронную персистентность для экстремальной оптимизации производительности, является предпочтительным выбором для длительной работы и реальных производственных сред.
Каждый AI-агент состоит из:
- Тело (
DefaultSiliconBeing): поддерживает жизненные показатели, обнаруживает триггерные сценарии - Мозг (
ContextManager): загружает историю, вызывает AI, выполняет инструменты, сохраняет ответы
Инструменты автоматически обнаруживаются и регистрируются через рефлексию:
// Все инструменты реализуют интерфейс ITool
public interface ITool
{
string Name { get; }
string Description { get; }
Task<ToolResult> ExecuteAsync(ToolCall call);
}3-уровневая цепочка проверки разрешений:
UserFrequencyCache → IPermissionCallback → (IsCurator: IPermissionAskHandler | Non-curator: GlobalACL → отказ по умолчанию)
Глобальная регистрация и получение служб:
// Регистрация
ServiceLocator.Instance.Register<IAIClient>(ollamaClient);
// Получение
var client = ServiceLocator.Instance.Get<IAIClient>();- Создайте новый класс в
src/SiliconLife.Common/Tools/(инструменты, общие для обеих версий):
Примечание:
SiliconLife.DefaultиSiliconLife.Fastбольше не имеют собственных каталоговTools/, все общие инструменты размещены вSiliconLife.Common/Tools/.
public class MyCustomTool : ITool
{
public string Name => "my_custom_tool";
public string Description => "Description of what this tool does";
public async Task<ToolResult> ExecuteAsync(ToolCall call)
{
// Разбор параметров
var param1 = call.Parameters["param1"]?.ToString();
// Логика выполнения
var result = await DoSomething(param1);
// Возврат результата
return new ToolResult
{
Success = true,
Output = result
};
}
}-
Инструмент автоматически обнаруживается через рефлексию — ручная регистрация не требуется!
-
(Опционально) Пометка как доступный только администратору:
[SiliconManagerOnly]
public class AdminTool : ITool { ... }- (Опционально) Пометка доступных сценариев инструмента:
[ToolScenario(ToolScenarioFlag.Chat | ToolScenarioFlag.Task)]
public class MyTool : ITool { ... }- (Опционально) Пометка как доступный только в сценарии чата:
[ChatOnly]
public class HelpTool : ITool { ... }- (Опционально) Пометка как доступный только в сценарии проекта:
[ToolScenario(ToolScenarioFlag.Project)]
[SiliconManagerOnly]
public class ProjectWorkTool : ITool { ... }- Реализуйте
IAIClientвsrc/SiliconLife.Common/AI/:
public class MyAIClient : IAIClient
{
public string Name => "my_ai";
public async Task<AIResponse> ChatAsync(AIRequest request)
{
// Вызов вашего AI API
var response = await CallMyAPI(request);
return new AIResponse
{
Content = response.Message,
ToolCalls = response.ToolCalls,
Usage = response.Usage
};
}
public async IAsyncEnumerable<string> StreamChatAsync(AIRequest request)
{
// Реализация потоковой передачи
await foreach (var chunk in StreamFromAPI(request))
{
yield return chunk;
}
}
}- Создайте фабрику:
public class MyAIClientFactory : IAIClientFactory
{
public IAIClient CreateClient(AIClientConfig config)
{
return new MyAIClient(config);
}
}- Фабрика автоматически обнаруживается и регистрируется.
- Реализуйте
IStorageиITimeStorageвsrc/SiliconLife.Default/Storage/(реализация файловой системы) илиsrc/SiliconLife.Fast/Storage/(адаптер SpeedyPack):
public class DatabaseStorage : IStorage, ITimeStorage
{
public async Task<string> ReadAsync(string key)
{
// Чтение из вашей базы данных
}
public async Task WriteAsync(string key, string value)
{
// Запись в вашу базу данных
}
public async Task<IEnumerable<string>> ReadByTimeAsync(DateTime start, DateTime end)
{
// Запрос с временным индексом
}
}- Создайте проект библиотеки классов, реализующий интерфейс
IPlugin:
using SiliconLife.Collective;
using SiliconLife.Collective.Localization;
using SiliconLife.Collective.Tools;
public class MyPlugin : IPlugin
{
public string Id => "my-plugin";
public string Version => "1.0.0";
public string GetName(Language language) => "My Plugin";
public string GetDescription(Language language) => "A custom plugin";
public string GetAuthor(Language language) => "Author Name";
public void OnLoad() { }
public void OnStart() { }
public void OnStop() { }
public void OnUnload() { }
}- (Опционально) Реализуйте интерфейс
IToolв плагине для регистрации пользовательского инструмента:
public class MyPluginTool : ITool
{
public string Name => "my_plugin_tool";
public string Description => "A tool provided by my plugin";
public async Task<ToolResult> ExecuteAsync(ToolCall call)
{
return new ToolResult { Success = true, Output = "Done" };
}
}- Поместите скомпилированную DLL в каталог плагинов,
PluginLoaderзагрузит её автоматически.
Ограничения безопасности: плагины по умолчанию не могут ссылаться на пространства имён
System.IO,System.Net.Http,System.Net.WebSockets,System.Net.Sockets,Microsoft.CodeAnalysisи др. Однако плагины могут объявить необходимые возможности через атрибут[PluginCapability](Network, FileIO, Process, AI), и загрузчик на этом основании ослабляет соответствующие правила безопасности пространств имён. Необъявляемые возможности (P/Invoke, Unsafe, Reflection Emit и т.д.) всегда блокируются. Плагины загружаются изолированно черезAssemblyLoadContext.
- Реализуйте
ISkinвsrc/SiliconLife.App/Web/Skins/:
public class MyCustomSkin : ISkin
{
public string Name => "MySkin";
public string Description => "A custom skin description";
public string GetCss()
{
return @"
:root {
--primary-color: #your-color;
--bg-color: #your-bg;
}
/* Your custom styles */
";
}
}- Тема автоматически обнаруживается
SkinManager.
- Классы: PascalCase с функциональным префиксом (например,
DefaultSiliconBeing) - Интерфейсы: начинаются с
I(например,IAIClient,ITool) - Реализации: оканчиваются именем интерфейса (например,
OllamaClientреализуетIAIClient) - Инструменты: оканчиваются на
Tool(например,CalendarTool,ChatTool) - Модели представления: оканчиваются на
ViewModel(например,BeingViewModel)
SiliconLife.Common/
├── AI/ # Реализации AI-клиентов и фабрик
├── Calendar/ # 32 календарные реализации
├── Localization/ # Базовый класс локализации и 34 языковых варианта
├── Security/ # Менеджер Разрешений
├── SiliconBeing/ # Реализация Кремниевого Существа по умолчанию
├── Tools/ # Общие встроенные инструменты (25)
├── Web/ # Веб-инфраструктура
└── WebView/ # Реализация Playwright WebView
SiliconLife.App/ # Уровень приложения, общий для Default и Fast
├── Config/ # Конфигурация приложения
├── Help/ # Локализация справочной документации
├── Project/ # Система проектов (движок рабочих процессов, роли проекта)
└── Web/ # Реализация Web UI
├── Component/ # 27 UI-компонентов
├── Controllers/ # 24 маршрутизирующих контроллера
├── Models/ # Модели представлений
├── Views/ # HTML-представления
└── Skins/ # 7 тем оформления
SiliconLife.Default/ # Версионно-специфичные каталоги
├── Config/ # Данные конфигурации по умолчанию
├── Knowledge/ # Реализация Сети Знаний
├── Logging/ # Реализация Провайдера Журналирования (консоль + файловая система)
├── Project/ # Реализация Системы Проектов
└── Storage/ # Реализация хранения в файловой системе
SiliconLife.Fast/ # Версионно-специфичные каталоги
├── Config/ # Данные конфигурации версии Fast
├── Logging/ # Реализация Провайдера Журналирования (консоль + файловая система)
├── Storage/ # Адаптеры хранения SpeedyPack
└── Tray/ # Локализация системного трея
- Все публичные API должны иметь XML-комментарии документации
- Все исходные файлы используют заголовок лицензии Apache 2.0
- Использование возможностей .NET 9 (неявные using, ссылочные типы, допускающие null)
# Клонирование репозитория
git clone https://github.com/akimoto-akira/SiliconLifeCollective.git
cd SiliconLifeCollective
# Восстановление зависимостей
dotnet restore
# Сборка
dotnet build# Запуск всех тестов
dotnet test
# Запуск определённого тестового проекта
dotnet test tests/SiliconLife.Core.Tests# Запуск с отладочным выводом
dotnet run --project src/SiliconLife.Default --configuration Debug# Форматирование кода
dotnet formatpublic class MyCustomCalendar : CalendarBase
{
public override string Name => "MyCalendar";
public override CalendarDate ConvertFromGregorian(GregorianDate date)
{
// Ваша логика преобразования
return new CalendarDate(year, month, day);
}
public override GregorianDate ConvertToGregorian(CalendarDate date)
{
// Обратное преобразование
return new GregorianDate(year, month, day);
}
}public class CustomExecutor : ExecutorBase
{
public override string Name => "custom";
public override async Task<ExecutorResult> ExecuteAsync(ExecutorRequest request)
{
var permission = await CheckPermissionAsync(request);
if (!permission.Allowed)
{
return ExecutorResult.Denied(permission.Reason);
}
var result = await PerformOperation(request);
return ExecutorResult.Success(result);
}
}public class MyWorkflowTemplate : WorkflowTemplate
{
public override string Name => "my_workflow";
public override string Description => "A custom workflow template";
public override void DefineStates()
{
AddState("start", "Начало", isInitial: true);
AddState("processing", "Обработка");
AddState("review", "Проверка");
AddState("done", "Завершено", isFinal: true);
}
public override void DefineTransitions()
{
AddTransition("start", "processing", "Начать обработку");
AddTransition("processing", "review", "Отправить на проверку");
AddTransition("review", "done", "Проверка пройдена");
AddTransition("review", "processing", "Вернуть на доработку");
}
}Проектные роли управляются через операции assign_role и remove_role инструмента ProjectTool. Имена ролей — пользовательские строки, используемые для различения обязанностей Кремниевых Существ в рабочих процессах и назначении задач.
[TestClass]
public class MyToolTests
{
[TestMethod]
public async Task ExecuteAsync_ValidInput_ReturnsSuccess()
{
// Подготовка
var tool = new MyCustomTool();
var call = new ToolCall
{
Name = "my_custom_tool",
Parameters = new Dictionary<string, object>
{
["param1"] = "test"
}
};
// Выполнение
var result = await tool.ExecuteAsync(call);
// Проверка
Assert.IsTrue(result.Success);
Assert.IsNotNull(result.Output);
}
}Тестирование полного процесса:
- AI возвращает вызов инструмента
- Инструмент выполняется
- Результат передаётся AI
- AI возвращает окончательный ответ
- Версия Default использует хранение JSON на основе файлов
- Версия Fast использует движок хранения SpeedyPack в памяти (формат .spk)
- SpeedyPack использует отображение каталогов в памяти + кэш записей + асинхронную очередь записи
- Запросы с временным индексом используют интерфейс
ITimeStorage
- Справедливое планирование с временными интервалами на основе часов
- Сторожевой Таймер для обнаружения зависших операций
- Автоматический Выключатель для предотвращения каскадных сбоев
Любая операция, инициированная AI, должна проходить через цепочку разрешений:
bool allowed = permissionManager.CheckPermission(callerId, permissionType, resource);
if (!allowed)
{
return Result.Denied("Permission denied");
}Глобальная регистрация и получение служб:
// Во время инициализации
ServiceLocator.Instance.Register<ICustomService>(myService);
// При необходимости
var service = ServiceLocator.Instance.Get<ICustomService>();- Тело обрабатывает состояние и триггеры
- Мозг обрабатывает AI-взаимодействие и выполнение инструментов
try
{
var result = await operation();
return Result.Success(result);
}
catch (Exception ex)
{
Logger.Error($"Operation failed: {ex.Message}");
return Result.Failure(ex.Message);
}- Форкните репозиторий
- Создайте ветку функции (
git checkout -b feature/amazing-feature) - Зафиксируйте изменения с использованием конвенциональных коммитов
- Отправьте в ветку (
git push origin feature/amazing-feature) - Откройте Pull Request
<type>(<scope>): <description>
Примеры:
feat(tool): add custom calendar tool
fix(permission): fix null pointer in callback
docs: update development guide
- 📚 Прочитайте руководство по архитектуре
- 📖 Ознакомьтесь со справочником API
- 🔒 Ознакомьтесь с документацией по безопасности
- 🚀 Ознакомьтесь с руководством быстрого старта