docs/en/api/02-resources.md
Resources are external knowledge that agents can reference. This module provides functionality for adding, importing/exporting, and uploading temporary files for resources.
OpenViking supports various resource types, categorized by functionality:
Documents
| Type | Extensions | Description |
|---|---|---|
.pdf | Supports local parsing and MinerU API conversion | |
| Markdown | .md, .markdown, .mdown, .mkd | Native support, extracts structure and stores in segments |
| HTML | .html, .htm | Cleans navigation/ads and extracts content, converts to Markdown |
| Word | .docx | Extracts text, headings, tables and converts to Markdown |
| Plain Text | .txt, .text | Direct import and processing |
| EPUB | .epub | E-book format, supports ebooklib or manual extraction |
Spreadsheets & Presentations
| Type | Extensions | Description |
|---|---|---|
| Excel | .xlsx, .xls, .xlsm | Supports new and legacy Excel formats, converts to Markdown tables by worksheet |
| PowerPoint | .pptx | Extracts content by slide, supports extracting notes |
Code
| Type | Resource Name | Description |
|---|---|---|
| Code Files | *.py, *.js, ... | Supports common programming languages (Python, JavaScript, Go, Rust, Java, etc.) |
| Git Protocol Repository | git://... | Git URL, local directory, .zip package, respects .gitignore and automatically filters .git, node_modules and other directories |
| Git Code Hosting Platform | https://github.com/{org}/{repo} | URLs from GitHub, GitLab, Bitbucket and other code hosting platforms |
| Raw Files from Git Hosting | https://github.com/{org}/{repo}/raw/{branch}/{path} | Raw file download URLs from GitHub, GitLab, Bitbucket and other platforms |
Media
| Type | Resource Name | Description |
|---|---|---|
| Images | *.jpg, *.jpeg, *.png, *.gif ... | Various image formats, descriptions generated via VLM (Experimental) |
| Video | *.mp4, *.avi, *.mov ... | Extracts keyframes and analyzes with VLM (Planning) |
| Audio | *.mp3, *.wav, *.m4a ... | Performs speech transcription (Planning) |
Cloud Documents
| Type | Description |
|---|---|
| Feishu/Lark | URL-based, supports docx, wiki, sheets, bitable, requires FEISHU_APP_ID and FEISHU_APP_SECRET configuration |
Resources go through the following processing stages when added:
Source Input -> Parse -> Resource Tree Build -> Persistence -> Semantic Processing
↓ ↓ ↓ ↓ ↓
URL/File Parser TreeBuilder AGFS Summarizer/Vector
UnifiedResourceProcessor to parse content based on resource typeTreeBuilder.finalize_from_temp() scans the temporary directory structureSummarizer generates L0 (abstract) and L1 (overview)SemanticQueue, can wait for completion with wait=TrueResource incremental updates are implemented via the Watch Task mechanism:
watch_interval > 0 (in minutes) when calling add_resource to create a watch taskto parameter to define the target URIWatchManager handles task persistenceWatchScheduler checks for expired tasks every 60 secondsadd_resourcewatch_interval > 0watch_interval <= 0 for the same target URIAdd a resource to the knowledge base. Supports local files/directories, URLs, and other sources.
This endpoint is the core entry point for resource management, supporting adding resources from various sources with optional waiting for semantic processing completion.
Processing Flow:
watch_interval is specifiedwait=trueCode Entry Points:
openviking/client/local.py:LocalClient.add_resource - SDK entry (embedded)openviking_cli/client/http.py:AsyncHTTPClient.add_resource - SDK entry (HTTP)openviking/server/routers/resources.py:add_resource - HTTP routeropenviking/service/resource_service.py - Core service implementationcrates/ov_cli/src/handlers.rs:handle_add_resource - CLI handlerParameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| path | string | No | - | Remote resource URL (HTTP/HTTPS/Git). Mutually exclusive with temp_file_id |
| temp_file_id | string | No | - | Temporary upload file ID. Mutually exclusive with path |
| to | string | No | - | Target Viking URI (exact location). Mutually exclusive with parent |
| parent | string | No | - | Parent Viking URI (resource placed under this directory). Mutually exclusive with to |
| reason | string | No | "" | Reason for adding the resource (for documentation and relevance improvement, experimental feature) |
| instruction | string | No | "" | Processing instructions for semantic extraction (experimental feature) |
| wait | bool | No | False | Whether to wait for semantic processing and vectorization to complete before returning |
| timeout | float | No | None | Timeout in seconds, only effective when wait=True |
| strict | bool | No | False | Whether to use strict mode |
| ignore_dirs | string | No | None | Directory names to ignore (comma-separated) |
| include | string | No | None | File patterns to include (glob) |
| exclude | string | No | None | File patterns to exclude (glob) |
| directly_upload_media | bool | No | True | Whether to directly upload media files |
| preserve_structure | bool | No | None | Whether to preserve directory structure |
| watch_interval | float | No | 0 | Scheduled update interval (minutes). >0 creates task; <=0 cancels task |
| telemetry | TelemetryRequest | No | False | Whether to return telemetry data |
Additional Notes:
to and parent cannot be specified togetherpath and temp_file_id cannot be specified togethertemp_file_idto is specified and the target already exists, triggers incremental updatewatch_interval only takes effect when to is provided.gitignore files (root and nested) with standard Git semantics; ignore_dirs, include, and exclude further refine what is ingested.HTTP API
POST /api/v1/resources
Content-Type: application/json
# Add resource from URL
curl -X POST http://localhost:1933/api/v1/resources \
-H "Content-Type: application/json" \
-H "X-API-Key: your-key" \
-d '{
"path": "https://example.com/guide.md",
"reason": "User guide documentation",
"wait": true
}'
# Add from local file (requires temp_upload first)
TEMP_FILE_ID=$(
curl -s -X POST http://localhost:1933/api/v1/resources/temp_upload \
-H "X-API-Key: your-key" \
-F "file=@./documents/guide.md" \
| jq -r '.result.temp_file_id'
)
curl -X POST http://localhost:1933/api/v1/resources \
-H "Content-Type: application/json" \
-H "X-API-Key: your-key" \
-d "{
\"temp_file_id\": \"$TEMP_FILE_ID\",
\"to\": \"viking://resources/guide.md\",
\"reason\": \"User guide\"
}"
Python SDK
import openviking as ov
# Using embedded mode
client = ov.OpenViking(path="./data")
client.initialize()
# Or using HTTP client
client = ov.SyncHTTPClient(url="http://localhost:1933", api_key="your-key")
client.initialize()
# Add local file
result = client.add_resource(
"./documents/guide.md",
reason="User guide documentation"
)
print(f"Added: {result['root_uri']}")
# Add from URL to specific location
result = client.add_resource(
"https://example.com/api-docs.md",
to="viking://resources/external/api-docs.md",
reason="External API documentation"
)
# Wait for processing to complete
client.wait_processed()
# Enable scheduled updates
client.add_resource(
"./documents/guide.md",
to="viking://resources/guide.md",
watch_interval=60 # Update every 60 minutes
)
CLI
# Add local file
ov add-resource ./documents/guide.md --reason "User guide"
# Add from URL
ov add-resource https://example.com/guide.md --to viking://resources/guide.md
# Wait for processing to complete
ov add-resource ./documents/guide.md --wait
# Enable scheduled updates (check every 60 minutes)
ov add-resource https://github.com/example/repo.git --to viking://resources/guide.md --watch-interval 60
# Cancel scheduled updates
ov add-resource https://github.com/example/repo.git --to viking://resources/guide.md --watch-interval 0
Response Example
HTTP API Response (JSON)
{
"status": "ok",
"result": {
"status": "success",
"root_uri": "viking://resources/guide.md",
"temp_uri": "viking://temp/username/04291108_b62dc7/guide.md",
"source_path": "./documents/guide.md",
"meta": {},
"errors": [],
"queue_status": {
"pending": 5,
"processing": 2,
"completed": 10
}
},
"telemetry": {
"operation_id": "550e8400-e29b-41d4-a716-446655440000"
}
}
CLI Response (Default Table Format)
Note: Resource is being processed in the background.
Use 'ov wait' to wait for completion, or 'ov observer queue' to check status.
status success
errors []
source_path /Users/bytedance/workspace/github.com/OpenViking/docs/en/api/01-overview.md
meta {}
root_uri viking://resources/01-overview
temp_uri viking://temp/shengmaojia/04291108_b62dc7/01-overview
CLI Response (JSON Format, using -o json)
{
"status": "success",
"root_uri": "viking://resources/01-overview",
"temp_uri": "viking://temp/shengmaojia/04291108_b62dc7/01-overview",
"source_path": "/Users/bytedance/workspace/github.com/OpenViking/docs/en/api/01-overview.md",
"meta": {},
"errors": []
}
Field Description
| Field | Type | Description |
|---|---|---|
status | string | Processing status: "success" or "error" |
root_uri | string | Final URI of the resource in OpenViking |
temp_uri | string | Temporary URI during processing (only valid during background processing) |
source_path | string | Original source file path or URL |
meta | object | Metadata from resource parsing (file type, size, etc.) |
errors | array | List of errors encountered during processing |
warnings | array | (Optional) List of warnings (only when strict=False) |
queue_status | object | (Optional, only when wait=true) Queue processing status with pending, processing, completed counts |
Add a skill to the knowledge base.
Skills are special resources used to define operations or tools that agents can execute.
Processing Flow:
wait=trueCode Entry Points:
openviking/client/local.py:LocalClient.add_skill - SDK entry (embedded)openviking_cli/client/http.py:AsyncHTTPClient.add_skill - SDK entry (HTTP)openviking/server/routers/resources.py:add_skill - HTTP routeropenviking/service/resource_service.py - Core service implementationcrates/ov_cli/src/handlers.rs:handle_add_skill - CLI handlerParameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| data | Any | No | - | Inline skill content or structured data. Mutually exclusive with temp_file_id |
| temp_file_id | string | No | - | Temporary upload file ID (obtained via temp_upload). Mutually exclusive with data |
| wait | bool | No | False | Whether to wait for skill processing to complete |
| timeout | float | No | None | Timeout in seconds, only effective when wait=True |
| telemetry | TelemetryRequest | No | False | Whether to return telemetry data |
HTTP API
POST /api/v1/skills
Content-Type: application/json
# Using inline data
curl -X POST http://localhost:1933/api/v1/skills \
-H "Content-Type: application/json" \
-H "X-API-Key: your-key" \
-d '{
"data": {
"name": "my-skill",
"description": "My custom skill",
"steps": []
}
}'
# Using local file (requires temp_upload first)
TEMP_FILE_ID=$(
curl -s -X POST http://localhost:1933/api/v1/resources/temp_upload \
-H "X-API-Key: your-key" \
-F "file=@./skills/my-skill.json" \
| jq -r '.result.temp_file_id'
)
curl -X POST http://localhost:1933/api/v1/skills \
-H "Content-Type: application/json" \
-H "X-API-Key: your-key" \
-d "{
\"temp_file_id\": \"$TEMP_FILE_ID\"
}"
Python SDK
import openviking as ov
client = ov.SyncHTTPClient(url="http://localhost:1933", api_key="your-key")
client.initialize()
# Add skill from local file
result = client.add_skill("./skills/my-skill.json")
# Wait for processing to complete
client.wait_processed()
CLI
# Add skill
ov add-skill ./skills/my-skill.json
# Wait for processing to complete
ov add-skill ./skills/my-skill.json --wait
HTTP API Response (JSON)
{
"status": "ok",
"result": {
"status": "success",
"root_uri": "viking://agent/skills/my-skill",
"uri": "viking://agent/skills/my-skill",
"name": "my-skill",
"auxiliary_files": 2,
"queue_status": {
"pending": 0,
"processing": 0,
"completed": 1
}
},
"telemetry": {
"operation_id": "550e8400-e29b-41d4-a716-446655440000"
}
}
CLI Response (Default Table Format)
Note: Skill is being processed in the background.
Use 'ov wait' to wait for completion, or 'ov observer queue' to check status.
status success
root_uri viking://agent/skills/my-skill
uri viking://agent/skills/my-skill
name my-skill
auxiliary_files 2
CLI Response (JSON Format, using -o json)
{
"status": "success",
"root_uri": "viking://agent/skills/my-skill",
"uri": "viking://agent/skills/my-skill",
"name": "my-skill",
"auxiliary_files": 2
}
Field Description
| Field | Type | Description |
|---|---|---|
status | string | Processing status: "success" or "error" |
root_uri | string | Final URI of the skill in OpenViking (same as uri) |
uri | string | Final URI of the skill in OpenViking (same as root_uri) |
name | string | Skill name |
auxiliary_files | number | Number of auxiliary files attached to the skill |
queue_status | object | (Optional, only when wait=true) Queue processing status with pending, processing, completed counts |
Upload a temporary file for subsequent importing of local files via add_resource or add_skill.
This endpoint is used to upload local files to server temporary storage, returning a temp_file_id for use with subsequent API calls. This is a helper endpoint typically not called directly but used automatically via the SDK or CLI.
Processing Flow:
Code Entry Points:
openviking/server/routers/resources.py:temp_upload - HTTP routeropenviking/service/resource_service.py - Service implementationParameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| file | UploadFile | Yes | - | Uploaded file (multipart/form-data) |
| telemetry | bool | No | False | Whether to return telemetry data |
HTTP API
POST /api/v1/resources/temp_upload
Content-Type: multipart/form-data
curl -X POST http://localhost:1933/api/v1/resources/temp_upload \
-H "X-API-Key: your-key" \
-F "file=@./documents/guide.md"
Python SDK
The add_resource, add_skill and other endpoints in the Python SDK automatically handle local file uploads, no need to call this endpoint manually.
CLI
CLI commands also automatically handle local file uploads, no need to call this endpoint manually.
Response Example
{
"status": "ok",
"result": {
"temp_file_id": "upload_abc123def456.md"
},
"telemetry": {
"operation_id": "550e8400-e29b-41d4-a716-446655440000"
}
}