hexdag 0.5.0.dev1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. hexdag/__init__.py +116 -0
  2. hexdag/__main__.py +30 -0
  3. hexdag/adapters/executors/__init__.py +5 -0
  4. hexdag/adapters/executors/local_executor.py +316 -0
  5. hexdag/builtin/__init__.py +6 -0
  6. hexdag/builtin/adapters/__init__.py +51 -0
  7. hexdag/builtin/adapters/anthropic/__init__.py +5 -0
  8. hexdag/builtin/adapters/anthropic/anthropic_adapter.py +151 -0
  9. hexdag/builtin/adapters/database/__init__.py +6 -0
  10. hexdag/builtin/adapters/database/csv/csv_adapter.py +249 -0
  11. hexdag/builtin/adapters/database/pgvector/__init__.py +5 -0
  12. hexdag/builtin/adapters/database/pgvector/pgvector_adapter.py +478 -0
  13. hexdag/builtin/adapters/database/sqlalchemy/sqlalchemy_adapter.py +252 -0
  14. hexdag/builtin/adapters/database/sqlite/__init__.py +5 -0
  15. hexdag/builtin/adapters/database/sqlite/sqlite_adapter.py +410 -0
  16. hexdag/builtin/adapters/local/README.md +59 -0
  17. hexdag/builtin/adapters/local/__init__.py +7 -0
  18. hexdag/builtin/adapters/local/local_observer_manager.py +696 -0
  19. hexdag/builtin/adapters/memory/__init__.py +47 -0
  20. hexdag/builtin/adapters/memory/file_memory_adapter.py +297 -0
  21. hexdag/builtin/adapters/memory/in_memory_memory.py +216 -0
  22. hexdag/builtin/adapters/memory/schemas.py +57 -0
  23. hexdag/builtin/adapters/memory/session_memory.py +178 -0
  24. hexdag/builtin/adapters/memory/sqlite_memory_adapter.py +215 -0
  25. hexdag/builtin/adapters/memory/state_memory.py +280 -0
  26. hexdag/builtin/adapters/mock/README.md +89 -0
  27. hexdag/builtin/adapters/mock/__init__.py +15 -0
  28. hexdag/builtin/adapters/mock/hexdag.toml +50 -0
  29. hexdag/builtin/adapters/mock/mock_database.py +225 -0
  30. hexdag/builtin/adapters/mock/mock_embedding.py +223 -0
  31. hexdag/builtin/adapters/mock/mock_llm.py +177 -0
  32. hexdag/builtin/adapters/mock/mock_tool_adapter.py +192 -0
  33. hexdag/builtin/adapters/mock/mock_tool_router.py +232 -0
  34. hexdag/builtin/adapters/openai/__init__.py +5 -0
  35. hexdag/builtin/adapters/openai/openai_adapter.py +634 -0
  36. hexdag/builtin/adapters/secret/__init__.py +7 -0
  37. hexdag/builtin/adapters/secret/local_secret_adapter.py +248 -0
  38. hexdag/builtin/adapters/unified_tool_router.py +280 -0
  39. hexdag/builtin/macros/__init__.py +17 -0
  40. hexdag/builtin/macros/conversation_agent.py +390 -0
  41. hexdag/builtin/macros/llm_macro.py +151 -0
  42. hexdag/builtin/macros/reasoning_agent.py +423 -0
  43. hexdag/builtin/macros/tool_macro.py +380 -0
  44. hexdag/builtin/nodes/__init__.py +38 -0
  45. hexdag/builtin/nodes/_discovery.py +123 -0
  46. hexdag/builtin/nodes/agent_node.py +696 -0
  47. hexdag/builtin/nodes/base_node_factory.py +242 -0
  48. hexdag/builtin/nodes/composite_node.py +926 -0
  49. hexdag/builtin/nodes/data_node.py +201 -0
  50. hexdag/builtin/nodes/expression_node.py +487 -0
  51. hexdag/builtin/nodes/function_node.py +454 -0
  52. hexdag/builtin/nodes/llm_node.py +491 -0
  53. hexdag/builtin/nodes/loop_node.py +920 -0
  54. hexdag/builtin/nodes/mapped_input.py +518 -0
  55. hexdag/builtin/nodes/port_call_node.py +269 -0
  56. hexdag/builtin/nodes/tool_call_node.py +195 -0
  57. hexdag/builtin/nodes/tool_utils.py +390 -0
  58. hexdag/builtin/prompts/__init__.py +68 -0
  59. hexdag/builtin/prompts/base.py +422 -0
  60. hexdag/builtin/prompts/chat_prompts.py +303 -0
  61. hexdag/builtin/prompts/error_correction_prompts.py +320 -0
  62. hexdag/builtin/prompts/tool_prompts.py +160 -0
  63. hexdag/builtin/tools/builtin_tools.py +84 -0
  64. hexdag/builtin/tools/database_tools.py +164 -0
  65. hexdag/cli/__init__.py +17 -0
  66. hexdag/cli/__main__.py +7 -0
  67. hexdag/cli/commands/__init__.py +27 -0
  68. hexdag/cli/commands/build_cmd.py +812 -0
  69. hexdag/cli/commands/create_cmd.py +208 -0
  70. hexdag/cli/commands/docs_cmd.py +293 -0
  71. hexdag/cli/commands/generate_types_cmd.py +252 -0
  72. hexdag/cli/commands/init_cmd.py +188 -0
  73. hexdag/cli/commands/pipeline_cmd.py +494 -0
  74. hexdag/cli/commands/plugin_dev_cmd.py +529 -0
  75. hexdag/cli/commands/plugins_cmd.py +441 -0
  76. hexdag/cli/commands/studio_cmd.py +101 -0
  77. hexdag/cli/commands/validate_cmd.py +221 -0
  78. hexdag/cli/main.py +84 -0
  79. hexdag/core/__init__.py +83 -0
  80. hexdag/core/config/__init__.py +20 -0
  81. hexdag/core/config/loader.py +479 -0
  82. hexdag/core/config/models.py +150 -0
  83. hexdag/core/configurable.py +294 -0
  84. hexdag/core/context/__init__.py +37 -0
  85. hexdag/core/context/execution_context.py +378 -0
  86. hexdag/core/docs/__init__.py +26 -0
  87. hexdag/core/docs/extractors.py +678 -0
  88. hexdag/core/docs/generators.py +890 -0
  89. hexdag/core/docs/models.py +120 -0
  90. hexdag/core/domain/__init__.py +10 -0
  91. hexdag/core/domain/dag.py +1225 -0
  92. hexdag/core/exceptions.py +234 -0
  93. hexdag/core/expression_parser.py +569 -0
  94. hexdag/core/logging.py +449 -0
  95. hexdag/core/models/__init__.py +17 -0
  96. hexdag/core/models/base.py +138 -0
  97. hexdag/core/orchestration/__init__.py +46 -0
  98. hexdag/core/orchestration/body_executor.py +481 -0
  99. hexdag/core/orchestration/components/__init__.py +97 -0
  100. hexdag/core/orchestration/components/adapter_lifecycle_manager.py +113 -0
  101. hexdag/core/orchestration/components/checkpoint_manager.py +134 -0
  102. hexdag/core/orchestration/components/execution_coordinator.py +360 -0
  103. hexdag/core/orchestration/components/health_check_manager.py +176 -0
  104. hexdag/core/orchestration/components/input_mapper.py +143 -0
  105. hexdag/core/orchestration/components/lifecycle_manager.py +583 -0
  106. hexdag/core/orchestration/components/node_executor.py +377 -0
  107. hexdag/core/orchestration/components/secret_manager.py +202 -0
  108. hexdag/core/orchestration/components/wave_executor.py +158 -0
  109. hexdag/core/orchestration/constants.py +17 -0
  110. hexdag/core/orchestration/events/README.md +312 -0
  111. hexdag/core/orchestration/events/__init__.py +104 -0
  112. hexdag/core/orchestration/events/batching.py +330 -0
  113. hexdag/core/orchestration/events/decorators.py +139 -0
  114. hexdag/core/orchestration/events/events.py +573 -0
  115. hexdag/core/orchestration/events/observers/__init__.py +30 -0
  116. hexdag/core/orchestration/events/observers/core_observers.py +690 -0
  117. hexdag/core/orchestration/events/observers/models.py +111 -0
  118. hexdag/core/orchestration/events/taxonomy.py +269 -0
  119. hexdag/core/orchestration/hook_context.py +237 -0
  120. hexdag/core/orchestration/hooks.py +437 -0
  121. hexdag/core/orchestration/models.py +418 -0
  122. hexdag/core/orchestration/orchestrator.py +910 -0
  123. hexdag/core/orchestration/orchestrator_factory.py +275 -0
  124. hexdag/core/orchestration/port_wrappers.py +327 -0
  125. hexdag/core/orchestration/prompt/__init__.py +32 -0
  126. hexdag/core/orchestration/prompt/template.py +332 -0
  127. hexdag/core/pipeline_builder/__init__.py +21 -0
  128. hexdag/core/pipeline_builder/component_instantiator.py +386 -0
  129. hexdag/core/pipeline_builder/include_tag.py +265 -0
  130. hexdag/core/pipeline_builder/pipeline_config.py +133 -0
  131. hexdag/core/pipeline_builder/py_tag.py +223 -0
  132. hexdag/core/pipeline_builder/tag_discovery.py +268 -0
  133. hexdag/core/pipeline_builder/yaml_builder.py +1196 -0
  134. hexdag/core/pipeline_builder/yaml_validator.py +569 -0
  135. hexdag/core/ports/__init__.py +65 -0
  136. hexdag/core/ports/api_call.py +133 -0
  137. hexdag/core/ports/database.py +489 -0
  138. hexdag/core/ports/embedding.py +215 -0
  139. hexdag/core/ports/executor.py +237 -0
  140. hexdag/core/ports/file_storage.py +117 -0
  141. hexdag/core/ports/healthcheck.py +87 -0
  142. hexdag/core/ports/llm.py +551 -0
  143. hexdag/core/ports/memory.py +70 -0
  144. hexdag/core/ports/observer_manager.py +130 -0
  145. hexdag/core/ports/secret.py +145 -0
  146. hexdag/core/ports/tool_router.py +94 -0
  147. hexdag/core/ports_builder.py +623 -0
  148. hexdag/core/protocols.py +273 -0
  149. hexdag/core/resolver.py +304 -0
  150. hexdag/core/schema/__init__.py +9 -0
  151. hexdag/core/schema/generator.py +742 -0
  152. hexdag/core/secrets.py +242 -0
  153. hexdag/core/types.py +413 -0
  154. hexdag/core/utils/async_warnings.py +206 -0
  155. hexdag/core/utils/schema_conversion.py +78 -0
  156. hexdag/core/utils/sql_validation.py +86 -0
  157. hexdag/core/validation/secure_json.py +148 -0
  158. hexdag/core/yaml_macro.py +517 -0
  159. hexdag/mcp_server.py +3120 -0
  160. hexdag/studio/__init__.py +10 -0
  161. hexdag/studio/build_ui.py +92 -0
  162. hexdag/studio/server/__init__.py +1 -0
  163. hexdag/studio/server/main.py +100 -0
  164. hexdag/studio/server/routes/__init__.py +9 -0
  165. hexdag/studio/server/routes/execute.py +208 -0
  166. hexdag/studio/server/routes/export.py +558 -0
  167. hexdag/studio/server/routes/files.py +207 -0
  168. hexdag/studio/server/routes/plugins.py +419 -0
  169. hexdag/studio/server/routes/validate.py +220 -0
  170. hexdag/studio/ui/index.html +13 -0
  171. hexdag/studio/ui/package-lock.json +2992 -0
  172. hexdag/studio/ui/package.json +31 -0
  173. hexdag/studio/ui/postcss.config.js +6 -0
  174. hexdag/studio/ui/public/hexdag.svg +5 -0
  175. hexdag/studio/ui/src/App.tsx +251 -0
  176. hexdag/studio/ui/src/components/Canvas.tsx +408 -0
  177. hexdag/studio/ui/src/components/ContextMenu.tsx +187 -0
  178. hexdag/studio/ui/src/components/FileBrowser.tsx +123 -0
  179. hexdag/studio/ui/src/components/Header.tsx +181 -0
  180. hexdag/studio/ui/src/components/HexdagNode.tsx +193 -0
  181. hexdag/studio/ui/src/components/NodeInspector.tsx +512 -0
  182. hexdag/studio/ui/src/components/NodePalette.tsx +262 -0
  183. hexdag/studio/ui/src/components/NodePortsSection.tsx +403 -0
  184. hexdag/studio/ui/src/components/PluginManager.tsx +347 -0
  185. hexdag/studio/ui/src/components/PortsEditor.tsx +481 -0
  186. hexdag/studio/ui/src/components/PythonEditor.tsx +195 -0
  187. hexdag/studio/ui/src/components/ValidationPanel.tsx +105 -0
  188. hexdag/studio/ui/src/components/YamlEditor.tsx +196 -0
  189. hexdag/studio/ui/src/components/index.ts +8 -0
  190. hexdag/studio/ui/src/index.css +92 -0
  191. hexdag/studio/ui/src/main.tsx +10 -0
  192. hexdag/studio/ui/src/types/index.ts +123 -0
  193. hexdag/studio/ui/src/vite-env.d.ts +1 -0
  194. hexdag/studio/ui/tailwind.config.js +29 -0
  195. hexdag/studio/ui/tsconfig.json +37 -0
  196. hexdag/studio/ui/tsconfig.node.json +13 -0
  197. hexdag/studio/ui/vite.config.ts +35 -0
  198. hexdag/visualization/__init__.py +69 -0
  199. hexdag/visualization/dag_visualizer.py +1020 -0
  200. hexdag-0.5.0.dev1.dist-info/METADATA +369 -0
  201. hexdag-0.5.0.dev1.dist-info/RECORD +261 -0
  202. hexdag-0.5.0.dev1.dist-info/WHEEL +4 -0
  203. hexdag-0.5.0.dev1.dist-info/entry_points.txt +4 -0
  204. hexdag-0.5.0.dev1.dist-info/licenses/LICENSE +190 -0
  205. hexdag_plugins/.gitignore +43 -0
  206. hexdag_plugins/README.md +73 -0
  207. hexdag_plugins/__init__.py +1 -0
  208. hexdag_plugins/azure/LICENSE +21 -0
  209. hexdag_plugins/azure/README.md +414 -0
  210. hexdag_plugins/azure/__init__.py +21 -0
  211. hexdag_plugins/azure/azure_blob_adapter.py +450 -0
  212. hexdag_plugins/azure/azure_cosmos_adapter.py +383 -0
  213. hexdag_plugins/azure/azure_keyvault_adapter.py +314 -0
  214. hexdag_plugins/azure/azure_openai_adapter.py +415 -0
  215. hexdag_plugins/azure/pyproject.toml +107 -0
  216. hexdag_plugins/azure/tests/__init__.py +1 -0
  217. hexdag_plugins/azure/tests/test_azure_blob_adapter.py +350 -0
  218. hexdag_plugins/azure/tests/test_azure_cosmos_adapter.py +323 -0
  219. hexdag_plugins/azure/tests/test_azure_keyvault_adapter.py +330 -0
  220. hexdag_plugins/azure/tests/test_azure_openai_adapter.py +329 -0
  221. hexdag_plugins/hexdag_etl/README.md +168 -0
  222. hexdag_plugins/hexdag_etl/__init__.py +53 -0
  223. hexdag_plugins/hexdag_etl/examples/01_simple_pandas_transform.py +270 -0
  224. hexdag_plugins/hexdag_etl/examples/02_simple_pandas_only.py +149 -0
  225. hexdag_plugins/hexdag_etl/examples/03_file_io_pipeline.py +109 -0
  226. hexdag_plugins/hexdag_etl/examples/test_pandas_transform.py +84 -0
  227. hexdag_plugins/hexdag_etl/hexdag.toml +25 -0
  228. hexdag_plugins/hexdag_etl/hexdag_etl/__init__.py +48 -0
  229. hexdag_plugins/hexdag_etl/hexdag_etl/nodes/__init__.py +13 -0
  230. hexdag_plugins/hexdag_etl/hexdag_etl/nodes/api_extract.py +230 -0
  231. hexdag_plugins/hexdag_etl/hexdag_etl/nodes/base_node_factory.py +181 -0
  232. hexdag_plugins/hexdag_etl/hexdag_etl/nodes/file_io.py +415 -0
  233. hexdag_plugins/hexdag_etl/hexdag_etl/nodes/outlook.py +492 -0
  234. hexdag_plugins/hexdag_etl/hexdag_etl/nodes/pandas_transform.py +563 -0
  235. hexdag_plugins/hexdag_etl/hexdag_etl/nodes/sql_extract_load.py +112 -0
  236. hexdag_plugins/hexdag_etl/pyproject.toml +82 -0
  237. hexdag_plugins/hexdag_etl/test_transform.py +54 -0
  238. hexdag_plugins/hexdag_etl/tests/test_plugin_integration.py +62 -0
  239. hexdag_plugins/mysql_adapter/LICENSE +21 -0
  240. hexdag_plugins/mysql_adapter/README.md +224 -0
  241. hexdag_plugins/mysql_adapter/__init__.py +6 -0
  242. hexdag_plugins/mysql_adapter/mysql_adapter.py +408 -0
  243. hexdag_plugins/mysql_adapter/pyproject.toml +93 -0
  244. hexdag_plugins/mysql_adapter/tests/test_mysql_adapter.py +259 -0
  245. hexdag_plugins/storage/README.md +184 -0
  246. hexdag_plugins/storage/__init__.py +19 -0
  247. hexdag_plugins/storage/file/__init__.py +5 -0
  248. hexdag_plugins/storage/file/local.py +325 -0
  249. hexdag_plugins/storage/ports/__init__.py +5 -0
  250. hexdag_plugins/storage/ports/vector_store.py +236 -0
  251. hexdag_plugins/storage/sql/__init__.py +7 -0
  252. hexdag_plugins/storage/sql/base.py +187 -0
  253. hexdag_plugins/storage/sql/mysql.py +27 -0
  254. hexdag_plugins/storage/sql/postgresql.py +27 -0
  255. hexdag_plugins/storage/tests/__init__.py +1 -0
  256. hexdag_plugins/storage/tests/test_local_file_storage.py +161 -0
  257. hexdag_plugins/storage/tests/test_sql_adapters.py +212 -0
  258. hexdag_plugins/storage/vector/__init__.py +7 -0
  259. hexdag_plugins/storage/vector/chromadb.py +223 -0
  260. hexdag_plugins/storage/vector/in_memory.py +285 -0
  261. hexdag_plugins/storage/vector/pgvector.py +502 -0
