Skip to content

Repository files navigation

Self-Modification At RunTime (SMART): A Framework for Metaprogramming with Large Language Models for Adaptable and Autonomous Software



Tests

Setup instructions

  1. Create .env for your environment variables. See .env.example.
  2. Add your API key
  3. python setup.py install
  4. pre-commit install

To run all unit tests.

Options:

  • -s shows print statements
  • -v indicates when a tests passes
  • --durations=0 displays a list of n slowest tests at the end of the test session
pytest -s -v --durations=0

To run all tests in a specific file:

pytest <file name>

To run a specific unit test:

pytest -k <test name>
  1. Linting and VSCode

To setup linting with flake8 and auto formatting with black: 4.1. Create the subdirectory .vscode in the root directory 4.2. Add the following settings.json file:

{
"editor.formatOnSave": true,
"python.formatting.provider": "none",
"python.formatting.blackArgs": [
"--line-length",
"100"
],
"python.linting.enabled": true,
"python.linting.lintOnSave": true,
"python.linting.flake8Enabled": true,
"python.linting.flake8Args": [
"--line-length",
"100"
],
"[python]": {
"editor.codeActionsOnSave": {
"source.organizeImports": true
},
"editor.defaultFormatter": "ms-python.black-formatter"
}
}

Using the generative package

Setup

  1. OPENAI_API_KEY must be set in .env or in your terminal OPENAI_API_KEY=your-api-key-here
  2. Define your custome LLM solution. Then import the decorators and your llm function and pass it to the decorator.
  3. Use as follows:

Bring your own model

Create a custom model class with a generate() function that takes a prompt and returns a string.

All functionality in the generative package expects a model that inherits from the abstract class AbstractGenerativeModel. generate() must be marked with the @classmethod decorator.

fromgenerative.metaclassesimportAbstractGenerativeModelclassLLM(AbstractGenerativeModel):
@classmethoddefgenerate(self, prompt: str) ->str:
# Must implement generate()

Function decorators

@adapt decorator enables your model to control the behavior of the decorated function at run-time. The model could check for semantic errors and change based on input.

fromgenerative.decoratorimportadapt@adapt(model=LLM)deffunc(a, b):
prompt=""" Write a complete python 3 function, including the header and return statement that computes the N-th Fibonacci number. """assertfunc(8) ==21

@catch decorator enables your model to control the behavior of the decorated function at run-time only when an exception is thrown.

fromgenerative.decoratorimportcatch@catch(model=LLM)deffunc(a, b):
raiseException("Original function exception")

@stack_trace decorator augments stack traces with human-readable summaries and steps to debug or fix the issue.

fromgenerative.decoratorimportstack_trace@stack_trace(model=LLM)deffunkodunko():
items= [1, 2, 3]
returnitems[5]

Example output:

tests/test_adapt_decorator.py Traceback (most recent call last):
File "/Users/justin/Documents/dev/personal/ml/dynamic-mp-llm/meta.py", line 167, in wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "/Users/justin/Documents/dev/personal/ml/dynamic-mp-llm/tests/test_adapt_decorator.py", line 100, in funkodunko
return items[5]
~~~~~^^^
IndexError: list index out of range
Human-readable summary:
(funkodunko) Attempted to access an element of a list that does not exist.
Suggestions for how to fix the error:
1. Check the length of the list to make sure there are enough elements to access the desired index.
2. If the list is too short, add elements to the list in order to access the desired index.
3. If the list is empty, consider initializing the list with data.

GenerativeMetaClass

GenerativeMetaClass is enables its metaclassed classes to apply generated functions at run-time.

frommodelimportGPT3fromgenerative.metaclassesimportGenerativeMetaClassfrompromptimportformat_generative_functionclassDoggo(metaclass=GenerativeMetaClass):
def__init__(self, name: str):
self.name=namedefset_treat(self, treat: str):
self.stomach=treatprompt="Write a function with the header `def do_trick(self)` that returns a string '*sit*'"prompt=format_generative_function(prompt)
new_trick=GPT3.generate(prompt)
a_good_boy=Doggo('Chewy')
a_good_boy.generate(new_trick)
a_good_boy.do_trick()
a_good_boy.set_treat('roast beef')

Check which functions are generative

importinspectall_funcs=inspect.getmembers(
cls, predicate=inspect.isfunction
)
[fforfinall_funcsiff._is_generative]

Database integration

Clients can integrate custom database solutions to save the generated code, function name, and, if available, arguments and keyword arguments. This could be useful in large pipelines for embedding generated code offline. At run-time cachced embedded code could later be retreived given a similar input.

importredisfromgenerative.functionsimportadaptfromgenerative.metaclassesimportAbstractDatabasefrommodelsimportLLMclassVectorDB(AbstractDatabase):
def__init__(self):
self.db=redis.Redis(host='localhost', port=6379, db=0)
defcontains(self, key: str) ->bool:
returnself.db.exists(key)
defget(self, query: str) ->List[Dict] :
returnself.db.get(query)
defset(self, key: str, data: Any) ->None:
# Implement custom versioning logic here# query database by function name# store data by versions e.g {func_name: {'version_1': data }}self.db.set(key, data)
classDemo():
db=VectorDB()
@adapt(model=LLM, critic=LLM, database=db)deffunc(self):
pass# functionality that requires adaptation

About

Self-modifying code at runtime with Large Language Models

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - ch3njust1n/smart: Self-modifying code at runtime with Large Language Models · GitHub
Skip to content

