Галоўная / Артыкулы / Канцэларз штаба: Выконавчая інформацыя для агента – масштабная шаровая архітектура

Канцэларз штаба: Выконавчая інформацыя для агента – масштабная шаровая архітектура

Практычныя інструкцыі па выкорыстоўванні агента для кароткага інформавання начальніка штабу: масштабная архітектура з калькамі: контракты, перакананні і слоты для коду для команд, якіе викорыстоўваюць гэты патерн.

4574 слоў

У гэтым керавану практычным крокам перакладзена схема працы ад сыр'ёчных матэрыялаў да готовай системы для: Агента з адпаведных інформацый для начальніка штабу: масштабаваная шаровая архітектура для автоматызаванага стварэння інтэлігэнцыі. Акцэнт ставяцца на практычныя крокі, чыстае перакананне ў правильнасці дзействаў і код, які можна проста падключыць у репазітарый, не прабуючы здогадвацца пра мету. У стадії агульнага перакладу неабходна з'явіць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры перадзеі коду. Аперацыйныя працавнікі должны магчымае перадзеі крок з вядомай точкі контролю, не прабуючы здагадвацца пра схованы стан. Неабходна адначасова задокументаваць нормальны ход працы і спосабы вярнення ў нормальны стан. Перапрыбуткі, людзкія перакананні і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.

Агульныя відзнакі дызайна рашэння

Калі працюеце над стадзіяй прадзыржнага адзычэння рашэння, спачатку запісайце умовы працы: неабяжлівыя данні, сігнал успеху і тое, што выходзіць пад частыя неудачы. Такі список контролю дапамагае заліцвачыць змяны ў кодзе. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, неудача должна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцужок задач. Зрабіце пераконтроль пасля дорогіх крокаў. Система не должна занова ставіць плату за той самы вызыв LLM, калі аператар прабуе зноў выконаць пазнейшы элемент.

Слой фундаменту: Кантролюемая кансалідацыя корпаратыўных дадзенняў

Калі працуеце над стадзіяй «Enterprise» у шары Foundation, спачатку запісайце контракт: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список перакладоў заходзіць пазнейшыя змены коду ў правільным напрамку. Спрыймайце гэтую стадзію як контракт межа данымі, якія вносзяцца, і падтверджанымі рэзультатамі. Даўце назвы элементам, задайце критэрыя успеху і не падтрымайце частковае завершэння без адпаведных падтверджэнняў. Зрабіце перапытку пасля дорогіх крокаў. Програма для продакцыі не должна зноў выклікаць той самы кантакт з LLM, калі аператар прабуе зноў запрацаваць з наступным элементам.

Шар дадзеных: двігун оператыўнай інтэлігенціі, оптымізаваны для викорыстання API

Калі працуеце з слоем дадзейна ў оператыўнай фазе, спачатку запісаце кантракт: неабходныя даны, сігнал успеху і тое, што выканаецца у разы частковага нявыпалення. Такі список контроля дапамагае заставіць пазнейшыя змены коду быць чыстымі. Запісваюце час выканення і кост токена або запыту праза функцыйнальнымі рэзултатамі. Відразы коста з самага пачатку запобегае неспакою, калі процес пераходзіць з дэмовай среды ў спяльныя сераўеры. Ствараеце контрольную точку пасля дорогіх крокаў. Функцыя вярнення не должна зноў нараховваць кост той самай вызову LLM, калі аператар прабуюць зноў выканаць пазнейшы элемент. Калі працуеце з слоем дадзейна ў оператыўнай фазе, спачатку запісаце кантракт: неабходныя даны, сігнал успеху і тое, што выканаецца у разы частковага нявыпалення. Такі список контроля дапамагае заставіць пазнейшыя змены коду быць чыстымі. Дакументаваеце як шлях успеху, так і шлях вярнення да нормы. Прабавы, людзкія контрольныя пункты і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.

     --Accounts Table - Primary Business Entity

CREATE TABLE [aieo].[Accounts] (

    [Id] INT IDENTITY(1,1) PRIMARY KEY,

    [TPID] BIGINT NOT NULL,

    [AccountName] NVARCHAR(255) NOT NULL,

    [AccountNumber] NVARCHAR(50),

    [SearchTokens] NVARCHAR(500),

    [Segment] NVARCHAR(100),

    [Industry] NVARCHAR(100),

    [ACR_FY25] DECIMAL(15,2),

    [RevenueRank] INT,

    [CreatedDate] DATETIME2 DEFAULT GETUTCDATE(),

    [LastSync] DATETIME2,

    [IsActive] BIT DEFAULT 1

);



CREATE CLUSTERED INDEX IX_Accounts_TPID ON [aieo].[Accounts]([TPID]);

