@juspay/neurolink 13.4.1 → 13.4.3
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.
- package/CHANGELOG.md +2 -2
- package/README.md +33 -8
- package/dist/auth/providers/BaseAuthProvider.d.ts +1 -1
- package/dist/browser/neurolink.min.js +397 -397
- package/dist/processors/document/PptxProcessor.d.ts +16 -5
- package/dist/processors/document/PptxProcessor.js +145 -17
- package/docs-site/static/search-index.json +53 -64
- package/package.json +2 -2
|
@@ -773,7 +773,7 @@
|
|
|
773
773
|
{"objectID":"f007d6256ae9ce3cd888b757374cf819d6d20a2466de5280aa882385928dfa42","title":"Install globally","url":"/docs/cli/commands#install-globally","content":"npm install -g @juspay/neurolink","hierarchy":{"lvl0":"Cli","lvl1":"CLI Command Reference","lvl2":"Install globally","lvl3":""}},
|
|
774
774
|
{"objectID":"fe8f683c688c22a4fb00ea52ec4f803cc988e40adedfb184ae651f06394d7d87","title":"Local project dependency","url":"/docs/cli/commands#local-project-dependency","content":"npm install @juspay/neurolink\n`","hierarchy":{"lvl0":"Cli","lvl1":"CLI Command Reference","lvl2":"Local project dependency","lvl3":""}},
|
|
775
775
|
{"objectID":"6d0358f7c107fa0314373826a28ae5ced11a8739cb937a2e595a91d9b60e762c","title":"Command Map","url":"/docs/cli/commands#command-map","content":"| Command | Description | Example |\n| ---------------------- | ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- |\n| generate / gen | One-shot content generation with optional multimodal input. | npx @juspay/neurolink generate \"Draft release notes\" --image ./before.png |\n| stream | Real-time streaming output with tool support. | npx @juspay/neurolink stream \"Narrate sprint demo\" --enableAnalytics |\n| decide [state] | Typed, calibrated judgements from a decision model (no free text). | npx @juspay/neurolink decide \"Refund request\" --questions '{\"urgent\":{\"type\":\"boolean\",\"instructions\":\"Is this urgent?\"}}' |\n| transcribe <file\\|-> | Audio to text; local engine by default, dictionary and correction. | npx @juspay/neurolink transcribe meeting.wav --format srt |\n| batch | Process multiple prompts from a file. | npx @juspay/neurolink batch prompts.txt --format json |\n| loop | Interactive session with persistent variables & memory. | npx @juspay/neurolink loop --auto-redis |\n| auth <subcommand> | Manage provider authentication (API key or OAuth).","hierarchy":{"lvl0":"Cli","lvl1":"CLI Command Reference","lvl2":"Command Map","lvl3":""}},
|
|
776
|
-
{"objectID":"b149865b2facf38f974af3ecc7a0bfaee49be27a20c207ed01c32b26247fd099","title":"generate <input>","url":"/docs/cli/commands#generate","content":"Key flags:\n--provider, -p – provider slug (default auto).\n--model, -m – model name for the chosen provider.\n--image, -i – attach one or more image files/URLs for multimodal prompts.\n--pdf – attach one or more PDF files for document analysis.\n--csv, -c – attach one or more CSV files for data analysis.\n--file – attach any supported file type, auto-detected. Covers Office documents (Word .docx, Excel .xlsx/.xls, PowerPoint .pptx, RTF, OpenDocument), audio (.mp3, .wav, .m4a, … — transcribed automatically), video (.mp4, .webm, .mov, .mkv — keyframes plus metadata and any embedded subtitles), archives, JSON, YAML, XML, HTML, SVG, Markdown, and 50+ code languages. Repeatable. Not available on batch, where it would collide with the prompts-file positional — use generate or stream.\n--temperature, -t – creativity (default 0.7).\n--maxTokens, --max – response limit (default 1000).\n--system, -s – system prompt.\n--format, -f, --output-format – text (default), json, or table. With json, stdout carries only the JSON result; debug and info logs go to stderr, so the output stays parseable even with --debug.\n--output, -o – write response to file.\n--imageOutput, --image-output – custom path for generated image (default: generated-images/image-<timestamp>.png).\n--enableAnalytics / --enableEvaluation – capture metrics & quality scores.\n--evaluationDomain – domain hint for the judge model.\n--domainAware – use domain-aware evaluation (default false).\n--context – JSON string appended to analytics/evaluation context.\n--domain, -d – domain type for specialized processing: healthcare, finance, analytics, ecommerce, education, legal, technology, generic, auto.\n--disableTools – bypass MCP tools for this call.\n--timeout – seconds before aborting the request (default 120).\n--region, -r – Vertex AI region (e.g., us-central1, europe-west1, asia-northeast1)
|
|
776
|
+
{"objectID":"b149865b2facf38f974af3ecc7a0bfaee49be27a20c207ed01c32b26247fd099","title":"generate <input>","url":"/docs/cli/commands#generate","content":"Key flags:\n--provider, -p – provider slug (default auto).\n--model, -m – model name for the chosen provider.\n--image, -i – attach one or more image files/URLs for multimodal prompts.\n--pdf – attach one or more PDF files for document analysis.\n--csv, -c – attach one or more CSV files for data analysis.\n--file – attach any supported file type, auto-detected. Covers Office documents (Word .docx, Excel .xlsx/.xls, PowerPoint .pptx, RTF, OpenDocument), audio (.mp3, .wav, .m4a, … — transcribed automatically), video (.mp4, .webm, .mov, .mkv — Gemini providers receive the clip itself, up to 14 MB; every other provider receives keyframes plus metadata and any embedded subtitles), archives, JSON, YAML, XML, HTML, SVG, Markdown, and 50+ code languages. Repeatable. Not available on batch, where it would collide with the prompts-file positional — use generate or stream.\n--temperature, -t – creativity (default 0.7).\n--maxTokens, --max – response limit (default 1000).\n--system, -s – system prompt.\n--format, -f, --output-format – text (default), json, or table. With json, stdout carries only the JSON result; debug and info logs go to stderr, so the output stays parseable even with --debug.\n--output, -o – write response to file.\n--imageOutput, --image-output – custom path for generated image (default: generated-images/image-<timestamp>.png).\n--enableAnalytics / --enableEvaluation – capture metrics & quality scores.\n--evaluationDomain – domain hint for the judge model.\n--domainAware – use domain-aware evaluation (default false).\n--context – JSON string appended to analytics/evaluation context.\n--domain, -d – domain type for specialized processing: healthcare, finance, analytics, ecommerce, education, legal, technology, generic, auto.\n--disableTools – bypass MCP tools for this call.\n--timeout – seconds before aborting the request (default 120).\n--region, -r – Vertex AI region (e.g., us-central1, europe-west1, asia-northeast1).","hierarchy":{"lvl0":"Cli","lvl1":"CLI Command Reference","lvl2":"generate <input>","lvl3":""}},
|
|
777
777
|
{"objectID":"621800e7302c71eae24c4286bcb9e05a8e110cf656e2a2d339bd8ecbe998d32e","title":"Generate with explicit subscription tier","url":"/docs/cli/commands#generate-with-explicit-subscription-tier","content":"npx @juspay/neurolink generate \"Explain quantum computing\" \\\n --provider anthropic --subscription-tier pro","hierarchy":{"lvl0":"Cli","lvl1":"CLI Command Reference","lvl2":"Generate with explicit subscription tier","lvl3":""}},
|
|
778
778
|
{"objectID":"ad3c3b350fe961788a9aad769e12752ba4a17c25fbc14e3aeec6374cfb865d0c","title":"Generate with OAuth auth method","url":"/docs/cli/commands#generate-with-oauth-auth-method","content":"npx @juspay/neurolink generate \"Write a poem\" \\\n --provider anthropic --authMethod oauth --enableBeta","hierarchy":{"lvl0":"Cli","lvl1":"CLI Command Reference","lvl2":"Generate with OAuth auth method","lvl3":""}},
|
|
779
779
|
{"objectID":"e10205dca3731c8d19a1bad6da55856d73395d3512b695b335cffbb198d8498b","title":"Stream with max tier","url":"/docs/cli/commands#stream-with-max-tier","content":"npx @juspay/neurolink stream \"Tell me a story\" \\\n --provider anthropic --subscriptionTier max\nbash","hierarchy":{"lvl0":"Cli","lvl1":"CLI Command Reference","lvl2":"Stream with max tier","lvl3":""}},
|
|
@@ -3459,7 +3459,7 @@
|
|
|
3459
3459
|
{"objectID":"f955eabea1a54bcd03d671cb9ddcd4595938f94906230186f04b7f69468b3694","title":"Markup Files","url":"/docs/features/file-processors#markup-files","content":"| Type | Extensions | Processor | Features |\n| ------------ | ------------------ | ------------------- | --------------------------------------------- |\n| HTML | .html, .htm | HtmlProcessor | OWASP-compliant sanitization, text extraction |\n| SVG | .svg | SvgProcessor | XSS prevention, text injection (not binary) |\n| Markdown | .md, .markdown | MarkdownProcessor | Formatting preservation, metadata extraction |\n| Text | .txt | TextProcessor | Plain text handling, encoding detection |","hierarchy":{"lvl0":"Features","lvl1":"File Processors Guide","lvl2":"Markup Files","lvl3":""}},
|
|
3460
3460
|
{"objectID":"4d831ad6d8c06bb6560d07251a8dd9e1da0c2b74cb85e7899d93bc2c5576a8b5","title":"Source Code","url":"/docs/features/file-processors#source-code","content":"| Type | Extensions | Processor | Features |\n| ------------------- | -------------------------- | --------------------- | ----------------------------------- |\n| TypeScript | .ts, .tsx | SourceCodeProcessor | Language detection, syntax metadata |\n| JavaScript | .js, .jsx, .mjs | SourceCodeProcessor | Module detection |\n| Python | .py | SourceCodeProcessor | Docstring preservation |\n| Java | .java | SourceCodeProcessor | Package detection |\n| Go | .go | SourceCodeProcessor | Module awareness |\n| Rust | .rs | SourceCodeProcessor | Crate detection |\n| C/C++ | .c, .cpp, .h, .hpp | SourceCodeProcessor | Header handling |\n| C# | .cs | SourceCodeProcessor | Namespace detection |\n| Ruby | .rb | SourceCodeProcessor | Gem awareness |\n| PHP | .php | SourceCodeProcessor | Tag handling |\n| Swift | .swift | SourceCodeProcessor | Framework detection |\n| Kotlin | .kt, .kts | SourceCodeProcessor | Android/JVM awareness |\n| Scala | .scala | SourceCodeProcessor | SBT integration |\n| Shell | .sh, .bash, .zsh | SourceCodeProcessor | Shebang detection |\n| SQL | .sql | SourceCodeProcessor | Dialect hints |\n| And 35+ more... | Various | SourceCodeProcessor | Automatic language detection |","hierarchy":{"lvl0":"Features","lvl1":"File Processors Guide","lvl2":"Source Code","lvl3":""}},
|
|
3461
3461
|
{"objectID":"c2f404f3c6f4e80c2a49514197d11bfd92868a6dab3916b92ae3803ba7cd8507","title":"Configuration Files","url":"/docs/features/file-processors#configuration-files","content":"| Type | Extensions | Processor | Features |\n| --------------- | ---------------- | ----------------- | ---------------------------------- |\n| Environment | .env, .env.* | ConfigProcessor | Secret masking option |\n| INI | .ini, .cfg | ConfigProcessor | Section parsing |\n| TOML | .toml | ConfigProcessor | Cargo.toml, pyproject.toml support |\n| Properties | .properties | ConfigProcessor | Java properties format |","hierarchy":{"lvl0":"Features","lvl1":"File Processors Guide","lvl2":"Configuration Files","lvl3":""}},
|
|
3462
|
-
{"objectID":"3b187138dfa909c5c773a82bb2d1f86d489423608b02ec8bce492057f7a7fd86","title":"Media Files","url":"/docs/features/file-processors#media-files","content":"| Type | Extensions | Processor | Features |\n| --------- | ------------------------------------------------------- | ---------------- | -------------------------------------------------------------------------------- |\n| Video | .mp4, .mkv, .webm, .avi, .mov, .m4v | VideoProcessor | Duration, resolution, codec, frame rate, bitrate extraction via music-metadata |\n| Audio | .mp3, .wav, .ogg, .flac, .aac, .m4a, .wma | AudioProcessor | Codec, bitrate, sample rate, channels, duration extraction via music-metadata |\n\
|
|
3462
|
+
{"objectID":"3b187138dfa909c5c773a82bb2d1f86d489423608b02ec8bce492057f7a7fd86","title":"Media Files","url":"/docs/features/file-processors#media-files","content":"| Type | Extensions | Processor | Features |\n| --------- | ------------------------------------------------------- | ---------------- | -------------------------------------------------------------------------------- |\n| Video | .mp4, .mkv, .webm, .avi, .mov, .m4v | VideoProcessor | Duration, resolution, codec, frame rate, bitrate extraction via music-metadata |\n| Audio | .mp3, .wav, .ogg, .flac, .aac, .m4a, .wma | AudioProcessor | Codec, bitrate, sample rate, channels, duration extraction via music-metadata |\n\nFor most providers, audio and video files are not sent as binary. Instead, the processor extracts structured metadata and returns it as formatted text, keeping token usage minimal (~50-200 tokens per file). Video files produce that same metadata text and also bring timestamped keyframes and any embedded subtitles. The Gemini providers additionally receive the audio file itself and the video clip itself (a clip qualifies up to 14 MB of source bytes for the whole request); see the Video Analysis guide.\n\nExample video output:\n\nExample audio output:","hierarchy":{"lvl0":"Features","lvl1":"File Processors Guide","lvl2":"Media Files","lvl3":""}},
|
|
3463
3463
|
{"objectID":"fb11a9eb041ca49290c486646aca74026a2bb5d538fb34eeff55de9a569bcc5f","title":"Archives","url":"/docs/features/file-processors#archives","content":"| Type | Extensions | Processor | Features |\n| ------- | ------------------------ | ------------------ | ---------------------------------------------------------------------- |\n| ZIP | .zip | ArchiveProcessor | File listing with sizes, nested content extraction, ZIP bomb detection |\n| TAR | .tar | ArchiveProcessor | File listing with sizes |\n| GZ | .gz, .tar.gz, .tgz | ArchiveProcessor | Gzip decompression, tar content listing |\n\nArchive files return a structured listing of their contents with file sizes and optionally extract text from contained files (routing through existing processors).\n\nExample archive output:\n\nSecurity: Archive processing includes ZIP bomb detection (compression ratio limits), path traversal prevention, symlink blocking, entry count limits, and aggregate decompression size limits.","hierarchy":{"lvl0":"Features","lvl1":"File Processors Guide","lvl2":"Archives","lvl3":""}},
|
|
3464
3464
|
{"objectID":"94d24822dfeda8ff141ce17dbc1c895f92f40bedda94050fae9e89b10d441eb9","title":"CLI Usage","url":"/docs/features/file-processors#cli-usage","content":"`bash","hierarchy":{"lvl0":"Features","lvl1":"File Processors Guide","lvl2":"CLI Usage","lvl3":""}},
|
|
3465
3465
|
{"objectID":"236270eebf265535ca63a7b9c340fc62d5b82eb72e66811a946513db37985e61","title":"Single file","url":"/docs/features/file-processors#single-file","content":"neurolink generate \"Analyze this spreadsheet\" --file ./data.xlsx","hierarchy":{"lvl0":"Features","lvl1":"File Processors Guide","lvl2":"Single file","lvl3":""}},
|
|
@@ -3956,14 +3956,14 @@
|
|
|
3956
3956
|
{"objectID":"0ffdeaf2a4d433739fb1f96c6487b2e35e254c4459ead6ecbfd3dcb3a98de8b3","title":"Explicit CSV with options","url":"/docs/features/multimodal#explicit-csv-with-options","content":"npx @juspay/neurolink generate \"Summarize data\" \\\n --csv ./data.csv \\\n --csv-max-rows 500 \\\n --csv-format raw\ntypescript\n// Auto-detect (recommended)\nawait neurolink.generate({\n input: {\n text: \"Analyze this sales data\",\n files: [\"./sales.csv\"], // Auto-detected as CSV\n },\n});\n\n// Explicit CSV with options\nawait neurolink.generate({\n input: {\n text: \"Compare quarterly data\",\n csvFiles: [\"./q1.csv\", \"./q2.csv\"],\n },\n csvOptions: {\n maxRows: 1000,\n formatStyle: \"json\", // or \"raw\", \"markdown\"\n },\n});\n`","hierarchy":{"lvl0":"Features","lvl1":"Multimodal Capabilities Guide","lvl2":"Explicit CSV with options","lvl3":""}},
|
|
3957
3957
|
{"objectID":"93535721732536c013e0204b266f2a131be12a7745f6c88a6e61cdeb76704728","title":"CSV Format Options","url":"/docs/features/multimodal#csv-format-options","content":"Three format styles:\nRaw format (default)\nBest for large files\nMinimal token usage\nPreserves original CSV structure\nJSON format\nStructured data processing\nEasier for AI to parse\nHigher token usage\nMarkdown format\nReadable tables\nGood for small datasets (\\<100 rows)\nModerate token usage","hierarchy":{"lvl0":"Features","lvl1":"Multimodal Capabilities Guide","lvl2":"CSV Format Options","lvl3":""}},
|
|
3958
3958
|
{"objectID":"427b303d134e7e002fe1fbb0ae86243f33506e795e3029cdfb7994c2014c0db4","title":"CSV Best Practices","url":"/docs/features/multimodal#csv-best-practices","content":"Use raw format for large files to minimize token usage\nUse JSON format for structured processing when AI needs to manipulate data\nLimit to 1000 rows by default (configurable up to 10,000)\nCombine CSV with visualization images for comprehensive analysis\nWorks across supported providers (not just vision-capable models)","hierarchy":{"lvl0":"Features","lvl1":"Multimodal Capabilities Guide","lvl2":"CSV Best Practices","lvl3":""}},
|
|
3959
|
-
{"objectID":"5f2f649cdd7639b3fc3fb30871df07bf3331ad446ac4d23340aaab8976ccf1a7","title":"Frame-extraction options","url":"/docs/features/multimodal#frame-extraction-options","content":"
|
|
3959
|
+
{"objectID":"5f2f649cdd7639b3fc3fb30871df07bf3331ad446ac4d23340aaab8976ccf1a7","title":"Frame-extraction options","url":"/docs/features/multimodal#frame-extraction-options","content":"frames, quality and format control the keyframes and do not change a clip sent natively. transcribeAudio does not look at the provider: on Gemini it still adds a transcript next to the audio the model hears, so set it for frame-path providers only.\n\nWithout an explicit frames, the interval is chosen from the clip's duration\n— roughly every second for clips under 10s, widening to one frame a minute\nfor recordings over half an hour, always capped at 100 frames.","hierarchy":{"lvl0":"Features","lvl1":"Multimodal Capabilities Guide","lvl2":"Frame-extraction options","lvl3":""}},
|
|
3960
3960
|
{"objectID":"2c4c2bb10b6fea62d177994e6df1345d05606b65f8122b3c969cf214df3363f1","title":"CLI usage","url":"/docs/features/multimodal#cli-usage","content":"`bash","hierarchy":{"lvl0":"Features","lvl1":"Multimodal Capabilities Guide","lvl2":"CLI usage","lvl3":""}},
|
|
3961
3961
|
{"objectID":"915a9e9701a9e6b02890e744550ed66754549288fa044c90bd2dd873e6b48c2a","title":"Auto-detect","url":"/docs/features/multimodal#auto-detect","content":"neurolink generate \"Describe this video\" --file demo.mp4 --provider google-ai","hierarchy":{"lvl0":"Features","lvl1":"Multimodal Capabilities Guide","lvl2":"Auto-detect","lvl3":""}},
|
|
3962
3962
|
{"objectID":"12ce623ba884b34886674b24daff6ce9e58465c68dc25f4f66c01229c6855513","title":"Explicit flag","url":"/docs/features/multimodal#explicit-flag","content":"neurolink generate \"Summarise this\" --video standup.mp4 --provider vertex","hierarchy":{"lvl0":"Features","lvl1":"Multimodal Capabilities Guide","lvl2":"Explicit flag","lvl3":""}},
|
|
3963
|
-
{"objectID":"08774b3c1d8fd456cb7d64ad98281449b9271854310a9a713048ae2112572d5c","title":"Frame-extraction knobs","url":"/docs/features/multimodal#frame-extraction-knobs","content":"neurolink generate \"Describe each scene\" --file demo.mp4 \\\n --provider openai --video-frames 16 --video-quality 90 --video-format jpeg\n\n\n--transcribe-audio (or videoOptions.transcribeAudio) gives a frame-path\nprovider the clip's speech, which keyframes cannot carry. The audio track is\nextracted with ffmpeg, transcribed by
|
|
3963
|
+
{"objectID":"08774b3c1d8fd456cb7d64ad98281449b9271854310a9a713048ae2112572d5c","title":"Frame-extraction knobs","url":"/docs/features/multimodal#frame-extraction-knobs","content":"neurolink generate \"Describe each scene\" --file demo.mp4 \\\n --provider openai --video-frames 16 --video-quality 90 --video-format jpeg\n\n\n--transcribe-audio (or videoOptions.transcribeAudio) gives a frame-path\nprovider the clip's speech, which keyframes cannot carry. The audio track is\nextracted with ffmpeg, transcribed by the configured speech-to-text engine\n(the same selection as neurolink.transcribe(); see the\n[transcribe guide](/docs/features/transcribe)), and sent alongside the keyframes under a\nSpoken Audio (transcribed) heading. Transcription is additive: when it cannot\nrun — the clip has no audio track, the speech-to-text backend is not\nconfigured, the extracted audio is over the 25 MB limit, or extraction or the\ntranscription request fails — the request still succeeds with the keyframes and\nmetadata, and a No transcript for : warning says which. A\nGemini provider does not need it while the clip is delivered natively, since\nthat includes the audio track; a clip that falls back to keyframes (over the\ninline ceiling) loses its speech unless --transcribe-audio is set.\n\nEmbedded **subtitle tracks** are extracted separately and included whenever\nthey exist, with or without transcribeAudio`.","hierarchy":{"lvl0":"Features","lvl1":"Multimodal Capabilities Guide","lvl2":"Frame-extraction knobs","lvl3":""}},
|
|
3964
3964
|
{"objectID":"d0faa964a225271bc41d6c279e3e925829ac8e8828518387c39ba60d97cd363f","title":"Asking which mechanism applies","url":"/docs/features/multimodal#asking-which-mechanism-applies","content":"The capability table is exported, so a caller can ask before sending — useful\nfor choosing a provider, or for budgeting.","hierarchy":{"lvl0":"Features","lvl1":"Multimodal Capabilities Guide","lvl2":"Asking which mechanism applies","lvl3":""}},
|
|
3965
3965
|
{"objectID":"10a8f5bf0ea5129e242eb09d5db285a4d91aac091c171050471ebd7eb528cb72","title":"Best practices","url":"/docs/features/multimodal#best-practices","content":"Ask an audio question of a Gemini provider only. Nothing on the frame\n path can hear the clip, so \"what was said\" has no answer there.\nKeep clips under 14 MB when you want native delivery. Re-encoding a\n screen recording at a lower bitrate usually gets a long clip under the\n ceiling without losing anything a model would read.\nRaise frames rather than quality for detail over time. Frames cost\n roughly 250 tokens each regardless of quality; more of them is what buys\n coverage of a clip where things change.\nLower frames for local runtimes. Ollama and llama.cpp hold every\n frame in the same memory as the model; four is the practical default.","hierarchy":{"lvl0":"Features","lvl1":"Multimodal Capabilities Guide","lvl2":"Best practices","lvl3":""}},
|
|
3966
|
-
{"objectID":"7bd6ebb59bff22b19f26c8c358eb7012f8a73d4f90eed575ca136f632c6f9bc6","title":"Troubleshooting","url":"/docs/features/multimodal#troubleshooting","content":"| Symptom | Cause
|
|
3966
|
+
{"objectID":"7bd6ebb59bff22b19f26c8c358eb7012f8a73d4f90eed575ca136f632c6f9bc6","title":"Troubleshooting","url":"/docs/features/multimodal#troubleshooting","content":"| Symptom | Cause | Fix |\n| --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- |\n| Model describes the file but not its content | No keyframes extracted — ffmpeg missing — and the provider takes frames | Install ffmpeg, or use a Gemini provider, which needs none |\n| Sending keyframes instead of the clip in the logs | The clip failed the inline gate; the reason is on the same line | Shorten or re-encode it, or accept the frames |\n| Model cannot hear speech on a Gemini provider | The clip exceeded the inline ceiling and fell back to frames | Get the source under 14 MB, or pass --transcribe-audio |\n| --transcribe-audio produced no transcript | The No transcript for warning names the reason: no audio track, no speech-to-text backend configured, or audio over 25 MB | Configure an engine (see the transcribe guide), or split the recording |\n| Only the first seconds of a long clip are described | The frame budget was hit before the end | Raise frames; the interval then spreads evenly across the whole clip |","hierarchy":{"lvl0":"Features","lvl1":"Multimodal Capabilities Guide","lvl2":"Troubleshooting","lvl3":""}},
|
|
3967
3967
|
{"objectID":"79318378a7df7cc816465eb447fa4bd2ba9e6344f17b0a9cf6661377bb03e7e2","title":"Combining Multiple Input Types","url":"/docs/features/multimodal#combining-multiple-input-types","content":"NeuroLink excels at combining different media types in a single request.","hierarchy":{"lvl0":"Features","lvl1":"Multimodal Capabilities Guide","lvl2":"Combining Multiple Input Types","lvl3":""}},
|
|
3968
3968
|
{"objectID":"412f09080a5801a35250df393e2e0694602d5312e2b3d1b017fe469bf9dc0474","title":"Batch with Multimodal (CLI)","url":"/docs/features/multimodal#batch-with-multimodal-cli","content":"The batch command supports --image, --csv, --pdf, and --video. The file(s) are attached identically to every prompt in the batch (a one-line notice is printed to stderr, unconditionally — it is not suppressed by --quiet, so it never corrupts --format json output written to stdout):\n\n--file (auto-detect) is not available in batch, because it collides with the <file> positional (the prompts-list path). Use the explicit --image / --csv / --pdf / --video flags instead.","hierarchy":{"lvl0":"Features","lvl1":"Multimodal Capabilities Guide","lvl2":"Batch with Multimodal (CLI)","lvl3":""}},
|
|
3969
3969
|
{"objectID":"66d907236327d676dbe6e05193c2793f7c5990dce2ad113cf078eb1ff4c73216","title":"File validation & troubleshooting (CLI)","url":"/docs/features/multimodal#file-validation-troubleshooting-cli","content":"Before any provider call, the CLI validates local file inputs across generate, stream, and batch:\nA path that points at a directory, doesn't exist, or can't be read (e.g. a permissions error) is rejected up front with a clear error and troubleshooting hints — no cryptic EISDIR/EACCES deep in processing. This also applies to the batch <file> prompts-list positional itself.\nA large file (images > 10 MB, CSV/PDF > 50 MB) prints a non-blocking warning to stderr. Like the batch attachment notice, this is unconditional — visible without --debug and regardless of --quiet — and never mixes into stdout, so --format json output stays valid JSON even when large-file warnings fire.\n\nThis runs even under --dry-run and without API keys configured.","hierarchy":{"lvl0":"Features","lvl1":"Multimodal Capabilities Guide","lvl2":"File validation & troubleshooting (CLI)","lvl3":""}},
|
|
@@ -4002,53 +4002,37 @@
|
|
|
4002
4002
|
{"objectID":"58496b05fc501a4521336522ee26a5eb64aa0e9d6b609b350cc0813f6d453feb","title":"Exports","url":"/docs/features/observability#exports","content":"| Removed | Replacement |\n| ----------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |\n| initializeOpenTelemetry | Automatic on new NeuroLink() |\n| getLangfuseSpanProcessor | createExporterSpanProcessor(registry) or new LangfuseSpanProcessor() |\n| getTracerProvider, getTracer | trace.getTracer() from @opentelemetry/api |\n| getSpanProcessors | Add createExporterSpanProcessor() to your provider |\n| createContextEnricher | setLangfuseContext or per-call context |\n| isUsingExternalTracerProvider | getLangfuseHealthStatus().usingExternalProvider |\n| isLangfuseInternalSpan, langfuseShouldExportSpan | Removed; only observation spans are exported |\n| getLangfuseContext | Removed |\n| runWithCurrentLangfuseContext | context.bind(context.active(), fn) from @opentelemetry/api |\n| buildObservabilityConfigFromEnv | Removed; env keys are read automatically |\n| createMockLangfuseClient","hierarchy":{"lvl0":"Features","lvl1":"Observability Guide","lvl2":"Exports","lvl3":""}},
|
|
4003
4003
|
{"objectID":"ddf06146284ab7554c88bfef97f75c42c4186a270ac952f6cb27eb9e3640217a","title":"CLI","url":"/docs/features/observability#cli","content":"| Removed | Replacement |\n| ------------------------------------ | -------------------------------------- |\n| neurolink telemetry configure | Set LANGFUSE_* environment variables |\n| neurolink telemetry list-exporters | neurolink telemetry status |\n| neurolink observability exporters | neurolink observability status |\n\nExporterRegistry, NoOpExporter, AlwaysSampler, NeverSampler and the vendor exporter classes are unchanged. NeuroLink wires only LangfuseExporter. LangfuseExporter, ExporterSpanProcessor and createExporterSpanProcessor are new root exports.","hierarchy":{"lvl0":"Features","lvl1":"Observability Guide","lvl2":"CLI","lvl3":""}},
|
|
4004
4004
|
{"objectID":"9a2c99612604332f4b2bc32fb673fe19412249aba74ad41f2ed2cfd84a8d1185","title":"See Also","url":"/docs/features/observability#see-also","content":"Telemetry Guide\nClaude Proxy Observability\nAnalytics Reference","hierarchy":{"lvl0":"Features","lvl1":"Observability Guide","lvl2":"See Also","lvl3":""}},
|
|
4005
|
-
{"objectID":"1b22ff57a6c6e2525e50e02118d6029f5ee3779ef701e9fde1b7b97d1a782760","title":"Office Documents Support","url":"/docs/features/office-documents","content":"Office Documents Support\n\nNeuroLink
|
|
4006
|
-
{"objectID":"20c3155d2c1f39db07b8ffb72304d589cb601d27d43fb6f6f81ec8e83b5af4f2","title":"Office Documents Support","url":"/docs/features/office-documents#office-documents-support","content":"NeuroLink
|
|
4007
|
-
{"objectID":"89922c3be7ba989417dd4f9aa76cf3c0497898b83d430c80f5809846a01ebcab","title":"Overview","url":"/docs/features/office-documents#overview","content":"
|
|
4008
|
-
{"objectID":"0b9f9e62a508886292fe189b77c320798552f0b7ac01939ef46d03f3b78126a3","title":"Supported File Types","url":"/docs/features/office-documents#supported-file-types","content":"| Format | Extension | MIME Type |
|
|
4005
|
+
{"objectID":"1b22ff57a6c6e2525e50e02118d6029f5ee3779ef701e9fde1b7b97d1a782760","title":"Office Documents Support","url":"/docs/features/office-documents","content":"Office Documents Support\n\nNeuroLink reads Word, Excel, and PowerPoint files itself and puts their content into the prompt as text. Attach them through the same input.files array (or --file flag) that carries every other file type; there is no separate Office input field and no provider restriction.\n\nOverview\n\nWhen a request carries an Office file, NeuroLink:\nDetects the format from the file's bytes, MIME type, and extension.\nExtracts the content in-process: Word through mammoth (converted to Markdown), Excel through exceljs, and PowerPoint by reading the slide XML inside the .pptx package.\nAppends the extracted text to the prompt under a heading that names the file (## Document: \"report.docx\", ## Spreadsheet: \"sales.xlsx\", ## Presentation: \"deck.pptx\").\nSends an ordinary text prompt to whichever provider you chose.\n\nBecause the model receives text, Office files work with every provider and model, including ones with no document API (OpenAI, Ollama, Mistral, and so on). The model sees what the extractors can read: text, tables, and speaker notes. It does not see images, charts, or shapes that carry no text.\n\nSupported File Types\n\n| Format | Extension | MIME Type | What the model receives |\n| --------------------- | --------- | --------------------------------------------------------------------------- | ------------------------------------------------------- |\n| Word Document | .docx | application/vnd.openxmlformats-officedocument.wordprocessingml.document | Markdown (headings, lists, tables) and a metrics line |\n| PowerPoint | .pptx | application/vnd.openxmlformats-officedocument.presentationml.presentation | Text of every slide, table rows, and each slide's notes |\n| Excel Spreadsheet | .xlsx | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | Every sheet (or one you name) in the format you choose |\n\nThe same three routes also carry OpenDocument text, spreadsheet and presentation files (.odt, .ods, .odp) and RTF (.rtf), which are read as plain text.\n\nLegacy binary formats (.doc, .xls, .ppt) are recognised but not parsed: the readers only understand the Office Open XML packages above. The request still succeeds, and the model receives a short note saying the file was attached but its content could not be extracted. Re-save such files as .docx, .xlsx, or .pptx first.\n\nQuick Start\n\nSDK Usage\n\nCLI Usage\n\nThe CLI has no flags for officeOptions; choosing a sheet or a spreadsheet format is an SDK feature (see below).\n\nWhat the Model Receives\n\nDOCX structure and metrics\n\nA .docx is converted to Markdown before it reaches the model, so headings, ordered and unordered lists, and tables survive as structure rather than being flattened into prose. Each document is prefixed with a metrics line:\n\nPPTX slides, tables, and speaker notes\n\nA .pptx is read slide by slide, in slide-number order. Each slide's text comes first, then its speaker notes on a **Speaker notes:** line:\nText boxes and titles come out one text run per line, with XML character references decoded (& is shown as &, < as <, © as the copyright sign).\nA table row becomes one line with the cells joined by |. An empty cell keeps its separator, so the cells of a row can still be counted (Q3 | | has three, | Open | has three), and a cell with several paragraphs or line breaks is joined onto the one line with spaces. A row with no text at all is dropped. A literal | in cell text is not escaped, so it reads like a separator.\nSpeaker notes are always included. There is no option to turn them off.\nA slide with no text and no notes is left out. A deck of nothing but pictures therefore arrives as the Presentation: N slide(s) header alone.\nPictures, charts, SmartArt, and shapes that hold no text contribute nothing.\n\nSelecting and formatting spreadsheet data\n\nNaming a sheet that does not exist does not silently fall back to every sheet. The prompt reports the miss and lists the available sheet names.\n\nOptions\n\nofficeOptions is accepted by generate() and stream(). Two fields are read, both by the spreadsheet reader:\n\n| Option | Type | Default | Effect |\n| ------------- | ---------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| sheetName | string | all | Restrict the workbook to the named sheet. An unknown name is reported in the prompt together with the sheets that do exist. ","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"","lvl3":""}},
|
|
4006
|
+
{"objectID":"20c3155d2c1f39db07b8ffb72304d589cb601d27d43fb6f6f81ec8e83b5af4f2","title":"Office Documents Support","url":"/docs/features/office-documents#office-documents-support","content":"NeuroLink reads Word, Excel, and PowerPoint files itself and puts their content into the prompt as text. Attach them through the same input.files array (or --file flag) that carries every other file type; there is no separate Office input field and no provider restriction.","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Office Documents Support","lvl3":""}},
|
|
4007
|
+
{"objectID":"89922c3be7ba989417dd4f9aa76cf3c0497898b83d430c80f5809846a01ebcab","title":"Overview","url":"/docs/features/office-documents#overview","content":"When a request carries an Office file, NeuroLink:\nDetects the format from the file's bytes, MIME type, and extension.\nExtracts the content in-process: Word through mammoth (converted to Markdown), Excel through exceljs, and PowerPoint by reading the slide XML inside the .pptx package.\nAppends the extracted text to the prompt under a heading that names the file (## Document: \"report.docx\", ## Spreadsheet: \"sales.xlsx\", ## Presentation: \"deck.pptx\").\nSends an ordinary text prompt to whichever provider you chose.\n\nBecause the model receives text, Office files work with every provider and model, including ones with no document API (OpenAI, Ollama, Mistral, and so on). The model sees what the extractors can read: text, tables, and speaker notes. It does not see images, charts, or shapes that carry no text.","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Overview","lvl3":""}},
|
|
4008
|
+
{"objectID":"0b9f9e62a508886292fe189b77c320798552f0b7ac01939ef46d03f3b78126a3","title":"Supported File Types","url":"/docs/features/office-documents#supported-file-types","content":"| Format | Extension | MIME Type | What the model receives |\n| --------------------- | --------- | --------------------------------------------------------------------------- | ------------------------------------------------------- |\n| Word Document | .docx | application/vnd.openxmlformats-officedocument.wordprocessingml.document | Markdown (headings, lists, tables) and a metrics line |\n| PowerPoint | .pptx | application/vnd.openxmlformats-officedocument.presentationml.presentation | Text of every slide, table rows, and each slide's notes |\n| Excel Spreadsheet | .xlsx | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | Every sheet (or one you name) in the format you choose |\n\nThe same three routes also carry OpenDocument text, spreadsheet and presentation files (.odt, .ods, .odp) and RTF (.rtf), which are read as plain text.\n\nLegacy binary formats (.doc, .xls, .ppt) are recognised but not parsed: the readers only understand the Office Open XML packages above. The request still succeeds, and the model receives a short note saying the file was attached but its content could not be extracted. Re-save such files as .docx, .xlsx, or .pptx first.","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Supported File Types","lvl3":""}},
|
|
4009
4009
|
{"objectID":"5e3d4c5a982f07792f76fa44f8d72951142a507c235a348285207611716f4513","title":"CLI Usage","url":"/docs/features/office-documents#cli-usage","content":"`bash","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"CLI Usage","lvl3":""}},
|
|
4010
|
-
{"objectID":"
|
|
4011
|
-
{"objectID":"
|
|
4012
|
-
{"objectID":"
|
|
4013
|
-
{"objectID":"
|
|
4014
|
-
{"objectID":"
|
|
4015
|
-
{"objectID":"
|
|
4016
|
-
{"objectID":"52189df50a2aa3edc4c43df6d16b7390207ec0b8eaca625c0b90a45190f6f45c","title":"attachments are only available on generate and stream.","url":"/docs/features/office-documents#attachments-are-only-available-on-generate-and-stream","content":"
|
|
4017
|
-
{"objectID":"
|
|
4018
|
-
{"objectID":"
|
|
4019
|
-
{"objectID":"
|
|
4020
|
-
{"objectID":"
|
|
4021
|
-
{"objectID":"
|
|
4022
|
-
{"objectID":"
|
|
4023
|
-
{"objectID":"
|
|
4024
|
-
{"objectID":"
|
|
4025
|
-
{"objectID":"
|
|
4026
|
-
{"objectID":"
|
|
4027
|
-
{"objectID":"
|
|
4028
|
-
{"objectID":"
|
|
4029
|
-
{"objectID":"
|
|
4030
|
-
{"objectID":"
|
|
4031
|
-
{"objectID":"
|
|
4032
|
-
{"objectID":"
|
|
4033
|
-
{"objectID":"a1c751a0eff160215c059433a9113b8b5aa43d5178ba35b3c4f1c9efcc60d379","title":"Or use auto-detection with correct provider","url":"/docs/features/office-documents#or-use-auto-detection-with-correct-provider","content":"neurolink generate \"Analyze document\" --file doc.docx --provider vertex\n`","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Or use auto-detection with correct provider","lvl3":""}},
|
|
4034
|
-
{"objectID":"d5d387cd93c20d62decb6008d1b3f2c5a942ba257d97074e154d6499b4ce99ae","title":"Error: \"File size exceeds limit\"","url":"/docs/features/office-documents#error-file-size-exceeds-limit","content":"Problem: File too large for provider (>5MB for most providers)\n\nSolution:\n\n`bash","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Error: \"File size exceeds limit\"","lvl3":""}},
|
|
4035
|
-
{"objectID":"d293811755b6feb589f03663f1a023fadf0274b763f4288fb5674ab198d68b2a","title":"Option 3: Extract key sections manually","url":"/docs/features/office-documents#option-3-extract-key-sections-manually","content":"`","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Option 3: Extract key sections manually","lvl3":""}},
|
|
4036
|
-
{"objectID":"b9d074cb991716964eee01f1a8f4842d93a47a8ee48c916ab17b3c17af6ea3bc","title":"Error: \"Invalid Office file format\"","url":"/docs/features/office-documents#error-invalid-office-file-format","content":"Problem: File is not a valid Office Open XML format or corrupted\n\nSolution:\n\n`bash","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Error: \"Invalid Office file format\"","lvl3":""}},
|
|
4037
|
-
{"objectID":"a1cdbcc75fe5227c8eeefb4a84e4dc7d621e4b8b5cd74a54239070133d6e8aab","title":"Verify file is valid Office format","url":"/docs/features/office-documents#verify-file-is-valid-office-format","content":"file document.docx # Should show \"Microsoft Word 2007+\"","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Verify file is valid Office format","lvl3":""}},
|
|
4038
|
-
{"objectID":"51f411c246e91b8e10be8eb88b64f0dff2d4333fd5e9369b879ccca57c03d230","title":"Ensure file is not password-protected","url":"/docs/features/office-documents#ensure-file-is-not-password-protected","content":"`","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Ensure file is not password-protected","lvl3":""}},
|
|
4039
|
-
{"objectID":"78f8341d8946631d02d464807dd3e246e8681eb3e0db45e9574605ad8a6c4d6e","title":"Error: \"Provider not specified\"","url":"/docs/features/office-documents#error-provider-not-specified","content":"Problem: No provider selected (Office files require explicit provider)\n\nSolution:","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Error: \"Provider not specified\"","lvl3":""}},
|
|
4040
|
-
{"objectID":"cca34450fc5c9fcd710431fe02c9ec97f4aa3efa952e1ce6f4b0e9e0e286a731","title":"Office Content Not Being Analyzed","url":"/docs/features/office-documents#office-content-not-being-analyzed","content":"Problem: AI says \"I cannot read the document\" even though file is attached\n\nCommon Causes:\nWrong provider: Make sure using supported provider\nFile path wrong: Verify file exists at specified path\nBuffer issue: If using Buffer, ensure it's valid Office data\nFormat mismatch: Ensure file extension matches actual format\n\nDebug:","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Office Content Not Being Analyzed","lvl3":""}},
|
|
4041
|
-
{"objectID":"723205524a0a4c87bd8bfbc916f2df583236fd12ab36361a9b208f0b9239aea3","title":"Migrating from Manual Document Processing","url":"/docs/features/office-documents#migrating-from-manual-document-processing","content":"If you were previously using manual document extraction:\n\nBefore (Manual Processing):\n\nAfter (Native Support):","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Migrating from Manual Document Processing","lvl3":""}},
|
|
4042
|
-
{"objectID":"0fede6938652242e8a41085e1343cc287e11ab2d2fea98631002ae223e405b96","title":"Migrating from PDF-First Workflow","url":"/docs/features/office-documents#migrating-from-pdf-first-workflow","content":"If you were converting Office files to PDF first:\n\nBefore (PDF Conversion):\n\nAfter (Direct Office Support):","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Migrating from PDF-First Workflow","lvl3":""}},
|
|
4043
|
-
{"objectID":"91d3938652596fa8946e635c3609eb09c64a6d17f49ba685e49c34294bef0146","title":"API Changes Summary","url":"/docs/features/office-documents#api-changes-summary","content":"| Previous API | New API | Notes |\n| -------------------------- | --------------------------- | -------------------------------- |\n| Manual text extraction | officeFiles: [...] | Native document support |\n| PDF conversion workflow | Direct Office support | No conversion needed |\n| Provider-specific handling | Unified officeFiles array | Works across supported providers |\n| Custom MIME type handling | Auto-detection | Format automatically detected |","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"API Changes Summary","lvl3":""}},
|
|
4044
|
-
{"objectID":"717a0b6810d80ff76d06f6b48a79823c511877b17942a590a2fd75cad0426b8f","title":"Usage Examples","url":"/docs/features/office-documents#usage-examples","content":"Here are complete working examples for common use cases:","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Usage Examples","lvl3":""}},
|
|
4010
|
+
{"objectID":"ba6ba101e9dd3f0aaf1d7fc20eaa9c09e103f657a86aae7186bf742e86ad6ac2","title":"Attach an Office file","url":"/docs/features/office-documents#attach-an-office-file","content":"neurolink generate \"Summarize this document\" --file report.docx --provider openai","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Attach an Office file","lvl3":""}},
|
|
4011
|
+
{"objectID":"52c6656502f8173700c43a888505652d631a45b2fc92c33064a87c502d5d9808","title":"Several files","url":"/docs/features/office-documents#several-files","content":"neurolink generate \"Compare these reports\" --file q1.docx --file q2.docx --provider openai","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Several files","lvl3":""}},
|
|
4012
|
+
{"objectID":"ed6e509cdca86d6db5b7fdb044f8b8e9f76a4c1b3703434b6c6273784e991370","title":"Spreadsheet","url":"/docs/features/office-documents#spreadsheet","content":"neurolink generate \"Analyze sales trends\" --file sales.xlsx --provider openai","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Spreadsheet","lvl3":""}},
|
|
4013
|
+
{"objectID":"b73c70ff6a6ce3c6b2344ff89ab95bac259dcaa055691cc7dd4c9ed586b7b472","title":"Presentation","url":"/docs/features/office-documents#presentation","content":"neurolink generate \"Extract key points from the slides\" --file presentation.pptx --provider openai","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Presentation","lvl3":""}},
|
|
4014
|
+
{"objectID":"2f088f9b29bfc06279c162e574c9f5efd5b0abeb1a88ef1400ca6ff0c24b692a","title":"Mixed file types","url":"/docs/features/office-documents#mixed-file-types","content":"neurolink generate \"Analyze all documents\" --file report.docx --file data.xlsx --provider openai","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Mixed file types","lvl3":""}},
|
|
4015
|
+
{"objectID":"eb0435da453683af2290c5fe2c918d5ae760e5c28b07ac5eb848029f3ecca4cd","title":"Stream mode","url":"/docs/features/office-documents#stream-mode","content":"neurolink stream \"Explain this document in detail\" --file document.docx --provider openai","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Stream mode","lvl3":""}},
|
|
4016
|
+
{"objectID":"52189df50a2aa3edc4c43df6d16b7390207ec0b8eaca625c0b90a45190f6f45c","title":"attachments are only available on generate and stream.","url":"/docs/features/office-documents#attachments-are-only-available-on-generate-and-stream","content":"The CLI has no flags for officeOptions`; choosing a sheet or a spreadsheet format is an SDK feature (see below).","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"attachments are only available on generate and stream.","lvl3":""}},
|
|
4017
|
+
{"objectID":"67803d753a4af41df778c73ea9d4f3055339e3e9c2eaa77b082e5b95d0b5bff3","title":"DOCX structure and metrics","url":"/docs/features/office-documents#docx-structure-and-metrics","content":"A .docx is converted to Markdown before it reaches the model, so headings, ordered and unordered lists, and tables survive as structure rather than being flattened into prose. Each document is prefixed with a metrics line:\n\n`\nDocument: 42 words, 9 paragraphs, 268 characters","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"DOCX structure and metrics","lvl3":""}},
|
|
4018
|
+
{"objectID":"e58480b8b9a182fd718393f62b8c0beaeb759f7d39ba9ca286a122ab959c66f1","title":"Adoption","url":"/docs/features/office-documents#adoption","content":"Merchant onboarding automated\nSettlement latency reduced\n\n| Region | Merchants | Volume |\n| --- | --- | --- |\n| APAC | 128 | 44200 |\n`","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Adoption","lvl3":""}},
|
|
4019
|
+
{"objectID":"cf894f1a0170e1d9ae191993fb7f476a559172b1ade2f2f87f2e6bb0e532e40c","title":"PPTX slides, tables, and speaker notes","url":"/docs/features/office-documents#pptx-slides-tables-and-speaker-notes","content":"A .pptx is read slide by slide, in slide-number order. Each slide's text comes first, then its speaker notes on a **Speaker notes:** line:\n\n`\nPresentation: 2 slide(s)","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"PPTX slides, tables, and speaker notes","lvl3":""}},
|
|
4020
|
+
{"objectID":"3641c8deffb2e9052d407692ff6dedc74edf1d8e089e33a72deeb947a69846c1","title":"Slide 1","url":"/docs/features/office-documents#slide-1","content":"Q3 Revenue & Growth\nRegion | Owner | Volume\nAPAC | Priya & Sam | 44200\nEMEA | | Line one Line two\nSpeaker notes: Mention the RTO improvement & Q3 .","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Slide 1","lvl3":""}},
|
|
4021
|
+
{"objectID":"a348366df70c960b3b21fe02ef13a609e14670723365bc7c770b2dce3cf12256","title":"Slide 2","url":"/docs/features/office-documents#slide-2","content":"Hire two analysts\nSpeaker notes: Ask finance about headcount.\n\n\n- Text boxes and titles come out one text run per line, with XML character references decoded (& is shown as &, < as <, © as the copyright sign).\n- A table row becomes one line with the cells joined by |. An empty cell keeps its separator, so the cells of a row can still be counted (Q3 | | has three, | Open | has three), and a cell with several paragraphs or line breaks is joined onto the one line with spaces. A row with no text at all is dropped. A literal | in cell text is not escaped, so it reads like a separator.\n- Speaker notes are always included. There is no option to turn them off.\n- A slide with no text and no notes is left out. A deck of nothing but pictures therefore arrives as the Presentation: N slide(s)` header alone.\nPictures, charts, SmartArt, and shapes that hold no text contribute nothing.","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Slide 2","lvl3":""}},
|
|
4022
|
+
{"objectID":"4db4bf0a8dc60ff49e53fb0ea30ad888573cf4b2fc31a8664bd6fab88bb05235","title":"Selecting and formatting spreadsheet data","url":"/docs/features/office-documents#selecting-and-formatting-spreadsheet-data","content":"Naming a sheet that does not exist does not silently fall back to every sheet. The prompt reports the miss and lists the available sheet names.","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Selecting and formatting spreadsheet data","lvl3":""}},
|
|
4023
|
+
{"objectID":"c6e4cb72d1750712dfefdf5c733f161ce7b1f4815c0372df02c90228d34ab222","title":"Options","url":"/docs/features/office-documents#options","content":"officeOptions is accepted by generate() and stream(). Two fields are read, both by the spreadsheet reader:\n\n| Option | Type | Default | Effect |\n| ------------- | ---------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| sheetName | string | all | Restrict the workbook to the named sheet. An unknown name is reported in the prompt together with the sheets that do exist. |\n| formatStyle | \"raw\" \\| \"csv\" \\| \"markdown\" \\| \"json\" | \"raw\" | How each sheet is rendered: tab-separated preview (raw), comma-separated values with RFC 4180 quoting (csv), a markdown table (markdown), or an array of row objects keyed by the header row (json). |\n\nThe exported OfficeProcessorOptions type also declares format, extractTextOnly, maxSizeMB, includeMetadata, processAllSheets, and includeSlideNotes. Nothing reads them today, so setting them has no effect. The DOCX and PPTX readers take no options.","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Options","lvl3":""}},
|
|
4024
|
+
{"objectID":"2c878f33050150a1c335fc565c8ac53baa616e415b9688bcc65509f00a30acf5","title":"File input formats","url":"/docs/features/office-documents#file-input-formats","content":"Office files can sit in input.files next to PDFs, images, CSV, audio, and code. Office documents have no field of their own: there are no docxFiles, pptxFiles, xlsxFiles, or officeFiles inputs, so always use input.files.","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"File input formats","lvl3":""}},
|
|
4025
|
+
{"objectID":"39bb9ae046199f6b57dcbdd3043b7f5283038656ea6eff6ce0fb288fc813f98b","title":"Large Files","url":"/docs/features/office-documents#large-files","content":"An Office file in input.files (or --file) is always extracted and inlined in full, whatever its size. There is no on-demand mode for it through generate(), stream() or the CLI, so a very large workbook or deck is bounded by the limits under Limitations and by the model's context window.\n\nAn SDK caller that wants selective reads can use FileReferenceRegistry (exported from @juspay/neurolink/files) directly, which is a separate path from input.files. Its extractContent call returns only the slides in pages for a presentation (with the same text and speaker notes as above, and (No text content on this slide) for a slide that has neither), or the sheet, row_range and columns you name for a spreadsheet.","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Large Files","lvl3":""}},
|
|
4026
|
+
{"objectID":"b8748c4f0af34f715fdddc059eb7bfa9f5dd3ea85bf494e06536ff65a971626b","title":"Error Handling","url":"/docs/features/office-documents#error-handling","content":"Extraction problems do not throw. If an Office file is corrupt, password-protected, a legacy binary format, or simply empty, the prompt carries a note in place of its content and the request goes on:\n\nA file that cannot be loaded at all does fail the request. A missing path, for example, surfaces as:\n\nThere are no Office-specific error classes.","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Error Handling","lvl3":""}},
|
|
4027
|
+
{"objectID":"d9cfd3f9fad66e6791bed04b5037bbe30644d82e3899a0b0f60df23a19fcef12","title":"1. Narrow spreadsheets before sending them","url":"/docs/features/office-documents#1-narrow-spreadsheets-before-sending-them","content":"Every sheet is rendered into the prompt by default. For a large workbook, name the sheet you need and pick the format the model handles best:","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"1. Narrow spreadsheets before sending them","lvl3":""}},
|
|
4028
|
+
{"objectID":"118807d055d2114840307a78c7d89732d9d976151d235c75a3f52a7e6351a85a","title":"Limitations","url":"/docs/features/office-documents#limitations","content":"Open XML only. .docx, .xlsx, and .pptx are parsed. Legacy .doc, .xls, and .ppt are not (see above).\nText, tables, and notes only. Embedded images and charts are not sent to the model (a Word image shows up as an  marker), and VBA macros are never run.\nNo encrypted files. A password-protected file cannot be read and arrives as a placeholder note.\nSize bounds. Word and Excel files are bounded at 100 MB each, and a presentation's extracted content at 100 MB in total (the limits live in src/lib/processors/config/sizeLimits.ts). Files over the 200 MB general ceiling are refused when loaded.\nPrompt size. The extracted text counts against the model's context window. A big workbook or a long document can fill it; use sheetName, a leaner formatStyle, or a model with a larger window.","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Limitations","lvl3":""}},
|
|
4029
|
+
{"objectID":"80b48dc351da3300dd4ae708a7efc61f5f9acbf7f68e74e44c69870818bdd561","title":"The model says it cannot read the document","url":"/docs/features/office-documents#the-model-says-it-cannot-read-the-document","content":"Look for the Could not extract content note in the prompt. Typical causes:\nLegacy format: a .doc, .xls, or .ppt. Re-save it as .docx, .xlsx, or .pptx.\nCorrupt or truncated file: confirm it opens in Office. An Office Open XML file is a ZIP and starts with the bytes PK\\x03\\x04.\nPassword protection: remove the password before attaching.\nNo text in the file: a deck of pictures or a scanned document has nothing to extract, and a picture-only deck arrives as just the Presentation: N slide(s) header with no placeholder note. Convert scans to text with OCR first, or attach the images instead.","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"The model says it cannot read the document","lvl3":""}},
|
|
4030
|
+
{"objectID":"198d459661b8a685d7fb14d8055beaf3a54d861be0aa2a693f56466a93dad944","title":"A sheet is missing from the output","url":"/docs/features/office-documents#a-sheet-is-missing-from-the-output","content":"If you passed sheetName, the name must match exactly. When it does not, the prompt says so and lists the sheet names the workbook has.","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"A sheet is missing from the output","lvl3":""}},
|
|
4031
|
+
{"objectID":"501457e12f05fff01c8991f41dc2d1cea3faf87deb0ae8cf25a7a493c1ed24e8","title":"A request fails with Failed to process file","url":"/docs/features/office-documents#a-request-fails-with-failed-to-process-file","content":"The path or URL could not be loaded. Check that the file exists and that the process can read it.","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"A request fails with Failed to process file","lvl3":""}},
|
|
4032
|
+
{"objectID":"5e7fb0b35d33905448d83f51be5f6e64a657a27d50f6f3adf39df2131b4c6b78","title":"Migrating from Manual Extraction","url":"/docs/features/office-documents#migrating-from-manual-extraction","content":"If you extracted text yourself before sending it to the model:","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Migrating from Manual Extraction","lvl3":""}},
|
|
4045
4033
|
{"objectID":"3c03775b5336ca35d9a4ffcc088c74550acc1fe040bab1111a5a42543593f0b1","title":"Related Features","url":"/docs/features/office-documents#related-features","content":"Multimodal Chat - Overview of multimodal capabilities\nPDF Support - PDF document processing\nCSV Support - CSV file processing","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Related Features","lvl3":""}},
|
|
4046
|
-
{"objectID":"
|
|
4047
|
-
{"objectID":"
|
|
4048
|
-
{"objectID":"4d80bf1c1f7f6e958c718ca839b4eeee9d07b9051894b14b4b5571ccb79dfe8c","title":"Memory Usage","url":"/docs/features/office-documents#memory-usage","content":"Office files loaded as Buffers in memory\nLarge files may impact performance\nConsider processing large files in batches","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Memory Usage","lvl3":""}},
|
|
4049
|
-
{"objectID":"0893e21f1445185c5040fba620e54b1a7a049b92af5c328fb683bc3228112629","title":"Future Enhancements","url":"/docs/features/office-documents#future-enhancements","content":"Planned features for Office document support:\nOpenAI Support: Document-to-text conversion for GPT models\nAzure OpenAI: Native document support when available\nPage Selection: Analyze specific pages/slides/sheets only\nContent Extraction: Extract specific elements (tables, charts)\nTemplate Processing: Fill document templates with AI-generated content\nLegacy Format Support: Improved .doc, .xls, .ppt support","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Future Enhancements","lvl3":""}},
|
|
4050
|
-
{"objectID":"014e6c359962a668131d4519b39574e089edc3c0e6cbf723133d0643988f458a","title":"Feedback and Support","url":"/docs/features/office-documents#feedback-and-support","content":"Found a bug or have a feature request? Please:\nCheck existing issues on GitHub\nCreate a new issue with:\nProvider used\nOffice file details (format, size)\nError message or unexpected behavior\nSample code (if possible)","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Feedback and Support","lvl3":""}},
|
|
4051
|
-
{"objectID":"1fb344158b3e63c2ee68c030af4e06fa6eac4dab3a9249d043b68c216de1491a","title":"Version 8.3.0+","url":"/docs/features/office-documents#version-830","content":"✅ Initial Office document support for DOCX, PPTX, XLSX\n✅ AWS Bedrock native support via Converse API\n✅ Google Vertex AI support\n✅ Anthropic Claude support\n✅ Auto-detection via --file flag\n✅ Multiple document processing\n✅ Size limit validation\n✅ Comprehensive error messages\n✅ CLI and SDK integration\n✅ Streaming support\n✅ Mixed multimodal inputs (Office + PDF + CSV + images)\n\nNext: Multimodal Chat Guide | PDF Support | CSV Support","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Version 8.3.0+","lvl3":""}},
|
|
4034
|
+
{"objectID":"43d29a8740a9b75d0c8953329e35d05feb905b0e855683fbfc121992f415dbcb","title":"Office Document Processing Flow","url":"/docs/features/office-documents#office-document-processing-flow","content":"An extraction failure at step 3 produces the placeholder note shown under Error Handling instead of content.","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Office Document Processing Flow","lvl3":""}},
|
|
4035
|
+
{"objectID":"fbaf2f1f9a5b9c45e6c733fc6aca52c1c5fefd70b001825bf3177854c792f84b","title":"Implementation Files","url":"/docs/features/office-documents#implementation-files","content":"src/lib/processors/document/ - WordProcessor, ExcelProcessor, PptxProcessor, RtfProcessor, OpenDocumentProcessor\nsrc/lib/utils/fileDetector.ts - Format detection and routing of Office files to their readers\nsrc/lib/utils/messageBuilder.ts - Appends extracted text to the prompt\nsrc/lib/types/file.ts - OfficeProcessorOptions\nsrc/lib/files/fileReferenceRegistry.ts - Targeted slide, sheet, and row reads for files held in a FileReferenceRegistry (SDK only; not reached through input.files)\nsrc/cli/factories/commandFactory.ts - CLI --file flag handling\n\nNext: Multimodal Chat Guide | PDF Support | CSV Support","hierarchy":{"lvl0":"Features","lvl1":"Office Documents Support","lvl2":"Implementation Files","lvl3":""}},
|
|
4052
4036
|
{"objectID":"e4de9762f0dc156f476e41a2d0b060b933fd636614f6366ee0aeb002af7de1f4","title":"OpenCode Support for NeuroLink Proxy","url":"/docs/features/opencode-proxy-support","content":"OpenCode Support for NeuroLink Proxy\n\nStatus: Implemented & Verified\n\nThis document was originally written as a design proposal. Every item it called out as missing or to-be-built has since been implemented and verified end-to-end (see §11). The \"what was built\" wording in §4 and §8 reflects the delivered state; future-tense language has been kept only where it explains historical context.\nOverview\n\nNeuroLink's proxy currently supports Claude Code as a client — when neurolink proxy start runs, it automatically configures Claude Code by writing ANTHROPIC_BASE_URL to ~/.claude/settings.json. Claude Code then sends Anthropic Messages API requests to the proxy, which routes them to any provider.\n\nThis document describes adding OpenCode as a second supported client with the same zero-config experience: neurolink proxy start should auto-configure OpenCode so it connects to the proxy with no manual setup.\n\nWhat is OpenCode?\n\nOpenCode (github.com/sst/opencode) is an open-source AI coding agent built by the SST team. It is a TypeScript monorepo that shares the same technology stack as NeuroLink:\nVercel AI SDK (ai package) with streamText(), Tool types, ModelMessage\nProvider SDKs: @ai-sdk/openai, @ai-sdk/anthropic, @ai-sdk/openai-compatible, @ai-sdk/google, @ai-sdk/amazon-bedrock, @ai-sdk/azure, @ai-sdk/xai, @ai-sdk/mistral, @ai-sdk/groq, @openrouter/ai-sdk-provider, and more\nMCP: @modelcontextprotocol/sdk for tool integration\nZod: for tool parameter schemas\n\nOpenCode is provider-agnostic. It supports Claude, OpenAI, Google, Bedrock, Groq, Azure, xAI, Mistral, Cohere, and any OpenAI-compatible endpoint via @ai-sdk/openai-compatible.\nHow Claude Code Auto-Configuration Works Today\n\nWhen neurolink proxy start runs:\nServer starts on configured port (default 4141)\nAccounts are loaded from proxy config + OAuth credentials\nClaude Code settings are auto-configured:\nWrites to ~/.claude/settings.json\nSets env.ANTHROPIC_BASE_URL = \"http://localhost:<port>\"\nSets env.ENABLE_TOOL_SEARCH = \"true\"\nPreserves original values in __proxy_original_env for restoration\nOn proxy stop: restores original Claude Code settings\n\nKey code (src/cli/commands/proxy.ts):\n\nClaude Code then sends all requests to the proxy's /v1/messages endpoint (Anthropic Messages API format).\nHow OpenCode Configuration Works\n\nConfig File Locations\n\nOpenCode uses XDG base directories via the xdg-basedir npm package, which\nresolves XDG_CONFIG_HOME || ~/.config on every platform — there is no\nmacOS special case. (OpenCode's binary does contain a\n/Library/Application Support/opencode literal, but that is\nsystemManagedConfigDir(), an MDM policy directory at the filesystem root\nwith no $HOME prefix — not the per-user config path.)\n\n| Platform | Global Config Path |\n| ----------- | ----------------------------------------------- |\n| macOS | ~/.config/opencode/opencode.json |\n| Linux | ~/.config/opencode/opencode.json |\n| Windows | ~/.config/opencode/opencode.json (unverified) |\n\nThe macOS row was verified empirically against OpenCode 1.3.13 (embedded\nxdg-basedir source in the shipped binary, plus opencode models confirming\nwhich file is actually loaded). The Windows row follows from the same\nbranch-free resolution code but has not been checked on a Windows machine.\n\nProject-level config: .opencode/opencode.json in any parent directory.\n\nProvider Config Schema\n\nFrom packages/opencode/src/config/config.ts (line 787-846):\n\nHow OpenCode Loads Providers\n\nFrom packages/opencode/src/provider/provider.ts:\nBundled providers are imported directly (line 127-150):\nCustom providers from config's provider field get initialized with their options (including baseURL, apiKey)\nModel definitions come from models.dev API (fetched and cached) + config overrides\nAuto-discovery: if env vars for a provider are set (e.g., ANTHROPIC_API_KEY), that provider loads automatically\n\nThe Key: @ai-sdk/openai-compatible\n\nWhen OpenCode uses a custom provider with npm: \"@ai-sdk/openai-compatible\", it:\nCreates an SDK instance via createOpenAICompatible({ baseURL, apiKey })\nSends requests to {baseURL}/chat/completions (the AI SDK appends the path)\nUses standard OpenAI Chat Completions wire format\nHandles streaming via SSE (data: {\"choices\":[...]} format)\nThe Gap (Closed): What Was Built\n\nEndpoints — Added\n\nThe proxy now exposes both shapes:\n\n| Endpoint | Format | For client | Status |\n| ----------------------------------------- | --------------------------- | ------------ | ------------------------------------- |\n| POST /v1/messages | Anthropic Messages API | Claude Code | Pre-existing |\n| POST /v1/messages/count_tokens | Anthropic | Claude Code | Pre-existing |\n| GET /v1/models (Anthropic format) | Anthropic | Claude Code | Pre-existing","hierarchy":{"lvl0":"Features","lvl1":"OpenCode Support for NeuroLink Proxy","lvl2":"","lvl3":""}},
|
|
4053
4037
|
{"objectID":"ca403cc4256c3e210d4bd0a84930c5b515e9054daccfff7ce9e14695f52ee105","title":"Status: Implemented & Verified","url":"/docs/features/opencode-proxy-support#status-implemented-verified","content":"This document was originally written as a design proposal. Every item it called out as missing or to-be-built has since been implemented and verified end-to-end (see §11). The \"what was built\" wording in §4 and §8 reflects the delivered state; future-tense language has been kept only where it explains historical context.","hierarchy":{"lvl0":"Features","lvl1":"OpenCode Support for NeuroLink Proxy","lvl2":"Status: Implemented & Verified","lvl3":""}},
|
|
4054
4038
|
{"objectID":"4c8965a49c9b5a572f67e935ce38d4f7a364c47e6fd1049cada0c45358ee4516","title":"1. Overview","url":"/docs/features/opencode-proxy-support#1-overview","content":"NeuroLink's proxy currently supports Claude Code as a client — when neurolink proxy start runs, it automatically configures Claude Code by writing ANTHROPIC_BASE_URL to ~/.claude/settings.json. Claude Code then sends Anthropic Messages API requests to the proxy, which routes them to any provider.\n\nThis document describes adding OpenCode as a second supported client with the same zero-config experience: neurolink proxy start should auto-configure OpenCode so it connects to the proxy with no manual setup.","hierarchy":{"lvl0":"Features","lvl1":"OpenCode Support for NeuroLink Proxy","lvl2":"1. Overview","lvl3":""}},
|
|
@@ -4615,24 +4599,29 @@
|
|
|
4615
4599
|
{"objectID":"8a1f451537135b3f1ef892866610bb0dbabfe58ed1764bac2753046b8da98222","title":"MALFORMED_FUNCTION_CALL handling","url":"/docs/features/turn-time-budget#malformed_function_call-handling","content":"Gemini's MALFORMED_FUNCTION_CALL / UNEXPECTED_TOOL_CALL finish reasons\nmap to unified finishReason: \"error\" (never \"tool-calls\"). A\nMALFORMED_FUNCTION_CALL step is retried once with a corrective note;\nif it persists, the turn ends with stopReason: \"provider-error\" — usually\nworth a caller-side retry.","hierarchy":{"lvl0":"Features","lvl1":"Turn Time Budget","lvl2":"MALFORMED_FUNCTION_CALL handling","lvl3":""}},
|
|
4616
4600
|
{"objectID":"b858770b3853e797dfaac8ecfbd0c1f86c320e6a94e46a2e60f8407f328f6090","title":"Other Gemini finish reasons","url":"/docs/features/turn-time-budget#other-gemini-finish-reasons","content":"The native Gemini loops (AI Studio and Vertex) map the SDK's finish reason onto\nthe unified values below and keep the verbatim value in rawFinishReason.\nVertex puts the unified value on finishReason; on AI Studio it is the\nunified field of the finish part that model middleware receives.\n\n| Gemini finish reason | finishReason |\n| ----------------------------------------------------------------------------------------- | ---------------- |\n| MAX_TOKENS, CONTINUATION (token limit reached before the model was done) | length |\n| TOO_MANY_TOOL_CALLS (the model called tools until the system cut the turn off) | tool-calls |\n| MALFORMED_FUNCTION_CALL, UNEXPECTED_TOOL_CALL | error |\n| SAFETY, RECITATION, BLOCKLIST, PROHIBITED_CONTENT, SPII, LANGUAGE, IMAGE_*¹ | content-filter |\n| STOP, OTHER, FINISH_REASON_UNSPECIFIED, IMAGE_OTHER, NO_IMAGE | stop |\n\n¹ IMAGE_SAFETY, IMAGE_PROHIBITED_CONTENT and IMAGE_RECITATION.\n\ntool-calls also marks a turn that ran out of maxSteps, so branch on\nstopReason to tell the two apart: TOO_MANY_TOOL_CALLS leaves\nstopReason: \"completed\", a spent step budget reports step-cap. A value the\nSDK adds later reads stop until it is mapped.","hierarchy":{"lvl0":"Features","lvl1":"Turn Time Budget","lvl2":"Other Gemini finish reasons","lvl3":""}},
|
|
4617
4601
|
{"objectID":"a975fa8c9a970f09409f0cd78f26180dbef30bebfc60396f0eebda7776d8a3c3","title":"Telemetry","url":"/docs/features/turn-time-budget#telemetry","content":"result.analytics (when enableAnalytics is on) carries stepsUsed,\n toolCallCount, stopReason, elapsedMs, rawFinishReason.\nThe SDK emitter fires turn:lifecycle events (alongside\n tool:start/tool:end) for non-completed exits, tool timeouts, and\n malformed-call retries:","hierarchy":{"lvl0":"Features","lvl1":"Turn Time Budget","lvl2":"Telemetry","lvl3":""}},
|
|
4618
|
-
{"objectID":"4237dd71854673dfa0c8c155353abb6bf61149758ab7cd851436a49841b8dba3","title":"Video Analysis","url":"/docs/features/video-analysis","content":"Video Analysis\n\
|
|
4619
|
-
{"objectID":"288c031674e78fd4fcd753b2d753bff8b085367a321fac3e9845113df6361a2d","title":"Video Analysis","url":"/docs/features/video-analysis#video-analysis","content":"
|
|
4620
|
-
{"objectID":"
|
|
4621
|
-
{"objectID":"f9cd53c8cff1bc1a463d950ae0d3d406a2d29f14e7070d2f8d77d7b041fb2571","title":"How It Works","url":"/docs/features/video-analysis#how-it-works","content":"
|
|
4602
|
+
{"objectID":"4237dd71854673dfa0c8c155353abb6bf61149758ab7cd851436a49841b8dba3","title":"Video Analysis","url":"/docs/features/video-analysis","content":"Video Analysis\n\nAttach a video file to generate() or stream() and ask about it. What the model receives depends on the provider:\nGemini (Google AI Studio and Vertex AI) receives the clip itself, inline, with its audio track. It sees continuous motion and hears the speech.\nEvery other provider receives a metadata summary, timestamped keyframes as ordinary images, and any embedded subtitle track. It sees a handful of stills and hears nothing, unless you ask for a transcript with --transcribe-audio.\n\nVideo analysis suits screen recordings in particular: checking whether a workflow worked, finding the moment a UI went wrong, or comparing two recordings. The prompts in this guide ask for a logical audit of that kind. The audit style comes from your prompt; the SDK imposes no report format.\n\nFor the cross-modality overview (images, PDFs, audio, video) see the Multimodal guide.\n\nQuick Start\n\ninput.videoFiles and input.files are equivalent for video: videoFiles is folded into files before file detection runs. Each entry is a local path, a Buffer or a URL. Only a local path or a Buffer can be sent to Gemini as the clip itself; a URL is fetched for keyframes and metadata alone (see What qualifies a clip).\n\nHow It Works\nDetection. The file type is recognized from the file's leading bytes as well as its extension (MP4 and MOV by their ftyp box, AVI by its RIFF header, and so on). Through generate(), stream() and the CLI a file can be at most 100 MB. On the Gemini providers a larger file is refused with an error-level log line (File too large: ... (max: 100.00 MB), printed even without --debug) and the request goes on without it, and without any file listed after it in the same call: the model receives no ## Video File section at all.\nProcessing. VideoProcessor reads the duration, resolution, codecs, frame rate and bitrate, extracts timestamped keyframes with ffmpeg, extracts the first embedded subtitle track if there is one, and, only if you ask, transcribes the speech. The summary becomes a ## Video File section in the prompt text and the keyframes are attached as images, each labelled with the moment it was sampled.\nDelivery. If the provider can take video, the clip itself is added to the request as inline data, in addition to the summary and the keyframes. If it cannot, or the clip does not qualify, the model works from the summary and the keyframes alone.\n\nA video that cannot be processed at all (a corrupt file, say) does not fail the request: the model receives a short placeholder describing the attachment.\n\nNative Delivery to Gemini\n\nGemini accepts video inline, and takes the audio track with it. Sending the file itself needs no ffmpeg, so on a machine without it Gemini still receives the whole clip. Keyframes and the metadata summary are still attached when they could be produced.\n\nWhich providers\n\nThe capability table is VIDEO_PROVIDER_CONFIGS, keyed by provider name or alias:\n\n| Provider names | Delivery | Inline ceiling | Longest clip | Hears audio |\n| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- | -------------- | ------------ | ----------- |\n| vertex, google-vertex, googlevertex, google-ai-studio, googleaistudio, google-ai, googleai, gemini | Native, inline | 14 MB | 3600 s | yes |\n| openai, azure, anthropic, bedrock, amazon-bedrock, mistral, litellm, openrouter, openai-compatible, huggingface, sagemaker, deepseek, nvidia-nim, lmstudio, cerebras, sambanova | Keyframes | none | none | no |\n| ollama, llamacpp, llama-cpp | Keyframes | none | none | no |\n\nTwo details matter:\nA Vertex request for a model whose id contains claude is routed to the Anthropic SDK, which never sees a video part, so it gets the keyframe row, not the Gemini one.\nA provider that is not in the table keeps the keyframe behavior. The table says nothing about whether such a provider understands the frames; getVideoProviderConfig() returns null for it, and supportsNativeVideo() reads that as false.\n\nWhat qualifies a clip\n\nAll of these must hold, checked per clip:\nSource. The clip must be a local file path or a Buffer (or an object with a buffer). A URL is fetched for keyframes and the metadata summary only; its bytes are not kept for delivery, so it never goes to Gemini as a clip. This case is not reported as a fallback: n","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"","lvl3":""}},
|
|
4603
|
+
{"objectID":"288c031674e78fd4fcd753b2d753bff8b085367a321fac3e9845113df6361a2d","title":"Video Analysis","url":"/docs/features/video-analysis#video-analysis","content":"Attach a video file to generate() or stream() and ask about it. What the model receives depends on the provider:\nGemini (Google AI Studio and Vertex AI) receives the clip itself, inline, with its audio track. It sees continuous motion and hears the speech.\nEvery other provider receives a metadata summary, timestamped keyframes as ordinary images, and any embedded subtitle track. It sees a handful of stills and hears nothing, unless you ask for a transcript with --transcribe-audio.\n\nVideo analysis suits screen recordings in particular: checking whether a workflow worked, finding the moment a UI went wrong, or comparing two recordings. The prompts in this guide ask for a logical audit of that kind. The audit style comes from your prompt; the SDK imposes no report format.\n\nFor the cross-modality overview (images, PDFs, audio, video) see the Multimodal guide.","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"Video Analysis","lvl3":""}},
|
|
4604
|
+
{"objectID":"32013276172f573a97c140859e883ea31ef3885c90d864843b49a46cd5f6f820","title":"Quick Start","url":"/docs/features/video-analysis#quick-start","content":"input.videoFiles and input.files are equivalent for video: videoFiles is folded into files before file detection runs. Each entry is a local path, a Buffer or a URL. Only a local path or a Buffer can be sent to Gemini as the clip itself; a URL is fetched for keyframes and metadata alone (see What qualifies a clip).","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"Quick Start","lvl3":""}},
|
|
4605
|
+
{"objectID":"f9cd53c8cff1bc1a463d950ae0d3d406a2d29f14e7070d2f8d77d7b041fb2571","title":"How It Works","url":"/docs/features/video-analysis#how-it-works","content":"Detection. The file type is recognized from the file's leading bytes as well as its extension (MP4 and MOV by their ftyp box, AVI by its RIFF header, and so on). Through generate(), stream() and the CLI a file can be at most 100 MB. On the Gemini providers a larger file is refused with an error-level log line (File too large: ... (max: 100.00 MB), printed even without --debug) and the request goes on without it, and without any file listed after it in the same call: the model receives no ## Video File section at all.\nProcessing. VideoProcessor reads the duration, resolution, codecs, frame rate and bitrate, extracts timestamped keyframes with ffmpeg, extracts the first embedded subtitle track if there is one, and, only if you ask, transcribes the speech. The summary becomes a ## Video File section in the prompt text and the keyframes are attached as images, each labelled with the moment it was sampled.\nDelivery. If the provider can take video, the clip itself is added to the request as inline data, in addition to the summary and the keyframes. If it cannot, or the clip does not qualify, the model works from the summary and the keyframes alone.\n\nA video that cannot be processed at all (a corrupt file, say) does not fail the request: the model receives a short placeholder describing the attachment.","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"How It Works","lvl3":""}},
|
|
4606
|
+
{"objectID":"fe0b44ea5907afc3c6d8a349458f77c0d250aadc1129d1e9b242741e2b9ce0e4","title":"Native Delivery to Gemini","url":"/docs/features/video-analysis#native-delivery-to-gemini","content":"Gemini accepts video inline, and takes the audio track with it. Sending the file itself needs no ffmpeg, so on a machine without it Gemini still receives the whole clip. Keyframes and the metadata summary are still attached when they could be produced.","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"Native Delivery to Gemini","lvl3":""}},
|
|
4607
|
+
{"objectID":"79ca07ae077018944112070e21dc654f2dd5d62d80786f32637a03b6a2ef43ae","title":"Which providers","url":"/docs/features/video-analysis#which-providers","content":"The capability table is VIDEO_PROVIDER_CONFIGS, keyed by provider name or alias:\n\n| Provider names | Delivery | Inline ceiling | Longest clip | Hears audio |\n| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- | -------------- | ------------ | ----------- |\n| vertex, google-vertex, googlevertex, google-ai-studio, googleaistudio, google-ai, googleai, gemini | Native, inline | 14 MB | 3600 s | yes |\n| openai, azure, anthropic, bedrock, amazon-bedrock, mistral, litellm, openrouter, openai-compatible, huggingface, sagemaker, deepseek, nvidia-nim, lmstudio, cerebras, sambanova | Keyframes | none | none | no |\n| ollama, llamacpp, llama-cpp | Keyframes | none | none | no |\n\nTwo details matter:\nA Vertex request for a model whose id contains claude is routed to the Anthropic SDK, which never sees a video part, so it gets the keyframe row, not the Gemini one.\nA provider that is not in the table keeps the keyframe behavior. The table says nothing about whether such a provider understands the frames; getVideoProviderConfig() returns null for it, and supportsNativeVideo() reads that as false.","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"Which providers","lvl3":""}},
|
|
4608
|
+
{"objectID":"25dce466026a630874944fc947a50a15ed5ea154014a5c239558963a35774f08","title":"What qualifies a clip","url":"/docs/features/video-analysis#what-qualifies-a-clip","content":"All of these must hold, checked per clip:\nSource. The clip must be a local file path or a Buffer (or an object with a buffer). A URL is fetched for keyframes and the metadata summary only; its bytes are not kept for delivery, so it never goes to Gemini as a clip. This case is not reported as a fallback: no warning is logged and no reason is given, so a URL entry that you expected to be heard simply arrives as keyframes. Download the file first to send it whole.\nContainer. Gemini reads these inline: video/mp4, video/mpeg, video/mpg, video/mov, video/quicktime, video/avi, video/x-msvideo, video/x-flv, video/webm, video/wmv, video/x-ms-wmv and video/3gpp. Anything else, MKV for example, falls back to keyframes. There is no transcode step: re-encoding a long recording inside a generation request costs minutes of CPU, for a payload that would usually breach the ceiling anyway.\nSize. The 14 MB ceiling is one budget for the whole request, counted in source bytes, not a per-clip limit. Before a clip ships, its bytes are added to the source bytes of every inline part already in the request, which means images (the keyframes among them), PDFs, audio and any clip accepted earlier. With nothing else attached that is the clip's own size.\nDuration. At most 3600 s. A clip whose duration could not be measured is not refused for it.\n\nWhy 14 MB when Gemini documents 20 MB: inline data travels as base64 in a JSON body, which costs 4 bytes per 3, and the 20 MB limit covers the whole request, prompt and system instructions included. 14 MB of source encodes to about 18.7 MB, leaving headroom. 15 MB would encode to exactly 20.0 MB and leave none.","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"What qualifies a clip","lvl3":""}},
|
|
4609
|
+
{"objectID":"1a45a378b4628cb81c1a44566872ed9885ee0fd469a573fc6e54075d2801ddf1","title":"Falling back to keyframes","url":"/docs/features/video-analysis#falling-back-to-keyframes","content":"A clip that does not qualify is not an error. It is left out of the request, the model works from the summary and keyframes, and a warning names the reason. The one exception is a URL source (see above), which is silent. Warnings are only printed in debug mode (--debug, or NEUROLINK_DEBUG=true for the SDK), so run with one of those to see it:\n\nThe keyframes already in the request count against the budget, which is why that line speaks of the request's inline attachments. The reasons you can see are:\n<provider> does not accept video attachments\n<mime type> is not a container <provider> reads inline\nthe clip is X MB, over the 14MB inline ceiling for <provider>, or, when other inline parts already used part of the budget, the clip is X MB, which would bring this request's inline attachments to Y MB, over the 14MB inline ceiling shared by the whole request for <provider>\nthe clip runs N s, over the 3600s ceiling for <provider>\n\nA fallback loses the clip's audio, because keyframes carry none. If the speech matters, add --transcribe-audio (see Audio transcription) or shorten or compress the clip below the ceiling.\n\nClips above 14 MB are not uploaded through the Gemini Files API. That is a separate piece of work that has not been done, so the ceiling is a hard edge today.","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"Falling back to keyframes","lvl3":""}},
|
|
4610
|
+
{"objectID":"6df98e9bb24ba4251ea16a628607c8399b9117eca11629db7561d3f3e95d27c9","title":"Asking before you send","url":"/docs/features/video-analysis#asking-before-you-send","content":"The capability table is exported, so a caller can check a provider and a clip without making a request:\n\nestimateVideoTokens prices a native clip at 260 tokens per second, a keyframe at 250 tokens, and a minute of transcribed speech at 400. It is a budgeting estimate, not a quote.","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"Asking before you send","lvl3":""}},
|
|
4611
|
+
{"objectID":"f49e30185c2254b2d9f8d13f42cd434dea85d76d636375b71c6f228acef8d624","title":"Keyframes","url":"/docs/features/video-analysis#keyframes","content":"Every other provider, and Gemini when a clip falls back, works from keyframes.\nCadence. Without an explicit frames, the interval between frames follows the clip's duration:\n\n | Clip length | One frame every |\n | ------------ | --------------- |\n | up to 10 s | 1 s |\n | up to 30 s | 2 s |\n | up to 2 min | 3 s |\n | up to 10 min | 6 s |\n | up to 30 min | 20 s |\n | longer | 60 s |\n\n The total is capped at 100 frames; if a tier would produce more, the interval widens so the frames still cover the whole clip. The count does not depend on the provider. The recommendedFrameCount in the capability table (16, 8 or 4) is only what estimateVideoTokens assumes when you give it no frameCount; it does not set how many frames are extracted.\nSize. Frames are scaled to fit within 768 by 768 pixels, keeping the aspect ratio and never enlarging, then encoded as JPEG at quality 80 unless you set quality or format.\nTimestamps. Each frame carries the time ffmpeg actually sampled it at, in its image label and in a ## Keyframes list in the prompt, so \"what happens at 0:30?\" has an answer.\nSubtitles. The first embedded subtitle track is extracted as plain text and added under ## Subtitles / Captions, up to 10,000 characters. It is included whether or not you transcribe.\nNo ffmpeg, no frames. Frame extraction shells out to ffmpeg, which comes from the optional ffmpeg-static dependency or your PATH. Without it a keyframe provider receives the metadata summary and nothing visual, and no error is raised. Native Gemini delivery is unaffected.","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"Keyframes","lvl3":""}},
|
|
4612
|
+
{"objectID":"81795290c8f5734a415c1fe2aca479f392ed86267b697362eed7ac0380926363","title":"CLI Flags and videoOptions","url":"/docs/features/video-analysis#cli-flags-and-videooptions","content":"The flags are available on generate, stream and batch. --video attaches the clip (input.videoFiles). The other four flags each map to one field of the videoOptions object that generate() and stream() accept (type VideoProcessorOptions).\n\n| CLI flag | SDK field | Default | Meaning |\n| ------------------------- | ------------------------------ | ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| --video <path> | input.videoFiles | none | Attach a video; repeatable. --file <path> works too, but is not available on batch, where it would collide with the prompts-file positional. |\n| --video-frames <n> | videoOptions.frames | chosen from the duration, at most 100 | Keyframe budget. An explicit n is spread evenly across the whole clip and clamped to 100; zero, negative or non-numeric values are ignored. It is a ceiling: a clip with sparse frames can return fewer. |\n| --video-quality \\<1-100> | videoOptions.quality | 80 | Encoder quality for keyframes. Rounded and clamped to 1 to 100. |\n| --video-format <format> | videoOptions.format | jpeg | Keyframe encoding: jpeg or png. On Google AI Studio (google-ai) use jpeg: its PNG keyframes are currently sent labelled image/jpeg.","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"CLI Flags and videoOptions","lvl3":""}},
|
|
4613
|
+
{"objectID":"5c0b40920615303139197392d319ed23814495503c8c26a9ce62a5e57fa0fa83","title":"Audio Transcription","url":"/docs/features/video-analysis#audio-transcription","content":"Gemini hears the audio track of a clip it receives natively, so it does not need a transcript. Transcription is for the others: a recorded standup or a narrated demo reaches a keyframe provider with its entire spoken content missing, and \"summarize this meeting\" would be answered from a few screenshots. It also helps when a Gemini clip falls back to keyframes.\n\nSet --transcribe-audio, or videoOptions.transcribeAudio: true. It is off by default because it costs an ffmpeg pass plus a speech-to-text call, and most attached video is silent screen capture. The flag does not look at the provider: on Gemini, with the clip delivered natively, it still spends the ffmpeg pass and the speech-to-text call and adds the transcript to the prompt next to the audio Gemini already hears. Leave it off there.\n\nWhat happens. ffmpeg drops the video stream and writes the audio as mono 16 kHz MP3 (16-bit PCM WAV for an engine that does not read MP3). That goes to the speech-to-text engine, and the result is added to the prompt under ## Spoken Audio (transcribed), truncated at 20,000 characters. It is labelled as a machine transcription and kept apart from ## Subtitles / Captions, so the model can tell the two apart when both exist.\n\nWhich engine. The one named by NEUROLINK_STT_PROVIDER; otherwise the first configured hosted engine in this order: OpenAI-compatible Whisper (OPENAI_STT_API_KEY or OPENAI_API_KEY), Deepgram, ElevenLabs, Google Speech-to-Text, Azure Speech; otherwise the built-in local engine. Video uses the same engine selection as audio files and neurolink.transcribe(). See the transcribe guide for configuration.\n\nLimits. The extracted audio must be 25 MB or less. Audio extraction times out after 180 s and one transcription request after 120 s.\n\nFailure is not fatal. Transcription is best effort.","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"Audio Transcription","lvl3":""}},
|
|
4622
4614
|
{"objectID":"5e168624a526526bde730f1fa41b194f50f69477e008053ecfeb9478b1bd8ee1","title":"CLI Usage","url":"/docs/features/video-analysis#cli-usage","content":"Analyze any video file with a natural language prompt.\n\n`bash","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"CLI Usage","lvl3":""}},
|
|
4623
|
-
{"objectID":"2beb7cdd65aad32b4627b566f1ad0158c97dc642e7c2b70a538b24bc9524ab65","title":"Basic video analysis","url":"/docs/features/video-analysis#basic-video-analysis","content":"neurolink generate \"Analyze the login workflow in this video\" \\\n --
|
|
4615
|
+
{"objectID":"2beb7cdd65aad32b4627b566f1ad0158c97dc642e7c2b70a538b24bc9524ab65","title":"Basic video analysis","url":"/docs/features/video-analysis#basic-video-analysis","content":"neurolink generate \"Analyze the login workflow in this video\" \\\n --video ./recordings/screen-capture.mp4 \\\n --provider vertex \\\n --model gemini-2.5-flash\n`","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"Basic video analysis","lvl3":""}},
|
|
4624
4616
|
{"objectID":"5bbcc85cacab5d8285b1d0dd3b7f9c8e8f87e2688789a71286b15b71f5dc0523","title":"SDK Usage","url":"/docs/features/video-analysis#sdk-usage","content":"Integrate video analysis into your TypeScript/JavaScript projects.","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"SDK Usage","lvl3":""}},
|
|
4625
|
-
{"objectID":"477f1971b2ed446069626a085bb52d457acd8ce6de6d2d7eae3ded9f705f2396","title":"Advanced SDK Examples","url":"/docs/features/video-analysis#advanced-sdk-examples","content":"Custom Model Configuration\nFine-tune the analysis by adjusting token limits and temperature.\n\nDisabling Tool Interference\nBy default, the model might try to use available tools. For pure video analysis, you can disable them.","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"Advanced SDK Examples","lvl3":""}},
|
|
4617
|
+
{"objectID":"477f1971b2ed446069626a085bb52d457acd8ce6de6d2d7eae3ded9f705f2396","title":"Advanced SDK Examples","url":"/docs/features/video-analysis#advanced-sdk-examples","content":"Custom Model Configuration\nFine-tune the analysis by adjusting token limits and temperature.\n\nDisabling Tool Interference\nBy default, the model might try to use available tools. For pure video analysis, you can disable them.\n\nA provider without video support, with speech\nSend keyframes and a transcript to a provider that cannot take a clip.","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"Advanced SDK Examples","lvl3":""}},
|
|
4626
4618
|
{"objectID":"e8da7529d5ab85823deea2db05394f31e5ecf862d0a6323227b0ee768b1cff21","title":"1. UI/UX Bug Analysis","url":"/docs/features/video-analysis#1-uiux-bug-analysis","content":"Identify why a user is unable to complete a form or where the interface is misleading.\n\nPrompt: \"Find why the user is getting stuck at the payment step. Look for validation errors or hidden UI elements.\"","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"1. UI/UX Bug Analysis","lvl3":""}},
|
|
4627
4619
|
{"objectID":"0c9601bbe95e54b4a3aad6f81fe3f51b79c276a3a5538f60a95f6185163665ca","title":"2. Silent Failure Detection","url":"/docs/features/video-analysis#2-silent-failure-detection","content":"Detect cases where an action is taken but the system provides no feedback (no loaders, no success messages).\n\nPrompt: \"Audit the 'Submit' button click. Is there a visual 'bond' between the click and the next state? Report any lag or missing loading indicators.\"","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"2. Silent Failure Detection","lvl3":""}},
|
|
4628
4620
|
{"objectID":"b1cd293e3e616fd973c2b9a32d377f5e52c83efe91780479a771578461500d52","title":"3. Workflow Validation","url":"/docs/features/video-analysis#3-workflow-validation","content":"Verify if a complex multi-step process follows the intended business logic.\n\nPrompt: \"Trace the logical progression from 'Item Selection' to 'Checkout'. Does every state change correspond to a user action?\"","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"3. Workflow Validation","lvl3":""}},
|
|
4629
4621
|
{"objectID":"4d6474550ede4e74baaa46e74cf53f70f1f7f8835faadd163bb74bc0133371e5","title":"4. Comparison Analysis","url":"/docs/features/video-analysis#4-comparison-analysis","content":"Compare two recordings to find discrepancies in behavior.\n\nPrompt: \"Compare these two clips. The first one is the expected behavior and the second one has a bug. Identify the exact frame or timestamp where the logic deviates.\"","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"4. Comparison Analysis","lvl3":""}},
|
|
4630
|
-
{"objectID":"7db25ca977eed8a31bb24ee361f45e0a2f0f4b9644d011da50b6e3d5d31174e7","title":"Command Gallery","url":"/docs/features/video-analysis#command-gallery","content":"Quick CLI recipes for common tasks
|
|
4631
|
-
{"objectID":"
|
|
4632
|
-
{"objectID":"
|
|
4633
|
-
{"objectID":"e8f28fab18b5c5d56913e4eb89da371dc583211559e0683819e32f3ce3c5f110","title":"Forcing a specific provider","url":"/docs/features/video-analysis#forcing-a-specific-provider","content":"neurolink generate \"Extract patterns\" --file test.mp4 --provider vertex\n`","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"Forcing a specific provider","lvl3":""}},
|
|
4634
|
-
{"objectID":"b5c761aaea72621d94a6f8ab469ae99b8612b622b83277f0a725b3bb82bbf1d1","title":"The Analysis Report","url":"/docs/features/video-analysis#the-analysis-report","content":"The output is structured into four major sections designed to give you a complete understanding of the video:\nStrategic Overview & Intent: Defines the core activity, expected logic, and provides a primary verdict.\nThe Action-Reaction Chain: A granular, step-by-step audit of attempts, results, and technical inferences.\nCritical Findings: Categorized milestones or anomalies with root cause analysis and visual evidence in JSON.\nFinal Assessment: A conclusive summary of the logical flow based on the observed evidence.","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"The Analysis Report","lvl3":""}},
|
|
4635
|
-
{"objectID":"1f2bd84873465739c002846fe135f629903002f80a472a77931ccf676831a4dd","title":"Best Practices","url":"/docs/features/video-analysis#best-practices","content":"Frame Depth: Short videos (under 10s) get high-density frame coverage (1 per second), while long ones are intelligently sampled.\nPrompt Precision: While the model is a \"Critical Logic Auditor,\" you can guide it with specific questions about the activity.\nFormat: The analysis is returned as text in result.content, making it easy to store, display, or pipe to other tools.","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"Best Practices","lvl3":""}},
|
|
4622
|
+
{"objectID":"7db25ca977eed8a31bb24ee361f45e0a2f0f4b9644d011da50b6e3d5d31174e7","title":"Command Gallery","url":"/docs/features/video-analysis#command-gallery","content":"Quick CLI recipes for common tasks.","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"Command Gallery","lvl3":""}},
|
|
4623
|
+
{"objectID":"7a9101f88fa3f594b059acbcc51b6bb30449a055ff5bc9a387ad514f4e5cf85e","title":"Debug delivery and fallback decisions","url":"/docs/features/video-analysis#debug-delivery-and-fallback-decisions","content":"Full technical detail, including whether the clip or keyframes were sent and why:","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"Debug delivery and fallback decisions","lvl3":""}},
|
|
4624
|
+
{"objectID":"1f2bd84873465739c002846fe135f629903002f80a472a77931ccf676831a4dd","title":"Best Practices","url":"/docs/features/video-analysis#best-practices","content":"Prefer Gemini for anything with sound or fast motion. Only the native path sees what happens between frames and hears the audio.\nKeep clips under the ceiling. A recording that is a few megabytes at most travels whole; a longer one falls back to keyframes. Trimming to the relevant stretch, or re-encoding at a lower bitrate, keeps it on the native path. Remember the budget is shared with every other inline attachment in the same request.\nFrame depth. On the keyframe path, short videos (under 10 s) get one frame per second and long ones are sampled more sparsely. Set --video-frames to spend your frame budget evenly across a clip you care about.\nAdd a transcript only where it helps. --transcribe-audio is for providers that cannot hear the clip. It is not provider-aware, so on Gemini it only adds a redundant transcript and a speech-to-text call.\nPrompt precision. Guide the model with specific questions about the activity, and ask for the structure you want (a timeline, an action-reaction table, a verdict) in the prompt.\nFormat. The analysis is returned as text in result.content, making it easy to store, display, or pipe to other tools.","hierarchy":{"lvl0":"Features","lvl1":"Video Analysis","lvl2":"Best Practices","lvl3":""}},
|
|
4636
4625
|
{"objectID":"0af2cd2e57086d14cba79ae945f4f934c12cace5d06368f2d6846db441d467a8","title":"Video Director Mode – Multi-Clip Generation & Merging","url":"/docs/features/video-director-mode","content":"Video Director Mode\n\nDirector Mode extends NeuroLink's video generation capability to produce multi-segment videos with seamless AI-generated transitions. Instead of a single clip, you define an array of segments — each with its own prompt and image — and NeuroLink orchestrates the full pipeline: generating each clip, extracting boundary frames, producing transition videos (with individually configurable durations) using Veo 3.1's first-and-last-frame interpolation, and merging everything into one continuous video.\n\nOverview\n\nDirector Mode is triggered automatically when you supply an input.segments array to the video generation API. Each segment is a self-documenting { prompt, image } object, mapping cleanly to the pipeline concept of ordered video segments.\n\nHow It Works\nParallel clip generation – All main clips are generated concurrently (fixed concurrency of 2) via Veo 3.1's image-to-video endpoint, with a circuit breaker that trips after 2 consecutive failures to avoid wasted API calls\nFrame extraction – The last frame of clip N and first frame of clip N+1 are extracted from generated video buffers (with MP4 ftyp header validation)\nParallel transition generation – Veo 3.1 Fast's first-and-last-frame interpolation API generates transitions between each pair of adjacent clips in parallel (same concurrency limit), with individually configurable duration (4, 6, or 8 seconds each)\nSequential merge – Clips and transitions are concatenated: Clip₁ → Trans₁₋₂ → Clip₂ → Trans₂₋₃ → Clip₃ → …\nSingle output – The merged result is returned as one VideoGenerationResult buffer\n\nKey Technology: Veo First-and-Last-Frame Interpolation\n\nThe transition clips use Veo 3.1's native lastFrame parameter in the predictLongRunning API. Instead of generating from a single image, you provide two images — the first frame and the last frame — and Veo generates a video that smoothly interpolates between them:\n\nThis produces a physically coherent, AI-generated morph — far superior to simple crossfade or dissolve effects. The durationSeconds value is set independently for each transition (from the transitionDurations array), allowing shorter or longer interpolations per segment boundary.\n\nWhat You Get\nMulti-segment video – Chain any number of video segments into a single continuous output\nAI transitions – Per-transition configurable duration (4, 6, or 8 seconds each) generated by Veo 3.1 frame interpolation (not simple crossfades)\nParallel generation – Both main clips and transitions are generated concurrently (fixed concurrency of 2) with a circuit breaker for clip failures\nMixed image inputs – Each segment's image field accepts a Buffer, file path, URL, or ImageWithAltText\nConsistent settings – Resolution, aspect ratio, and audio settings apply uniformly across all segments and transitions\nPer-segment customization – Each segment is a self-contained { prompt, image } object\nBuffer validation – All video buffers are validated for MP4 ftyp headers before frame extraction and merging\nSDK only – Use programmatically via generate() (CLI not supported for Director Mode)\n\nSupported Provider & Model\n\n| Provider | Model | Interpolation Support | Transition Duration | Max Segments | Concurrency |\n| -------- | ------------------------------------------------ | --------------------- | ------------------- | ------------ | ----------- |\n| vertex | veo-3.1 (clips) / veo-3.1-fast (transitions) | First + Last Frame | 4-8s per transition | 10 | 2 (fixed) |\n\nNote: The lastFrame parameter is supported by veo-2.0-generate-001, veo-3.1-generate-001, and veo-3.1-fast-generate-001. NeuroLink uses veo-3.1-generate-001 for main clips and veo-3.1-fast-generate-001 for transition clips (faster generation with minimal quality difference for short interpolations).\n\nPrerequisites\n\nSame as Video Generation prerequisites, plus:\nSufficient quota – Director Mode generates N + (N-1) video operations (N clips + N-1 transitions). Ensure your Vertex AI project has adequate quota.\nAdequate timeout – Multi-segment generation takes proportionally longer. Set timeout accordingly (recommended: 5-10 minutes for 3+ segments).\n\nQuick Start\n\nSDK Usage\n\nUsing Image URLs\n\nMixed Input Types\n\nEach segment's image field accepts a Buffer, file path, URL, or ImageWithAltText:\n\nNote: Director Mode is SDK-only. CLI support is not available for this generation type. Use the standard --outputMode video CLI flags for single-clip video generation.\n\nComprehensive Examples\n\nExample 1: Product Commercial (3 Segments)\n\nExample 2: Social Media Story (Portrait, 4 Segments)\n\nExample 3: AI-Driven Storyboard\n\nExample 4: Batch Director Mode\n\nExample 5: Error Handling in Director Mode\n\n⚠️ Full-job retry warning: The generateWithRetry function below retries the entire neurolink.generate() call on any retriable VideoError. This means all segments and transitions are re-generated from scratch, incurring full cost each attempt ($10-60+ depending on set","hierarchy":{"lvl0":"Features","lvl1":"Video Director Mode – Multi-Clip Generation & Merging","lvl2":"","lvl3":""}},
|
|
4637
4626
|
{"objectID":"9dd83315c72382cd60863330c64a615aec84cadf693d7751bf8676806e359c94","title":"Video Director Mode","url":"/docs/features/video-director-mode#video-director-mode","content":"Director Mode extends NeuroLink's video generation capability to produce multi-segment videos with seamless AI-generated transitions. Instead of a single clip, you define an array of segments — each with its own prompt and image — and NeuroLink orchestrates the full pipeline: generating each clip, extracting boundary frames, producing transition videos (with individually configurable durations) using Veo 3.1's first-and-last-frame interpolation, and merging everything into one continuous video.","hierarchy":{"lvl0":"Features","lvl1":"Video Director Mode – Multi-Clip Generation & Merging","lvl2":"Video Director Mode","lvl3":""}},
|
|
4638
4627
|
{"objectID":"df7c4473d5ef1434c82a40e880da4d6ab470fcd00a0383199ed8c08fdca6e739","title":"Overview","url":"/docs/features/video-director-mode#overview","content":"Director Mode is triggered automatically when you supply an input.segments array to the video generation API. Each segment is a self-documenting { prompt, image } object, mapping cleanly to the pipeline concept of ordered video segments.","hierarchy":{"lvl0":"Features","lvl1":"Video Director Mode – Multi-Clip Generation & Merging","lvl2":"Overview","lvl3":""}},
|
|
@@ -11030,7 +11019,7 @@
|
|
|
11030
11019
|
{"objectID":"22bd26e8449443f75bf9c59c06b2c465783f6c12e603a47933dbc0ba49c51553","title":"McpRegistry","url":"/docs/sdk/api-reference#mcpregistry","content":"Registry interface with optional methods for maximum flexibility:","hierarchy":{"lvl0":"Sdk","lvl1":"API Reference","lvl2":"McpRegistry","lvl3":""}},
|
|
11031
11020
|
{"objectID":"1efe5dcbcb60c44d7b9129d079a965360e0f45a81d93514aa234450b1216818d","title":"Amazon Bedrock Models","url":"/docs/sdk/api-reference#amazon-bedrock-models","content":"Note: Bedrock requires full inference profile ARNs in environment variables.","hierarchy":{"lvl0":"Sdk","lvl1":"API Reference","lvl2":"Amazon Bedrock Models","lvl3":""}},
|
|
11032
11021
|
{"objectID":"62e1e79f4e6da4712c0b2495abee6b5d94ddd8cfe760520f7bcb738d9ccb336b","title":"Gemini 3 Models (Preview)","url":"/docs/sdk/api-reference#gemini-3-models-preview","content":"Google's latest generation Gemini models with enhanced reasoning capabilities and extended thinking support.\n\nModel Variants:\n\n| Model | Best For | Thinking Default | Speed |\n| ------------------------ | --------------------------- | ---------------- | ------- |\n| gemini-3-flash-preview | Fast tasks, simple queries | low | Fastest |\n| gemini-3-pro-preview | Complex reasoning, analysis | high | Slower |","hierarchy":{"lvl0":"Sdk","lvl1":"API Reference","lvl2":"Gemini 3 Models (Preview)","lvl3":""}},
|
|
11033
|
-
{"objectID":"4eba1ce1ca915df76be74a9dc7ec80916d09d12f016ca3ac2e1f7fa1a30b983e","title":"Office Document Types","url":"/docs/sdk/api-reference#office-document-types","content":"
|
|
11022
|
+
{"objectID":"4eba1ce1ca915df76be74a9dc7ec80916d09d12f016ca3ac2e1f7fa1a30b983e","title":"Office Document Types","url":"/docs/sdk/api-reference#office-document-types","content":"Office documents (DOCX, PPTX, XLSX) have no input field of their own. They travel in input.files like any other file, and NeuroLink turns them into text for the prompt, so they work with every provider:\n\nThe exported type also declares format, extractTextOnly, maxSizeMB, includeMetadata, processAllSheets, and includeSlideNotes; nothing reads them today. See the Office Documents guide for what the model receives for each format, including DOCX metrics, PPTX tables and speaker notes, and the placeholder note that replaces content a reader cannot extract (legacy .doc/.xls/.ppt, corrupt, or password-protected files).","hierarchy":{"lvl0":"Sdk","lvl1":"API Reference","lvl2":"Office Document Types","lvl3":""}},
|
|
11034
11023
|
{"objectID":"683e6e39ff52e9b07494eee375b55a3d52c29bf830e7a92cc8314e717a5230f9","title":"Built-in Tools","url":"/docs/sdk/api-reference#built-in-tools","content":"Every NeuroLink instance automatically includes these tools:\n\nExample with Tools:","hierarchy":{"lvl0":"Sdk","lvl1":"API Reference","lvl2":"Built-in Tools","lvl3":""}},
|
|
11035
11024
|
{"objectID":"79e783c9eccccb8ff6e3ca3c3abf3e652ba0726fc112aedfbebf8334c40a3a01","title":"Provider Tool Support Status","url":"/docs/sdk/api-reference#provider-tool-support-status","content":"| Provider | Tool Support | Notes |\n| ------------ | ------------ | ---------------------------------------------------- |\n| OpenAI | Full | All tools work correctly |\n| Google AI | Full | Excellent tool execution |\n| Anthropic | Full | Reliable tool usage |\n| Azure OpenAI | Full | Same as OpenAI |\n| Mistral | Full | Good tool support |\n| HuggingFace | Partial | Model sees tools but may describe instead of execute |\n| Vertex AI | Partial | Tools available but may not execute |\n| Ollama | Limited | Requires specific models like gemma3n |\n| Bedrock | Full\\* | Requires valid AWS credentials |","hierarchy":{"lvl0":"Sdk","lvl1":"API Reference","lvl2":"Provider Tool Support Status","lvl3":""}},
|
|
11036
11025
|
{"objectID":"18e03a0273cd7d56fbf74a2c168af25073b99a3c32f56a2fedc7f3404140d6f4","title":"Context Compaction","url":"/docs/sdk/api-reference#context-compaction","content":"Methods for managing conversation context size within model token limits. Requires conversation memory to be enabled.","hierarchy":{"lvl0":"Sdk","lvl1":"API Reference","lvl2":"Context Compaction","lvl3":""}},
|
|
@@ -11044,7 +11033,7 @@
|
|
|
11044
11033
|
{"objectID":"357bbb718f458d764e00524826a1d42a64da83167df93a52c04d9ddec3651764","title":"Core Events","url":"/docs/sdk/api-reference#core-events","content":"| Event | Emitted When |\n| ------------------ | ------------------------------------ |\n| generation:start | A generate() call begins |\n| generation:end | A generate() call completes |\n| stream:start | A stream() call begins |\n| stream:chunk | A new chunk arrives during streaming |\n| stream:end | Streaming completes normally |\n| stream:complete | Stream fully consumed |\n| stream:error | An error occurs during streaming |\n| tool:start | A tool execution begins |\n| tool:end | A tool execution completes |\n| response:start | A provider response begins |\n| response:end | A provider response completes |","hierarchy":{"lvl0":"Sdk","lvl1":"API Reference","lvl2":"Core Events","lvl3":""}},
|
|
11045
11034
|
{"objectID":"efcf19aa651c13dbc72ef4b3d0f83986ee180008a076c0db030509880e4d4b1a","title":"MCP Server Events","url":"/docs/sdk/api-reference#mcp-server-events","content":"| Event | Emitted When |\n| -------------------------------- | ----------------------------------------- |\n| externalMCP:serverConnected | An external MCP server connects |\n| externalMCP:serverDisconnected | An external MCP server disconnects |\n| externalMCP:serverFailed | An external MCP server connection fails |\n| externalMCP:toolDiscovered | A new tool is discovered on an MCP server |\n| externalMCP:toolRemoved | A tool is removed from an MCP server |\n| externalMCP:serverAdded | A new MCP server registration is added |\n| externalMCP:serverRemoved | An MCP server registration is removed |","hierarchy":{"lvl0":"Sdk","lvl1":"API Reference","lvl2":"MCP Server Events","lvl3":""}},
|
|
11046
11035
|
{"objectID":"c4d157804d0d96f1d8571e6aabeff4305aca0c07c151894dee3804d611331de6","title":"Other Events","url":"/docs/sdk/api-reference#other-events","content":"| Event | Emitted When |\n| ---------------------- | ----------------------------------- |\n| tools-register:start | Tool registration process begins |\n| tools-register:end | Tool registration process completes |\n| connected | Connection established |\n| message | General message event |\n| error | An error occurs |\n| log | A log message is emitted |\n| log-event | A structured log event is emitted |\n\nTypedEventEmitter Interface:","hierarchy":{"lvl0":"Sdk","lvl1":"API Reference","lvl2":"Other Events","lvl3":""}},
|
|
11047
|
-
{"objectID":"7ff1b31f163c4928ce88a79da3c279d1c1c6351ccf3cc5ad2464d2a03174f308","title":"Related Features","url":"/docs/sdk/api-reference#related-features","content":"Human-in-the-Loop (HITL) - Mark tools with requiresConfirmation: true\nGuardrails Middleware - Set middleware per call, in new NeuroLink({ middleware }) or with configureGlobalMiddleware(); add badWords or modelFilter to filter\nConversation History - Use getConversationHistory() method\nMultimodal Chat - Use images array in generate() options\nAuto Evaluation - Enable with enableEvaluation: true\nCLI Loop Sessions - Interactive mode with persistent state\nProvider Orchestration - Set enableOrchestration: true\nRegional Streaming - Use region parameter in generate()\nOffice Documents - Use
|
|
11036
|
+
{"objectID":"7ff1b31f163c4928ce88a79da3c279d1c1c6351ccf3cc5ad2464d2a03174f308","title":"Related Features","url":"/docs/sdk/api-reference#related-features","content":"Human-in-the-Loop (HITL) - Mark tools with requiresConfirmation: true\nGuardrails Middleware - Set middleware per call, in new NeuroLink({ middleware }) or with configureGlobalMiddleware(); add badWords or modelFilter to filter\nConversation History - Use getConversationHistory() method\nMultimodal Chat - Use images array in generate() options\nAuto Evaluation - Enable with enableEvaluation: true\nCLI Loop Sessions - Interactive mode with persistent state\nProvider Orchestration - Set enableOrchestration: true\nRegional Streaming - Use region parameter in generate()\nOffice Documents - Use the files array (or --file) for DOCX, PPTX, XLSX\nPDF Support - Use pdfFiles array for PDF documents\nCSV Support - Use csvFiles array for spreadsheet data\nCLI Commands Reference - CLI equivalents for all SDK methods\nConfiguration Guide - Environment variables and config files\nTroubleshooting - Common SDK issues and solutions\n\nBack to Main README | Next: Visual Demos","hierarchy":{"lvl0":"Sdk","lvl1":"API Reference","lvl2":"Related Features","lvl3":""}},
|
|
11048
11037
|
{"objectID":"72ff7213f71cd3e590c196c5a1a39a7ab2af152776936e1a647f228cae34de6e","title":"🔧 SDK Custom Tools Guide","url":"/docs/sdk/custom-tools-guide","content":"🔧 SDK Custom Tools Guide\n\nBuild powerful AI applications by extending NeuroLink with your own custom tools.\n\n📋 Overview\n\nNeuroLink's SDK allows you to register custom tools programmatically, giving your AI assistants access to any functionality you need. All registered tools work seamlessly with the built-in tool system across all supported providers.\n\nKey Features\n✅ Type-Safe: Full TypeScript support with Zod schema validation\n✅ Provider Agnostic: Works with all providers that support tools\n✅ Easy Integration: Simple API for tool registration\n✅ Async Support: All tools run asynchronously\n✅ Error Handling: Graceful error handling built-in\n\n🚀 Quick Start\n\nBasic Tool Registration\n\n⚠️ Common Mistakes\n\n❌ Using schema instead of parameters\n\n❌ Using plain JSON schema as parameters\n\n✅ Correct Zod Schema Format\n\n📖 SimpleTool Interface\n\nAll custom tools implement the SimpleTool interface:\n\nInterface Components\ndescription: Clear, actionable description that helps the AI understand when to use the tool\nparameters: Optional Zod schema for validating inputs (highly recommended)\nexecute: Async function that implements the tool's logic\n\n🛠️ Registration Methods\n\nRegister Single Tool\n\nRegister Multiple Tools\n\nGet Custom Tools\n\n💡 Common Use Cases\nAPI Integration\nDatabase Operations\nData Processing\nFile Operations\nExternal Service Integration\n\n🎯 Best Practices\nClear Descriptions\n\nMake tool descriptions specific and actionable:\nParameter Validation\n\nAlways use Zod schemas for type safety:\nError Handling\n\nHandle errors gracefully:\n\nA returned error is classified as a failure everywhere the SDK reports one,\nexactly as a thrown error is. A result is error-shaped when it carries\nisError: true (the MCP convention), a non-null error field ({ error:\n\"User not found\" }), or a status of \"error\" / \"failed\" / \"failure\" /\n\"fail\". Such a call emits tool:end with success: false and the error\ntext, is stored in session memory as success: false, replays on later turns\nas [called <tool> → error], and is reported with isError: true in\nresult.toolExecutions. The model still receives the full object you\nreturned — classification only affects telemetry and memory, never what the\nmodel sees.\nAsync Operations\n\nAll execute functions must return promises:\nTool Naming\n\nUse clear, consistent naming:\n\n🧪 Testing Your Tools\n\nUnit Testing\n\nIntegration Testing\n\n🔍 Debugging Tools\n\nEnable Debug Mode\n\nLog Tool Execution\n\n🚀 Advanced Patterns\n\nTool Composition\n\nTool Middleware\n\nDynamic Tool Registration\n\nForcing a Tool Call\n\ntoolChoice tells the model whether it must call a tool on a step:\n\n| Value | Effect |\n| --------------------------------- | ------------------------------------------------ |\n| \"auto\" (default) | The model decides whether and which tool to call |\n| \"none\" | No tool calls on any step |\n| \"required\" | The model must call at least one tool |\n| { type: \"tool\", toolName: \"x\" } | The model must call the named tool |\n\nA forced choice (\"required\" or a named tool) is applied only to the first\ntoolChoiceSteps steps of the tool loop — default 1 — after which the\nmodel is free to answer. Holding a forced choice on every step would compel\na tool call on every step, and the turn could only end when maxSteps ran\nout. \"auto\" and \"none\" are applied unchanged on every step.\n\nFor anything finer, prepareStep runs before every step and may return a\ntoolChoice for that step, which takes precedence over toolChoiceSteps:\n\nprepareStep receives { stepNumber, steps, maxSteps, model }, where steps\nholds one record per completed step (its text, tool calls — with input\nalready parsed into an object — tool results, finish reason and usage,\nincluding prompt-cache tokens where the provider reports them). Only the\nreturned toolChoice is honoured; the legacy model and\nexperimental_activeTools / activeTools fields are accepted for source\ncompatibility but ignored, and their presence is logged once as a warning —\nuse toolFilter / excludeTools to scope tools. A hook that throws is\nlogged and that step falls back to the toolChoice / toolChoiceSteps rule;\na hook still pending when the turn is aborted or times out is released with\nthe abort. Both toolChoice and prepareStep apply to stream() as well.\n\nVertex, Google AI Studio and Bedrock do not honour toolChoice at all today.\nSageMaker honours tools, toolChoice and prepareStep on generate()\nonly: its stream() sends the prompt without tools.\n\n📊 Performance Considerations\nTimeout Handling\nCaching\nBatch Operations\n\n🔒 Security Considerations\n\nInput Sanitization\n\nPermission Checking\n\nRate Limiting\n\n🎉 Complete Example\n\nHere's a complete example combining multiple concepts:\n\n🌐 MCP Server Integration\n\nBeyond simple tool registration, NeuroLink SDK supports adding complete MCP (Model Context Protocol) servers for more complex tool ecosystems.\n\nAdding I","hierarchy":{"lvl0":"Sdk","lvl1":"🔧 SDK Custom Tools Guide","lvl2":"","lvl3":""}},
|
|
11049
11038
|
{"objectID":"fe570104af53b04cac97749a24ce61018428abe7df180a14a7285ebf6fda6fca","title":"🔧 SDK Custom Tools Guide","url":"/docs/sdk/custom-tools-guide#-sdk-custom-tools-guide","content":"Build powerful AI applications by extending NeuroLink with your own custom tools.","hierarchy":{"lvl0":"Sdk","lvl1":"🔧 SDK Custom Tools Guide","lvl2":"🔧 SDK Custom Tools Guide","lvl3":""}},
|
|
11050
11039
|
{"objectID":"4c744b8358a0761297815b9e1244bad43bebb4ece00ddac4cb24b186dbae5647","title":"📋 Overview","url":"/docs/sdk/custom-tools-guide#-overview","content":"NeuroLink's SDK allows you to register custom tools programmatically, giving your AI assistants access to any functionality you need. All registered tools work seamlessly with the built-in tool system across all supported providers.","hierarchy":{"lvl0":"Sdk","lvl1":"🔧 SDK Custom Tools Guide","lvl2":"📋 Overview","lvl3":""}},
|