Repository files navigation

Self-Modification At RunTime (SMART): A Framework for Metaprogramming with Large Language Models for Adaptable and Autonomous Software



Tests

Setup instructions

  1. Create .env for your environment variables. See .env.example.
  2. Add your API key
  3. python setup.py install
  4. pre-commit install

To run all unit tests.

Options:

  • -s shows print statements
  • -v indicates when a tests passes
  • --durations=0 displays a list of n slowest tests at the end of the test session
pytest -s -v --durations=0

To run all tests in a specific file:

pytest <file name>

To run a specific unit test:

pytest -k <test name>
  1. Linting and VSCode

To setup linting with flake8 and auto formatting with black: 4.1. Create the subdirectory .vscode in the root directory 4.2. Add the following settings.json file:

{
"editor.formatOnSave": true,
"python.formatting.provider": "none",
"python.formatting.blackArgs": [
"--line-length",
"100"
],
"python.linting.enabled": true,
"python.linting.lintOnSave": true,
"python.linting.flake8Enabled": true,
"python.linting.flake8Args": [
"--line-length",
"100"
],
"[python]": {
"editor.codeActionsOnSave": {
"source.organizeImports": true
},
"editor.defaultFormatter": "ms-python.black-formatter"
}
}

Using the generative package

Setup

  1. OPENAI_API_KEY must be set in .env or in your terminal OPENAI_API_KEY=your-api-key-here
  2. Define your custome LLM solution. Then import the decorators and your llm function and pass it to the decorator.
  3. Use as follows:

Bring your own model

Create a custom model class with a generate() function that takes a prompt and returns a string.

All functionality in the generative package expects a model that inherits from the abstract class AbstractGenerativeModel. generate() must be marked with the @classmethod decorator.

fromgenerative.metaclassesimportAbstractGenerativeModelclassLLM(AbstractGenerativeModel):
@classmethoddefgenerate(self, prompt: str) ->str:
# Must implement generate()

Function decorators

@adapt decorator enables your model to control the behavior of the decorated function at run-time. The model could check for semantic errors and change based on input.

fromgenerative.decoratorimportadapt@adapt(model=LLM)deffunc(a, b):
prompt=""" Write a complete python 3 function, including the header and return statement that computes the N-th Fibonacci number. """assertfunc(8) ==21

@catch decorator enables your model to control the behavior of the decorated function at run-time only when an exception is thrown.

fromgenerative.decoratorimportcatch@catch(model=LLM)deffunc(a, b):
raiseException("Original function exception")

@stack_trace decorator augments stack traces with human-readable summaries and steps to debug or fix the issue.

fromgenerative.decoratorimportstack_trace@stack_trace(model=LLM)deffunkodunko():
items= [1, 2, 3]
returnitems[5]

Example output:

tests/test_adapt_decorator.py Traceback (most recent call last):
File "/Users/justin/Documents/dev/personal/ml/dynamic-mp-llm/meta.py", line 167, in wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "/Users/justin/Documents/dev/personal/ml/dynamic-mp-llm/tests/test_adapt_decorator.py", line 100, in funkodunko
return items[5]
~~~~~^^^
IndexError: list index out of range
Human-readable summary:
(funkodunko) Attempted to access an element of a list that does not exist.
Suggestions for how to fix the error:
1. Check the length of the list to make sure there are enough elements to access the desired index.
2. If the list is too short, add elements to the list in order to access the desired index.
3. If the list is empty, consider initializing the list with data.

GenerativeMetaClass

GenerativeMetaClass is enables its metaclassed classes to apply generated functions at run-time.

frommodelimportGPT3fromgenerative.metaclassesimportGenerativeMetaClassfrompromptimportformat_generative_functionclassDoggo(metaclass=GenerativeMetaClass):
def__init__(self, name: str):
self.name=namedefset_treat(self, treat: str):
self.stomach=treatprompt="Write a function with the header `def do_trick(self)` that returns a string '*sit*'"prompt=format_generative_function(prompt)
new_trick=GPT3.generate(prompt)
a_good_boy=Doggo('Chewy')
a_good_boy.generate(new_trick)
a_good_boy.do_trick()
a_good_boy.set_treat('roast beef')

Check which functions are generative

importinspectall_funcs=inspect.getmembers(
cls, predicate=inspect.isfunction
)
[fforfinall_funcsiff._is_generative]

Database integration

Clients can integrate custom database solutions to save the generated code, function name, and, if available, arguments and keyword arguments. This could be useful in large pipelines for embedding generated code offline. At run-time cachced embedded code could later be retreived given a similar input.

importredisfromgenerative.functionsimportadaptfromgenerative.metaclassesimportAbstractDatabasefrommodelsimportLLMclassVectorDB(AbstractDatabase):
def__init__(self):
self.db=redis.Redis(host='localhost', port=6379, db=0)
defcontains(self, key: str) ->bool:
returnself.db.exists(key)
defget(self, query: str) ->List[Dict] :
returnself.db.get(query)
defset(self, key: str, data: Any) ->None:
# Implement custom versioning logic here# query database by function name# store data by versions e.g {func_name: {'version_1': data }}self.db.set(key, data)
classDemo():
db=VectorDB()
@adapt(model=LLM, critic=LLM, database=db)deffunc(self):
pass# functionality that requires adaptation

About

Self-modifying code at runtime with Large Language Models

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - ch3njust1n/smart: Self-modifying code at runtime with Large Language Models · GitHub
Skip to content

