ndi-cli 0.25.0__tar.gz → 0.27.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.
- {ndi_cli-0.25.0 → ndi_cli-0.27.0}/PKG-INFO +2 -3
- {ndi_cli-0.25.0 → ndi_cli-0.27.0}/README.md +1 -2
- {ndi_cli-0.25.0 → ndi_cli-0.27.0}/pyproject.toml +1 -1
- {ndi_cli-0.25.0 → ndi_cli-0.27.0}/pyproject.toml.orig +1 -1
- {ndi_cli-0.25.0 → ndi_cli-0.27.0}/src/ndi_cli/__init__.py +1 -1
- {ndi_cli-0.25.0 → ndi_cli-0.27.0}/src/ndi_cli/_cli.py +1 -1
- {ndi_cli-0.25.0 → ndi_cli-0.27.0}/src/ndi_cli/_output.py +4 -1
- {ndi_cli-0.25.0 → ndi_cli-0.27.0}/src/ndi_cli/_systemone.py +11 -2
- {ndi_cli-0.25.0 → ndi_cli-0.27.0}/src/ndi_cli/_workspace.py +7 -51
- {ndi_cli-0.25.0 → ndi_cli-0.27.0}/LICENSE +0 -0
- {ndi_cli-0.25.0 → ndi_cli-0.27.0}/src/ndi_cli/_config.py +0 -0
- {ndi_cli-0.25.0 → ndi_cli-0.27.0}/src/ndi_cli/_docops.py +0 -0
- {ndi_cli-0.25.0 → ndi_cli-0.27.0}/src/ndi_cli/_entrypoint.py +0 -0
- {ndi_cli-0.25.0 → ndi_cli-0.27.0}/src/ndi_cli/_jobs.py +0 -0
- {ndi_cli-0.25.0 → ndi_cli-0.27.0}/src/ndi_cli/_local.py +0 -0
- {ndi_cli-0.25.0 → ndi_cli-0.27.0}/src/ndi_cli/_login.py +0 -0
- {ndi_cli-0.25.0 → ndi_cli-0.27.0}/src/ndi_cli/_render.py +0 -0
- {ndi_cli-0.25.0 → ndi_cli-0.27.0}/src/ndi_cli/_sources.py +0 -0
- {ndi_cli-0.25.0 → ndi_cli-0.27.0}/src/ndi_cli/_tools.py +0 -0
- {ndi_cli-0.25.0 → ndi_cli-0.27.0}/src/ndi_cli/commands.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ndi-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.27.0
|
|
4
4
|
Summary: NDI platform CLI: document operations, jobs, workspaces, and the agent workspace tools
|
|
5
5
|
Keywords: ndi,cli,document-intelligence,coding-agents
|
|
6
6
|
Author: Nace AI
|
|
@@ -58,8 +58,7 @@ config location. Workspace-scoped verbs also take `--workspace ID`.
|
|
|
58
58
|
| `ndi files upload\|list\|get\|delete` | Workspace files (a directory walks nested files; `--ingest` then queues ingestion) |
|
|
59
59
|
| `ndi ingest` | Queue ingestion |
|
|
60
60
|
| `ndi automatic-search QUERY` | Service answers with fact search or an agent over files, tables and the catalog (`--mode fact\|agent` skips the routing step, `--path` scopes it to files); prints the route, the output job id, and the answer (plus the catalog table when there is one) |
|
|
61
|
-
| `ndi
|
|
62
|
-
| `ndi filtered-search QUERY` | Corpus filter/rank/count over the metadata catalog (`--path` scopes it to files, `--cursor` pages an earlier run) |
|
|
61
|
+
| `ndi filtered-search --cursor CURSOR` | Page a catalog table past its first rows. A new `filtered-search QUERY` is deprecated: use `automatic-search` |
|
|
63
62
|
| `ndi je-testing QUERY` | Journal-entry testing over a ledger package (`--path` to scope it, `--reasoning-effort` for the thinking budget) |
|
|
64
63
|
| `ndi ledger-understanding start\|get\|sources\|select\|selection` | Measure the ledger package, confirm sources, or read the latest report |
|
|
65
64
|
| `ndi ask-file PATH QUESTION` | Cited answer over one document, image or recording |
|
|
@@ -34,8 +34,7 @@ config location. Workspace-scoped verbs also take `--workspace ID`.
|
|
|
34
34
|
| `ndi files upload\|list\|get\|delete` | Workspace files (a directory walks nested files; `--ingest` then queues ingestion) |
|
|
35
35
|
| `ndi ingest` | Queue ingestion |
|
|
36
36
|
| `ndi automatic-search QUERY` | Service answers with fact search or an agent over files, tables and the catalog (`--mode fact\|agent` skips the routing step, `--path` scopes it to files); prints the route, the output job id, and the answer (plus the catalog table when there is one) |
|
|
37
|
-
| `ndi
|
|
38
|
-
| `ndi filtered-search QUERY` | Corpus filter/rank/count over the metadata catalog (`--path` scopes it to files, `--cursor` pages an earlier run) |
|
|
37
|
+
| `ndi filtered-search --cursor CURSOR` | Page a catalog table past its first rows. A new `filtered-search QUERY` is deprecated: use `automatic-search` |
|
|
39
38
|
| `ndi je-testing QUERY` | Journal-entry testing over a ledger package (`--path` to scope it, `--reasoning-effort` for the thinking budget) |
|
|
40
39
|
| `ndi ledger-understanding start\|get\|sources\|select\|selection` | Measure the ledger package, confirm sources, or read the latest report |
|
|
41
40
|
| `ndi ask-file PATH QUESTION` | Cited answer over one document, image or recording |
|
|
@@ -214,7 +214,7 @@ def _build_parser(*, in_agent_run: bool = False) -> argparse.ArgumentParser:
|
|
|
214
214
|
_docops.add_parsers(sub, common)
|
|
215
215
|
_jobs.add_parsers(sub, common)
|
|
216
216
|
_workspace.add_parsers(sub, common)
|
|
217
|
-
_systemone.add_parsers(sub,
|
|
217
|
+
_systemone.add_parsers(sub, default_timeout=DEFAULT_TIMEOUT_SECONDS)
|
|
218
218
|
return parser
|
|
219
219
|
|
|
220
220
|
|
|
@@ -49,7 +49,8 @@ def shortened(full: str, args, *, get_full: str = "rerun with --json") -> bool:
|
|
|
49
49
|
"""Whether ``full`` is too long for stdout; if so, tell stderr how to get it.
|
|
50
50
|
|
|
51
51
|
A file target is never shortened — the limit protects a reader's context,
|
|
52
|
-
and ``--save`` / ``--out-dir`` asked for the whole thing. ``
|
|
52
|
+
and ``--save`` / ``--out-dir`` asked for the whole thing. A limit of ``0``
|
|
53
|
+
asked for the text rendering, so nothing goes to stderr. ``get_full`` names
|
|
53
54
|
the command that prints it whole.
|
|
54
55
|
"""
|
|
55
56
|
if getattr(args, "save", None) or getattr(args, "out_dir", None):
|
|
@@ -57,6 +58,8 @@ def shortened(full: str, args, *, get_full: str = "rerun with --json") -> bool:
|
|
|
57
58
|
limit = output_limit()
|
|
58
59
|
if len(full) <= limit:
|
|
59
60
|
return False
|
|
61
|
+
if limit == 0:
|
|
62
|
+
return True
|
|
60
63
|
print(
|
|
61
64
|
f"note: output shortened — the full response is {len(full):,} chars, over the {limit:,} limit "
|
|
62
65
|
f"(${OUTPUT_LIMIT_ENV}); {get_full} for all of it",
|
|
@@ -15,15 +15,24 @@ from ndi_cli import _render
|
|
|
15
15
|
from ndi_cli._workspace import _dump_or_text
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
def add_parsers(sub: argparse._SubParsersAction,
|
|
18
|
+
def add_parsers(sub: argparse._SubParsersAction, *, default_timeout: float) -> None:
|
|
19
19
|
systemone = sub.add_parser(
|
|
20
20
|
"systemone",
|
|
21
|
-
parents=[common],
|
|
22
21
|
help="Answer noul, choice, and score questions about a state.",
|
|
23
22
|
description=(
|
|
24
23
|
"Answer typed questions about a state in one call. A VALUE is inline, @FILE reads a file, and @- reads stdin."
|
|
25
24
|
),
|
|
26
25
|
)
|
|
26
|
+
systemone.add_argument(
|
|
27
|
+
"--json", action="store_true", help="Always print the full response JSON, never the shortened text rendering."
|
|
28
|
+
)
|
|
29
|
+
systemone.add_argument(
|
|
30
|
+
"--timeout",
|
|
31
|
+
type=float,
|
|
32
|
+
default=default_timeout,
|
|
33
|
+
metavar="SECONDS",
|
|
34
|
+
help=f"HTTP timeout for the call (default {default_timeout:.0f}s).",
|
|
35
|
+
)
|
|
27
36
|
state = systemone.add_mutually_exclusive_group(required=True)
|
|
28
37
|
state.add_argument("--state", default=None, metavar="VALUE", help="The state as text.")
|
|
29
38
|
state.add_argument("--state-json", default=None, metavar="VALUE", help="The state as any JSON value.")
|
|
@@ -117,29 +117,6 @@ def add_parsers(sub: argparse._SubParsersAction, common: argparse.ArgumentParser
|
|
|
117
117
|
add_job_output_args(ingest)
|
|
118
118
|
ingest.set_defaults(run=_run_ingest, family="workspace", needs_workspace=True, needs_client=True)
|
|
119
119
|
|
|
120
|
-
deep = sub.add_parser("deep-search", parents=[common], help="Run an agentic workspace search.")
|
|
121
|
-
deep.add_argument("query")
|
|
122
|
-
deep.add_argument("--prefix", default=None, dest="path_prefix")
|
|
123
|
-
deep.add_argument(
|
|
124
|
-
"--path",
|
|
125
|
-
action="append",
|
|
126
|
-
dest="paths",
|
|
127
|
-
default=None,
|
|
128
|
-
help="Add this file to the scope (with --prefix: the folder's files plus these); repeatable.",
|
|
129
|
-
)
|
|
130
|
-
_add_context_args(deep)
|
|
131
|
-
add_job_output_args(deep)
|
|
132
|
-
deep.set_defaults(run=_run_deep_search, family="workspace", needs_workspace=True, needs_client=True)
|
|
133
|
-
|
|
134
|
-
fact = sub.add_parser("fact-search", parents=[common], help="Run the fixed single-shot search pipeline.")
|
|
135
|
-
fact.add_argument("query")
|
|
136
|
-
fact.add_argument("--prefix", default=None, dest="path_prefix")
|
|
137
|
-
fact.add_argument("--path", action="append", dest="paths", default=None, help="Scope to this file; repeatable.")
|
|
138
|
-
fact.add_argument("--top-k", type=int, default=None)
|
|
139
|
-
_add_context_args(fact)
|
|
140
|
-
add_job_output_args(fact)
|
|
141
|
-
fact.set_defaults(run=_run_fact_search, family="workspace", needs_workspace=True, needs_client=True)
|
|
142
|
-
|
|
143
120
|
# No --effort, --session-id, or --allow-clarification: the route is single-shot.
|
|
144
121
|
automatic = sub.add_parser(
|
|
145
122
|
"automatic-search",
|
|
@@ -161,7 +138,9 @@ def add_parsers(sub: argparse._SubParsersAction, common: argparse.ArgumentParser
|
|
|
161
138
|
automatic.set_defaults(run=_run_automatic_search, family="workspace", needs_workspace=True, needs_client=True)
|
|
162
139
|
|
|
163
140
|
filtered = sub.add_parser(
|
|
164
|
-
"filtered-search",
|
|
141
|
+
"filtered-search",
|
|
142
|
+
parents=[common],
|
|
143
|
+
help="Page a catalog table with --cursor. A new query here is deprecated: use automatic-search.",
|
|
165
144
|
)
|
|
166
145
|
filtered.add_argument("query", nargs="?", default=None)
|
|
167
146
|
filtered.add_argument(
|
|
@@ -172,8 +151,7 @@ def add_parsers(sub: argparse._SubParsersAction, common: argparse.ArgumentParser
|
|
|
172
151
|
_add_context_args(filtered)
|
|
173
152
|
# No --result-unit: the server deprecates the grouping override and returns
|
|
174
153
|
# catalog entries. No --allow-clarification: a clarification is answered by a
|
|
175
|
-
# new initial query, and a shell has nowhere to keep the thread
|
|
176
|
-
# deep-search omits --session-id.
|
|
154
|
+
# new initial query, and a shell has nowhere to keep the thread.
|
|
177
155
|
add_job_output_args(filtered)
|
|
178
156
|
filtered.set_defaults(run=_run_filtered_search, family="workspace", needs_workspace=True, needs_client=True)
|
|
179
157
|
|
|
@@ -189,8 +167,7 @@ def add_parsers(sub: argparse._SubParsersAction, common: argparse.ArgumentParser
|
|
|
189
167
|
help="Add this file to the scope (with --prefix: the folder's files plus these); repeatable.",
|
|
190
168
|
)
|
|
191
169
|
_add_context_args(jet)
|
|
192
|
-
# No --session-id
|
|
193
|
-
# to keep a thread. Omitting --reasoning-effort uses the service default.
|
|
170
|
+
# No --session-id: a shell has nowhere to keep a thread. Omitting --reasoning-effort uses the service default.
|
|
194
171
|
add_job_output_args(jet)
|
|
195
172
|
jet.set_defaults(run=_run_je_testing, family="workspace", needs_workspace=True, needs_client=True)
|
|
196
173
|
|
|
@@ -537,29 +514,6 @@ def _run_ingest(client: NdiClient, workspace_id: str, args: argparse.Namespace)
|
|
|
537
514
|
return _finish_job(client, job, args, _render.ingestion_job, "ingest")
|
|
538
515
|
|
|
539
516
|
|
|
540
|
-
def _run_deep_search(client: NdiClient, workspace_id: str, args: argparse.Namespace) -> int:
|
|
541
|
-
job = client.search.deep(
|
|
542
|
-
workspace_id,
|
|
543
|
-
query=args.query,
|
|
544
|
-
context=args.context,
|
|
545
|
-
path_prefix=args.path_prefix,
|
|
546
|
-
paths=args.paths,
|
|
547
|
-
)
|
|
548
|
-
return _finish_job(client, job, args, _render.search_job, "deep-search")
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
def _run_fact_search(client: NdiClient, workspace_id: str, args: argparse.Namespace) -> int:
|
|
552
|
-
job = client.search.fact(
|
|
553
|
-
workspace_id,
|
|
554
|
-
query=args.query,
|
|
555
|
-
context=args.context,
|
|
556
|
-
path_prefix=args.path_prefix,
|
|
557
|
-
paths=args.paths,
|
|
558
|
-
top_k=args.top_k,
|
|
559
|
-
)
|
|
560
|
-
return _finish_job(client, job, args, _render.search_job, "fact-search")
|
|
561
|
-
|
|
562
|
-
|
|
563
517
|
def _run_automatic_search(client: NdiClient, workspace_id: str, args: argparse.Namespace) -> int:
|
|
564
518
|
job = client.search.automatic(
|
|
565
519
|
workspace_id,
|
|
@@ -592,6 +546,8 @@ def _run_filtered_search(client: NdiClient, workspace_id: str, args: argparse.Na
|
|
|
592
546
|
return 2
|
|
593
547
|
job = client.search.filtered_page(workspace_id, cursor=args.cursor)
|
|
594
548
|
else:
|
|
549
|
+
# On stderr, where a script's parsed stdout never sees it; the query still runs.
|
|
550
|
+
print("note: filtered-search QUERY is deprecated and will be removed; use automatic-search.", file=sys.stderr)
|
|
595
551
|
job = client.search.filtered(
|
|
596
552
|
workspace_id,
|
|
597
553
|
query=args.query,
|
|
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
|