opalacoder 0.1.26__tar.gz → 0.2.2__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.
- opalacoder-0.2.2/AppIcons/icon.png +0 -0
- opalacoder-0.2.2/AppIcons/opalaicon.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/CLAUDE.md +4 -1
- {opalacoder-0.1.26 → opalacoder-0.2.2}/GEMINI.md +4 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/PKG-INFO +1 -1
- opalacoder-0.2.2/debug/debug_litellm_callbacks.py +43 -0
- opalacoder-0.2.2/debug/test_thought_stream.py +47 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/07-configuracao.md +217 -1
- {opalacoder-0.1.26 → opalacoder-0.2.2}/gui_src/src/App.jsx +447 -189
- {opalacoder-0.1.26 → opalacoder-0.2.2}/gui_src/src/index.css +5 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/gui_src/vite.config.js +10 -1
- opalacoder-0.2.2/icon.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/agent_stdin.py +289 -202
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/agents.py +10 -4
- opalacoder-0.2.2/opalacoder/assetstore/modelconfigs/gpt_oss__latest.metadata +4 -0
- opalacoder-0.2.2/opalacoder/assetstore/modelconfigs/gpt_oss__latest.zip +0 -0
- opalacoder-0.2.2/opalacoder/assetstore/skills/skill_html_css_js.metadata +4 -0
- opalacoder-0.2.2/opalacoder/assetstore/skills/skill_html_css_js.zip +0 -0
- opalacoder-0.2.2/opalacoder/assetstore/skills/skill_implement_feature.metadata +4 -0
- opalacoder-0.2.2/opalacoder/assetstore/skills/skill_implement_feature.zip +0 -0
- opalacoder-0.2.2/opalacoder/assetstore.py +179 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/cli_commands.py +129 -30
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/config.py +46 -2
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/embeddings.py +0 -2
- opalacoder-0.2.2/opalacoder/gui/assets/index-CD7_Sjss.css +32 -0
- opalacoder-0.2.2/opalacoder/gui/assets/index-D2mJbeF2.js +159 -0
- opalacoder-0.2.2/opalacoder/gui/assets/vendor-monaco-BkbU5OES.js +19 -0
- opalacoder-0.2.2/opalacoder/gui/assets/vendor-react-B2vUwPEE.js +24 -0
- opalacoder-0.2.2/opalacoder/gui/assets/vendor-xterm-3VOAfa_q.js +38 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/gui/index.html +5 -2
- opalacoder-0.2.2/opalacoder/icon.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/ide_server.py +130 -44
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/memgpt_runtime.py +16 -4
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/project.py +8 -2
- opalacoder-0.2.2/opalacoder/structured.py +56 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/tools.py +105 -25
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/workflow_orchestrator.py +4 -47
- {opalacoder-0.1.26 → opalacoder-0.2.2}/pyproject.toml +1 -1
- {opalacoder-0.1.26 → opalacoder-0.2.2}/skills/command-line/SKILL.md +5 -5
- {opalacoder-0.1.26 → opalacoder-0.2.2}/skills/view-editor/SKILL.md +1 -1
- {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_agent_stdin.py +78 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_code_index_integration.py +6 -2
- {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_model_commands.py +24 -10
- {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_search_bugs.py +18 -12
- {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_workflow_pipeline.py +14 -7
- opalacoder-0.1.26/opalacoder/copy_gui.py +0 -20
- opalacoder-0.1.26/opalacoder/gui/assets/index-Bp5KKCcR.js +0 -225
- opalacoder-0.1.26/opalacoder/gui/assets/index-_ON06SYj.css +0 -32
- opalacoder-0.1.26/opalacoder/icon.png +0 -0
- opalacoder-0.1.26/opalacoder/structured.py +0 -104
- {opalacoder-0.1.26 → opalacoder-0.2.2}/.claude/rules/RULES.md +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/.claude/settings.json +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/.github/workflows/publish.yml +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/.gitignore +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AGENTS.md +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/100.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/102.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/1024.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/108.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/114.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/120.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/128.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/144.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/152.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/16.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/167.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/172.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/180.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/196.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/20.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/216.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/234.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/256.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/258.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/29.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/32.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/40.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/48.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/50.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/512.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/55.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/57.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/58.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/60.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/64.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/66.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/72.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/76.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/80.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/87.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/88.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/92.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/android/mipmap-hdpi/ic_launcher.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/android/mipmap-mdpi/ic_launcher.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/android/mipmap-xhdpi/ic_launcher.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/android/mipmap-xxhdpi/ic_launcher.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/android/mipmap-xxxhdpi/ic_launcher.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/appstore.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/playstore.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/README.md +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/agents.yaml +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/config.yaml +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/debug/scratch_tail.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/guide/analysis_results.md +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/guide/figs/logotipo.png +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/guide/paper_memplan.md +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/guide/skills-plugin-system.md +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/01-arquitetura.md +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/02-memgpt-orquestrador.md +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/03-skill-implement-feature.md +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/04-memoria.md +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/05-vcs-sombra.md +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/06-skills-e-plugins.md +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/08-ide.md +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/09-ide-projectcreationinterface.md +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/README.md +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/backlog_register.md +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/gui_src/index.html +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/gui_src/package-lock.json +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/gui_src/package.json +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/gui_src/src/main.jsx +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/main.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/__init__.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/api_keys.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/archival.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/cli.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/code_index.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/i18n.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/orchestrator.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/planner.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/plugins/__init__.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/plugins/html_css_js_tools.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/session.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/skills.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/terminal.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/terminal_manager.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/vcs.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/vector_index.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/workflow_tools.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/pytest.ini +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/requirements.txt +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/skills/chat-orchestrator/SKILL.md +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/skills/command-line/scripts/command_executor.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/skills/skills_store/html-css-js/SKILL.md +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/skills/skills_store/html-css-js/scripts/check_contracts.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/skills/skills_store/implement-feature/SKILL.md +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/skills/skills_store/implement-feature/scripts/run_workflow.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/skills/view-editor/scripts/run_view_editor.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_agent_config.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_command_line_skill.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_complexity_evaluator.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_context_guard.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_file_delete.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_i18n_coverage.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_implement_feature_script.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_memgpt_runtime.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_planner_oracle_live.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_planner_output.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_project_store.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_refinement_loop.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_skills_directory_loader.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_unhashable_dict_bug.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_verification_strategies.py +0 -0
- {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_view_editor_skill.py +0 -0
|
Binary file
|
|
Binary file
|
|
@@ -2,10 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
1. Don't make baseless assumptions; before drawing any conclusions, conduct tests and analysis to gather as much information as possible.
|
|
4
4
|
|
|
5
|
+
2. Dever apply direct patch ou modifications in external lib without user authorization.
|
|
6
|
+
|
|
7
|
+
3. Dont call directly litellm (always use agenticblocks). If need same feature dont supported by agenticblocks, alert me and ask me about to do.
|
|
8
|
+
|
|
5
9
|
# Project Guide
|
|
6
10
|
|
|
7
11
|
## Language
|
|
8
|
-
|
|
9
12
|
All code, comments, and documentation must be written in **English**.
|
|
10
13
|
|
|
11
14
|
## Architecture
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
1. Don't make baseless assumptions; before drawing any conclusions, conduct tests and analysis to gather as much information as possible.
|
|
4
4
|
|
|
5
|
+
2. Dever apply direct patch ou modifications in external lib without user authorization.
|
|
6
|
+
|
|
7
|
+
3. Dont call directly litellm (always use agenticblocks). If need same feature dont supported by agenticblocks, alert me and ask me about to do.
|
|
8
|
+
|
|
5
9
|
# Project Guide
|
|
6
10
|
|
|
7
11
|
## Language
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: opalacoder
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: Autonomous coding agent with interactive planning and modular execution
|
|
5
5
|
Project-URL: Homepage, https://github.com/gilzamir/OpalaCoder
|
|
6
6
|
Project-URL: Bug Tracker, https://github.com/gilzamir/OpalaCoder/issues
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import os
|
|
3
|
+
import litellm
|
|
4
|
+
from litellm.integrations.custom_logger import CustomLogger
|
|
5
|
+
|
|
6
|
+
class MyCustomHandler(CustomLogger):
|
|
7
|
+
def log_success_event(self, kwargs, response_obj, start_time, end_time):
|
|
8
|
+
print("--- log_success_event triggered! ---")
|
|
9
|
+
|
|
10
|
+
async def async_log_success_event(self, kwargs, response_obj, start_time, end_time):
|
|
11
|
+
print("--- async_log_success_event triggered! ---")
|
|
12
|
+
|
|
13
|
+
litellm.callbacks = [MyCustomHandler()]
|
|
14
|
+
# Set environment variables for debug logging
|
|
15
|
+
os.environ['LITELLM_LOG'] = 'DEBUG'
|
|
16
|
+
|
|
17
|
+
async def main():
|
|
18
|
+
# We will use the same router setup as agenticblocks
|
|
19
|
+
router = litellm.Router(
|
|
20
|
+
model_list=[{
|
|
21
|
+
"model_name": "openai/unsloth/gpt-oss-20b-GGUF:Q4_1",
|
|
22
|
+
"litellm_params": {
|
|
23
|
+
"model": "openai/unsloth/gpt-oss-20b-GGUF:Q4_1",
|
|
24
|
+
"api_base": "http://localhost:8080/v1",
|
|
25
|
+
"api_key": "test"
|
|
26
|
+
},
|
|
27
|
+
}]
|
|
28
|
+
)
|
|
29
|
+
print("Callbacks in litellm:", litellm.callbacks)
|
|
30
|
+
try:
|
|
31
|
+
# Call via router
|
|
32
|
+
response = await router.acompletion(
|
|
33
|
+
model="openai/unsloth/gpt-oss-20b-GGUF:Q4_1",
|
|
34
|
+
messages=[{"role": "user", "content": "hello"}],
|
|
35
|
+
api_base="http://localhost:8080/v1",
|
|
36
|
+
api_key="test",
|
|
37
|
+
mock_response="Hello back!"
|
|
38
|
+
)
|
|
39
|
+
print("Response received:", response)
|
|
40
|
+
except Exception as e:
|
|
41
|
+
print("Error during completion:", e)
|
|
42
|
+
|
|
43
|
+
asyncio.run(main())
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import httpx
|
|
3
|
+
|
|
4
|
+
async def main():
|
|
5
|
+
# Start the IDE server in a background task
|
|
6
|
+
from opalacoder.ide_server import start_gui_server
|
|
7
|
+
|
|
8
|
+
# We will patch start_gui_server or run it directly on port 3005
|
|
9
|
+
print("Starting GUI server on port 3005...")
|
|
10
|
+
# Run the server startup in a separate thread/task
|
|
11
|
+
|
|
12
|
+
# Set up project path
|
|
13
|
+
project_path = "/home/gilzamir/projetos/OpalaCoder"
|
|
14
|
+
project_name = "bobenglish"
|
|
15
|
+
|
|
16
|
+
# Make a run request
|
|
17
|
+
url = "http://127.0.0.1:3005/api/opalacoder/run"
|
|
18
|
+
payload = {
|
|
19
|
+
"command": "run",
|
|
20
|
+
"agent": "chat_orchestrator",
|
|
21
|
+
"prompt": "Olá",
|
|
22
|
+
"project_name": project_name,
|
|
23
|
+
"project_path": project_path,
|
|
24
|
+
"model": "ollama/gemma4:latest", # or any dummy/mock model
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
# We'll start the server and wait 2 seconds
|
|
28
|
+
server_task = asyncio.create_task(asyncio.to_thread(start_gui_server, "127.0.0.1", 3005))
|
|
29
|
+
await asyncio.sleep(3)
|
|
30
|
+
|
|
31
|
+
print("Sending request to /api/opalacoder/run...")
|
|
32
|
+
try:
|
|
33
|
+
async with httpx.AsyncClient(timeout=60.0) as client:
|
|
34
|
+
async with client.stream("POST", url, json=payload) as response:
|
|
35
|
+
print("Response status:", response.status_code)
|
|
36
|
+
async for line in response.aiter_lines():
|
|
37
|
+
if line.strip():
|
|
38
|
+
print("STREAM LINE:", line)
|
|
39
|
+
except Exception as e:
|
|
40
|
+
print("Error during request:", e)
|
|
41
|
+
finally:
|
|
42
|
+
server_task.cancel()
|
|
43
|
+
|
|
44
|
+
try:
|
|
45
|
+
asyncio.run(main())
|
|
46
|
+
except Exception as e:
|
|
47
|
+
print("Finished:", e)
|
|
@@ -141,7 +141,223 @@ De `build_parser` ([cli.py:419](../../opalacoder/cli.py#L419)):
|
|
|
141
141
|
|
|
142
142
|
---
|
|
143
143
|
|
|
144
|
-
## 5.
|
|
144
|
+
## 5. AssetStore — Repositório de Assets Reutilizáveis
|
|
145
|
+
|
|
146
|
+
> **Estado: IMPLEMENTADO**
|
|
147
|
+
|
|
148
|
+
### Conceito
|
|
149
|
+
|
|
150
|
+
A AssetStore é um **repositório local de assets reutilizáveis** empacotados com o OpalaCoder. Ela serve como banco de dados de casos bem-sucedidos de configuração para modelos locais e como biblioteca de skills extras que podem ser instaladas sob demanda em qualquer projeto.
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
opalacoder/assetstore/ ← instalado junto com o pacote pip
|
|
154
|
+
skills/
|
|
155
|
+
<ID>.zip ← árvore completa da skill
|
|
156
|
+
<ID>.metadata ← metadados YAML
|
|
157
|
+
modelconfigs/
|
|
158
|
+
<ID>.zip ← único arquivo .yaml de configuração
|
|
159
|
+
<ID>.metadata ← metadados YAML
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
O caminho base é sempre `Path(__file__).parent / "assetstore"`, portanto funciona corretamente quando instalado via `pip install opalacoder` em qualquer máquina.
|
|
163
|
+
|
|
164
|
+
### Formato dos metadados (`.metadata`)
|
|
165
|
+
|
|
166
|
+
Arquivo YAML com os campos:
|
|
167
|
+
|
|
168
|
+
| Campo | Obrigatório | Descrição |
|
|
169
|
+
|---|---|---|
|
|
170
|
+
| `id` | ✓ | Identificador único do asset (ex: `skill_implement_feature`) |
|
|
171
|
+
| `type` | ✓ | `skill` ou `modelconfig` |
|
|
172
|
+
| `desc` | ✓ | Descrição legível usada como critério de busca |
|
|
173
|
+
| `name` | skill | Nome da skill (igual ao diretório dentro do zip) |
|
|
174
|
+
| `model` | modelconfig | Identificador do modelo (ex: `ollama/gpt-oss:latest`) |
|
|
175
|
+
|
|
176
|
+
**Exemplo — skill:**
|
|
177
|
+
```yaml
|
|
178
|
+
id: skill_implement_feature
|
|
179
|
+
type: skill
|
|
180
|
+
name: implement-feature
|
|
181
|
+
desc: Plan-Execute-Verify loop for implementing features and fixing bugs in project files
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
**Exemplo — modelconfig:**
|
|
185
|
+
```yaml
|
|
186
|
+
id: model_ollama_gpt_oss__latest
|
|
187
|
+
type: modelconfig
|
|
188
|
+
desc: gpt-oss:latest via Ollama — think=false, tool calling stable
|
|
189
|
+
model: ollama/gpt-oss:latest
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Destino de instalação
|
|
193
|
+
|
|
194
|
+
| Tipo | Destino no projeto |
|
|
195
|
+
|---|---|
|
|
196
|
+
| `skill` | `<projeto>/.opalacoder/skills/<name>/` |
|
|
197
|
+
| `modelconfig` | `<projeto>/.opalacoder/modelsconfig/<provider>/<modelo>.yaml` |
|
|
198
|
+
|
|
199
|
+
Para modelconfigs, o provider é normalizado: `ollama_chat/` e `ollama/` → diretório `ollama/`. Os dois pontos no nome do modelo viram `__`.
|
|
200
|
+
|
|
201
|
+
### Comandos REPL
|
|
202
|
+
|
|
203
|
+
```
|
|
204
|
+
/list_assets [tipo] — lista todos os assets (ou só do tipo especificado)
|
|
205
|
+
/load_asset <tipo> <desc|id|*> — instala asset(s) no projeto ativo
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
`<desc>` pode ser o `id` exato ou o valor do campo `desc`. Usar `*` instala todos os assets do tipo.
|
|
209
|
+
|
|
210
|
+
**Exemplos:**
|
|
211
|
+
```
|
|
212
|
+
/list_assets
|
|
213
|
+
/list_assets modelconfig
|
|
214
|
+
/load_asset skill skill_implement_feature
|
|
215
|
+
/load_asset modelconfig model_ollama_gpt_oss__latest
|
|
216
|
+
/load_asset skill *
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
Após instalar uma skill, ativá-la no projeto com `/addskill <name>`.
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## 5.1. Banco de Configurações Refinadas de Modelos
|
|
224
|
+
|
|
225
|
+
> **Estado: IMPLEMENTADO**
|
|
226
|
+
|
|
227
|
+
### Conceito
|
|
228
|
+
|
|
229
|
+
O diretório `.opalacoder/modelsconfig/` dentro de cada projeto funciona como um
|
|
230
|
+
**banco de dados de casos bem-sucedidos de configuração para modelos locais**. Cada
|
|
231
|
+
arquivo YAML registra os parâmetros que produziram comportamento correto e estável
|
|
232
|
+
para um modelo específico naquele projeto — resultado de testes empíricos, não de
|
|
233
|
+
valores genéricos.
|
|
234
|
+
|
|
235
|
+
A motivação é que modelos locais (Ollama, LM Studio, etc.) exigem combinações
|
|
236
|
+
precisas de parâmetros para funcionar bem: `think` e `stream` podem quebrar
|
|
237
|
+
tool calling em certos modelos; `num_ctx` muito baixo degrada o raciocínio;
|
|
238
|
+
`temperature` alta pode destabilizar modelos de instrução. Esses parâmetros
|
|
239
|
+
**não são portáveis** — o que funciona para `deepseek-r1:14b` não funciona para
|
|
240
|
+
`ministral-3:14b`. O banco de configurações resolve isso por projeto.
|
|
241
|
+
|
|
242
|
+
### Estrutura de diretórios
|
|
243
|
+
|
|
244
|
+
```
|
|
245
|
+
<projeto>/
|
|
246
|
+
└── .opalacoder/
|
|
247
|
+
└── modelsconfig/
|
|
248
|
+
└── <provider>/
|
|
249
|
+
└── <nome_do_modelo>.yaml
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
- **`<provider>`**: prefixo do modelo, com normalização — `ollama_chat/` e `ollama/`
|
|
253
|
+
mapeiam ambos para o diretório `ollama/`.
|
|
254
|
+
- **`<nome_do_modelo>.yaml`**: nome do modelo com `:` substituído por `__`
|
|
255
|
+
(hífens mantidos).
|
|
256
|
+
|
|
257
|
+
**Exemplos de mapeamento:**
|
|
258
|
+
|
|
259
|
+
| Modelo digitado | Diretório | Arquivo |
|
|
260
|
+
|---|---|---|
|
|
261
|
+
| `ollama/deepseek-r1:14b` | `ollama/` | `deepseek-r1__14b.yaml` |
|
|
262
|
+
| `ollama_chat/deepseek-r1:14b` | `ollama/` | `deepseek-r1__14b.yaml` |
|
|
263
|
+
| `ollama/ministral-3:14b` | `ollama/` | `ministral-3__14b.yaml` |
|
|
264
|
+
| `ollama/qwen3:14b` | `ollama/` | `qwen3__14b.yaml` |
|
|
265
|
+
|
|
266
|
+
### Formato do arquivo YAML
|
|
267
|
+
|
|
268
|
+
O arquivo pode conter qualquer chave de `model_params` aceita pelo sistema, mais
|
|
269
|
+
uma chave especial `provider`:
|
|
270
|
+
|
|
271
|
+
```yaml
|
|
272
|
+
# .opalacoder/modelsconfig/ollama/deepseek-r1__14b.yaml
|
|
273
|
+
# Configuração refinada para DeepSeek-R1 14B via Ollama
|
|
274
|
+
# Obtida empiricamente — funciona com tool calling e thinking em tempo real
|
|
275
|
+
|
|
276
|
+
provider: ollama_chat # opcional: substitui o prefixo do modelo na sessão
|
|
277
|
+
# aqui muda de ollama/ para ollama_chat/ para habilitar
|
|
278
|
+
# o endpoint nativo do Ollama com thinking por chunk
|
|
279
|
+
|
|
280
|
+
# LiteLLM / model_kwargs
|
|
281
|
+
think: true
|
|
282
|
+
stream: true
|
|
283
|
+
temperature: 0.6
|
|
284
|
+
num_ctx: 32768
|
|
285
|
+
max_tokens: 8192
|
|
286
|
+
|
|
287
|
+
# Parâmetros do agente
|
|
288
|
+
max_heartbeats: 15
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
```yaml
|
|
292
|
+
# .opalacoder/modelsconfig/ollama/ministral-3__14b.yaml
|
|
293
|
+
# Ministral 3 14B — sem thinking (não suportado), tool calling estável
|
|
294
|
+
|
|
295
|
+
think: false
|
|
296
|
+
stream: false
|
|
297
|
+
temperature: 0.7
|
|
298
|
+
num_ctx: 16384
|
|
299
|
+
max_tokens: 8128
|
|
300
|
+
max_heartbeats: 20
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
**Chave `provider`** (opcional): quando presente, substitui o prefixo do modelo
|
|
304
|
+
na interface. Útil para forçar `ollama_chat/` em modelos com suporte a thinking
|
|
305
|
+
nativo, sem o usuário precisar digitar o prefixo correto.
|
|
306
|
+
|
|
307
|
+
### Como usar
|
|
308
|
+
|
|
309
|
+
Na janela de **criação** ou **configuração** de projeto, após definir o modelo,
|
|
310
|
+
clique em **Load Refined Config**:
|
|
311
|
+
|
|
312
|
+
- Se existir um arquivo para o modelo: carrega e substitui completamente o
|
|
313
|
+
`model_params` do projeto. Se o YAML tiver `provider:`, atualiza o campo
|
|
314
|
+
modelo com o novo prefixo.
|
|
315
|
+
- Se não existir: exibe `--- ainda não temos parâmetros refinados para este modelo`.
|
|
316
|
+
|
|
317
|
+
O backend resolve o arquivo via `GET/POST /api/opalacoder/model-config`
|
|
318
|
+
([ide_server.py](../../opalacoder/ide_server.py)).
|
|
319
|
+
|
|
320
|
+
### Critério para adicionar uma entrada
|
|
321
|
+
|
|
322
|
+
Uma entrada deve ser adicionada ao banco quando:
|
|
323
|
+
|
|
324
|
+
1. O modelo foi testado com a configuração e **tool calling funciona** sem erros.
|
|
325
|
+
2. O comportamento de **thinking/reflection** (se aplicável) está correto.
|
|
326
|
+
3. Os valores de **contexto e tokens** são adequados ao hardware disponível.
|
|
327
|
+
|
|
328
|
+
O arquivo é mantido manualmente pelo usuário/equipe e versionado junto com o
|
|
329
|
+
projeto. Não é gerado automaticamente.
|
|
330
|
+
|
|
331
|
+
### Exemplo completo — `gpt-oss:latest` (Ollama)
|
|
332
|
+
|
|
333
|
+
```yaml
|
|
334
|
+
# .opalacoder/modelsconfig/ollama/gpt-oss__latest.yaml
|
|
335
|
+
#
|
|
336
|
+
# Configuração refinada para gpt-oss:latest via Ollama
|
|
337
|
+
# Testado em: 2026-06-02 | Hardware: RTX 4090 24GB
|
|
338
|
+
# Status: tool calling OK, thinking OK, stream OK
|
|
339
|
+
#
|
|
340
|
+
provider: ollama_chat # endpoint nativo: thinking por chunk em tempo real
|
|
341
|
+
|
|
342
|
+
# LiteLLM / model_kwargs
|
|
343
|
+
think: false # desativar thinking evita bug de tool_calls vazio (ollama #15288)
|
|
344
|
+
stream: false # stream false: mais estável com tool calling
|
|
345
|
+
temperature: 0.1 # baixo para respostas determinísticas em tarefas de código
|
|
346
|
+
num_ctx: 32768 # contexto amplo para projetos grandes
|
|
347
|
+
max_tokens: 8192
|
|
348
|
+
|
|
349
|
+
# Parâmetros do agente MemGPT (chat-orquestrador)
|
|
350
|
+
max_heartbeats: 20
|
|
351
|
+
max_context_tokens: 32768
|
|
352
|
+
|
|
353
|
+
# Parâmetros do agente LLMAgentBlock (workers)
|
|
354
|
+
max_tool_calls: 10
|
|
355
|
+
debug: false
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
## 6. Comandos do REPL
|
|
145
361
|
|
|
146
362
|
Registrados em [cli_commands.py](../../opalacoder/cli_commands.py):
|
|
147
363
|
|