Repository files navigation

Self-Modification At RunTime (SMART): A Framework for Metaprogramming with Large Language Models for Adaptable and Autonomous Software



Tests

Setup instructions

  1. Create .env for your environment variables. See .env.example.
  2. Add your API key
  3. python setup.py install
  4. pre-commit install

To run all unit tests.

Options:

  • -s shows print statements
  • -v indicates when a tests passes
  • --durations=0 displays a list of n slowest tests at the end of the test session
pytest -s -v --durations=0

To run all tests in a specific file:

pytest <file name>

To run a specific unit test:

pytest -k <test name>
  1. Linting and VSCode

To setup linting with flake8 and auto formatting with black: 4.1. Create the subdirectory .vscode in the root directory 4.2. Add the following settings.json file:

{
"editor.formatOnSave": true,
"python.formatting.provider": "none",
"python.formatting.blackArgs": [
"--line-length",
"100"
],
"python.linting.enabled": true,
"python.linting.lintOnSave": true,
"python.linting.flake8Enabled": true,
"python.linting.flake8Args": [
"--line-length",
"100"
],
"[python]": {
"editor.codeActionsOnSave": {
"source.organizeImports": true
},
"editor.defaultFormatter": "ms-python.black-formatter"
}
}

Using the generative package

Setup

  1. OPENAI_API_KEY must be set in .env or in your terminal OPENAI_API_KEY=your-api-key-here
  2. Define your custome LLM solution. Then import the decorators and your llm function and pass it to the decorator.
  3. Use as follows:

Bring your own model

Create a custom model class with a generate() function that takes a prompt and returns a string.

All functionality in the generative package expects a model that inherits from the abstract class AbstractGenerativeModel. generate() must be marked with the @classmethod decorator.

fromgenerative.metaclassesimportAbstractGenerativeModelclassLLM(AbstractGenerativeModel):
@classmethoddefgenerate(self, prompt: str) ->str:
# Must implement generate()

Function decorators

@adapt decorator enables your model to control the behavior of the decorated function at run-time. The model could check for semantic errors and change based on input.

fromgenerative.decoratorimportadapt@adapt(model=LLM)deffunc(a, b):
prompt=""" Write a complete python 3 function, including the header and return statement that computes the N-th Fibonacci number. """assertfunc(8) ==21

@catch decorator enables your model to control the behavior of the decorated function at run-time only when an exception is thrown.

fromgenerative.decoratorimportcatch@catch(model=LLM)deffunc(a, b):
raiseException("Original function exception")

@stack_trace decorator augments stack traces with human-readable summaries and steps to debug or fix the issue.

fromgenerative.decoratorimportstack_trace@stack_trace(model=LLM)deffunkodunko():
items= [1, 2, 3]
returnitems[5]

Example output:

tests/test_adapt_decorator.py Traceback (most recent call last):
File "/Users/justin/Documents/dev/personal/ml/dynamic-mp-llm/meta.py", line 167, in wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "/Users/justin/Documents/dev/personal/ml/dynamic-mp-llm/tests/test_adapt_decorator.py", line 100, in funkodunko
return items[5]
~~~~~^^^
IndexError: list index out of range
Human-readable summary:
(funkodunko) Attempted to access an element of a list that does not exist.
Suggestions for how to fix the error:
1. Check the length of the list to make sure there are enough elements to access the desired index.
2. If the list is too short, add elements to the list in order to access the desired index.
3. If the list is empty, consider initializing the list with data.

GenerativeMetaClass

GenerativeMetaClass is enables its metaclassed classes to apply generated functions at run-time.

frommodelimportGPT3fromgenerative.metaclassesimportGenerativeMetaClassfrompromptimportformat_generative_functionclassDoggo(metaclass=GenerativeMetaClass):
def__init__(self, name: str):
self.name=namedefset_treat(self, treat: str):
self.stomach=treatprompt="Write a function with the header `def do_trick(self)` that returns a string '*sit*'"prompt=format_generative_function(prompt)
new_trick=GPT3.generate(prompt)
a_good_boy=Doggo('Chewy')
a_good_boy.generate(new_trick)
a_good_boy.do_trick()
a_good_boy.set_treat('roast beef')

Check which functions are generative

importinspectall_funcs=inspect.getmembers(
cls, predicate=inspect.isfunction
)
[fforfinall_funcsiff._is_generative]

Database integration

Clients can integrate custom database solutions to save the generated code, function name, and, if available, arguments and keyword arguments. This could be useful in large pipelines for embedding generated code offline. At run-time cachced embedded code could later be retreived given a similar input.

importredisfromgenerative.functionsimportadaptfromgenerative.metaclassesimportAbstractDatabasefrommodelsimportLLMclassVectorDB(AbstractDatabase):
def__init__(self):
self.db=redis.Redis(host='localhost', port=6379, db=0)
defcontains(self, key: str) ->bool:
returnself.db.exists(key)
defget(self, query: str) ->List[Dict] :
returnself.db.get(query)
defset(self, key: str, data: Any) ->None:
# Implement custom versioning logic here# query database by function name# store data by versions e.g {func_name: {'version_1': data }}self.db.set(key, data)
classDemo():
db=VectorDB()
@adapt(model=LLM, critic=LLM, database=db)deffunc(self):
pass# functionality that requires adaptation

About

Self-modifying code at runtime with Large Language Models

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - ch3njust1n/smart: Self-modifying code at runtime with Large Language Models · GitHub
Skip to content

