mirror of
https://github.com/Significant-Gravitas/AutoGPT-Code-Ability.git
synced 2026-11-10 08:01:27 -10:00
## **User description**
Changes:
* Hint the UI page generation with its connection to another pages.
* Add validation on the page connection prompting
* Cleaner auto import on missing function and missing object (remove wildcard, import only the missing part). on missing object we try to find the related function and import the file that hosts that function (only support the object type referred by the ApiRouteSpec, it can still be improved).
Out of scope:
* Validation of ui.link and page connection (if LLM hallucinate the page on `ui.link`, we are not failing this yet!)
___
## **Type**
Enhancement, Bug fix
___
## **Description**
- Enhanced code validation to include checks for `ui.link` usage and ensure it references valid functions.
- Improved import handling in `__fix_missing_imports` by adding async fetching of functions related to object types and better error message integration.
- Added a new database function `get_object_type_referred_functions` to fetch functions related to an object type.
- Updated `PageDecompositionEntry` to use a dictionary for `used_functions` to include descriptions, and added `PageConnection` model for describing connections between pages.
- Enhanced validation in `PageDecompositionBlock` to include checks for main function naming, existence of a home page, and valid page connections.
- Updated Jinja2 template example to reflect new features in page decomposition, including detailed function usage and page connections.
___
## **Changes walkthrough**
<table><thead><tr><th></th><th align="left">Relevant files</th></tr></thead><tbody><tr><td><strong>Enhancement
</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>code_validation.py</strong><dd><code>Enhance Code Validation and Import Handling</code> </dd></summary>
<hr>
codex/develop/code_validation.py
<li>Added validation for <code>ui.link</code> usage in function code to ensure it <br>references valid functions.<br> <li> Enhanced the <code>__fix_missing_imports</code> function to handle missing imports <br>more accurately, including async fetching of functions related to <br>object types.<br> <li> Improved error handling by appending problematic lines to error <br>messages.<br>
</details>
</td>
<td><a href="https://github.com/Significant-Gravitas/codex/pull/263/files#diff-deae541000e158a1fc146c31004d52ed52a858802dd058803d920d97477071d6">+35/-10</a> </td>
</tr>
<tr>
<td>
<details>
<summary><strong>database.py</strong><dd><code>Add Database Function for Object Type Function Fetching</code> </dd></summary>
<hr>
codex/develop/database.py
<li>Added a new function <code>get_object_type_referred_functions</code> to fetch <br>functions related to an object type.<br>
</details>
</td>
<td><a href="https://github.com/Significant-Gravitas/codex/pull/263/files#diff-61c5f5198f842fcc472b6b31ee2e5a53eac489a88152cbc792895f1f9d60f694">+23/-1</a> </td>
</tr>
<tr>
<td>
<details>
<summary><strong>ai_page_decompose.py</strong><dd><code>Enhance Page Decomposition with Detailed Function Usage and Page </code><br><code>Connections</code></dd></summary>
<hr>
codex/requirements/blocks/ai_page_decompose.py
<li>Updated <code>PageDecompositionEntry</code> to use a dictionary for <code>used_functions</code> <br>to include descriptions.<br> <li> Added <code>PageConnection</code> model to describe connections between pages.<br> <li> Enhanced validation in <code>PageDecompositionBlock</code> to include checks for <br>main function naming, existence of a home page, and valid page <br>connections.<br>
</details>
</td>
<td><a href="https://github.com/Significant-Gravitas/codex/pull/263/files#diff-0539cf8ae85457e8d87308e181529144d8f564ad2453eabecc509b4f02c4abe2">+55/-9</a> </td>
</tr>
</table></td></tr><tr><td><strong>Documentation
</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>system.j2</strong><dd><code>Update Example to Demonstrate Enhanced Page Decomposition Features</code></dd></summary>
<hr>
codex/prompts/gpt-4-turbo/requirements/page_decompose/system.j2
<li>Modified the example to reflect changes in the <code>PageDecompositionEntry</code> <br>model using a dictionary for <code>used_functions</code>.<br> <li> Added <code>connections</code> field to demonstrate inter-page linking in the <br>example.<br>
</details>
</td>
<td><a href="https://github.com/Significant-Gravitas/codex/pull/263/files#diff-c081d45d8aa12144bab35cca95d5b45f35e7a380a84e71632b1d425d9a712f6c">+26/-11</a> </td>
</tr>
</table></td></tr></tr></tbody></table>
___
> ✨ **PR-Agent usage**:
>Comment `/help` on the PR to get a list of all available PR-Agent tools and their descriptions
---------
Co-authored-by: majdyz <[email protected]>
114 lines
3.2 KiB
Python
114 lines
3.2 KiB
Python
"""
|
|
Function Helper Functions
|
|
"""
|
|
|
|
import logging
|
|
|
|
from prisma.enums import FunctionState
|
|
from prisma.models import ObjectType
|
|
from prisma.types import FunctionCreateInput, ObjectFieldCreateInput
|
|
|
|
from codex.common.model import (
|
|
FunctionDef,
|
|
ObjectTypeModel,
|
|
get_related_types,
|
|
normalize_type,
|
|
)
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
async def construct_function(
|
|
function: FunctionDef, available_types: dict[str, ObjectType]
|
|
) -> FunctionCreateInput:
|
|
if not function.function_template:
|
|
raise ValueError("Function template is required")
|
|
|
|
input = FunctionCreateInput(
|
|
functionName=function.name,
|
|
template=function.function_template or "",
|
|
description=function.function_desc,
|
|
state=FunctionState.WRITTEN
|
|
if function.is_implemented
|
|
else FunctionState.DEFINITION,
|
|
rawCode=function.function_code,
|
|
functionCode=function.function_code,
|
|
)
|
|
|
|
if function.return_type:
|
|
field = ObjectFieldCreateInput(
|
|
name="return",
|
|
description=function.return_desc,
|
|
typeName=normalize_type(function.return_type),
|
|
RelatedTypes={
|
|
"connect": [
|
|
{"id": type.id}
|
|
for type in get_related_types(function.return_type, available_types)
|
|
]
|
|
},
|
|
)
|
|
input["FunctionReturn"] = {"create": field}
|
|
|
|
if function.arg_types:
|
|
fields = [
|
|
ObjectFieldCreateInput(
|
|
name=name,
|
|
description=function.arg_descs.get(name, "-"),
|
|
typeName=normalize_type(type),
|
|
RelatedTypes={
|
|
"connect": [
|
|
{"id": type.id}
|
|
for type in get_related_types(type, available_types)
|
|
]
|
|
},
|
|
)
|
|
for name, type in function.arg_types
|
|
]
|
|
input["FunctionArgs"] = {"create": fields} # type: ignore
|
|
|
|
return input
|
|
|
|
|
|
def generate_object_code(obj: ObjectTypeModel) -> str:
|
|
if not obj.name:
|
|
return "" # Avoid generating an empty object
|
|
|
|
# Auto-generate a template for the object, this will not capture any class functions.
|
|
fields = f"\n{' ' * 4}".join(
|
|
[
|
|
f"{field.name}: {field.type} "
|
|
f"{('= '+field.value) if field.value else ''} "
|
|
f"{('# '+field.description) if field.description else ''}"
|
|
for field in obj.Fields or []
|
|
]
|
|
)
|
|
|
|
parent_class = ""
|
|
if obj.is_enum:
|
|
parent_class = "Enum"
|
|
elif obj.is_pydantic:
|
|
parent_class = "BaseModel"
|
|
|
|
doc_string = (
|
|
f"""\"\"\"
|
|
{obj.description}
|
|
\"\"\""""
|
|
if obj.description
|
|
else ""
|
|
)
|
|
|
|
method_body = ("\n" + " " * 4).join(obj.code.split("\n")) + "\n" if obj.code else ""
|
|
|
|
template = f"""
|
|
class {obj.name}({parent_class}):
|
|
{doc_string if doc_string else ""}
|
|
{fields if fields else ""}
|
|
{method_body if method_body else ""}
|
|
{"pass" if not fields and not method_body else ""}
|
|
"""
|
|
return "\n".join(line for line in template.split("\n")).strip()
|
|
|
|
|
|
def generate_object_template(obj: ObjectType) -> str:
|
|
return generate_object_code(ObjectTypeModel(db_obj=obj))
|