ЁЯОи Azure OpenAI (Responses API) рдХреЗ рд╕рд╛рде Agentic рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди (.NET)
ЁЯУЛ рд╕реАрдЦрдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп
рдпрд╣ рдЙрджрд╛рд╣рд░рдг .NET рдореЗрдВ Microsoft Agent Framework рдХреЗ рд╕рд╛рде Azure OpenAI (Responses API) рдПрдХреАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреБрджреНрдзрд┐рдорд╛рди рдПрдЬреЗрдВрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрджреНрдпрдо-рдЧреНрд░реЗрдб рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдЖрдк рдЙрди рдкреЗрд╢реЗрд╡рд░ рдкреИрдЯрд░реНрди рдФрд░ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЛ рд╕реАрдЦреЗрдВрдЧреЗ рдЬреЛ рдПрдЬреЗрдВрдЯреЛрдВ рдХреЛ рдЙрддреНрдкрд╛рджрди-рддреИрдпрд╛рд░, рд░рдЦрд░рдЦрд╛рд╡ рдпреЛрдЧреНрдп рдФрд░ рд╕реНрдХреЗрд▓реЗрдмрд▓ рдмрдирд╛рддреЗ рд╣реИрдВред
рдЙрджреНрдпрдо рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди
- ЁЯПн рдлреИрдХреНрдЯреНрд░реА рдкреИрдЯрд░реНрди: рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдорд╛рдирдХреАрдХреГрдд рдПрдЬреЗрдВрдЯ рдирд┐рд░реНрдорд╛рдг
- ЁЯФз рдмрд┐рд▓реНрдбрд░ рдкреИрдЯрд░реНрди: рдлреНрд▓реБрдПрдВрдЯ рдПрдЬреЗрдВрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рд╕реЗрдЯрдЕрдк
- ЁЯз╡ рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рдкреИрдЯрд░реНрди: рд╕рдорд╡рд░реНрддреА рд╕рдВрд╡рд╛рдж рдкреНрд░рдмрдВрдзрди
- ЁЯУЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдкреИрдЯрд░реНрди: рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЯреВрд▓ рдФрд░ рдХреНрд╖рдорддрд╛ рдкреНрд░рдмрдВрдзрди
ЁЯОп .NET-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рд▓рд╛рдн
рдЙрджреНрдпрдо рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ
- рдордЬрдмреВрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ: рд╕рдВрдХрд▓рди-рд╕рдордп рд╕рддреНрдпрд╛рдкрди рдФрд░ IntelliSense рд╕рдорд░реНрдерди
- рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди: рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд DI рдХрдВрдЯреЗрдирд░ рдПрдХреАрдХрд░рдг
- рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рдмрдВрдзрди: IConfiguration рдФрд░ Options рдкреИрдЯрд░реНрди
- Async/Await: рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕рдорд░реНрдерди
рдЙрддреНрдкрд╛рджрди-рддреИрдпрд╛рд░ рдкреИрдЯрд░реНрди
- рд▓реЙрдЧрд┐рдВрдЧ рдПрдХреАрдХрд░рдг: ILogger рдФрд░ рд╕рдВрд░рдЪрд┐рдд рд▓реЙрдЧрд┐рдВрдЧ рд╕рдорд░реНрдерди
- рд╣реЗрд▓реНрде рдЪреЗрдХреНрд╕: рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рдФрд░ рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХреНрд╕
- рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рддреНрдпрд╛рдкрди: рдбреЗрдЯрд╛ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдордЬрдмреВрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ
- рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди: рд╕рдВрд░рдЪрд┐рдд рдЕрдкрд╡рд╛рдж рдкреНрд░рдмрдВрдзрди
ЁЯФз рддрдХрдиреАрдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛
рдХреЛрд░ .NET рдШрдЯрдХ
- Microsoft.Extensions.AI: рдПрдХреАрдХреГрдд AI рд╕реЗрд╡рд╛ рдЕрдореВрд░реНрддрддрд╛рдПрдВ
- Microsoft.Agents.AI: рдЙрджреНрдпрдо рдПрдЬреЗрдВрдЯ рд╕рдордиреНрд╡рдп рдврд╛рдВрдЪрд╛
- Azure OpenAI (Responses API): рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди API рдХреНрд▓рд╛рдЗрдВрдЯ рдкреИрдЯрд░реНрди
- рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рд┐рд╕реНрдЯрдо: appsettings.json рдФрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдПрдХреАрдХрд░рдг
рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
graph LR
A[IServiceCollection] --> B[рдПрдЬреЗрдВрдЯ рдмрд┐рд▓реНрдбрд░]
B --> C[рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди]
C --> D[рдЯреВрд▓ рд░рдЬрд┐рд╕реНрдЯреНрд░реА]
D --> E[рдПрдЖрдИ рдПрдЬреЗрдВрдЯ]
ЁЯПЧя╕П рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдП рдЧрдП рдЙрджреНрдпрдо рдкреИрдЯрд░реНрди
1. рд╕реГрдЬрдирд╛рддреНрдордХ рдкреИрдЯрд░реНрди
- рдПрдЬреЗрдВрдЯ рдлреИрдХреНрдЯреНрд░реА: рд╕реБрд╕рдВрдЧрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдХреЗрдВрджреНрд░реАрдХреГрдд рдПрдЬреЗрдВрдЯ рдирд┐рд░реНрдорд╛рдг
- рдмрд┐рд▓реНрдбрд░ рдкреИрдЯрд░реНрди: рдЬрдЯрд┐рд▓ рдПрдЬреЗрдВрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдлреНрд▓реБрдПрдВрдЯ API
- рд╕рд┐рдВрдЧрд▓рдЯрди рдкреИрдЯрд░реНрди: рд╕рд╛рдЭрд╛ рд╕рдВрд╕рд╛рдзрди рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рдмрдВрдзрди
- рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди: рдХрдордЬреЛрд░ рдЬреЛрдбрд╝ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдпрддрд╛
2. рд╡реНрдпрд╡рд╣рд╛рд░рдЧрдд рдкреИрдЯрд░реНрди
- рд░рдгрдиреАрддрд┐ рдкреИрдЯрд░реНрди: рд╡рд┐рдирд┐рдореЗрдп рдЯреВрд▓ рдирд┐рд╖реНрдкрд╛рджрди рд░рдгрдиреАрддрд┐рдпрд╛рдБ
- рдХрдорд╛рдиреНрдб рдкреИрдЯрд░реНрди: рдкреВрд░реНрд╡рд╡рдд/рдкреБрдирдГ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрд▓рдЧреНрди рдПрдЬреЗрдВрдЯ рд╕рдВрдЪрд╛рд▓рди
- рдСрдмреНрдЬрд╝рд░реНрд╡рд░ рдкреИрдЯрд░реНрди: рдЗрд╡реЗрдВрдЯ рдЖрдзрд╛рд░рд┐рдд рдПрдЬреЗрдВрдЯ рдЬреАрд╡рдирдЪрдХреНрд░ рдкреНрд░рдмрдВрдзрди
- рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдердб: рдорд╛рдирдХреАрдХреГрдд рдПрдЬреЗрдВрдЯ рдирд┐рд╖реНрдкрд╛рджрди рд╡рд░реНрдХрдлрд╝реНрд▓реЛрдЬрд╝
3. рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреИрдЯрд░реНрди
- рдПрдбрд╛рдкреНрдЯрд░ рдкреИрдЯрд░реНрди: Azure OpenAI (Responses API) рдПрдХреАрдХрд░рдг рдкрд░рдд
- рдбреЗрдХреЛрд░реЗрдЯрд░ рдкреИрдЯрд░реНрди: рдПрдЬреЗрдВрдЯ рдХреНрд╖рдорддрд╛ рд╡рд┐рд╕реНрддрд╛рд░
- рдлрд╕рд╛рдб рдкреИрдЯрд░реНрди: рд╕рд░рд▓ рдПрдЬреЗрдВрдЯ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдЗрдВрдЯрд░рдлреЗрд╕
- рдкреНрд░реЙрдХреНрд╕реА рдкреИрдЯрд░реНрди: рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд▓реЗрдЬрд╝реА рд▓реЛрдбрд┐рдВрдЧ рдФрд░ рдХреИрд╢рд┐рдВрдЧ
ЁЯУЪ .NET рдбрд┐рдЬрд╝рд╛рдЗрди рд╕рд┐рджреНрдзрд╛рдВрдд
SOLID рд╕рд┐рджреНрдзрд╛рдВрдд
- рд╕рд┐рдВрдЧрд▓ рд░рд┐рд╕реНрдкреЙрдиреНрд╕рд┐рдмрд┐рд▓рд┐рдЯреА: рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЙрджреНрджреЗрд╢реНрдп рд╣реЛрддрд╛ рд╣реИ
- рдУрдкрди/рдХреНрд▓реЛрдЬреНрдб: рдмрд┐рдирд╛ рд╕рдВрд╢реЛрдзрди рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдпреЛрдЧреНрдп
- рд▓рд┐рд╕реНрдХреЛрд╡ рд╕реНрдерд╛рдирд╛рдкрдиреНрдирддрд╛: рдЗрдВрдЯрд░рдлреЗрд╕-рдЖрдзрд╛рд░рд┐рдд рдЯреВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
- рдЗрдВрдЯрд░рдлреЗрд╕ рдкреГрдердХреНрдХрд░рдг: рдХреЗрдВрджреНрд░рд┐рдд, рд╕рдВрдпреБрдХреНрдд рдЗрдВрдЯрд░рдлреЗрд╕
- рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдиреНрд╡рд░реНрдЬрд╝рди: рдЕрдореВрд░реНрддрддрд╛рдУрдВ рдкрд░ рдирд┐рд░реНрднрд░, рдареЛрд╕рддрд╛рдУрдВ рдкрд░ рдирд╣реАрдВ
рдХреНрд▓реАрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░
- рдбреЛрдореЗрди рд▓реЗрдпрд░: рдХреЛрд░ рдПрдЬреЗрдВрдЯ рдФрд░ рдЯреВрд▓ рдЕрдореВрд░реНрддрддрд╛рдПрдВ
- рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЗрдпрд░: рдПрдЬреЗрдВрдЯ рд╕рдордиреНрд╡рдп рдФрд░ рд╡рд░реНрдХрдлрд╝реНрд▓реЛрдЬрд╝
- рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд▓реЗрдпрд░: Azure OpenAI (Responses API) рдПрдХреАрдХрд░рдг рдФрд░ рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛рдПрдБ
- рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рди рд▓реЗрдпрд░: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рд░реВрдкрдг
ЁЯФТ рдЙрджреНрдпрдо рд╡рд┐рдЪрд╛рд░
рд╕реБрд░рдХреНрд╖рд╛
- рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдкреНрд░рдмрдВрдзрди: IConfiguration рдХреЗ рд╕рд╛рде рд╕реБрд░рдХреНрд╖рд┐рдд API рдХреБрдВрдЬреА рдкреНрд░рдмрдВрдзрди
- рдЗрдирдкреБрдЯ рд╕рддреНрдпрд╛рдкрди: рдордЬрдмреВрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдФрд░ рдбреЗрдЯрд╛ рдПрдиреЛрдЯреЗрд╢рди рд╕рддреНрдпрд╛рдкрди
- рдЖрдЙрдЯрдкреБрдЯ рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝реЗрд╢рди: рд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ
- рдСрдбрд┐рдЯ рд▓реЙрдЧрд┐рдВрдЧ: рд╡реНрдпрд╛рдкрдХ рд╕рдВрдЪрд╛рд▓рди рдЯреНрд░реИрдХрд┐рдВрдЧ
рдкреНрд░рджрд░реНрд╢рди
- Async рдкреИрдЯрд░реНрди: рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ I/O рд╕рдВрдЪрд╛рд▓рди
- рдХрдиреЗрдХреНрд╢рди рдкреВрд▓рд┐рдВрдЧ: рдХреБрд╢рд▓ HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░рдмрдВрдзрди
- рдХреИрд╢рд┐рдВрдЧ: рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреИрд╢рд┐рдВрдЧ
- рд╕рдВрд╕рд╛рдзрди рдкреНрд░рдмрдВрдзрди: рдЙрдЪрд┐рдд рдбрд┐рд╕реНрдкреЛрдЬрд╝рд▓ рдФрд░ рд╕рдлрд╛рдИ рдкреИрдЯрд░реНрди
рд╕реНрдХреЗрд▓реЗрдмрд┐рд▓рд┐рдЯреА
- рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд╛: рд╕рдорд╡рд░реНрддреА рдПрдЬреЗрдВрдЯ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдорд░реНрдерди
- рд╕рдВрд╕рд╛рдзрди рдкреВрд▓рд┐рдВрдЧ: рдХреБрд╢рд▓ рд╕рдВрд╕рд╛рдзрди рдЙрдкрдпреЛрдЧ
- рд▓реЛрдб рдкреНрд░рдмрдВрдзрди: рджрд░ рд╕реАрдорд┐рддрдХрд░рдг рдФрд░ рдмреИрдХрдкреНрд░реЗрд╢рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ
- рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ: рдкреНрд░рджрд░реНрд╢рди рдореАрдЯреНрд░рд┐рдХреНрд╕ рдФрд░ рд╣реЗрд▓реНрде рдЪреЗрдХреНрд╕
ЁЯЪА рдЙрддреНрдкрд╛рджрди рдкрд░рд┐рдирд┐рдпреЛрдЬрди
- рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рдмрдВрдзрди: рдкрд░реНрдпрд╛рд╡рд░рдг-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕
- рд▓реЙрдЧрд┐рдВрдЧ рд░рдгрдиреАрддрд┐: рд╕рд╣рд╕рдВрдмрдВрдз рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрд┐рдд рд▓реЙрдЧрд┐рдВрдЧ
- рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди: рдЙрдЪрд┐рдд рд░рд┐рдХрд╡рд░реА рдХреЗ рд╕рд╛рде рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдкрд╡рд╛рдж рдкреНрд░рдмрдВрдзрди
- рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ: рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдирд╕рд╛рдЗрдЯреНрд╕ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд╛рдЙрдВрдЯрд░
- рдкрд░реАрдХреНрд╖рдг: рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ, рдПрдХреАрдХрд░рдг рдЯреЗрд╕реНрдЯ, рдФрд░ рд▓реЛрдб рдкрд░реАрдХреНрд╖рдг рдкреИрдЯрд░реНрди
.NET рдХреЗ рд╕рд╛рде рдЙрджреНрдпрдо-рдЧреНрд░реЗрдб рдмреБрджреНрдзрд┐рдорд╛рди рдПрдЬреЗрдВрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ? рдЪрд▓рд┐рдП рдХреБрдЫ рдордЬрд╝рдмреВрдд рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ! ЁЯПвтЬи
ЁЯЪА рдЖрд░рдВрдн рдХрд░рдирд╛
рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ
- .NET 10 SDK рдпрд╛ рдЙрд╕рд╕реЗ рдКрдкрд░
- рдПрдХ Azure рд╕рджрд╕реНрдпрддрд╛ рдЬрд┐рд╕рдореЗрдВ Azure OpenAI рд╕рдВрд╕рд╛рдзрди рдФрд░ рдореЙрдбрд▓ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╣реЛ
- Azure CLI тАФ
az login рд╕реЗ рд╕рд╛рдЗрди рдЗрди рдХрд░реЗрдВ
рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░
# zsh/bash
export AZURE_OPENAI_ENDPOINT=https://<your-resource>.openai.azure.com
export AZURE_OPENAI_DEPLOYMENT=gpt-5-mini
# рдлрд┐рд░ рд╕рд╛рдЗрди рдЗрди рдХрд░реЗрдВ рддрд╛рдХрд┐ AzureCliCredential рдПрдХ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗ
az login
# рдкрд╛рд╡рд░рд╢реЗрд▓
$env:AZURE_OPENAI_ENDPOINT = "https://<your-resource>.openai.azure.com"
$env:AZURE_OPENAI_DEPLOYMENT = "gpt-5-mini"
# рдлрд┐рд░ рд╕рд╛рдЗрди рдЗрди рдХрд░реЗрдВ рддрд╛рдХрд┐ AzureCliCredential рдПрдХ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗ
az login
рдирдореВрдирд╛ рдХреЛрдб
рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП,
# рдЬреЗрдбрдПрд╕рдПрдЪ/рдмреИрд╢
chmod +x ./03-dotnet-agent-framework.cs
./03-dotnet-agent-framework.cs
рдпрд╛ dotnet CLI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП:
dotnet run ./03-dotnet-agent-framework.cs
рдкреВрд░реНрдг рдХреЛрдб рдХреЗ рд▓рд┐рдП 03-dotnet-agent-framework.cs рджреЗрдЦреЗрдВред
#!/usr/bin/dotnet run
#:package Microsoft.Extensions.AI@10.*
#:package Microsoft.Agents.AI.OpenAI@1.*-*
#:package Azure.AI.OpenAI@2.1.0
#:package Azure.Identity@1.13.1
using System.ComponentModel;
using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;
using Azure.AI.OpenAI;
using Azure.Identity;
// Tool Function: Random Destination Generator
// This static method will be available to the agent as a callable tool
// The [Description] attribute helps the AI understand when to use this function
// This demonstrates how to create custom tools for AI agents
[Description("Provides a random vacation destination.")]
static string GetRandomDestination()
{
// List of popular vacation destinations around the world
// The agent will randomly select from these options
var destinations = new List<string>
{
"Paris, France",
"Tokyo, Japan",
"New York City, USA",
"Sydney, Australia",
"Rome, Italy",
"Barcelona, Spain",
"Cape Town, South Africa",
"Rio de Janeiro, Brazil",
"Bangkok, Thailand",
"Vancouver, Canada"
};
// Generate random index and return selected destination
// Uses System.Random for simple random selection
var random = new Random();
int index = random.Next(destinations.Count);
return destinations[index];
}
// Azure OpenAI with the Responses API (stable v1 endpoint). Sign in with `az login`.
var azureEndpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")
?? throw new InvalidOperationException("AZURE_OPENAI_ENDPOINT is not set.");
var deployment = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT") ?? "gpt-5-mini";
var azureClient = new AzureOpenAIClient(new Uri(azureEndpoint), new AzureCliCredential());
// Define Agent Identity and Comprehensive Instructions
// Agent name for identification and logging purposes
var AGENT_NAME = "TravelAgent";
// Detailed instructions that define the agent's personality, capabilities, and behavior
// This system prompt shapes how the agent responds and interacts with users
var AGENT_INSTRUCTIONS = """
You are a helpful AI Agent that can help plan vacations for customers.
Important: When users specify a destination, always plan for that location. Only suggest random destinations when the user hasn't specified a preference.
When the conversation begins, introduce yourself with this message:
"Hello! I'm your TravelAgent assistant. I can help plan vacations and suggest interesting destinations for you. Here are some things you can ask me:
1. Plan a day trip to a specific location
2. Suggest a random vacation destination
3. Find destinations with specific features (beaches, mountains, historical sites, etc.)
4. Plan an alternative trip if you don't like my first suggestion
What kind of trip would you like me to help you plan today?"
Always prioritize user preferences. If they mention a specific destination like "Bali" or "Paris," focus your planning on that location rather than suggesting alternatives.
""";
// Create AI Agent with Advanced Travel Planning Capabilities
// Get the Responses client for the deployment and create the AI agent
// Configure agent with name, detailed instructions, and available tools
// This demonstrates the .NET agent creation pattern with full configuration
AIAgent agent = azureClient
.GetChatClient(deployment)
.AsAIAgent(
name: AGENT_NAME,
instructions: AGENT_INSTRUCTIONS,
tools: [AIFunctionFactory.Create(GetRandomDestination)]
);
// Create New Conversation Session for Context Management
// Initialize a new conversation session to maintain context across multiple interactions
// Sessions enable the agent to remember previous exchanges and maintain conversational state
// This is essential for multi-turn conversations and contextual understanding
var session = await agent.CreateSessionAsync();
// Execute Agent: First Travel Planning Request
// Run the agent with an initial request that will likely trigger the random destination tool
// The agent will analyze the request, use the GetRandomDestination tool, and create an itinerary
// Using the session parameter maintains conversation context for subsequent interactions
await foreach (var update in agent.RunStreamingAsync("Plan me a day trip", session))
{
await Task.Delay(10);
Console.Write(update);
}
Console.WriteLine();
// Execute Agent: Follow-up Request with Context Awareness
// Demonstrate contextual conversation by referencing the previous response
// The agent remembers the previous destination suggestion and will provide an alternative
// This showcases the power of conversation sessions and contextual understanding in .NET agents
await foreach (var update in agent.RunStreamingAsync("I don't like that destination. Plan me another vacation.", session))
{
await Task.Delay(10);
Console.Write(update);
}
рдЕрд╕реНрд╡реАрдХрд░рдг:
рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рдЕрдиреБрд╡рд╛рдж AI рдЕрдиреБрд╡рд╛рдж рд╕реЗрд╡рд╛ Co-op Translator рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдо рд╕рдЯреАрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рджреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЕрдкрдиреА рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рд╣реА рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕реНрд░реЛрдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдкреЗрд╢реЗрд╡рд░ рдорд╛рдирд╡ рдЕрдиреБрд╡рд╛рдж рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рдЧрд▓рддрдлрд╣рдореА рдпрд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрддреНрддрд░рджрд╛рдпреА рдирд╣реАрдВ рд╣реИрдВред