Repository files navigation

Self-Modification At RunTime (SMART): A Framework for Metaprogramming with Large Language Models for Adaptable and Autonomous Software



Tests

Setup instructions

  1. Create .env for your environment variables. See .env.example.
  2. Add your API key
  3. python setup.py install
  4. pre-commit install

To run all unit tests.

Options:

  • -s shows print statements
  • -v indicates when a tests passes
  • --durations=0 displays a list of n slowest tests at the end of the test session
pytest -s -v --durations=0

To run all tests in a specific file:

pytest <file name>

To run a specific unit test:

pytest -k <test name>
  1. Linting and VSCode

To setup linting with flake8 and auto formatting with black: 4.1. Create the subdirectory .vscode in the root directory 4.2. Add the following settings.json file:

{
"editor.formatOnSave": true,
"python.formatting.provider": "none",
"python.formatting.blackArgs": [
"--line-length",
"100"
],
"python.linting.enabled": true,
"python.linting.lintOnSave": true,
"python.linting.flake8Enabled": true,
"python.linting.flake8Args": [
"--line-length",
"100"
],
"[python]": {
"editor.codeActionsOnSave": {
"source.organizeImports": true
},
"editor.defaultFormatter": "ms-python.black-formatter"
}
}

Using the generative package

Setup

  1. OPENAI_API_KEY must be set in .env or in your terminal OPENAI_API_KEY=your-api-key-here
  2. Define your custome LLM solution. Then import the decorators and your llm function and pass it to the decorator.
  3. Use as follows:

Bring your own model

Create a custom model class with a generate() function that takes a prompt and returns a string.

All functionality in the generative package expects a model that inherits from the abstract class AbstractGenerativeModel. generate() must be marked with the @classmethod decorator.

fromgenerative.metaclassesimportAbstractGenerativeModelclassLLM(AbstractGenerativeModel):
@classmethoddefgenerate(self, prompt: str) ->str:
# Must implement generate()

Function decorators

@adapt decorator enables your model to control the behavior of the decorated function at run-time. The model could check for semantic errors and change based on input.

fromgenerative.decoratorimportadapt@adapt(model=LLM)deffunc(a, b):
prompt=""" Write a complete python 3 function, including the header and return statement that computes the N-th Fibonacci number. """assertfunc(8) ==21

@catch decorator enables your model to control the behavior of the decorated function at run-time only when an exception is thrown.

fromgenerative.decoratorimportcatch@catch(model=LLM)deffunc(a, b):
raiseException("Original function exception")

@stack_trace decorator augments stack traces with human-readable summaries and steps to debug or fix the issue.

fromgenerative.decoratorimportstack_trace@stack_trace(model=LLM)deffunkodunko():
items= [1, 2, 3]
returnitems[5]

Example output:

tests/test_adapt_decorator.py Traceback (most recent call last):
File "/Users/justin/Documents/dev/personal/ml/dynamic-mp-llm/meta.py", line 167, in wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "/Users/justin/Documents/dev/personal/ml/dynamic-mp-llm/tests/test_adapt_decorator.py", line 100, in funkodunko
return items[5]
~~~~~^^^
IndexError: list index out of range
Human-readable summary:
(funkodunko) Attempted to access an element of a list that does not exist.
Suggestions for how to fix the error:
1. Check the length of the list to make sure there are enough elements to access the desired index.
2. If the list is too short, add elements to the list in order to access the desired index.
3. If the list is empty, consider initializing the list with data.

GenerativeMetaClass

GenerativeMetaClass is enables its metaclassed classes to apply generated functions at run-time.

frommodelimportGPT3fromgenerative.metaclassesimportGenerativeMetaClassfrompromptimportformat_generative_functionclassDoggo(metaclass=GenerativeMetaClass):
def__init__(self, name: str):
self.name=namedefset_treat(self, treat: str):
self.stomach=treatprompt="Write a function with the header `def do_trick(self)` that returns a string '*sit*'"prompt=format_generative_function(prompt)
new_trick=GPT3.generate(prompt)
a_good_boy=Doggo('Chewy')
a_good_boy.generate(new_trick)
a_good_boy.do_trick()
a_good_boy.set_treat('roast beef')

Check which functions are generative

importinspectall_funcs=inspect.getmembers(
cls, predicate=inspect.isfunction
)
[fforfinall_funcsiff._is_generative]

Database integration

Clients can integrate custom database solutions to save the generated code, function name, and, if available, arguments and keyword arguments. This could be useful in large pipelines for embedding generated code offline. At run-time cachced embedded code could later be retreived given a similar input.

importredisfromgenerative.functionsimportadaptfromgenerative.metaclassesimportAbstractDatabasefrommodelsimportLLMclassVectorDB(AbstractDatabase):
def__init__(self):
self.db=redis.Redis(host='localhost', port=6379, db=0)
defcontains(self, key: str) ->bool:
returnself.db.exists(key)
defget(self, query: str) ->List[Dict] :
returnself.db.get(query)
defset(self, key: str, data: Any) ->None:
# Implement custom versioning logic here# query database by function name# store data by versions e.g {func_name: {'version_1': data }}self.db.set(key, data)
classDemo():
db=VectorDB()
@adapt(model=LLM, critic=LLM, database=db)deffunc(self):
pass# functionality that requires adaptation

About

Self-modifying code at runtime with Large Language Models

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - ch3njust1n/smart: Self-modifying code at runtime with Large Language Models · GitHub
Skip to content

