axonflow 0.7.0__tar.gz

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 (40) hide show
  1. axonflow-0.7.0/LICENSE +21 -0
  2. axonflow-0.7.0/PKG-INFO +316 -0
  3. axonflow-0.7.0/README.md +257 -0
  4. axonflow-0.7.0/axonflow/__init__.py +179 -0
  5. axonflow-0.7.0/axonflow/client.py +1982 -0
  6. axonflow-0.7.0/axonflow/code_governance.py +201 -0
  7. axonflow-0.7.0/axonflow/exceptions.py +103 -0
  8. axonflow-0.7.0/axonflow/interceptors/__init__.py +20 -0
  9. axonflow-0.7.0/axonflow/interceptors/anthropic.py +184 -0
  10. axonflow-0.7.0/axonflow/interceptors/base.py +58 -0
  11. axonflow-0.7.0/axonflow/interceptors/bedrock.py +231 -0
  12. axonflow-0.7.0/axonflow/interceptors/gemini.py +281 -0
  13. axonflow-0.7.0/axonflow/interceptors/ollama.py +253 -0
  14. axonflow-0.7.0/axonflow/interceptors/openai.py +160 -0
  15. axonflow-0.7.0/axonflow/policies.py +306 -0
  16. axonflow-0.7.0/axonflow/py.typed +0 -0
  17. axonflow-0.7.0/axonflow/types.py +232 -0
  18. axonflow-0.7.0/axonflow/utils/__init__.py +12 -0
  19. axonflow-0.7.0/axonflow/utils/cache.py +102 -0
  20. axonflow-0.7.0/axonflow/utils/logging.py +89 -0
  21. axonflow-0.7.0/axonflow/utils/retry.py +111 -0
  22. axonflow-0.7.0/axonflow.egg-info/PKG-INFO +316 -0
  23. axonflow-0.7.0/axonflow.egg-info/SOURCES.txt +38 -0
  24. axonflow-0.7.0/axonflow.egg-info/dependency_links.txt +1 -0
  25. axonflow-0.7.0/axonflow.egg-info/requires.txt +36 -0
  26. axonflow-0.7.0/axonflow.egg-info/top_level.txt +1 -0
  27. axonflow-0.7.0/pyproject.toml +201 -0
  28. axonflow-0.7.0/setup.cfg +4 -0
  29. axonflow-0.7.0/setup.py +5 -0
  30. axonflow-0.7.0/tests/test_auth_headers.py +155 -0
  31. axonflow-0.7.0/tests/test_client.py +561 -0
  32. axonflow-0.7.0/tests/test_contract.py +363 -0
  33. axonflow-0.7.0/tests/test_exceptions.py +214 -0
  34. axonflow-0.7.0/tests/test_gateway.py +304 -0
  35. axonflow-0.7.0/tests/test_integration.py +176 -0
  36. axonflow-0.7.0/tests/test_interceptors.py +786 -0
  37. axonflow-0.7.0/tests/test_policies.py +445 -0
  38. axonflow-0.7.0/tests/test_selfhosted_zero_config.py +265 -0
  39. axonflow-0.7.0/tests/test_types.py +335 -0
  40. axonflow-0.7.0/tests/test_utils.py +242 -0
