acex-devkit 2.2.1__tar.gz → 2.4.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 (52) hide show
  1. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/PKG-INFO +1 -1
  2. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/pyproject.toml +1 -1
  3. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/__init__.py +15 -9
  4. acex_devkit-2.4.0/src/acex_devkit/models/ai_ops.py +78 -0
  5. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/telemetry_agent.py +0 -35
  6. acex_devkit-2.2.1/src/acex_devkit/models/ai_ops.py +0 -24
  7. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/README.md +0 -0
  8. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/__init__.py +0 -0
  9. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/configdiffer/__init__.py +0 -0
  10. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/configdiffer/command.py +0 -0
  11. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/configdiffer/configdiffer.py +0 -0
  12. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/configdiffer/diff.py +0 -0
  13. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/configdiffer/old_configdiffer.py +0 -0
  14. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/configdiffer/old_diff.py +0 -0
  15. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/drivers/__init__.py +0 -0
  16. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/drivers/base.py +0 -0
  17. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/drivers/base_driver.py +0 -0
  18. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/exceptions/__init__.py +0 -0
  19. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/acl_model.py +0 -0
  20. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/agent_manifest.py +0 -0
  21. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/asset.py +0 -0
  22. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/assignment.py +0 -0
  23. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/attribute_value.py +0 -0
  24. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/augment.py +0 -0
  25. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/auth_config.py +0 -0
  26. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/base.py +0 -0
  27. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/capability.py +0 -0
  28. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/collection_agent.py +0 -0
  29. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/compliance.py +0 -0
  30. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/composed_configuration.py +0 -0
  31. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/config_components.py +0 -0
  32. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/config_snapshot.py +0 -0
  33. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/contact.py +0 -0
  34. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/container_entry.py +0 -0
  35. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/credential.py +0 -0
  36. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/external_value.py +0 -0
  37. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/lldp_neighbor.py +0 -0
  38. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/lldp_topology.py +0 -0
  39. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/logging.py +0 -0
  40. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/logical_node.py +0 -0
  41. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/management_connection.py +0 -0
  42. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/ned.py +0 -0
  43. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/node_response.py +0 -0
  44. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/pagination.py +0 -0
  45. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/reference.py +0 -0
  46. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/region.py +0 -0
  47. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/site.py +0 -0
  48. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/spanning_tree.py +0 -0
  49. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/normalizer/__init__.py +0 -0
  50. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/normalizer/base.py +0 -0
  51. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/normalizer/engine.py +0 -0
  52. {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/types/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: acex-devkit
3
- Version: 2.2.1
3
+ Version: 2.4.0
4
4
  Summary: ACE-X DevKit - Development kit for building ACE-X drivers and plugins
5
5
  License: AGPL-3.0
6
6
  Keywords: automation,devkit,sdk,drivers,plugins
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "acex-devkit"
3
- version = "2.2.1"
3
+ version = "2.4.0"
4
4
  description = "ACE-X DevKit - Development kit for building ACE-X drivers and plugins"
5
5
  authors = ["Johan Lahti <johan.lahti@acebit.se>"]
6
6
  readme = "README.md"
@@ -6,7 +6,16 @@ from .agent_manifest import (
6
6
  CollectionAgentManifest,
7
7
  ManifestTarget,
8
8
  )
9
- from .ai_ops import AiAnalysisRequest, AiAnalysisTask, AiAskRequest
9
+ from .ai_ops import (
10
+ AiAnalysisRequest,
11
+ AiAnalysisTask,
12
+ AiAskRequest,
13
+ AiChainLevel,
14
+ AiModelInfo,
15
+ AiModelsResponse,
16
+ AiProviderInfo,
17
+ AiProvidersResponse,
18
+ )
10
19
  from .asset import (
11
20
  Asset,
12
21
  AssetClusterAssetResponse,
@@ -118,10 +127,6 @@ from .region import RegionBase, RegionCreate, RegionResponse, RegionSiteInfo, Re
118
127
  from .site import SiteBase, SiteCreate, SiteResponse, SiteUpdate
119
128
  from .telemetry_agent import (
120
129
  InfluxDBVersion,
121
- OutputDestinationBase,
122
- OutputDestinationCreate,
123
- OutputDestinationResponse,
124
- OutputDestinationUpdate,
125
130
  TelemetryAgentAck,
126
131
  TelemetryAgentBase,
127
132
  TelemetryAgentCreate,
@@ -236,6 +241,11 @@ __all__ = [
236
241
  "AiAskRequest",
237
242
  "AiAnalysisTask",
238
243
  "AiAnalysisRequest",
244
+ "AiChainLevel",
245
+ "AiModelInfo",
246
+ "AiModelsResponse",
247
+ "AiProviderInfo",
248
+ "AiProvidersResponse",
239
249
  "TelemetryCapability",
240
250
  "TelemetryAgentBase",
241
251
  "TelemetryAgentCreate",
@@ -246,9 +256,5 @@ __all__ = [
246
256
  "TelemetryAgentMatchRuleCreate",
247
257
  "TelemetryAgentMatchRuleResponse",
248
258
  "InfluxDBVersion",
249
- "OutputDestinationBase",
250
- "OutputDestinationCreate",
251
- "OutputDestinationUpdate",
252
- "OutputDestinationResponse",
253
259
  "PaginatedResponse",
254
260
  ]
@@ -0,0 +1,78 @@
1
+ from pydantic import BaseModel
2
+
3
+
4
+ class AiAskRequest(BaseModel):
5
+ """Body for `POST /ai_ops/ai/ask/`. Returns an SSE stream of str chunks."""
6
+
7
+ question: str
8
+ node_instance_id: int | None = None
9
+ site: str | None = None
10
+ # Explicit model override ("provider/model" or "model"). Omitted = failover chain.
11
+ model: str | None = None
12
+
13
+
14
+ class AiAnalysisTask(BaseModel):
15
+ """Task type for AI config-diff analysis."""
16
+
17
+ name: str
18
+ description: str = ""
19
+
20
+
21
+ class AiAnalysisRequest(BaseModel):
22
+ """Body for `POST /ai_ops/ai/config_analysis/`. Returns an SSE stream."""
23
+
24
+ task: str # "explain" | "risk_assessment" | "alignment"
25
+ diff: str
26
+ node_instance_id: int | None = None
27
+ model: str | None = None
28
+
29
+
30
+ class AiChainLevel(BaseModel):
31
+ """One level in a failover chain, as exposed by `GET /ai_ops/providers`."""
32
+
33
+ provider: str
34
+ model: str
35
+
36
+
37
+ class AiModelInfo(BaseModel):
38
+ """One available model with capability/cost metadata.
39
+
40
+ Fields are None when the provider does not report them and no
41
+ override is configured.
42
+ """
43
+
44
+ id: str
45
+ is_chat_model: bool = True # False for embeddings/STT/rerank/image models
46
+ supports_tools: bool | None = None # function calling / tool use
47
+ supports_vision: bool | None = None
48
+ context_window: int | None = None
49
+ input_cost_per_mtok: float | None = None
50
+ output_cost_per_mtok: float | None = None
51
+ currency: str | None = None
52
+ extra: dict | None = None # provider-specific passthrough
53
+
54
+
55
+ class AiProviderInfo(BaseModel):
56
+ """A configured AI provider enriched with health + available models."""
57
+
58
+ name: str
59
+ base_url: str
60
+ status: str # "ok" | "unreachable"
61
+ models: list[AiModelInfo] = []
62
+ has_static_models: bool = False
63
+
64
+
65
+ class AiProvidersResponse(BaseModel):
66
+ """Response for `GET /ai_ops/providers`."""
67
+
68
+ providers: list[AiProviderInfo]
69
+ # Per-task failover chains: task name -> ordered levels. Tasks not
70
+ # explicitly configured inherit "default".
71
+ chains: dict[str, list[AiChainLevel]] = {}
72
+
73
+
74
+ class AiModelsResponse(BaseModel):
75
+ """Response for `GET /ai_ops/models?provider=X`."""
76
+
77
+ provider: str
78
+ models: list[AiModelInfo]
@@ -24,36 +24,6 @@ class SnmpSecLevel(StrEnum):
24
24
  auth_priv = "authPriv"
25
25
 
26
26
 
27
- class OutputDestinationBase(BaseModel):
28
- influxdb_version: InfluxDBVersion = InfluxDBVersion.v2
29
- url: str = "http://localhost:8086"
30
- token: str | None = None
31
- organization: str | None = None
32
- bucket: str | None = None
33
- database: str | None = None
34
- username: str | None = None
35
- password: str | None = None
36
-
37
-
38
- class OutputDestinationCreate(OutputDestinationBase):
39
- pass
40
-
41
-
42
- class OutputDestinationUpdate(BaseModel):
43
- influxdb_version: InfluxDBVersion | None = None
44
- url: str | None = None
45
- token: str | None = None
46
- organization: str | None = None
47
- bucket: str | None = None
48
- database: str | None = None
49
- username: str | None = None
50
- password: str | None = None
51
-
52
-
53
- class OutputDestinationResponse(PersistedResponse, OutputDestinationBase):
54
- pass
55
-
56
-
57
27
  class TelemetryAgentMatchRuleBase(BaseModel):
58
28
  region: str | None = None
59
29
  site: str | None = None
@@ -118,15 +88,10 @@ class TelemetryAgentResponse(PersistedResponse, TelemetryAgentBase):
118
88
  nodes: list[int] = []
119
89
  rules: list[TelemetryAgentMatchRuleResponse] = []
120
90
  resolved_nodes: list[int] = []
121
- outputs: list[OutputDestinationResponse] = []
122
91
 
123
92
 
124
93
  __all__ = [
125
94
  "InfluxDBVersion",
126
- "OutputDestinationBase",
127
- "OutputDestinationCreate",
128
- "OutputDestinationResponse",
129
- "OutputDestinationUpdate",
130
95
  "SnmpSecLevel",
131
96
  "SnmpVersion",
132
97
  "TelemetryAgentAck",
@@ -1,24 +0,0 @@
1
- from pydantic import BaseModel
2
-
3
-
4
- class AiAskRequest(BaseModel):
5
- """Body for `POST /ai_ops/ai/ask/`. Returns an SSE stream of str chunks."""
6
-
7
- question: str
8
- node_instance_id: int | None = None
9
- site: str | None = None
10
-
11
-
12
- class AiAnalysisTask(BaseModel):
13
- """Task type for AI config-diff analysis."""
14
-
15
- name: str
16
- description: str = ""
17
-
18
-
19
- class AiAnalysisRequest(BaseModel):
20
- """Body for `POST /ai_ops/ai/config_analysis/`. Returns an SSE stream."""
21
-
22
- task: str # "explain" | "risk_assessment" | "alignment"
23
- diff: str
24
- node_instance_id: int | None = None
File without changes