Repository files navigation

Self-Modification At RunTime (SMART): A Framework for Metaprogramming with Large Language Models for Adaptable and Autonomous Software



Tests

Setup instructions

  1. Create .env for your environment variables. See .env.example.
  2. Add your API key
  3. python setup.py install
  4. pre-commit install

To run all unit tests.

Options:

  • -s shows print statements
  • -v indicates when a tests passes
  • --durations=0 displays a list of n slowest tests at the end of the test session
pytest -s -v --durations=0

To run all tests in a specific file:

pytest <file name>

To run a specific unit test:

pytest -k <test name>
  1. Linting and VSCode

To setup linting with flake8 and auto formatting with black: 4.1. Create the subdirectory .vscode in the root directory 4.2. Add the following settings.json file:

{
"editor.formatOnSave": true,
"python.formatting.provider": "none",
"python.formatting.blackArgs": [
"--line-length",
"100"
],
"python.linting.enabled": true,
"python.linting.lintOnSave": true,
"python.linting.flake8Enabled": true,
"python.linting.flake8Args": [
"--line-length",
"100"
],
"[python]": {
"editor.codeActionsOnSave": {
"source.organizeImports": true
},
"editor.defaultFormatter": "ms-python.black-formatter"
}
}

Using the generative package

Setup

  1. OPENAI_API_KEY must be set in .env or in your terminal OPENAI_API_KEY=your-api-key-here
  2. Define your custome LLM solution. Then import the decorators and your llm function and pass it to the decorator.
  3. Use as follows:

Bring your own model

Create a custom model class with a generate() function that takes a prompt and returns a string.

All functionality in the generative package expects a model that inherits from the abstract class AbstractGenerativeModel. generate() must be marked with the @classmethod decorator.

fromgenerative.metaclassesimportAbstractGenerativeModelclassLLM(AbstractGenerativeModel):
@classmethoddefgenerate(self, prompt: str) ->str:
# Must implement generate()

Function decorators

@adapt decorator enables your model to control the behavior of the decorated function at run-time. The model could check for semantic errors and change based on input.

fromgenerative.decoratorimportadapt@adapt(model=LLM)deffunc(a, b):
prompt=""" Write a complete python 3 function, including the header and return statement that computes the N-th Fibonacci number. """assertfunc(8) ==21

@catch decorator enables your model to control the behavior of the decorated function at run-time only when an exception is thrown.

fromgenerative.decoratorimportcatch@catch(model=LLM)deffunc(a, b):
raiseException("Original function exception")

@stack_trace decorator augments stack traces with human-readable summaries and steps to debug or fix the issue.

fromgenerative.decoratorimportstack_trace@stack_trace(model=LLM)deffunkodunko():
items= [1, 2, 3]
returnitems[5]

Example output:

tests/test_adapt_decorator.py Traceback (most recent call last):
File "/Users/justin/Documents/dev/personal/ml/dynamic-mp-llm/meta.py", line 167, in wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "/Users/justin/Documents/dev/personal/ml/dynamic-mp-llm/tests/test_adapt_decorator.py", line 100, in funkodunko
return items[5]
~~~~~^^^
IndexError: list index out of range
Human-readable summary:
(funkodunko) Attempted to access an element of a list that does not exist.
Suggestions for how to fix the error:
1. Check the length of the list to make sure there are enough elements to access the desired index.
2. If the list is too short, add elements to the list in order to access the desired index.
3. If the list is empty, consider initializing the list with data.

GenerativeMetaClass

GenerativeMetaClass is enables its metaclassed classes to apply generated functions at run-time.

frommodelimportGPT3fromgenerative.metaclassesimportGenerativeMetaClassfrompromptimportformat_generative_functionclassDoggo(metaclass=GenerativeMetaClass):
def__init__(self, name: str):
self.name=namedefset_treat(self, treat: str):
self.stomach=treatprompt="Write a function with the header `def do_trick(self)` that returns a string '*sit*'"prompt=format_generative_function(prompt)
new_trick=GPT3.generate(prompt)
a_good_boy=Doggo('Chewy')
a_good_boy.generate(new_trick)
a_good_boy.do_trick()
a_good_boy.set_treat('roast beef')

Check which functions are generative

importinspectall_funcs=inspect.getmembers(
cls, predicate=inspect.isfunction
)
[fforfinall_funcsiff._is_generative]

Database integration

Clients can integrate custom database solutions to save the generated code, function name, and, if available, arguments and keyword arguments. This could be useful in large pipelines for embedding generated code offline. At run-time cachced embedded code could later be retreived given a similar input.

importredisfromgenerative.functionsimportadaptfromgenerative.metaclassesimportAbstractDatabasefrommodelsimportLLMclassVectorDB(AbstractDatabase):
def__init__(self):
self.db=redis.Redis(host='localhost', port=6379, db=0)
defcontains(self, key: str) ->bool:
returnself.db.exists(key)
defget(self, query: str) ->List[Dict] :
returnself.db.get(query)
defset(self, key: str, data: Any) ->None:
# Implement custom versioning logic here# query database by function name# store data by versions e.g {func_name: {'version_1': data }}self.db.set(key, data)
classDemo():
db=VectorDB()
@adapt(model=LLM, critic=LLM, database=db)deffunc(self):
pass# functionality that requires adaptation

About

Self-modifying code at runtime with Large Language Models

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - ch3njust1n/smart: Self-modifying code at runtime with Large Language Models · GitHub
Skip to content