axonflow-0.7.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 getaxonflow
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,316 @@
1
+ Metadata-Version: 2.4
2
+ Name: axonflow
3
+ Version: 0.7.0
4
+ Summary: AxonFlow Python SDK - Enterprise AI Governance in 3 Lines of Code
5
+ Author-email: AxonFlow <dev@getaxonflow.com>
6
+ Maintainer-email: AxonFlow <dev@getaxonflow.com>
7
+ License: MIT
8
+ Project-URL: Homepage, https://getaxonflow.com
9
+ Project-URL: Documentation, https://docs.getaxonflow.com/sdk/python
10
+ Project-URL: Repository, https://github.com/getaxonflow/axonflow-sdk-python
11
+ Project-URL: Changelog, https://github.com/getaxonflow/axonflow-sdk-python/blob/main/CHANGELOG.md
12
+ Project-URL: Issues, https://github.com/getaxonflow/axonflow-sdk-python/issues
13
+ Keywords: ai,governance,llm,openai,anthropic,bedrock,policy,compliance,enterprise,mcp,multi-agent
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: License :: OSI Approved :: MIT License
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.9
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
24
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
25
+ Classifier: Typing :: Typed
26
+ Requires-Python: >=3.9
27
+ Description-Content-Type: text/markdown
28
+ License-File: LICENSE
29
+ Requires-Dist: httpx>=0.25.0
30
+ Requires-Dist: pydantic>=2.0.0
31
+ Requires-Dist: tenacity>=8.0.0
32
+ Requires-Dist: structlog>=23.0.0
33
+ Requires-Dist: cachetools>=5.0.0
34
+ Requires-Dist: eval_type_backport>=0.2.0; python_version < "3.10"
35
+ Provides-Extra: dev
36
+ Requires-Dist: pytest>=7.0.0; extra == "dev"
37
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
38
+ Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
39
+ Requires-Dist: pytest-httpx>=0.22.0; extra == "dev"
40
+ Requires-Dist: mypy>=1.5.0; extra == "dev"
41
+ Requires-Dist: types-cachetools>=5.0.0; extra == "dev"
42
+ Requires-Dist: ruff>=0.1.0; extra == "dev"
43
+ Requires-Dist: black>=23.0.0; extra == "dev"
44
+ Requires-Dist: isort>=5.12.0; extra == "dev"
45
+ Requires-Dist: pre-commit>=3.0.0; extra == "dev"
46
+ Provides-Extra: docs
47
+ Requires-Dist: sphinx>=7.0.0; extra == "docs"
48
+ Requires-Dist: sphinx-rtd-theme>=1.3.0; extra == "docs"
49
+ Requires-Dist: sphinx-autodoc-typehints>=1.24.0; extra == "docs"
50
+ Requires-Dist: myst-parser>=2.0.0; extra == "docs"
51
+ Provides-Extra: openai
52
+ Requires-Dist: openai>=1.0.0; extra == "openai"
53
+ Provides-Extra: anthropic
54
+ Requires-Dist: anthropic>=0.18.0; extra == "anthropic"
55
+ Provides-Extra: all
56
+ Requires-Dist: openai>=1.0.0; extra == "all"
57
+ Requires-Dist: anthropic>=0.18.0; extra == "all"
58
+ Dynamic: license-file
59
+
60
+ # AxonFlow Python SDK
61
+
62
+ Enterprise AI Governance in 3 Lines of Code.
63
+
64
+ [![PyPI version](https://badge.fury.io/py/axonflow.svg)](https://badge.fury.io/py/axonflow)
65
+ [![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
66
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
67
+ [![Type hints](https://img.shields.io/badge/type%20hints-mypy-brightgreen.svg)](http://mypy-lang.org/)
68
+
69
+ ## Installation
70
+
71
+ ```bash
72
+ pip install axonflow
73
+ ```
74
+
75
+ With LLM provider support:
76
+ ```bash
77
+ pip install axonflow[openai] # OpenAI integration
78
+ pip install axonflow[anthropic] # Anthropic integration
79
+ pip install axonflow[all] # All integrations
80
+ ```
81
+
82
+ ## Quick Start
83
+
84
+ ### Async Usage (Recommended)
85
+
86
+ ```python
87
+ import asyncio
88
+ from axonflow import AxonFlow
89
+
90
+ async def main():
91
+ async with AxonFlow(
92
+ agent_url="https://your-agent.axonflow.com",
93
+ client_id="your-client-id",
94
+ client_secret="your-client-secret"
95
+ ) as client:
96
+ # Execute a governed query
97
+ response = await client.execute_query(
98
+ user_token="user-jwt-token",
99
+ query="What is AI governance?",
100
+ request_type="chat"
101
+ )
102
+ print(response.data)
103
+
104
+ asyncio.run(main())
105
+ ```
106
+
107
+ ### Sync Usage
108
+
109
+ ```python
110
+ from axonflow import AxonFlow
111
+
112
+ with AxonFlow.sync(
113
+ agent_url="https://your-agent.axonflow.com",
114
+ client_id="your-client-id",
115
+ client_secret="your-client-secret"
116
+ ) as client:
117
+ response = client.execute_query(
118
+ user_token="user-jwt-token",
119
+ query="What is AI governance?",
120
+ request_type="chat"
121
+ )
122
+ print(response.data)
123
+ ```
124
+
125
+ ## Features
126
+
127
+ ### Gateway Mode
128
+
129
+ For lowest-latency LLM calls with full governance and audit compliance:
130
+
131
+ ```python
132
+ from axonflow import AxonFlow, TokenUsage
133
+
134
+ async with AxonFlow(...) as client:
135
+ # 1. Pre-check: Get policy approval
136
+ ctx = await client.get_policy_approved_context(
137
+ user_token="user-jwt",
138
+ query="Find patient records",
139
+ data_sources=["postgres"]
140
+ )
141
+
142
+ if not ctx.approved:
143
+ raise Exception(f"Blocked: {ctx.block_reason}")
144
+
145
+ # 2. Make LLM call directly (your code)
146
+ llm_response = await openai.chat.completions.create(
147
+ model="gpt-4",
148
+ messages=[{"role": "user", "content": str(ctx.approved_data)}]
149
+ )
150
+
151
+ # 3. Audit the call
152
+ await client.audit_llm_call(
153
+ context_id=ctx.context_id,
154
+ response_summary=llm_response.choices[0].message.content[:100],
155
+ provider="openai",
156
+ model="gpt-4",
157
+ token_usage=TokenUsage(
158
+ prompt_tokens=llm_response.usage.prompt_tokens,
159
+ completion_tokens=llm_response.usage.completion_tokens,
160
+ total_tokens=llm_response.usage.total_tokens
161
+ ),
162
+ latency_ms=250
163
+ )
164
+ ```
165
+
166
+ ### OpenAI Integration
167
+
168
+ Transparent governance for existing OpenAI code:
169
+
170
+ ```python
171
+ from openai import OpenAI
172
+ from axonflow import AxonFlow
173
+ from axonflow.interceptors.openai import wrap_openai_client
174
+
175
+ openai = OpenAI()
176
+ axonflow = AxonFlow(...)
177
+
178
+ # Wrap client - governance is now automatic
179
+ wrapped = wrap_openai_client(openai, axonflow, user_token="user-123")
180
+
181
+ # Use as normal
182
+ response = wrapped.chat.completions.create(
183
+ model="gpt-4",
184
+ messages=[{"role": "user", "content": "Hello!"}]
185
+ )
186
+ ```
187
+
188
+ ### MCP Connectors
189
+
190
+ Query data through MCP connectors:
191
+
192
+ ```python
193
+ # List available connectors
194
+ connectors = await client.list_connectors()
195
+
196
+ # Query a connector
197
+ result = await client.query_connector(
198
+ user_token="user-jwt",
199
+ connector_name="postgres",
200
+ operation="query",
201
+ params={"sql": "SELECT * FROM users LIMIT 10"}
202
+ )
203
+ ```
204
+
205
+ ### Multi-Agent Planning
206
+
207
+ Generate and execute multi-agent plans:
208
+
209
+ ```python
210
+ # Generate a plan
211
+ plan = await client.generate_plan(
212
+ query="Book a flight and hotel for my trip to Paris",
213
+ domain="travel"
214
+ )
215
+
216
+ print(f"Plan has {len(plan.steps)} steps")
217
+
218
+ # Execute the plan
219
+ result = await client.execute_plan(plan.plan_id)
220
+ print(f"Result: {result.result}")
221
+ ```
222
+
223
+ ## Configuration
224
+
225
+ ```python
226
+ from axonflow import AxonFlow, Mode, RetryConfig
227
+
228
+ client = AxonFlow(
229
+ agent_url="https://your-agent.axonflow.com",
230
+ client_id="your-client-id",
231
+ client_secret="your-client-secret",
232
+ license_key="optional-license-key", # For enterprise features
233
+ mode=Mode.PRODUCTION, # or Mode.SANDBOX
234
+ debug=True, # Enable debug logging
235
+ timeout=60.0, # Request timeout in seconds
236
+ retry_config=RetryConfig( # Retry configuration
237
+ enabled=True,
238
+ max_attempts=3,
239
+ initial_delay=1.0,
240
+ max_delay=30.0,
241
+ ),
242
+ cache_enabled=True, # Enable response caching
243
+ cache_ttl=60.0, # Cache TTL in seconds
244
+ )
245
+ ```
246
+
247
+ ## Error Handling
248
+
249
+ ```python
250
+ from axonflow.exceptions import (
251
+ AxonFlowError,
252
+ PolicyViolationError,
253
+ AuthenticationError,
254
+ RateLimitError,
255
+ TimeoutError,
256
+ )
257
+
258
+ try:
259
+ response = await client.execute_query(...)
260
+ except PolicyViolationError as e:
261
+ print(f"Blocked by policy: {e.block_reason}")
262
+ except RateLimitError as e:
263
+ print(f"Rate limited: {e.limit}/{e.remaining}, resets at {e.reset_at}")
264
+ except AuthenticationError:
265
+ print("Invalid credentials")
266
+ except TimeoutError:
267
+ print("Request timed out")
268
+ except AxonFlowError as e:
269
+ print(f"AxonFlow error: {e.message}")
270
+ ```
271
+
272
+ ## Response Types
273
+
274
+ All responses are Pydantic models with full type hints:
275
+
276
+ ```python
277
+ from axonflow import (
278
+ ClientResponse,
279
+ PolicyApprovalResult,
280
+ PlanResponse,
281
+ ConnectorResponse,
282
+ )
283
+
284
+ # Full autocomplete and type checking support
285
+ response: ClientResponse = await client.execute_query(...)
286
+ print(response.success)
287
+ print(response.data)
288
+ print(response.policy_info.policies_evaluated)
289
+ ```
290
+
291
+ ## Development
292
+
293
+ ```bash
294
+ # Install dev dependencies
295
+ pip install -e ".[dev]"
296
+
297
+ # Run tests
298
+ pytest
299
+
300
+ # Run linting
301
+ ruff check .
302
+ ruff format .
303
+
304
+ # Run type checking
305
+ mypy axonflow
306
+ ```
307
+
308
+ ## Documentation
309
+
310
+ - [API Reference](https://docs.getaxonflow.com/sdk/python/api)
311
+ - [Gateway Mode Guide](https://docs.getaxonflow.com/sdk/python/gateway-mode)
312
+ - [Examples](https://github.com/getaxonflow/axonflow/tree/main/sdk/python/examples)
313
+
314
+ ## License
315
+
316
+ Apache 2.0 - See [LICENSE](LICENSE) for details.
@@ -0,0 +1,257 @@
1
+ # AxonFlow Python SDK
2
+
3
+ Enterprise AI Governance in 3 Lines of Code.
4
+
5
+ [![PyPI version](https://badge.fury.io/py/axonflow.svg)](https://badge.fury.io/py/axonflow)
6
+ [![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
7
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
8
+ [![Type hints](https://img.shields.io/badge/type%20hints-mypy-brightgreen.svg)](http://mypy-lang.org/)
9
+
10
+ ## Installation
11
+
12
+ ```bash
13
+ pip install axonflow
14
+ ```
15
+
16
+ With LLM provider support:
17
+ ```bash
18
+ pip install axonflow[openai] # OpenAI integration
19
+ pip install axonflow[anthropic] # Anthropic integration
20
+ pip install axonflow[all] # All integrations
21
+ ```
22
+
23
+ ## Quick Start
24
+
25
+ ### Async Usage (Recommended)
26
+
27
+ ```python
28
+ import asyncio
29
+ from axonflow import AxonFlow
30
+
31
+ async def main():
32
+ async with AxonFlow(
33
+ agent_url="https://your-agent.axonflow.com",
34
+ client_id="your-client-id",
35
+ client_secret="your-client-secret"
36
+ ) as client:
37
+ # Execute a governed query
38
+ response = await client.execute_query(
39
+ user_token="user-jwt-token",
40
+ query="What is AI governance?",
41
+ request_type="chat"
42
+ )
43
+ print(response.data)
44
+
45
+ asyncio.run(main())
46
+ ```
47
+
48
+ ### Sync Usage
49
+
50
+ ```python
51
+ from axonflow import AxonFlow
52
+
53
+ with AxonFlow.sync(
54
+ agent_url="https://your-agent.axonflow.com",
55
+ client_id="your-client-id",
56
+ client_secret="your-client-secret"
57
+ ) as client:
58
+ response = client.execute_query(
59
+ user_token="user-jwt-token",
60
+ query="What is AI governance?",
61
+ request_type="chat"
62
+ )
63
+ print(response.data)
64
+ ```
65
+
66
+ ## Features
67
+
68
+ ### Gateway Mode
69
+
70
+ For lowest-latency LLM calls with full governance and audit compliance:
71
+
72
+ ```python
73
+ from axonflow import AxonFlow, TokenUsage
74
+
75
+ async with AxonFlow(...) as client:
76
+ # 1. Pre-check: Get policy approval
77
+ ctx = await client.get_policy_approved_context(
78
+ user_token="user-jwt",
79
+ query="Find patient records",
80
+ data_sources=["postgres"]
81
+ )
82
+
83
+ if not ctx.approved:
84
+ raise Exception(f"Blocked: {ctx.block_reason}")
85
+
86
+ # 2. Make LLM call directly (your code)
87
+ llm_response = await openai.chat.completions.create(
88
+ model="gpt-4",
89
+ messages=[{"role": "user", "content": str(ctx.approved_data)}]
90
+ )
91
+
92
+ # 3. Audit the call
93
+ await client.audit_llm_call(
94
+ context_id=ctx.context_id,
95
+ response_summary=llm_response.choices[0].message.content[:100],
96
+ provider="openai",
97
+ model="gpt-4",
98
+ token_usage=TokenUsage(
99
+ prompt_tokens=llm_response.usage.prompt_tokens,
100
+ completion_tokens=llm_response.usage.completion_tokens,
101
+ total_tokens=llm_response.usage.total_tokens
102
+ ),
103
+ latency_ms=250
104
+ )
105
+ ```
106
+
107
+ ### OpenAI Integration
108
+
109
+ Transparent governance for existing OpenAI code:
110
+
111
+ ```python
112
+ from openai import OpenAI
113
+ from axonflow import AxonFlow
114
+ from axonflow.interceptors.openai import wrap_openai_client
115
+
116
+ openai = OpenAI()
117
+ axonflow = AxonFlow(...)
118
+
119
+ # Wrap client - governance is now automatic
120
+ wrapped = wrap_openai_client(openai, axonflow, user_token="user-123")
121
+
122
+ # Use as normal
123
+ response = wrapped.chat.completions.create(
124
+ model="gpt-4",
125
+ messages=[{"role": "user", "content": "Hello!"}]
126
+ )
127
+ ```
128
+
129
+ ### MCP Connectors
130
+
131
+ Query data through MCP connectors:
132
+
133
+ ```python
134
+ # List available connectors
135
+ connectors = await client.list_connectors()
136
+
137
+ # Query a connector
138
+ result = await client.query_connector(
139
+ user_token="user-jwt",
140
+ connector_name="postgres",
141
+ operation="query",
142
+ params={"sql": "SELECT * FROM users LIMIT 10"}
143
+ )
144
+ ```
145
+
146
+ ### Multi-Agent Planning
147
+
148
+ Generate and execute multi-agent plans:
149
+
150
+ ```python
151
+ # Generate a plan
152
+ plan = await client.generate_plan(
153
+ query="Book a flight and hotel for my trip to Paris",
154
+ domain="travel"
155
+ )
156
+
157
+ print(f"Plan has {len(plan.steps)} steps")
158
+
159
+ # Execute the plan
160
+ result = await client.execute_plan(plan.plan_id)
161
+ print(f"Result: {result.result}")
162
+ ```
163
+
164
+ ## Configuration
165
+
166
+ ```python
167
+ from axonflow import AxonFlow, Mode, RetryConfig
168
+
169
+ client = AxonFlow(
170
+ agent_url="https://your-agent.axonflow.com",
171
+ client_id="your-client-id",
172
+ client_secret="your-client-secret",
173
+ license_key="optional-license-key", # For enterprise features
174
+ mode=Mode.PRODUCTION, # or Mode.SANDBOX
175
+ debug=True, # Enable debug logging
176
+ timeout=60.0, # Request timeout in seconds
177
+ retry_config=RetryConfig( # Retry configuration
178
+ enabled=True,
179
+ max_attempts=3,
180
+ initial_delay=1.0,
181
+ max_delay=30.0,
182
+ ),
183
+ cache_enabled=True, # Enable response caching
184
+ cache_ttl=60.0, # Cache TTL in seconds
185
+ )
186
+ ```
187
+
188
+ ## Error Handling
189
+
190
+ ```python
191
+ from axonflow.exceptions import (
192
+ AxonFlowError,
193
+ PolicyViolationError,
194
+ AuthenticationError,
195
+ RateLimitError,
196
+ TimeoutError,
197
+ )
198
+
199
+ try:
200
+ response = await client.execute_query(...)
201
+ except PolicyViolationError as e:
202
+ print(f"Blocked by policy: {e.block_reason}")
203
+ except RateLimitError as e:
204
+ print(f"Rate limited: {e.limit}/{e.remaining}, resets at {e.reset_at}")
205
+ except AuthenticationError:
206
+ print("Invalid credentials")
207
+ except TimeoutError:
208
+ print("Request timed out")
209
+ except AxonFlowError as e:
210
+ print(f"AxonFlow error: {e.message}")
211
+ ```
212
+
213
+ ## Response Types
214
+
215
+ All responses are Pydantic models with full type hints:
216
+
217
+ ```python
218
+ from axonflow import (
219
+ ClientResponse,
220
+ PolicyApprovalResult,
221
+ PlanResponse,
222
+ ConnectorResponse,
223
+ )
224
+
225
+ # Full autocomplete and type checking support
226
+ response: ClientResponse = await client.execute_query(...)
227
+ print(response.success)
228
+ print(response.data)
229
+ print(response.policy_info.policies_evaluated)
230
+ ```
231
+
232
+ ## Development
233
+
234
+ ```bash
235
+ # Install dev dependencies
236
+ pip install -e ".[dev]"
237
+
238
+ # Run tests
239
+ pytest
240
+
241
+ # Run linting
242
+ ruff check .
243
+ ruff format .
244
+
245
+ # Run type checking
246
+ mypy axonflow
247
+ ```
248
+
249
+ ## Documentation
250
+
251
+ - [API Reference](https://docs.getaxonflow.com/sdk/python/api)
252
+ - [Gateway Mode Guide](https://docs.getaxonflow.com/sdk/python/gateway-mode)
253
+ - [Examples](https://github.com/getaxonflow/axonflow/tree/main/sdk/python/examples)
254
+
255
+ ## License
256
+
257
+ Apache 2.0 - See [LICENSE](LICENSE) for details.