monkeybot 2.1.1__py3-none-any.whl
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.
- monkeybot/__init__.py +3 -0
- monkeybot/cli/__init__.py +3 -0
- monkeybot/cli/__main__.py +8 -0
- monkeybot/cli/audio_io.py +8 -0
- monkeybot/cli/gateway_manager.py +17 -0
- monkeybot/cli/main.py +22 -0
- monkeybot/cli/push_to_talk.py +12 -0
- monkeybot/cli/realtime_client.py +13 -0
- monkeybot/core/__init__.py +19 -0
- monkeybot/core/attachments/__init__.py +22 -0
- monkeybot/core/attachments/catalog.py +62 -0
- monkeybot/core/attachments/config.py +52 -0
- monkeybot/core/attachments/freeze.py +158 -0
- monkeybot/core/attachments/resolve.py +70 -0
- monkeybot/core/attachments/store.py +180 -0
- monkeybot/core/attachments/text.py +72 -0
- monkeybot/core/attachments/tools.py +54 -0
- monkeybot/core/bootstrap.py +242 -0
- monkeybot/core/config/__init__.py +71 -0
- monkeybot/core/config/realtime_config.py +150 -0
- monkeybot/core/config/runtime_env.py +262 -0
- monkeybot/core/config/settings.py +341 -0
- monkeybot/core/config/validation.py +249 -0
- monkeybot/core/config/yaml_loader.py +45 -0
- monkeybot/core/context/__init__.py +781 -0
- monkeybot/core/context/campaign_context.py +8 -0
- monkeybot/core/context/common.py +14 -0
- monkeybot/core/context/curator.py +255 -0
- monkeybot/core/context/epoch.py +226 -0
- monkeybot/core/context/memory_prompt.py +222 -0
- monkeybot/core/context/tool_output_policy.py +270 -0
- monkeybot/core/context/tool_result_ingress.py +290 -0
- monkeybot/core/context/tool_shapers.py +361 -0
- monkeybot/core/hooks/__init__.py +261 -0
- monkeybot/core/llm/__init__.py +4 -0
- monkeybot/core/llm/provider.py +296 -0
- monkeybot/core/llm/realtime_provider.py +203 -0
- monkeybot/core/llm/usage.py +57 -0
- monkeybot/core/logging_utils.py +24 -0
- monkeybot/core/mcp/__init__.py +1 -0
- monkeybot/core/mcp/mcp_client.py +1215 -0
- monkeybot/core/mcp/ports_mcp.py +109 -0
- monkeybot/core/memory/__init__.py +24 -0
- monkeybot/core/memory/hook.py +413 -0
- monkeybot/core/memory/index_format.py +104 -0
- monkeybot/core/memory/integrity.py +180 -0
- monkeybot/core/memory/organizer.py +270 -0
- monkeybot/core/memory/storage_ops.py +139 -0
- monkeybot/core/memory/subsystem.py +91 -0
- monkeybot/core/messages/__init__.py +16 -0
- monkeybot/core/messages/convert_provider.py +41 -0
- monkeybot/core/messages/tool_integrity.py +262 -0
- monkeybot/core/messages/transform_context.py +84 -0
- monkeybot/core/path_safety.py +11 -0
- monkeybot/core/persistence/__init__.py +17 -0
- monkeybot/core/persistence/backends.py +236 -0
- monkeybot/core/persistence/db.py +28 -0
- monkeybot/core/persistence/durable_runs.py +286 -0
- monkeybot/core/persistence/firestore.py +658 -0
- monkeybot/core/persistence/firestore_scheduled_loops.py +336 -0
- monkeybot/core/persistence/history.py +156 -0
- monkeybot/core/persistence/postgres.py +895 -0
- monkeybot/core/persistence/runs.py +76 -0
- monkeybot/core/persistence/scheduled_loops.py +435 -0
- monkeybot/core/persistence/session_turn_locks.py +94 -0
- monkeybot/core/persistence/sqlite.py +218 -0
- monkeybot/core/persistence/sqlite_backend.py +74 -0
- monkeybot/core/persistence/thread_summary.py +61 -0
- monkeybot/core/persistence/transcript.py +194 -0
- monkeybot/core/persistence/usage.py +149 -0
- monkeybot/core/prompts/__init__.py +1 -0
- monkeybot/core/prompts/harness_prompt.py +197 -0
- monkeybot/core/prompts/prompt.py +215 -0
- monkeybot/core/runtime/__init__.py +1 -0
- monkeybot/core/runtime/context_budget.py +267 -0
- monkeybot/core/runtime/events.py +819 -0
- monkeybot/core/runtime/input_admission.py +154 -0
- monkeybot/core/runtime/loop.py +2374 -0
- monkeybot/core/runtime/provider_stream_mapper.py +159 -0
- monkeybot/core/runtime/realtime_loop.py +654 -0
- monkeybot/core/runtime/utterance_buffer.py +179 -0
- monkeybot/core/subagents/__init__.py +1 -0
- monkeybot/core/subagents/subagent_proto.py +331 -0
- monkeybot/core/subagents/subagent_worker.py +441 -0
- monkeybot/core/subagents/worker_pool.py +403 -0
- monkeybot/core/testing/__init__.py +1 -0
- monkeybot/core/testing/mocks_provider.py +86 -0
- monkeybot/core/testing/mocks_realtime_provider.py +137 -0
- monkeybot/core/tools/__init__.py +1 -0
- monkeybot/core/tools/core_tool_executor.py +1548 -0
- monkeybot/core/tools/inspector.py +226 -0
- monkeybot/core/tools/loop_inspector.py +45 -0
- monkeybot/core/tools/patch.py +480 -0
- monkeybot/core/tools/permission.py +284 -0
- monkeybot/core/tools/sandbox_executor.py +255 -0
- monkeybot/core/tools/spill_inventory.py +35 -0
- monkeybot/core/tools/terminal.py +381 -0
- monkeybot/core/tools/text_normalize.py +25 -0
- monkeybot/core/tools/types.py +33 -0
- monkeybot/core/tools/workspace_service.py +710 -0
- monkeybot/core/tools/workspace_tools.py +116 -0
- monkeybot/core/types/__init__.py +1 -0
- monkeybot/core/types/content_blocks.py +644 -0
- monkeybot/core/types/interfaces.py +156 -0
- monkeybot/core/types/types_tools.py +29 -0
- monkeybot/core/workspace/__init__.py +8 -0
- monkeybot/core/workspace/factory.py +45 -0
- monkeybot/core/workspace/gcs.py +130 -0
- monkeybot/core/workspace/local.py +162 -0
- monkeybot/core/workspace/protocol.py +45 -0
- monkeybot/core/workspace/s3.py +151 -0
- monkeybot/core/workspace_layout.py +27 -0
- monkeybot/gateway/__init__.py +1 -0
- monkeybot/gateway/bootstrap.py +18 -0
- monkeybot/gateway/main.py +47 -0
- monkeybot/gateway/realtime/__init__.py +31 -0
- monkeybot/gateway/realtime/app.py +321 -0
- monkeybot/gateway/realtime/deps.py +52 -0
- monkeybot/gateway/realtime/errors.py +81 -0
- monkeybot/gateway/realtime/guardrails.py +88 -0
- monkeybot/gateway/realtime/manager.py +77 -0
- monkeybot/gateway/realtime/metrics.py +144 -0
- monkeybot/gateway/realtime/routes.py +864 -0
- monkeybot/gateway/realtime/session.py +232 -0
- monkeybot/gateway/realtime/wire.py +412 -0
- monkeybot/gateway/realtime_main.py +49 -0
- monkeybot/gateway/sse/__init__.py +1 -0
- monkeybot/gateway/sse/app.py +733 -0
- monkeybot/gateway/sse/loop_port.py +31 -0
- monkeybot/gateway/sse/models.py +177 -0
- monkeybot/gateway/sse/reply_body.py +91 -0
- monkeybot/gateway/sse/routes.py +1101 -0
- monkeybot/gateway/sse/scheduler_routes.py +200 -0
- monkeybot/gateway/sse/scheduler_wiring.py +96 -0
- monkeybot/gateway/sse/session_bus.py +226 -0
- monkeybot/gateway/sse/sse.py +46 -0
- monkeybot/gateway/sse/workspace_layout.py +7 -0
- monkeybot/observability/__init__.py +220 -0
- monkeybot/observability/_state.py +10 -0
- monkeybot/observability/instrumentation.py +153 -0
- monkeybot/observability/propagation.py +65 -0
- monkeybot/observability/spans.py +455 -0
- monkeybot/providers/__init__.py +19 -0
- monkeybot/providers/_openai_compat.py +450 -0
- monkeybot/providers/_utils.py +473 -0
- monkeybot/providers/bedrock.py +145 -0
- monkeybot/providers/claude.py +125 -0
- monkeybot/providers/gemini.py +677 -0
- monkeybot/providers/gemini_live.py +398 -0
- monkeybot/providers/huggingface.py +129 -0
- monkeybot/providers/nvidia.py +104 -0
- monkeybot/providers/ollama.py +152 -0
- monkeybot/providers/openai.py +127 -0
- monkeybot/providers/pricing.py +60 -0
- monkeybot/providers/sampling.py +44 -0
- monkeybot/providers/vertex_claude.py +148 -0
- monkeybot/scaffold/__init__.py +33 -0
- monkeybot/scheduler/__init__.py +13 -0
- monkeybot/scheduler/__main__.py +4 -0
- monkeybot/scheduler/engine.py +333 -0
- monkeybot/scheduler/http_invoker.py +61 -0
- monkeybot/scheduler/interval.py +77 -0
- monkeybot/scheduler/tick_result.py +34 -0
- monkeybot/scheduler/worker.py +87 -0
- monkeybot/subagents/__init__.py +1 -0
- monkeybot/subagents/worker/__init__.py +1 -0
- monkeybot/subagents/worker/__main__.py +22 -0
- monkeybot/web_search/__init__.py +82 -0
- monkeybot/web_search/backends/__init__.py +5 -0
- monkeybot/web_search/backends/duckduckgo.py +32 -0
- monkeybot/web_search/backends/firecrawl.py +43 -0
- monkeybot/web_search/backends/tavily.py +45 -0
- monkeybot/web_search/protocol.py +25 -0
- monkeybot/web_search/tool.py +56 -0
- monkeybot-2.1.1.dist-info/METADATA +318 -0
- monkeybot-2.1.1.dist-info/RECORD +178 -0
- monkeybot-2.1.1.dist-info/WHEEL +4 -0
- monkeybot-2.1.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"""Anthropic Claude provider (direct API, async streaming)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
from collections.abc import AsyncIterator, Sequence
|
|
7
|
+
from typing import Any, cast
|
|
8
|
+
|
|
9
|
+
from monkeybot.core.llm.provider import Message, ProviderCallHints, ProviderEvent
|
|
10
|
+
from monkeybot.core.types.types_tools import ToolDef
|
|
11
|
+
from monkeybot.providers._utils import (
|
|
12
|
+
anthropic_tool_defs,
|
|
13
|
+
build_anthropic_messages,
|
|
14
|
+
build_cached_system_blocks,
|
|
15
|
+
count_anthropic_input_tokens,
|
|
16
|
+
iter_anthropic_sdk_stream,
|
|
17
|
+
mark_last_tool_cached,
|
|
18
|
+
split_leading_system,
|
|
19
|
+
)
|
|
20
|
+
from monkeybot.providers.sampling import resolve_model_sampling
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ClaudeProvider:
|
|
24
|
+
"""Anthropic Claude using the ``anthropic`` SDK."""
|
|
25
|
+
|
|
26
|
+
@property
|
|
27
|
+
def name(self) -> str:
|
|
28
|
+
return "claude"
|
|
29
|
+
|
|
30
|
+
@property
|
|
31
|
+
def supports_streaming(self) -> bool:
|
|
32
|
+
return True
|
|
33
|
+
|
|
34
|
+
def __init__(
|
|
35
|
+
self,
|
|
36
|
+
*,
|
|
37
|
+
temperature: float | None = None,
|
|
38
|
+
max_tokens: int | None = None,
|
|
39
|
+
) -> None:
|
|
40
|
+
if not os.environ.get("ANTHROPIC_API_KEY"):
|
|
41
|
+
raise ValueError("ANTHROPIC_API_KEY is not set")
|
|
42
|
+
sampling = resolve_model_sampling(temperature=temperature, max_tokens=max_tokens)
|
|
43
|
+
self._temperature = sampling.temperature
|
|
44
|
+
self._max_tokens = sampling.max_tokens
|
|
45
|
+
|
|
46
|
+
async def count_input_tokens(
|
|
47
|
+
self,
|
|
48
|
+
messages: Sequence[Message],
|
|
49
|
+
tools: Sequence[ToolDef],
|
|
50
|
+
*,
|
|
51
|
+
model: str,
|
|
52
|
+
thinking_budget: int | None = None,
|
|
53
|
+
hints: ProviderCallHints | None = None,
|
|
54
|
+
) -> int:
|
|
55
|
+
del thinking_budget, hints
|
|
56
|
+
import anthropic # noqa: PLC0415
|
|
57
|
+
|
|
58
|
+
system, msgs = split_leading_system(messages)
|
|
59
|
+
converted_messages = build_anthropic_messages(msgs)
|
|
60
|
+
return await count_anthropic_input_tokens(
|
|
61
|
+
anthropic.AsyncAnthropic(),
|
|
62
|
+
anthropic_module=anthropic,
|
|
63
|
+
model=model,
|
|
64
|
+
system=system,
|
|
65
|
+
messages=cast(Any, converted_messages),
|
|
66
|
+
tools=anthropic_tool_defs(tools) if tools else None,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
async def stream(
|
|
70
|
+
self,
|
|
71
|
+
messages: Sequence[Message],
|
|
72
|
+
tools: Sequence[ToolDef],
|
|
73
|
+
*,
|
|
74
|
+
model: str,
|
|
75
|
+
thinking_budget: int | None = None,
|
|
76
|
+
hints: ProviderCallHints | None = None,
|
|
77
|
+
) -> AsyncIterator[ProviderEvent]:
|
|
78
|
+
import anthropic # noqa: PLC0415
|
|
79
|
+
|
|
80
|
+
retention = hints.cache_retention if hints is not None else "short"
|
|
81
|
+
session_id = hints.session_id if hints is not None else None
|
|
82
|
+
|
|
83
|
+
system, msgs = split_leading_system(messages)
|
|
84
|
+
converted_messages = build_anthropic_messages(msgs)
|
|
85
|
+
converted = anthropic_tool_defs(tools) if tools else None
|
|
86
|
+
system_param: Any = (
|
|
87
|
+
build_cached_system_blocks(system, cache_retention=retention)
|
|
88
|
+
if system
|
|
89
|
+
else anthropic.NOT_GIVEN
|
|
90
|
+
)
|
|
91
|
+
tools_param: Any = (
|
|
92
|
+
mark_last_tool_cached(converted, cache_retention=retention)
|
|
93
|
+
if converted
|
|
94
|
+
else anthropic.NOT_GIVEN
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
stream_kwargs: dict[str, Any] = {
|
|
98
|
+
"model": model,
|
|
99
|
+
"system": system_param,
|
|
100
|
+
"messages": cast(Any, converted_messages),
|
|
101
|
+
"tools": tools_param,
|
|
102
|
+
"max_tokens": self._max_tokens,
|
|
103
|
+
"temperature": self._temperature,
|
|
104
|
+
}
|
|
105
|
+
if thinking_budget is not None and thinking_budget > 0:
|
|
106
|
+
stream_kwargs["thinking"] = {
|
|
107
|
+
"type": "enabled",
|
|
108
|
+
"budget_tokens": thinking_budget,
|
|
109
|
+
}
|
|
110
|
+
# Anthropic requires temperature=1 when extended thinking is enabled.
|
|
111
|
+
stream_kwargs["temperature"] = 1
|
|
112
|
+
|
|
113
|
+
client_kwargs: dict[str, Any] = {}
|
|
114
|
+
if session_id and retention != "none":
|
|
115
|
+
client_kwargs["default_headers"] = {"x-session-affinity": session_id}
|
|
116
|
+
client = anthropic.AsyncAnthropic(**client_kwargs)
|
|
117
|
+
async for event in iter_anthropic_sdk_stream(
|
|
118
|
+
client,
|
|
119
|
+
stream_kwargs,
|
|
120
|
+
provider="claude",
|
|
121
|
+
error_message="Claude stream error: %s",
|
|
122
|
+
n_messages=len(messages),
|
|
123
|
+
n_tools=len(tools),
|
|
124
|
+
):
|
|
125
|
+
yield event
|