Repository files navigation

Self-Modification At RunTime (SMART): A Framework for Metaprogramming with Large Language Models for Adaptable and Autonomous Software



Tests

Setup instructions

  1. Create .env for your environment variables. See .env.example.
  2. Add your API key
  3. python setup.py install
  4. pre-commit install

To run all unit tests.

Options:

  • -s shows print statements
  • -v indicates when a tests passes
  • --durations=0 displays a list of n slowest tests at the end of the test session
pytest -s -v --durations=0

To run all tests in a specific file:

pytest <file name>

To run a specific unit test:

pytest -k <test name>
  1. Linting and VSCode

To setup linting with flake8 and auto formatting with black: 4.1. Create the subdirectory .vscode in the root directory 4.2. Add the following settings.json file:

{
"editor.formatOnSave": true,
"python.formatting.provider": "none",
"python.formatting.blackArgs": [
"--line-length",
"100"
],
"python.linting.enabled": true,
"python.linting.lintOnSave": true,
"python.linting.flake8Enabled": true,
"python.linting.flake8Args": [
"--line-length",
"100"
],
"[python]": {
"editor.codeActionsOnSave": {
"source.organizeImports": true
},
"editor.defaultFormatter": "ms-python.black-formatter"
}
}

Using the generative package

Setup

  1. OPENAI_API_KEY must be set in .env or in your terminal OPENAI_API_KEY=your-api-key-here
  2. Define your custome LLM solution. Then import the decorators and your llm function and pass it to the decorator.
  3. Use as follows:

Bring your own model

Create a custom model class with a generate() function that takes a prompt and returns a string.

All functionality in the generative package expects a model that inherits from the abstract class AbstractGenerativeModel. generate() must be marked with the @classmethod decorator.

fromgenerative.metaclassesimportAbstractGenerativeModelclassLLM(AbstractGenerativeModel):
@classmethoddefgenerate(self, prompt: str) ->str:
# Must implement generate()

Function decorators

@adapt decorator enables your model to control the behavior of the decorated function at run-time. The model could check for semantic errors and change based on input.

fromgenerative.decoratorimportadapt@adapt(model=LLM)deffunc(a, b):
prompt=""" Write a complete python 3 function, including the header and return statement that computes the N-th Fibonacci number. """assertfunc(8) ==21

@catch decorator enables your model to control the behavior of the decorated function at run-time only when an exception is thrown.

fromgenerative.decoratorimportcatch@catch(model=LLM)deffunc(a, b):
raiseException("Original function exception")

@stack_trace decorator augments stack traces with human-readable summaries and steps to debug or fix the issue.

fromgenerative.decoratorimportstack_trace@stack_trace(model=LLM)deffunkodunko():
items= [1, 2, 3]
returnitems[5]

Example output:

tests/test_adapt_decorator.py Traceback (most recent call last):
File "/Users/justin/Documents/dev/personal/ml/dynamic-mp-llm/meta.py", line 167, in wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "/Users/justin/Documents/dev/personal/ml/dynamic-mp-llm/tests/test_adapt_decorator.py", line 100, in funkodunko
return items[5]
~~~~~^^^
IndexError: list index out of range
Human-readable summary:
(funkodunko) Attempted to access an element of a list that does not exist.
Suggestions for how to fix the error:
1. Check the length of the list to make sure there are enough elements to access the desired index.
2. If the list is too short, add elements to the list in order to access the desired index.
3. If the list is empty, consider initializing the list with data.

GenerativeMetaClass

GenerativeMetaClass is enables its metaclassed classes to apply generated functions at run-time.

frommodelimportGPT3fromgenerative.metaclassesimportGenerativeMetaClassfrompromptimportformat_generative_functionclassDoggo(metaclass=GenerativeMetaClass):
def__init__(self, name: str):
self.name=namedefset_treat(self, treat: str):
self.stomach=treatprompt="Write a function with the header `def do_trick(self)` that returns a string '*sit*'"prompt=format_generative_function(prompt)
new_trick=GPT3.generate(prompt)
a_good_boy=Doggo('Chewy')
a_good_boy.generate(new_trick)
a_good_boy.do_trick()
a_good_boy.set_treat('roast beef')

Check which functions are generative

importinspectall_funcs=inspect.getmembers(
cls, predicate=inspect.isfunction
)
[fforfinall_funcsiff._is_generative]

Database integration

Clients can integrate custom database solutions to save the generated code, function name, and, if available, arguments and keyword arguments. This could be useful in large pipelines for embedding generated code offline. At run-time cachced embedded code could later be retreived given a similar input.

importredisfromgenerative.functionsimportadaptfromgenerative.metaclassesimportAbstractDatabasefrommodelsimportLLMclassVectorDB(AbstractDatabase):
def__init__(self):
self.db=redis.Redis(host='localhost', port=6379, db=0)
defcontains(self, key: str) ->bool:
returnself.db.exists(key)
defget(self, query: str) ->List[Dict] :
returnself.db.get(query)
defset(self, key: str, data: Any) ->None:
# Implement custom versioning logic here# query database by function name# store data by versions e.g {func_name: {'version_1': data }}self.db.set(key, data)
classDemo():
db=VectorDB()
@adapt(model=LLM, critic=LLM, database=db)deffunc(self):
pass# functionality that requires adaptation

About

