Черновики

Примеры структур Vibe

В этом документе мы рассмотрим конкретные примеры, чтобы показать базовую структуру разных типов Vibe, которые обсуждались в «Главе 1: Vibes и их проявления». Каждый пример показывает Vibe как статическую запись, состоящую из input (входные данные), поля schema (которое содержит структуру самого Vibe или его определение) и solution (содержимое, результат или конфигурация, соответствующая этой schema).

Как эти Vibes создаются, развиваются или взаимодействуют динамически (например, через примитив refine), подробно описано в следующих главах. Цель здесь — прояснить уникальную природу и типичное содержимое основных компонентов каждого типа Vibe.

Понимание ссылок на схемы ($ref)

Схемы Vibe часто ссылаются на другие схемы с помощью ключевого слова $ref. Эти ссылки используют формат, похожий на URI, и обычно начинаются с aug:.

  • Абсолютные и локальные ссылки:
    • Абсолютная ссылка на общую глобальную схему начинается со слэша сразу после наименования схемы, например: aug:/schemas/SharedSchemaName. Они используются для общих, общесистемных определений.
    • Локальная ссылка (без слэша после наименования схемы, например: aug:schemas/UserSpecificSchema) считается зависимой от контекста (например, специфичной для пользователя или относящейся к текущему Vibe). В примерах этого документа большинство общих базовых схем будут использовать абсолютные пути.
  • «Вечнозеленые» и версионные ссылки:
    • Чтобы сослаться на последнюю версию схемы («вечнозеленая» ссылка), опустите номер версии в конце, например: aug:/schemas/BaseVibe. Это типичный способ расширения базовых шаблонов, который гарантирует, что они всегда используют самое актуальное определение.
    • Чтобы закрепить определенную версию схемы, укажите номер версии, например: aug:/schemas/SpecificDefinition:2. Это полезно для ссылки на конкретные инструменты или наборы инструкций, где важна определенная версия.

Концептуально похожие Vibes (например, все Record Vibes типа «UserProfile» или все Vibes, определяющие «StandardProcess») обычно имеют одинаковые или очень похожие определения в своих полях schema, что обеспечивает одинаковую структуру для Vibes одного и того же вида.


1. Пример Record Vibe: Профиль пользователя

Сценарий: Vibe, представляющий информацию профиля пользователя. Record Vibes в основном используются для структурированных данных.

Пример JSON-структуры UserProfileRecordVibe (например, aug:users/user-789?1):