CREATE NONCLUSTERED INDEX IX_Accounts_Name ON [aieo].[Accounts](
-- Revenue Table - Historical and Forecast Data

CREATE TABLE [aieo].[Revenue] (

    [TPID] BIGINT,

    [FiscalYear] NVARCHAR(10),

    [RevenueType] NVARCHAR(20),

    [Amount] DECIMAL(15,2),

    [LastUpdated] DATETIME2

);

CREATE INDEX IX_Revenue_TPID_FY ON [aieo].[Revenue]([TPID], [FiscalYear]);
-- AI Usage Table - Product Adoption Metrics

CREATE TABLE [aieo].[AIUsage] (

    [TPID] BIGINT,

    [ProductCategory] NVARCHAR(50),

    [UsageLevel] NVARCHAR(20),

    [SeatCount] INT,

    [AdoptionRate] DECIMAL(5,2),

    [LastUpdated] DATETIME2

);

CREATE INDEX IX_AIUsage_TPID_Product ON [aieo].[AIUsage]([TPID], [ProductCategory]);
--Account Search Procedure - Revenue-Prioritized Discovery

CREATE OR ALTER PROCEDURE [aieo].[SearchAccounts]

    @searchTerm NVARCHAR(255),

    @top INT = 5

AS

BEGIN

    SET NOCOUNT ON;



    DECLARE @likeTerm NVARCHAR(257) = '%' + REPLACE(REPLACE(@searchTerm, '[', '[[]'), '%', '[%]') + '%'



    SELECT TOP (@top)

        a.TPID,

        a.AccountName,

        a.AccountNumber,

        ISNULL(acr.ACR_YTD, 0) as ACR_YTD

    FROM [aieo].[Accounts] a

    LEFT JOIN [aieo].[ACR] acr ON a.TPID = acr.TPID

    WHERE

        a.AccountName LIKE @likeTerm

        OR CAST(a.TPID AS NVARCHAR) = @searchTerm

        OR a.AccountNumber LIKE @likeTerm

    ORDER BY

        ISNULL(acr.ACR_YTD, 0) DESC,

        a.AccountName ASC

    FOR JSON PATH;

END;
--Account Details Retrieval Procedure - Comprehensive Intelligence Aggregation

CREATE PROCEDURE [aieo].[GetAccountDetails]

(@TPID int)

AS

BEGIN

    SET NOCOUNT ON;

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;



    SELECT TOP 1

        JSON_QUERY(ap.[AccountProfile]) AS [Account],

        JSON_QUERY(ai.[AIUsage]) AS [AI],

        JSON_QUERY(acr.[Data]) AS [ACR],

        deal.[Deals.AgreementValue],

        deal.[Deals.DealType],

        deal.[Deals.Term],

        deal.[Deals.Remaining],

        deal.[Deals.EndDate],

        ecif.[ECIF.Committed],

        aco.[ACO.IncrementalRevenue],

        aco.[ACO.Discount],

        aco.[ACO.ACO],

        JSON_QUERY(bot.[Data]) AS [BoT],

        JSON_QUERY(inv.[Data]) AS [Investments],

        JSON_QUERY(rev.[Data]) AS [Revenue]

    FROM [dbo].[vw_Customer] P

    OUTER APPLY (

        SELECT TOP 1

            a.[TPID],

            a.[CRMAccountName] AS [AccountName],

            a.[Segment],

            a.[Industry],

            a.[EOU],

            a.[OU],

            LOWER(TRIM(c.[Value])) AS [ATU_Manager.Alias],

            aau.[Mail] AS [ATU_Manager.Email],

            [dbo].[RemoveJobTitle](aau.[DisplayName]) AS [ATU_Manager.DisplayName],

            NULLIF(TRIM(aau.[BusinessPhone]), '') AS [ATU_Manager.PhoneNumber],

            JSON_QUERY([am].[Data]) AS [AM],

            JSON_QUERY([atum].[Data]) AS [ATUM]

        FROM [dbo].[vw_Customer] A

        OUTER APPLY STRING_SPLIT(a.[AM], ',', 1) C

        LEFT JOIN [cm].[vw_AAD_User] AAU ON LOWER(TRIM(C.[Value])) = LOWER(AAU.[UserPrincipalName])

        WHERE A.TPID = P.TPID

    ) ap

    WHERE P.TPID = @TPID;

END;
--Template Management Procedure - Role-Based Access Control

CREATE OR ALTER PROCEDURE [aieo].[GetBriefingTemplate]

(

    @UserAlias NVARCHAR(200),

    @BriefingType NVARCHAR(200)

)

AS

BEGIN

    SET @UserAlias = IIF(CHARINDEX('@', @UserAlias) > 0,

                        LEFT(@UserAlias, CHARINDEX('@', @UserAlias) - 1),

                        @UserAlias)



    SELECT DISTINCT

        [BriefingTemplateId],[TemplateDescription],[BriefingType],

        [UserAlias],FullName,[Filename],[FileType],[PreviewFilename]

    FROM [hr].[DimPerson] p

    INNER JOIN [aieo].[ExecutiveOfficeMember] eom ON eom.[PersonnelNumber] = p.[PersonnelNumber]

    INNER JOIN [aieo].[ExecutiveOffice] o ON o.[ExecutiveOfficeId] = eom.[ExecutiveOfficeId]

    INNER JOIN [aieo].[BriefingTemplate] bt ON bt.[ExecutiveOfficeId] = o.[ExecutiveOfficeId]



    UNION



    SELECT DISTINCT

        [BriefingTemplateId],[TemplateDescription],[BriefingType],

        p.EmailName As UserAlias,p.FullName,[Filename],[FileType],[PreviewFilename]

    FROM [aieo].[BriefingTemplate] bt

    CROSS JOIN [hr].[DimPerson] p

    WHERE bt.[UserAlias] = 'ALL' AND p.EmailName = @UserAlias

        AND bt.BriefingType = @BriefingType;

END;
GRANT EXECUTE ON SCHEMA::[aieo] TO [service_identity];
 - No direct table access permitted

Слой служб: безстановая оркестрацыя і межы выконання

Этап безстановай оркестрацыі слоя служб працюе наяўней, калі яго розглядаюць як вимерную паверхню. Запісаўце адна ідеальная транскрыпцыя, адзін прыклад неудачы і прыметкі па аброшчанню роботы пры расширэнні масштаба. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якая-небудзь ступеня не выконваецца, прычына неудачы павінна вказываць на адную адповядальнасць, а не на заплутаны ланцюг задач. Рэзервавайце стан графа ў простам і типізаваным формате. Вкладныя блокі маскуюць інфармацыю пра тое, який вузел запісаў які поле, і спакоююць продажчыку роботы пасля перерываў.

from pydantic import BaseModel
from typing import Optional
class BriefingRequest(BaseModel):
account_name_or_tpid: str
meeting_datetime: Optional[str] = None
meeting_objective: Optional[str] = None
ms_attendees: Optional[str] = None
template_type: Optional[str] = None

Слой досвіду: дварчы інтэлектны механізм Copilot Studio

Рэвэню працуе найкраща, калі яго спрыяваць у Copilot Studio розглядаецца як меравальная паверхня. Запісаўце адну ідеальную версію, адзін прыклад неудачы і прыметку па адвярненню змян перш чым расширваць масштаб. Спрыяваць трэба розглядаць як кантракт межаў вхідных дадзеных і перакананых выходных рэсультатаў. Даце назвы артыфактам, задаце крэтырыя успеху і адмовіцеся ад тыхнай частковай рэалізацыі без паведамлення. Зберагачыце стан графа ў простам і типаванам формате. Вярнутыя структуры маскуюць, який вузел запісаў кожны поле, і спакоююць працэс пасля перарываў.

kind: AdaptiveDialog

inputs:

  - kind: AutomaticTaskInput

    propertyName: Account_Name_or_TPID

    name: Account Name or TPID

    description: The account/customer TPID (unique identifier) or name

    shouldPromptUser: true



modelDescription: Create briefing document to prepare for meeting with customer

beginDialog:

  kind: OnRecognizedIntent

  intent:

    displayName: Topic for creating briefing document to prepare for meeting with customer

    triggerQueries:

      - Generate a briefing document for account Accenture

      - I need a briefing for Amazon

      - Create briefing for Apple

      - I have a meeting with JPMorgan Chase at 4PM
- kind: SetVariable

  id: setVariable_IsNumeric

  variable: Topic.IsNumeric

  value: =IsNumeric(Topic.UserInput)



- kind: ConditionGroup

  id: conditionGroup_InputType

  conditions:

    - id: condition_IsTPID

      condition: =Topic.IsNumeric

      actions:

        - kind: SetVariable

          variable: Topic.Account_TPID

          value: =Topic.UserInput
- kind: HttpRequestAction

  id: httpRequest_SearchAccounts

  displayName: Search Accounts by Name

  url: =Global.ApiBaseUrl & "/api/mssales/search/" & EncodeUrl(Topic.UserInput)

  headers:

    Ocp-Apim-Subscription-Key: =Global.ApiKey

  response: Topic.SearchResults

  responseSchema:

    kind: Record

    properties:

      accounts:

        type:

          kind: Table

          properties:

            account_name: String

            tpid: String

      total_count: Number
- kind: AdaptiveCardPrompt

  id: adaptiveCard_SelectAccount

  card: "=Concatenate('{

    \"$schema\":\"https://adaptivecards.io/schemas/adaptive-card.json\",

    \"type\":\"AdaptiveCard\",\"version\":\"1.5\",

    \"body\":[

      {\"type\":\"TextBlock\",\"text\":\"Multiple accounts found\",\"weight\":\"Bolder\"},

      {\"type\":\"Input.ChoiceSet\",\"id\":\"selectedAccount\",\"isRequired\":true,

       \"choices\":',

       JSON(ForAll(Topic.SearchResults.accounts,

         {title: Concatenate(account_name, \" (TPID: \", tpid, \")\"), value: tpid})),

       '}],

    \"actions\":[{\"type\":\"Action.Submit\",\"title\":\"Continue\"}]

  }')"
- kind: HttpRequestAction

  id: httpRequest_GetUserTemplates

  url: =Global.ApiBaseUrl & "/api/briefings/templates?user_alias=" &

       EncodeUrl(System.User.PrincipalName) & "&briefing_type=Customer"

  headers:

    Ocp-Apim-Subscription-Key: =Global.ApiKey

  response: Topic.UserTemplates
- kind: AdaptiveCardPrompt

  id: adaptiveCard_MeetingDetails

  card: "=Concatenate('{

    \"$schema\":\"https://adaptivecards.io/schemas/adaptive-card.json\",

    \"type\":\"AdaptiveCard\",\"version\":\"1.5\",

    \"body\":[

      {\"type\":\"TextBlock\",\"text\":\"Create Executive Briefing Document\",

       \"weight\":\"Bolder\",\"size\":\"Large\",\"color\":\"Accent\"},

      {\"type\":\"Input.Date\",\"id\":\"meetingDate\",\"isRequired\":true,

       \"label\":\"Meeting Date\"},

      {\"type\":\"Input.Time\",\"id\":\"meetingTime\",\"value\":\"09:00\"},

      {\"type\":\"Input.Text\",\"id\":\"msAttendees\",\"isVisible\":false,

       \"label\":\"Microsoft Attendees\"}

    ],

    \"actions\":[

      {\"type\":\"Action.ToggleVisibility\",\"title\":\"Additional Options ▼\",

       \"targetElements\":[\"msAttendees\"]},

      {\"type\":\"Action.Submit\",\"title\":\"Generate Briefing\"}

    ]

  }')"
// Ephemeral Logic App Security Pattern
const createSearchLogicApp = async (userAlias, searchQuery) => {
const logicAppName = `Researcher-${userAlias}`;
// Create Logic App with SAS trigger
const logicApp = await armClient.logicApps.createOrUpdate({
resourceGroupName: 'Azure_OpenAI',
workflowName: logicAppName,
definition: buildResearchWorkflow(userAlias)
});
// Execute search via SAS URL
const searchResults = await triggerLogicApp(logicApp.triggerUrl, searchQuery);
// Immediate cleanup for security
await armClient.logicApps.delete(logicAppName);
return searchResults;
};
# Logic App Parallel Execute Pattern

HTTP_Trigger_SAS_Secured:

  Email_Branch:

    - Get_Emails: Office365_Connector.Mail (top=250)



  Teams_Branch_Parallel:

    - Get_Teams_Chats_Page1: Teams_Connector.Chats (top=50)

    - Get_Teams_Chats_Page2: Teams_Connector.Chats (skip=50, top=50)

    - For_Each_Chat:

        concurrency: 10

        actions:

          - Get_Chat_Messages: Teams_Connector.Messages (top=50)

          - Append_Chat_Data: Variable_Accumulation



  Response_Assembly:

    - Combine: Email_Results + Teams_Results + Metadata

    - Return: JSON_Structured_Response
// Per-User Connection Provisioning

const provisionUserConnections = async (userAlias) => {

    const connections = [

        {

            name: `office365-${userAlias}`,

            api: '/providers/Microsoft.PowerApps/apis/shared_office365',

            scopes: ['Mail.ReadWrite']

        },

        {

            name: `teams-${userAlias}`,

            api: '/providers/Microsoft.PowerApps/apis/shared_teams',

            scopes: ['Chat.Read']

        }

    ];



    for (const conn of connections) {

        await armClient.connections.createOrUpdate({

            resourceGroupName: 'Azure_OpenAI',

            connectionName: conn.name,

            properties: {

                displayName: conn.name,

                api: { id: conn.api },

                parameterValues: {}

            }

        });

    }



    return generateConsentUrls(connections);

};
# Organizational Intelligence Synthesis

async def synthesize_organizational_context(filtered_data, account_context):

    synthesis_prompt = """

    Analyze the following organizational communications for executive briefing preparation:



    Account Context: {account_name}

    Email Communications: {email_count} relevant messages

    Teams Discussions: {chat_count} relevant conversations

    Generate executive intelligence focusing on:
    Financial performance, earnings trends, and capital allocation signals.
    Corporate strategy, market positioning, and competitive landscape.
    AI strategy, digital transformation initiatives, and cloud ecosystem alignment.
    Recent material developments (≤ 90 days) with actionable insights for executive engagement.

    Format as structured JSON with executive_summary, stakeholder_analysis, recent_activities, and recommended_actions.

    """



    response = await azure_openai_client.chat.completions.create(

        model="gpt-4-1106-preview",

        messages=[{

            "role": "system",

            "content": "You are an executive intelligence analyst."

        }, {

            "role": "user",

            "content": synthesis_prompt.format(**filtered_data, **account_context)

        }],

        temperature=0.1,

        max_tokens=2000

    )



    return parse_structured_intelligence(response.choices[0].message.content)
# Enhanced Copilot Studio Parallel Execution

- kind: ParallelExecution

  id: parallelExecution_ComprehensiveIntelligence

  branches:

    - account_data:

        kind: HttpRequestAction

        url: =Global.ApiBaseUrl & "/api/accounts/" & Topic.Account_TPID

    - organizational_intelligence:

        kind: HttpRequestAction

        url: =Global.ApiBaseUrl & "/api/search?q=" & EncodeUrl(Topic.Account_Name) & "&alias=" & System.User.PrincipalName

        requestTimeoutInMilliseconds: 60000

        continueOnError: true

    - market_intelligence:

        kind: HttpRequestAction

        url: =Global.FoundryBaseUrl & "/bingnews/api/AgentFunction"



- kind: SetVariable

  id: setVariable_CombinedIntelligence

  variable: Topic.BriefingContext

  value: ={

    account_details: Topic.AccountData,

    organizational_context: Topic.OrganizationalIntelligence,

    market_insights: Topic.MarketIntelligence

  }
// Enterprise Governance and Cleanup

const implementGovernanceControls = async () => {

    // Automated stale connection cleanup

    const staleThreshold = 80; // days

    const allConnections = await listManagedConnections();



    const staleConnections = allConnections.filter(connection => {

        const lastUsed = parseISO(connection.properties.lastConnection);

        const daysSinceUse = differenceInDays(new Date(), lastUsed);

        return daysSinceUse > staleThreshold;

    });



    // Compliance audit logging

    for (const connection of staleConnections) {

        await auditLogger.log({

            action: 'CONNECTION_CLEANUP',

            userAlias: connection.userAlias,

            reason: 'AUTOMATED_GOVERNANCE',

            retentionPolicy: `${staleThreshold}_DAYS_INACTIVE`,

            timestamp: new Date().toISOString()

        });



        await deleteUserResources(connection.userAlias);

    }

};
// Fault-Tolerant Execution Pattern

const executeOrganizationalIntelligence = async (searchQuery, userAlias) => {

    const executionTimeout = 60000; // 60 second maximum

    const fallbackResponse = { summary: "Organizational context unavailable", status: "fallback" };



    try {

        // Health check before expensive operations

        const connectionsHealthy = await verifyConnectionHealth(userAlias);

        if (!connectionsHealthy) {

            return fallbackResponse;

        }



        // Execute with timeout boundary

        const intelligencePromise = gatherOrganizationalIntelligence(searchQuery, userAlias);

        const timeoutPromise = new Promise((_, reject) =>

            setTimeout(() => reject(new Error('TIMEOUT')), executionTimeout)

        );



        return await Promise.race([intelligencePromise, timeoutPromise]);



    } catch (error) {

        // Graceful degradation logging

        await logger.warn(`M365 Researcher fallback: ${error.message}`, {

            userAlias,

            searchQuery,

            fallbackMode: true

        });



        return fallbackResponse;

    }

};
- kind: HttpRequestAction

  id: p4tceX

  method: Post

  url: =Global.ApiBaseUrl & "/api/briefings/" & Topic.templateId & "/accounts/" & Topic.Account_TPID

  body:

    kind: JsonRequestContent

    content: "={

      user_alias: Topic.SenderEmail,

      MeetingDateTime: Topic.MeetingDateTime,

      msAttendees: Topic.msAttendees,

      FoundryResponse: Topic.FoundryResponse

    }"

  requestTimeoutInMilliseconds: 60000

  response: Topic.BriefingDocument
- kind: InvokeConnectorAction

  id: invokeConnectorAction_YKkMK4

  input:

    binding:

      dataset: https://microsoft.sharepoint.com/teams/MCAPSAIIncubationHub

      folderPath: /Shared Documents/General/AI Prototypes & Solutions/AI Executive Office Use Cases/Published Cust Template/

      name: =Topic.CustomFilename

      file: =Global.File
- kind: SetVariable

  id: setVariable_CustomFilename

  variable: Topic.CustomFilename

  value: =Concatenate(

    Substitute(Topic.Account_Name, " ", "_"), "_",

    Topic.ExecutiveName, "_Brief_",

    Text(Topic.meetingDate, "yyyy-MM-dd"), ".docx"

  )
- kind: ConditionGroup

  id: conditionGroup_CheckBriefingError

  conditions:

    - condition: =!IsBlank(Topic.BriefingDocument.error) && Topic.BriefingDocument.error.error_code = "TEMPLATE_ACCESS_DENIED"

      actions:

        - kind: AdaptiveCardPrompt

          card: ={

            "$schema":"https://adaptivecards.io/schemas/adaptive-card.json",

            "type":"AdaptiveCard","version":"1.5",

            "body":[{

              "type":"Container","style":"warning",

              "items":[{

                "type":"TextBlock","text":"Template Access Required",

                "weight":"Bolder","color":"Attention"

              },{

                "type":"TextBlock","wrap":true,

                "text": Topic.BriefingDocument.error.user_message

              }]

            }]

          }
- kind: ConditionGroup

  id: conditionGroup_ValidateInputs

  conditions:

    - condition: =Topic.meetingDate < Today()

      actions:

        - kind: SendActivity

          activity: The meeting date cannot be in the past. Please start over and enter a future date.

        - kind: EndConversation
- kind: SetVariable

  id: setVariable_ClearUserInput

  variable: Topic.UserInput

  value: =Blank()



- kind: SetVariable

  id: setVariable_ClearAccountDetails

  variable: Topic.AccountDetails

  value: =Blank()



- kind: SetVariable

  id: setVariable_ClearFoundryResponse

  variable: Topic.FoundryResponse

  value: =Blank()



- kind: SetVariable

  id: setVariable_ClearBriefingDocument

  variable: Topic.BriefingDocument

  value: =Blank()
# Environment-aware authentication pattern

def get_credential():

    if is_azure_environment():

        return ManagedIdentityCredential(client_id=os.getenv('AZURE_CLIENT_ID'))

    else:

        return AzureCliCredential()
Structured exception hierarchy

class AIExecutiveOfficeError(Exception):

    def __init__(self, message: str, error_code: str = None, details: dict = None):

        self.message = message

        self.error_code = error_code or self.__class__.__name__

        self.details = details or {}

        self.timestamp = datetime.utcnow()

Фрэймворк ацэнкі і перакананне якасці

Фрэймворк ацэнкаў і стадія якосці працуюць наяўней, калі іх спрыяваць як мерыемую паверхню. Зберагуце адны ідеальны транскрыпт, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перад расшырэнням масштаба. Запісвайце часы выканання і кост токеноў або запытаў па боку ад функцыйнаых рэзультатаў. Візуабельнасц костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя среды. Храніце стан графа ў простам і типаваным формате. Вярнутыя блокі маскуюць інфармацыю пра тое, який вузел запісаў кожны поле, і спакшваюць продовжэнне роботы пасля перарываў. Фрэймворк ацэнкаў і стадія якосці працуюць наяўней, калі іх спрыяваць як мерыемую паверхню. Зберагуце адны ідеальны транскрыпт, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перад расшырэнням масштаба. Дакументавайце як шлях успеху, так і шлях вяснавання. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.

Наступныя крокі: Міграцыя да Microsoft Agent Framework (MAF)

Для наступных крокаў міграцыі ў практычную фазу неабходна з’ясаваць, які даны будуць вводзіцца, хто будзе адпавядаць за кожны крок, і які критэрыя завершэння перш чым зменіць код. Аператары должны магчымае перзапускать крокі з вядомых пунктавах контролю, не спрабоўваючы з’ясаваць схованы стан. Валідзіце маленькія, тэставаныя елементы замест большых скрыптаў. Калі крок не выйшоў, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны процес. Заставляйце людзей апраўдваць тыя крокі, якія ведуць да витрачання грошаў або змены дадзэнняў у прыемным режыме. Компіляцыйныя налаштаванні не є прамаравамым паказателем завершання роботы.

Заключэнне

У стадії Заключэння неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыры завершэння пры змяне коду. Аперацыйныя працавнікі павінны магчымае перадзванаць крок з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Спрыяйце гэтай стадіі як даговору межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, узначыць крэтыры успеху і адмовіцеся ад тыхнай частковай рэалізацыі, якая не фіксуецца. Забезпечыце людскую апраўду для тых крокаў, якія выкалічваюць грошы або змянююць даны ў працэсе. Компіляцыйныя налашчанні не ўзначаюць павнае выпалення задачі.

Чэк-ліст для аперацый

Стадія чэк-ліста для аперацый працюе найэфектывней, калі яе спрыяваць як мерыемую плошчу. Зафіксавайце адна ідеальная транскрыпцыя, адзін прыклад неудачы і прыметку па адвярненню змян пры расшырэнні масштаба.

Зберагачыце налашчанні парадульна ад коду прыкладнага програмнага забезпечэння. Файлы сераўіса, хранільнікі секрэтных данных і флагі функцыйяў павінны знаходзіцца ў адном месцы, якое працавнікі можуць аудытаваць, не чытаючы весь структураны карэндж.

Зберагаюце стан графа ў простам і типаваным формате. Вкладаныя блобы маскуюць інфармацію пра тое, який вузел запісаў якое поле, і спакошуюць працю пасля перерываў.

Калі дозволяе бюджет, дадзіце тэст на перакананне, які працюе над критычным шляхам у CI з викорыстаннем фіксатываў, а не рэальных платных API.

Документаваць трэба як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є часткай продукту, а не етапамі пазнейшага доўнелення.

Зберагаюце стан графа ў простам і типаваным формате. Вкладаныя блобы маскуюць інфармацію пра тое, який вузел запісаў якое поле, і спакошуюць працю пасля перерываў.

Перш чым апранаваць стак, заморозьце версіі, зафіксаваце ідеальны транскрыпт для критычнага шляху і паказваце крокі для вярнення да пачатковага стану. У спільных средах неабходны ліміты швайнаў, перакананні ў належнасці і чысткі власнік для змены секрэтных даных. Лепш аддаўаць надзею на надзейную надзяйнасць, чым прадставляць крэатывныя, але едыноразовыя дэманстраціі.

Запіска параграфу 8b1aa812f08c: не трэба кантрацеўваць ключы прадаўцаў у репазітарыі, задаць максімальную кантэйнернасць токена на кожную сесію, а таксама зберагчы транскрыпціі празаўседле з фіксамі для ацэнкі, каб пазнейшыя змены моделей заставаліся пораўнанневымі.

Запіска па прыняццю заходаў абароны 0 стадіі найэфектывней працюе, калі яе спрыямаць як мерыемую плошчу. Зберагчы адну ідеальную транскрыпцію, адзін прыклад неудачы і запіску пра вярнэнне да пачатковага стану перш чым расширваць сферу дзеяння. Запісваць часы выканання, кост токенаў або запытаў празаўседле з функцыйнальнымі рэзультатамі. Відразлівае відображэння костаў з’являецца прычыной таго, што не будзе неспадзянаных счытакоў, калі працэс перайдзе з дэмавай версіі ў спяльныя сераўы.

Дзеянне абароны 0/857: змерыць час выканання, класію адказаў і кансуматывную кантэйнернасць токенаў для гэтай запіскі, а пасля — вырашыць, чы робіць змяну на адной пазначанай сэткі пытанняў, а не на адной толькі анекдотычнай інформацыі.

Для першага стадыі павышэння надзеямоў неабходна перад зменай коду адначасова вялічыні вхідных дадзеных, адпаведальную особу за выкананне крока і крэтыярыя завершэння. Аператары должны магчымае перадзванаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан системы. Неабходна аддзекаваць як шлях успеху, так і шлях вяселення з ситуацыяў краху. Перапрыбуткі, людзкія перакрыцця і обробка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.

Дзялёўка павышэння надзеямоў 1/857: вялічыні часу выканання, класу адказоў і выкарыстоўвання ресурсаў для гэтай дзялёўкі, пасля чаго прыміць рашэнне пра застаўленне змены на аднойчынных крэтыярыях, а не на асобістых спазыраўнях.

Калі працуеце над 2-м ўрадзамом павышэння безпекі, спачатку запісайце контракт: неабяжныя вхідныя даны, сігнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список контроля дапамагае залічыць пазнейшыя змены ў кодзе чыстымі. Спрэцьвачайце гэты ўрадзам як контракт межа вхіднымі данымі та перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задацьте критэрыя успеху та адмовіцеся ад мовчанкавага частковага завершэння.

Дзеянні павышэння безпекі 2/857: звярніце увагу на час выканання, класію каштоўкаў та витраты токенав для гэтага ўрадзама, а пасля вырашыце, чы робіць змены на адной пазначанай базе пытанняў, а не на адной лічбе прыкладаў.

2-й ўрадзам павышэння безпекі працюе найкраща, калі яго спрэцьвачваюце як меравальную плошчу. Запісайце адну ідеальную транскрыпцыю, адзін прыклад невыпання та змест карэкціі перад расшырэнням масштаба. Зберагайце настройкі праза код аплікацыі. Файлы сяродавішча, хранільнікі секрэтных данных та флагі функций павінны знаходзіцца ў адном месцы, якое аператары можаць пераглядаць без неабяжнага чытання всіх элементаў.

Дзеянне паўжчання 3/857: звярніце увагу на час выканання, клас памылакі і колькасць выкорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на асобістых спазыраннях, выявіце, чы хацяце застаўіць змены.

Для 4-го этапу паўжчання неабходна перад змянай коду чытка апісаць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыяныя працавнікі должны магчымае перадзваначыць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшоў, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны процес.

Дзеянне паўжчання 4/857: звярніце увагу на час выканання, клас памылакі і колькасць выкорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на асобістых спазыраннях, выявіце, чы хацяце застаўіць змены.

Калі працуеце над 5-м падземам прыемкі з ударожэння, спачатку запісайце контракт: неабяжлівыя даны, сігнал успеху і тое, што выходзіць пад частковыя неудачы. Такі список пераканае ў тым, што пазнейшыя змены коду будуць чыстымі. Запісвайце час выканання і вартасьць токена або запытку пад функцыйнальнымі рэзултатамі. Відразы вартасці з самага пачатку запобегае неспакоўным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя среды.

Дзеянне 5/857 з ударожэння: вымерыце час выканання, класію памылак і витрату токена для гэтай прыемкі, а потым выберыце, чы робіць змену на адной фіксаванай сэтке пытанняў, а не на адной лячбе.

5-й падзем прыемкі з ударожэння работае лепей, калі яго спрыяваць як вимерную паверхню. Запісвайце адна ідеальная транскрыпцыю, адзін кейс неудачы і прыемку для вярнення да пачатковага стану, прычым расшырюючы сферу дзеяння. Дакументавайце і ўспішны шлях, і шлях вярнення. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.

Дзеянне паўжасткі 6/857: звярнуце увагу на час выканання, класію памылак і колькасць выкорыстоўваных токенаў для гэтага зьязначэння, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на індывідуальных прыкладах, выявіце, чы робіць змены.

Для 7-й стадзіі паўжасткі неабходна перад змянай коду адзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыйныя працавнікі должны магчыма было перазапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Штодзе гэтую стадзію трэба спрыятаць як кантракт межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Назвіце артыфакты, адзначыце критэрыя успеху і не падтрымвайце беззвучнае частковае завершэння.

Дзеянне паўжасткі 7/857: звярнуце увагу на час выканання, класію памылак і колькасць выкорыстоўваных токенаў для гэтага зьязначэння, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на індывідуальных прыкладах, выявіце, чы робіць змены.

Калі працуеце над 8-м стадзіям заўважэння па забезпечэнню безпекі, спачатку запісайце умовы кантракту: неабяжныя даны, сігнал успеху і тое, што выходзіць пад частым неудачам. Такі список контроля дапамагае залічыць пазнейшыя змены ў кодзе адкрыта і прозрачна. Зберагайце настройкі парадульна ад коду прыемліка. Файлы сераўнавання, хранальнікі секрэтных данных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавіць аудыт без неабяжнага чытання всіх элементаў.

Дзялей 8/857 па забезпечэнню безпекі: вы меравайце час выканання, класы каштоўкаў і витрату токенав для гэтага заўважэння, а пасля выявляйце, чы хацяце застаўіць змену, спынюючыся на апранаванай сэтце пытанняў, а не на індывідуальных прыкладах.

8-я стадзія заўважэння па забезпечэнню безпекі працуе лепей, калі яе спрыямаць як меравальную плошчу. Зберагайце адны ідеальны прыклад роботы, адзін прыклад неудачы і заўважэння па адкатаванні, прычаму расшырюйце сферу дзейснення пазней. Валіце маленькія, тэставаныя елементы замест большых скрыптав. Калі якісь крок не выйшае, неудача должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцужок дзеянняў.

Дзеянне паўнейшага забезпечэння 9/857: звярніце увагу на час выканання, класыя ошибакі і колькасць токенаў, выкорыстоўваных для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на індывідуальных прыкладах, выявіце, чы хачаце застаўіць змяну.

Для 10-го этапа паўнейшага забезпечэння адначасна з змянай коду неабходна визначыць вхідныя даны, адпаведальнага за этап і крэтырыя завершэння. Аперацыяныя працавнікі должны магчыма было перзапускаць этап з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісвайце час выканання і кост токенаў або запытаў разам з функцыйнальнымі рэзултатамі. Відкрытая інформацыя пра косты запобегае неспакою, калі процес пераходзіць з дэмаверсій у спяльныя среды.

Дзеянне паўнейшага забезпечэння 10/857: звярніце увагу на час выканання, класыя ошибакі і колькасць токенаў, выкорыстоўваных для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на індывідуальных прыкладах, выявіце, чы хачаце застаўіць змяну.

Калі працуеце над 11-й стадзіяю практык ударожэння, спачатку запісайце контракт: неабяжлівыя данні, сігнал успеху і тое, што выходзіць у разе частковага неяксамоства. Такі список контроля дапамагае заліцьваты пазнейшыя змены коду.

Документавайце як «шчаслівы» шлях, так і шлях вяснавання. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў ёсць часткаю продукту, а не пазнейшым дапрацоўкам.

Дакладнасць практык ударожэння 11/857: звярніце увагу на час выканання, класыя ошибакі і витрату токенав для гэтай практыкі, а потым вынікніце рашэнне пра тое, чы хацеце застаўіць змену, адпаведна фіксаванаму набору пытанняў, а не індывідуальным спостарожэнням.

12-я стадзія практык ударожэння працюе лепей, калі яе спрыямаць як меравальную плошчу. Запісайце адна «золатая» транскрыпцыю, адзін прыклад неяксамоства і запіску пра анулювання перад расшырэннем масштабаў. Спрыяйце гэтай стадзіі як контракту межа даннімі і перакананымі выходамі. Дайце назвы артыфактам, задаце правілы пераканання успеху і адмовіцеся ад тыхоўскага частковага завершэння.

Дзеянне паўжырання 12/857: звярніце увагу на час выканання, класыя ошибак і колькасць викорыстоўваных токенаў для гэтага зьязначэння, а пасля, на аднойчынай базе паказаных пытанняў, а не на індывідуальных прыкладах, выявіце, чы хацяце застаўіць змены.

Для 13-й стадзіі паўжырання неабходна перад змянай коду чытко визначыць вхідныя даны, адпаведальнага за выкананне крока і критэрыяы завершэння. Аперацыйныя працавнікі павінны магчымае перадзьвіжваць крок з вядомага пункта контролю, не прымусваныя здагадвацца пра схованы стан. Канфігурацыю трэба зберагчы праз аднойчынны код прыкладнення; файлы сераўіса, хранальнікі секрэтных дадзеных і флагі функцыйяў павінны знаходзіцца ў адном месцы, якое працавнікі можуць пераглядаць, не чытаючы весь код.

Дзеянне паўжырання 13/857: звярніце увагу на час выканання, класыя ошибак і колькасць викорыстоўваных токенаў для гэтага зьязначэння, а пасля, на аднойчынай базе паказаных пытанняў, а не на індывідуальных прыкладах, выявіце, чы хацяце застаўіць змены.

Калі працуеце над стадзіяй 14 з адаптавання, спачатку запісайце умовы кантракта: неабяжлівыя даны, сігнал успеху і тое, што выходзіць пад частковыя неудачы. Такі список дапамагае заліцварваць будучыя змены ў кодзе. Валіце маленькія, тэставальныя елементы замест вялікіх скрыптав. Калі якаясь стадзія не выйшла, неудача должна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач.

Дакладнасць адаптавання 14/857: змерыце час выконання, класію памылак і колькасць токенаў, якія былі выкарыстоўваны для гэтай стадзіі, а пасля вырашыце, чы робіць змены на адной основе фіксаванага набору пытанняў, а не на адной толькі прыватнай інформацыі.

Стадзія 15 з адаптавання працуе лепей, калі яе спрыямаць як меравальную плошчу. Запісайце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіску пра вярнэнне да пачатковага стану, перш чым расширваць масштабы. Запісвайце час выконання і кост токенаў або запытаў разам з функцыйнальнымі рэзултатамі. Відразувая візуабельнасць костаў запобегае неспакойным рашчыткам, калі працэс пераходзіць з дэмавай версіі ў спяльныя сераўы.

Дзеянне паўжчання 15/857: звярніце увагу на час выканання, клас памылакі і колькасць выкорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на асобістых спазыраннях, выявіце, чы робіць змены.

Для 16-й стадзіі паўжчання неабходна перад змянай коду чытко визначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыйныя працавнікі должны магчымае перадзвануць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Неабходна адначасна задокументаваць шлях успеху і шлях вярнення. Практыка павторных спроб, людзкія перакрыцця і обработка некоректных паведамленняў є частью продукту, а не чымсь, што дадаецца пазней.

Дзеянне паўжчання 16/857: звярніце увагу на час выканання, клас памылакі і колькасць выкорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на асобістых спазыраннях, выявіце, чы робіць змены.

Калі працуеце над стадзіяй 17 з адаптавання безпекі, спачатку запісайце контракт: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список контроля дапамагае заліцьварыць пазнейшыя змены ў кодзе. Спрэцьвачайце гэтую стадзію як контракт межа данымі і перакананымі выходамі. Дайце назвы элементам, задаце критэрыя успеху і адмовіцеся ад мовчанкавага частковага завершэння.

Дзеянні адаптавання безпекі 17/857: звярніце увагу на час выканання, класы каштоўкаў і витрату токенав для гэтай стадзіі, а пасля вырашыце, чы робіць змены на аднойчы заданых критэрыях, а не на падставе індывідуальных спостарэнняў.

Стадзія 18 з адаптавання безпекі працюе лепей, калі яе спрэцьвачваюце як меравальную плошчу. Запісайце адна ідеалная транскрыпцыя, адзін прыклад нявыпання і запіску пра адвёртаванне роботы, перш чым расширваце сферу дзейснення. Зберагачыце настройкі параду ўнутры коду прыемленае. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функций должны знаходзіцца ў аднам месцы, куды аператары можаць адбавіць аудыт без неабяжлівага чытання всей структуры.

Дзеянне паўжчання 18/857: звярніце увагу на час выканання, клас памылакі і колькасць выкорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на асобістых спазыраннях, выявіце, чы рэшацца застаўляць змяну.

Для 19-го этапа паўжчання неабходна перад змянай коду чытко визначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыяныя працавнікі павінны магчымае перадзванаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшоў, прычына неудачы павінна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны процес.

Дзеянне паўжчання 19/857: звярніце увагу на час выканання, клас памылакі і колькасць выкорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на асобістых спазыраннях, выявіце, чы рэшацца застаўляць змяну.

Калі працуеце над стадзіяй 20 з адаптавання системы, спачатку запісайце умовы кантракту: неабяжлівыя даны, сігнал успеху і тое, што выходзіць пад частковыя неудачы. Такі список дапамагае заліцварваць будучыя змены ў кодзе. Запісвайце час выканання задачы, а таксама вартасць токенаў чы іншых запитоў праза функцыйнае рэзультат. Відчутнасць вартасці з самага пачатку запобегае неспакойным рахункам, калі система пераходзіць з дэмовай версіі ў спяльныя сераўы.

Дакладнасць адаптавання 20/857: звярніце увагу на час выканання, класы памилак і витрату токенаў для гэтай стадзіі, а пасля выберыце, чы застаўляць змены на адной пазначанай базе дакладнасці, а не на адной толькі прымітцы.

Стадзія 21 з адаптавання работае лепей, калі яе спрыямаць як меравальную плошчу. Запісвайце адну ідеальную транскрыпцыю, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць сферу дзеяння. Дакументавайце як успішны, так і вярнэнчы паты. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.

Дзеянне паўжасткі 21/857: звярніце увагу на час выканання, класы паказчыкаў і колькасць токенаў, якія былі выкарыстаны для гэтага зазначэння, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на індывідуальных прыкладах, выявіце, чы хачаце застаўіць змяну.

Для 22-го этапа паўжасткі неабходна перад змянай коду адзначыць вхідныя даны, адпаведальнага за выкананне крока і критэрыяы завершэння. Аперацыйныя працавнікі должны магчыма было перазапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Штодзе гэты этап трэба спрыятаць як кантрактом межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Назвіце всі неабходныя элементы, адзначыце критэрыі успеху і не падтрымайце тых варыянтаў, калі выкананне адбываецца часткова без паведамлення.

Дзеянне паўжасткі 22/857: звярніце увагу на час выканання, класы паказчыкаў і колькасць токенаў, якія былі выкарыстаны для гэтага зазначэння, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на індывідуальных прыкладах, выявіце, чы хачаце застаўіць змяну.