@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.
Files changed (54) hide show
  1. package/.env.example +150 -0
  2. package/LICENSE +176 -0
  3. package/README.md +281 -0
  4. package/compose.gpu.yaml +14 -0
  5. package/compose.yaml +71 -0
  6. package/dist/agent.d.ts +131 -0
  7. package/dist/agent.js +2087 -0
  8. package/dist/brief.d.ts +2 -0
  9. package/dist/brief.js +37 -0
  10. package/dist/client.d.ts +46 -0
  11. package/dist/client.js +139 -0
  12. package/dist/contracts.d.ts +331 -0
  13. package/dist/contracts.js +1 -0
  14. package/dist/index.d.ts +87 -0
  15. package/dist/index.js +391 -0
  16. package/dist/runtime.d.ts +96 -0
  17. package/dist/runtime.js +592 -0
  18. package/dist/ui.d.ts +82 -0
  19. package/dist/ui.js +87 -0
  20. package/package.json +84 -0
  21. package/runtime/Dockerfile +119 -0
  22. package/runtime/app/__init__.py +3 -0
  23. package/runtime/app/__main__.py +19 -0
  24. package/runtime/app/api/__init__.py +0 -0
  25. package/runtime/app/api/deps.py +69 -0
  26. package/runtime/app/api/v1.py +166 -0
  27. package/runtime/app/config.py +78 -0
  28. package/runtime/app/db/__init__.py +0 -0
  29. package/runtime/app/db/schemas.py +162 -0
  30. package/runtime/app/db/store.py +466 -0
  31. package/runtime/app/main.py +27 -0
  32. package/runtime/app/model_configuration.py +157 -0
  33. package/runtime/app/services/__init__.py +0 -0
  34. package/runtime/app/services/brain.py +2221 -0
  35. package/runtime/app/services/embedding.py +473 -0
  36. package/runtime/app/services/jobs.py +237 -0
  37. package/runtime/app/services/motion.py +66 -0
  38. package/runtime/app/services/pipeline.py +1911 -0
  39. package/runtime/app/services/scene.py +161 -0
  40. package/runtime/app/services/storage.py +44 -0
  41. package/runtime/app/services/transcription.py +667 -0
  42. package/runtime/app/services/vision.py +1441 -0
  43. package/runtime/app/utils/__init__.py +0 -0
  44. package/runtime/app/utils/timing.py +99 -0
  45. package/runtime/app/worker.py +20 -0
  46. package/runtime/pyproject.toml +56 -0
  47. package/runtime/requirements-cpu.txt +15 -0
  48. package/runtime/requirements-smoke.txt +7 -0
  49. package/runtime/requirements.txt +14 -0
  50. package/runtime/uv.lock +3637 -0
  51. package/scripts/grant-cloud-credits.sh +43 -0
  52. package/scripts/runtime.mjs +156 -0
  53. package/scripts/validate-indexing.mjs +168 -0
  54. 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