{
  "input": [
    {
      "type": "UserProfileContext",
      "$id": "aug:user-789",
      "query": "Инициализировать или обновить профиль пользователя. Если предпочтения не полностью известны или не предоставлены, попытаться вывести разумные значения по умолчанию или предложить варианты.",
      "state": {
        "displayName": "Jane Doe",
        "email": "jane.doe@example.com"
        // Поле 'preferences' намеренно опущено, чтобы LLM мог его предположить или предложить.
      }
    }
  ],
  "schema": {
    "title": "Запись профиля пользователя",
    "description": "Определяет полную структуру информации профиля пользователя, включая идентификационные данные, метаданные и специфичные для пользователя детали. Составлена из базовых схем Vibe и RecordVibe с использованием «вечнозеленых» ссылок.",
    "allOf": [
      {
        "$ref": "aug:/schemas/Vibe",
        "$comment": "Базовая структура Vibe, ссылка без версии, чтобы всегда использовать последнюю. Предоставляет свойства, такие как $id, $type и $revision."
      },
      {
        "$ref": "aug:/schemas/RecordVibe",
        "$comment": "Базовая структура RecordVibe, ссылка без версии. Предоставляет общие свойства записи, такие как id, createdAt, lastModified."
      },
      {
        "type": "object",
        "title": "Детали контейнера",
        "description": "Специфическая информация и предпочтения, связанные с пользователем.",
        "properties": {
          "displayName": {
            "type": "string",
            "title": "Отображаемое имя",
            "description": "Имя, публично отображаемое для пользователя."
          },
          "email": {
            "type": "string",
            "format": "email",
            "title": "Адрес электронной почты",
            "description": "Основной адрес электронной почты пользователя для связи и входа."
          },
          "preferences": {
            "type": "object",
            "title": "Предпочтения пользователя",
            "description": "Настройки и выборы, сделанные пользователем для кастомизации своего опыта.",
            "properties": {
              "newsletter": {
                "type": "boolean",
                "default": false,
                "title": "Подписка на рассылку",
                "description": "Указывает, желает ли пользователь получать новостные обновления."
              },
              "theme": {
                "type": "string",
                "enum": ["light", "dark"],
                "default": "light",
                "title": "Тема интерфейса",
                "description": "Выбранная визуальная тема для пользовательского интерфейса (например, светлая или темная)."
              }
            }
          }
          // id, createdAt, lastModified наследуются от слоя RecordVibe
          // $id, $revision, $type наследуются от слоя Vibe
        },
        "required": ["displayName", "email"]
      }
    ]
    // Итоговый список 'required' будет объединением списков 'required' со всех слоев:
    // например: ["$type", "$id", "$revision", "createdAt", "lastModified", "designation", "primaryCapability"]
  },
  "solution": {
    "$type": "UserProfileRecordVibe", // из слоя Vibe
    "$id": "aug:vibes/user-profile-789", // из слоя Vibe, это уникальный ID самого Vibe
    "$revision": 3, // из слоя Vibe
    "id": "user-789", // из слоя RecordVibe, это ID записи пользователя
    "displayName": "Jane Doe", // из данных пользователя
    "email": "jane.doe@example.com", // из данных пользователя
    "preferences": {
      // из данных пользователя, возможно, дополнено LLM
      "newsletter": false,
      "theme": "light"
    },
    "createdAt": "2025-01-15T10:00:00Z", // из слоя RecordVibe
    "lastModified": "2025-03-10T12:05:00Z" // из слоя RecordVibe
  }
}

Объяснение:

  • Поле input теперь является массивом объектов. Первый объект предоставляет контекст ($id), query для LLM (заменяя directive) и начальное state (заменяя initialData). query предлагает вывести недостающие operationalParameters.
  • Поле schema теперь имеет массив allOf на верхнем уровне:
    • Он ссылается ($ref) на aug:/schemas/Vibe (предоставляя $type).
    • Он ссылается ($ref) на aug:/schemas/RecordVibe (предоставляя $id, $revision, createdAt, lastModified).
    • Он включает встроенный объект, определяющий специфичные для контейнера детали (designation, primaryCapability, operationalParameters, capabilities) с полями title и description, понятными для UI.
  • Общие title и description для составной схемы VesselProfileRecord находятся на верхнем уровне объекта schema.
  • Комментарии указывают, какие свойства ожидаются от слоев, на которые ведут ссылки.
  • solution включает $type (из Vibe) и $id (из RecordVibe), а operationalParameters в solution могут быть результатом вывода LLM, если их не было в исходном состоянии.

Эта структура делает цепочку наследования явной и использует «вечнозеленые» ссылки. Поля title и description предназначены для того, чтобы быть понятными как для пользовательских интерфейсов, так и для LLM.

Упомянутые базовые схемы (aug:/schemas/Vibe и aug:/schemas/RecordVibe) должны быть определены в другом месте. Например:

Гипотетическое определение для aug:/schemas/Vibe (например, если его последняя версия — 1, он может храниться как aug:/schemas/Vibe?1, но для «вечнозеленого» использования на него ссылаются как aug:/schemas/Vibe):


2. Пример Role Vibe: Контейнер «Инвестиционный консультант»

Сценарий: Этот Vibe иллюстрирует контейнер «Инвестиционный консультант» — конкретный экземпляр, который обрабатывает запросы. Поле input содержит запрос и любое начальное состояние (например, специфичные конфигурации для этого контейнера, такие как specialization или clientContext). Поле schema определяет структуру этого контейнера, расширяя RoleVibe и добавляя конкретные возможности и выходные данные. Поле solution показывает результаты, сгенерированные этим контейнером: на основе входного запроса некоторые возможности создают данные, а другие имеют значение null, если они не относятся к конкретному запросу.

