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.
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/PKG-INFO +1 -1
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/pyproject.toml +1 -1
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/__init__.py +15 -9
- acex_devkit-2.4.0/src/acex_devkit/models/ai_ops.py +78 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/telemetry_agent.py +0 -35
- acex_devkit-2.2.1/src/acex_devkit/models/ai_ops.py +0 -24
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/README.md +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/__init__.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/configdiffer/__init__.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/configdiffer/command.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/configdiffer/configdiffer.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/configdiffer/diff.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/configdiffer/old_configdiffer.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/configdiffer/old_diff.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/drivers/__init__.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/drivers/base.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/drivers/base_driver.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/exceptions/__init__.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/acl_model.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/agent_manifest.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/asset.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/assignment.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/attribute_value.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/augment.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/auth_config.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/base.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/capability.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/collection_agent.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/compliance.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/composed_configuration.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/config_components.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/config_snapshot.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/contact.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/container_entry.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/credential.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/external_value.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/lldp_neighbor.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/lldp_topology.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/logging.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/logical_node.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/management_connection.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/ned.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/node_response.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/pagination.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/reference.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/region.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/site.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/models/spanning_tree.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/normalizer/__init__.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/normalizer/base.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/normalizer/engine.py +0 -0
- {acex_devkit-2.2.1 → acex_devkit-2.4.0}/src/acex_devkit/types/__init__.py +0 -0
|
@@ -6,7 +6,16 @@ from .agent_manifest import (
|
|
|
6
6
|
CollectionAgentManifest,
|
|
7
7
|
ManifestTarget,
|
|
8
8
|
)
|
|
9
|
-
from .ai_ops import
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|