@larkup/tool-video-intelligence 0.2.0
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/.env.example +150 -0
- package/LICENSE +176 -0
- package/README.md +281 -0
- package/compose.gpu.yaml +14 -0
- package/compose.yaml +71 -0
- package/dist/agent.d.ts +131 -0
- package/dist/agent.js +2087 -0
- package/dist/brief.d.ts +2 -0
- package/dist/brief.js +37 -0
- package/dist/client.d.ts +46 -0
- package/dist/client.js +139 -0
- package/dist/contracts.d.ts +331 -0
- package/dist/contracts.js +1 -0
- package/dist/index.d.ts +87 -0
- package/dist/index.js +391 -0
- package/dist/runtime.d.ts +96 -0
- package/dist/runtime.js +592 -0
- package/dist/ui.d.ts +82 -0
- package/dist/ui.js +87 -0
- package/package.json +84 -0
- package/runtime/Dockerfile +119 -0
- package/runtime/app/__init__.py +3 -0
- package/runtime/app/__main__.py +19 -0
- package/runtime/app/api/__init__.py +0 -0
- package/runtime/app/api/deps.py +69 -0
- package/runtime/app/api/v1.py +166 -0
- package/runtime/app/config.py +78 -0
- package/runtime/app/db/__init__.py +0 -0
- package/runtime/app/db/schemas.py +162 -0
- package/runtime/app/db/store.py +466 -0
- package/runtime/app/main.py +27 -0
- package/runtime/app/model_configuration.py +157 -0
- package/runtime/app/services/__init__.py +0 -0
- package/runtime/app/services/brain.py +2221 -0
- package/runtime/app/services/embedding.py +473 -0
- package/runtime/app/services/jobs.py +237 -0
- package/runtime/app/services/motion.py +66 -0
- package/runtime/app/services/pipeline.py +1911 -0
- package/runtime/app/services/scene.py +161 -0
- package/runtime/app/services/storage.py +44 -0
- package/runtime/app/services/transcription.py +667 -0
- package/runtime/app/services/vision.py +1441 -0
- package/runtime/app/utils/__init__.py +0 -0
- package/runtime/app/utils/timing.py +99 -0
- package/runtime/app/worker.py +20 -0
- package/runtime/pyproject.toml +56 -0
- package/runtime/requirements-cpu.txt +15 -0
- package/runtime/requirements-smoke.txt +7 -0
- package/runtime/requirements.txt +14 -0
- package/runtime/uv.lock +3637 -0
- package/scripts/grant-cloud-credits.sh +43 -0
- package/scripts/runtime.mjs +156 -0
- package/scripts/validate-indexing.mjs +168 -0
- package/tool.manifest.json +617 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"""Job-scoped user model credentials shared by cloud worker entrypoints."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from contextlib import contextmanager
|
|
6
|
+
import os
|
|
7
|
+
import threading
|
|
8
|
+
from typing import Any, Iterator
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
_MANAGED_KEYS = (
|
|
12
|
+
"LARKUP_VIDEO_AGENT_ENABLED",
|
|
13
|
+
"LARKUP_VIDEO_AGENT_PROVIDER",
|
|
14
|
+
"LARKUP_VIDEO_AGENT_API_KEY",
|
|
15
|
+
"LARKUP_VIDEO_AGENT_MODEL",
|
|
16
|
+
"LARKUP_VIDEO_PLANNER_MODEL",
|
|
17
|
+
"LARKUP_VIDEO_SEMANTIC_VISION",
|
|
18
|
+
"LARKUP_VIDEO_VISION_PROVIDER",
|
|
19
|
+
"LARKUP_VIDEO_VISION_API_KEY",
|
|
20
|
+
"LARKUP_VIDEO_SEMANTIC_VISION_MODEL",
|
|
21
|
+
"LARKUP_VIDEO_REASONING_VISION_MODEL",
|
|
22
|
+
"LARKUP_VIDEO_TRANSCRIPTION_PROVIDER",
|
|
23
|
+
"LARKUP_VIDEO_TRANSCRIPTION_FALLBACK",
|
|
24
|
+
"LARKUP_VIDEO_DEEPGRAM_MODEL",
|
|
25
|
+
"LARKUP_VIDEO_DEEPGRAM_AUTO_MODEL",
|
|
26
|
+
"LARKUP_VIDEO_OPENAI_TRANSCRIPTION_MODEL",
|
|
27
|
+
"LARKUP_VIDEO_GROQ_TRANSCRIPTION_MODEL",
|
|
28
|
+
"LARKUP_VIDEO_ELEVENLABS_TRANSCRIPTION_MODEL",
|
|
29
|
+
"DEEPGRAM_API_KEY",
|
|
30
|
+
"OPENAI_API_KEY",
|
|
31
|
+
"GROQ_API_KEY",
|
|
32
|
+
"ELEVENLABS_API_KEY",
|
|
33
|
+
"AI_GATEWAY_API_KEY",
|
|
34
|
+
"LARKUP_VIDEO_AGENT_BASE_URL",
|
|
35
|
+
"LARKUP_VIDEO_VISION_BASE_URL",
|
|
36
|
+
"LARKUP_VIDEO_GEMINI_BASE_URL",
|
|
37
|
+
"LARKUP_VIDEO_EMBEDDING_PROVIDER",
|
|
38
|
+
"LARKUP_VIDEO_EMBEDDING_FALLBACK_PROVIDER",
|
|
39
|
+
"LARKUP_VIDEO_GOOGLE_API_KEY",
|
|
40
|
+
"LARKUP_VIDEO_GOOGLE_FALLBACK_API_KEY",
|
|
41
|
+
)
|
|
42
|
+
_ENVIRONMENT_LOCK = threading.RLock()
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@contextmanager
|
|
46
|
+
def temporary_model_environment(payload: dict[str, Any]) -> Iterator[None]:
|
|
47
|
+
"""Apply one job's BYOK bundle and restore a warm worker after completion."""
|
|
48
|
+
models = payload.get("modelConfiguration")
|
|
49
|
+
if not isinstance(models, dict):
|
|
50
|
+
raise ValueError(
|
|
51
|
+
"Audio, agent / tool-brain, and vision provider settings are required"
|
|
52
|
+
)
|
|
53
|
+
parsed = {
|
|
54
|
+
role: _model(models.get(role), role)
|
|
55
|
+
for role in ("audio", "brain", "vision")
|
|
56
|
+
}
|
|
57
|
+
with _ENVIRONMENT_LOCK:
|
|
58
|
+
previous = {key: os.environ.get(key) for key in _MANAGED_KEYS}
|
|
59
|
+
try:
|
|
60
|
+
for key in _MANAGED_KEYS:
|
|
61
|
+
os.environ.pop(key, None)
|
|
62
|
+
|
|
63
|
+
vision = parsed["vision"]
|
|
64
|
+
os.environ.update(
|
|
65
|
+
{
|
|
66
|
+
"LARKUP_VIDEO_SEMANTIC_VISION": "true",
|
|
67
|
+
"LARKUP_VIDEO_VISION_PROVIDER": vision["provider"],
|
|
68
|
+
"LARKUP_VIDEO_VISION_API_KEY": vision["apiKey"],
|
|
69
|
+
"LARKUP_VIDEO_SEMANTIC_VISION_MODEL": vision["model"],
|
|
70
|
+
"LARKUP_VIDEO_REASONING_VISION_MODEL": vision["model"],
|
|
71
|
+
}
|
|
72
|
+
)
|
|
73
|
+
if vision["provider"] == "vercel_ai_gateway":
|
|
74
|
+
os.environ["AI_GATEWAY_API_KEY"] = vision["apiKey"]
|
|
75
|
+
|
|
76
|
+
brain = parsed["brain"]
|
|
77
|
+
brain_base_url = {
|
|
78
|
+
"anthropic": "https://api.anthropic.com/v1",
|
|
79
|
+
"cohere": "https://api.cohere.ai/compatibility/v1",
|
|
80
|
+
"deepseek": "https://api.deepseek.com",
|
|
81
|
+
"google": "https://generativelanguage.googleapis.com/v1beta",
|
|
82
|
+
"mistral": "https://api.mistral.ai/v1",
|
|
83
|
+
"openai": "https://api.openai.com/v1",
|
|
84
|
+
"vercel_ai_gateway": "https://ai-gateway.vercel.sh/v1",
|
|
85
|
+
}[brain["provider"]]
|
|
86
|
+
os.environ.update(
|
|
87
|
+
{
|
|
88
|
+
"LARKUP_VIDEO_AGENT_ENABLED": "true",
|
|
89
|
+
"LARKUP_VIDEO_AGENT_PROVIDER": brain["provider"],
|
|
90
|
+
"LARKUP_VIDEO_AGENT_API_KEY": brain["apiKey"],
|
|
91
|
+
"LARKUP_VIDEO_AGENT_MODEL": brain["model"],
|
|
92
|
+
"LARKUP_VIDEO_PLANNER_MODEL": brain["model"],
|
|
93
|
+
"LARKUP_VIDEO_AGENT_BASE_URL": brain_base_url,
|
|
94
|
+
}
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
os.environ["LARKUP_VIDEO_VISION_BASE_URL"] = (
|
|
98
|
+
"https://api.openai.com/v1"
|
|
99
|
+
if vision["provider"] == "openai"
|
|
100
|
+
else "https://ai-gateway.vercel.sh/v1"
|
|
101
|
+
)
|
|
102
|
+
os.environ["LARKUP_VIDEO_GEMINI_BASE_URL"] = (
|
|
103
|
+
"https://generativelanguage.googleapis.com/v1beta"
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
audio = parsed["audio"]
|
|
107
|
+
os.environ["LARKUP_VIDEO_TRANSCRIPTION_PROVIDER"] = audio["provider"]
|
|
108
|
+
# A managed worker must not silently spend Larkup GPU time on Whisper
|
|
109
|
+
# after the user's paid provider rejects a request.
|
|
110
|
+
os.environ["LARKUP_VIDEO_TRANSCRIPTION_FALLBACK"] = ""
|
|
111
|
+
key_name, model_names = {
|
|
112
|
+
"deepgram": (
|
|
113
|
+
"DEEPGRAM_API_KEY",
|
|
114
|
+
("LARKUP_VIDEO_DEEPGRAM_MODEL", "LARKUP_VIDEO_DEEPGRAM_AUTO_MODEL"),
|
|
115
|
+
),
|
|
116
|
+
"openai": ("OPENAI_API_KEY", ("LARKUP_VIDEO_OPENAI_TRANSCRIPTION_MODEL",)),
|
|
117
|
+
"groq": ("GROQ_API_KEY", ("LARKUP_VIDEO_GROQ_TRANSCRIPTION_MODEL",)),
|
|
118
|
+
"elevenlabs": (
|
|
119
|
+
"ELEVENLABS_API_KEY",
|
|
120
|
+
("LARKUP_VIDEO_ELEVENLABS_TRANSCRIPTION_MODEL",),
|
|
121
|
+
),
|
|
122
|
+
}[audio["provider"]]
|
|
123
|
+
os.environ[key_name] = audio["apiKey"]
|
|
124
|
+
for model_name in model_names:
|
|
125
|
+
os.environ[model_name] = audio["model"]
|
|
126
|
+
|
|
127
|
+
# Cloud vector generation is optional and must never fall through to
|
|
128
|
+
# an operator-owned Gateway secret. Text evidence remains indexable.
|
|
129
|
+
os.environ["LARKUP_VIDEO_EMBEDDING_PROVIDER"] = "disabled"
|
|
130
|
+
os.environ["LARKUP_VIDEO_EMBEDDING_FALLBACK_PROVIDER"] = "disabled"
|
|
131
|
+
yield
|
|
132
|
+
finally:
|
|
133
|
+
for key in _MANAGED_KEYS:
|
|
134
|
+
value = previous[key]
|
|
135
|
+
if value is None:
|
|
136
|
+
os.environ.pop(key, None)
|
|
137
|
+
else:
|
|
138
|
+
os.environ[key] = value
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
@contextmanager
|
|
142
|
+
def unchanged_model_environment() -> Iterator[None]:
|
|
143
|
+
"""Keep process-scoped local settings isolated from transient remote jobs."""
|
|
144
|
+
with _ENVIRONMENT_LOCK:
|
|
145
|
+
yield
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def _model(value: Any, role: str) -> dict[str, str]:
|
|
149
|
+
if not isinstance(value, dict):
|
|
150
|
+
raise ValueError(f"A configured {role} provider, model, and API key are required")
|
|
151
|
+
result = {
|
|
152
|
+
key: str(value.get(key) or "").strip()
|
|
153
|
+
for key in ("provider", "apiKey", "model")
|
|
154
|
+
}
|
|
155
|
+
if not all(result.values()):
|
|
156
|
+
raise ValueError(f"A configured {role} provider, model, and API key are required")
|
|
157
|
+
return result
|
|
File without changes
|