Пример JSON-структуры InvestmentAdvisorVesselVibe (например, aug:vessels/advisor-vessel-acme-001):

{
  "input": [
    {
      "type": "text",
      "text": "Вы — финансовый ассистент",
      "role": "system"
    },
    {
      "type": "query",
      "query": "Предоставьте быстрый анализ рынка о влиянии прорыва ACME Corp в квантовых вычислениях."
    },
    {
      "type": "state",
      "state": {
        "specialization": "Анализ технологического сектора",
        "analysisDepth": "быстрый"
      }
    }
  ],
  "schema": {
    "title": "Контейнер «Инвестиционный консультант»",
    "description": "Представляет экземпляр контейнера роли «Инвестиционный консультант». Он наследует общие свойства от базовых схем и определяет специфичные выходные данные, относящиеся к этому контейнеру.",
    "allOf": [
      {
        "$ref": "aug:/schemas/Vibe",
        "$comment": "Базовая структура Vibe. Предоставляет основные свойства $id, $type и $revision для этого Vibe-контейнера."
      },
      {
        "$ref": "aug:/schemas/RoleVibe",
        "$comment": "Базовая структура RoleVibe. Предоставляет общие свойства роли, такие как displayName, description, createdAt, lastModified. Расширяя ее, мы определяем этот Vibe как ролевой."
      },
      {
        "type": "object",
        "title": "Выходные данные контейнера",
        "description": "Определяет специфичные выходные данные, являющиеся результатом обработки этого контейнера «Инвестиционный консультант».",
        "properties": {
          "specializationUsed": {
            "type": "string",
            "title": "Активная специализация",
            "description": "Область фокуса, которая была активна для этого конкретного контейнера."
          },
          "analysisDepthUsed": {
            "type": "string",
            "enum": ["quick", "standard", "comprehensive"],
            "title": "Глубина анализа",
            "description": "Уровень детализации, использованный в анализе."
          },
          "_IntroductionNarrative": {
            "type": "string",
            "format": "markdown",
            "title": "Введение к отчету",
            "description": "Вступительный текст, который вводит в контекст анализа и задает тон."
          },
          "MarketAnalysis": {
            "type": ["object", "null"],
            "title": "Анализ рынка",
            "description": "Результаты анализа рынка. Null, если анализ не проводился.",
            "properties": {
              "summary": {
                "type": "string",
                "title": "Резюме анализа",
                "description": "Основные выводы из анализа рынка."
              },
              "sentiment": {
                "type": "string",
                "enum": ["very-negative", "negative", "neutral", "positive", "very-positive"],
                "title": "Рыночное настроение",
                "description": "Общая оценка рыночного настроения."
              },
              "impactScore": {
                "type": "number",
                "minimum": 0,
                "maximum": 10,
                "title": "Оценка влияния",
                "description": "Численная оценка потенциального влияния на рынок."
              }
            },
            "required": ["summary", "sentiment", "impactScore"]
          },
          "_RecommendationTransition": {
            "type": "string",
            "format": "markdown",
            "title": "Контекст рекомендации",
            "description": "Текст, который служит переходом от анализа к рекомендациям.",
            "const": "На основе приведенного выше анализа рынка, следующая инвестиционная рекомендация учитывает как немедленные возможности, так и неотъемлемые риски, связанные с инвестициями в развивающиеся технологии."
          },
          "InvestmentRecommendation": {
            "type": ["object", "null"],
            "title": "Инвестиционная рекомендация",
            "description": "Итоговая инвестиционная рекомендация. Null, если не запрашивалась.",
            "properties": {
              "recommendation": {
                "type": "string",
                "enum": ["strong-buy", "buy", "hold", "sell", "strong-sell"],
                "title": "Рекомендация",
                "description": "Рекомендация по инвестиционному действию."
              },
              "rationale": {
                "type": "string",
                "title": "Обоснование",
                "description": "Объяснение рекомендации."
              },
              "confidenceLevel": {
                "type": "number",
                "minimum": 0,
                "maximum": 1,
                "title": "Уровень уверенности",
                "description": "Уверенность в рекомендации (0-1)."
              },
              "timeHorizon": {
                "type": "string",
                "title": "Временной горизонт",
                "description": "Предлагаемый временной горизонт инвестиций."
              }
            },
            "required": ["recommendation", "rationale", "confidenceLevel", "timeHorizon"]
          },
          "RiskAssessment": {
            "type": ["object", "null"],
            "title": "Детальная оценка рисков",
            "description": "Всесторонний анализ рисков. Null, если не запрашивался или если глубина анализа 'быстрый'.",
            "properties": {
              "overallRiskLevel": {
                "type": "string",
                "enum": ["very-low", "low", "moderate", "high", "very-high"],
                "title": "Общий уровень риска"
              },
              "primaryRiskFactors": {
                "type": "string",
                "title": "Основные факторы риска",
                "description": "Ключевые риски, выявленные в инвестиции."
              },
              "mitigationStrategies": {
                "type": "string",
                "title": "Стратегии смягчения рисков",
                "description": "Рекомендуемые подходы к управлению выявленными рисками."
              }
            },
            "required": ["overallRiskLevel", "primaryRiskFactors", "mitigationStrategies"]
          },
          "_ConclusionNarrative": {
            "type": "string",
            "format": "markdown",
            "title": "Заключение отчета",
            "description": "Заключительный текст, который подводит итоги."
          }
        },
        "required": [
          "specializationUsed",
          "analysisDepthUsed",
          "_IntroductionNarrative",
          "MarketAnalysis",
          "_RecommendationTransition",
          "InvestmentRecommendation",
          "RiskAssessment",
          "_ConclusionNarrative"
        ]
      }
    ]
  },
  "solution": {
    "$type": "InvestmentAdvisorVesselVibe",
    "$id": "aug:vessels/advisor-vessel-acme-001",
    "$revision": 1,
    "createdAt": "2025-03-18T10:00:00Z",
    "lastModified": "2025-03-18T10:05:00Z",
    "displayName": "Анализ влияния ACME Corp Quantum",
    "description": "Быстрый анализ рынка прорыва ACME Corp в квантовых вычислениях.",

    "specializationUsed": "Анализ технологического сектора",
    "analysisDepthUsed": "быстрый",

    "_IntroductionNarrative": "## Отчет об инвестиционном анализе\n\n*Сгенерированный анализ*\n\nЭтот отчет содержит анализ рынка и инвестиционные рекомендации на основе запрошенной оценки. Глубина анализа и фокусные области адаптированы к предоставленным параметрам запроса.",

    "MarketAnalysis": {
      "summary": "Прорыв ACME Corp в квантовых вычислениях представляет собой значительный технологический скачок с потенциалом для трансформации множества секторов, включая ИИ, фармацевтику и криптографию. Чип 'QuantumLeap' показывает 1000-кратное улучшение производительности по сравнению с текущими решениями, что делает ACME потенциальным лидером на рынке квантовых вычислений, который, по прогнозам, достигнет 65 миллиардов долларов к 2030 году.",
      "sentiment": "очень позитивное",
      "impactScore": 8.5
    },

    "_RecommendationTransition": "На основе приведенного выше анализа рынка, следующая инвестиционная рекомендация учитывает как немедленные возможности, так и неотъемлемые риски, связанные с инвестициями в развивающиеся технологии.",

    "InvestmentRecommendation": {
      "recommendation": "покупать",
      "rationale": "Прорыв ACME делает их лидером на развивающемся рынке квантовых вычислений. Преимущество первопроходца и сильный портфель интеллектуальной собственности поддерживают позитивный прогноз, несмотря на типичные риски технологий на ранней стадии.",
      "confidenceLevel": 0.75,
      "timeHorizon": "12-18 месяцев"
    },

    "RiskAssessment": null,

    "_ConclusionNarrative": "## Ключевые выводы\n\nЭтот анализ оценил инвестиционную возможность на основе доступной информации и указанных параметров анализа. Предоставленные рекомендации следует рассматривать в контексте вашей общей инвестиционной стратегии и толерантности к риску.\n\n*Примечание: Этот анализ был проведен на запрошенном уровне глубины. Для более всесторонней оценки могут быть доступны дополнительные возможности.*"
  }
}

