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.
Files changed (124) hide show
  1. {roscoe-2.1.0/roscoe.egg-info → roscoe-2.2.0}/PKG-INFO +1 -1
  2. {roscoe-2.1.0 → roscoe-2.2.0}/pyproject.toml +1 -1
  3. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/__init__.py +1 -1
  4. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/init_command.py +5 -5
  5. roscoe-2.2.0/roscoe/cli/scaffold/agent_config.yaml +36 -0
  6. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/wizard_gui.py +3 -0
  7. {roscoe-2.1.0 → roscoe-2.2.0/roscoe.egg-info}/PKG-INFO +1 -1
  8. roscoe-2.1.0/roscoe/cli/scaffold/agent_config.yaml +0 -188
  9. {roscoe-2.1.0 → roscoe-2.2.0}/LICENSE +0 -0
  10. {roscoe-2.1.0 → roscoe-2.2.0}/README.md +0 -0
  11. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/approval/__init__.py +0 -0
  12. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/approval/gate.py +0 -0
  13. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/__init__.py +0 -0
  14. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/eval_command.py +0 -0
  15. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/eval_gui.py +0 -0
  16. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/google_auth_command.py +0 -0
  17. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/gui_theme.py +0 -0
  18. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/main.py +0 -0
  19. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/monitor_command.py +0 -0
  20. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/monitor_gui.py +0 -0
  21. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/pricing_command.py +0 -0
  22. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/pricing_gui.py +0 -0
  23. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/run_command.py +0 -0
  24. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/run_web.py +0 -0
  25. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/scaffold/.env.example +0 -0
  26. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/scaffold/db.py +0 -0
  27. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/scaffold/docs.md +0 -0
  28. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/scaffold/evals/test_cases.json +0 -0
  29. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/scaffold/main.py +0 -0
  30. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/scaffold/prompts/system.txt +0 -0
  31. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/cli/scaffold/tools/my_tools.py +0 -0
  32. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/config/__init__.py +0 -0
  33. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/config/loader.py +0 -0
  34. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/__init__.py +0 -0
  35. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/_graph_base.py +0 -0
  36. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/base_connector.py +0 -0
  37. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/github.py +0 -0
  38. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/google_workspace.py +0 -0
  39. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/jira.py +0 -0
  40. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/notion.py +0 -0
  41. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/outlook.py +0 -0
  42. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/rest_api.py +0 -0
  43. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/servicenow.py +0 -0
  44. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/sharepoint.py +0 -0
  45. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/connectors/snowflake.py +0 -0
  46. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/core/__init__.py +0 -0
  47. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/core/agent_base.py +0 -0
  48. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/core/agent_result.py +0 -0
  49. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/core/agent_runner.py +0 -0
  50. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/core/executor.py +0 -0
  51. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/core/state.py +0 -0
  52. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/__init__.py +0 -0
  53. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/dataset.py +0 -0
  54. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/eval_runner.py +0 -0
  55. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/regression.py +0 -0
  56. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/report.py +0 -0
  57. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/scorers/__init__.py +0 -0
  58. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/scorers/_judge.py +0 -0
  59. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/scorers/base.py +0 -0
  60. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/scorers/hallucination.py +0 -0
  61. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/scorers/output_quality.py +0 -0
  62. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/evals/scorers/tool_usage.py +0 -0
  63. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/llm/__init__.py +0 -0
  64. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/llm/base_provider.py +0 -0
  65. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/llm/capability_map.py +0 -0
  66. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/llm/provider_factory.py +0 -0
  67. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/memory/__init__.py +0 -0
  68. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/memory/conversation.py +0 -0
  69. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/memory/knowledge.py +0 -0
  70. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/memory/persistent.py +0 -0
  71. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/middleware/__init__.py +0 -0
  72. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/middleware/audit_logger.py +0 -0
  73. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/middleware/cost_tracker.py +0 -0
  74. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/middleware/rate_limiter.py +0 -0
  75. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/middleware/retry.py +0 -0
  76. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/monitoring/__init__.py +0 -0
  77. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/monitoring/alerts.py +0 -0
  78. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/monitoring/dashboard.py +0 -0
  79. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/monitoring/exporters/__init__.py +0 -0
  80. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/monitoring/exporters/azure_monitor.py +0 -0
  81. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/monitoring/exporters/prometheus.py +0 -0
  82. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/monitoring/metrics.py +0 -0
  83. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/monitoring/notifier.py +0 -0
  84. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/monitoring/web.py +0 -0
  85. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/pricing.py +0 -0
  86. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/__init__.py +0 -0
  87. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/exec_assistant_agent/__init__.py +0 -0
  88. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/exec_assistant_agent/agent_config.yaml +0 -0
  89. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/exec_assistant_agent/prompts/system.txt +0 -0
  90. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/exec_assistant_agent/tools/__init__.py +0 -0
  91. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/exec_assistant_agent/tools/exec_tools.py +0 -0
  92. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/google_workspace_agent/agent_config.yaml +0 -0
  93. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/google_workspace_agent/prompts/system.txt +0 -0
  94. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/google_workspace_agent/tools/__init__.py +0 -0
  95. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/google_workspace_agent/tools/gws_tools.py +0 -0
  96. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/hr_agent/__init__.py +0 -0
  97. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/hr_agent/agent_config.yaml +0 -0
  98. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/hr_agent/prompts/system.txt +0 -0
  99. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/hr_agent/tools/__init__.py +0 -0
  100. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/hr_agent/tools/hr_tools.py +0 -0
  101. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/it_support_agent/__init__.py +0 -0
  102. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/it_support_agent/agent_config.yaml +0 -0
  103. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/it_support_agent/prompts/system.txt +0 -0
  104. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/it_support_agent/tools/__init__.py +0 -0
  105. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/it_support_agent/tools/it_tools.py +0 -0
  106. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/knowledge_base_agent/__init__.py +0 -0
  107. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/knowledge_base_agent/agent_config.yaml +0 -0
  108. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/knowledge_base_agent/prompts/system.txt +0 -0
  109. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/knowledge_base_agent/tools/__init__.py +0 -0
  110. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/knowledge_base_agent/tools/kb_tools.py +0 -0
  111. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/legal_agent/__init__.py +0 -0
  112. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/legal_agent/agent_config.yaml +0 -0
  113. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/legal_agent/prompts/system.txt +0 -0
  114. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/legal_agent/tools/__init__.py +0 -0
  115. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/templates/legal_agent/tools/legal_tools.py +0 -0
  116. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/tools/__init__.py +0 -0
  117. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe/tools/decorator.py +0 -0
  118. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe.egg-info/SOURCES.txt +0 -0
  119. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe.egg-info/dependency_links.txt +0 -0
  120. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe.egg-info/entry_points.txt +0 -0
  121. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe.egg-info/requires.txt +0 -0
  122. {roscoe-2.1.0 → roscoe-2.2.0}/roscoe.egg-info/top_level.txt +0 -0
  123. {roscoe-2.1.0 → roscoe-2.2.0}/setup.cfg +0 -0
  124. {roscoe-2.1.0 → roscoe-2.2.0}/tests/test_smoke.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: roscoe
3
- Version: 2.1.0
3
+ Version: 2.2.0
4
4
  Summary: roscoe — Ready-to-run Orchestration SDK: Configurable, Observable, Extensible.
5
5
  Author-email: rhealaloo <rhealaloo@gmail.com>
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "roscoe"
7
- version = "2.1.0"
7
+ version = "2.2.0"
8
8
  description = "roscoe — Ready-to-run Orchestration SDK: Configurable, Observable, Extensible."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -3,6 +3,6 @@
3
3
  from roscoe.core.agent_result import AgentResult
4
4
  from roscoe.core.agent_runner import AgentRunner
5
5
 
6
- __version__ = "2.1.0"
6
+ __version__ = "2.2.0"
7
7
 
8
8
  __all__ = ["AgentRunner", "AgentResult", "__version__"]
@@ -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:\n"
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 # flip to true to enable cross-session memory",
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: roscoe
3
- Version: 2.1.0
3
+ Version: 2.2.0
4
4
  Summary: roscoe — Ready-to-run Orchestration SDK: Configurable, Observable, Extensible.
5
5
  Author-email: rhealaloo <rhealaloo@gmail.com>
6
6
  License-Expression: MIT
@@ -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