Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
8234f32
Keep origin workflows; sync main from m_M
csbobby Feb 10, 2026
fd7404b
Keep origin workflows; sync main from m_M
csbobby Feb 10, 2026
ff6eedb
Remove pr-update workflow to avoid workflow scope requirement
csbobby Feb 10, 2026
fdb9894
add: robust constraint_extractor parser
csbobby Feb 10, 2026
39a2f92
upd: sync the workflows with the mellea main
csbobby Feb 10, 2026
72e5470
upd: add the newlines in the workflows files
csbobby Feb 10, 2026
c686240
upd: normalizing whitespace and separators for the constraint NA situ…
csbobby Feb 10, 2026
d2e07d5
upd: format with a newline
csbobby Feb 12, 2026
6de03fd
Merge branch 'main' into main
csbobby Feb 12, 2026
97307f1
sync workflows file
csbobby Feb 24, 2026
04fc549
Merge branch 'backup/local-main'
csbobby Feb 24, 2026
ff25006
feat: req validation generator & template v2
Nov 3, 2025
6b7f53c
fix: constraint extractor
csbobby Jan 12, 2026
16b7204
Merge branch 'fix/from-backup'
csbobby Feb 24, 2026
fe5282e
Merge branch 'main' into main
csbobby Feb 25, 2026
afc4ca9
clean: pre-commit clean
csbobby Feb 26, 2026
048663a
fix: test
csbobby Feb 26, 2026
3056fbb
Merge branch 'main' into main
csbobby Feb 26, 2026
464005b
revert: ci workflow
csbobby Feb 26, 2026
f218c5d
Merge branch 'main' into main
csbobby Mar 2, 2026
d6f86b8
clean: newline change by uv run pre-commit run --all-files
csbobby Mar 2, 2026
a118ad3
Merge branch 'main' into main
csbobby Mar 11, 2026
c7d3408
upd: script and use case examples
Mar 16, 2026
9dae4d4
upd: compatible to the refactored codes
csbobby Mar 11, 2026
d8a028a
Create README.md
Mar 11, 2026
dd14229
feat: hook system and plugin support for Mellea (#582)
araujof Mar 11, 2026
82d90d5
Update README.md
csbobby Mar 13, 2026
1c513e9
Update README.md
csbobby Mar 13, 2026
c18b776
Update README.md
Mar 13, 2026
ba4441d
Merge branch 'main' of https://github.com/csbobby/mellea
Mar 16, 2026
bb935b7
merge plugins
Mar 16, 2026
6076ad9
merge
Mar 16, 2026
c704311
merge
Mar 16, 2026
0887f0e
Merge branch 'main' into main
csbobby Mar 16, 2026
af20fbe
fix: name
csbobby Mar 16, 2026
cb6c85a
fix: constraint dict var
csbobby Mar 16, 2026
f3e45da
change: decision type
csbobby Mar 16, 2026
45c5478
Revert "feat: hook system and plugin support for Mellea (#582)"
csbobby Mar 16, 2026
d2a57c6
sync: with main
csbobby Mar 16, 2026
3dc6dad
upd: pre-commit format
csbobby Mar 16, 2026
b664313
refact: refactor the pipline with clear stages
csbobby Mar 16, 2026
0231348
upd: unify logging config
csbobby Mar 16, 2026
e1bacd7
add: query print
csbobby Mar 16, 2026
ef68f72
Merge pull request #4 from csbobby/refact/module
csbobby Mar 17, 2026
1de4c93
merge: from main updates and add compatibility
csbobby Mar 17, 2026
9d54119
upd: pre-commit check
csbobby Mar 17, 2026
08e8a19
add: logging config
csbobby Mar 17, 2026
4d54a81
add: pre-commit format
csbobby Mar 17, 2026
07cd0a4
Merge pull request #6 from csbobby/refact/module
csbobby Mar 17, 2026
c079c6f
Merge branch 'main' into main
csbobby Mar 17, 2026
904b04b
fix: merge conflict changes from the Mellea main
csbobby Mar 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
220 changes: 97 additions & 123 deletions cli/decompose/decompose.py

Large diffs are not rendered by default.

44 changes: 44 additions & 0 deletions cli/decompose/logging.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import logging
import sys
from enum import StrEnum


class LogMode(StrEnum):
demo = "demo"
debug = "debug"


_CONFIGURED = False


def configure_logging(log_mode: LogMode = LogMode.demo) -> None:
global _CONFIGURED

level = logging.DEBUG if log_mode == LogMode.debug else logging.INFO

root_logger = logging.getLogger()

if not _CONFIGURED:
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(
logging.Formatter("[%(levelname)s] %(name)s | %(message)s")
)
root_logger.handlers.clear()
root_logger.addHandler(handler)
_CONFIGURED = True

root_logger.setLevel(level)

logging.getLogger("m_decompose").setLevel(level)
logging.getLogger("mellea").setLevel(level)


def get_logger(name: str) -> logging.Logger:
return logging.getLogger(name)


def log_section(logger: logging.Logger, title: str) -> None:
logger.info("")
logger.info("=" * 72)
logger.info(title)
logger.info("=" * 72)
15 changes: 15 additions & 0 deletions cli/decompose/m_decomp_result_v1.py.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@ import os
import textwrap

import mellea
{%- if "code" in identified_constraints | map(attribute="val_strategy") %}
from mellea.stdlib.requirement import req
{% for c in identified_constraints %}
{%- if c.val_fn %}
from validations.{{ c.val_fn_name }} import validate_input as {{ c.val_fn_name }}
{%- endif %}
{%- endfor %}
{%- endif %}

m = mellea.start_session()
{%- if user_inputs %}
Expand All @@ -30,7 +38,14 @@ except KeyError as e:
{%- if item.constraints %}
requirements=[
{%- for c in item.constraints %}
{%- if c.val_fn %}
req(
{{ c.constraint | tojson}},
validation_fn={{ c.val_fn_name }},
),
{%- else %}
{{ c.constraint | tojson}},
{%- endif %}
{%- endfor %}
],
{%- else %}
Expand Down
91 changes: 91 additions & 0 deletions cli/decompose/m_decomp_result_v2.py.jinja2
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
{% if user_inputs -%}
import os
{% endif -%}
import textwrap

import mellea
{%- if "code" in identified_constraints | map(attribute="val_strategy") %}
from mellea.stdlib.requirement import req
{% for c in identified_constraints %}
{%- if c.val_fn %}
from validations.{{ c.val_fn_name }} import validate_input as {{ c.val_fn_name }}
{%- endif %}
{%- endfor %}
{%- endif %}

m = mellea.start_session()
{%- if user_inputs %}


# User Input Variables
try:
{%- for var in user_inputs %}
{{ var | lower }} = os.environ["{{ var | upper }}"]
{%- endfor %}
except KeyError as e:
print(f"ERROR: One or more required environment variables are not set; {e}")
exit(1)
{%- endif %}
{%- for item in subtasks %}


{{ item.tag | lower }}_gnrl = textwrap.dedent(
R"""
{{ item.general_instructions | trim | indent(width=4, first=False) }}
""".strip()
)
{{ item.tag | lower }} = m.instruct(
{%- if not item.input_vars_required %}
{{ item.subtask[3:] | trim | tojson }},
{%- else %}
textwrap.dedent(
R"""
{{ item.subtask[3:] | trim }}

Here are the input variables and their content:
{%- for var in item.input_vars_required %}

- {{ var | upper }} = {{ "{{" }}{{ var | upper }}{{ "}}" }}
{%- endfor %}
""".strip()
),
{%- endif %}
{%- if item.constraints %}
requirements=[
{%- for c in item.constraints %}
{%- if c.val_fn %}
req(
{{ c.constraint | tojson}},
validation_fn={{ c.val_fn_name }},
),
{%- else %}
{{ c.constraint | tojson}},
{%- endif %}
{%- endfor %}
],
{%- else %}
requirements=None,
{%- endif %}
{%- if item.input_vars_required %}
user_variables={
{%- for var in item.input_vars_required %}
{{ var | upper | tojson }}: {{ var | lower }},
{%- endfor %}
},
{%- endif %}
grounding_context={
"GENERAL_INSTRUCTIONS": {{ item.tag | lower }}_gnrl,
{%- for var in item.depends_on %}
{{ var | upper | tojson }}: {{ var | lower }}.value,
{%- endfor %}
},
)
assert {{ item.tag | lower }}.value is not None, 'ERROR: task "{{ item.tag | lower }}" execution failed'
{%- if loop.last %}


final_answer = {{ item.tag | lower }}.value

print(final_answer)
{%- endif -%}
{%- endfor -%}
Loading