Объяснение: Этот расширенный Vibe представляет Контейнер «Инвестиционный консультант», который генерирует результат, похожий на статью:

  • Массив input содержит:

    • Системный контекст
    • Запрос пользователя
    • Конфигурацию состояния, где specialization и analysisDepth установлены на «быстрый»
  • schema использует композицию allOf с:

    • Базовыми схемами для фундаментальных свойств
    • Повествовательными блоками, которые структурируют вывод:
      • _IntroductionNarrative: Общее вступление, обеспечивающее единообразную структуру отчета
      • _RecommendationTransition: Фиксированный текст для перехода (используя const)
      • _ConclusionNarrative: Общее заключение, обеспечивающее единообразную структуру отчета
    • Тремя возможностями:
      • MarketAnalysis: Основная возможность анализа
      • InvestmentRecommendation: Рекомендация на основе анализа
      • RiskAssessment: Не активирована в этом примере (null), потому что в запросе был указан «быстрый» анализ
  • solution демонстрирует:

    • Поток, похожий на статью: При чтении сверху вниз повествовательные блоки и секции данных создают целостный отчет
    • Выборочное использование возможностей: RiskAssessment имеет значение null, потому что он активируется только для «стандартной» или «всесторонней» глубины анализа
    • Форматирование Markdown в повествовательных блоках для правильной структуры документа
    • Разделение структуры и содержания: Повествовательные блоки обеспечивают постоянную структуру контейнера, в то время как только фактические аналитические возможности (MarketAnalysis, InvestmentRecommendation) содержат контент, специфичный для запроса (например, детали о ACME Corp)