Self-modifying code at runtime with Large Language Models

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - ch3njust1n/smart: Self-modifying code at runtime with Large Language Models · GitHub
Skip to content

Repository files navigation

Self-Modification At RunTime (SMART): A Framework for Metaprogramming with Large Language Models for Adaptable and Autonomous Software



Tests

Setup instructions

  1. Create .env for your environment variables. See .env.example.
  2. Add your API key
  3. python setup.py install
  4. pre-commit install

To run all unit tests.

Options:

  • -s shows print statements
  • -v indicates when a tests passes
  • --durations=0 displays a list of n slowest tests at the end of the test session
pytest -s -v --durations=0

To run all tests in a specific file:

pytest <file name>

To run a specific unit test:

pytest -k <test name>
  1. Linting and VSCode

To setup linting with flake8 and auto formatting with black: 4.1. Create the subdirectory .vscode in the root directory 4.2. Add the following settings.json file:

{
"editor.formatOnSave": true,
"python.formatting.provider": "none",
"python.formatting.blackArgs": [
"--line-length",
"100"
],
"python.linting.enabled": true,
"python.linting.lintOnSave": true,
"python.linting.flake8Enabled": true,
"python.linting.flake8Args": [
"--line-length",
"100"
],
"[python]": {
"editor.codeActionsOnSave": {
"source.organizeImports": true
},
"editor.defaultFormatter": "ms-python.black-formatter"
}
}

Using the generative package

Setup

  1. OPENAI_API_KEY must be set in .env or in your terminal OPENAI_API_KEY=your-api-key-here
  2. Define your custome LLM solution. Then import the decorators and your llm function and pass it to the decorator.
  3. Use as follows:

Bring your own model

Create a custom model class with a generate() function that takes a prompt and returns a string.

All functionality in the generative package expects a model that inherits from the abstract class AbstractGenerativeModel. generate() must be marked with the @classmethod decorator.

fromgenerative.metaclassesimportAbstractGenerativeModelclassLLM(AbstractGenerativeModel):
@classmethoddefgenerate(self, prompt: str) ->str:
# Must implement generate()

Function decorators

@adapt decorator enables your model to control the behavior of the decorated function at run-time. The model could check for semantic errors and change based on input.

fromgenerative.decoratorimportadapt@adapt(model=LLM)deffunc(a, b):
prompt=""" Write a complete python 3 function, including the header and return statement that computes the N-th Fibonacci number. """assertfunc(8) ==21

@catch decorator enables your model to control the behavior of the decorated function at run-time only when an exception is thrown.

fromgenerative.decoratorimportcatch@catch(model=LLM)deffunc(a, b):
raiseException("Original function exception")

@stack_trace decorator augments stack traces with human-readable summaries and steps to debug or fix the issue.

fromgenerative.decoratorimportstack_trace@stack_trace(model=LLM)deffunkodunko():
items= [1, 2, 3]
returnitems[5]

Example output:

tests/test_adapt_decorator.py Traceback (most recent call last):
File "/Users/justin/Documents/dev/personal/ml/dynamic-mp-llm/meta.py", line 167, in wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "/Users/justin/Documents/dev/personal/ml/dynamic-mp-llm/tests/test_adapt_decorator.py", line 100, in funkodunko
return items[5]
~~~~~^^^
IndexError: list index out of range
Human-readable summary:
(funkodunko) Attempted to access an element of a list that does not exist.
Suggestions for how to fix the error:
1. Check the length of the list to make sure there are enough elements to access the desired index.
2. If the list is too short, add elements to the list in order to access the desired index.
3. If the list is empty, consider initializing the list with data.

GenerativeMetaClass

GenerativeMetaClass is enables its metaclassed classes to apply generated functions at run-time.

frommodelimportGPT3fromgenerative.metaclassesimportGenerativeMetaClassfrompromptimportformat_generative_functionclassDoggo(metaclass=GenerativeMetaClass):
def__init__(self, name: str):
self.name=namedefset_treat(self, treat: str):
self.stomach=treatprompt="Write a function with the header `def do_trick(self)` that returns a string '*sit*'"prompt=format_generative_function(prompt)
new_trick=GPT3.generate(prompt)
a_good_boy=Doggo('Chewy')
a_good_boy.generate(new_trick)
a_good_boy.do_trick()
a_good_boy.set_treat('roast beef')

Check which functions are generative

importinspectall_funcs=inspect.getmembers(
cls, predicate=inspect.isfunction
)
[fforfinall_funcsiff._is_generative]

Database integration

Clients can integrate custom database solutions to save the generated code, function name, and, if available, arguments and keyword arguments. This could be useful in large pipelines for embedding generated code offline. At run-time cachced embedded code could later be retreived given a similar input.

importredisfromgenerative.functionsimportadaptfromgenerative.metaclassesimportAbstractDatabasefrommodelsimportLLMclassVectorDB(AbstractDatabase):
def__init__(self):
self.db=redis.Redis(host='localhost', port=6379, db=0)
defcontains(self, key: str) ->bool:
returnself.db.exists(key)
defget(self, query: str) ->List[Dict] :
returnself.db.get(query)
defset(self, key: str, data: Any) ->None:
# Implement custom versioning logic here# query database by function name# store data by versions e.g {func_name: {'version_1': data }}self.db.set(key, data)
classDemo():
db=VectorDB()
@adapt(model=LLM, critic=LLM, database=db)deffunc(self):
pass# functionality that requires adaptation

About

