Files
e79d563fd4 Dev -> Master (#73)
* 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]>
2024-03-13 15:55:04 +01:00

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
# ),
# )