@@ -0,0 +1,414 @@
1
+ # hexdag-azure
2
+
3
+ Azure OpenAI adapter plugin for the hexDAG framework.
4
+
5
+ ## Overview
6
+
7
+ This plugin provides production-ready Azure OpenAI integration for hexDAG pipelines, supporting:
8
+
9
+ - **Azure-hosted OpenAI endpoints** with deployment-based model access
10
+ - **GPT-4, GPT-3.5-turbo, and fine-tuned models**
11
+ - **Native tool calling** support for agent workflows
12
+ - **Automatic secret resolution** from environment variables
13
+ - **Health checks** for connectivity monitoring
14
+ - **YAML-first configuration** for declarative pipelines
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ # Install from source (development)
20
+ cd hexdag_plugins/azure
21
+ uv pip install -e .
22
+
23
+ # Or install from PyPI (when published)
24
+ pip install hexdag-azure
25
+ ```
26
+
27
+ ## Quick Start
28
+
29
+ ### Environment Setup
30
+
31
+ Set your Azure OpenAI credentials:
32
+
33
+ ```bash
34
+ export AZURE_OPENAI_API_KEY="your-api-key"
35
+ ```
36
+
37
+ ### YAML Pipeline
38
+
39
+ ```yaml
40
+ apiVersion: hexdag/v1
41
+ kind: Pipeline
42
+ metadata:
43
+ name: azure-analysis-pipeline
44
+ spec:
45
+ nodes:
46
+ - kind: llm_node
47
+ metadata:
48
+ name: azure_analyzer
49
+ spec:
50
+ adapter:
51
+ type: azure_openai
52
+ params:
53
+ resource_name: "my-openai-eastus"
54
+ deployment_id: "gpt-4"
55
+ api_version: "2024-02-15-preview"
56
+ temperature: 0.7
57
+ prompt_template: "Analyze the following data: {{input}}"
58
+ dependencies: []
59
+ ```
60
+
61
+ ### Python API
62
+
63
+ ```python
64
+ from hexdag_plugins.azure import AzureOpenAIAdapter
65
+ from hexdag.core.ports.llm import Message
66
+
67
+ # Create adapter (API key auto-resolved from AZURE_OPENAI_API_KEY)
68
+ adapter = AzureOpenAIAdapter(
69
+ resource_name="my-openai-eastus",
70
+ deployment_id="gpt-4",
71
+ api_version="2024-02-15-preview",
72
+ temperature=0.7,
73
+ )
74
+
75
+ # Generate response
76
+ messages = [Message(role="user", content="Hello, Azure!")]
77
+ response = await adapter.aresponse(messages)
78
+ print(response)
79
+ ```
80
+
81
+ ## Configuration
82
+
83
+ ### Required Parameters
84
+
85
+ | Parameter | Type | Description | Example |
86
+ |-----------|------|-------------|---------|
87
+ | `resource_name` | str | Azure OpenAI resource name | `"my-openai-eastus"` |
88
+ | `deployment_id` | str | Azure deployment name | `"gpt-4"` or `"gpt-35-turbo"` |
89
+ | `api_key` | str | Azure OpenAI API key | Auto-resolved from `AZURE_OPENAI_API_KEY` |
90
+
91
+ ### Optional Parameters
92
+
93
+ | Parameter | Type | Default | Description |
94
+ |-----------|------|---------|-------------|
95
+ | `api_version` | str | `"2024-02-15-preview"` | Azure OpenAI API version |
96
+ | `temperature` | float | `0.7` | Sampling temperature (0.0-2.0) |
97
+ | `max_tokens` | int | `None` | Maximum tokens in response |
98
+ | `timeout` | float | `30.0` | Request timeout in seconds |
99
+ | `embedding_deployment_id` | str | `None` | Azure deployment for embeddings (e.g., `"text-embedding-3-small"`) |
100
+ | `embedding_dimensions` | int | `None` | Embedding dimensionality (for text-embedding-3 models) |
101
+
102
+ ## Features
103
+
104
+ ### Unified LLM + Embedding Adapter
105
+
106
+ Azure OpenAI adapter implements both text generation and embedding capabilities in a single unified interface:
107
+
108
+ ```python
109
+ # Single adapter for both LLM and embeddings
110
+ adapter = AzureOpenAIAdapter(
111
+ resource_name="my-openai-eastus",
112
+ deployment_id="gpt-4", # For text generation
113
+ embedding_deployment_id="text-embedding-3-small", # For embeddings
114
+ embedding_dimensions=1536,
115
+ )
116
+
117
+ # Use for text generation
118
+ response = await adapter.aresponse(messages)
119
+
120
+ # Use for embeddings
121
+ embedding = await adapter.aembed("Hello, world!")
122
+ embeddings = await adapter.aembed_batch(["Text 1", "Text 2", "Text 3"])
123
+ ```
124
+
125
+ This unified approach simplifies API key management and resource configuration when using multiple Azure OpenAI capabilities.
126
+
127
+ ### Tool Calling Support
128
+
129
+ Azure OpenAI adapter supports native tool/function calling:
130
+
131
+ ```yaml
132
+ nodes:
133
+ - kind: agent_node
134
+ metadata:
135
+ name: azure_agent
136
+ spec:
137
+ llm_adapter:
138
+ type: azure_openai
139
+ params:
140
+ resource_name: "my-openai-eastus"
141
+ deployment_id: "gpt-4"
142
+ tools:
143
+ - name: search
144
+ description: "Search the web"
145
+ ```
146
+
147
+ ### Health Checks
148
+
149
+ Monitor Azure OpenAI connectivity:
150
+
151
+ ```python
152
+ status = await adapter.ahealth_check()
153
+ print(f"Status: {status.status}")
154
+ print(f"Latency: {status.latency_ms}ms")
155
+ print(f"Details: {status.details}")
156
+ ```
157
+
158
+ ### Fine-Tuned Models
159
+
160
+ Use your fine-tuned Azure OpenAI deployments:
161
+
162
+ ```yaml
163
+ adapter:
164
+ type: azure_openai
165
+ params:
166
+ resource_name: "my-openai-eastus"
167
+ deployment_id: "my-finetuned-gpt-35-turbo" # Your custom deployment
168
+ api_version: "2024-02-15-preview"
169
+ ```
170
+
171
+ ## Examples
172
+
173
+ ### Customer Support Agent
174
+
175
+ ```yaml
176
+ apiVersion: hexdag/v1
177
+ kind: Pipeline
178
+ metadata:
179
+ name: azure-support-agent
180
+ spec:
181
+ nodes:
182
+ - kind: agent_node
183
+ metadata:
184
+ name: support_agent
185
+ spec:
186
+ llm_adapter:
187
+ type: azure_openai
188
+ params:
189
+ resource_name: "support-openai"
190
+ deployment_id: "gpt-4"
191
+ temperature: 0.5
192
+ initial_prompt_template: |
193
+ You are a customer support agent.
194
+ Customer query: {{customer_query}}
195
+ max_steps: 10
196
+ tools:
197
+ - name: lookup_order
198
+ - name: process_refund
199
+ dependencies: []
200
+ ```
201
+
202
+ ### Multi-Step Analysis with Embeddings
203
+
204
+ ```yaml
205
+ apiVersion: hexdag/v1
206
+ kind: Pipeline
207
+ metadata:
208
+ name: azure-analysis-workflow
209
+ spec:
210
+ nodes:
211
+ # Text generation node
212
+ - kind: llm_node
213
+ metadata:
214
+ name: extract_entities
215
+ spec:
216
+ adapter:
217
+ type: azure_openai
218
+ params:
219
+ resource_name: "analytics-openai"
220
+ deployment_id: "gpt-35-turbo"
221
+ prompt_template: "Extract entities from: {{input}}"
222
+ dependencies: []
223
+
224
+ # Embedding generation (using same adapter)
225
+ - kind: function_node
226
+ metadata:
227
+ name: generate_embeddings
228
+ spec:
229
+ fn: "myapp.utils.embed_text" # Uses same Azure adapter
230
+ adapter:
231
+ type: azure_openai
232
+ params:
233
+ resource_name: "analytics-openai"
234
+ embedding_deployment_id: "text-embedding-3-small"
235
+ embedding_dimensions: 1536
236
+ dependencies: [extract_entities]
237
+
238
+ - kind: llm_node
239
+ metadata:
240
+ name: summarize
241
+ spec:
242
+ adapter:
243
+ type: azure_openai
244
+ params:
245
+ resource_name: "analytics-openai"
246
+ deployment_id: "gpt-4"
247
+ prompt_template: "Summarize entities: {{extract_entities.result}}"
248
+ dependencies: [extract_entities]
249
+ ```
250
+
251
+ ## Error Handling
252
+
253
+ The adapter handles common Azure OpenAI errors gracefully:
254
+
255
+ - **Authentication failures** - Returns `None` with logged error
256
+ - **Rate limiting** - Built-in timeout and retry support
257
+ - **Network issues** - Configurable timeout (default 30s)
258
+ - **Invalid deployments** - Clear error messages
259
+
260
+ ## Testing
261
+
262
+ Run tests with pytest:
263
+
264
+ ```bash
265
+ cd hexdag_plugins/azure
266
+ uv run pytest tests/ -v
267
+ ```
268
+
269
+ ## Azure OpenAI Setup
270
+
271
+ ### 1. Create Azure OpenAI Resource
272
+
273
+ ```bash
274
+ # Using Azure CLI
275
+ az cognitiveservices account create \
276
+ --name my-openai-eastus \
277
+ --resource-group my-resource-group \
278
+ --kind OpenAI \
279
+ --sku S0 \
280
+ --location eastus
281
+ ```
282
+
283
+ ### 2. Deploy a Model
284
+
285
+ ```bash
286
+ az cognitiveservices account deployment create \
287
+ --name my-openai-eastus \
288
+ --resource-group my-resource-group \
289
+ --deployment-name gpt-4 \
290
+ --model-name gpt-4 \
291
+ --model-version "0613" \
292
+ --model-format OpenAI \
293
+ --sku-name "Standard" \
294
+ --sku-capacity 1
295
+ ```
296
+
297
+ ### 3. Get API Key
298
+
299
+ ```bash
300
+ az cognitiveservices account keys list \
301
+ --name my-openai-eastus \
302
+ --resource-group my-resource-group
303
+ ```
304
+
305
+ ## Embedding Support
306
+
307
+ Generate embeddings using Azure OpenAI's text-embedding models. The adapter supports both unified (LLM + embeddings) and pure embedding use cases.
308
+
309
+ ### Unified LLM + Embeddings
310
+
311
+ ```python
312
+ from hexdag_plugins.azure import AzureOpenAIAdapter
313
+
314
+ # Single adapter for both capabilities
315
+ adapter = AzureOpenAIAdapter(
316
+ resource_name="my-openai-eastus",
317
+ deployment_id="gpt-4", # For text generation
318
+ embedding_deployment_id="text-embedding-3-small", # For embeddings
319
+ embedding_dimensions=1536, # Optional: reduce dimensions
320
+ )
321
+
322
+ # Text generation
323
+ response = await adapter.aresponse(messages)
324
+
325
+ # Embeddings
326
+ embedding = await adapter.aembed("Hello, world!")
327
+ embeddings = await adapter.aembed_batch(["Doc 1", "Doc 2", "Doc 3"])
328
+ ```
329
+
330
+ ### Pure Embedding Adapter
331
+
332
+ For embedding-only use cases:
333
+
334
+ ```python
335
+ # deployment_id still required by LLM protocol, but won't be used
336
+ adapter = AzureOpenAIAdapter(
337
+ resource_name="my-openai-eastus",
338
+ deployment_id="gpt-4", # Required but not used
339
+ embedding_deployment_id="text-embedding-3-small",
340
+ )
341
+
342
+ # Only use embedding methods
343
+ embedding = await adapter.aembed("Document text")
344
+ embeddings = await adapter.aembed_batch(documents)
345
+ ```
346
+
347
+ ### YAML Configuration
348
+
349
+ ```yaml
350
+ adapter:
351
+ type: azure_openai
352
+ params:
353
+ resource_name: "my-openai-eastus"
354
+ embedding_deployment_id: "text-embedding-3-small"
355
+ embedding_dimensions: 1536
356
+ ```
357
+
358
+ ### Supported Embedding Models
359
+
360
+ | Model | Dimensions | Description |
361
+ |-------|-----------|-------------|
362
+ | `text-embedding-3-small` | 1536 (default) | Cost-effective, high performance |
363
+ | `text-embedding-3-large` | 3072 (default) | Highest quality embeddings |
364
+ | `text-embedding-ada-002` | 1536 | Legacy model, still supported |
365
+
366
+ **Note:** Image embeddings are not currently supported by Azure OpenAI's embeddings API. For multimodal use cases, consider using vision models with `aresponse_with_vision()`.
367
+
368
+ ## Supported Models
369
+
370
+ ### Text Generation Models
371
+
372
+ - **GPT-4** - Most capable model (all versions)
373
+ - **GPT-3.5-turbo** - Fast and cost-effective (all versions)
374
+ - **Fine-tuned models** - Your custom trained models
375
+ - **Future models** - Compatible with new Azure OpenAI releases
376
+
377
+ ### Embedding Models
378
+
379
+ - **text-embedding-3-small** - 1536 dimensions, cost-effective
380
+ - **text-embedding-3-large** - 3072 dimensions, highest quality
381
+ - **text-embedding-ada-002** - 1536 dimensions, legacy support
382
+
383
+ ## API Version Support
384
+
385
+ | API Version | Status | Features |
386
+ |-------------|--------|----------|
387
+ | `2024-02-15-preview` | ✅ Recommended | Latest features + tool calling |
388
+ | `2023-12-01-preview` | ✅ Supported | Stable with tool calling |
389
+ | `2023-05-15` | ✅ Supported | Stable without tool calling |
390
+
391
+ ## Contributing
392
+
393
+ Contributions welcome! Please:
394
+
395
+ 1. Fork the repository
396
+ 2. Create a feature branch
397
+ 3. Add tests for new functionality
398
+ 4. Submit a pull request
399
+
400
+ ## License
401
+
402
+ MIT License - See LICENSE file for details
403
+
404
+ ## Support
405
+
406
+ - **Documentation**: https://hexdag.ai/docs/plugins/azure
407
+ - **Issues**: https://github.com/hexdag/hexdag-azure/issues
408
+ - **Discussions**: https://github.com/hexdag/hexdag/discussions
409
+
410
+ ## Related
411
+
412
+ - [hexdag](https://github.com/hexdag/hexdag) - Core framework
413
+ - [Azure OpenAI Documentation](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/)
414
+ - [OpenAI Python SDK](https://github.com/openai/openai-python)
@@ -0,0 +1,21 @@
1
+ """Azure plugin for hexDAG framework.
2
+
3
+ Provides adapters for Azure services:
4
+ - AzureOpenAIAdapter: Azure OpenAI for LLM operations
5
+ - AzureKeyVaultAdapter: Azure Key Vault for secret management
6
+ - AzureCosmosAdapter: Azure Cosmos DB for memory/state
7
+ - AzureBlobAdapter: Azure Blob Storage for files
8
+ """
9
+
10
+ from hexdag_plugins.azure.azure_blob_adapter import AzureBlobAdapter
11
+ from hexdag_plugins.azure.azure_cosmos_adapter import AzureCosmosAdapter
12
+ from hexdag_plugins.azure.azure_keyvault_adapter import AzureKeyVaultAdapter
13
+ from hexdag_plugins.azure.azure_openai_adapter import AzureOpenAIAdapter
14
+
15
+ __all__ = [
16
+ "AzureOpenAIAdapter",
17
+ "AzureKeyVaultAdapter",
18
+ "AzureCosmosAdapter",
19
+ "AzureBlobAdapter",
20
+ ]
21
+ __version__ = "0.2.0"