-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexample.py
More file actions
254 lines (206 loc) · 6.86 KB
/
example.py
File metadata and controls
254 lines (206 loc) · 6.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
"""
Plugin Architecture Pattern - Complete Example
Demonstrates:
- Creating production plugins with dependency injection
- Registering plugins with Semantic Kernel
- Invoking plugin functions
- Function composition
- Metrics and observability
Usage:
python example.py
"""
import asyncio
from compliance_plugin import (
CompliancePlugin,
CompliancePluginConfig,
PolicyDatabase,
EmailService
)
from base_plugin import PluginDependency
async def main():
print("=" * 60)
print("SEMANTIC KERNEL PLUGIN ARCHITECTURE PATTERN")
print("=" * 60)
print()
# Step 1: Set up dependencies
print("📦 Setting up dependencies...")
policy_db = PolicyDatabase()
email_service = EmailService()
# Optional: Use dependency injection container
container = PluginDependency()
container.register("policy_database", policy_db)
container.register("email_service", email_service)
print(" ✓ Policy database initialized")
print(" ✓ Email service initialized")
print()
# Step 2: Create plugin with configuration
print("🔌 Creating Compliance Plugin...")
config = CompliancePluginConfig(
plugin_name="Compliance",
enabled=True,
timeout_seconds=30,
email_notifications=True,
audit_logging=True
)
plugin = CompliancePlugin(
config=config,
policy_database=container.resolve("policy_database"),
email_service=container.resolve("email_service")
)
# Initialize plugin (load resources)
await plugin.initialize()
print(" ✓ Plugin initialized")
print()
# Step 3: Example 1 - Check Policy
print("=" * 60)
print("EXAMPLE 1: Check Policy")
print("=" * 60)
print()
query1 = "What is the refund policy?"
print(f"Query: {query1}")
print()
result1 = await plugin.check_policy(
query=query1,
user_id="analyst_001"
)
print(result1)
print()
# Step 4: Example 2 - Get Approval Requirements
print("=" * 60)
print("EXAMPLE 2: Get Approval Requirements")
print("=" * 60)
print()
print("Request: Expense approval for $2,500")
result2 = plugin.get_approval_requirements(
request_type="expense",
amount="$2,500"
)
print(result2)
print()
# Step 5: Example 3 - Submit Approval Request
print("=" * 60)
print("EXAMPLE 3: Submit Approval Request")
print("=" * 60)
print()
result3 = await plugin.submit_approval_request(
request_type="expense",
amount="$2500",
user_id="manager_001",
justification="Travel expenses for client meeting in New York"
)
print(result3)
print()
# Step 6: Example 4 - Composite Function
print("=" * 60)
print("EXAMPLE 4: Composite Function (Validate + Submit)")
print("=" * 60)
print()
result4 = await plugin.validate_and_notify(
request_type="expense",
amount="$450",
user_id="employee_001"
)
print(result4)
print()
# Step 7: Show Plugin Metrics
print("=" * 60)
print("PLUGIN METRICS")
print("=" * 60)
print()
metrics = plugin.get_metrics_summary()
print(f"Plugin Name: {metrics['plugin_name']}")
print(f"Total Calls: {metrics['total_calls']}")
print(f"Successful: {metrics['successful_calls']}")
print(f"Failed: {metrics['failed_calls']}")
print(f"Success Rate: {metrics['success_rate']:.1%}")
print(f"Avg Execution Time: {metrics['avg_execution_time_ms']:.2f}ms")
print(f"Max Execution Time: {metrics['max_execution_time_ms']:.2f}ms")
print(f"Min Execution Time: {metrics['min_execution_time_ms']:.2f}ms")
print()
# Step 8: Cleanup
print("🧹 Cleaning up plugin resources...")
await plugin.cleanup()
print(" ✓ Cleanup complete")
print()
# Summary
print("=" * 60)
print("PRODUCTION BENEFITS")
print("=" * 60)
print()
print("✓ Dependency Injection: Easy testing and mocking")
print("✓ Input Validation: Pydantic models prevent errors")
print("✓ Metrics Tracking: Automatic performance monitoring")
print("✓ Error Handling: Structured exception handling")
print("✓ Lifecycle Management: Proper resource initialization/cleanup")
print("✓ Observability: Built-in logging for debugging")
print("✓ Composability: Functions can call other functions")
print()
async def example_with_semantic_kernel():
"""
Example showing integration with actual Semantic Kernel
NOTE: Requires Azure OpenAI configuration in .env file
"""
print("=" * 60)
print("INTEGRATION WITH SEMANTIC KERNEL")
print("=" * 60)
print()
try:
import os
from semantic_kernel import Kernel
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
# Check if configured
if not os.getenv("AZURE_OPENAI_ENDPOINT"):
print("⚠️ Azure OpenAI not configured. Skipping SK integration example.")
print(" Configure in .env file to run this example.")
return
# Create Semantic Kernel
kernel = Kernel()
# Add Azure OpenAI service
kernel.add_service(
AzureChatCompletion(
service_id="azure_openai",
deployment_name=os.getenv("AZURE_OPENAI_DEPLOYMENT", "gpt-4o"),
endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
api_key=os.getenv("AZURE_OPENAI_KEY")
)
)
# Create and register plugin
policy_db = PolicyDatabase()
email_service = EmailService()
config = CompliancePluginConfig(plugin_name="Compliance")
plugin = CompliancePlugin(config, policy_db, email_service)
await plugin.initialize()
kernel.add_plugin(
plugin=plugin,
plugin_name="CompliancePlugin"
)
print("✓ Semantic Kernel configured")
print("✓ CompliancePlugin registered")
print()
# Invoke function via Semantic Kernel
print("Invoking check_policy via Semantic Kernel...")
check_policy_func = kernel.get_function(
plugin_name="CompliancePlugin",
function_name="check_policy"
)
result = await kernel.invoke(
function=check_policy_func,
query="What are the expense approval thresholds?",
user_id="sk_user_001"
)
print(f"Result: {result}")
print()
# Cleanup
await plugin.cleanup()
except ImportError:
print("⚠️ Semantic Kernel not installed. Install with:")
print(" pip install semantic-kernel azure-identity")
print()
except Exception as e:
print(f"❌ Error: {e}")
print()
if __name__ == "__main__":
# Run standalone example
asyncio.run(main())
# Run Semantic Kernel integration example
asyncio.run(example_with_semantic_kernel())