π¨ ΠΠ³Π΅Π½ΡΡΠΊΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π° Π΄ΠΈΠ·Π°ΠΉΠ½ Ρ Azure OpenAI (Responses API) (.NET)
π Π£ΡΠ΅Π±Π½ΠΈ ΡΠ΅Π»ΠΈ
Π’ΠΎΠ·ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠ° ΠΊΠΎΡΠΏΠΎΡΠ°ΡΠΈΠ²Π½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π° Π΄ΠΈΠ·Π°ΠΉΠ½ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ½ΡΠ΅Π»ΠΈΠ³Π΅Π½ΡΠ½ΠΈ Π°Π³Π΅Π½ΡΠΈ ΡΡΠ΅Π· Microsoft Agent Framework Π² .NET Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Π½Π° Azure OpenAI (Responses API). Π©Π΅ Π½Π°ΡΡΠΈΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠΈΠΎΠ½Π°Π»Π½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ½ΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΏΡΠ°Π²ΡΡ Π°Π³Π΅Π½ΡΠΈΡΠ΅ Π³ΠΎΡΠΎΠ²ΠΈ Π·Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ, ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈ ΠΈ ΠΌΠ°ΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΈ.
ΠΠΎΡΠΏΠΎΡΠ°ΡΠΈΠ²Π½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π° Π΄ΠΈΠ·Π°ΠΉΠ½
- π Π€Π°Π±ΡΠΈΡΠ΅Π½ ΠΌΠΎΠ΄Π΅Π»: Π‘ΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΈΡΠ°Π½ΠΎ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π°Π³Π΅Π½ΡΠΈ Ρ ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ
- π§ Π‘ΡΡΠΎΠΈΡΠ΅Π»Π΅Π½ ΠΌΠΎΠ΄Π΅Π»: ΠΠ»Π°Π²Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° Π°Π³Π΅Π½ΡΠΈ
- π§΅ ΠΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ: Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΈ ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠΈ
- π ΠΠΎΠ΄Π΅Π» Π½Π° Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ: ΠΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°Π½ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ
π― ΠΠΎΠ»Π·ΠΈ Π·Π° Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π·Π° .NET
ΠΠΎΡΠΏΠΎΡΠ°ΡΠΈΠ²Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ
- Π‘ΡΡΠΎΠ³Π° ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡ: ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ ΠΏΡΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ ΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° IntelliSense
- ΠΠ½ΠΆΠ΅ΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ: ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Π½Π° Π²Π³ΡΠ°Π΄Π΅Π½ DI ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ
- Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°: IConfiguration ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π·Π° ΠΎΠΏΡΠΈΠΈ
- 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[AI Π°Π³Π΅Π½Ρ]
ποΈ ΠΠ΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠ°Π½ΠΈ ΠΊΠΎΡΠΏΠΎΡΠ°ΡΠΈΠ²Π½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ
1. Π‘ΡΠ·Π΄Π°Π²Π°ΡΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ
- Π€Π°Π±ΡΠΈΠΊΠ° Π·Π° Π°Π³Π΅Π½ΡΠΈ: Π¦Π΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π°Π³Π΅Π½ΡΠΈ Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
- Π‘ΡΡΠΎΠΈΡΠ΅Π»Π΅Π½ ΠΌΠΎΠ΄Π΅Π»: ΠΠ»Π°Π²Π΅Π½ API Π·Π° ΡΠ»ΠΎΠΆΠ½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° Π°Π³Π΅Π½ΡΠΈ
- Π‘ΠΈΠ½Π³ΡΠ»ΡΡΠ½ ΠΌΠΎΠ΄Π΅Π»: Π‘ΠΏΠΎΠ΄Π΅Π»Π΅Π½ΠΈ ΡΠ΅ΡΡΡΡΠΈ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
- ΠΠ½ΠΆΠ΅ΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ: Π‘Π»Π°Π±ΠΎ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ ΠΈ ΡΠ΅ΡΡΠ²Π°Π½Π΅
2. ΠΠΎΠ²Π΅Π΄Π΅Π½ΡΠ΅ΡΠΊΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ
- Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡΠ΅ΡΠΊΠΈ ΠΌΠΎΠ΄Π΅Π»: ΠΠ°ΠΌΠ΅Π½ΡΠ΅ΠΌΠΈ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ
- ΠΠΎΠΌΠ°Π½Π΄Π΅Π½ ΠΌΠΎΠ΄Π΅Π»: ΠΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΠ°Π½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π° Π°Π³Π΅Π½ΡΠΈ Ρ undo/redo
- ΠΠ°Π±Π»ΡΠ΄Π°ΡΠ΅Π»ΡΠΊΠΈ ΠΌΠΎΠ΄Π΅Π»: Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΆΠΈΠ·Π½Π΅Π½ΠΈΡ ΡΠΈΠΊΡΠ» Π½Π° Π°Π³Π΅Π½ΡΠ°, Π±Π°Π·ΠΈΡΠ°Π½ΠΎ Π½Π° ΡΡΠ±ΠΈΡΠΈΡ
- Π¨Π°Π±Π»ΠΎΠ½Π΅Π½ ΠΌΠ΅ΡΠΎΠ΄: Π‘ΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΡΠ°Π±ΠΎΡΠ½ΠΈ ΠΏΠΎΡΠΎΡΠΈ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π°Π³Π΅Π½ΡΠΈ
3. Π‘ΡΡΡΠΊΡΡΡΠ½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ
- ΠΠ΄Π°ΠΏΡΠ΅ΡΠ΅Π½ ΠΌΠΎΠ΄Π΅Π»: Π‘Π»ΠΎΠΉ Π·Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ Azure OpenAI (Responses API)
- ΠΠ΅ΠΊΠΎΡΠ°ΡΠΎΡΠ΅Π½ ΠΌΠΎΠ΄Π΅Π»: ΠΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°Π½Π΅ Π½Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° Π°Π³Π΅Π½ΡΠ°
- Π€Π°ΡΠ°Π΄Π΅Π½ ΠΌΠΎΠ΄Π΅Π»: ΠΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ Π·Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π°Π³Π΅Π½ΡΠΈ
- ΠΡΠΎΠΊΡΠΈ ΠΌΠΎΠ΄Π΅Π»: ΠΠ΅Π½ΠΈΠ²ΠΎ Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ ΠΈ ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ Π·Π° ΠΏΠΎΠ²ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°
π ΠΡΠΈΠ½ΡΠΈΠΏΠΈ Π½Π° Π΄ΠΈΠ·Π°ΠΉΠ½ Π² .NET
SOLID ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈ
- ΠΠ΄Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ½ΠΎΡΡ: ΠΡΠ΅ΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΈΠΌΠ° Π΅Π΄Π½Π° ΡΡΠ½Π° ΡΠ΅Π»
- ΠΡΠ²ΠΎΡΠ΅Π½/ΠΠ°ΡΠ²ΠΎΡΠ΅Π½: Π Π°Π·ΡΠΈΡΡΠ΅ΠΌ Π±Π΅Π· ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ
- ΠΠ°ΠΌΡΠ½Π° Π½Π° ΠΠΈΡΠΊΠΎΠ²: ΠΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π½Π° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ, Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ
- Π Π°Π·Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°: Π€ΠΎΠΊΡΡΠΈΡΠ°Π½ΠΈ ΠΈ ΡΠ²ΡΡΠ·Π°Π½ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ
- ΠΠ½Π²Π΅ΡΡΠΈΠΈ Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅: ΠΠ°Π²ΠΈΡΠΈ ΠΎΡ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ, Π½Π΅ ΠΎΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ
Π§ΠΈΡΡΠ° Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°
- ΠΠΎΠΌΠ΅Π½Π΅Π½ ΡΠ»ΠΎΠΉ: ΠΡΠ½ΠΎΠ²Π½ΠΈ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ Π·Π° Π°Π³Π΅Π½ΡΠΈ ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ
- ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΡΠΊΠΈ ΡΠ»ΠΎΠΉ: ΠΡΠΊΠ΅ΡΡΡΠ°ΡΠΈΡ ΠΈ ΡΠ°Π±ΠΎΡΠ½ΠΈ ΠΏΠΎΡΠΎΡΠΈ Π½Π° Π°Π³Π΅Π½ΡΠΈ
- ΠΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ΅Π½ ΡΠ»ΠΎΠΉ: ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ Azure OpenAI (Responses API) ΠΈ Π²ΡΠ½ΡΠ½ΠΈ ΡΡΠ»ΡΠ³ΠΈ
- ΠΡΠ΅Π·Π΅Π½ΡΠ°ΡΠΈΠΎΠ½Π΅Π½ ΡΠ»ΠΎΠΉ: ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΈ ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈΡΠ΅
π ΠΠΎΡΠΏΠΎΡΠ°ΡΠΈΠ²Π½ΠΈ ΡΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
Π‘ΠΈΠ³ΡΡΠ½ΠΎΡΡ
- Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΎΠ½Π½ΠΈ Π΄Π°Π½Π½ΠΈ: Π‘ΠΈΠ³ΡΡΠ½ΠΎ Π±ΠΎΡΠ°Π²Π΅Π½Π΅ Ρ API ΠΊΠ»ΡΡΠΎΠ²Π΅ ΡΡΠ΅Π· IConfiguration
- ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ Π½Π° Π²Ρ
ΠΎΠ΄Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ: Π‘ΡΡΠΎΠ³Π° ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡ ΠΈ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ Ρ Π°Π½ΠΎΡΠ°ΡΠΈΠΈ Π·Π° Π΄Π°Π½Π½ΠΈ
- ΠΠΎΡΠΈΡΡΠ²Π°Π½Π΅ Π½Π° ΠΈΠ·Ρ
ΠΎΠ΄Π½ΠΈ Π΄Π°Π½Π½ΠΈ: Π‘ΠΈΠ³ΡΡΠ½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈΡΠ΅
- ΠΠΎΠ³Π²Π°Π½Π΅ Π·Π° ΠΎΠ΄ΠΈΡ: ΠΡΠ΅ΠΎΠ±Ρ
Π²Π°ΡΠ½ΠΎ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ
- ΠΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ: ΠΠ΅ Π±Π»ΠΎΠΊΠΈΡΠ°ΡΠΈ I/O ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
- Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠ» Π·Π° Π²ΡΡΠ·ΠΊΠΈ: ΠΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° HTTP ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ
- ΠΠ΅ΡΠΈΡΠ°Π½Π΅: ΠΠ΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ
- Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅ΡΡΡΡΠΈ: ΠΠΎΡΠ΅ΠΊΡΠ½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅ ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π·Π° ΠΏΠΎΡΠΈΡΡΠ²Π°Π½Π΅
ΠΠ°ΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΎΡΡ
- ΠΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ: ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π°Π³Π΅Π½ΡΠΈ
- ΠΡΠ» Π·Π° ΡΠ΅ΡΡΡΡΠΈ: ΠΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ΅ΡΡΡΡΠΈ
- Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ: ΠΠ³ΡΠ°Π½ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° ΡΠΊΠΎΡΠΎΡΡΡΠ° ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ» Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ
- ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³: ΠΠ΅ΡΡΠΈΠΊΠΈ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ ΠΈ Π·Π΄ΡΠ°Π²Π½ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ
π ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅
- Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°: ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ, ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π·Π° ΠΎΠΊΠΎΠ»Π½Π°ΡΠ° ΡΡΠ΅Π΄Π°
- Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡ Π·Π° Π»ΠΎΠ³Π²Π°Π½Π΅: Π‘ΡΡΡΠΊΡΡΡΠΈΡΠ°Π½ΠΎ Π»ΠΎΠ³Π²Π°Π½Π΅ Ρ ΠΊΠΎΡΠ΅Π»Π°ΡΠΈΠΎΠ½Π½ΠΈ ID
- ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π³ΡΠ΅ΡΠΊΠΈ: ΠΠ»ΠΎΠ±Π°Π»Π½ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Ρ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅
- ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³: Application insights ΠΈ Π±ΡΠΎΡΡΠΈ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ
- Π’Π΅ΡΡΠ²Π°Π½Π΅: ΠΠΎΠ΄ΡΠ»Π½ΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅, ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅ ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π·Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°ΡΠΎ ΡΠ΅ΡΡΠ²Π°Π½Π΅
ΠΠΎΡΠΎΠ²ΠΈ Π»ΠΈ ΡΡΠ΅ Π΄Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°ΡΠ΅ ΠΊΠΎΡΠΏΠΎΡΠ°ΡΠΈΠ²Π½ΠΈ ΠΈΠ½ΡΠ΅Π»ΠΈΠ³Π΅Π½ΡΠ½ΠΈ Π°Π³Π΅Π½ΡΠΈ Ρ .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-4.1-mini
# Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π²Π»Π΅Π·ΡΠ΅, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ AzureCliCredential Π΄Π° ΠΏΠΎΠ»ΡΡΠΈ ΡΠΎΠΊΠ΅Π½
az login
# PowerShell
$env:AZURE_OPENAI_ENDPOINT = "https://<your-resource>.openai.azure.com"
$env:AZURE_OPENAI_DEPLOYMENT = "gpt-4.1-mini"
# Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π²Π»Π΅Π·ΡΠ΅, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ AzureCliCredential Π΄Π° ΠΏΠΎΠ»ΡΡΠΈ ΡΠΎΠΊΠ΅Π½
az login
ΠΡΠΈΠΌΠ΅ΡΠ΅Π½ ΠΊΠΎΠ΄
ΠΠ° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΈΡ ΠΊΠΎΠ΄,
# zsh/bash
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-4.1-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. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΡΠ΅ ΡΡΡΠ΅ΠΌΠΈΠΌ ΠΊΡΠΌ ΡΠΎΡΠ½ΠΎΡΡ, ΠΌΠΎΠ»Ρ ΠΈΠΌΠ°ΠΉΡΠ΅ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°Π½ΠΈΡΠ΅ ΠΏΡΠ΅Π²ΠΎΠ΄ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΡΠ΄ΡΡΠΆΠ°Ρ Π³ΡΠ΅ΡΠΊΠΈ ΠΈΠ»ΠΈ Π½Π΅ΡΠΎΡΠ½ΠΎΡΡΠΈ. ΠΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ Π½Π° Π½Π΅Π³ΠΎΠ²ΠΈΡ ΡΠΎΠ΄Π΅Π½ Π΅Π·ΠΈΠΊ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΡΠΈΡΠ° Π·Π° Π°Π²ΡΠΎΡΠΈΡΠ΅ΡΠ΅Π½ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ. ΠΠ° ΠΊΡΠΈΡΠΈΡΠ½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΡΠ΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π° ΠΏΡΠΎΡΠ΅ΡΠΈΠΎΠ½Π°Π»Π΅Π½ ΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΏΡΠ΅Π²ΠΎΠ΄. ΠΠΈΠ΅ Π½Π΅ Π½ΠΎΡΠΈΠΌ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ½ΠΎΡΡ Π·Π° ΠΊΠ°ΠΊΠ²ΠΈΡΠΎ ΠΈ Π΄Π° Π΅ Π½Π΅Π΄ΠΎΡΠ°Π·ΡΠΌΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΈ ΡΡΠ»ΠΊΡΠ²Π°Π½ΠΈΡ, ΠΏΡΠΎΠΈΠ·ΡΠΈΡΠ°ΡΠΈ ΠΎΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΎΠ·ΠΈ ΠΏΡΠ΅Π²ΠΎΠ΄.