Этот паттерн показывает, как контейнеры могут создавать хорошо структурированные, читаемые результаты, при этом интеллектуально активируя только те возможности, которые релевантны для конкретного запроса.

Паттерн выборочного использования возможностей: Контейнер интеллектуально реагирует на входной запрос, используя только релевантные возможности. Это позволяет одному и тому же чертежу роли (Role Blueprint) эффективно обрабатывать различные типы запросов:

  • Запросы на полный анализ будут использовать все возможности
  • Запросы на быстрый анализ (как в этом примере) используют только основные возможности
  • Запросы на использование конкретных инструментов могут использовать только эти конкретные возможности Этот паттерн обеспечивает эффективную обработку и четкие, сфокусированные результаты, соответствующие намерению пользователя.

Паттерн проектирования повествовательных блоков:

  • Все повествовательные блоки (свойства, начинающиеся с нижнего подчеркивания): Обеспечивают единообразный структурный нарратив для контейнера, независимо от конкретного запроса. Они определяют структуру отчета контейнера.
    • _IntroductionNarrative: Общее введение для любого отчета об инвестиционном анализе
    • _RecommendationTransition: Фиксированный текст для перехода (используя const в схеме)
    • _ConclusionNarrative: Общее заключение для любого отчета об инвестиционном анализе
  • Контент, специфичный для запроса, появляется только в выходных данных возможностей (MarketAnalysis, InvestmentRecommendation и т.д.), а не в повествовательных блоках
  • Такое разделение гарантирует, что контейнер сохраняет свою структурную идентичность, адаптируя при этом содержание анализа к различным запросам

3. Пример Capability Vibe: Распределение ресурсов и делегирование задач

Сценарий: Capability Vibes представляют собой делегированные полномочия с интегрированным распределением ресурсов. Они служат одновременно и разрешением на выполнение работы, и спецификацией того, какая работа может быть выполнена, причем ресурсы выделяются непосредственно внутри возможности, а не через отдельные Resource Vibes.

3.1 Возможность распределения бюджета: Маркетинговая кампания

Эта возможность представляет собой полномочия на расходование маркетингового бюджета с определенными ограничениями и распределениями.

Пример JSON-структуры MarketingCampaignBudgetCapability (например, aug:capabilities/marketing-campaign-q1?1):

