licos-platform-cli 0.4.3__tar.gz → 0.4.4__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.

Potentially problematic release.


This version of licos-platform-cli might be problematic. Click here for more details.

@@ -1,57 +1,63 @@
1
- # Rust
2
- /target/
3
- **/*.rs.bk
4
- Cargo.lock
5
-
6
- # Node
7
- node_modules/
8
- packages/*/dist/
9
-
10
- # IDE
11
- .idea/
12
- .vscode/
13
- *.swp
14
- *.swo
15
- *.pyc
16
-
17
- # OS
18
- .DS_Store
19
- Thumbs.db
20
-
21
- # Environment
22
- .env
23
- .env.local
24
- crates/industrial/industrial-stack.env
25
-
26
- # Workspace
27
- /workspace/
28
-
29
- # Test runtime data
30
- /test/licos-data/
31
- /test/screenshots/
32
- /test/vue-app/
33
-
34
- # Build
35
- *.log
36
- *.pid
37
- .licos
38
- .tmp
39
- .playwright-cli
40
-
41
- /tmp
42
- crates/industrial/bin/
43
-
44
- tools/android-sdk-cache/*.zip
45
- tools/codegraph-cache/*.tgz
46
- tools/codegraph-cache/*.tgz
47
-
48
- *.codex-*
49
-
50
- __pycache__
51
-
52
- dist
53
- logs
54
-
55
- source
56
-
57
- 平台API
1
+ # Rust
2
+ /target/
3
+ **/*.rs.bk
4
+ Cargo.lock
5
+
6
+ # Node
7
+ node_modules/
8
+ packages/*/dist/
9
+
10
+ # IDE
11
+ .idea/
12
+ .vscode/
13
+ *.swp
14
+ *.swo
15
+ *.pyc
16
+
17
+ # OS
18
+ .DS_Store
19
+ Thumbs.db
20
+
21
+ # Environment
22
+ .env
23
+ .env.local
24
+ crates/industrial/industrial-stack.env
25
+
26
+ # Workspace
27
+ /workspace/
28
+
29
+ # Test runtime data
30
+ /test/licos-data/
31
+ /test/screenshots/
32
+ /test/vue-app/
33
+
34
+ # Build
35
+ *.log
36
+ *.pid
37
+ .licos
38
+ .tmp
39
+ .playwright-cli
40
+
41
+ /tmp
42
+ crates/industrial/bin/
43
+
44
+ tools/android-sdk-cache/*.zip
45
+ tools/codegraph-cache/*.tgz
46
+ tools/codegraph-cache/*.tgz
47
+
48
+ *.codex-*
49
+
50
+ __pycache__
51
+
52
+ dist
53
+ !tools/licos-chat-sdk/dist/
54
+ !tools/licos-chat-sdk/dist/**
55
+ !tools/licos-api-sdk/dist/
56
+ !tools/licos-api-sdk/dist/**
57
+ tools/licos-chat-sdk/node_modules/
58
+ tools/licos-api-sdk/node_modules/
59
+ logs
60
+
61
+ source
62
+
63
+ 平台API
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: licos-platform-cli
3
- Version: 0.4.3
3
+ Version: 0.4.4
4
4
  Summary: LICOS platform CLI
5
5
  Requires-Python: >=3.10
6
- Requires-Dist: licos-platform-sdk>=0.5.1
6
+ Requires-Dist: licos-platform-sdk>=0.5.2
@@ -4,11 +4,11 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "licos-platform-cli"
7
- version = "0.4.3"
7
+ version = "0.4.4"
8
8
  description = "LICOS platform CLI"
9
9
  requires-python = ">=3.10"
10
10
  dependencies = [
11
- "licos-platform-sdk>=0.5.1",
11
+ "licos-platform-sdk>=0.5.2",
12
12
  ]
13
13
 
14
14
  [project.scripts]
@@ -833,16 +833,22 @@ UNS_HELP = {
833
833
  "operations": {"description": "List all operations and errors for a provisioning job.", "parameters": [{"name": "job_id", "required": True, "description": "Provisioning job ID."}], "example": "licos-platform uns operations <jobId>"},
834
834
  "wait": {"description": "Wait for a provisioning job terminal status.", "parameters": [{"name": "job_id", "required": True, "description": "Provisioning job ID."}, {"name": "--timeout", "required": False, "description": "Maximum seconds, default 600."}, {"name": "--interval", "required": False, "description": "Poll interval seconds, default 1.5."}], "example": "licos-platform uns wait <jobId>"},
835
835
  "nodes": {"description": "List the tenant UNS directory tree.", "parameters": [], "example": "licos-platform uns nodes"},
836
+ "node-get": {"description": "Get one UNS node by its exact ID.", "parameters": [{"name": "node_id", "type": "string", "required": True, "description": "UNS node ID."}], "example": "licos-platform uns node-get <nodeId>"},
837
+ "node-children": {"description": "List direct or recursive children of one UNS directory.", "parameters": [{"name": "node_id", "type": "string", "required": True, "description": "Parent UNS node ID."}, {"name": "--recursive", "type": "flag", "required": False, "description": "Include all descendants instead of direct children only."}, {"name": "--kind", "type": "enum", "required": False, "values": ["FOLDER", "FILE"], "description": "Optionally return only folders or files."}], "example": "licos-platform uns node-children <nodeId> --recursive --kind FILE"},
836
838
  "node-create": {"description": "Create one directory or file node.", "parameters": [{"name": "--json", "required": True, "description": "Node request JSON object."}], "example": "licos-platform uns node-create --json <node-json>"},
837
839
  "node-batch-create": {"description": "Batch create directory/file nodes.", "parameters": [{"name": "--file", "required": True, "description": "JSON array or {nodes:[...]} file."}], "example": "licos-platform uns node-batch-create --file nodes.json"},
838
840
  "node-copy": {"description": "Copy one node under an optional target directory.", "parameters": [{"name": "node_id", "required": True, "description": "Source node ID."}, {"name": "--parent-id", "required": False, "description": "Target parent node ID; omit for root."}], "example": "licos-platform uns node-copy <nodeId> --parent-id <parentId>"},
839
841
  "node-update": {"description": "Update one node with a structured request.", "parameters": [{"name": "node_id", "required": True, "description": "Node ID."}, {"name": "--json", "required": True, "description": "Node update JSON object."}], "example": "licos-platform uns node-update <nodeId> --json <node-json>"},
840
842
  "node-delete": {"description": "Delete one node after explicit confirmation.", "parameters": [{"name": "node_id", "required": True, "description": "Node ID."}, {"name": "--confirm", "required": True, "description": "Confirm deletion."}], "example": "licos-platform uns node-delete <nodeId> --confirm"},
841
843
  "templates": {"description": "List UNS templates.", "parameters": [], "example": "licos-platform uns templates"},
844
+ "template-get": {"description": "Get one UNS template by its exact ID.", "parameters": [{"name": "template_id", "type": "string", "required": True, "description": "UNS template ID."}], "example": "licos-platform uns template-get <templateId>"},
845
+ "template-nodes": {"description": "List UNS nodes that use one template.", "parameters": [{"name": "template_id", "type": "string", "required": True, "description": "UNS template ID."}], "example": "licos-platform uns template-nodes <templateId>"},
842
846
  "template-create": {"description": "Create an UNS template.", "parameters": [{"name": "--json", "required": True, "description": "Template JSON object."}], "example": "licos-platform uns template-create --json '{...}'"},
843
847
  "template-update": {"description": "Update an UNS template.", "parameters": [{"name": "template_id", "required": True, "description": "Template ID."}, {"name": "--json", "required": True, "description": "Template JSON object."}], "example": "licos-platform uns template-update <id> --json '{...}'"},
844
848
  "template-delete": {"description": "Delete an UNS template after confirmation.", "parameters": [{"name": "template_id", "required": True, "description": "Template ID."}, {"name": "--confirm", "required": True, "description": "Confirm deletion."}], "example": "licos-platform uns template-delete <id> --confirm"},
845
849
  "labels": {"description": "List UNS labels.", "parameters": [], "example": "licos-platform uns labels"},
850
+ "label-get": {"description": "Get one UNS label by its exact ID.", "parameters": [{"name": "label_id", "type": "string", "required": True, "description": "UNS label ID."}], "example": "licos-platform uns label-get <labelId>"},
851
+ "label-node-list": {"description": "List UNS nodes assigned to one label.", "parameters": [{"name": "label_id", "type": "string", "required": True, "description": "UNS label ID."}], "example": "licos-platform uns label-node-list <labelId>"},
846
852
  "label-create": {"description": "Create an UNS label.", "parameters": [{"name": "--json", "required": True, "description": "Label JSON object."}], "example": "licos-platform uns label-create --json '{...}'"},
847
853
  "label-update": {"description": "Update an UNS label.", "parameters": [{"name": "label_id", "required": True, "description": "Label ID."}, {"name": "--json", "required": True, "description": "Label JSON object."}], "example": "licos-platform uns label-update <id> --json '{...}'"},
848
854
  "label-nodes": {"description": "Replace all nodes assigned to one label.", "parameters": [{"name": "label_id", "required": True, "description": "Label ID."}, {"name": "--node-ids-json", "required": True, "description": "JSON string array of node IDs."}], "example": "licos-platform uns label-nodes <id> --node-ids-json <node-id-array>"},
@@ -1,123 +1,123 @@
1
- from __future__ import annotations
2
-
1
+ from __future__ import annotations
2
+
3
3
  import argparse
4
4
  import json
5
5
  from typing import Any, Callable
6
6
 
7
7
  from licos_platform_sdk import enterprise_knowledge, knowledge
8
-
9
-
10
- Handler = Callable[[argparse.Namespace], Any]
11
-
12
-
13
- def _set_handler(parser: argparse.ArgumentParser, handler: Handler) -> None:
14
- parser.set_defaults(handler=handler)
15
-
16
-
17
- def _chunk_config(args: argparse.Namespace) -> knowledge.ChunkConfig | None:
18
- if not any(
19
- [
20
- args.separator is not None,
21
- args.max_tokens is not None,
22
- args.remove_extra_spaces,
23
- args.remove_urls_emails,
24
- ]
25
- ):
26
- return None
27
- return knowledge.ChunkConfig(
28
- separator=args.separator or "\n",
29
- max_tokens=args.max_tokens or 2000,
30
- remove_extra_spaces=args.remove_extra_spaces,
31
- remove_urls_emails=args.remove_urls_emails,
32
- )
33
-
34
-
35
- def _dataset_selector(args: argparse.Namespace) -> dict[str, str | None]:
36
- return {"dataset_id": args.dataset_id, "dataset_name": args.dataset}
37
-
38
-
39
- def _cmd_runtime(_args: argparse.Namespace) -> Any:
40
- return knowledge.runtime()
41
-
42
-
43
- def _cmd_model_catalog(_args: argparse.Namespace) -> Any:
44
- return knowledge.model_catalog()
45
-
46
-
47
- def _cmd_datasets(args: argparse.Namespace) -> Any:
48
- return knowledge.list_datasets(
49
- name=args.name,
50
- space_id=args.space_id,
51
- page_size=args.page_size,
52
- page_num=args.page_num,
53
- format_type=args.format_type,
54
- )
55
-
56
-
57
- def _cmd_create_dataset(args: argparse.Namespace) -> Any:
58
- return knowledge.create_dataset(
59
- args.name,
60
- description=args.description,
61
- space_id=args.space_id,
62
- format_type=args.format_type,
63
- source_type=args.source_type,
64
- engine_type=args.engine_type,
65
- access_scope=args.access_scope,
66
- )
67
-
68
-
69
- def _cmd_ensure_dataset(args: argparse.Namespace) -> Any:
70
- return knowledge.ensure_dataset(args.name, description=args.description, space_id=args.space_id)
71
-
72
-
73
- def _cmd_get_dataset(args: argparse.Namespace) -> Any:
74
- return knowledge.get_dataset(args.dataset_id)
75
-
76
-
77
- def _cmd_delete_dataset(args: argparse.Namespace) -> Any:
78
- return knowledge.delete_dataset(args.dataset_id)
79
-
80
-
81
- def _cmd_add(args: argparse.Namespace) -> Any:
82
- selector = _dataset_selector(args)
83
- chunk_config = _chunk_config(args)
84
- if args.content is not None:
85
- return knowledge.add_text(args.content, name=args.name or "document.txt", chunk_config=chunk_config, **selector)
86
- if args.url is not None:
87
- return knowledge.add_url(args.url, name=args.name, chunk_config=chunk_config, **selector)
88
- return knowledge.add_documents(
89
- [
90
- knowledge.KnowledgeDocument(
91
- source=knowledge.DataSourceType.URI,
92
- source_file_id=args.source_file_id,
93
- name=args.name,
94
- file_type=args.file_type,
95
- )
96
- ],
97
- chunk_config=chunk_config,
98
- **selector,
99
- )
100
-
101
-
102
- def _cmd_search(args: argparse.Namespace) -> Any:
103
- return knowledge.search(
104
- args.query,
105
- dataset_id=args.dataset_id,
106
- dataset_ids=args.dataset_ids,
107
- dataset_name=args.dataset,
108
- dataset_names=args.datasets,
109
- top_k=args.top_k,
110
- min_score=args.min_score,
111
- candidate_top_k=args.candidate_top_k,
112
- search_method=args.search_method,
113
- enable_rerank=args.enable_rerank,
114
- )
115
-
116
-
117
- def _cmd_documents(args: argparse.Namespace) -> Any:
118
- return knowledge.list_documents(args.dataset_id, page=args.page, size=args.size)
119
-
120
-
8
+
9
+
10
+ Handler = Callable[[argparse.Namespace], Any]
11
+
12
+
13
+ def _set_handler(parser: argparse.ArgumentParser, handler: Handler) -> None:
14
+ parser.set_defaults(handler=handler)
15
+
16
+
17
+ def _chunk_config(args: argparse.Namespace) -> knowledge.ChunkConfig | None:
18
+ if not any(
19
+ [
20
+ args.separator is not None,
21
+ args.max_tokens is not None,
22
+ args.remove_extra_spaces,
23
+ args.remove_urls_emails,
24
+ ]
25
+ ):
26
+ return None
27
+ return knowledge.ChunkConfig(
28
+ separator=args.separator or "\n",
29
+ max_tokens=args.max_tokens or 2000,
30
+ remove_extra_spaces=args.remove_extra_spaces,
31
+ remove_urls_emails=args.remove_urls_emails,
32
+ )
33
+
34
+
35
+ def _dataset_selector(args: argparse.Namespace) -> dict[str, str | None]:
36
+ return {"dataset_id": args.dataset_id, "dataset_name": args.dataset}
37
+
38
+
39
+ def _cmd_runtime(_args: argparse.Namespace) -> Any:
40
+ return knowledge.runtime()
41
+
42
+
43
+ def _cmd_model_catalog(_args: argparse.Namespace) -> Any:
44
+ return knowledge.model_catalog()
45
+
46
+
47
+ def _cmd_datasets(args: argparse.Namespace) -> Any:
48
+ return knowledge.list_datasets(
49
+ name=args.name,
50
+ space_id=args.space_id,
51
+ page_size=args.page_size,
52
+ page_num=args.page_num,
53
+ format_type=args.format_type,
54
+ )
55
+
56
+
57
+ def _cmd_create_dataset(args: argparse.Namespace) -> Any:
58
+ return knowledge.create_dataset(
59
+ args.name,
60
+ description=args.description,
61
+ space_id=args.space_id,
62
+ format_type=args.format_type,
63
+ source_type=args.source_type,
64
+ engine_type=args.engine_type,
65
+ access_scope=args.access_scope,
66
+ )
67
+
68
+
69
+ def _cmd_ensure_dataset(args: argparse.Namespace) -> Any:
70
+ return knowledge.ensure_dataset(args.name, description=args.description, space_id=args.space_id)
71
+
72
+
73
+ def _cmd_get_dataset(args: argparse.Namespace) -> Any:
74
+ return knowledge.get_dataset(args.dataset_id)
75
+
76
+
77
+ def _cmd_delete_dataset(args: argparse.Namespace) -> Any:
78
+ return knowledge.delete_dataset(args.dataset_id)
79
+
80
+
81
+ def _cmd_add(args: argparse.Namespace) -> Any:
82
+ selector = _dataset_selector(args)
83
+ chunk_config = _chunk_config(args)
84
+ if args.content is not None:
85
+ return knowledge.add_text(args.content, name=args.name or "document.txt", chunk_config=chunk_config, **selector)
86
+ if args.url is not None:
87
+ return knowledge.add_url(args.url, name=args.name, chunk_config=chunk_config, **selector)
88
+ return knowledge.add_documents(
89
+ [
90
+ knowledge.KnowledgeDocument(
91
+ source=knowledge.DataSourceType.URI,
92
+ source_file_id=args.source_file_id,
93
+ name=args.name,
94
+ file_type=args.file_type,
95
+ )
96
+ ],
97
+ chunk_config=chunk_config,
98
+ **selector,
99
+ )
100
+
101
+
102
+ def _cmd_search(args: argparse.Namespace) -> Any:
103
+ return knowledge.search(
104
+ args.query,
105
+ dataset_id=args.dataset_id,
106
+ dataset_ids=args.dataset_ids,
107
+ dataset_name=args.dataset,
108
+ dataset_names=args.datasets,
109
+ top_k=args.top_k,
110
+ min_score=args.min_score,
111
+ candidate_top_k=args.candidate_top_k,
112
+ search_method=args.search_method,
113
+ enable_rerank=args.enable_rerank,
114
+ )
115
+
116
+
117
+ def _cmd_documents(args: argparse.Namespace) -> Any:
118
+ return knowledge.list_documents(args.dataset_id, page=args.page, size=args.size)
119
+
120
+
121
121
  def _cmd_delete_documents(args: argparse.Namespace) -> Any:
122
122
  return knowledge.delete_documents(args.dataset_id, args.document_id)
123
123
 
@@ -345,17 +345,17 @@ def _cmd_enterprise_delete_object(args: argparse.Namespace) -> Any:
345
345
  def _cmd_enterprise_object_task(args: argparse.Namespace) -> Any:
346
346
  return enterprise_knowledge.get_object_upload_task(args.task_id)
347
347
 
348
-
349
- def _add_dataset_selector(parser: argparse.ArgumentParser) -> None:
350
- dataset = parser.add_mutually_exclusive_group(required=True)
351
- dataset.add_argument("--dataset-id", default=None, help="Knowledge dataset ID")
352
- dataset.add_argument("--dataset", default=None, help="Knowledge dataset name")
353
-
354
-
348
+
349
+ def _add_dataset_selector(parser: argparse.ArgumentParser) -> None:
350
+ dataset = parser.add_mutually_exclusive_group(required=True)
351
+ dataset.add_argument("--dataset-id", default=None, help="Knowledge dataset ID")
352
+ dataset.add_argument("--dataset", default=None, help="Knowledge dataset name")
353
+
354
+
355
355
  def _add_chunk_args(parser: argparse.ArgumentParser) -> None:
356
- parser.add_argument("--separator", default=None, help="Chunk separator, default newline")
357
- parser.add_argument("--max-tokens", type=int, default=None, help="Max tokens per chunk, default 2000")
358
- parser.add_argument("--remove-extra-spaces", action="store_true")
356
+ parser.add_argument("--separator", default=None, help="Chunk separator, default newline")
357
+ parser.add_argument("--max-tokens", type=int, default=None, help="Max tokens per chunk, default 2000")
358
+ parser.add_argument("--remove-extra-spaces", action="store_true")
359
359
  parser.add_argument("--remove-urls-emails", action="store_true")
360
360
 
361
361
 
@@ -576,74 +576,74 @@ def _add_enterprise_parser(
576
576
 
577
577
 
578
578
  def add_knowledge_parser(subparsers: argparse._SubParsersAction[argparse.ArgumentParser]) -> None:
579
- knowledge_parser = subparsers.add_parser("knowledge", help="Call LICOS Knowledge APIs")
580
- knowledge_subparsers = knowledge_parser.add_subparsers(dest="knowledge_command", required=True)
581
-
582
- _set_handler(knowledge_subparsers.add_parser("runtime", help="Show knowledge runtime status"), _cmd_runtime)
583
- _set_handler(knowledge_subparsers.add_parser("model-catalog", help="Show knowledge model catalog"), _cmd_model_catalog)
584
-
585
- datasets = knowledge_subparsers.add_parser("datasets", help="List knowledge datasets")
586
- datasets.add_argument("--name", default=None, help="Filter by dataset name")
587
- datasets.add_argument("--space-id", default=None)
588
- datasets.add_argument("--format-type", type=int, default=None)
589
- datasets.add_argument("--page-size", type=int, default=None)
590
- datasets.add_argument("--page-num", type=int, default=None)
591
- _set_handler(datasets, _cmd_datasets)
592
-
593
- create_dataset = knowledge_subparsers.add_parser("create-dataset", help="Create a knowledge dataset")
594
- create_dataset.add_argument("name")
595
- create_dataset.add_argument("--description", default=None)
596
- create_dataset.add_argument("--space-id", default=None)
597
- create_dataset.add_argument("--format-type", type=int, default=None)
598
- create_dataset.add_argument("--source-type", default=None)
599
- create_dataset.add_argument("--engine-type", default=None)
600
- create_dataset.add_argument("--access-scope", default=None)
601
- _set_handler(create_dataset, _cmd_create_dataset)
602
-
603
- ensure_dataset = knowledge_subparsers.add_parser("ensure-dataset", help="Find a dataset by name or create it")
604
- ensure_dataset.add_argument("name")
605
- ensure_dataset.add_argument("--description", default=None)
606
- ensure_dataset.add_argument("--space-id", default=None)
607
- _set_handler(ensure_dataset, _cmd_ensure_dataset)
608
-
609
- get_dataset = knowledge_subparsers.add_parser("get-dataset", help="Get one knowledge dataset")
610
- get_dataset.add_argument("dataset_id")
611
- _set_handler(get_dataset, _cmd_get_dataset)
612
-
613
- delete_dataset = knowledge_subparsers.add_parser("delete-dataset", help="Delete one knowledge dataset")
614
- delete_dataset.add_argument("dataset_id")
615
- _set_handler(delete_dataset, _cmd_delete_dataset)
616
-
617
- add = knowledge_subparsers.add_parser("add", help="Import text, URL, or object-storage file into a dataset")
618
- _add_dataset_selector(add)
619
- source = add.add_mutually_exclusive_group(required=True)
620
- source.add_argument("--content", default=None, help="Raw text content to import")
621
- source.add_argument("--url", default=None, help="Web URL to import")
622
- source.add_argument("--source-file-id", default=None, help="Object storage file ID or URI to import")
623
- add.add_argument("--name", default=None, help="Document display name")
624
- add.add_argument("--file-type", default=None, help="File type for source-file-id import")
625
- _add_chunk_args(add)
626
- _set_handler(add, _cmd_add)
627
-
628
- search = knowledge_subparsers.add_parser("search", help="Search knowledge datasets semantically")
629
- search.add_argument("--query", "-q", required=True)
630
- search.add_argument("--dataset-id", action="append", dest="dataset_ids", default=None, help="Dataset ID; can repeat")
631
- search.add_argument("--dataset", action="append", dest="datasets", default=None, help="Dataset name; can repeat")
632
- search.add_argument("--top-k", type=int, default=5)
633
- search.add_argument("--min-score", type=float, default=0.0)
634
- search.add_argument("--candidate-top-k", type=int, default=None)
635
- search.add_argument("--search-method", default=None)
636
- search.add_argument("--enable-rerank", action="store_true", default=None)
637
- search.set_defaults(dataset_id=None, dataset=None)
638
- _set_handler(search, _cmd_search)
639
-
640
- documents = knowledge_subparsers.add_parser("documents", help="List documents in a dataset")
641
- documents.add_argument("dataset_id")
642
- documents.add_argument("--page", type=int, default=None)
643
- documents.add_argument("--size", type=int, default=None)
644
- _set_handler(documents, _cmd_documents)
645
-
646
- delete_documents = knowledge_subparsers.add_parser("delete-documents", help="Delete documents from a dataset")
579
+ knowledge_parser = subparsers.add_parser("knowledge", help="Call LICOS Knowledge APIs")
580
+ knowledge_subparsers = knowledge_parser.add_subparsers(dest="knowledge_command", required=True)
581
+
582
+ _set_handler(knowledge_subparsers.add_parser("runtime", help="Show knowledge runtime status"), _cmd_runtime)
583
+ _set_handler(knowledge_subparsers.add_parser("model-catalog", help="Show knowledge model catalog"), _cmd_model_catalog)
584
+
585
+ datasets = knowledge_subparsers.add_parser("datasets", help="List knowledge datasets")
586
+ datasets.add_argument("--name", default=None, help="Filter by dataset name")
587
+ datasets.add_argument("--space-id", default=None)
588
+ datasets.add_argument("--format-type", type=int, default=None)
589
+ datasets.add_argument("--page-size", type=int, default=None)
590
+ datasets.add_argument("--page-num", type=int, default=None)
591
+ _set_handler(datasets, _cmd_datasets)
592
+
593
+ create_dataset = knowledge_subparsers.add_parser("create-dataset", help="Create a knowledge dataset")
594
+ create_dataset.add_argument("name")
595
+ create_dataset.add_argument("--description", default=None)
596
+ create_dataset.add_argument("--space-id", default=None)
597
+ create_dataset.add_argument("--format-type", type=int, default=None)
598
+ create_dataset.add_argument("--source-type", default=None)
599
+ create_dataset.add_argument("--engine-type", default=None)
600
+ create_dataset.add_argument("--access-scope", default=None)
601
+ _set_handler(create_dataset, _cmd_create_dataset)
602
+
603
+ ensure_dataset = knowledge_subparsers.add_parser("ensure-dataset", help="Find a dataset by name or create it")
604
+ ensure_dataset.add_argument("name")
605
+ ensure_dataset.add_argument("--description", default=None)
606
+ ensure_dataset.add_argument("--space-id", default=None)
607
+ _set_handler(ensure_dataset, _cmd_ensure_dataset)
608
+
609
+ get_dataset = knowledge_subparsers.add_parser("get-dataset", help="Get one knowledge dataset")
610
+ get_dataset.add_argument("dataset_id")
611
+ _set_handler(get_dataset, _cmd_get_dataset)
612
+
613
+ delete_dataset = knowledge_subparsers.add_parser("delete-dataset", help="Delete one knowledge dataset")
614
+ delete_dataset.add_argument("dataset_id")
615
+ _set_handler(delete_dataset, _cmd_delete_dataset)
616
+
617
+ add = knowledge_subparsers.add_parser("add", help="Import text, URL, or object-storage file into a dataset")
618
+ _add_dataset_selector(add)
619
+ source = add.add_mutually_exclusive_group(required=True)
620
+ source.add_argument("--content", default=None, help="Raw text content to import")
621
+ source.add_argument("--url", default=None, help="Web URL to import")
622
+ source.add_argument("--source-file-id", default=None, help="Object storage file ID or URI to import")
623
+ add.add_argument("--name", default=None, help="Document display name")
624
+ add.add_argument("--file-type", default=None, help="File type for source-file-id import")
625
+ _add_chunk_args(add)
626
+ _set_handler(add, _cmd_add)
627
+
628
+ search = knowledge_subparsers.add_parser("search", help="Search knowledge datasets semantically")
629
+ search.add_argument("--query", "-q", required=True)
630
+ search.add_argument("--dataset-id", action="append", dest="dataset_ids", default=None, help="Dataset ID; can repeat")
631
+ search.add_argument("--dataset", action="append", dest="datasets", default=None, help="Dataset name; can repeat")
632
+ search.add_argument("--top-k", type=int, default=5)
633
+ search.add_argument("--min-score", type=float, default=0.0)
634
+ search.add_argument("--candidate-top-k", type=int, default=None)
635
+ search.add_argument("--search-method", default=None)
636
+ search.add_argument("--enable-rerank", action="store_true", default=None)
637
+ search.set_defaults(dataset_id=None, dataset=None)
638
+ _set_handler(search, _cmd_search)
639
+
640
+ documents = knowledge_subparsers.add_parser("documents", help="List documents in a dataset")
641
+ documents.add_argument("dataset_id")
642
+ documents.add_argument("--page", type=int, default=None)
643
+ documents.add_argument("--size", type=int, default=None)
644
+ _set_handler(documents, _cmd_documents)
645
+
646
+ delete_documents = knowledge_subparsers.add_parser("delete-documents", help="Delete documents from a dataset")
647
647
  delete_documents.add_argument("dataset_id")
648
648
  delete_documents.add_argument("document_id", nargs="+")
649
649
  _set_handler(delete_documents, _cmd_delete_documents)
@@ -84,6 +84,18 @@ def _cmd_nodes(_args: argparse.Namespace) -> Any:
84
84
  return uns.list_nodes()
85
85
 
86
86
 
87
+ def _cmd_node_get(args: argparse.Namespace) -> Any:
88
+ return uns.get_node(args.node_id)
89
+
90
+
91
+ def _cmd_node_children(args: argparse.Namespace) -> Any:
92
+ return uns.list_children(
93
+ args.node_id,
94
+ recursive=args.recursive,
95
+ kind=args.kind,
96
+ )
97
+
98
+
87
99
  def _cmd_node_create(args: argparse.Namespace) -> Any:
88
100
  return uns.create_node(_object(args.json, "node"))
89
101
 
@@ -114,6 +126,14 @@ def _cmd_templates(_args: argparse.Namespace) -> Any:
114
126
  return uns.list_templates()
115
127
 
116
128
 
129
+ def _cmd_template_get(args: argparse.Namespace) -> Any:
130
+ return uns.get_template(args.template_id)
131
+
132
+
133
+ def _cmd_template_nodes(args: argparse.Namespace) -> Any:
134
+ return uns.list_nodes_by_template(args.template_id)
135
+
136
+
117
137
  def _cmd_template_create(args: argparse.Namespace) -> Any:
118
138
  return uns.create_template(_object(args.json, "template"))
119
139
 
@@ -132,6 +152,14 @@ def _cmd_labels(_args: argparse.Namespace) -> Any:
132
152
  return uns.list_labels()
133
153
 
134
154
 
155
+ def _cmd_label_get(args: argparse.Namespace) -> Any:
156
+ return uns.get_label(args.label_id)
157
+
158
+
159
+ def _cmd_label_node_list(args: argparse.Namespace) -> Any:
160
+ return uns.list_nodes_by_label(args.label_id)
161
+
162
+
135
163
  def _cmd_label_create(args: argparse.Namespace) -> Any:
136
164
  return uns.create_label(_object(args.json, "label"))
137
165
 
@@ -281,6 +309,17 @@ def add_uns_parser(subparsers: argparse._SubParsersAction[argparse.ArgumentParse
281
309
  _set_handler(wait, _cmd_wait)
282
310
 
283
311
  _set_handler(commands.add_parser("nodes", help="List tenant UNS nodes"), _cmd_nodes)
312
+ node_get = commands.add_parser("node-get", help="Get one UNS node by ID")
313
+ node_get.add_argument("node_id")
314
+ _set_handler(node_get, _cmd_node_get)
315
+ node_children = commands.add_parser(
316
+ "node-children",
317
+ help="List direct or recursive children of one UNS node",
318
+ )
319
+ node_children.add_argument("node_id")
320
+ node_children.add_argument("--recursive", action="store_true")
321
+ node_children.add_argument("--kind", choices=("FOLDER", "FILE"))
322
+ _set_handler(node_children, _cmd_node_children)
284
323
  node_create = commands.add_parser("node-create", help="Create one UNS folder or file")
285
324
  _add_json_argument(node_create, "node")
286
325
  _set_handler(node_create, _cmd_node_create)
@@ -308,6 +347,15 @@ def add_uns_parser(subparsers: argparse._SubParsersAction[argparse.ArgumentParse
308
347
  _cmd_template_update,
309
348
  _cmd_template_delete,
310
349
  )
350
+ template_get = commands.add_parser("template-get", help="Get one UNS template by ID")
351
+ template_get.add_argument("template_id")
352
+ _set_handler(template_get, _cmd_template_get)
353
+ template_nodes = commands.add_parser(
354
+ "template-nodes",
355
+ help="List UNS nodes using one template",
356
+ )
357
+ template_nodes.add_argument("template_id")
358
+ _set_handler(template_nodes, _cmd_template_nodes)
311
359
  _add_resource_commands(
312
360
  commands,
313
361
  "label",
@@ -316,6 +364,15 @@ def add_uns_parser(subparsers: argparse._SubParsersAction[argparse.ArgumentParse
316
364
  _cmd_label_update,
317
365
  _cmd_label_delete,
318
366
  )
367
+ label_get = commands.add_parser("label-get", help="Get one UNS label by ID")
368
+ label_get.add_argument("label_id")
369
+ _set_handler(label_get, _cmd_label_get)
370
+ label_node_list = commands.add_parser(
371
+ "label-node-list",
372
+ help="List UNS nodes assigned to one label",
373
+ )
374
+ label_node_list.add_argument("label_id")
375
+ _set_handler(label_node_list, _cmd_label_node_list)
319
376
  label_nodes = commands.add_parser("label-nodes", help="Replace all nodes assigned to one label")
320
377
  label_nodes.add_argument("label_id")
321
378
  label_nodes.add_argument("--node-ids-json", required=True)
@@ -295,7 +295,7 @@ class PlatformCliTests(unittest.TestCase):
295
295
 
296
296
  def test_uns_collectors_forwards_source_type_and_pagination(self) -> None:
297
297
  with mock.patch.object(
298
- uns_commands.uns, "list_collectors", return_value={"records": []}
298
+ uns_commands.uns, "list_collectors", return_value={"items": []}
299
299
  ) as collectors:
300
300
  code, stdout, stderr = run_cli(
301
301
  "uns",
@@ -310,13 +310,49 @@ class PlatformCliTests(unittest.TestCase):
310
310
 
311
311
  self.assertEqual(code, 0)
312
312
  self.assertEqual(stderr, "")
313
- self.assertEqual(json.loads(stdout), {"records": []})
313
+ self.assertEqual(json.loads(stdout), {"items": []})
314
314
  collectors.assert_called_once_with(
315
315
  "IOT_POINT_COLLECTOR",
316
316
  page=2,
317
317
  page_size=50,
318
318
  )
319
319
 
320
+ def test_uns_targeted_queries_forward_filters(self) -> None:
321
+ with mock.patch.object(
322
+ uns_commands.uns,
323
+ "list_children",
324
+ return_value=[{"id": "node-2"}],
325
+ ) as children:
326
+ code, stdout, stderr = run_cli(
327
+ "uns",
328
+ "node-children",
329
+ "node-1",
330
+ "--recursive",
331
+ "--kind",
332
+ "FILE",
333
+ )
334
+
335
+ self.assertEqual(code, 0)
336
+ self.assertEqual(stderr, "")
337
+ self.assertEqual(json.loads(stdout), [{"id": "node-2"}])
338
+ children.assert_called_once_with("node-1", recursive=True, kind="FILE")
339
+
340
+ with mock.patch.object(
341
+ uns_commands.uns,
342
+ "list_nodes_by_template",
343
+ return_value=[{"id": "node-3"}],
344
+ ) as template_nodes:
345
+ code, stdout, stderr = run_cli(
346
+ "uns",
347
+ "template-nodes",
348
+ "template-1",
349
+ )
350
+
351
+ self.assertEqual(code, 0)
352
+ self.assertEqual(stderr, "")
353
+ self.assertEqual(json.loads(stdout), [{"id": "node-3"}])
354
+ template_nodes.assert_called_once_with("template-1")
355
+
320
356
  def test_storage_files_wraps_sdk_and_outputs_json(self) -> None:
321
357
  with mock.patch.object(storage_commands.storage, "list_files", return_value=[{"id": "file-1"}]) as list_files:
322
358
  code, stdout, stderr = run_cli("storage", "files")