roscoe 2.1.0__tar.gz → 2.2.0__tar.gz
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.
- {roscoe-2.1.0/roscoe.egg-info → roscoe-2.2.0}/PKG-INFO +1 -1
- {roscoe-2.1.0 → roscoe-2.2.0}/pyproject.toml +1 -1
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/__init__.py +1 -1
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/init_command.py +5 -5
- roscoe-2.2.0/roscoe/cli/scaffold/agent_config.yaml +36 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/wizard_gui.py +3 -0
- {roscoe-2.1.0 → roscoe-2.2.0/roscoe.egg-info}/PKG-INFO +1 -1
- roscoe-2.1.0/roscoe/cli/scaffold/agent_config.yaml +0 -188
- {roscoe-2.1.0 → roscoe-2.2.0}/LICENSE +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/README.md +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/approval/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/approval/gate.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/eval_command.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/eval_gui.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/google_auth_command.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/gui_theme.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/main.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/monitor_command.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/monitor_gui.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/pricing_command.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/pricing_gui.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/run_command.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/run_web.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/scaffold/.env.example +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/scaffold/db.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/scaffold/docs.md +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/scaffold/evals/test_cases.json +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/scaffold/main.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/scaffold/prompts/system.txt +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/scaffold/tools/my_tools.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/config/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/config/loader.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/_graph_base.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/base_connector.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/github.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/google_workspace.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/jira.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/notion.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/outlook.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/rest_api.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/servicenow.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/sharepoint.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/snowflake.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/core/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/core/agent_base.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/core/agent_result.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/core/agent_runner.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/core/executor.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/core/state.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/dataset.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/eval_runner.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/regression.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/report.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/scorers/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/scorers/_judge.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/scorers/base.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/scorers/hallucination.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/scorers/output_quality.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/scorers/tool_usage.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/llm/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/llm/base_provider.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/llm/capability_map.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/llm/provider_factory.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/memory/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/memory/conversation.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/memory/knowledge.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/memory/persistent.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/middleware/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/middleware/audit_logger.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/middleware/cost_tracker.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/middleware/rate_limiter.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/middleware/retry.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/monitoring/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/monitoring/alerts.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/monitoring/dashboard.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/monitoring/exporters/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/monitoring/exporters/azure_monitor.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/monitoring/exporters/prometheus.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/monitoring/metrics.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/monitoring/notifier.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/monitoring/web.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/pricing.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/exec_assistant_agent/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/exec_assistant_agent/agent_config.yaml +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/exec_assistant_agent/prompts/system.txt +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/exec_assistant_agent/tools/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/exec_assistant_agent/tools/exec_tools.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/google_workspace_agent/agent_config.yaml +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/google_workspace_agent/prompts/system.txt +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/google_workspace_agent/tools/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/google_workspace_agent/tools/gws_tools.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/hr_agent/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/hr_agent/agent_config.yaml +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/hr_agent/prompts/system.txt +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/hr_agent/tools/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/hr_agent/tools/hr_tools.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/it_support_agent/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/it_support_agent/agent_config.yaml +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/it_support_agent/prompts/system.txt +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/it_support_agent/tools/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/it_support_agent/tools/it_tools.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/knowledge_base_agent/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/knowledge_base_agent/agent_config.yaml +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/knowledge_base_agent/prompts/system.txt +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/knowledge_base_agent/tools/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/knowledge_base_agent/tools/kb_tools.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/legal_agent/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/legal_agent/agent_config.yaml +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/legal_agent/prompts/system.txt +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/legal_agent/tools/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/legal_agent/tools/legal_tools.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/tools/__init__.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/tools/decorator.py +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe.egg-info/SOURCES.txt +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe.egg-info/dependency_links.txt +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe.egg-info/entry_points.txt +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe.egg-info/requires.txt +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/roscoe.egg-info/top_level.txt +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/setup.cfg +0 -0
- {roscoe-2.1.0 → roscoe-2.2.0}/tests/test_smoke.py +0 -0
|
@@ -32,6 +32,7 @@ _PROVIDERS = {
|
|
|
32
32
|
"azure_openai": {"env_key": "AZURE_OPENAI_KEY", "default_model": "gpt-4o", "base_url": None},
|
|
33
33
|
"anthropic": {"env_key": "ANTHROPIC_API_KEY", "default_model": "claude-sonnet-4-5", "base_url": None},
|
|
34
34
|
"gemini": {"env_key": "GOOGLE_API_KEY", "default_model": "gemini-1.5-pro", "base_url": None},
|
|
35
|
+
"nvidia": {"env_key": "NVIDIA_API_KEY", "default_model": "openai/gpt-oss-120b", "base_url": None},
|
|
35
36
|
"ollama": {"env_key": None, "default_model": "llama3.1", "base_url": None},
|
|
36
37
|
}
|
|
37
38
|
|
|
@@ -195,6 +196,7 @@ def _run_wizard(name: str) -> dict:
|
|
|
195
196
|
"azure_openai": "azure_openai",
|
|
196
197
|
"anthropic": "anthropic",
|
|
197
198
|
"gemini": "gemini",
|
|
199
|
+
"nvidia": "nvidia (NVIDIA NIM, free-tier models available)",
|
|
198
200
|
"ollama": "ollama (free, local, no API key)",
|
|
199
201
|
}
|
|
200
202
|
for i, p in enumerate(providers, 1):
|
|
@@ -355,10 +357,7 @@ def _apply_wizard(dest: Path, answers: dict) -> None:
|
|
|
355
357
|
tools_yaml = ", ".join(f'"{t}"' for t in answers["approval_tools"])
|
|
356
358
|
text = text.replace(
|
|
357
359
|
" # human_approval:\n"
|
|
358
|
-
" # require_approval_for
|
|
359
|
-
" # - send_email # tool function names that need sign-off\n"
|
|
360
|
-
" # - delete_record\n"
|
|
361
|
-
" # - submit_payment",
|
|
360
|
+
" # require_approval_for: [send_email, delete_record] # gate sensitive tools",
|
|
362
361
|
f" human_approval:\n"
|
|
363
362
|
f" require_approval_for: [{tools_yaml}]",
|
|
364
363
|
)
|
|
@@ -374,7 +373,7 @@ def _apply_wizard(dest: Path, answers: dict) -> None:
|
|
|
374
373
|
|
|
375
374
|
if answers["persistent_memory"]:
|
|
376
375
|
text = text.replace(
|
|
377
|
-
" enabled: false
|
|
376
|
+
" enabled: false # long-term facts per user_id",
|
|
378
377
|
" enabled: true",
|
|
379
378
|
)
|
|
380
379
|
|
|
@@ -416,6 +415,7 @@ def scaffold_project(
|
|
|
416
415
|
def _add_template_extras(dest: Path, template: str) -> None:
|
|
417
416
|
(dest / "main.py").write_text(_TEMPLATE_MAIN[template])
|
|
418
417
|
(dest / ".env.example").write_text(_TEMPLATE_ENV[template])
|
|
418
|
+
shutil.copy(SCAFFOLD_DIR / "docs.md", dest / "docs.md")
|
|
419
419
|
evals_dir = dest / "evals"
|
|
420
420
|
evals_dir.mkdir(exist_ok=True)
|
|
421
421
|
(evals_dir / "test_cases.json").write_text(json.dumps(_EXAMPLE_CASES, indent=2))
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# roscoe agent configuration — __PROJECT_NAME__
|
|
2
|
+
# Full reference for every option below: docs.md (scaffolded alongside this file).
|
|
3
|
+
# ${VAR_NAME} anywhere in this file resolves from your shell env or .env.
|
|
4
|
+
|
|
5
|
+
agent_name: __PROJECT_NAME__
|
|
6
|
+
system_prompt_file: prompts/system.txt
|
|
7
|
+
# ui_script: app.py # custom web UI `roscoe run` launches instead of
|
|
8
|
+
# the built-in widget (defaults to app.py if present)
|
|
9
|
+
|
|
10
|
+
model:
|
|
11
|
+
provider: openai # openai | azure_openai | anthropic | gemini | nvidia | ollama
|
|
12
|
+
model: gpt-4o-mini
|
|
13
|
+
api_key: ${OPENAI_API_KEY}
|
|
14
|
+
temperature: 0.1 # 0.0 = precise, 1.0 = creative
|
|
15
|
+
|
|
16
|
+
memory:
|
|
17
|
+
conversation:
|
|
18
|
+
enabled: true
|
|
19
|
+
window_size: 10 # messages kept per session
|
|
20
|
+
persistent:
|
|
21
|
+
enabled: false # long-term facts per user_id
|
|
22
|
+
backend: sqlite
|
|
23
|
+
connection: ./facts.db
|
|
24
|
+
|
|
25
|
+
middleware:
|
|
26
|
+
retry:
|
|
27
|
+
max_attempts: 3
|
|
28
|
+
rate_limiter:
|
|
29
|
+
enabled: true
|
|
30
|
+
requests_per_minute: 60
|
|
31
|
+
cost_tracking:
|
|
32
|
+
enabled: true # result.cost_usd — see `roscoe prices` in docs.md
|
|
33
|
+
audit:
|
|
34
|
+
enabled: true # logs/audit.jsonl — feeds `roscoe monitor`
|
|
35
|
+
# human_approval:
|
|
36
|
+
# require_approval_for: [send_email, delete_record] # gate sensitive tools
|
|
@@ -19,6 +19,7 @@ _PROVIDERS = [
|
|
|
19
19
|
("Azure OpenAI", "azure_openai"),
|
|
20
20
|
("Anthropic", "anthropic"),
|
|
21
21
|
("Gemini", "gemini"),
|
|
22
|
+
("NVIDIA (NIM, free-tier models available)", "nvidia"),
|
|
22
23
|
("Ollama (free, local, no API key)", "ollama"),
|
|
23
24
|
]
|
|
24
25
|
|
|
@@ -28,6 +29,7 @@ _DEFAULT_MODELS = {
|
|
|
28
29
|
"azure_openai": "gpt-4o",
|
|
29
30
|
"anthropic": "claude-sonnet-4-5",
|
|
30
31
|
"gemini": "gemini-1.5-pro",
|
|
32
|
+
"nvidia": "openai/gpt-oss-120b",
|
|
31
33
|
"ollama": "llama3.1",
|
|
32
34
|
}
|
|
33
35
|
|
|
@@ -37,6 +39,7 @@ _ENV_KEYS = {
|
|
|
37
39
|
"azure_openai": "AZURE_OPENAI_KEY",
|
|
38
40
|
"anthropic": "ANTHROPIC_API_KEY",
|
|
39
41
|
"gemini": "GOOGLE_API_KEY",
|
|
42
|
+
"nvidia": "NVIDIA_API_KEY",
|
|
40
43
|
"ollama": None,
|
|
41
44
|
}
|
|
42
45
|
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
# =============================================================================
|
|
2
|
-
# roscoe agent configuration — __PROJECT_NAME__
|
|
3
|
-
# =============================================================================
|
|
4
|
-
#
|
|
5
|
-
# This is the only file you need to configure. Everything below is read by
|
|
6
|
-
# AgentRunner.from_config() and wired automatically — no boilerplate code.
|
|
7
|
-
#
|
|
8
|
-
# Environment variables: use ${VAR_NAME} anywhere in this file. Values are
|
|
9
|
-
# resolved from your shell environment (or a .env file if you load one).
|
|
10
|
-
#
|
|
11
|
-
# Docs: https://github.com/rhealaloo45/roscoe
|
|
12
|
-
# =============================================================================
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
# ---------- Agent identity ---------------------------------------------------
|
|
16
|
-
|
|
17
|
-
agent_name: __PROJECT_NAME__
|
|
18
|
-
|
|
19
|
-
# The system prompt tells the LLM who it is and how to behave.
|
|
20
|
-
# Inline string or point to a file:
|
|
21
|
-
system_prompt_file: prompts/system.txt
|
|
22
|
-
# system_prompt: |
|
|
23
|
-
# You are a helpful assistant. Be concise.
|
|
24
|
-
|
|
25
|
-
# `roscoe run` opens a generic browser chat by default. If this project has
|
|
26
|
-
# its own web UI (a Flask app that builds the agent itself — custom login,
|
|
27
|
-
# dashboard, branded chat), roscoe defers to it instead: it looks for
|
|
28
|
-
# `app.py` in this directory and just runs it. Only set this if your file
|
|
29
|
-
# is named something else:
|
|
30
|
-
# ui_script: app.py
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
# ---------- Model ------------------------------------------------------------
|
|
34
|
-
# Swap providers by changing this block. Your Python code stays identical.
|
|
35
|
-
#
|
|
36
|
-
# Supported providers:
|
|
37
|
-
# openai — GPT-4o, GPT-4o-mini, etc.
|
|
38
|
-
# azure_openai — Azure-hosted OpenAI (needs deployment + endpoint)
|
|
39
|
-
# anthropic — Claude Sonnet, Opus, Haiku
|
|
40
|
-
# gemini — Gemini 1.5 Pro / Flash
|
|
41
|
-
# ollama — any local model (free, no API key)
|
|
42
|
-
#
|
|
43
|
-
# OpenAI-compatible endpoints (OpenRouter, Together, etc.):
|
|
44
|
-
# provider: openai
|
|
45
|
-
# base_url: https://openrouter.ai/api/v1
|
|
46
|
-
# model: meta-llama/llama-3.1-8b-instruct
|
|
47
|
-
|
|
48
|
-
model:
|
|
49
|
-
provider: openai
|
|
50
|
-
model: gpt-4o-mini
|
|
51
|
-
api_key: ${OPENAI_API_KEY}
|
|
52
|
-
temperature: 0.1
|
|
53
|
-
# max_tokens: 4096 # cap the response length
|
|
54
|
-
|
|
55
|
-
# --- Azure OpenAI example (uncomment & replace the block above) ---
|
|
56
|
-
# provider: azure_openai
|
|
57
|
-
# deployment: my-gpt4o-deployment
|
|
58
|
-
# endpoint: ${AZURE_OPENAI_ENDPOINT}
|
|
59
|
-
# api_key: ${AZURE_OPENAI_KEY}
|
|
60
|
-
# api_version: "2024-02-01"
|
|
61
|
-
|
|
62
|
-
# --- Anthropic example ---
|
|
63
|
-
# provider: anthropic
|
|
64
|
-
# model: claude-sonnet-4-5
|
|
65
|
-
# api_key: ${ANTHROPIC_API_KEY}
|
|
66
|
-
|
|
67
|
-
# --- Gemini example ---
|
|
68
|
-
# provider: gemini
|
|
69
|
-
# model: gemini-1.5-pro
|
|
70
|
-
# api_key: ${GOOGLE_API_KEY}
|
|
71
|
-
|
|
72
|
-
# --- Ollama (local, free, no key) ---
|
|
73
|
-
# provider: ollama
|
|
74
|
-
# model: llama3.1
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
# ---------- Memory -----------------------------------------------------------
|
|
78
|
-
# Conversation = short-term (per session_id, windowed).
|
|
79
|
-
# Persistent = long-term facts per user_id, stored in sqlite.
|
|
80
|
-
# Knowledge = RAG retrieval (FAISS or keyword). Set up in code, not here.
|
|
81
|
-
|
|
82
|
-
memory:
|
|
83
|
-
conversation:
|
|
84
|
-
enabled: true
|
|
85
|
-
window_size: 10 # keep last N messages per session
|
|
86
|
-
|
|
87
|
-
persistent:
|
|
88
|
-
enabled: false # flip to true to enable cross-session memory
|
|
89
|
-
backend: sqlite
|
|
90
|
-
connection: ./facts.db # file path, or ":memory:" for throwaway
|
|
91
|
-
# max_facts: 50 # cap stored facts per user (default: unlimited)
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
# ---------- Middleware -------------------------------------------------------
|
|
95
|
-
# All middleware is automatic — set it here, forget about it in code.
|
|
96
|
-
|
|
97
|
-
middleware:
|
|
98
|
-
|
|
99
|
-
# Retry — retries failed LLM calls with exponential backoff.
|
|
100
|
-
# Handles transient errors (rate limits, timeouts, 500s) automatically.
|
|
101
|
-
retry:
|
|
102
|
-
max_attempts: 3 # total attempts (1 = no retry)
|
|
103
|
-
# wait_multiplier: 1 # backoff multiplier in seconds
|
|
104
|
-
# wait_max: 10 # max wait between retries
|
|
105
|
-
|
|
106
|
-
# Rate limiter — token-bucket per provider. Prevents thrashing API limits
|
|
107
|
-
# when multiple agents share the same provider.
|
|
108
|
-
# Ollama is always skipped (no external limit).
|
|
109
|
-
rate_limiter:
|
|
110
|
-
enabled: true
|
|
111
|
-
requests_per_minute: 60 # adjust based on your API tier
|
|
112
|
-
# rpm: 60 # alias for requests_per_minute
|
|
113
|
-
|
|
114
|
-
# Cost tracking — estimates USD cost from token counts.
|
|
115
|
-
# Shows up in result.cost_usd and the audit log.
|
|
116
|
-
# Built-in rates: gpt-4o, gpt-4o-mini, claude-sonnet-4-5, gemini-1.5-pro.
|
|
117
|
-
# Prices drift — add or correct your own rates for ANY provider (no code):
|
|
118
|
-
# roscoe prices # desktop editor, saves to ~/.roscoe/prices.json
|
|
119
|
-
cost_tracking:
|
|
120
|
-
enabled: true
|
|
121
|
-
|
|
122
|
-
# Tool guardrails — hard timeout per tool call, plus an error budget so a
|
|
123
|
-
# failing tool is refused instead of retried every iteration. Both optional.
|
|
124
|
-
# tools:
|
|
125
|
-
# timeout_seconds: 30 # kill a single tool call after N seconds
|
|
126
|
-
# max_failures: 3 # disable a tool for the run after N failures
|
|
127
|
-
|
|
128
|
-
# Audit logging — writes one JSONL line per run to logs/audit.jsonl.
|
|
129
|
-
# Non-blocking (async). Contains: run_id, agent, provider, model, tokens,
|
|
130
|
-
# cost, status, latency. Feed to `roscoe monitor` for dashboards.
|
|
131
|
-
audit:
|
|
132
|
-
enabled: true
|
|
133
|
-
# path: logs/audit.jsonl # default path; override if needed
|
|
134
|
-
|
|
135
|
-
# Human approval — pause the agent before running sensitive tools.
|
|
136
|
-
# The run returns status="paused"; call agent.resume(run_id, "approve")
|
|
137
|
-
# to continue, or "reject" / "modify" to block / change args.
|
|
138
|
-
# human_approval:
|
|
139
|
-
# require_approval_for:
|
|
140
|
-
# - send_email # tool function names that need sign-off
|
|
141
|
-
# - delete_record
|
|
142
|
-
# - submit_payment
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
# ---------- Connectors (optional) --------------------------------------------
|
|
146
|
-
# Connectors are pre-built tool bundles for common services.
|
|
147
|
-
# Set them up in code, not in this file:
|
|
148
|
-
#
|
|
149
|
-
# from roscoe.connectors import GitHubConnector
|
|
150
|
-
# gh = GitHubConnector({"token": "ghp_..."})
|
|
151
|
-
# agent = AgentRunner.from_config("agent_config.yaml", tools=gh.tools)
|
|
152
|
-
#
|
|
153
|
-
# Available connectors:
|
|
154
|
-
# RESTConnector — any REST API (base_url + token)
|
|
155
|
-
# JiraConnector — Jira Cloud (email + api_token)
|
|
156
|
-
# ServiceNowConnector — ServiceNow (instance_url + user/pass)
|
|
157
|
-
# OutlookConnector — Microsoft Graph email/calendar
|
|
158
|
-
# SharePointConnector — Microsoft Graph files
|
|
159
|
-
# GitHubConnector — GitHub API (PAT)
|
|
160
|
-
# NotionConnector — Notion API (integration token)
|
|
161
|
-
# GoogleWorkspaceConnector — Gmail + Calendar + Tasks + Drive (service account)
|
|
162
|
-
# SnowflakeConnector — Snowflake SQL (pip install roscoe[snowflake])
|
|
163
|
-
#
|
|
164
|
-
# Mix connector tools with your own:
|
|
165
|
-
# tools = [my_tool] + gh.tools + jira.tools
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
# ---------- Monitoring (optional) --------------------------------------------
|
|
169
|
-
# After runs accumulate, use the CLI to view a dashboard:
|
|
170
|
-
# roscoe monitor --path logs/audit.jsonl
|
|
171
|
-
#
|
|
172
|
-
# Export to Prometheus Pushgateway or Azure Monitor in code:
|
|
173
|
-
# from roscoe.monitoring.exporters.prometheus import PrometheusPushgatewayExporter
|
|
174
|
-
# exporter = PrometheusPushgatewayExporter(gateway_url="http://localhost:9091")
|
|
175
|
-
# exporter.push(metrics)
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
# ---------- Evals (optional) -------------------------------------------------
|
|
179
|
-
# Define test cases in evals/test_cases.json (already scaffolded).
|
|
180
|
-
# Run from CLI:
|
|
181
|
-
# roscoe eval --dataset evals/test_cases.json --config agent_config.yaml
|
|
182
|
-
#
|
|
183
|
-
# Add --judge to enable LLM-as-judge scoring (output quality + hallucination).
|
|
184
|
-
# Without --judge, only deterministic tool-usage scoring runs.
|
|
185
|
-
#
|
|
186
|
-
# Compare two runs for regressions:
|
|
187
|
-
# from roscoe.evals.regression import compare_runs
|
|
188
|
-
# diff = compare_runs(report_a, report_b)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|