{
  "input": [
    {
      "type": "query",
      "query": "Создать возможность, которая делегирует полномочия по маркетинговой кампании с выделением бюджета в $50K"
    }
  ],
  "schema": {
    "title": "Возможность бюджета на маркетинговую кампанию",
    "description": "Возможность, которая разрешает деятельность по маркетинговой кампании с выделенным бюджетом и ограничениями на ресурсы.",
    "allOf": [
      {
        "$ref": "aug:/schemas/Vibe",
        "$comment": "Базовая структура Vibe"
      },
      {
        "$ref": "aug:/schemas/CapabilityVibe",
        "$comment": "Базовая структура CapabilityVibe"
      },
      {
        "type": "object",
        "title": "Структура распределения бюджета",
        "description": "Определяет параметры и ограничения распределения бюджета",
        "properties": {
          "authority": {
            "type": "object",
            "title": "Делегированные полномочия",
            "description": "Источник и объем полномочий для этой возможности",
            "properties": {
              "grantedBy": {
                "type": "string",
                "title": "Кем выданы полномочия",
                "description": "ID Vibe, выдавшего эту возможность"
              },
              "scope": {
                "type": "string",
                "enum": ["organization", "department", "project", "personal"],
                "title": "Объем полномочий"
              },
              "expiresAt": {
                "type": "string",
                "format": "date-time",
                "title": "Срок действия полномочий"
              }
            },
            "required": ["grantedBy", "scope"]
          },
          "budget": {
            "type": "object",
            "title": "Выделенный бюджет",
            "description": "Прямое распределение ресурсов внутри этой возможности",
            "properties": {
              "totalUsd": {
                "type": "number",
                "minimum": 0,
                "maximum": 50000,
                "title": "Общий бюджет в USD"
              },
              "usedUsd": {
                "type": "number",
                "minimum": 0,
                "default": 0,
                "title": "Уже использовано USD"
              },
              "remainingUsd": {
                "type": "number",
                "minimum": 0,
                "title": "Остаток в USD"
              },
              "allocations": {
                "type": "object",
                "title": "Разбивка бюджета",
                "properties": {
                  "contentCreation": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 20000,
                    "title": "Бюджет на создание контента"
                  },
                  "advertising": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 25000,
                    "title": "Бюджет на рекламу"
                  },
                  "analytics": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 5000,
                    "title": "Бюджет на аналитику"
                  }
                },
                "required": ["contentCreation", "advertising", "analytics"]
              }
            },
            "required": ["totalUsd", "usedUsd", "remainingUsd", "allocations"]
          },
          "constraints": {
            "type": "object",
            "title": "Ограничения по расходам",
            "properties": {
              "maxSingleTransaction": {
                "type": "number",
                "maximum": 10000,
                "title": "Максимальная разовая транзакция"
              },
              "approvalRequired": {
                "type": "boolean",
                "title": "Требуется утверждение для крупных расходов"
              },
              "approvalThreshold": {
                "type": "number",
                "title": "Порог для требования утверждения"
              }
            }
          }
        },
        "required": ["authority", "budget", "constraints"]
      }
    ]
  },
  "solution": {
    "$type": "CapabilityVibe",
    "$id": "aug:capabilities/marketing-campaign-q1-2025",
    "$revision": 1,
    "createdAt": "2025-01-10T09:00:00Z",
    "lastModified": "2025-01-10T09:00:00Z",
    "displayName": "Полномочия по бюджету маркетинговой кампании Q1",
    "description": "Полномочия на выполнение маркетинговых кампаний с выделенным бюджетом в $50K",

    "authority": {
      "grantedBy": "aug:roles/marketing-director-sarah",
      "scope": "department",
      "expiresAt": "2025-04-01T00:00:00Z"
    },

    "budget": {
      "totalUsd": 50000,
      "usedUsd": 0,
      "remainingUsd": 50000,
      "allocations": {
        "contentCreation": 15000,
        "advertising": 25000,
        "analytics": 10000
      }
    },

    "constraints": {
      "maxSingleTransaction": 10000,
      "approvalRequired": true,
      "approvalThreshold": 5000
    }
  }
}