Self-modifying code at runtime with Large Language Models

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - ch3njust1n/smart: Self-modifying code at runtime with Large Language Models · GitHub
Skip to content

Repository files navigation

Self-Modification At RunTime (SMART): A Framework for Metaprogramming with Large Language Models for Adaptable and Autonomous Software



Tests

Setup instructions

  1. Create .env for your environment variables. See .env.example.
  2. Add your API key
  3. python setup.py install
  4. pre-commit install

To run all unit tests.

Options:

  • -s shows print statements
  • -v indicates when a tests passes
  • --durations=0 displays a list of n slowest tests at the end of the test session
pytest -s -v --durations=0

To run all tests in a specific file:

pytest <file name>

To run a specific unit test:

pytest -k <test name>
  1. Linting and VSCode

To setup linting with flake8 and auto formatting with black: 4.1. Create the subdirectory .vscode in the root directory 4.2. Add the following settings.json file:

{
"editor.formatOnSave": true,
"python.formatting.provider": "none",
"python.formatting.blackArgs": [
"--line-length",
"100"
],
"python.linting.enabled": true,
"python.linting.lintOnSave": true,
"python.linting.flake8Enabled": true,
"python.linting.flake8Args": [
"--line-length",
"100"
],
"[python]": {
"editor.codeActionsOnSave": {
"source.organizeImports": true
},
"editor.defaultFormatter": "ms-python.black-formatter"
}
}

Using the generative package

Setup

  1. OPENAI_API_KEY must be set in .env or in your terminal OPENAI_API_KEY=your-api-key-here
  2. Define your custome LLM solution. Then import the decorators and your llm function and pass it to the decorator.
  3. Use as follows:

Bring your own model

Create a custom model class with a generate() function that takes a prompt and returns a string.

All functionality in the generative package expects a model that inherits from the abstract class AbstractGenerativeModel. generate() must be marked with the @classmethod decorator.

fromgenerative.metaclassesimportAbstractGenerativeModelclassLLM(AbstractGenerativeModel):
@classmethoddefgenerate(self, prompt: str) ->str:
# Must implement generate()

Function decorators

@adapt decorator enables your model to control the behavior of the decorated function at run-time. The model could check for semantic errors and change based on input.

fromgenerative.decoratorimportadapt@adapt(model=LLM)deffunc(a, b):
prompt=""" Write a complete python 3 function, including the header and return statement that computes the N-th Fibonacci number. """assertfunc(8) ==21

@catch decorator enables your model to control the behavior of the decorated function at run-time only when an exception is thrown.

fromgenerative.decoratorimportcatch@catch(model=LLM)deffunc(a, b):
raiseException("Original function exception")

@stack_trace decorator augments stack traces with human-readable summaries and steps to debug or fix the issue.

fromgenerative.decoratorimportstack_trace@stack_trace(model=LLM)deffunkodunko():
items= [1, 2, 3]
returnitems[5]

Example output:

tests/test_adapt_decorator.py Traceback (most recent call last):
File "/Users/justin/Documents/dev/personal/ml/dynamic-mp-llm/meta.py", line 167, in wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "/Users/justin/Documents/dev/personal/ml/dynamic-mp-llm/tests/test_adapt_decorator.py", line 100, in funkodunko
return items[5]
~~~~~^^^
IndexError: list index out of range
Human-readable summary:
(funkodunko) Attempted to access an element of a list that does not exist.
Suggestions for how to fix the error:
1. Check the length of the list to make sure there are enough elements to access the desired index.
2. If the list is too short, add elements to the list in order to access the desired index.
3. If the list is empty, consider initializing the list with data.

GenerativeMetaClass

GenerativeMetaClass is enables its metaclassed classes to apply generated functions at run-time.

frommodelimportGPT3fromgenerative.metaclassesimportGenerativeMetaClassfrompromptimportformat_generative_functionclassDoggo(metaclass=GenerativeMetaClass):
def__init__(self, name: str):
self.name=namedefset_treat(self, treat: str):
self.stomach=treatprompt="Write a function with the header `def do_trick(self)` that returns a string '*sit*'"prompt=format_generative_function(prompt)
new_trick=GPT3.generate(prompt)
a_good_boy=Doggo('Chewy')
a_good_boy.generate(new_trick)
a_good_boy.do_trick()
a_good_boy.set_treat('roast beef')

Check which functions are generative

importinspectall_funcs=inspect.getmembers(
cls, predicate=inspect.isfunction
)
[fforfinall_funcsiff._is_generative]

Database integration

Clients can integrate custom database solutions to save the generated code, function name, and, if available, arguments and keyword arguments. This could be useful in large pipelines for embedding generated code offline. At run-time cachced embedded code could later be retreived given a similar input.

importredisfromgenerative.functionsimportadaptfromgenerative.metaclassesimportAbstractDatabasefrommodelsimportLLMclassVectorDB(AbstractDatabase):
def__init__(self):
self.db=redis.Redis(host='localhost', port=6379, db=0)
defcontains(self, key: str) ->bool:
returnself.db.exists(key)
defget(self, query: str) ->List[Dict] :
returnself.db.get(query)
defset(self, key: str, data: Any) ->None:
# Implement custom versioning logic here# query database by function name# store data by versions e.g {func_name: {'version_1': data }}self.db.set(key, data)
classDemo():
db=VectorDB()
@adapt(model=LLM, critic=LLM, database=db)deffunc(self):
pass# functionality that requires adaptation

About

Self-modifying code at runtime with Large Language Models

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages