mirror of
https://github.com/Significant-Gravitas/AutoGPT-Code-Ability.git
synced 2026-11-09 23:51:28 -10:00
* Route schema changes * Delete ruff.config.json * save current changes * style fixes by ruff * Add class parsing capability * Fix bugs * Address comments * Fix benchmarks * Fix benchmarks * Fix benchmarks * Add comments * fixing types * Add error handling and status messages for application creation * Refactor fetch_deliverable function and update application creation status * Refactor benchmark output formatting * Remove unnecessary print statement in fetch_deliverable function * Propagate DB schema changes: Function <-> CompiledRouteSpec (#65) Propagate DB schema changes: Function <-> CompiledRouteSpec (#65) --------- Co-authored-by: majdyz <[email protected]> Co-authored-by: Swifty <[email protected]> Co-authored-by: majdyz <[email protected]> * emoved broken hardcoded requirements * Add benchmarking functionality * Update branch restrictions in GitHub workflows * Add pytest-cov to dependencies * Update ruff formatter command to include --check option * Update workflow names * Refactor code formatting and fix indentation issues * Update Python dependency caching and installation process * Add Prisma client generation step to CI workflow * Refactor test_process_object_type to use async/await * Add pytest and ValidationError imports, update arg_types assertion, and add test for ValidationError * Remove unused imports and commented code * Add logger to OpenAIChatClient class * Add async context manager for database connection and disconnection * Add blank line for readability * Refactor function_def.arg_types assignment in ast_test.py * mark integration tests * Update test workflow name * Add OpenAI API key configuration * Better Types for Requirements Request/Response (#76) Better Types for Requirements Request/Response --------- Co-authored-by: majdyz <[email protected]> * [AGPT-474] End-to-end Benchmark (#77) * Remove unnecessary fetch_deliverable calls and update invoice_generator_requirements * Fix typo in hardcoded.py * Add missing app IDs and interview IDs for calendar booking, inventory management, and invoicing systems * Add options to benchmark and example commands * Refactor benchmarking code and add new functions * Add task description method to ExampleTask enum * Added end-to-end running * Add hardcoded flag to filter examples in benchmark.py * Refactor run_benchmark_example function to handle exceptions * Fix error handling in specification routes * Fix Function generation bug on nested object type (#79) Co-authored-by: majdyz <[email protected]> * Speeding up requirements system --------- Co-authored-by: Zamil Majdy <[email protected]> Co-authored-by: majdyz <[email protected]> * Refactor code: Remove unused imports and clean up formatting * [AGPT-478] Add Support for Composite Type with multiple Pydantic/nont-primitive classes (#78) * [AGPT-478] Add support for multiple composite Pydantic objects * Ruff Ruff! * Fix failing test * formatting * fix populate-db command * fix run all benchmarks --------- Co-authored-by: majdyz <[email protected]> Co-authored-by: Swifty <[email protected]> * Refactor package handling in packager.py (#81) * [Fix] User provided app name being replaced (#82) * Only make databases when required (#83) * feat: make the name match * feat: database becomes optional * Update agent.py * Integrate related types into the requirements system (#84) * feat: make the name match * feat: database becomes optional * feat: initial model changes * feat: add prompts * feat: more prompts * fix: nits * fix: wrong type 😢 * feat: improved prompts * Cleanup for field type (#85) Co-authored-by: majdyz <[email protected]> * [AGPT-489] Improve type composite-type matching & extracting algorithm (#86) Co-authored-by: majdyz <[email protected]> * [AGPT-489] Add Autogeneration of Typing import (#87) Co-authored-by: majdyz <[email protected]> * [AGPT-489] Fix broken class compiling logic (#88) Co-authored-by: majdyz <[email protected]> * [AGPT-489] Fix function fetching to always include RelatedTypes (#89) [AGPT-489] Fix function fetching to always include RelatedTypes --------- Co-authored-by: majdyz <[email protected]> * fix lock file * feat: endpoint updates (#95) * feat: endpoint updates * fix: ambiguous param * [AGPT-486] Fix codegen generate code with missing pydantic object (#92) Co-authored-by: majdyz <[email protected]> * Fix retry prompt (#96) Co-authored-by: majdyz <[email protected]> * Allow benchmark on $PORT (#98) * Ntindle/agpt 506 add a bit of debug tooling for requirements gen (#100) * [AGPT-485] Fix missing pydantic object during requirement-step; leading to LLM to guess wrong signature (#97) [AGPT-485] Fix missing pydantic object during requirement-step; leading to LLM to guess wrong signature --------- Co-authored-by: majdyz <[email protected]> * [AGPT-157] Add Database Integration Generation (#90) * Added prisma client to server code * Add DatabaseSchema to INCLUDE_FUNC * Update functions to be async and add database schema documentation * Add DatabaseSchema and DatabaseTables to ApiRouteSpec * Updated dev prompts for db * Update profile management descriptions * Update route function definition to be async * Remove logging of database schema * Add Prisma schema file generation * Refactor benchmark and agent modules * Refactor code and comment out debug statements * formatting * Add available_functions to develop_route * Update prisma import and method calls * loading all related tables * Refactor create_prisma_scheama_file function to handle cases with no database schema * Fix async function call in packager.py * Fix database table query in packager.py * Fix database access and unnecessary imports * review comments * [AGPT-508] Enum support for Codex - Generation Logic Layer (#102) Co-authored-by: majdyz <[email protected]> * Add Enum Generation to Requriements (#101) * Added prisma client to server code * Add DatabaseSchema to INCLUDE_FUNC * Update functions to be async and add database schema documentation * Add DatabaseSchema and DatabaseTables to ApiRouteSpec * Updated dev prompts for db * Update profile management descriptions * Update route function definition to be async * Remove logging of database schema * Add Prisma schema file generation * Refactor benchmark and agent modules * Refactor code and comment out debug statements * formatting * Add available_functions to develop_route * Update prisma import and method calls * loading all related tables * Refactor create_prisma_scheama_file function to handle cases with no database schema * Fix async function call in packager.py * Fix database table query in packager.py * Fix database access and unnecessary imports * feat: add enums to the database gen * fix: formatting * Updated to new schema * update hardcoded requirements * fix: objectType generation without type bool * Add database enum import statement * removed unused var as failing lint check --------- Co-authored-by: SwiftyOS <[email protected]> * More Linting Issues Fixes (#99) * fix: more linting issues * Remove error log for async functions * Fix return_type default value in FunctionDef class * Added another validation check --------- Co-authored-by: Swifty <[email protected]> * [AGPT-463] Add code generation validation using Ruff (#103) --------- Co-authored-by: majdyz <[email protected]> --------- Co-authored-by: majdyz <[email protected]> Co-authored-by: majdyz <[email protected]> Co-authored-by: Zamil Majdy <[email protected]> Co-authored-by: Nicholas Tindle <[email protected]>
207 lines
6.1 KiB
Python
207 lines
6.1 KiB
Python
from prisma.models import Interview, Question
|
|
from prisma.types import InterviewCreateInput
|
|
|
|
from codex.api_model import Identifiers
|
|
from codex.interview.model import (
|
|
InterviewDBBase,
|
|
InterviewMessageOptionalId,
|
|
InterviewMessageWithResponse,
|
|
)
|
|
|
|
|
|
async def create_interview(ids: Identifiers, interview: InterviewDBBase) -> Interview:
|
|
if not ids.user_id:
|
|
raise ValueError("User ID is required to create an interview")
|
|
if not ids.app_id:
|
|
raise ValueError("App ID is required to create an interview")
|
|
|
|
data = InterviewCreateInput(
|
|
applicationId=ids.app_id,
|
|
userId=ids.user_id,
|
|
task=interview.project_description,
|
|
name=interview.app_name,
|
|
finished=interview.finished,
|
|
Questions={
|
|
"create": [
|
|
{
|
|
"question": q.content,
|
|
"tool": q.tool,
|
|
}
|
|
for q in interview.questions
|
|
]
|
|
},
|
|
)
|
|
new_interview = await Interview.prisma().create(
|
|
data=data,
|
|
include={"Questions": True},
|
|
)
|
|
return new_interview
|
|
|
|
|
|
async def _create_interview_testing_only(
|
|
ids: Identifiers, interview: InterviewDBBase, id: str
|
|
) -> Interview:
|
|
if not ids.user_id:
|
|
raise ValueError("User ID is required to create an interview")
|
|
if not ids.app_id:
|
|
raise ValueError("App ID is required to create an interview")
|
|
data = InterviewCreateInput(
|
|
id=id,
|
|
applicationId=ids.app_id,
|
|
userId=ids.user_id,
|
|
task=interview.project_description,
|
|
name=interview.app_name,
|
|
finished=interview.finished,
|
|
Questions={
|
|
"create": [
|
|
{
|
|
"question": q.content,
|
|
"tool": q.tool,
|
|
}
|
|
for q in interview.questions
|
|
]
|
|
},
|
|
)
|
|
new_interview = await Interview.prisma().create(
|
|
data=data,
|
|
include={"Questions": True},
|
|
)
|
|
return new_interview
|
|
|
|
|
|
async def answer_questions(
|
|
interview_id: str, answers: list[InterviewMessageWithResponse]
|
|
) -> Interview:
|
|
for a in answers:
|
|
await Question.prisma().find_unique_or_raise(
|
|
where={"id": a.id, "interviewId": interview_id}
|
|
)
|
|
await Question.prisma().update(
|
|
where={"id": a.id},
|
|
data={
|
|
"answer": a.response,
|
|
},
|
|
)
|
|
interview = await Interview.prisma().find_unique_or_raise(
|
|
where={"id": interview_id}, include={"Questions": True}
|
|
)
|
|
return interview
|
|
|
|
|
|
async def add_questions(
|
|
interview_id: str, questions: list[InterviewMessageOptionalId]
|
|
) -> Interview:
|
|
await Interview.prisma().find_unique_or_raise(
|
|
where={"id": interview_id}, include={"Questions": True}
|
|
)
|
|
# add questions
|
|
for q in questions:
|
|
await Question.prisma().create(
|
|
data={
|
|
"interviewId": interview_id,
|
|
"question": q.content,
|
|
"tool": q.tool,
|
|
}
|
|
)
|
|
# logger.debug(f"Added question {question.id} to interview {interview_id}")
|
|
|
|
new_interview = await Interview.prisma().find_unique_or_raise(
|
|
where={"id": interview_id}, include={"Questions": True}
|
|
)
|
|
return new_interview
|
|
|
|
|
|
async def finsh_interview(
|
|
interview_id: str, finished_content: str, finished_text: str
|
|
) -> Interview:
|
|
await Interview.prisma().find_unique_or_raise(
|
|
where={"id": interview_id}, include={"Questions": True}
|
|
)
|
|
updated_interview = await Interview.prisma().update(
|
|
where={"id": interview_id},
|
|
data={
|
|
"finished": True,
|
|
"Questions": {
|
|
"create": [
|
|
{
|
|
"question": finished_content,
|
|
"answer": finished_text,
|
|
"tool": "finished",
|
|
}
|
|
]
|
|
},
|
|
},
|
|
)
|
|
if not updated_interview:
|
|
raise ValueError(f"Interview {interview_id} not found")
|
|
return updated_interview
|
|
|
|
|
|
# async def update_interview(interview_id: str, interview: InterviewDBBase) -> Interview:
|
|
# updated_interview = await Interview.prisma().update(
|
|
# where={"id": interview_id},
|
|
# data={
|
|
# "description": interview.project_description,
|
|
# "name": interview.app_name,
|
|
# },
|
|
# )
|
|
# return updated_interview
|
|
|
|
|
|
async def get_interview(user_id: str, app_id: str, interview_id: str) -> Interview:
|
|
interview = await Interview.prisma().find_first_or_raise(
|
|
where={
|
|
"id": interview_id,
|
|
"userId": user_id,
|
|
"applicationId": app_id,
|
|
},
|
|
include={"Questions": True},
|
|
)
|
|
|
|
return interview
|
|
|
|
|
|
async def delete_interview(interview_id: str) -> None:
|
|
await Interview.prisma().update(
|
|
where={"id": interview_id},
|
|
data={"deleted": True},
|
|
)
|
|
|
|
|
|
# async def list_interviews(
|
|
# user_id: str, app_id: str, page: int, page_size: int
|
|
# ) -> InterviewsListResponse:
|
|
# skip = (page - 1) * page_size
|
|
# total_items = await Interview.prisma().count(
|
|
# where={"userId": user_id, "applicationId": app_id, "deleted": False}
|
|
# )
|
|
# if total_items > 0:
|
|
# interviews = await Interview.prisma().find_many(
|
|
# where={"userId": user_id, "applicationId": app_id, "deleted": False},
|
|
# include={},
|
|
# skip=skip,
|
|
# take=page_size,
|
|
# )
|
|
|
|
# total_pages = (total_items + page_size - 1) // page_size
|
|
|
|
# # interviews_response = [
|
|
# # SpecificationResponse.from_specification(spec) for spec in specs
|
|
# # ]
|
|
|
|
# pagination = Pagination(
|
|
# total_items=total_items,
|
|
# total_pages=total_pages,
|
|
# current_page=page,
|
|
# page_size=page_size,
|
|
# )
|
|
|
|
# return InterviewsListResponse(specs=interviews_response, pagination=pagination)
|
|
# else:
|
|
# return InterviewsListResponse(
|
|
# specs=[],
|
|
# pagination=Pagination(
|
|
# total_items=0, total_pages=0, current_page=0, page_size=0
|
|
# ),
|
|
# )
|