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.
- hexdag/__init__.py +116 -0
- hexdag/__main__.py +30 -0
- hexdag/adapters/executors/__init__.py +5 -0
- hexdag/adapters/executors/local_executor.py +316 -0
- hexdag/builtin/__init__.py +6 -0
- hexdag/builtin/adapters/__init__.py +51 -0
- hexdag/builtin/adapters/anthropic/__init__.py +5 -0
- hexdag/builtin/adapters/anthropic/anthropic_adapter.py +151 -0
- hexdag/builtin/adapters/database/__init__.py +6 -0
- hexdag/builtin/adapters/database/csv/csv_adapter.py +249 -0
- hexdag/builtin/adapters/database/pgvector/__init__.py +5 -0
- hexdag/builtin/adapters/database/pgvector/pgvector_adapter.py +478 -0
- hexdag/builtin/adapters/database/sqlalchemy/sqlalchemy_adapter.py +252 -0
- hexdag/builtin/adapters/database/sqlite/__init__.py +5 -0
- hexdag/builtin/adapters/database/sqlite/sqlite_adapter.py +410 -0
- hexdag/builtin/adapters/local/README.md +59 -0
- hexdag/builtin/adapters/local/__init__.py +7 -0
- hexdag/builtin/adapters/local/local_observer_manager.py +696 -0
- hexdag/builtin/adapters/memory/__init__.py +47 -0
- hexdag/builtin/adapters/memory/file_memory_adapter.py +297 -0
- hexdag/builtin/adapters/memory/in_memory_memory.py +216 -0
- hexdag/builtin/adapters/memory/schemas.py +57 -0
- hexdag/builtin/adapters/memory/session_memory.py +178 -0
- hexdag/builtin/adapters/memory/sqlite_memory_adapter.py +215 -0
- hexdag/builtin/adapters/memory/state_memory.py +280 -0
- hexdag/builtin/adapters/mock/README.md +89 -0
- hexdag/builtin/adapters/mock/__init__.py +15 -0
- hexdag/builtin/adapters/mock/hexdag.toml +50 -0
- hexdag/builtin/adapters/mock/mock_database.py +225 -0
- hexdag/builtin/adapters/mock/mock_embedding.py +223 -0
- hexdag/builtin/adapters/mock/mock_llm.py +177 -0
- hexdag/builtin/adapters/mock/mock_tool_adapter.py +192 -0
- hexdag/builtin/adapters/mock/mock_tool_router.py +232 -0
- hexdag/builtin/adapters/openai/__init__.py +5 -0
- hexdag/builtin/adapters/openai/openai_adapter.py +634 -0
- hexdag/builtin/adapters/secret/__init__.py +7 -0
- hexdag/builtin/adapters/secret/local_secret_adapter.py +248 -0
- hexdag/builtin/adapters/unified_tool_router.py +280 -0
- hexdag/builtin/macros/__init__.py +17 -0
- hexdag/builtin/macros/conversation_agent.py +390 -0
- hexdag/builtin/macros/llm_macro.py +151 -0
- hexdag/builtin/macros/reasoning_agent.py +423 -0
- hexdag/builtin/macros/tool_macro.py +380 -0
- hexdag/builtin/nodes/__init__.py +38 -0
- hexdag/builtin/nodes/_discovery.py +123 -0
- hexdag/builtin/nodes/agent_node.py +696 -0
- hexdag/builtin/nodes/base_node_factory.py +242 -0
- hexdag/builtin/nodes/composite_node.py +926 -0
- hexdag/builtin/nodes/data_node.py +201 -0
- hexdag/builtin/nodes/expression_node.py +487 -0
- hexdag/builtin/nodes/function_node.py +454 -0
- hexdag/builtin/nodes/llm_node.py +491 -0
- hexdag/builtin/nodes/loop_node.py +920 -0
- hexdag/builtin/nodes/mapped_input.py +518 -0
- hexdag/builtin/nodes/port_call_node.py +269 -0
- hexdag/builtin/nodes/tool_call_node.py +195 -0
- hexdag/builtin/nodes/tool_utils.py +390 -0
- hexdag/builtin/prompts/__init__.py +68 -0
- hexdag/builtin/prompts/base.py +422 -0
- hexdag/builtin/prompts/chat_prompts.py +303 -0
- hexdag/builtin/prompts/error_correction_prompts.py +320 -0
- hexdag/builtin/prompts/tool_prompts.py +160 -0
- hexdag/builtin/tools/builtin_tools.py +84 -0
- hexdag/builtin/tools/database_tools.py +164 -0
- hexdag/cli/__init__.py +17 -0
- hexdag/cli/__main__.py +7 -0
- hexdag/cli/commands/__init__.py +27 -0
- hexdag/cli/commands/build_cmd.py +812 -0
- hexdag/cli/commands/create_cmd.py +208 -0
- hexdag/cli/commands/docs_cmd.py +293 -0
- hexdag/cli/commands/generate_types_cmd.py +252 -0
- hexdag/cli/commands/init_cmd.py +188 -0
- hexdag/cli/commands/pipeline_cmd.py +494 -0
- hexdag/cli/commands/plugin_dev_cmd.py +529 -0
- hexdag/cli/commands/plugins_cmd.py +441 -0
- hexdag/cli/commands/studio_cmd.py +101 -0
- hexdag/cli/commands/validate_cmd.py +221 -0
- hexdag/cli/main.py +84 -0
- hexdag/core/__init__.py +83 -0
- hexdag/core/config/__init__.py +20 -0
- hexdag/core/config/loader.py +479 -0
- hexdag/core/config/models.py +150 -0
- hexdag/core/configurable.py +294 -0
- hexdag/core/context/__init__.py +37 -0
- hexdag/core/context/execution_context.py +378 -0
- hexdag/core/docs/__init__.py +26 -0
- hexdag/core/docs/extractors.py +678 -0
- hexdag/core/docs/generators.py +890 -0
- hexdag/core/docs/models.py +120 -0
- hexdag/core/domain/__init__.py +10 -0
- hexdag/core/domain/dag.py +1225 -0
- hexdag/core/exceptions.py +234 -0
- hexdag/core/expression_parser.py +569 -0
- hexdag/core/logging.py +449 -0
- hexdag/core/models/__init__.py +17 -0
- hexdag/core/models/base.py +138 -0
- hexdag/core/orchestration/__init__.py +46 -0
- hexdag/core/orchestration/body_executor.py +481 -0
- hexdag/core/orchestration/components/__init__.py +97 -0
- hexdag/core/orchestration/components/adapter_lifecycle_manager.py +113 -0
- hexdag/core/orchestration/components/checkpoint_manager.py +134 -0
- hexdag/core/orchestration/components/execution_coordinator.py +360 -0
- hexdag/core/orchestration/components/health_check_manager.py +176 -0
- hexdag/core/orchestration/components/input_mapper.py +143 -0
- hexdag/core/orchestration/components/lifecycle_manager.py +583 -0
- hexdag/core/orchestration/components/node_executor.py +377 -0
- hexdag/core/orchestration/components/secret_manager.py +202 -0
- hexdag/core/orchestration/components/wave_executor.py +158 -0
- hexdag/core/orchestration/constants.py +17 -0
- hexdag/core/orchestration/events/README.md +312 -0
- hexdag/core/orchestration/events/__init__.py +104 -0
- hexdag/core/orchestration/events/batching.py +330 -0
- hexdag/core/orchestration/events/decorators.py +139 -0
- hexdag/core/orchestration/events/events.py +573 -0
- hexdag/core/orchestration/events/observers/__init__.py +30 -0
- hexdag/core/orchestration/events/observers/core_observers.py +690 -0
- hexdag/core/orchestration/events/observers/models.py +111 -0
- hexdag/core/orchestration/events/taxonomy.py +269 -0
- hexdag/core/orchestration/hook_context.py +237 -0
- hexdag/core/orchestration/hooks.py +437 -0
- hexdag/core/orchestration/models.py +418 -0
- hexdag/core/orchestration/orchestrator.py +910 -0
- hexdag/core/orchestration/orchestrator_factory.py +275 -0
- hexdag/core/orchestration/port_wrappers.py +327 -0
- hexdag/core/orchestration/prompt/__init__.py +32 -0
- hexdag/core/orchestration/prompt/template.py +332 -0
- hexdag/core/pipeline_builder/__init__.py +21 -0
- hexdag/core/pipeline_builder/component_instantiator.py +386 -0
- hexdag/core/pipeline_builder/include_tag.py +265 -0
- hexdag/core/pipeline_builder/pipeline_config.py +133 -0
- hexdag/core/pipeline_builder/py_tag.py +223 -0
- hexdag/core/pipeline_builder/tag_discovery.py +268 -0
- hexdag/core/pipeline_builder/yaml_builder.py +1196 -0
- hexdag/core/pipeline_builder/yaml_validator.py +569 -0
- hexdag/core/ports/__init__.py +65 -0
- hexdag/core/ports/api_call.py +133 -0
- hexdag/core/ports/database.py +489 -0
- hexdag/core/ports/embedding.py +215 -0
- hexdag/core/ports/executor.py +237 -0
- hexdag/core/ports/file_storage.py +117 -0
- hexdag/core/ports/healthcheck.py +87 -0
- hexdag/core/ports/llm.py +551 -0
- hexdag/core/ports/memory.py +70 -0
- hexdag/core/ports/observer_manager.py +130 -0
- hexdag/core/ports/secret.py +145 -0
- hexdag/core/ports/tool_router.py +94 -0
- hexdag/core/ports_builder.py +623 -0
- hexdag/core/protocols.py +273 -0
- hexdag/core/resolver.py +304 -0
- hexdag/core/schema/__init__.py +9 -0
- hexdag/core/schema/generator.py +742 -0
- hexdag/core/secrets.py +242 -0
- hexdag/core/types.py +413 -0
- hexdag/core/utils/async_warnings.py +206 -0
- hexdag/core/utils/schema_conversion.py +78 -0
- hexdag/core/utils/sql_validation.py +86 -0
- hexdag/core/validation/secure_json.py +148 -0
- hexdag/core/yaml_macro.py +517 -0
- hexdag/mcp_server.py +3120 -0
- hexdag/studio/__init__.py +10 -0
- hexdag/studio/build_ui.py +92 -0
- hexdag/studio/server/__init__.py +1 -0
- hexdag/studio/server/main.py +100 -0
- hexdag/studio/server/routes/__init__.py +9 -0
- hexdag/studio/server/routes/execute.py +208 -0
- hexdag/studio/server/routes/export.py +558 -0
- hexdag/studio/server/routes/files.py +207 -0
- hexdag/studio/server/routes/plugins.py +419 -0
- hexdag/studio/server/routes/validate.py +220 -0
- hexdag/studio/ui/index.html +13 -0
- hexdag/studio/ui/package-lock.json +2992 -0
- hexdag/studio/ui/package.json +31 -0
- hexdag/studio/ui/postcss.config.js +6 -0
- hexdag/studio/ui/public/hexdag.svg +5 -0
- hexdag/studio/ui/src/App.tsx +251 -0
- hexdag/studio/ui/src/components/Canvas.tsx +408 -0
- hexdag/studio/ui/src/components/ContextMenu.tsx +187 -0
- hexdag/studio/ui/src/components/FileBrowser.tsx +123 -0
- hexdag/studio/ui/src/components/Header.tsx +181 -0
- hexdag/studio/ui/src/components/HexdagNode.tsx +193 -0
- hexdag/studio/ui/src/components/NodeInspector.tsx +512 -0
- hexdag/studio/ui/src/components/NodePalette.tsx +262 -0
- hexdag/studio/ui/src/components/NodePortsSection.tsx +403 -0
- hexdag/studio/ui/src/components/PluginManager.tsx +347 -0
- hexdag/studio/ui/src/components/PortsEditor.tsx +481 -0
- hexdag/studio/ui/src/components/PythonEditor.tsx +195 -0
- hexdag/studio/ui/src/components/ValidationPanel.tsx +105 -0
- hexdag/studio/ui/src/components/YamlEditor.tsx +196 -0
- hexdag/studio/ui/src/components/index.ts +8 -0
- hexdag/studio/ui/src/index.css +92 -0
- hexdag/studio/ui/src/main.tsx +10 -0
- hexdag/studio/ui/src/types/index.ts +123 -0
- hexdag/studio/ui/src/vite-env.d.ts +1 -0
- hexdag/studio/ui/tailwind.config.js +29 -0
- hexdag/studio/ui/tsconfig.json +37 -0
- hexdag/studio/ui/tsconfig.node.json +13 -0
- hexdag/studio/ui/vite.config.ts +35 -0
- hexdag/visualization/__init__.py +69 -0
- hexdag/visualization/dag_visualizer.py +1020 -0
- hexdag-0.5.0.dev1.dist-info/METADATA +369 -0
- hexdag-0.5.0.dev1.dist-info/RECORD +261 -0
- hexdag-0.5.0.dev1.dist-info/WHEEL +4 -0
- hexdag-0.5.0.dev1.dist-info/entry_points.txt +4 -0
- hexdag-0.5.0.dev1.dist-info/licenses/LICENSE +190 -0
- hexdag_plugins/.gitignore +43 -0
- hexdag_plugins/README.md +73 -0
- hexdag_plugins/__init__.py +1 -0
- hexdag_plugins/azure/LICENSE +21 -0
- hexdag_plugins/azure/README.md +414 -0
- hexdag_plugins/azure/__init__.py +21 -0
- hexdag_plugins/azure/azure_blob_adapter.py +450 -0
- hexdag_plugins/azure/azure_cosmos_adapter.py +383 -0
- hexdag_plugins/azure/azure_keyvault_adapter.py +314 -0
- hexdag_plugins/azure/azure_openai_adapter.py +415 -0
- hexdag_plugins/azure/pyproject.toml +107 -0
- hexdag_plugins/azure/tests/__init__.py +1 -0
- hexdag_plugins/azure/tests/test_azure_blob_adapter.py +350 -0
- hexdag_plugins/azure/tests/test_azure_cosmos_adapter.py +323 -0
- hexdag_plugins/azure/tests/test_azure_keyvault_adapter.py +330 -0
- hexdag_plugins/azure/tests/test_azure_openai_adapter.py +329 -0
- hexdag_plugins/hexdag_etl/README.md +168 -0
- hexdag_plugins/hexdag_etl/__init__.py +53 -0
- hexdag_plugins/hexdag_etl/examples/01_simple_pandas_transform.py +270 -0
- hexdag_plugins/hexdag_etl/examples/02_simple_pandas_only.py +149 -0
- hexdag_plugins/hexdag_etl/examples/03_file_io_pipeline.py +109 -0
- hexdag_plugins/hexdag_etl/examples/test_pandas_transform.py +84 -0
- hexdag_plugins/hexdag_etl/hexdag.toml +25 -0
- hexdag_plugins/hexdag_etl/hexdag_etl/__init__.py +48 -0
- hexdag_plugins/hexdag_etl/hexdag_etl/nodes/__init__.py +13 -0
- hexdag_plugins/hexdag_etl/hexdag_etl/nodes/api_extract.py +230 -0
- hexdag_plugins/hexdag_etl/hexdag_etl/nodes/base_node_factory.py +181 -0
- hexdag_plugins/hexdag_etl/hexdag_etl/nodes/file_io.py +415 -0
- hexdag_plugins/hexdag_etl/hexdag_etl/nodes/outlook.py +492 -0
- hexdag_plugins/hexdag_etl/hexdag_etl/nodes/pandas_transform.py +563 -0
- hexdag_plugins/hexdag_etl/hexdag_etl/nodes/sql_extract_load.py +112 -0
- hexdag_plugins/hexdag_etl/pyproject.toml +82 -0
- hexdag_plugins/hexdag_etl/test_transform.py +54 -0
- hexdag_plugins/hexdag_etl/tests/test_plugin_integration.py +62 -0
- hexdag_plugins/mysql_adapter/LICENSE +21 -0
- hexdag_plugins/mysql_adapter/README.md +224 -0
- hexdag_plugins/mysql_adapter/__init__.py +6 -0
- hexdag_plugins/mysql_adapter/mysql_adapter.py +408 -0
- hexdag_plugins/mysql_adapter/pyproject.toml +93 -0
- hexdag_plugins/mysql_adapter/tests/test_mysql_adapter.py +259 -0
- hexdag_plugins/storage/README.md +184 -0
- hexdag_plugins/storage/__init__.py +19 -0
- hexdag_plugins/storage/file/__init__.py +5 -0
- hexdag_plugins/storage/file/local.py +325 -0
- hexdag_plugins/storage/ports/__init__.py +5 -0
- hexdag_plugins/storage/ports/vector_store.py +236 -0
- hexdag_plugins/storage/sql/__init__.py +7 -0
- hexdag_plugins/storage/sql/base.py +187 -0
- hexdag_plugins/storage/sql/mysql.py +27 -0
- hexdag_plugins/storage/sql/postgresql.py +27 -0
- hexdag_plugins/storage/tests/__init__.py +1 -0
- hexdag_plugins/storage/tests/test_local_file_storage.py +161 -0
- hexdag_plugins/storage/tests/test_sql_adapters.py +212 -0
- hexdag_plugins/storage/vector/__init__.py +7 -0
- hexdag_plugins/storage/vector/chromadb.py +223 -0
- hexdag_plugins/storage/vector/in_memory.py +285 -0
- 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"
|