diff --git a/.github/workflows/gcr-deploy.yml b/.github/workflows/gcr-deploy.yml
index ec34515..e6519f6 100644
--- a/.github/workflows/gcr-deploy.yml
+++ b/.github/workflows/gcr-deploy.yml
@@ -100,6 +100,9 @@ jobs:
MONGO_DATABASE=${{ vars.MONGO_DATABASE }}
DATABASE_URL=${{ secrets.DATABASE_URL }}
JWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }}
+ GOOGLE_CLIENT_ID=${{ secrets.GOOGLE_CLIENT_ID }}
+ GOOGLE_CLIENT_SECRET=${{ secrets.GOOGLE_CLIENT_SECRET }}
+ STARLETTE_SESSION_SECRET=${{ secrets.STARLETTE_SESSION_SECRET }}
GITHUB_SHA=${{ github.sha }}
GITHUB_ENV=${{ env.GITHUB_ENV }}
# TODO: JWT_SECRET_KEY and DATABASE_URL should be passed as secret b/c it's exposed in gcloud run logs
diff --git a/CNAME b/CNAME
new file mode 100644
index 0000000..eef80c1
--- /dev/null
+++ b/CNAME
@@ -0,0 +1 @@
+www.prompton.ai
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index 0ad25db..fc6c5a3 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,661 +1,21 @@
- GNU AFFERO GENERAL PUBLIC LICENSE
- Version 3, 19 November 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc.
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU Affero General Public License is a free, copyleft license for
-software and other kinds of works, specifically designed to ensure
-cooperation with the community in the case of network server software.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-our General Public Licenses are intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- Developers that use our General Public Licenses protect your rights
-with two steps: (1) assert copyright on the software, and (2) offer
-you this License which gives you legal permission to copy, distribute
-and/or modify the software.
-
- A secondary benefit of defending all users' freedom is that
-improvements made in alternate versions of the program, if they
-receive widespread use, become available for other developers to
-incorporate. Many developers of free software are heartened and
-encouraged by the resulting cooperation. However, in the case of
-software used on network servers, this result may fail to come about.
-The GNU General Public License permits making a modified version and
-letting the public access it on a server without ever releasing its
-source code to the public.
-
- The GNU Affero General Public License is designed specifically to
-ensure that, in such cases, the modified source code becomes available
-to the community. It requires the operator of a network server to
-provide the source code of the modified version running there to the
-users of that server. Therefore, public use of a modified version, on
-a publicly accessible server, gives the public access to the source
-code of the modified version.
-
- An older license, called the Affero General Public License and
-published by Affero, was designed to accomplish similar goals. This is
-a different license, not a version of the Affero GPL, but Affero has
-released a new version of the Affero GPL which permits relicensing under
-this license.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU Affero General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Remote Network Interaction; Use with the GNU General Public License.
-
- Notwithstanding any other provision of this License, if you modify the
-Program, your modified version must prominently offer all users
-interacting with it remotely through a computer network (if your version
-supports such interaction) an opportunity to receive the Corresponding
-Source of your version by providing access to the Corresponding Source
-from a network server at no charge, through some standard or customary
-means of facilitating copying of software. This Corresponding Source
-shall include the Corresponding Source for any work covered by version 3
-of the GNU General Public License that is incorporated pursuant to the
-following paragraph.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the work with which it is combined will remain governed by version
-3 of the GNU General Public License.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU Affero General Public License from time to time. Such new versions
-will be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU Affero General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU Affero General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU Affero General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-
- Copyright (C)
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-
-Also add information on how to contact you by electronic and paper mail.
-
- If your software can interact with users remotely through a computer
-network, you should also make sure that it provides a way for users to
-get its source. For example, if your program is a web application, its
-interface could display a "Source" link that leads users to an archive
-of the code. There are many ways you could offer source, and different
-solutions will be better for different programs; see section 13 for the
-specific requirements.
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU AGPL, see
-.
+MIT License
+
+Copyright (c) 2022 Peter Petrovics
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
index 78a6c68..8a609a8 100644
--- a/README.md
+++ b/README.md
@@ -31,30 +31,37 @@ PromptOn helps you to:
It's a REST API microservice designed to mix it into your existing ecosystem in a non intrusive way.
+_The API is still in alpha, may change without notice. However, the schema is largely stable and it will soon enter production when proper versioning will be introduced._
+
## Getting started
- ### Endpoint UI & docs
+### Endpoint UI & docs
+
The easiest way to try is via the [Prompton API documentation UI](https://staging.api.prompton.ai) on our hosted staging environment.
There is no public signup currently but drop an email for early access:
- ### Client SDKs
+### Client SDKs
- #### Python
+#### Python
```sh
pip install prompton
```
- Basic [Streamlit UI example](./ui-examples/streamlit/main.py)
+ [Streamlit UI example](https://github.com/PromptOn/ui-example-streamlit)
- #### Typescript
-
- Package is not published yet but you can try it from [clients folder in the repo](./clients/fern/api/node_sdk/prompton)
-
- To install local dev env: [Local setup](#local_dev_setup)
+#### Typescript
+
+ ```sh
+ npm install prompton
+ ```
+
+ [Typescript Node example repo](https://github.com/PromptOn/client-example-type-script-node)
-The API is still in alpha, may change without notice. However, the schema is largely stable and it will soon enter production when proper versioning will be introduced.
+### Local dev setup
+
+ To install local dev env: [Local setup](#local_dev_setup)
## End-to-end example
@@ -83,7 +90,6 @@ The API is still in alpha, may change without notice. However, the schema is lar
```
TIP: if you just want to play around then set `openai_api_key` to any string and [mock responses](#mock_response_tip)
- TIP: if you just want to play around then set `openai_api_key` to any string and [mock responses](#mock_response_tip)
1. Prompt
@@ -118,23 +124,18 @@ The API is still in alpha, may change without notice. However, the schema is lar
```json
{
- "prompt_version_id": "",
- "end_user_id": "your_end_user_id_for_linking",
- "source": "swaggerdocs",
+ "prompt_version_id": "", // or prompt_id and it will pick one of the Live prompt versions
+ "end_user_id": "your_end_user_id_for_linking", // optional, passed on to provider
"template_args": {"words_limit": "10", "what": "crazy"}
}
```
It will:
-
1. Populate the template with the passed values
2. Log the request
3. Send the request to provider
- 4. Log respnse and send it back to client.
- 2. Log the request
- 3. Send the request to provider
- 4. Log respnse and send it back to client.
+ 4. Log response and send it back to client.
It also handles errors, timeouts and updates the inference accordingly. It will still process response if client disconnects before it arrives.
@@ -280,4 +281,4 @@ just test-quick # if you want to cut a few secs by skipping slower tests (passwo
## Licence
-This project is licensed under the GNU Affero General Public License v3.0 license - see the [LICENSE](LICENSE) file for details.
+MIT - see the [LICENSE](LICENSE) file for details.
diff --git a/clients/fern/api/generators.yml b/clients/fern/api/generators.yml
index 2dc9fec..1e869a4 100644
--- a/clients/fern/api/generators.yml
+++ b/clients/fern/api/generators.yml
@@ -2,12 +2,14 @@ default-group: local
groups:
local:
generators:
+ # Check for newer versions: https://github.com/fern-api/fern-typescript
- name: fernapi/fern-typescript-node-sdk
- version: 0.6.1
+ version: 0.7.1
output:
location: local-file-system
path: node_sdk/prompton
+ # Check for newer versions: https://github.com/fern-api/fern-python
- name: fernapi/fern-python-sdk
version: 0.3.7
output:
diff --git a/clients/fern/api/node_sdk/README.md b/clients/fern/api/node_sdk/README.md
new file mode 100644
index 0000000..d6ebea9
--- /dev/null
+++ b/clients/fern/api/node_sdk/README.md
@@ -0,0 +1,3 @@
+# PromptOn API - Node Typescript client
+
+See more on [PromptOn GitHub](https://github.com/PromptOn/prompton)
diff --git a/clients/fern/api/node_sdk/justfile b/clients/fern/api/node_sdk/justfile
new file mode 100644
index 0000000..51934f0
--- /dev/null
+++ b/clients/fern/api/node_sdk/justfile
@@ -0,0 +1,23 @@
+# Node SDK buld & deploy scripts
+default:
+ just --list
+
+set dotenv-load
+set positional-arguments
+
+
+build *params='':
+ npm pack
+
+npm-info *params='':
+ npm config list
+
+
+# to PyPi - set NPM_ACCESS_TOKEN in your .env
+publish *params='':
+ npm config set //registry.npmjs.org/:_authToken $NPM_ACCESS_TOKEN
+ npm publish $@
+
+build-publish:
+ just build
+ just publish # npm packs no need separetly with npm publish
\ No newline at end of file
diff --git a/clients/fern/api/node_sdk/package-lock.json b/clients/fern/api/node_sdk/package-lock.json
new file mode 100644
index 0000000..bd33e40
--- /dev/null
+++ b/clients/fern/api/node_sdk/package-lock.json
@@ -0,0 +1,131 @@
+{
+ "name": "@prompton/prompton-sdk",
+ "version": "0.0.7",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "@prompton/prompton-sdk",
+ "version": "0.0.7",
+ "license": "AGPL-3.0-only",
+ "dependencies": {
+ "@types/url-join": "4.0.1",
+ "@ungap/url-search-params": "0.2.2",
+ "axios": "1.4.0",
+ "form-data": "4.0.0",
+ "js-base64": "3.7.5",
+ "url-join": "4.0.1"
+ }
+ },
+ "node_modules/@types/url-join": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@types/url-join/-/url-join-4.0.1.tgz",
+ "integrity": "sha512-wDXw9LEEUHyV+7UWy7U315nrJGJ7p1BzaCxDpEoLr789Dk1WDVMMlf3iBfbG2F8NdWnYyFbtTxUn2ZNbm1Q4LQ=="
+ },
+ "node_modules/@ungap/url-search-params": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@ungap/url-search-params/-/url-search-params-0.2.2.tgz",
+ "integrity": "sha512-qQsguKXZVKdCixOHX9jqnX/K/1HekPDpGKyEcXHT+zR6EjGA7S4boSuelL4uuPv6YfhN0n8c4UxW+v/Z3gM2iw=="
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/axios": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz",
+ "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==",
+ "dependencies": {
+ "follow-redirects": "^1.15.0",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.2",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+ "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/js-base64": {
+ "version": "3.7.5",
+ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.5.tgz",
+ "integrity": "sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA=="
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
+ "node_modules/url-join": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz",
+ "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA=="
+ }
+ }
+}
diff --git a/clients/fern/api/node_sdk/package.json b/clients/fern/api/node_sdk/package.json
new file mode 100644
index 0000000..9feb32b
--- /dev/null
+++ b/clients/fern/api/node_sdk/package.json
@@ -0,0 +1,38 @@
+{
+ "name": "@prompton/prompton-sdk",
+ "version": "0.0.10",
+ "description": "Chat prompt template evaluation and inference monitoring",
+ "private": false,
+ "publishConfig": {
+ "registry": "https://registry.npmjs.org/",
+ "access": "public"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/PromptOn/prompton.git",
+ "directory": "clients/fern/api/node_sdk"
+ },
+ "main": "./prompton/index.js",
+ "types": "./prompton/index.d.ts",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [
+ "openai",
+ "chat",
+ "prompts",
+ "chatgpt",
+ "gpt",
+ "prompt"
+ ],
+ "author": "PromptOn",
+ "dependencies": {
+ "@ungap/url-search-params": "0.2.2",
+ "axios": "1.4.0",
+ "form-data": "4.0.0",
+ "url-join": "4.0.1",
+ "@types/url-join": "4.0.1",
+ "js-base64": "3.7.5"
+ },
+ "license": "AGPL-3.0-only"
+}
\ No newline at end of file
diff --git a/clients/fern/api/node_sdk/prompton-prompton-0.0.5.tgz b/clients/fern/api/node_sdk/prompton-prompton-0.0.5.tgz
new file mode 100644
index 0000000..332fb16
Binary files /dev/null and b/clients/fern/api/node_sdk/prompton-prompton-0.0.5.tgz differ
diff --git a/clients/fern/api/node_sdk/prompton-prompton-sdk-0.0.10.tgz b/clients/fern/api/node_sdk/prompton-prompton-sdk-0.0.10.tgz
new file mode 100644
index 0000000..e824939
Binary files /dev/null and b/clients/fern/api/node_sdk/prompton-prompton-sdk-0.0.10.tgz differ
diff --git a/clients/fern/api/node_sdk/prompton-prompton-sdk-0.0.6.tgz b/clients/fern/api/node_sdk/prompton-prompton-sdk-0.0.6.tgz
new file mode 100644
index 0000000..cdfe716
Binary files /dev/null and b/clients/fern/api/node_sdk/prompton-prompton-sdk-0.0.6.tgz differ
diff --git a/clients/fern/api/node_sdk/prompton-prompton-sdk-0.0.7.tgz b/clients/fern/api/node_sdk/prompton-prompton-sdk-0.0.7.tgz
new file mode 100644
index 0000000..0725d1b
Binary files /dev/null and b/clients/fern/api/node_sdk/prompton-prompton-sdk-0.0.7.tgz differ
diff --git a/clients/fern/api/node_sdk/prompton-prompton-sdk-0.0.8.tgz b/clients/fern/api/node_sdk/prompton-prompton-sdk-0.0.8.tgz
new file mode 100644
index 0000000..76a1594
Binary files /dev/null and b/clients/fern/api/node_sdk/prompton-prompton-sdk-0.0.8.tgz differ
diff --git a/clients/fern/api/node_sdk/prompton-prompton-sdk-0.0.9.tgz b/clients/fern/api/node_sdk/prompton-prompton-sdk-0.0.9.tgz
new file mode 100644
index 0000000..5e76c57
Binary files /dev/null and b/clients/fern/api/node_sdk/prompton-prompton-sdk-0.0.9.tgz differ
diff --git a/clients/fern/api/node_sdk/prompton/Client.d.ts b/clients/fern/api/node_sdk/prompton/Client.d.ts
index 6e4389a..4c149ae 100644
--- a/clients/fern/api/node_sdk/prompton/Client.d.ts
+++ b/clients/fern/api/node_sdk/prompton/Client.d.ts
@@ -9,15 +9,16 @@ import { PromptVersions } from "./api/resources/promptVersions/client/Client";
import { Inferences } from "./api/resources/inferences/client/Client";
import { Orgs } from "./api/resources/orgs/client/Client";
import { Users } from "./api/resources/users/client/Client";
+import { Feedbacks } from "./api/resources/feedbacks/client/Client";
export declare namespace PromptonApiClient {
interface Options {
- environment: string;
+ environment: core.Supplier;
token?: core.Supplier;
}
}
export declare class PromptonApiClient {
- protected readonly options: PromptonApiClient.Options;
- constructor(options: PromptonApiClient.Options);
+ protected readonly _options: PromptonApiClient.Options;
+ constructor(_options: PromptonApiClient.Options);
protected _serverStatus: ServerStatus | undefined;
get serverStatus(): ServerStatus;
protected _authentication: Authentication | undefined;
@@ -32,4 +33,6 @@ export declare class PromptonApiClient {
get orgs(): Orgs;
protected _users: Users | undefined;
get users(): Users;
+ protected _feedbacks: Feedbacks | undefined;
+ get feedbacks(): Feedbacks;
}
diff --git a/clients/fern/api/node_sdk/prompton/Client.js b/clients/fern/api/node_sdk/prompton/Client.js
index 9422530..17f4bee 100644
--- a/clients/fern/api/node_sdk/prompton/Client.js
+++ b/clients/fern/api/node_sdk/prompton/Client.js
@@ -11,37 +11,42 @@ const Client_4 = require("./api/resources/promptVersions/client/Client");
const Client_5 = require("./api/resources/inferences/client/Client");
const Client_6 = require("./api/resources/orgs/client/Client");
const Client_7 = require("./api/resources/users/client/Client");
+const Client_8 = require("./api/resources/feedbacks/client/Client");
class PromptonApiClient {
- constructor(options) {
- this.options = options;
+ constructor(_options) {
+ this._options = _options;
}
get serverStatus() {
var _a;
- return ((_a = this._serverStatus) !== null && _a !== void 0 ? _a : (this._serverStatus = new Client_1.ServerStatus(this.options)));
+ return ((_a = this._serverStatus) !== null && _a !== void 0 ? _a : (this._serverStatus = new Client_1.ServerStatus(this._options)));
}
get authentication() {
var _a;
- return ((_a = this._authentication) !== null && _a !== void 0 ? _a : (this._authentication = new Client_2.Authentication(this.options)));
+ return ((_a = this._authentication) !== null && _a !== void 0 ? _a : (this._authentication = new Client_2.Authentication(this._options)));
}
get prompts() {
var _a;
- return ((_a = this._prompts) !== null && _a !== void 0 ? _a : (this._prompts = new Client_3.Prompts(this.options)));
+ return ((_a = this._prompts) !== null && _a !== void 0 ? _a : (this._prompts = new Client_3.Prompts(this._options)));
}
get promptVersions() {
var _a;
- return ((_a = this._promptVersions) !== null && _a !== void 0 ? _a : (this._promptVersions = new Client_4.PromptVersions(this.options)));
+ return ((_a = this._promptVersions) !== null && _a !== void 0 ? _a : (this._promptVersions = new Client_4.PromptVersions(this._options)));
}
get inferences() {
var _a;
- return ((_a = this._inferences) !== null && _a !== void 0 ? _a : (this._inferences = new Client_5.Inferences(this.options)));
+ return ((_a = this._inferences) !== null && _a !== void 0 ? _a : (this._inferences = new Client_5.Inferences(this._options)));
}
get orgs() {
var _a;
- return ((_a = this._orgs) !== null && _a !== void 0 ? _a : (this._orgs = new Client_6.Orgs(this.options)));
+ return ((_a = this._orgs) !== null && _a !== void 0 ? _a : (this._orgs = new Client_6.Orgs(this._options)));
}
get users() {
var _a;
- return ((_a = this._users) !== null && _a !== void 0 ? _a : (this._users = new Client_7.Users(this.options)));
+ return ((_a = this._users) !== null && _a !== void 0 ? _a : (this._users = new Client_7.Users(this._options)));
+ }
+ get feedbacks() {
+ var _a;
+ return ((_a = this._feedbacks) !== null && _a !== void 0 ? _a : (this._feedbacks = new Client_8.Feedbacks(this._options)));
}
}
exports.PromptonApiClient = PromptonApiClient;
diff --git a/clients/fern/api/node_sdk/prompton/api/errors/BadRequestError.js b/clients/fern/api/node_sdk/prompton/api/errors/BadRequestError.js
index b9303cf..af77bf7 100644
--- a/clients/fern/api/node_sdk/prompton/api/errors/BadRequestError.js
+++ b/clients/fern/api/node_sdk/prompton/api/errors/BadRequestError.js
@@ -31,7 +31,6 @@ const errors = __importStar(require("../../errors"));
class BadRequestError extends errors.PromptonApiError {
constructor(body) {
super({
- message: "BadRequestError",
statusCode: 400,
body: body,
});
diff --git a/clients/fern/api/node_sdk/prompton/api/errors/ConflictError.d.ts b/clients/fern/api/node_sdk/prompton/api/errors/ConflictError.d.ts
new file mode 100644
index 0000000..b7c0f90
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/errors/ConflictError.d.ts
@@ -0,0 +1,7 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+import * as errors from "../../errors";
+export declare class ConflictError extends errors.PromptonApiError {
+ constructor(body?: unknown);
+}
diff --git a/clients/fern/api/node_sdk/prompton/api/errors/ConflictError.js b/clients/fern/api/node_sdk/prompton/api/errors/ConflictError.js
new file mode 100644
index 0000000..96cb0ea
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/errors/ConflictError.js
@@ -0,0 +1,40 @@
+"use strict";
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ConflictError = void 0;
+const errors = __importStar(require("../../errors"));
+class ConflictError extends errors.PromptonApiError {
+ constructor(body) {
+ super({
+ statusCode: 409,
+ body: body,
+ });
+ Object.setPrototypeOf(this, ConflictError.prototype);
+ }
+}
+exports.ConflictError = ConflictError;
diff --git a/clients/fern/api/node_sdk/prompton/api/errors/NotFoundError.js b/clients/fern/api/node_sdk/prompton/api/errors/NotFoundError.js
index a4bde36..51c0223 100644
--- a/clients/fern/api/node_sdk/prompton/api/errors/NotFoundError.js
+++ b/clients/fern/api/node_sdk/prompton/api/errors/NotFoundError.js
@@ -31,7 +31,6 @@ const errors = __importStar(require("../../errors"));
class NotFoundError extends errors.PromptonApiError {
constructor(body) {
super({
- message: "NotFoundError",
statusCode: 404,
body: body,
});
diff --git a/clients/fern/api/node_sdk/prompton/api/errors/UnauthorizedError.js b/clients/fern/api/node_sdk/prompton/api/errors/UnauthorizedError.js
index 6fd184a..3abcfb8 100644
--- a/clients/fern/api/node_sdk/prompton/api/errors/UnauthorizedError.js
+++ b/clients/fern/api/node_sdk/prompton/api/errors/UnauthorizedError.js
@@ -31,7 +31,6 @@ const errors = __importStar(require("../../errors"));
class UnauthorizedError extends errors.PromptonApiError {
constructor(body) {
super({
- message: "UnauthorizedError",
statusCode: 401,
body: body,
});
diff --git a/clients/fern/api/node_sdk/prompton/api/errors/UnprocessableEntityError.js b/clients/fern/api/node_sdk/prompton/api/errors/UnprocessableEntityError.js
index dd5720a..303acc4 100644
--- a/clients/fern/api/node_sdk/prompton/api/errors/UnprocessableEntityError.js
+++ b/clients/fern/api/node_sdk/prompton/api/errors/UnprocessableEntityError.js
@@ -31,7 +31,6 @@ const errors = __importStar(require("../../errors"));
class UnprocessableEntityError extends errors.PromptonApiError {
constructor(body) {
super({
- message: "UnprocessableEntityError",
statusCode: 422,
body: body,
});
diff --git a/clients/fern/api/node_sdk/prompton/api/errors/index.d.ts b/clients/fern/api/node_sdk/prompton/api/errors/index.d.ts
index 9a17e08..80f06c6 100644
--- a/clients/fern/api/node_sdk/prompton/api/errors/index.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/errors/index.d.ts
@@ -1,4 +1,5 @@
export * from "./BadRequestError";
export * from "./UnauthorizedError";
export * from "./NotFoundError";
+export * from "./ConflictError";
export * from "./UnprocessableEntityError";
diff --git a/clients/fern/api/node_sdk/prompton/api/errors/index.js b/clients/fern/api/node_sdk/prompton/api/errors/index.js
index 794fd5b..689d8b6 100644
--- a/clients/fern/api/node_sdk/prompton/api/errors/index.js
+++ b/clients/fern/api/node_sdk/prompton/api/errors/index.js
@@ -17,4 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./BadRequestError"), exports);
__exportStar(require("./UnauthorizedError"), exports);
__exportStar(require("./NotFoundError"), exports);
+__exportStar(require("./ConflictError"), exports);
__exportStar(require("./UnprocessableEntityError"), exports);
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/authentication/client/Client.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/authentication/client/Client.d.ts
index 4f042ed..2561463 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/authentication/client/Client.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/resources/authentication/client/Client.d.ts
@@ -5,13 +5,13 @@ import * as core from "../../../../core";
import * as PromptonApi from "../../..";
export declare namespace Authentication {
interface Options {
- environment: string;
+ environment: core.Supplier;
token?: core.Supplier;
}
}
export declare class Authentication {
- protected readonly options: Authentication.Options;
- constructor(options: Authentication.Options);
+ protected readonly _options: Authentication.Options;
+ constructor(_options: Authentication.Options);
/**
* @throws {@link PromptonApi.BadRequestError}
* @throws {@link PromptonApi.UnauthorizedError}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/authentication/client/Client.js b/clients/fern/api/node_sdk/prompton/api/resources/authentication/client/Client.js
index f32e483..2ac5029 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/authentication/client/Client.js
+++ b/clients/fern/api/node_sdk/prompton/api/resources/authentication/client/Client.js
@@ -45,8 +45,8 @@ const url_join_1 = __importDefault(require("url-join"));
const serializers = __importStar(require("../../../../serialization"));
const errors = __importStar(require("../../../../errors"));
class Authentication {
- constructor(options) {
- this.options = options;
+ constructor(_options) {
+ this._options = _options;
}
/**
* @throws {@link PromptonApi.BadRequestError}
@@ -56,7 +56,7 @@ class Authentication {
getAccessTokenExtended() {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, "token"),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), "token"),
method: "POST",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -114,7 +114,7 @@ class Authentication {
getAccessToken(request) {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, "token_basic"),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), "token_basic"),
method: "POST",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -164,7 +164,7 @@ class Authentication {
}
_getAuthorizationHeader() {
return __awaiter(this, void 0, void 0, function* () {
- const bearer = yield core.Supplier.get(this.options.token);
+ const bearer = yield core.Supplier.get(this._options.token);
if (bearer != null) {
return `Bearer ${bearer}`;
}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/Client.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/Client.d.ts
new file mode 100644
index 0000000..d3830e5
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/Client.d.ts
@@ -0,0 +1,49 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+import * as core from "../../../../core";
+import * as PromptonApi from "../../..";
+export declare namespace Feedbacks {
+ interface Options {
+ environment: core.Supplier;
+ token?: core.Supplier;
+ }
+}
+export declare class Feedbacks {
+ protected readonly _options: Feedbacks.Options;
+ constructor(_options: Feedbacks.Options);
+ /**
+ * @throws {@link PromptonApi.BadRequestError}
+ * @throws {@link PromptonApi.UnauthorizedError}
+ * @throws {@link PromptonApi.NotFoundError}
+ * @throws {@link PromptonApi.UnprocessableEntityError}
+ */
+ getFeedbacksList(request?: PromptonApi.GetFeedbacksListRequest): Promise;
+ /**
+ * Feedback about an inference from an end user or from a PromptOn user.
+ *
+ * At least one of `score`, `flag` or `note` required
+ *
+ * `end_user_id` is null if from PromptOn user.
+ *
+ * `score` can be null if flagging or note only. Scoring method are for API consumer consideration. Eg. end users can thumbs down/up mapped to -1 +1 `score`, internal users rate between from 0 to 100.
+ *
+ * `flag` is any string when inference was flagged. Can be null if it is scoring or note only
+ *
+ * `feedback_for_part` is optional and can be used when the inference has multiple sections which require separate feedback.
+ *
+ * `metadata` is any dict for additional information.
+ * @throws {@link PromptonApi.BadRequestError}
+ * @throws {@link PromptonApi.UnauthorizedError}
+ * @throws {@link PromptonApi.UnprocessableEntityError}
+ */
+ addFeedback(request: PromptonApi.FeedbackCreate): Promise;
+ /**
+ * @throws {@link PromptonApi.BadRequestError}
+ * @throws {@link PromptonApi.UnauthorizedError}
+ * @throws {@link PromptonApi.NotFoundError}
+ * @throws {@link PromptonApi.UnprocessableEntityError}
+ */
+ getFeedbackById(id: string): Promise;
+ protected _getAuthorizationHeader(): Promise;
+}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/Client.js b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/Client.js
new file mode 100644
index 0000000..d8a3fb5
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/Client.js
@@ -0,0 +1,259 @@
+"use strict";
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Feedbacks = void 0;
+const core = __importStar(require("../../../../core"));
+const PromptonApi = __importStar(require("../../.."));
+const url_search_params_1 = __importDefault(require("@ungap/url-search-params"));
+const url_join_1 = __importDefault(require("url-join"));
+const serializers = __importStar(require("../../../../serialization"));
+const errors = __importStar(require("../../../../errors"));
+class Feedbacks {
+ constructor(_options) {
+ this._options = _options;
+ }
+ /**
+ * @throws {@link PromptonApi.BadRequestError}
+ * @throws {@link PromptonApi.UnauthorizedError}
+ * @throws {@link PromptonApi.NotFoundError}
+ * @throws {@link PromptonApi.UnprocessableEntityError}
+ */
+ getFeedbacksList(request = {}) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const { promptVersionId, promptonUserId, inferenceId } = request;
+ const _queryParams = new url_search_params_1.default();
+ if (promptVersionId != null) {
+ _queryParams.append("prompt_version_id", promptVersionId);
+ }
+ if (promptonUserId != null) {
+ _queryParams.append("prompton_user_id", promptonUserId);
+ }
+ if (inferenceId != null) {
+ _queryParams.append("inference_id", inferenceId);
+ }
+ const _response = yield core.fetcher({
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), "feedbacks"),
+ method: "GET",
+ headers: {
+ Authorization: yield this._getAuthorizationHeader(),
+ "X-Fern-Language": "JavaScript",
+ },
+ contentType: "application/json",
+ queryParameters: _queryParams,
+ timeoutMs: 60000,
+ });
+ if (_response.ok) {
+ return yield serializers.feedbacks.getFeedbacksList.Response.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ breadcrumbsPrefix: ["response"],
+ });
+ }
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new PromptonApi.BadRequestError(_response.error.body);
+ case 401:
+ throw new PromptonApi.UnauthorizedError(_response.error.body);
+ case 404:
+ throw new PromptonApi.NotFoundError(_response.error.body);
+ case 422:
+ throw new PromptonApi.UnprocessableEntityError(_response.error.body);
+ default:
+ throw new errors.PromptonApiError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ });
+ }
+ }
+ switch (_response.error.reason) {
+ case "non-json":
+ throw new errors.PromptonApiError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.rawBody,
+ });
+ case "timeout":
+ throw new errors.PromptonApiTimeoutError();
+ case "unknown":
+ throw new errors.PromptonApiError({
+ message: _response.error.errorMessage,
+ });
+ }
+ });
+ }
+ /**
+ * Feedback about an inference from an end user or from a PromptOn user.
+ *
+ * At least one of `score`, `flag` or `note` required
+ *
+ * `end_user_id` is null if from PromptOn user.
+ *
+ * `score` can be null if flagging or note only. Scoring method are for API consumer consideration. Eg. end users can thumbs down/up mapped to -1 +1 `score`, internal users rate between from 0 to 100.
+ *
+ * `flag` is any string when inference was flagged. Can be null if it is scoring or note only
+ *
+ * `feedback_for_part` is optional and can be used when the inference has multiple sections which require separate feedback.
+ *
+ * `metadata` is any dict for additional information.
+ * @throws {@link PromptonApi.BadRequestError}
+ * @throws {@link PromptonApi.UnauthorizedError}
+ * @throws {@link PromptonApi.UnprocessableEntityError}
+ */
+ addFeedback(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const _response = yield core.fetcher({
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), "feedbacks"),
+ method: "POST",
+ headers: {
+ Authorization: yield this._getAuthorizationHeader(),
+ "X-Fern-Language": "JavaScript",
+ },
+ contentType: "application/json",
+ body: yield serializers.FeedbackCreate.jsonOrThrow(request, { unrecognizedObjectKeys: "strip" }),
+ timeoutMs: 60000,
+ });
+ if (_response.ok) {
+ return yield serializers.DefaultPostResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ breadcrumbsPrefix: ["response"],
+ });
+ }
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new PromptonApi.BadRequestError(_response.error.body);
+ case 401:
+ throw new PromptonApi.UnauthorizedError(_response.error.body);
+ case 422:
+ throw new PromptonApi.UnprocessableEntityError(_response.error.body);
+ default:
+ throw new errors.PromptonApiError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ });
+ }
+ }
+ switch (_response.error.reason) {
+ case "non-json":
+ throw new errors.PromptonApiError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.rawBody,
+ });
+ case "timeout":
+ throw new errors.PromptonApiTimeoutError();
+ case "unknown":
+ throw new errors.PromptonApiError({
+ message: _response.error.errorMessage,
+ });
+ }
+ });
+ }
+ /**
+ * @throws {@link PromptonApi.BadRequestError}
+ * @throws {@link PromptonApi.UnauthorizedError}
+ * @throws {@link PromptonApi.NotFoundError}
+ * @throws {@link PromptonApi.UnprocessableEntityError}
+ */
+ getFeedbackById(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const _response = yield core.fetcher({
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), `feedbacks/${id}`),
+ method: "GET",
+ headers: {
+ Authorization: yield this._getAuthorizationHeader(),
+ "X-Fern-Language": "JavaScript",
+ },
+ contentType: "application/json",
+ timeoutMs: 60000,
+ });
+ if (_response.ok) {
+ return yield serializers.FeedbackRead.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ breadcrumbsPrefix: ["response"],
+ });
+ }
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new PromptonApi.BadRequestError(_response.error.body);
+ case 401:
+ throw new PromptonApi.UnauthorizedError(_response.error.body);
+ case 404:
+ throw new PromptonApi.NotFoundError(_response.error.body);
+ case 422:
+ throw new PromptonApi.UnprocessableEntityError(_response.error.body);
+ default:
+ throw new errors.PromptonApiError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ });
+ }
+ }
+ switch (_response.error.reason) {
+ case "non-json":
+ throw new errors.PromptonApiError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.rawBody,
+ });
+ case "timeout":
+ throw new errors.PromptonApiTimeoutError();
+ case "unknown":
+ throw new errors.PromptonApiError({
+ message: _response.error.errorMessage,
+ });
+ }
+ });
+ }
+ _getAuthorizationHeader() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const bearer = yield core.Supplier.get(this._options.token);
+ if (bearer != null) {
+ return `Bearer ${bearer}`;
+ }
+ return undefined;
+ });
+ }
+}
+exports.Feedbacks = Feedbacks;
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/index.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/index.d.ts
new file mode 100644
index 0000000..415726b
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/index.d.ts
@@ -0,0 +1 @@
+export * from "./requests";
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/index.js b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/index.js
new file mode 100644
index 0000000..6df4ebb
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/index.js
@@ -0,0 +1,17 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+__exportStar(require("./requests"), exports);
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/requests/FeedbackCreate.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/requests/FeedbackCreate.d.ts
new file mode 100644
index 0000000..916b526
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/requests/FeedbackCreate.d.ts
@@ -0,0 +1,17 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+export interface FeedbackCreate {
+ /** The inference being rated */
+ inferenceId: string;
+ /** API consumers' end user id If feedback from end user otherwise null */
+ endUserId?: string;
+ /** Specifies which part of the output the feedback is about. Can be used when the inference has multiple sections which require separate feedback */
+ feedbackForPart?: string;
+ /** Any integer score. Rules are up to the API consumer. Can be null if it was flagging or note only */
+ score?: number;
+ /** Any string when inference was flagged. Can be null if it is scoring or note only */
+ flag?: string;
+ note?: string;
+ metadata?: Record;
+}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/inferences/client/requests/InferenceCreate.js b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/requests/FeedbackCreate.js
similarity index 100%
rename from clients/fern/api/node_sdk/prompton/api/resources/inferences/client/requests/InferenceCreate.js
rename to clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/requests/FeedbackCreate.js
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/requests/GetFeedbacksListRequest.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/requests/GetFeedbacksListRequest.d.ts
new file mode 100644
index 0000000..5845f81
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/requests/GetFeedbacksListRequest.d.ts
@@ -0,0 +1,8 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+export interface GetFeedbacksListRequest {
+ promptVersionId?: string;
+ promptonUserId?: string;
+ inferenceId?: string;
+}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/requests/GetFeedbacksListRequest.js b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/requests/GetFeedbacksListRequest.js
new file mode 100644
index 0000000..33e43da
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/requests/GetFeedbacksListRequest.js
@@ -0,0 +1,5 @@
+"use strict";
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/requests/index.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/requests/index.d.ts
new file mode 100644
index 0000000..19f5d44
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/requests/index.d.ts
@@ -0,0 +1,2 @@
+export { GetFeedbacksListRequest } from "./GetFeedbacksListRequest";
+export { FeedbackCreate } from "./FeedbackCreate";
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/requests/index.js b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/requests/index.js
new file mode 100644
index 0000000..c8ad2e5
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/client/requests/index.js
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/index.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/index.d.ts
new file mode 100644
index 0000000..5ec7692
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/index.d.ts
@@ -0,0 +1 @@
+export * from "./client";
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/index.js b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/index.js
new file mode 100644
index 0000000..352398a
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/resources/feedbacks/index.js
@@ -0,0 +1,17 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+__exportStar(require("./client"), exports);
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/index.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/index.d.ts
index 54f9d6e..39fd99b 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/index.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/resources/index.d.ts
@@ -5,9 +5,11 @@ export * as promptVersions from "./promptVersions";
export * as inferences from "./inferences";
export * as orgs from "./orgs";
export * as users from "./users";
+export * as feedbacks from "./feedbacks";
export * from "./authentication/client/requests";
export * from "./prompts/client/requests";
export * from "./promptVersions/client/requests";
export * from "./inferences/client/requests";
export * from "./orgs/client/requests";
export * from "./users/client/requests";
+export * from "./feedbacks/client/requests";
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/index.js b/clients/fern/api/node_sdk/prompton/api/resources/index.js
index 1766e8a..4f2b335 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/index.js
+++ b/clients/fern/api/node_sdk/prompton/api/resources/index.js
@@ -26,7 +26,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
-exports.users = exports.orgs = exports.inferences = exports.promptVersions = exports.prompts = exports.authentication = exports.serverStatus = void 0;
+exports.feedbacks = exports.users = exports.orgs = exports.inferences = exports.promptVersions = exports.prompts = exports.authentication = exports.serverStatus = void 0;
exports.serverStatus = __importStar(require("./serverStatus"));
exports.authentication = __importStar(require("./authentication"));
exports.prompts = __importStar(require("./prompts"));
@@ -34,9 +34,11 @@ exports.promptVersions = __importStar(require("./promptVersions"));
exports.inferences = __importStar(require("./inferences"));
exports.orgs = __importStar(require("./orgs"));
exports.users = __importStar(require("./users"));
+exports.feedbacks = __importStar(require("./feedbacks"));
__exportStar(require("./authentication/client/requests"), exports);
__exportStar(require("./prompts/client/requests"), exports);
__exportStar(require("./promptVersions/client/requests"), exports);
__exportStar(require("./inferences/client/requests"), exports);
__exportStar(require("./orgs/client/requests"), exports);
__exportStar(require("./users/client/requests"), exports);
+__exportStar(require("./feedbacks/client/requests"), exports);
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/inferences/client/Client.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/inferences/client/Client.d.ts
index a406353..ed779f6 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/inferences/client/Client.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/resources/inferences/client/Client.d.ts
@@ -5,13 +5,13 @@ import * as core from "../../../../core";
import * as PromptonApi from "../../..";
export declare namespace Inferences {
interface Options {
- environment: string;
+ environment: core.Supplier;
token?: core.Supplier;
}
}
export declare class Inferences {
- protected readonly options: Inferences.Options;
- constructor(options: Inferences.Options);
+ protected readonly _options: Inferences.Options;
+ constructor(_options: Inferences.Options);
/**
* @throws {@link PromptonApi.BadRequestError}
* @throws {@link PromptonApi.UnauthorizedError}
@@ -20,11 +20,35 @@ export declare class Inferences {
*/
getInferencesList(request?: PromptonApi.GetInferencesListRequest): Promise;
/**
+ * The core of the functionality:
+ * 1. Populating the template from prompt version with the passed values
+ * 2. Logging the request
+ * 3. Sending request to provider
+ * 4. Logging response
+ * 4. Returning response with `inference_id`
+ *
+ * You can specify which prompt version you want to use in two ways by setting on of:
+ *
+ * - `prompt_version_id` - uses the specified prompt version
+ * - `prompt_id` - uses the `Live` status prompt version assigned to the given `prompt_id`. This allows to release new prompt versions using Prompton API if you only reference `prompt_id` in your client code.
+ *
+ * If there are multiple prompt versions in `Live` status for the prompt_id then it picks one randomly. It's useful for split testing.
+ * This method will return an error if there is no `Live` status message.
+ *
+ * It also handles errors, timeouts and sets the inference status accordingly. It will still process response if client disconnects before it arrives.
+ *
+ * _Note: raw request data is also logged, GET `inferences/{id}` reponse includes it as well._
+ *
+ * You can use a few easter eggs to test it without a valid api key:
+ *
+ * - `"end_user_id": "mock_me_softly"`
+ * - `"end_user_id": "timeout_me_softly"`
+ * - `"end_user_id": "fail_me_softly"`
* @throws {@link PromptonApi.BadRequestError}
* @throws {@link PromptonApi.UnauthorizedError}
* @throws {@link PromptonApi.UnprocessableEntityError}
*/
- newInference(request: PromptonApi.InferenceCreate): Promise;
+ newInference(request: PromptonApi.NewInferenceRequest): Promise;
/**
* @throws {@link PromptonApi.BadRequestError}
* @throws {@link PromptonApi.UnauthorizedError}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/inferences/client/Client.js b/clients/fern/api/node_sdk/prompton/api/resources/inferences/client/Client.js
index 5e4c334..39272f6 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/inferences/client/Client.js
+++ b/clients/fern/api/node_sdk/prompton/api/resources/inferences/client/Client.js
@@ -46,8 +46,8 @@ const url_join_1 = __importDefault(require("url-join"));
const serializers = __importStar(require("../../../../serialization"));
const errors = __importStar(require("../../../../errors"));
class Inferences {
- constructor(options) {
- this.options = options;
+ constructor(_options) {
+ this._options = _options;
}
/**
* @throws {@link PromptonApi.BadRequestError}
@@ -66,7 +66,7 @@ class Inferences {
_queryParams.append("prompt_id", promptId);
}
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, "inferences"),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), "inferences"),
method: "GET",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -117,6 +117,30 @@ class Inferences {
});
}
/**
+ * The core of the functionality:
+ * 1. Populating the template from prompt version with the passed values
+ * 2. Logging the request
+ * 3. Sending request to provider
+ * 4. Logging response
+ * 4. Returning response with `inference_id`
+ *
+ * You can specify which prompt version you want to use in two ways by setting on of:
+ *
+ * - `prompt_version_id` - uses the specified prompt version
+ * - `prompt_id` - uses the `Live` status prompt version assigned to the given `prompt_id`. This allows to release new prompt versions using Prompton API if you only reference `prompt_id` in your client code.
+ *
+ * If there are multiple prompt versions in `Live` status for the prompt_id then it picks one randomly. It's useful for split testing.
+ * This method will return an error if there is no `Live` status message.
+ *
+ * It also handles errors, timeouts and sets the inference status accordingly. It will still process response if client disconnects before it arrives.
+ *
+ * _Note: raw request data is also logged, GET `inferences/{id}` reponse includes it as well._
+ *
+ * You can use a few easter eggs to test it without a valid api key:
+ *
+ * - `"end_user_id": "mock_me_softly"`
+ * - `"end_user_id": "timeout_me_softly"`
+ * - `"end_user_id": "fail_me_softly"`
* @throws {@link PromptonApi.BadRequestError}
* @throws {@link PromptonApi.UnauthorizedError}
* @throws {@link PromptonApi.UnprocessableEntityError}
@@ -124,14 +148,14 @@ class Inferences {
newInference(request) {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, "inferences"),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), "inferences"),
method: "POST",
headers: {
Authorization: yield this._getAuthorizationHeader(),
"X-Fern-Language": "JavaScript",
},
contentType: "application/json",
- body: yield serializers.InferenceCreate.jsonOrThrow(request, { unrecognizedObjectKeys: "strip" }),
+ body: yield serializers.NewInferenceRequest.jsonOrThrow(request, { unrecognizedObjectKeys: "strip" }),
timeoutMs: 60000,
});
if (_response.ok) {
@@ -181,7 +205,7 @@ class Inferences {
getInferenceById(id) {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, `inferences/${id}`),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), `inferences/${id}`),
method: "GET",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -232,7 +256,7 @@ class Inferences {
}
_getAuthorizationHeader() {
return __awaiter(this, void 0, void 0, function* () {
- const bearer = yield core.Supplier.get(this.options.token);
+ const bearer = yield core.Supplier.get(this._options.token);
if (bearer != null) {
return `Bearer ${bearer}`;
}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/inferences/client/requests/InferenceCreate.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/inferences/client/requests/InferenceCreate.d.ts
deleted file mode 100644
index e891b1c..0000000
--- a/clients/fern/api/node_sdk/prompton/api/resources/inferences/client/requests/InferenceCreate.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * This file was auto-generated by Fern from our API Definition.
- */
-export interface InferenceCreate {
- /** `non-empty` */
- endUserId: string;
- /** `non-empty` */
- source: string;
- templateArgs?: Record;
- metadata?: Record;
- requestTimeout?: number;
- promptVersionId: string;
-}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/inferences/client/requests/index.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/inferences/client/requests/index.d.ts
index 0e748c4..76d77a3 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/inferences/client/requests/index.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/resources/inferences/client/requests/index.d.ts
@@ -1,2 +1 @@
export { GetInferencesListRequest } from "./GetInferencesListRequest";
-export { InferenceCreate } from "./InferenceCreate";
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/orgs/client/Client.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/orgs/client/Client.d.ts
index 7b90f3c..f746ba5 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/orgs/client/Client.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/resources/orgs/client/Client.d.ts
@@ -5,20 +5,20 @@ import * as core from "../../../../core";
import * as PromptonApi from "../../..";
export declare namespace Orgs {
interface Options {
- environment: string;
+ environment: core.Supplier;
token?: core.Supplier;
}
}
export declare class Orgs {
- protected readonly options: Orgs.Options;
- constructor(options: Orgs.Options);
- getOrgList(): Promise;
+ protected readonly _options: Orgs.Options;
+ constructor(_options: Orgs.Options);
+ getOrgsList(): Promise;
/**
* @throws {@link PromptonApi.BadRequestError}
* @throws {@link PromptonApi.UnauthorizedError}
* @throws {@link PromptonApi.UnprocessableEntityError}
*/
- addOrg(request: PromptonApi.OrgCreate): Promise;
+ addOrg(request: PromptonApi.OrgCreate): Promise;
/**
* @throws {@link PromptonApi.BadRequestError}
* @throws {@link PromptonApi.UnauthorizedError}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/orgs/client/Client.js b/clients/fern/api/node_sdk/prompton/api/resources/orgs/client/Client.js
index b8fd4c9..cadfe9d 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/orgs/client/Client.js
+++ b/clients/fern/api/node_sdk/prompton/api/resources/orgs/client/Client.js
@@ -45,13 +45,13 @@ const url_join_1 = __importDefault(require("url-join"));
const serializers = __importStar(require("../../../../serialization"));
const errors = __importStar(require("../../../../errors"));
class Orgs {
- constructor(options) {
- this.options = options;
+ constructor(_options) {
+ this._options = _options;
}
- getOrgList() {
+ getOrgsList() {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, "orgs"),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), "orgs"),
method: "GET",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -61,7 +61,7 @@ class Orgs {
timeoutMs: 60000,
});
if (_response.ok) {
- return yield serializers.orgs.getOrgList.Response.parseOrThrow(_response.body, {
+ return yield serializers.orgs.getOrgsList.Response.parseOrThrow(_response.body, {
unrecognizedObjectKeys: "passthrough",
allowUnrecognizedUnionMembers: true,
allowUnrecognizedEnumValues: true,
@@ -97,7 +97,7 @@ class Orgs {
addOrg(request) {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, "orgs"),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), "orgs"),
method: "POST",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -108,7 +108,12 @@ class Orgs {
timeoutMs: 60000,
});
if (_response.ok) {
- return _response.body;
+ return yield serializers.DefaultPostResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ breadcrumbsPrefix: ["response"],
+ });
}
if (_response.error.reason === "status-code") {
switch (_response.error.statusCode) {
@@ -149,7 +154,7 @@ class Orgs {
getCurrentUserOrg() {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, "orgs/me"),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), "orgs/me"),
method: "GET",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -207,7 +212,7 @@ class Orgs {
getOrgById(id) {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, `orgs/${id}`),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), `orgs/${id}`),
method: "GET",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -265,7 +270,7 @@ class Orgs {
updateOrg(id, request = {}) {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, `orgs/${id}`),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), `orgs/${id}`),
method: "PATCH",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -317,7 +322,7 @@ class Orgs {
}
_getAuthorizationHeader() {
return __awaiter(this, void 0, void 0, function* () {
- const bearer = yield core.Supplier.get(this.options.token);
+ const bearer = yield core.Supplier.get(this._options.token);
if (bearer != null) {
return `Bearer ${bearer}`;
}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/orgs/client/requests/OrgCreate.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/orgs/client/requests/OrgCreate.d.ts
index cd19a4c..c2779ef 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/orgs/client/requests/OrgCreate.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/resources/orgs/client/requests/OrgCreate.d.ts
@@ -2,7 +2,9 @@
* This file was auto-generated by Fern from our API Definition.
*/
export interface OrgCreate {
- /** `non-empty` */
+ /** `non-empty` */
name: string;
accessKeys?: Record;
+ /** APEX domain for oauth single sign on. Anyone with an email address ending in this domain will be able to register to the org after google account sign in. Only Google OAuth is supported for now. */
+ oauthDomain?: string;
}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/orgs/client/requests/OrgUpdate.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/orgs/client/requests/OrgUpdate.d.ts
index 6649469..4ff97d9 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/orgs/client/requests/OrgUpdate.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/resources/orgs/client/requests/OrgUpdate.d.ts
@@ -2,7 +2,9 @@
* This file was auto-generated by Fern from our API Definition.
*/
export interface OrgUpdate {
- /** `non-empty` */
+ /** `non-empty` */
name?: string;
accessKeys?: Record;
+ /** APEX domain for oauth single sign on. Anyone with an email address ending in this domain will be able to register to the org after google account sign in. Only Google OAuth is supported for now. */
+ oauthDomain?: string;
}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/promptVersions/client/Client.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/promptVersions/client/Client.d.ts
index 52810ce..9e166ba 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/promptVersions/client/Client.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/resources/promptVersions/client/Client.d.ts
@@ -5,13 +5,13 @@ import * as core from "../../../../core";
import * as PromptonApi from "../../..";
export declare namespace PromptVersions {
interface Options {
- environment: string;
+ environment: core.Supplier;
token?: core.Supplier;
}
}
export declare class PromptVersions {
- protected readonly options: PromptVersions.Options;
- constructor(options: PromptVersions.Options);
+ protected readonly _options: PromptVersions.Options;
+ constructor(_options: PromptVersions.Options);
/**
* @throws {@link PromptonApi.BadRequestError}
* @throws {@link PromptonApi.UnauthorizedError}
@@ -24,7 +24,7 @@ export declare class PromptVersions {
* @throws {@link PromptonApi.UnauthorizedError}
* @throws {@link PromptonApi.UnprocessableEntityError}
*/
- addPromptVersion(request: PromptonApi.PromptVersionCreate): Promise;
+ addPromptVersion(request: PromptonApi.PromptVersionCreate): Promise;
/**
* @throws {@link PromptonApi.BadRequestError}
* @throws {@link PromptonApi.UnauthorizedError}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/promptVersions/client/Client.js b/clients/fern/api/node_sdk/prompton/api/resources/promptVersions/client/Client.js
index 9ad0c1c..6fe01bb 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/promptVersions/client/Client.js
+++ b/clients/fern/api/node_sdk/prompton/api/resources/promptVersions/client/Client.js
@@ -46,8 +46,8 @@ const url_join_1 = __importDefault(require("url-join"));
const serializers = __importStar(require("../../../../serialization"));
const errors = __importStar(require("../../../../errors"));
class PromptVersions {
- constructor(options) {
- this.options = options;
+ constructor(_options) {
+ this._options = _options;
}
/**
* @throws {@link PromptonApi.BadRequestError}
@@ -63,7 +63,7 @@ class PromptVersions {
_queryParams.append("prompt_id", promptId);
}
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, "promptVersions"),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), "promptVersions"),
method: "GET",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -121,7 +121,7 @@ class PromptVersions {
addPromptVersion(request) {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, "promptVersions"),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), "promptVersions"),
method: "POST",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -132,7 +132,12 @@ class PromptVersions {
timeoutMs: 60000,
});
if (_response.ok) {
- return _response.body;
+ return yield serializers.DefaultPostResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ breadcrumbsPrefix: ["response"],
+ });
}
if (_response.error.reason === "status-code") {
switch (_response.error.statusCode) {
@@ -173,7 +178,7 @@ class PromptVersions {
getPromptVersionById(id) {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, `promptVersions/${id}`),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), `promptVersions/${id}`),
method: "GET",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -231,7 +236,7 @@ class PromptVersions {
updatePromptVersion(id, request = {}) {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, `promptVersions/${id}`),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), `promptVersions/${id}`),
method: "PATCH",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -283,7 +288,7 @@ class PromptVersions {
}
_getAuthorizationHeader() {
return __awaiter(this, void 0, void 0, function* () {
- const bearer = yield core.Supplier.get(this.options.token);
+ const bearer = yield core.Supplier.get(this._options.token);
if (bearer != null) {
return `Bearer ${bearer}`;
}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/promptVersions/client/requests/PromptVersionCreate.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/promptVersions/client/requests/PromptVersionCreate.d.ts
index 9a7298b..14eacba 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/promptVersions/client/requests/PromptVersionCreate.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/resources/promptVersions/client/requests/PromptVersionCreate.d.ts
@@ -5,7 +5,7 @@ import * as PromptonApi from "../../../..";
export interface PromptVersionCreate {
status?: PromptonApi.PromptVersionStatus;
provider?: PromptonApi.PromptVersionProviders;
- /** `non-empty` */
+ /** `non-empty` */
name: string;
description?: string;
promptId: string;
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/promptVersions/client/requests/PromptVersionUpdate.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/promptVersions/client/requests/PromptVersionUpdate.d.ts
index 3e15f22..18a359c 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/promptVersions/client/requests/PromptVersionUpdate.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/resources/promptVersions/client/requests/PromptVersionUpdate.d.ts
@@ -5,7 +5,7 @@ import * as PromptonApi from "../../../..";
export interface PromptVersionUpdate {
status?: PromptonApi.PromptVersionStatus;
provider?: PromptonApi.PromptVersionProviders;
- /** `non-empty` */
+ /** `non-empty` */
name?: string;
description?: string;
promptId?: string;
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/prompts/client/Client.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/prompts/client/Client.d.ts
index 988919b..9f0608b 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/prompts/client/Client.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/resources/prompts/client/Client.d.ts
@@ -5,26 +5,26 @@ import * as core from "../../../../core";
import * as PromptonApi from "../../..";
export declare namespace Prompts {
interface Options {
- environment: string;
+ environment: core.Supplier;
token?: core.Supplier;
}
}
export declare class Prompts {
- protected readonly options: Prompts.Options;
- constructor(options: Prompts.Options);
+ protected readonly _options: Prompts.Options;
+ constructor(_options: Prompts.Options);
/**
* @throws {@link PromptonApi.BadRequestError}
* @throws {@link PromptonApi.UnauthorizedError}
* @throws {@link PromptonApi.NotFoundError}
* @throws {@link PromptonApi.UnprocessableEntityError}
*/
- getPromptList(): Promise;
+ getPromptsList(): Promise;
/**
* @throws {@link PromptonApi.BadRequestError}
* @throws {@link PromptonApi.UnauthorizedError}
* @throws {@link PromptonApi.UnprocessableEntityError}
*/
- addPrompt(request: PromptonApi.PromptCreate): Promise;
+ addPrompt(request: PromptonApi.PromptCreate): Promise;
/**
* @throws {@link PromptonApi.BadRequestError}
* @throws {@link PromptonApi.UnauthorizedError}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/prompts/client/Client.js b/clients/fern/api/node_sdk/prompton/api/resources/prompts/client/Client.js
index 634c1fe..b9886f4 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/prompts/client/Client.js
+++ b/clients/fern/api/node_sdk/prompton/api/resources/prompts/client/Client.js
@@ -45,8 +45,8 @@ const url_join_1 = __importDefault(require("url-join"));
const serializers = __importStar(require("../../../../serialization"));
const errors = __importStar(require("../../../../errors"));
class Prompts {
- constructor(options) {
- this.options = options;
+ constructor(_options) {
+ this._options = _options;
}
/**
* @throws {@link PromptonApi.BadRequestError}
@@ -54,10 +54,10 @@ class Prompts {
* @throws {@link PromptonApi.NotFoundError}
* @throws {@link PromptonApi.UnprocessableEntityError}
*/
- getPromptList() {
+ getPromptsList() {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, "prompts"),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), "prompts"),
method: "GET",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -67,7 +67,7 @@ class Prompts {
timeoutMs: 60000,
});
if (_response.ok) {
- return yield serializers.prompts.getPromptList.Response.parseOrThrow(_response.body, {
+ return yield serializers.prompts.getPromptsList.Response.parseOrThrow(_response.body, {
unrecognizedObjectKeys: "passthrough",
allowUnrecognizedUnionMembers: true,
allowUnrecognizedEnumValues: true,
@@ -114,7 +114,7 @@ class Prompts {
addPrompt(request) {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, "prompts"),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), "prompts"),
method: "POST",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -125,7 +125,12 @@ class Prompts {
timeoutMs: 60000,
});
if (_response.ok) {
- return _response.body;
+ return yield serializers.DefaultPostResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ breadcrumbsPrefix: ["response"],
+ });
}
if (_response.error.reason === "status-code") {
switch (_response.error.statusCode) {
@@ -166,7 +171,7 @@ class Prompts {
getPromptById(id) {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, `prompts/${id}`),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), `prompts/${id}`),
method: "GET",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -224,7 +229,7 @@ class Prompts {
updatePrompt(id, request = {}) {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, `prompts/${id}`),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), `prompts/${id}`),
method: "PATCH",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -282,7 +287,7 @@ class Prompts {
deletePrompt(id) {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, `prompts/${id}`),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), `prompts/${id}`),
method: "DELETE",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -324,7 +329,7 @@ class Prompts {
}
_getAuthorizationHeader() {
return __awaiter(this, void 0, void 0, function* () {
- const bearer = yield core.Supplier.get(this.options.token);
+ const bearer = yield core.Supplier.get(this._options.token);
if (bearer != null) {
return `Bearer ${bearer}`;
}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/prompts/client/requests/PromptCreate.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/prompts/client/requests/PromptCreate.d.ts
index f4e2596..ec78151 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/prompts/client/requests/PromptCreate.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/resources/prompts/client/requests/PromptCreate.d.ts
@@ -3,8 +3,9 @@
*/
import * as PromptonApi from "../../../..";
export interface PromptCreate {
+ /** Prompt status for client consideration only, currently not used in server logic. */
status?: PromptonApi.PromptStatus;
- /** `non-empty` */
+ /** `non-empty` */
name: string;
description?: string;
}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/prompts/client/requests/PromptUpdate.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/prompts/client/requests/PromptUpdate.d.ts
index 304746f..5be74fa 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/prompts/client/requests/PromptUpdate.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/resources/prompts/client/requests/PromptUpdate.d.ts
@@ -3,8 +3,9 @@
*/
import * as PromptonApi from "../../../..";
export interface PromptUpdate {
+ /** Prompt status for client consideration only, currently not used in server logic. */
status?: PromptonApi.PromptStatus;
- /** `non-empty` */
+ /** `non-empty` */
name?: string;
description?: string;
}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/serverStatus/client/Client.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/serverStatus/client/Client.d.ts
index ceb08f4..372dc99 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/serverStatus/client/Client.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/resources/serverStatus/client/Client.d.ts
@@ -5,13 +5,13 @@ import * as core from "../../../../core";
import * as PromptonApi from "../../..";
export declare namespace ServerStatus {
interface Options {
- environment: string;
+ environment: core.Supplier;
token?: core.Supplier;
}
}
export declare class ServerStatus {
- protected readonly options: ServerStatus.Options;
- constructor(options: ServerStatus.Options);
+ protected readonly _options: ServerStatus.Options;
+ constructor(_options: ServerStatus.Options);
getStatus(): Promise;
protected _getAuthorizationHeader(): Promise;
}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/serverStatus/client/Client.js b/clients/fern/api/node_sdk/prompton/api/resources/serverStatus/client/Client.js
index 24aaf7c..2c543a5 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/serverStatus/client/Client.js
+++ b/clients/fern/api/node_sdk/prompton/api/resources/serverStatus/client/Client.js
@@ -44,13 +44,13 @@ const url_join_1 = __importDefault(require("url-join"));
const serializers = __importStar(require("../../../../serialization"));
const errors = __importStar(require("../../../../errors"));
class ServerStatus {
- constructor(options) {
- this.options = options;
+ constructor(_options) {
+ this._options = _options;
}
getStatus() {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, "status"),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), "status"),
method: "GET",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -90,7 +90,7 @@ class ServerStatus {
}
_getAuthorizationHeader() {
return __awaiter(this, void 0, void 0, function* () {
- const bearer = yield core.Supplier.get(this.options.token);
+ const bearer = yield core.Supplier.get(this._options.token);
if (bearer != null) {
return `Bearer ${bearer}`;
}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/users/client/Client.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/users/client/Client.d.ts
index ee56811..dcb9e56 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/users/client/Client.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/resources/users/client/Client.d.ts
@@ -5,13 +5,13 @@ import * as core from "../../../../core";
import * as PromptonApi from "../../..";
export declare namespace Users {
interface Options {
- environment: string;
+ environment: core.Supplier;
token?: core.Supplier;
}
}
export declare class Users {
- protected readonly options: Users.Options;
- constructor(options: Users.Options);
+ protected readonly _options: Users.Options;
+ constructor(_options: Users.Options);
/**
* @throws {@link PromptonApi.BadRequestError}
* @throws {@link PromptonApi.UnauthorizedError}
@@ -22,9 +22,10 @@ export declare class Users {
/**
* @throws {@link PromptonApi.BadRequestError}
* @throws {@link PromptonApi.UnauthorizedError}
+ * @throws {@link PromptonApi.ConflictError}
* @throws {@link PromptonApi.UnprocessableEntityError}
*/
- addNewUser(request: PromptonApi.UserCreate): Promise;
+ addNewUser(request: PromptonApi.UserCreate): Promise;
/**
* @throws {@link PromptonApi.BadRequestError}
* @throws {@link PromptonApi.UnauthorizedError}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/users/client/Client.js b/clients/fern/api/node_sdk/prompton/api/resources/users/client/Client.js
index eba8836..abadac5 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/users/client/Client.js
+++ b/clients/fern/api/node_sdk/prompton/api/resources/users/client/Client.js
@@ -45,8 +45,8 @@ const url_join_1 = __importDefault(require("url-join"));
const serializers = __importStar(require("../../../../serialization"));
const errors = __importStar(require("../../../../errors"));
class Users {
- constructor(options) {
- this.options = options;
+ constructor(_options) {
+ this._options = _options;
}
/**
* @throws {@link PromptonApi.BadRequestError}
@@ -57,7 +57,7 @@ class Users {
getUsersList() {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, "users"),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), "users"),
method: "GET",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -109,12 +109,13 @@ class Users {
/**
* @throws {@link PromptonApi.BadRequestError}
* @throws {@link PromptonApi.UnauthorizedError}
+ * @throws {@link PromptonApi.ConflictError}
* @throws {@link PromptonApi.UnprocessableEntityError}
*/
addNewUser(request) {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, "users"),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), "users"),
method: "POST",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -125,7 +126,12 @@ class Users {
timeoutMs: 60000,
});
if (_response.ok) {
- return _response.body;
+ return yield serializers.DefaultPostResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ breadcrumbsPrefix: ["response"],
+ });
}
if (_response.error.reason === "status-code") {
switch (_response.error.statusCode) {
@@ -133,6 +139,8 @@ class Users {
throw new PromptonApi.BadRequestError(_response.error.body);
case 401:
throw new PromptonApi.UnauthorizedError(_response.error.body);
+ case 409:
+ throw new PromptonApi.ConflictError(_response.error.body);
case 422:
throw new PromptonApi.UnprocessableEntityError(_response.error.body);
default:
@@ -166,7 +174,7 @@ class Users {
getCurrentUser() {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, "users/me"),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), "users/me"),
method: "GET",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -224,7 +232,7 @@ class Users {
getUserById(id) {
return __awaiter(this, void 0, void 0, function* () {
const _response = yield core.fetcher({
- url: (0, url_join_1.default)(this.options.environment, `users/${id}`),
+ url: (0, url_join_1.default)(yield core.Supplier.get(this._options.environment), `users/${id}`),
method: "GET",
headers: {
Authorization: yield this._getAuthorizationHeader(),
@@ -275,7 +283,7 @@ class Users {
}
_getAuthorizationHeader() {
return __awaiter(this, void 0, void 0, function* () {
- const bearer = yield core.Supplier.get(this.options.token);
+ const bearer = yield core.Supplier.get(this._options.token);
if (bearer != null) {
return `Bearer ${bearer}`;
}
diff --git a/clients/fern/api/node_sdk/prompton/api/resources/users/client/requests/UserCreate.d.ts b/clients/fern/api/node_sdk/prompton/api/resources/users/client/requests/UserCreate.d.ts
index 4dba8eb..7882503 100644
--- a/clients/fern/api/node_sdk/prompton/api/resources/users/client/requests/UserCreate.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/resources/users/client/requests/UserCreate.d.ts
@@ -3,12 +3,12 @@
*/
import * as PromptonApi from "../../../..";
export interface UserCreate {
- /** `non-empty` */
+ /** `non-empty` */
fullName?: string;
disabled?: boolean;
role?: PromptonApi.UserRoles;
orgId: string;
email: string;
- /** `non-empty` */
+ /** `non-empty` */
plainPassword: string;
}
diff --git a/clients/fern/api/node_sdk/prompton/api/types/ChatGptChatCompletitionConfig.d.ts b/clients/fern/api/node_sdk/prompton/api/types/ChatGptChatCompletitionConfig.d.ts
index 702b705..b5cf331 100644
--- a/clients/fern/api/node_sdk/prompton/api/types/ChatGptChatCompletitionConfig.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/types/ChatGptChatCompletitionConfig.d.ts
@@ -3,7 +3,7 @@
*/
import * as PromptonApi from "..";
export interface ChatGptChatCompletitionConfig {
- /** `non-empty` */
+ /** `non-empty` */
model?: string;
temperature?: number;
topP?: number;
diff --git a/clients/fern/api/node_sdk/prompton/api/types/ChatGptChatCompletitionRequest.d.ts b/clients/fern/api/node_sdk/prompton/api/types/ChatGptChatCompletitionRequest.d.ts
index bb2a83f..f8c507a 100644
--- a/clients/fern/api/node_sdk/prompton/api/types/ChatGptChatCompletitionRequest.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/types/ChatGptChatCompletitionRequest.d.ts
@@ -3,7 +3,7 @@
*/
import * as PromptonApi from "..";
export interface ChatGptChatCompletitionRequest {
- /** `non-empty` */
+ /** `non-empty` */
model?: string;
temperature?: number;
topP?: number;
diff --git a/clients/fern/api/node_sdk/prompton/api/types/DefaultPostResponse.d.ts b/clients/fern/api/node_sdk/prompton/api/types/DefaultPostResponse.d.ts
new file mode 100644
index 0000000..3e97aec
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/types/DefaultPostResponse.d.ts
@@ -0,0 +1,10 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+/**
+ * Standard response for POST requests. Contains the id of the created item.
+ */
+export interface DefaultPostResponse {
+ /** The id of the created item */
+ id: string;
+}
diff --git a/clients/fern/api/node_sdk/prompton/api/types/DefaultPostResponse.js b/clients/fern/api/node_sdk/prompton/api/types/DefaultPostResponse.js
new file mode 100644
index 0000000..33e43da
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/types/DefaultPostResponse.js
@@ -0,0 +1,5 @@
+"use strict";
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/clients/fern/api/node_sdk/prompton/api/types/FeedbackRead.d.ts b/clients/fern/api/node_sdk/prompton/api/types/FeedbackRead.d.ts
new file mode 100644
index 0000000..31fb4ff
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/types/FeedbackRead.d.ts
@@ -0,0 +1,25 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+/**
+ * Base model for reading from MongoDB. Same as MongoBaseCreate but assumes all DB base fields are populated so generated clients doesn't requrie None checks
+ */
+export interface FeedbackRead {
+ id: string;
+ createdAt: string;
+ createdByUserId: string;
+ createdByOrgId: string;
+ /** The inference being rated */
+ inferenceId: string;
+ /** API consumers' end user id If feedback from end user otherwise null */
+ endUserId?: string;
+ /** Specifies which part of the output the feedback is about. Can be used when the inference has multiple sections which require separate feedback */
+ feedbackForPart?: string;
+ /** Any integer score. Rules are up to the API consumer. Can be null if it was flagging or note only */
+ score?: number;
+ /** Any string when inference was flagged. Can be null if it is scoring or note only */
+ flag?: string;
+ note?: string;
+ metadata?: Record;
+ promptVersionId?: string;
+}
diff --git a/clients/fern/api/node_sdk/prompton/api/types/FeedbackRead.js b/clients/fern/api/node_sdk/prompton/api/types/FeedbackRead.js
new file mode 100644
index 0000000..33e43da
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/types/FeedbackRead.js
@@ -0,0 +1,5 @@
+"use strict";
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/clients/fern/api/node_sdk/prompton/api/types/InferenceCreateByPromptId.d.ts b/clients/fern/api/node_sdk/prompton/api/types/InferenceCreateByPromptId.d.ts
new file mode 100644
index 0000000..31746d2
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/types/InferenceCreateByPromptId.d.ts
@@ -0,0 +1,21 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+/**
+ * Create inference by `prompt_id`. It can only be used if there is at least one 'Live' status prompt version for the provided `prompt_id`.
+ * If there are multiple prompt versions in Live status it will pick one randomly. Useful for split testing prompt versions.
+ * It stores all other `prompt_version_id`s in Live status at the time of the inference in `prompt_version_ids_considered` field.
+ */
+export interface InferenceCreateByPromptId {
+ /** The API consumer's internal user reference for metrics. It is also relayed to the provider as part of the request if the provider supports it (eg. OpenAI's user field). */
+ endUserId?: string;
+ /** The API consumer's source for metrics (e.g. AndroidApp etc). */
+ source?: string;
+ /** The API consumer's internal reference id to able to link references to their sessions. */
+ clientRefId?: string;
+ templateArgs?: Record;
+ metadata?: Record;
+ /** Provider request timout in seconds. If not provided, then Prompton API's default timeout for the provider will be used (90sec or `DEFAULT_OPENAI_REQUEST_TIMEOUT_SECONDS` env var if provided). */
+ requestTimeout?: number;
+ promptId: string;
+}
diff --git a/clients/fern/api/node_sdk/prompton/api/types/InferenceCreateByPromptId.js b/clients/fern/api/node_sdk/prompton/api/types/InferenceCreateByPromptId.js
new file mode 100644
index 0000000..33e43da
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/types/InferenceCreateByPromptId.js
@@ -0,0 +1,5 @@
+"use strict";
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/clients/fern/api/node_sdk/prompton/api/types/InferenceCreateByPromptVersionId.d.ts b/clients/fern/api/node_sdk/prompton/api/types/InferenceCreateByPromptVersionId.d.ts
new file mode 100644
index 0000000..74d1f39
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/types/InferenceCreateByPromptVersionId.d.ts
@@ -0,0 +1,16 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+export interface InferenceCreateByPromptVersionId {
+ /** The API consumer's internal user reference for metrics. It is also relayed to the provider as part of the request if the provider supports it (eg. OpenAI's user field). */
+ endUserId?: string;
+ /** The API consumer's source for metrics (e.g. AndroidApp etc). */
+ source?: string;
+ /** The API consumer's internal reference id to able to link references to their sessions. */
+ clientRefId?: string;
+ templateArgs?: Record;
+ metadata?: Record;
+ /** Provider request timout in seconds. If not provided, then Prompton API's default timeout for the provider will be used (90sec or `DEFAULT_OPENAI_REQUEST_TIMEOUT_SECONDS` env var if provided). */
+ requestTimeout?: number;
+ promptVersionId: string;
+}
diff --git a/clients/fern/api/node_sdk/prompton/api/types/InferenceCreateByPromptVersionId.js b/clients/fern/api/node_sdk/prompton/api/types/InferenceCreateByPromptVersionId.js
new file mode 100644
index 0000000..33e43da
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/types/InferenceCreateByPromptVersionId.js
@@ -0,0 +1,5 @@
+"use strict";
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/clients/fern/api/node_sdk/prompton/api/types/InferenceError.d.ts b/clients/fern/api/node_sdk/prompton/api/types/InferenceError.d.ts
new file mode 100644
index 0000000..6e2c5ab
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/types/InferenceError.d.ts
@@ -0,0 +1,8 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+export interface InferenceError {
+ errorClass: string;
+ message: string;
+ details?: unknown;
+}
diff --git a/clients/fern/api/node_sdk/prompton/api/types/InferenceError.js b/clients/fern/api/node_sdk/prompton/api/types/InferenceError.js
new file mode 100644
index 0000000..33e43da
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/types/InferenceError.js
@@ -0,0 +1,5 @@
+"use strict";
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/clients/fern/api/node_sdk/prompton/api/types/InferenceRead.d.ts b/clients/fern/api/node_sdk/prompton/api/types/InferenceRead.d.ts
index d8587b4..e6acdf4 100644
--- a/clients/fern/api/node_sdk/prompton/api/types/InferenceRead.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/types/InferenceRead.d.ts
@@ -2,22 +2,29 @@
* This file was auto-generated by Fern from our API Definition.
*/
import * as PromptonApi from "..";
+/**
+ * Base model for reading from MongoDB. Same as MongoBaseCreate but assumes all DB base fields are populated so generated clients doesn't requrie None checks
+ */
export interface InferenceRead {
- id?: string;
- createdAt?: string;
- createdByUserId?: string;
- createdByOrgId?: string;
- /** `non-empty` */
- endUserId: string;
- /** `non-empty` */
- source: string;
- templateArgs?: Record;
+ id: string;
+ createdAt: string;
+ createdByUserId: string;
+ createdByOrgId: string;
+ /** The API consumer's internal user reference for metrics. It is also relayed to the provider as part of the request if the provider supports it (eg. OpenAI's user field). */
+ endUserId?: string;
+ /** The API consumer's source for metrics (e.g. AndroidApp etc). */
+ source?: string;
+ /** The API consumer's internal reference id to able to link references to their sessions. */
+ clientRefId?: string;
+ templateArgs: Record;
metadata?: Record;
+ /** Provider request timout in seconds. If not provided, then Prompton API's default timeout for the provider will be used (90sec or `DEFAULT_OPENAI_REQUEST_TIMEOUT_SECONDS` env var if provided). */
requestTimeout?: number;
promptVersionId: string;
+ promptVersionIdsConsidered: string[];
promptId: string;
- promptVersionName?: string;
- status?: PromptonApi.InferenceResponseStatus;
- request?: PromptonApi.InferenceRequestData;
+ promptVersionName: string;
+ status: PromptonApi.InferenceResponseStatus;
+ request: PromptonApi.InferenceRequestData;
response?: PromptonApi.InferenceReadResponse;
}
diff --git a/clients/fern/api/node_sdk/prompton/api/types/InferenceResponseData.d.ts b/clients/fern/api/node_sdk/prompton/api/types/InferenceResponseData.d.ts
index 1a1d687..d20bcc3 100644
--- a/clients/fern/api/node_sdk/prompton/api/types/InferenceResponseData.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/types/InferenceResponseData.d.ts
@@ -7,7 +7,6 @@ export interface InferenceResponseData {
completitionDurationSeconds?: number;
isClientConnectedAtFinish?: boolean;
isError?: boolean;
- firstMessage: PromptonApi.ChatGptMessage;
tokenUsage: PromptonApi.ChatGptTokenUsage;
rawResponse: PromptonApi.ChatGptChatCompletitionResponse;
}
diff --git a/clients/fern/api/node_sdk/prompton/api/types/InferenceResponseError.d.ts b/clients/fern/api/node_sdk/prompton/api/types/InferenceResponseError.d.ts
index 128649a..e6b6f76 100644
--- a/clients/fern/api/node_sdk/prompton/api/types/InferenceResponseError.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/types/InferenceResponseError.d.ts
@@ -1,10 +1,11 @@
/**
* This file was auto-generated by Fern from our API Definition.
*/
+import * as PromptonApi from "..";
export interface InferenceResponseError {
completedAt?: string;
completitionDurationSeconds?: number;
isClientConnectedAtFinish?: boolean;
isError?: boolean;
- error?: unknown;
+ error: PromptonApi.InferenceError;
}
diff --git a/clients/fern/api/node_sdk/prompton/api/types/NewInferenceRequest.d.ts b/clients/fern/api/node_sdk/prompton/api/types/NewInferenceRequest.d.ts
new file mode 100644
index 0000000..e83d714
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/types/NewInferenceRequest.d.ts
@@ -0,0 +1,5 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+import * as PromptonApi from "..";
+export declare type NewInferenceRequest = PromptonApi.InferenceCreateByPromptVersionId | PromptonApi.InferenceCreateByPromptId;
diff --git a/clients/fern/api/node_sdk/prompton/api/types/NewInferenceRequest.js b/clients/fern/api/node_sdk/prompton/api/types/NewInferenceRequest.js
new file mode 100644
index 0000000..33e43da
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/api/types/NewInferenceRequest.js
@@ -0,0 +1,5 @@
+"use strict";
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/clients/fern/api/node_sdk/prompton/api/types/OrgRead.d.ts b/clients/fern/api/node_sdk/prompton/api/types/OrgRead.d.ts
index a901193..5df6786 100644
--- a/clients/fern/api/node_sdk/prompton/api/types/OrgRead.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/types/OrgRead.d.ts
@@ -1,12 +1,16 @@
/**
* This file was auto-generated by Fern from our API Definition.
*/
+/**
+ * Base model for reading from MongoDB. Same as MongoBaseCreate but assumes all DB base fields are populated so generated clients doesn't requrie None checks
+ */
export interface OrgRead {
- id?: string;
- createdAt?: string;
- createdByUserId?: string;
- createdByOrgId?: string;
- /** `non-empty` */
+ id: string;
+ createdAt: string;
+ createdByUserId: string;
+ createdByOrgId: string;
name: string;
+ /** APEX domain for oauth single sign on. Anyone with an email address ending in this domain will be able to register to the org after google account sign in. Only Google OAuth is supported for now. */
+ oauthDomain?: string;
accessKeys?: Record;
}
diff --git a/clients/fern/api/node_sdk/prompton/api/types/PromptRead.d.ts b/clients/fern/api/node_sdk/prompton/api/types/PromptRead.d.ts
index 868b446..fd711c2 100644
--- a/clients/fern/api/node_sdk/prompton/api/types/PromptRead.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/types/PromptRead.d.ts
@@ -2,13 +2,16 @@
* This file was auto-generated by Fern from our API Definition.
*/
import * as PromptonApi from "..";
+/**
+ * Base model for reading from MongoDB. Same as MongoBaseCreate but assumes all DB base fields are populated so generated clients doesn't requrie None checks
+ */
export interface PromptRead {
- id?: string;
- createdAt?: string;
- createdByUserId?: string;
- createdByOrgId?: string;
- status?: PromptonApi.PromptStatus;
- /** `non-empty` */
+ id: string;
+ createdAt: string;
+ createdByUserId: string;
+ createdByOrgId: string;
+ status: PromptonApi.PromptStatus;
+ /** `non-empty` */
name: string;
description?: string;
}
diff --git a/clients/fern/api/node_sdk/prompton/api/types/PromptVersionProviders.d.ts b/clients/fern/api/node_sdk/prompton/api/types/PromptVersionProviders.d.ts
index b1eab57..4029c69 100644
--- a/clients/fern/api/node_sdk/prompton/api/types/PromptVersionProviders.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/types/PromptVersionProviders.d.ts
@@ -1,10 +1,4 @@
/**
* This file was auto-generated by Fern from our API Definition.
*/
-/**
- * Currently only OpenAI is supported
- */
export declare type PromptVersionProviders = "OpenAI";
-export declare const PromptVersionProviders: {
- readonly OpenAi: "OpenAI";
-};
diff --git a/clients/fern/api/node_sdk/prompton/api/types/PromptVersionProviders.js b/clients/fern/api/node_sdk/prompton/api/types/PromptVersionProviders.js
index 4d62aa9..33e43da 100644
--- a/clients/fern/api/node_sdk/prompton/api/types/PromptVersionProviders.js
+++ b/clients/fern/api/node_sdk/prompton/api/types/PromptVersionProviders.js
@@ -3,7 +3,3 @@
* This file was auto-generated by Fern from our API Definition.
*/
Object.defineProperty(exports, "__esModule", { value: true });
-exports.PromptVersionProviders = void 0;
-exports.PromptVersionProviders = {
- OpenAi: "OpenAI",
-};
diff --git a/clients/fern/api/node_sdk/prompton/api/types/PromptVersionRead.d.ts b/clients/fern/api/node_sdk/prompton/api/types/PromptVersionRead.d.ts
index d441689..c785f74 100644
--- a/clients/fern/api/node_sdk/prompton/api/types/PromptVersionRead.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/types/PromptVersionRead.d.ts
@@ -2,18 +2,22 @@
* This file was auto-generated by Fern from our API Definition.
*/
import * as PromptonApi from "..";
+/**
+ * Base model for reading from MongoDB. Same as MongoBaseCreate but assumes all DB base fields are populated so generated clients doesn't requrie None checks
+ */
export interface PromptVersionRead {
- id?: string;
- createdAt?: string;
- createdByUserId?: string;
- createdByOrgId?: string;
- status?: PromptonApi.PromptVersionStatus;
- provider?: PromptonApi.PromptVersionProviders;
- /** `non-empty` */
+ id: string;
+ createdAt: string;
+ createdByUserId: string;
+ createdByOrgId: string;
+ status: PromptonApi.PromptVersionStatus;
+ provider: PromptonApi.PromptVersionProviders;
+ /** `non-empty` */
name: string;
description?: string;
promptId: string;
- template?: PromptonApi.ChatGptMessage[];
+ template: PromptonApi.ChatGptMessage[];
modelConfig?: PromptonApi.ChatGptChatCompletitionConfig;
- templateArgNames?: string[];
+ /** List of args in the template - populated by server at PATHC and POST */
+ templateArgNames: string[];
}
diff --git a/clients/fern/api/node_sdk/prompton/api/types/UserRead.d.ts b/clients/fern/api/node_sdk/prompton/api/types/UserRead.d.ts
index f2a1ab9..5a8508d 100644
--- a/clients/fern/api/node_sdk/prompton/api/types/UserRead.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/types/UserRead.d.ts
@@ -2,14 +2,17 @@
* This file was auto-generated by Fern from our API Definition.
*/
import * as PromptonApi from "..";
+/**
+ * Base model for reading from MongoDB. Same as MongoBaseCreate but assumes all DB base fields are populated so generated clients doesn't requrie None checks
+ */
export interface UserRead {
- id?: string;
- createdAt?: string;
- createdByUserId?: string;
- createdByOrgId?: string;
- /** `non-empty` */
+ id: string;
+ createdAt: string;
+ createdByUserId: string;
+ createdByOrgId: string;
+ /** `non-empty` */
fullName?: string;
- disabled?: boolean;
+ disabled: boolean;
role?: PromptonApi.UserRoles;
orgId: string;
email: string;
diff --git a/clients/fern/api/node_sdk/prompton/api/types/UserRoles.d.ts b/clients/fern/api/node_sdk/prompton/api/types/UserRoles.d.ts
index 30b3bcd..c00cabe 100644
--- a/clients/fern/api/node_sdk/prompton/api/types/UserRoles.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/types/UserRoles.d.ts
@@ -4,9 +4,10 @@
/**
* An enumeration.
*/
-export declare type UserRoles = "Basic" | "OrgAdmin" | "SuperAdmin";
+export declare type UserRoles = "Basic" | "PromptAdmin" | "OrgAdmin" | "SuperAdmin";
export declare const UserRoles: {
readonly Basic: "Basic";
+ readonly PromptAdmin: "PromptAdmin";
readonly OrgAdmin: "OrgAdmin";
readonly SuperAdmin: "SuperAdmin";
};
diff --git a/clients/fern/api/node_sdk/prompton/api/types/UserRoles.js b/clients/fern/api/node_sdk/prompton/api/types/UserRoles.js
index 21f3466..02652e3 100644
--- a/clients/fern/api/node_sdk/prompton/api/types/UserRoles.js
+++ b/clients/fern/api/node_sdk/prompton/api/types/UserRoles.js
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.UserRoles = void 0;
exports.UserRoles = {
Basic: "Basic",
+ PromptAdmin: "PromptAdmin",
OrgAdmin: "OrgAdmin",
SuperAdmin: "SuperAdmin",
};
diff --git a/clients/fern/api/node_sdk/prompton/api/types/index.d.ts b/clients/fern/api/node_sdk/prompton/api/types/index.d.ts
index 1a78a3a..957b94b 100644
--- a/clients/fern/api/node_sdk/prompton/api/types/index.d.ts
+++ b/clients/fern/api/node_sdk/prompton/api/types/index.d.ts
@@ -1,3 +1,4 @@
+export * from "./NewInferenceRequest";
export * from "./ApiStatusResponse";
export * from "./BodyGetAccessTokenExtendedTokenPost";
export * from "./ChatGptChatCompletitionConfig";
@@ -10,7 +11,12 @@ export * from "./ChatGptMessage";
export * from "./ChatGptRole";
export * from "./ChatGptTokenUsage";
export * from "./DbStatus";
+export * from "./DefaultPostResponse";
+export * from "./FeedbackRead";
export * from "./HttpValidationError";
+export * from "./InferenceCreateByPromptId";
+export * from "./InferenceCreateByPromptVersionId";
+export * from "./InferenceError";
export * from "./InferencePostResponse";
export * from "./InferencePostResponseResponse";
export * from "./InferenceRead";
diff --git a/clients/fern/api/node_sdk/prompton/api/types/index.js b/clients/fern/api/node_sdk/prompton/api/types/index.js
index 09423ba..548d95d 100644
--- a/clients/fern/api/node_sdk/prompton/api/types/index.js
+++ b/clients/fern/api/node_sdk/prompton/api/types/index.js
@@ -14,6 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
+__exportStar(require("./NewInferenceRequest"), exports);
__exportStar(require("./ApiStatusResponse"), exports);
__exportStar(require("./BodyGetAccessTokenExtendedTokenPost"), exports);
__exportStar(require("./ChatGptChatCompletitionConfig"), exports);
@@ -26,7 +27,12 @@ __exportStar(require("./ChatGptMessage"), exports);
__exportStar(require("./ChatGptRole"), exports);
__exportStar(require("./ChatGptTokenUsage"), exports);
__exportStar(require("./DbStatus"), exports);
+__exportStar(require("./DefaultPostResponse"), exports);
+__exportStar(require("./FeedbackRead"), exports);
__exportStar(require("./HttpValidationError"), exports);
+__exportStar(require("./InferenceCreateByPromptId"), exports);
+__exportStar(require("./InferenceCreateByPromptVersionId"), exports);
+__exportStar(require("./InferenceError"), exports);
__exportStar(require("./InferencePostResponse"), exports);
__exportStar(require("./InferencePostResponseResponse"), exports);
__exportStar(require("./InferenceRead"), exports);
diff --git a/clients/fern/api/node_sdk/prompton/core/fetcher/Fetcher.d.ts b/clients/fern/api/node_sdk/prompton/core/fetcher/Fetcher.d.ts
index 639201f..b7a55e1 100644
--- a/clients/fern/api/node_sdk/prompton/core/fetcher/Fetcher.d.ts
+++ b/clients/fern/api/node_sdk/prompton/core/fetcher/Fetcher.d.ts
@@ -1,14 +1,7 @@
import { default as URLSearchParams } from "@ungap/url-search-params";
-import { AxiosAdapter } from "axios";
+import { AxiosAdapter, AxiosProgressEvent } from "axios";
import { APIResponse } from "./APIResponse";
-export interface FetchFunction {
- (args: Fetcher.Args & {
- responseType?: "json";
- }): Promise>;
- (args: Fetcher.Args & {
- responseType: "blob";
- }): Promise>;
-}
+export declare type FetchFunction = (args: Fetcher.Args) => Promise>;
export declare namespace Fetcher {
interface Args {
url: string;
@@ -21,7 +14,7 @@ export declare namespace Fetcher {
withCredentials?: boolean;
responseType?: "json" | "blob";
adapter?: AxiosAdapter;
- onUploadProgress?: (event: ProgressEvent) => void;
+ onUploadProgress?: (event: AxiosProgressEvent) => void;
}
type Error = FailedStatusCodeError | NonJsonError | TimeoutError | UnknownError;
interface FailedStatusCodeError {
diff --git a/clients/fern/api/node_sdk/prompton/core/fetcher/Fetcher.js b/clients/fern/api/node_sdk/prompton/core/fetcher/Fetcher.js
index fbd6e5c..6ae10ca 100644
--- a/clients/fern/api/node_sdk/prompton/core/fetcher/Fetcher.js
+++ b/clients/fern/api/node_sdk/prompton/core/fetcher/Fetcher.js
@@ -49,7 +49,10 @@ function fetcherImpl(args) {
responseType: (_a = args.responseType) !== null && _a !== void 0 ? _a : "json",
});
let body;
- if (response.data != null && response.data.length > 0) {
+ if (args.responseType === "blob") {
+ body = response.data;
+ }
+ else if (response.data != null && response.data.length > 0) {
try {
body = (_b = JSON.parse(response.data)) !== null && _b !== void 0 ? _b : undefined;
}
@@ -64,10 +67,10 @@ function fetcherImpl(args) {
};
}
}
- if (response.status >= 200 && response.status < 300) {
+ if (response.status >= 200 && response.status < 400) {
return {
ok: true,
- body,
+ body: body,
};
}
else {
diff --git a/clients/fern/api/node_sdk/prompton/core/index.d.ts b/clients/fern/api/node_sdk/prompton/core/index.d.ts
index 31aa898..82528c9 100644
--- a/clients/fern/api/node_sdk/prompton/core/index.d.ts
+++ b/clients/fern/api/node_sdk/prompton/core/index.d.ts
@@ -1,3 +1,3 @@
export * as serialization from "./schemas";
-export * from "./auth";
export * from "./fetcher";
+export * from "./auth";
diff --git a/clients/fern/api/node_sdk/prompton/core/index.js b/clients/fern/api/node_sdk/prompton/core/index.js
index 2f6b652..41b127c 100644
--- a/clients/fern/api/node_sdk/prompton/core/index.js
+++ b/clients/fern/api/node_sdk/prompton/core/index.js
@@ -28,5 +28,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
Object.defineProperty(exports, "__esModule", { value: true });
exports.serialization = void 0;
exports.serialization = __importStar(require("./schemas"));
-__exportStar(require("./auth"), exports);
__exportStar(require("./fetcher"), exports);
+__exportStar(require("./auth"), exports);
diff --git a/clients/fern/api/node_sdk/prompton/errors/PromptonApiError.js b/clients/fern/api/node_sdk/prompton/errors/PromptonApiError.js
index 90e8067..37e308b 100644
--- a/clients/fern/api/node_sdk/prompton/errors/PromptonApiError.js
+++ b/clients/fern/api/node_sdk/prompton/errors/PromptonApiError.js
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.PromptonApiError = void 0;
class PromptonApiError extends Error {
constructor({ message, statusCode, body }) {
- super(message);
+ super(buildMessage({ message, statusCode, body }));
Object.setPrototypeOf(this, PromptonApiError.prototype);
if (statusCode != null) {
this.statusCode = statusCode;
@@ -17,3 +17,16 @@ class PromptonApiError extends Error {
}
}
exports.PromptonApiError = PromptonApiError;
+function buildMessage({ message, statusCode, body, }) {
+ let lines = [];
+ if (message != null) {
+ lines.push(message);
+ }
+ if (statusCode != null) {
+ lines.push(`Status code: ${statusCode.toString()}`);
+ }
+ if (body != null) {
+ lines.push(`Body: ${JSON.stringify(body, undefined, 2)}`);
+ }
+ return lines.join("\n");
+}
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/getFeedbacksList.d.ts b/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/getFeedbacksList.d.ts
new file mode 100644
index 0000000..32b7b86
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/getFeedbacksList.d.ts
@@ -0,0 +1,10 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+import * as serializers from "../../..";
+import * as PromptonApi from "../../../../api";
+import * as core from "../../../../core";
+export declare const Response: core.serialization.Schema;
+export declare namespace Response {
+ type Raw = serializers.FeedbackRead.Raw[];
+}
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/getFeedbacksList.js b/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/getFeedbacksList.js
new file mode 100644
index 0000000..1b46974
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/getFeedbacksList.js
@@ -0,0 +1,40 @@
+"use strict";
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Response = void 0;
+const core = __importStar(require("../../../../core"));
+exports.Response = core.serialization.list(core.serialization.lazyObject(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("../../..")))).FeedbackRead; })));
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/index.d.ts b/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/index.d.ts
new file mode 100644
index 0000000..2a35470
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/index.d.ts
@@ -0,0 +1,2 @@
+export * as getFeedbacksList from "./getFeedbacksList";
+export * from "./requests";
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/index.js b/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/index.js
new file mode 100644
index 0000000..f5d5406
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/index.js
@@ -0,0 +1,31 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.getFeedbacksList = void 0;
+exports.getFeedbacksList = __importStar(require("./getFeedbacksList"));
+__exportStar(require("./requests"), exports);
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/requests/FeedbackCreate.d.ts b/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/requests/FeedbackCreate.d.ts
new file mode 100644
index 0000000..d6f0f2e
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/requests/FeedbackCreate.d.ts
@@ -0,0 +1,18 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+import * as serializers from "../../../..";
+import * as PromptonApi from "../../../../../api";
+import * as core from "../../../../../core";
+export declare const FeedbackCreate: core.serialization.Schema;
+export declare namespace FeedbackCreate {
+ interface Raw {
+ inference_id: string;
+ end_user_id?: string | null;
+ feedback_for_part?: string | null;
+ score?: number | null;
+ flag?: string | null;
+ note?: string | null;
+ metadata?: Record | null;
+ }
+}
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/requests/FeedbackCreate.js b/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/requests/FeedbackCreate.js
new file mode 100644
index 0000000..a002e0a
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/requests/FeedbackCreate.js
@@ -0,0 +1,39 @@
+"use strict";
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.FeedbackCreate = void 0;
+const core = __importStar(require("../../../../../core"));
+exports.FeedbackCreate = core.serialization.object({
+ inferenceId: core.serialization.property("inference_id", core.serialization.string()),
+ endUserId: core.serialization.property("end_user_id", core.serialization.string().optional()),
+ feedbackForPart: core.serialization.property("feedback_for_part", core.serialization.string().optional()),
+ score: core.serialization.number().optional(),
+ flag: core.serialization.string().optional(),
+ note: core.serialization.string().optional(),
+ metadata: core.serialization.record(core.serialization.string(), core.serialization.unknown()).optional(),
+});
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/requests/index.d.ts b/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/requests/index.d.ts
new file mode 100644
index 0000000..dfbe769
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/requests/index.d.ts
@@ -0,0 +1 @@
+export { FeedbackCreate } from "./FeedbackCreate";
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/requests/index.js b/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/requests/index.js
new file mode 100644
index 0000000..7387ac1
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/client/requests/index.js
@@ -0,0 +1,5 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.FeedbackCreate = void 0;
+var FeedbackCreate_1 = require("./FeedbackCreate");
+Object.defineProperty(exports, "FeedbackCreate", { enumerable: true, get: function () { return FeedbackCreate_1.FeedbackCreate; } });
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/index.d.ts b/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/index.d.ts
new file mode 100644
index 0000000..5ec7692
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/index.d.ts
@@ -0,0 +1 @@
+export * from "./client";
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/index.js b/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/index.js
new file mode 100644
index 0000000..352398a
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/feedbacks/index.js
@@ -0,0 +1,17 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+__exportStar(require("./client"), exports);
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/index.d.ts b/clients/fern/api/node_sdk/prompton/serialization/resources/index.d.ts
index 672f213..7af8758 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/resources/index.d.ts
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/index.d.ts
@@ -3,10 +3,11 @@ export * as promptVersions from "./promptVersions";
export * as inferences from "./inferences";
export * as orgs from "./orgs";
export * as users from "./users";
+export * as feedbacks from "./feedbacks";
export * as authentication from "./authentication";
export * from "./authentication/client/requests";
export * from "./prompts/client/requests";
export * from "./promptVersions/client/requests";
-export * from "./inferences/client/requests";
export * from "./orgs/client/requests";
export * from "./users/client/requests";
+export * from "./feedbacks/client/requests";
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/index.js b/clients/fern/api/node_sdk/prompton/serialization/resources/index.js
index 9ec5b67..c33ba76 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/resources/index.js
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/index.js
@@ -26,16 +26,17 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
-exports.authentication = exports.users = exports.orgs = exports.inferences = exports.promptVersions = exports.prompts = void 0;
+exports.authentication = exports.feedbacks = exports.users = exports.orgs = exports.inferences = exports.promptVersions = exports.prompts = void 0;
exports.prompts = __importStar(require("./prompts"));
exports.promptVersions = __importStar(require("./promptVersions"));
exports.inferences = __importStar(require("./inferences"));
exports.orgs = __importStar(require("./orgs"));
exports.users = __importStar(require("./users"));
+exports.feedbacks = __importStar(require("./feedbacks"));
exports.authentication = __importStar(require("./authentication"));
__exportStar(require("./authentication/client/requests"), exports);
__exportStar(require("./prompts/client/requests"), exports);
__exportStar(require("./promptVersions/client/requests"), exports);
-__exportStar(require("./inferences/client/requests"), exports);
__exportStar(require("./orgs/client/requests"), exports);
__exportStar(require("./users/client/requests"), exports);
+__exportStar(require("./feedbacks/client/requests"), exports);
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/inferences/client/index.d.ts b/clients/fern/api/node_sdk/prompton/serialization/resources/inferences/client/index.d.ts
index 92b11f6..be3cc2f 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/resources/inferences/client/index.d.ts
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/inferences/client/index.d.ts
@@ -1,2 +1 @@
export * as getInferencesList from "./getInferencesList";
-export * from "./requests";
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/inferences/client/index.js b/clients/fern/api/node_sdk/prompton/serialization/resources/inferences/client/index.js
index 5b2fadb..90d45d4 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/resources/inferences/client/index.js
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/inferences/client/index.js
@@ -22,10 +22,6 @@ var __importStar = (this && this.__importStar) || function (mod) {
__setModuleDefault(result, mod);
return result;
};
-var __exportStar = (this && this.__exportStar) || function(m, exports) {
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
-};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getInferencesList = void 0;
exports.getInferencesList = __importStar(require("./getInferencesList"));
-__exportStar(require("./requests"), exports);
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/inferences/client/requests/InferenceCreate.d.ts b/clients/fern/api/node_sdk/prompton/serialization/resources/inferences/client/requests/InferenceCreate.d.ts
deleted file mode 100644
index 820f488..0000000
--- a/clients/fern/api/node_sdk/prompton/serialization/resources/inferences/client/requests/InferenceCreate.d.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * This file was auto-generated by Fern from our API Definition.
- */
-import * as serializers from "../../../..";
-import * as PromptonApi from "../../../../../api";
-import * as core from "../../../../../core";
-export declare const InferenceCreate: core.serialization.Schema;
-export declare namespace InferenceCreate {
- interface Raw {
- end_user_id: string;
- source: string;
- template_args?: Record | null;
- metadata?: Record | null;
- request_timeout?: number | null;
- prompt_version_id: string;
- }
-}
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/inferences/client/requests/index.d.ts b/clients/fern/api/node_sdk/prompton/serialization/resources/inferences/client/requests/index.d.ts
deleted file mode 100644
index e852632..0000000
--- a/clients/fern/api/node_sdk/prompton/serialization/resources/inferences/client/requests/index.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { InferenceCreate } from "./InferenceCreate";
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/inferences/client/requests/index.js b/clients/fern/api/node_sdk/prompton/serialization/resources/inferences/client/requests/index.js
deleted file mode 100644
index 7e7c2b5..0000000
--- a/clients/fern/api/node_sdk/prompton/serialization/resources/inferences/client/requests/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.InferenceCreate = void 0;
-var InferenceCreate_1 = require("./InferenceCreate");
-Object.defineProperty(exports, "InferenceCreate", { enumerable: true, get: function () { return InferenceCreate_1.InferenceCreate; } });
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/getOrgList.d.ts b/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/getOrgsList.d.ts
similarity index 85%
rename from clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/getOrgList.d.ts
rename to clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/getOrgsList.d.ts
index a97d068..b2b41e9 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/getOrgList.d.ts
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/getOrgsList.d.ts
@@ -4,7 +4,7 @@
import * as serializers from "../../..";
import * as PromptonApi from "../../../../api";
import * as core from "../../../../core";
-export declare const Response: core.serialization.Schema;
+export declare const Response: core.serialization.Schema;
export declare namespace Response {
type Raw = serializers.OrgRead.Raw[];
}
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/getOrgList.js b/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/getOrgsList.js
similarity index 100%
rename from clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/getOrgList.js
rename to clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/getOrgsList.js
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/index.d.ts b/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/index.d.ts
index 4597061..d8a974c 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/index.d.ts
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/index.d.ts
@@ -1,2 +1,2 @@
-export * as getOrgList from "./getOrgList";
+export * as getOrgsList from "./getOrgsList";
export * from "./requests";
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/index.js b/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/index.js
index d7b04b8..5a7519e 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/index.js
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/index.js
@@ -26,6 +26,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
-exports.getOrgList = void 0;
-exports.getOrgList = __importStar(require("./getOrgList"));
+exports.getOrgsList = void 0;
+exports.getOrgsList = __importStar(require("./getOrgsList"));
__exportStar(require("./requests"), exports);
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/requests/OrgCreate.d.ts b/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/requests/OrgCreate.d.ts
index b43e52b..d0912b1 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/requests/OrgCreate.d.ts
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/requests/OrgCreate.d.ts
@@ -9,5 +9,6 @@ export declare namespace OrgCreate {
interface Raw {
name: string;
access_keys?: Record | null;
+ oauth_domain?: string | null;
}
}
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/requests/OrgCreate.js b/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/requests/OrgCreate.js
index eb5eddb..540212c 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/requests/OrgCreate.js
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/requests/OrgCreate.js
@@ -31,4 +31,5 @@ const core = __importStar(require("../../../../../core"));
exports.OrgCreate = core.serialization.object({
name: core.serialization.string(),
accessKeys: core.serialization.property("access_keys", core.serialization.record(core.serialization.string(), core.serialization.string()).optional()),
+ oauthDomain: core.serialization.property("oauth_domain", core.serialization.string().optional()),
});
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/requests/OrgUpdate.d.ts b/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/requests/OrgUpdate.d.ts
index 9ad4d42..f6c4f06 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/requests/OrgUpdate.d.ts
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/requests/OrgUpdate.d.ts
@@ -9,5 +9,6 @@ export declare namespace OrgUpdate {
interface Raw {
name?: string | null;
access_keys?: Record | null;
+ oauth_domain?: string | null;
}
}
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/requests/OrgUpdate.js b/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/requests/OrgUpdate.js
index 1231170..33348d5 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/requests/OrgUpdate.js
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/orgs/client/requests/OrgUpdate.js
@@ -31,4 +31,5 @@ const core = __importStar(require("../../../../../core"));
exports.OrgUpdate = core.serialization.object({
name: core.serialization.string().optional(),
accessKeys: core.serialization.property("access_keys", core.serialization.record(core.serialization.string(), core.serialization.string()).optional()),
+ oauthDomain: core.serialization.property("oauth_domain", core.serialization.string().optional()),
});
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/prompts/client/getPromptList.d.ts b/clients/fern/api/node_sdk/prompton/serialization/resources/prompts/client/getPromptsList.d.ts
similarity index 83%
rename from clients/fern/api/node_sdk/prompton/serialization/resources/prompts/client/getPromptList.d.ts
rename to clients/fern/api/node_sdk/prompton/serialization/resources/prompts/client/getPromptsList.d.ts
index 76d6d14..3e7464f 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/resources/prompts/client/getPromptList.d.ts
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/prompts/client/getPromptsList.d.ts
@@ -4,7 +4,7 @@
import * as serializers from "../../..";
import * as PromptonApi from "../../../../api";
import * as core from "../../../../core";
-export declare const Response: core.serialization.Schema;
+export declare const Response: core.serialization.Schema;
export declare namespace Response {
type Raw = serializers.PromptRead.Raw[];
}
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/prompts/client/getPromptList.js b/clients/fern/api/node_sdk/prompton/serialization/resources/prompts/client/getPromptsList.js
similarity index 100%
rename from clients/fern/api/node_sdk/prompton/serialization/resources/prompts/client/getPromptList.js
rename to clients/fern/api/node_sdk/prompton/serialization/resources/prompts/client/getPromptsList.js
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/prompts/client/index.d.ts b/clients/fern/api/node_sdk/prompton/serialization/resources/prompts/client/index.d.ts
index 235ebf7..204f7a8 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/resources/prompts/client/index.d.ts
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/prompts/client/index.d.ts
@@ -1,2 +1,2 @@
-export * as getPromptList from "./getPromptList";
+export * as getPromptsList from "./getPromptsList";
export * from "./requests";
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/prompts/client/index.js b/clients/fern/api/node_sdk/prompton/serialization/resources/prompts/client/index.js
index 828803a..4721c3e 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/resources/prompts/client/index.js
+++ b/clients/fern/api/node_sdk/prompton/serialization/resources/prompts/client/index.js
@@ -26,6 +26,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
-exports.getPromptList = void 0;
-exports.getPromptList = __importStar(require("./getPromptList"));
+exports.getPromptsList = void 0;
+exports.getPromptsList = __importStar(require("./getPromptsList"));
__exportStar(require("./requests"), exports);
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/DefaultPostResponse.d.ts b/clients/fern/api/node_sdk/prompton/serialization/types/DefaultPostResponse.d.ts
new file mode 100644
index 0000000..c1c43a5
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/DefaultPostResponse.d.ts
@@ -0,0 +1,12 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+import * as serializers from "..";
+import * as PromptonApi from "../../api";
+import * as core from "../../core";
+export declare const DefaultPostResponse: core.serialization.ObjectSchema;
+export declare namespace DefaultPostResponse {
+ interface Raw {
+ id: string;
+ }
+}
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/DefaultPostResponse.js b/clients/fern/api/node_sdk/prompton/serialization/types/DefaultPostResponse.js
new file mode 100644
index 0000000..be9fabd
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/DefaultPostResponse.js
@@ -0,0 +1,33 @@
+"use strict";
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.DefaultPostResponse = void 0;
+const core = __importStar(require("../../core"));
+exports.DefaultPostResponse = core.serialization.object({
+ id: core.serialization.string(),
+});
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/FeedbackRead.d.ts b/clients/fern/api/node_sdk/prompton/serialization/types/FeedbackRead.d.ts
new file mode 100644
index 0000000..92e10ae
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/FeedbackRead.d.ts
@@ -0,0 +1,23 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+import * as serializers from "..";
+import * as PromptonApi from "../../api";
+import * as core from "../../core";
+export declare const FeedbackRead: core.serialization.ObjectSchema;
+export declare namespace FeedbackRead {
+ interface Raw {
+ _id: string;
+ created_at: string;
+ created_by_user_id: string;
+ created_by_org_id: string;
+ inference_id: string;
+ end_user_id?: string | null;
+ feedback_for_part?: string | null;
+ score?: number | null;
+ flag?: string | null;
+ note?: string | null;
+ metadata?: Record | null;
+ prompt_version_id?: string | null;
+ }
+}
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/FeedbackRead.js b/clients/fern/api/node_sdk/prompton/serialization/types/FeedbackRead.js
new file mode 100644
index 0000000..a6db72b
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/FeedbackRead.js
@@ -0,0 +1,44 @@
+"use strict";
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.FeedbackRead = void 0;
+const core = __importStar(require("../../core"));
+exports.FeedbackRead = core.serialization.object({
+ id: core.serialization.property("_id", core.serialization.string()),
+ createdAt: core.serialization.property("created_at", core.serialization.string()),
+ createdByUserId: core.serialization.property("created_by_user_id", core.serialization.string()),
+ createdByOrgId: core.serialization.property("created_by_org_id", core.serialization.string()),
+ inferenceId: core.serialization.property("inference_id", core.serialization.string()),
+ endUserId: core.serialization.property("end_user_id", core.serialization.string().optional()),
+ feedbackForPart: core.serialization.property("feedback_for_part", core.serialization.string().optional()),
+ score: core.serialization.number().optional(),
+ flag: core.serialization.string().optional(),
+ note: core.serialization.string().optional(),
+ metadata: core.serialization.record(core.serialization.string(), core.serialization.unknown()).optional(),
+ promptVersionId: core.serialization.property("prompt_version_id", core.serialization.string().optional()),
+});
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/InferenceCreateByPromptId.d.ts b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceCreateByPromptId.d.ts
new file mode 100644
index 0000000..98da030
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceCreateByPromptId.d.ts
@@ -0,0 +1,18 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+import * as serializers from "..";
+import * as PromptonApi from "../../api";
+import * as core from "../../core";
+export declare const InferenceCreateByPromptId: core.serialization.ObjectSchema;
+export declare namespace InferenceCreateByPromptId {
+ interface Raw {
+ end_user_id?: string | null;
+ source?: string | null;
+ client_ref_id?: string | null;
+ template_args?: Record | null;
+ metadata?: Record | null;
+ request_timeout?: number | null;
+ prompt_id: string;
+ }
+}
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/InferenceCreateByPromptId.js b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceCreateByPromptId.js
new file mode 100644
index 0000000..ebcc48e
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceCreateByPromptId.js
@@ -0,0 +1,39 @@
+"use strict";
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.InferenceCreateByPromptId = void 0;
+const core = __importStar(require("../../core"));
+exports.InferenceCreateByPromptId = core.serialization.object({
+ endUserId: core.serialization.property("end_user_id", core.serialization.string().optional()),
+ source: core.serialization.string().optional(),
+ clientRefId: core.serialization.property("client_ref_id", core.serialization.string().optional()),
+ templateArgs: core.serialization.property("template_args", core.serialization.record(core.serialization.string(), core.serialization.string()).optional()),
+ metadata: core.serialization.record(core.serialization.string(), core.serialization.unknown()).optional(),
+ requestTimeout: core.serialization.property("request_timeout", core.serialization.number().optional()),
+ promptId: core.serialization.property("prompt_id", core.serialization.string()),
+});
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/InferenceCreateByPromptVersionId.d.ts b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceCreateByPromptVersionId.d.ts
new file mode 100644
index 0000000..ef417d3
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceCreateByPromptVersionId.d.ts
@@ -0,0 +1,18 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+import * as serializers from "..";
+import * as PromptonApi from "../../api";
+import * as core from "../../core";
+export declare const InferenceCreateByPromptVersionId: core.serialization.ObjectSchema;
+export declare namespace InferenceCreateByPromptVersionId {
+ interface Raw {
+ end_user_id?: string | null;
+ source?: string | null;
+ client_ref_id?: string | null;
+ template_args?: Record | null;
+ metadata?: Record | null;
+ request_timeout?: number | null;
+ prompt_version_id: string;
+ }
+}
diff --git a/clients/fern/api/node_sdk/prompton/serialization/resources/inferences/client/requests/InferenceCreate.js b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceCreateByPromptVersionId.js
similarity index 82%
rename from clients/fern/api/node_sdk/prompton/serialization/resources/inferences/client/requests/InferenceCreate.js
rename to clients/fern/api/node_sdk/prompton/serialization/types/InferenceCreateByPromptVersionId.js
index 8315797..0a8771a 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/resources/inferences/client/requests/InferenceCreate.js
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceCreateByPromptVersionId.js
@@ -26,11 +26,12 @@ var __importStar = (this && this.__importStar) || function (mod) {
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
-exports.InferenceCreate = void 0;
-const core = __importStar(require("../../../../../core"));
-exports.InferenceCreate = core.serialization.object({
- endUserId: core.serialization.property("end_user_id", core.serialization.string()),
- source: core.serialization.string(),
+exports.InferenceCreateByPromptVersionId = void 0;
+const core = __importStar(require("../../core"));
+exports.InferenceCreateByPromptVersionId = core.serialization.object({
+ endUserId: core.serialization.property("end_user_id", core.serialization.string().optional()),
+ source: core.serialization.string().optional(),
+ clientRefId: core.serialization.property("client_ref_id", core.serialization.string().optional()),
templateArgs: core.serialization.property("template_args", core.serialization.record(core.serialization.string(), core.serialization.string()).optional()),
metadata: core.serialization.record(core.serialization.string(), core.serialization.unknown()).optional(),
requestTimeout: core.serialization.property("request_timeout", core.serialization.number().optional()),
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/InferenceError.d.ts b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceError.d.ts
new file mode 100644
index 0000000..f272e17
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceError.d.ts
@@ -0,0 +1,14 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+import * as serializers from "..";
+import * as PromptonApi from "../../api";
+import * as core from "../../core";
+export declare const InferenceError: core.serialization.ObjectSchema;
+export declare namespace InferenceError {
+ interface Raw {
+ error_class: string;
+ message: string;
+ details?: unknown | null;
+ }
+}
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/InferenceError.js b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceError.js
new file mode 100644
index 0000000..60b63a5
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceError.js
@@ -0,0 +1,35 @@
+"use strict";
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.InferenceError = void 0;
+const core = __importStar(require("../../core"));
+exports.InferenceError = core.serialization.object({
+ errorClass: core.serialization.property("error_class", core.serialization.string()),
+ message: core.serialization.string(),
+ details: core.serialization.unknown().optional(),
+});
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/InferenceRead.d.ts b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceRead.d.ts
index 93f2195..a1b857e 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/types/InferenceRead.d.ts
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceRead.d.ts
@@ -7,20 +7,22 @@ import * as core from "../../core";
export declare const InferenceRead: core.serialization.ObjectSchema;
export declare namespace InferenceRead {
interface Raw {
- _id?: string | null;
- created_at?: string | null;
- created_by_user_id?: string | null;
- created_by_org_id?: string | null;
- end_user_id: string;
- source: string;
- template_args?: Record | null;
+ _id: string;
+ created_at: string;
+ created_by_user_id: string;
+ created_by_org_id: string;
+ end_user_id?: string | null;
+ source?: string | null;
+ client_ref_id?: string | null;
+ template_args: Record;
metadata?: Record | null;
request_timeout?: number | null;
prompt_version_id: string;
+ prompt_version_ids_considered: string[];
prompt_id: string;
- prompt_version_name?: string | null;
- status?: serializers.InferenceResponseStatus.Raw | null;
- request?: serializers.InferenceRequestData.Raw | null;
+ prompt_version_name: string;
+ status: serializers.InferenceResponseStatus.Raw;
+ request: serializers.InferenceRequestData.Raw;
response?: serializers.InferenceReadResponse.Raw | null;
}
}
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/InferenceRead.js b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceRead.js
index cfa46ac..8d797b4 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/types/InferenceRead.js
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceRead.js
@@ -38,19 +38,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.InferenceRead = void 0;
const core = __importStar(require("../../core"));
exports.InferenceRead = core.serialization.object({
- id: core.serialization.property("_id", core.serialization.string().optional()),
- createdAt: core.serialization.property("created_at", core.serialization.string().optional()),
- createdByUserId: core.serialization.property("created_by_user_id", core.serialization.string().optional()),
- createdByOrgId: core.serialization.property("created_by_org_id", core.serialization.string().optional()),
- endUserId: core.serialization.property("end_user_id", core.serialization.string()),
- source: core.serialization.string(),
- templateArgs: core.serialization.property("template_args", core.serialization.record(core.serialization.string(), core.serialization.string()).optional()),
+ id: core.serialization.property("_id", core.serialization.string()),
+ createdAt: core.serialization.property("created_at", core.serialization.string()),
+ createdByUserId: core.serialization.property("created_by_user_id", core.serialization.string()),
+ createdByOrgId: core.serialization.property("created_by_org_id", core.serialization.string()),
+ endUserId: core.serialization.property("end_user_id", core.serialization.string().optional()),
+ source: core.serialization.string().optional(),
+ clientRefId: core.serialization.property("client_ref_id", core.serialization.string().optional()),
+ templateArgs: core.serialization.property("template_args", core.serialization.record(core.serialization.string(), core.serialization.string())),
metadata: core.serialization.record(core.serialization.string(), core.serialization.unknown()).optional(),
requestTimeout: core.serialization.property("request_timeout", core.serialization.number().optional()),
promptVersionId: core.serialization.property("prompt_version_id", core.serialization.string()),
+ promptVersionIdsConsidered: core.serialization.property("prompt_version_ids_considered", core.serialization.list(core.serialization.string())),
promptId: core.serialization.property("prompt_id", core.serialization.string()),
- promptVersionName: core.serialization.property("prompt_version_name", core.serialization.string().optional()),
- status: core.serialization.lazy(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("..")))).InferenceResponseStatus; })).optional(),
- request: core.serialization.lazyObject(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("..")))).InferenceRequestData; })).optional(),
+ promptVersionName: core.serialization.property("prompt_version_name", core.serialization.string()),
+ status: core.serialization.lazy(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("..")))).InferenceResponseStatus; })),
+ request: core.serialization.lazyObject(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("..")))).InferenceRequestData; })),
response: core.serialization.lazy(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("..")))).InferenceReadResponse; })).optional(),
});
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/InferenceResponseData.d.ts b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceResponseData.d.ts
index 2f379e6..f4b22c1 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/types/InferenceResponseData.d.ts
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceResponseData.d.ts
@@ -11,7 +11,6 @@ export declare namespace InferenceResponseData {
completition_duration_seconds?: number | null;
is_client_connected_at_finish?: boolean | null;
isError?: boolean | null;
- first_message: serializers.ChatGptMessage.Raw;
token_usage: serializers.ChatGptTokenUsage.Raw;
raw_response: serializers.ChatGptChatCompletitionResponse.Raw;
}
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/InferenceResponseData.js b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceResponseData.js
index 35e5fe8..cb39291 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/types/InferenceResponseData.js
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceResponseData.js
@@ -42,7 +42,6 @@ exports.InferenceResponseData = core.serialization.object({
completitionDurationSeconds: core.serialization.property("completition_duration_seconds", core.serialization.number().optional()),
isClientConnectedAtFinish: core.serialization.property("is_client_connected_at_finish", core.serialization.boolean().optional()),
isError: core.serialization.boolean().optional(),
- firstMessage: core.serialization.property("first_message", core.serialization.lazyObject(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("..")))).ChatGptMessage; }))),
tokenUsage: core.serialization.property("token_usage", core.serialization.lazyObject(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("..")))).ChatGptTokenUsage; }))),
rawResponse: core.serialization.property("raw_response", core.serialization.lazyObject(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("..")))).ChatGptChatCompletitionResponse; }))),
});
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/InferenceResponseError.d.ts b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceResponseError.d.ts
index a723387..9fd70b2 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/types/InferenceResponseError.d.ts
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceResponseError.d.ts
@@ -11,6 +11,6 @@ export declare namespace InferenceResponseError {
completition_duration_seconds?: number | null;
is_client_connected_at_finish?: boolean | null;
isError?: boolean | null;
- error?: unknown | null;
+ error: serializers.InferenceError.Raw;
}
}
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/InferenceResponseError.js b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceResponseError.js
index 07b2aa7..a3a292b 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/types/InferenceResponseError.js
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/InferenceResponseError.js
@@ -25,6 +25,15 @@ var __importStar = (this && this.__importStar) || function (mod) {
__setModuleDefault(result, mod);
return result;
};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
Object.defineProperty(exports, "__esModule", { value: true });
exports.InferenceResponseError = void 0;
const core = __importStar(require("../../core"));
@@ -33,5 +42,5 @@ exports.InferenceResponseError = core.serialization.object({
completitionDurationSeconds: core.serialization.property("completition_duration_seconds", core.serialization.number().optional()),
isClientConnectedAtFinish: core.serialization.property("is_client_connected_at_finish", core.serialization.boolean().optional()),
isError: core.serialization.boolean().optional(),
- error: core.serialization.unknown().optional(),
+ error: core.serialization.lazyObject(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("..")))).InferenceError; })),
});
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/NewInferenceRequest.d.ts b/clients/fern/api/node_sdk/prompton/serialization/types/NewInferenceRequest.d.ts
new file mode 100644
index 0000000..b660ee0
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/NewInferenceRequest.d.ts
@@ -0,0 +1,10 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+import * as serializers from "..";
+import * as PromptonApi from "../../api";
+import * as core from "../../core";
+export declare const NewInferenceRequest: core.serialization.Schema;
+export declare namespace NewInferenceRequest {
+ type Raw = serializers.InferenceCreateByPromptVersionId.Raw | serializers.InferenceCreateByPromptId.Raw;
+}
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/NewInferenceRequest.js b/clients/fern/api/node_sdk/prompton/serialization/types/NewInferenceRequest.js
new file mode 100644
index 0000000..babbc93
--- /dev/null
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/NewInferenceRequest.js
@@ -0,0 +1,43 @@
+"use strict";
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.NewInferenceRequest = void 0;
+const core = __importStar(require("../../core"));
+exports.NewInferenceRequest = core.serialization.undiscriminatedUnion([
+ core.serialization.lazyObject(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("..")))).InferenceCreateByPromptVersionId; })),
+ core.serialization.lazyObject(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("..")))).InferenceCreateByPromptId; })),
+]);
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/OrgRead.d.ts b/clients/fern/api/node_sdk/prompton/serialization/types/OrgRead.d.ts
index 7f546ea..09d84e7 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/types/OrgRead.d.ts
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/OrgRead.d.ts
@@ -7,11 +7,12 @@ import * as core from "../../core";
export declare const OrgRead: core.serialization.ObjectSchema;
export declare namespace OrgRead {
interface Raw {
- _id?: string | null;
- created_at?: string | null;
- created_by_user_id?: string | null;
- created_by_org_id?: string | null;
+ _id: string;
+ created_at: string;
+ created_by_user_id: string;
+ created_by_org_id: string;
name: string;
+ oauth_domain?: string | null;
access_keys?: Record | null;
}
}
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/OrgRead.js b/clients/fern/api/node_sdk/prompton/serialization/types/OrgRead.js
index 9162f40..90c518b 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/types/OrgRead.js
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/OrgRead.js
@@ -29,10 +29,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.OrgRead = void 0;
const core = __importStar(require("../../core"));
exports.OrgRead = core.serialization.object({
- id: core.serialization.property("_id", core.serialization.string().optional()),
- createdAt: core.serialization.property("created_at", core.serialization.string().optional()),
- createdByUserId: core.serialization.property("created_by_user_id", core.serialization.string().optional()),
- createdByOrgId: core.serialization.property("created_by_org_id", core.serialization.string().optional()),
+ id: core.serialization.property("_id", core.serialization.string()),
+ createdAt: core.serialization.property("created_at", core.serialization.string()),
+ createdByUserId: core.serialization.property("created_by_user_id", core.serialization.string()),
+ createdByOrgId: core.serialization.property("created_by_org_id", core.serialization.string()),
name: core.serialization.string(),
+ oauthDomain: core.serialization.property("oauth_domain", core.serialization.string().optional()),
accessKeys: core.serialization.property("access_keys", core.serialization.record(core.serialization.string(), core.serialization.string()).optional()),
});
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/PromptRead.d.ts b/clients/fern/api/node_sdk/prompton/serialization/types/PromptRead.d.ts
index 53eac62..19dfb40 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/types/PromptRead.d.ts
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/PromptRead.d.ts
@@ -7,11 +7,11 @@ import * as core from "../../core";
export declare const PromptRead: core.serialization.ObjectSchema;
export declare namespace PromptRead {
interface Raw {
- _id?: string | null;
- created_at?: string | null;
- created_by_user_id?: string | null;
- created_by_org_id?: string | null;
- status?: serializers.PromptStatus.Raw | null;
+ _id: string;
+ created_at: string;
+ created_by_user_id: string;
+ created_by_org_id: string;
+ status: serializers.PromptStatus.Raw;
name: string;
description?: string | null;
}
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/PromptRead.js b/clients/fern/api/node_sdk/prompton/serialization/types/PromptRead.js
index 5e51e5a..8d02710 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/types/PromptRead.js
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/PromptRead.js
@@ -38,11 +38,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.PromptRead = void 0;
const core = __importStar(require("../../core"));
exports.PromptRead = core.serialization.object({
- id: core.serialization.property("_id", core.serialization.string().optional()),
- createdAt: core.serialization.property("created_at", core.serialization.string().optional()),
- createdByUserId: core.serialization.property("created_by_user_id", core.serialization.string().optional()),
- createdByOrgId: core.serialization.property("created_by_org_id", core.serialization.string().optional()),
- status: core.serialization.lazy(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("..")))).PromptStatus; })).optional(),
+ id: core.serialization.property("_id", core.serialization.string()),
+ createdAt: core.serialization.property("created_at", core.serialization.string()),
+ createdByUserId: core.serialization.property("created_by_user_id", core.serialization.string()),
+ createdByOrgId: core.serialization.property("created_by_org_id", core.serialization.string()),
+ status: core.serialization.lazy(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("..")))).PromptStatus; })),
name: core.serialization.string(),
description: core.serialization.string().optional(),
});
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/PromptVersionProviders.js b/clients/fern/api/node_sdk/prompton/serialization/types/PromptVersionProviders.js
index c2495b6..253980f 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/types/PromptVersionProviders.js
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/PromptVersionProviders.js
@@ -28,4 +28,4 @@ var __importStar = (this && this.__importStar) || function (mod) {
Object.defineProperty(exports, "__esModule", { value: true });
exports.PromptVersionProviders = void 0;
const core = __importStar(require("../../core"));
-exports.PromptVersionProviders = core.serialization.enum_(["OpenAI"]);
+exports.PromptVersionProviders = core.serialization.stringLiteral("OpenAI");
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/PromptVersionRead.d.ts b/clients/fern/api/node_sdk/prompton/serialization/types/PromptVersionRead.d.ts
index d865354..78bcec8 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/types/PromptVersionRead.d.ts
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/PromptVersionRead.d.ts
@@ -7,17 +7,17 @@ import * as core from "../../core";
export declare const PromptVersionRead: core.serialization.ObjectSchema;
export declare namespace PromptVersionRead {
interface Raw {
- _id?: string | null;
- created_at?: string | null;
- created_by_user_id?: string | null;
- created_by_org_id?: string | null;
- status?: serializers.PromptVersionStatus.Raw | null;
- provider?: serializers.PromptVersionProviders.Raw | null;
+ _id: string;
+ created_at: string;
+ created_by_user_id: string;
+ created_by_org_id: string;
+ status: serializers.PromptVersionStatus.Raw;
+ provider: serializers.PromptVersionProviders.Raw;
name: string;
description?: string | null;
prompt_id: string;
- template?: serializers.ChatGptMessage.Raw[] | null;
+ template: serializers.ChatGptMessage.Raw[];
model_config?: serializers.ChatGptChatCompletitionConfig.Raw | null;
- template_arg_names?: string[] | null;
+ template_arg_names: string[];
}
}
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/PromptVersionRead.js b/clients/fern/api/node_sdk/prompton/serialization/types/PromptVersionRead.js
index 27e08e3..eef62c7 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/types/PromptVersionRead.js
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/PromptVersionRead.js
@@ -38,18 +38,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.PromptVersionRead = void 0;
const core = __importStar(require("../../core"));
exports.PromptVersionRead = core.serialization.object({
- id: core.serialization.property("_id", core.serialization.string().optional()),
- createdAt: core.serialization.property("created_at", core.serialization.string().optional()),
- createdByUserId: core.serialization.property("created_by_user_id", core.serialization.string().optional()),
- createdByOrgId: core.serialization.property("created_by_org_id", core.serialization.string().optional()),
- status: core.serialization.lazy(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("..")))).PromptVersionStatus; })).optional(),
- provider: core.serialization.lazy(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("..")))).PromptVersionProviders; })).optional(),
+ id: core.serialization.property("_id", core.serialization.string()),
+ createdAt: core.serialization.property("created_at", core.serialization.string()),
+ createdByUserId: core.serialization.property("created_by_user_id", core.serialization.string()),
+ createdByOrgId: core.serialization.property("created_by_org_id", core.serialization.string()),
+ status: core.serialization.lazy(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("..")))).PromptVersionStatus; })),
+ provider: core.serialization.lazy(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("..")))).PromptVersionProviders; })),
name: core.serialization.string(),
description: core.serialization.string().optional(),
promptId: core.serialization.property("prompt_id", core.serialization.string()),
- template: core.serialization
- .list(core.serialization.lazyObject(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("..")))).ChatGptMessage; })))
- .optional(),
+ template: core.serialization.list(core.serialization.lazyObject(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("..")))).ChatGptMessage; }))),
modelConfig: core.serialization.property("model_config", core.serialization.lazyObject(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("..")))).ChatGptChatCompletitionConfig; })).optional()),
- templateArgNames: core.serialization.property("template_arg_names", core.serialization.list(core.serialization.string()).optional()),
+ templateArgNames: core.serialization.property("template_arg_names", core.serialization.list(core.serialization.string())),
});
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/UserRead.d.ts b/clients/fern/api/node_sdk/prompton/serialization/types/UserRead.d.ts
index 2d88494..184c017 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/types/UserRead.d.ts
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/UserRead.d.ts
@@ -7,12 +7,12 @@ import * as core from "../../core";
export declare const UserRead: core.serialization.ObjectSchema;
export declare namespace UserRead {
interface Raw {
- _id?: string | null;
- created_at?: string | null;
- created_by_user_id?: string | null;
- created_by_org_id?: string | null;
+ _id: string;
+ created_at: string;
+ created_by_user_id: string;
+ created_by_org_id: string;
full_name?: string | null;
- disabled?: boolean | null;
+ disabled: boolean;
role?: serializers.UserRoles.Raw | null;
org_id: string;
email: string;
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/UserRead.js b/clients/fern/api/node_sdk/prompton/serialization/types/UserRead.js
index a02d6af..8453561 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/types/UserRead.js
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/UserRead.js
@@ -38,12 +38,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.UserRead = void 0;
const core = __importStar(require("../../core"));
exports.UserRead = core.serialization.object({
- id: core.serialization.property("_id", core.serialization.string().optional()),
- createdAt: core.serialization.property("created_at", core.serialization.string().optional()),
- createdByUserId: core.serialization.property("created_by_user_id", core.serialization.string().optional()),
- createdByOrgId: core.serialization.property("created_by_org_id", core.serialization.string().optional()),
+ id: core.serialization.property("_id", core.serialization.string()),
+ createdAt: core.serialization.property("created_at", core.serialization.string()),
+ createdByUserId: core.serialization.property("created_by_user_id", core.serialization.string()),
+ createdByOrgId: core.serialization.property("created_by_org_id", core.serialization.string()),
fullName: core.serialization.property("full_name", core.serialization.string().optional()),
- disabled: core.serialization.boolean().optional(),
+ disabled: core.serialization.boolean(),
role: core.serialization.lazy(() => __awaiter(void 0, void 0, void 0, function* () { return (yield Promise.resolve().then(() => __importStar(require("..")))).UserRoles; })).optional(),
orgId: core.serialization.property("org_id", core.serialization.string()),
email: core.serialization.string(),
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/UserRoles.d.ts b/clients/fern/api/node_sdk/prompton/serialization/types/UserRoles.d.ts
index 145b8b4..7be9eeb 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/types/UserRoles.d.ts
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/UserRoles.d.ts
@@ -6,5 +6,5 @@ import * as PromptonApi from "../../api";
import * as core from "../../core";
export declare const UserRoles: core.serialization.Schema;
export declare namespace UserRoles {
- type Raw = "Basic" | "OrgAdmin" | "SuperAdmin";
+ type Raw = "Basic" | "PromptAdmin" | "OrgAdmin" | "SuperAdmin";
}
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/UserRoles.js b/clients/fern/api/node_sdk/prompton/serialization/types/UserRoles.js
index 1291238..96371b9 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/types/UserRoles.js
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/UserRoles.js
@@ -28,4 +28,4 @@ var __importStar = (this && this.__importStar) || function (mod) {
Object.defineProperty(exports, "__esModule", { value: true });
exports.UserRoles = void 0;
const core = __importStar(require("../../core"));
-exports.UserRoles = core.serialization.enum_(["Basic", "OrgAdmin", "SuperAdmin"]);
+exports.UserRoles = core.serialization.enum_(["Basic", "PromptAdmin", "OrgAdmin", "SuperAdmin"]);
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/index.d.ts b/clients/fern/api/node_sdk/prompton/serialization/types/index.d.ts
index 1a78a3a..957b94b 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/types/index.d.ts
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/index.d.ts
@@ -1,3 +1,4 @@
+export * from "./NewInferenceRequest";
export * from "./ApiStatusResponse";
export * from "./BodyGetAccessTokenExtendedTokenPost";
export * from "./ChatGptChatCompletitionConfig";
@@ -10,7 +11,12 @@ export * from "./ChatGptMessage";
export * from "./ChatGptRole";
export * from "./ChatGptTokenUsage";
export * from "./DbStatus";
+export * from "./DefaultPostResponse";
+export * from "./FeedbackRead";
export * from "./HttpValidationError";
+export * from "./InferenceCreateByPromptId";
+export * from "./InferenceCreateByPromptVersionId";
+export * from "./InferenceError";
export * from "./InferencePostResponse";
export * from "./InferencePostResponseResponse";
export * from "./InferenceRead";
diff --git a/clients/fern/api/node_sdk/prompton/serialization/types/index.js b/clients/fern/api/node_sdk/prompton/serialization/types/index.js
index 09423ba..548d95d 100644
--- a/clients/fern/api/node_sdk/prompton/serialization/types/index.js
+++ b/clients/fern/api/node_sdk/prompton/serialization/types/index.js
@@ -14,6 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
+__exportStar(require("./NewInferenceRequest"), exports);
__exportStar(require("./ApiStatusResponse"), exports);
__exportStar(require("./BodyGetAccessTokenExtendedTokenPost"), exports);
__exportStar(require("./ChatGptChatCompletitionConfig"), exports);
@@ -26,7 +27,12 @@ __exportStar(require("./ChatGptMessage"), exports);
__exportStar(require("./ChatGptRole"), exports);
__exportStar(require("./ChatGptTokenUsage"), exports);
__exportStar(require("./DbStatus"), exports);
+__exportStar(require("./DefaultPostResponse"), exports);
+__exportStar(require("./FeedbackRead"), exports);
__exportStar(require("./HttpValidationError"), exports);
+__exportStar(require("./InferenceCreateByPromptId"), exports);
+__exportStar(require("./InferenceCreateByPromptVersionId"), exports);
+__exportStar(require("./InferenceError"), exports);
__exportStar(require("./InferencePostResponse"), exports);
__exportStar(require("./InferencePostResponseResponse"), exports);
__exportStar(require("./InferenceRead"), exports);
diff --git a/clients/fern/api/openapi/openapi.yml b/clients/fern/api/openapi/openapi.yml
index fbb1456..462b453 100644
--- a/clients/fern/api/openapi/openapi.yml
+++ b/clients/fern/api/openapi/openapi.yml
@@ -85,15 +85,15 @@ paths:
get:
tags:
- prompts
- summary: Get Prompt List
- operationId: get_prompt_list
+ summary: Get Prompts List
+ operationId: get_prompts_list
responses:
'200':
description: Successful Response
content:
application/json:
schema:
- title: Response Get Prompt List Prompts Get
+ title: Response Get Prompts List Prompts Get
type: array
items:
$ref: '#/components/schemas/PromptRead'
@@ -123,7 +123,8 @@ paths:
description: Item created
content:
application/json:
- schema: {}
+ schema:
+ $ref: '#/components/schemas/DefaultPostResponse'
'400':
description: Malformed request
'401':
@@ -230,8 +231,8 @@ paths:
get:
tags:
- promptVersions
- summary: Get Promptversions List
- operationId: get_promptVersions_list
+ summary: Get Prompt Versions List
+ operationId: get_prompt_versions_list
parameters:
- required: false
schema:
@@ -245,7 +246,7 @@ paths:
content:
application/json:
schema:
- title: Response Get Promptversions List Promptversions Get
+ title: Response Get Prompt Versions List Promptversions Get
type: array
items:
$ref: '#/components/schemas/PromptVersionRead'
@@ -275,7 +276,8 @@ paths:
description: Item created
content:
application/json:
- schema: {}
+ schema:
+ $ref: '#/components/schemas/DefaultPostResponse'
'400':
description: Malformed request
'401':
@@ -396,12 +398,32 @@ paths:
tags:
- inferences
summary: New Inference
+ description: "The core of the functionality:\n1. Populating the template from\
+ \ prompt version with the passed values\n2. Logging the request\n3. Sending\
+ \ request to provider\n4. Logging response\n4. Returning response with `inference_id`\n\
+ \nYou can specify which prompt version you want to use in two ways by setting\
+ \ on of:\n\n - `prompt_version_id` - uses the specified prompt version\n -\
+ \ `prompt_id` - uses the `Live` status prompt version assigned to the given\
+ \ `prompt_id`. This allows to release new prompt versions using Prompton API\
+ \ if you only reference `prompt_id` in your client code.\n\n If there\
+ \ are multiple prompt versions in `Live` status for the prompt_id then it\
+ \ picks one randomly. It's useful for split testing.\n This method will\
+ \ return an error if there is no `Live` status message.\n\nIt also handles\
+ \ errors, timeouts and sets the inference status accordingly. It will still\
+ \ process response if client disconnects before it arrives.\n\n_Note: raw\
+ \ request data is also logged, GET `inferences/{id}` reponse includes it as\
+ \ well._\n\nYou can use a few easter eggs to test it without a valid api key:\n\
+ \n - `\"end_user_id\": \"mock_me_softly\"`\n - `\"end_user_id\": \"timeout_me_softly\"\
+ `\n - `\"end_user_id\": \"fail_me_softly\"`"
operationId: new_inference
requestBody:
content:
application/json:
schema:
- $ref: '#/components/schemas/InferenceCreate'
+ title: Inferencerequest
+ anyOf:
+ - $ref: '#/components/schemas/InferenceCreateByPromptVersionId'
+ - $ref: '#/components/schemas/InferenceCreateByPromptId'
required: true
responses:
'201':
@@ -460,15 +482,15 @@ paths:
get:
tags:
- orgs
- summary: Get Org List
- operationId: get_org_list
+ summary: Get Orgs List
+ operationId: get_orgs_list
responses:
'200':
description: Successful Response
content:
application/json:
schema:
- title: Response Get Org List Orgs Get
+ title: Response Get Orgs List Orgs Get
type: array
items:
$ref: '#/components/schemas/OrgRead'
@@ -490,7 +512,8 @@ paths:
description: Item created
content:
application/json:
- schema: {}
+ schema:
+ $ref: '#/components/schemas/DefaultPostResponse'
'400':
description: Malformed request
'401':
@@ -633,11 +656,14 @@ paths:
description: Item created
content:
application/json:
- schema: {}
+ schema:
+ $ref: '#/components/schemas/DefaultPostResponse'
'400':
description: Malformed request
'401':
description: Not authenticated
+ '409':
+ description: Email already exists
'422':
description: Validation Error
content:
@@ -699,6 +725,135 @@ paths:
description: Not authenticated
security:
- JWT: []
+ /feedbacks:
+ get:
+ tags:
+ - feedbacks
+ summary: Get Feedbacks List
+ operationId: get_feedbacks_list
+ parameters:
+ - required: false
+ schema:
+ title: Prompt Version Id
+ type: string
+ name: prompt_version_id
+ in: query
+ - required: false
+ schema:
+ title: Prompton User Id
+ type: string
+ name: prompton_user_id
+ in: query
+ - required: false
+ schema:
+ title: Inference Id
+ type: string
+ name: inference_id
+ in: query
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ title: Response Get Feedbacks List Feedbacks Get
+ type: array
+ items:
+ $ref: '#/components/schemas/FeedbackRead'
+ '422':
+ description: Invalid itemid supplied
+ '404':
+ description: Item not found
+ '400':
+ description: Malformed request
+ '401':
+ description: Not authenticated
+ security:
+ - JWT: []
+ post:
+ tags:
+ - feedbacks
+ summary: Add Feedback
+ description: 'Feedback about an inference from an end user or from a PromptOn
+ user.
+
+
+ At least one of `score`, `flag` or `note` required
+
+
+ `end_user_id` is null if from PromptOn user.
+
+
+ `score` can be null if flagging or note only. Scoring method are for API consumer
+ consideration. Eg. end users can thumbs down/up mapped to -1 +1 `score`, internal
+ users rate between from 0 to 100.
+
+
+ `flag` is any string when inference was flagged. Can be null if it is scoring
+ or note only
+
+
+ `feedback_for_part` is optional and can be used when the inference has multiple
+ sections which require separate feedback.
+
+
+ `metadata` is any dict for additional information.'
+ operationId: add_feedback
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/FeedbackCreate'
+ required: true
+ responses:
+ '201':
+ description: Item created
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DefaultPostResponse'
+ '400':
+ description: Malformed request
+ '401':
+ description: Not authenticated
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+ security:
+ - JWT: []
+ /feedbacks/{id}:
+ get:
+ tags:
+ - feedbacks
+ summary: Get Feedback By Id
+ operationId: get_feedback_by_id
+ parameters:
+ - required: true
+ schema:
+ title: Id
+ type: string
+ name: id
+ in: path
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/FeedbackRead'
+ '422':
+ description: Invalid itemid supplied
+ '404':
+ description: Item not found
+ '400':
+ description: Malformed request
+ '401':
+ description: Not authenticated
+ security:
+ - JWT: []
/:
head:
summary: Swagger Docs
@@ -972,6 +1127,116 @@ components:
title: Status Message
type: string
additionalProperties: false
+ DefaultPostResponse:
+ title: DefaultPostResponse
+ required:
+ - id
+ type: object
+ properties:
+ id:
+ title: Id
+ type: string
+ description: The id of the created item
+ description: Standard response for POST requests. Contains the id of the created
+ item.
+ FeedbackCreate:
+ title: FeedbackCreate
+ required:
+ - inference_id
+ type: object
+ properties:
+ inference_id:
+ title: Inference Id
+ type: string
+ description: The inference being rated
+ end_user_id:
+ title: End User Id
+ type: string
+ description: API consumers' end user id If feedback from end user otherwise
+ null
+ feedback_for_part:
+ title: Feedback For Part
+ type: string
+ description: Specifies which part of the output the feedback is about. Can
+ be used when the inference has multiple sections which require separate
+ feedback
+ score:
+ title: Score
+ type: integer
+ description: Any integer score. Rules are up to the API consumer. Can be
+ null if it was flagging or note only
+ flag:
+ title: Flag
+ type: string
+ description: Any string when inference was flagged. Can be null if it is
+ scoring or note only
+ note:
+ title: Note
+ type: string
+ metadata:
+ title: Metadata
+ type: object
+ additionalProperties: false
+ FeedbackRead:
+ title: FeedbackRead
+ required:
+ - _id
+ - created_at
+ - created_by_user_id
+ - created_by_org_id
+ - inference_id
+ type: object
+ properties:
+ _id:
+ title: ' Id'
+ type: string
+ created_at:
+ title: Created At
+ type: string
+ format: date-time
+ created_by_user_id:
+ title: Created By User Id
+ type: string
+ created_by_org_id:
+ title: Created By Org Id
+ type: string
+ inference_id:
+ title: Inference Id
+ type: string
+ description: The inference being rated
+ end_user_id:
+ title: End User Id
+ type: string
+ description: API consumers' end user id If feedback from end user otherwise
+ null
+ feedback_for_part:
+ title: Feedback For Part
+ type: string
+ description: Specifies which part of the output the feedback is about. Can
+ be used when the inference has multiple sections which require separate
+ feedback
+ score:
+ title: Score
+ type: integer
+ description: Any integer score. Rules are up to the API consumer. Can be
+ null if it was flagging or note only
+ flag:
+ title: Flag
+ type: string
+ description: Any string when inference was flagged. Can be null if it is
+ scoring or note only
+ note:
+ title: Note
+ type: string
+ metadata:
+ title: Metadata
+ type: object
+ prompt_version_id:
+ title: Prompt Version Id
+ type: string
+ description: Base model for reading from MongoDB. Same as MongoBaseCreate but
+ assumes all DB base fields are populated so generated clients doesn't requrie
+ None checks
HTTPValidationError:
title: HTTPValidationError
type: object
@@ -981,37 +1246,109 @@ components:
type: array
items:
$ref: '#/components/schemas/ValidationError'
- InferenceCreate:
- title: InferenceCreate
+ InferenceCreateByPromptId:
+ title: InferenceCreateByPromptId
+ required:
+ - prompt_id
+ type: object
+ properties:
+ end_user_id:
+ title: End User Id
+ type: string
+ description: The API consumer's internal user reference for metrics. It
+ is also relayed to the provider as part of the request if the provider
+ supports it (eg. OpenAI's user field).
+ source:
+ title: Source
+ type: string
+ description: The API consumer's source for metrics (e.g. AndroidApp etc).
+ client_ref_id:
+ title: Client Ref Id
+ type: string
+ description: The API consumer's internal reference id to able to link references
+ to their sessions.
+ template_args:
+ title: Template Args
+ type: object
+ additionalProperties:
+ type: string
+ default: {}
+ metadata:
+ title: Metadata
+ type: object
+ request_timeout:
+ title: Request Timeout
+ type: number
+ description: Provider request timout in seconds. If not provided, then Prompton
+ API's default timeout for the provider will be used (90sec or `DEFAULT_OPENAI_REQUEST_TIMEOUT_SECONDS`
+ env var if provided).
+ prompt_id:
+ title: Prompt Id
+ type: string
+ additionalProperties: false
+ description: 'Create inference by `prompt_id`. It can only be used if there
+ is at least one ''Live'' status prompt version for the provided `prompt_id`.
+
+ If there are multiple prompt versions in Live status it will pick one randomly.
+ Useful for split testing prompt versions.
+
+ It stores all other `prompt_version_id`s in Live status at the time of the
+ inference in `prompt_version_ids_considered` field.'
+ InferenceCreateByPromptVersionId:
+ title: InferenceCreateByPromptVersionId
required:
- - end_user_id
- - source
- prompt_version_id
type: object
properties:
end_user_id:
title: End User Id
- minLength: 1
type: string
+ description: The API consumer's internal user reference for metrics. It
+ is also relayed to the provider as part of the request if the provider
+ supports it (eg. OpenAI's user field).
source:
title: Source
- minLength: 1
type: string
+ description: The API consumer's source for metrics (e.g. AndroidApp etc).
+ client_ref_id:
+ title: Client Ref Id
+ type: string
+ description: The API consumer's internal reference id to able to link references
+ to their sessions.
template_args:
title: Template Args
type: object
additionalProperties:
type: string
+ default: {}
metadata:
title: Metadata
type: object
request_timeout:
title: Request Timeout
type: number
+ description: Provider request timout in seconds. If not provided, then Prompton
+ API's default timeout for the provider will be used (90sec or `DEFAULT_OPENAI_REQUEST_TIMEOUT_SECONDS`
+ env var if provided).
prompt_version_id:
title: Prompt Version Id
type: string
additionalProperties: false
+ InferenceError:
+ title: InferenceError
+ required:
+ - error_class
+ - message
+ type: object
+ properties:
+ error_class:
+ title: Error Class
+ type: string
+ message:
+ title: Message
+ type: string
+ details:
+ title: Details
InferencePostResponse:
title: InferencePostResponse
required:
@@ -1031,10 +1368,17 @@ components:
InferenceRead:
title: InferenceRead
required:
- - end_user_id
- - source
+ - _id
+ - created_at
+ - created_by_user_id
+ - created_by_org_id
+ - template_args
- prompt_version_id
+ - prompt_version_ids_considered
- prompt_id
+ - prompt_version_name
+ - status
+ - request
type: object
properties:
_id:
@@ -1052,12 +1396,19 @@ components:
type: string
end_user_id:
title: End User Id
- minLength: 1
type: string
+ description: The API consumer's internal user reference for metrics. It
+ is also relayed to the provider as part of the request if the provider
+ supports it (eg. OpenAI's user field).
source:
title: Source
- minLength: 1
type: string
+ description: The API consumer's source for metrics (e.g. AndroidApp etc).
+ client_ref_id:
+ title: Client Ref Id
+ type: string
+ description: The API consumer's internal reference id to able to link references
+ to their sessions.
template_args:
title: Template Args
type: object
@@ -1069,9 +1420,17 @@ components:
request_timeout:
title: Request Timeout
type: number
+ description: Provider request timout in seconds. If not provided, then Prompton
+ API's default timeout for the provider will be used (90sec or `DEFAULT_OPENAI_REQUEST_TIMEOUT_SECONDS`
+ env var if provided).
prompt_version_id:
title: Prompt Version Id
type: string
+ prompt_version_ids_considered:
+ title: Prompt Version Ids Considered
+ type: array
+ items:
+ type: string
prompt_id:
title: Prompt Id
type: string
@@ -1079,9 +1438,7 @@ components:
title: Prompt Version Name
type: string
status:
- allOf:
- - $ref: '#/components/schemas/InferenceResponseStatus'
- default: RequestReceived
+ $ref: '#/components/schemas/InferenceResponseStatus'
request:
$ref: '#/components/schemas/InferenceRequestData'
response:
@@ -1089,6 +1446,9 @@ components:
anyOf:
- $ref: '#/components/schemas/InferenceResponseData'
- $ref: '#/components/schemas/InferenceResponseError'
+ description: Base model for reading from MongoDB. Same as MongoBaseCreate but
+ assumes all DB base fields are populated so generated clients doesn't requrie
+ None checks
InferenceRequestData:
title: InferenceRequestData
required:
@@ -1104,7 +1464,6 @@ components:
InferenceResponseData:
title: InferenceResponseData
required:
- - first_message
- token_usage
- raw_response
type: object
@@ -1123,8 +1482,6 @@ components:
title: Iserror
type: boolean
default: false
- first_message:
- $ref: '#/components/schemas/ChatGPTMessage'
token_usage:
$ref: '#/components/schemas/ChatGPTTokenUsage'
raw_response:
@@ -1132,6 +1489,8 @@ components:
additionalProperties: false
InferenceResponseError:
title: InferenceResponseError
+ required:
+ - error
type: object
properties:
completed_at:
@@ -1149,7 +1508,7 @@ components:
type: boolean
default: true
error:
- title: Error
+ $ref: '#/components/schemas/InferenceError'
additionalProperties: false
InferenceResponseStatus:
title: InferenceResponseStatus
@@ -1192,10 +1551,20 @@ components:
type: object
additionalProperties:
type: string
+ oauth_domain:
+ title: Oauth Domain
+ type: string
+ description: APEX domain for oauth single sign on. Anyone with an email
+ address ending in this domain will be able to register to the org after
+ google account sign in. Only Google OAuth is supported for now.
additionalProperties: false
OrgRead:
title: OrgRead
required:
+ - _id
+ - created_at
+ - created_by_user_id
+ - created_by_org_id
- name
type: object
properties:
@@ -1214,13 +1583,23 @@ components:
type: string
name:
title: Name
- minLength: 1
type: string
+ oauth_domain:
+ title: Oauth Domain
+ type: string
+ description: APEX domain for oauth single sign on. Anyone with an email
+ address ending in this domain will be able to register to the org after
+ google account sign in. Only Google OAuth is supported for now.
access_keys:
title: Access Keys
type: object
additionalProperties:
type: string
+ format: password
+ writeOnly: true
+ description: Base model for reading from MongoDB. Same as MongoBaseCreate but
+ assumes all DB base fields are populated so generated clients doesn't requrie
+ None checks
OrgUpdate:
title: OrgUpdate
type: object
@@ -1234,6 +1613,12 @@ components:
type: object
additionalProperties:
type: string
+ oauth_domain:
+ title: Oauth Domain
+ type: string
+ description: APEX domain for oauth single sign on. Anyone with an email
+ address ending in this domain will be able to register to the org after
+ google account sign in. Only Google OAuth is supported for now.
additionalProperties: false
PromptCreate:
title: PromptCreate
@@ -1244,6 +1629,8 @@ components:
status:
allOf:
- $ref: '#/components/schemas/PromptStatus'
+ description: Prompt status for client consideration only, currently not
+ used in server logic.
default: Active
name:
title: Name
@@ -1256,6 +1643,11 @@ components:
PromptRead:
title: PromptRead
required:
+ - _id
+ - created_at
+ - created_by_user_id
+ - created_by_org_id
+ - status
- name
type: object
properties:
@@ -1273,9 +1665,7 @@ components:
title: Created By Org Id
type: string
status:
- allOf:
- - $ref: '#/components/schemas/PromptStatus'
- default: Active
+ $ref: '#/components/schemas/PromptStatus'
name:
title: Name
minLength: 1
@@ -1283,6 +1673,9 @@ components:
description:
title: Description
type: string
+ description: Base model for reading from MongoDB. Same as MongoBaseCreate but
+ assumes all DB base fields are populated so generated clients doesn't requrie
+ None checks
PromptStatus:
title: PromptStatus
enum:
@@ -1297,6 +1690,8 @@ components:
status:
allOf:
- $ref: '#/components/schemas/PromptStatus'
+ description: Prompt status for client consideration only, currently not
+ used in server logic.
default: Active
name:
title: Name
@@ -1336,6 +1731,7 @@ components:
type: array
items:
$ref: '#/components/schemas/ChatGPTMessage'
+ default: []
model_config:
$ref: '#/components/schemas/ChatGPTChatCompletitionConfig'
additionalProperties: false
@@ -1348,8 +1744,16 @@ components:
PromptVersionRead:
title: PromptVersionRead
required:
+ - _id
+ - created_at
+ - created_by_user_id
+ - created_by_org_id
+ - status
+ - provider
- name
- prompt_id
+ - template
+ - template_arg_names
type: object
properties:
_id:
@@ -1366,13 +1770,9 @@ components:
title: Created By Org Id
type: string
status:
- allOf:
- - $ref: '#/components/schemas/PromptVersionStatus'
- default: Draft
+ $ref: '#/components/schemas/PromptVersionStatus'
provider:
- allOf:
- - $ref: '#/components/schemas/PromptVersionProviders'
- default: OpenAI
+ $ref: '#/components/schemas/PromptVersionProviders'
name:
title: Name
minLength: 1
@@ -1395,7 +1795,11 @@ components:
type: array
items:
type: string
- default: []
+ description: List of args in the template - populated by server at PATHC
+ and POST
+ description: Base model for reading from MongoDB. Same as MongoBaseCreate but
+ assumes all DB base fields are populated so generated clients doesn't requrie
+ None checks
PromptVersionStatus:
title: PromptVersionStatus
enum:
@@ -1432,6 +1836,7 @@ components:
type: array
items:
$ref: '#/components/schemas/ChatGPTMessage'
+ default: []
model_config:
$ref: '#/components/schemas/ChatGPTChatCompletitionConfig'
additionalProperties: false
@@ -1484,6 +1889,11 @@ components:
UserRead:
title: UserRead
required:
+ - _id
+ - created_at
+ - created_by_user_id
+ - created_by_org_id
+ - disabled
- org_id
- email
type: object
@@ -1508,7 +1918,6 @@ components:
disabled:
title: Disabled
type: boolean
- default: false
role:
allOf:
- $ref: '#/components/schemas/UserRoles'
@@ -1519,10 +1928,14 @@ components:
email:
title: Email
type: string
+ description: Base model for reading from MongoDB. Same as MongoBaseCreate but
+ assumes all DB base fields are populated so generated clients doesn't requrie
+ None checks
UserRoles:
title: UserRoles
enum:
- Basic
+ - PromptAdmin
- OrgAdmin
- SuperAdmin
type: string
diff --git a/clients/fern/api/python_sdk/justfile b/clients/fern/api/python_sdk/justfile
index 5e019c6..47d2988 100644
--- a/clients/fern/api/python_sdk/justfile
+++ b/clients/fern/api/python_sdk/justfile
@@ -14,4 +14,8 @@ build *params='':
# to PyPi - set POETRY_PYPI_TOKEN_PYPI in your .env
publish *params='':
- poetry publish $@
\ No newline at end of file
+ poetry publish $@
+
+build-publish:
+ just build
+ just publish
\ No newline at end of file
diff --git a/clients/fern/api/python_sdk/poetry.lock b/clients/fern/api/python_sdk/poetry.lock
index eda9113..2b2fc5d 100644
--- a/clients/fern/api/python_sdk/poetry.lock
+++ b/clients/fern/api/python_sdk/poetry.lock
@@ -12,8 +12,10 @@ files = [
]
[package.dependencies]
+exceptiongroup = {version = "*", markers = "python_version < \"3.11\""}
idna = ">=2.8"
sniffio = ">=1.1"
+typing-extensions = {version = "*", markers = "python_version < \"3.8\""}
[package.extras]
doc = ["Sphinx (>=6.1.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme", "sphinxcontrib-jquery"]
@@ -33,23 +35,21 @@ files = [
[[package]]
name = "dnspython"
-version = "2.3.0"
+version = "2.1.0"
description = "DNS toolkit"
optional = false
-python-versions = ">=3.7,<4.0"
+python-versions = ">=3.6"
files = [
- {file = "dnspython-2.3.0-py3-none-any.whl", hash = "sha256:89141536394f909066cabd112e3e1a37e4e654db00a25308b0f130bc3152eb46"},
- {file = "dnspython-2.3.0.tar.gz", hash = "sha256:224e32b03eb46be70e12ef6d64e0be123a64e621ab4c0822ff6d450d52a540b9"},
+ {file = "dnspython-2.1.0-py3-none-any.whl", hash = "sha256:95d12f6ef0317118d2a1a6fc49aac65ffec7eb8087474158f42f26a639135216"},
+ {file = "dnspython-2.1.0.zip", hash = "sha256:e4a87f0b573201a0f3727fa18a516b055fd1107e0e5477cded4a2de497df1dd4"},
]
[package.extras]
-curio = ["curio (>=1.2,<2.0)", "sniffio (>=1.1,<2.0)"]
-dnssec = ["cryptography (>=2.6,<40.0)"]
-doh = ["h2 (>=4.1.0)", "httpx (>=0.21.1)", "requests (>=2.23.0,<3.0.0)", "requests-toolbelt (>=0.9.1,<0.11.0)"]
-doq = ["aioquic (>=0.9.20)"]
-idna = ["idna (>=2.1,<4.0)"]
-trio = ["trio (>=0.14,<0.23)"]
-wmi = ["wmi (>=1.5.1,<2.0.0)"]
+curio = ["curio (>=1.2)", "sniffio (>=1.1)"]
+dnssec = ["cryptography (>=2.6)"]
+doh = ["requests", "requests-toolbelt"]
+idna = ["idna (>=2.1)"]
+trio = ["sniffio (>=1.1)", "trio (>=0.14.0)"]
[[package]]
name = "email-validator"
@@ -66,6 +66,20 @@ files = [
dnspython = ">=2.0.0"
idna = ">=2.0.0"
+[[package]]
+name = "exceptiongroup"
+version = "1.1.1"
+description = "Backport of PEP 654 (exception groups)"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"},
+ {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"},
+]
+
+[package.extras]
+test = ["pytest (>=6)"]
+
[[package]]
name = "h11"
version = "0.14.0"
@@ -77,6 +91,9 @@ files = [
{file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
]
+[package.dependencies]
+typing-extensions = {version = "*", markers = "python_version < \"3.8\""}
+
[[package]]
name = "httpcore"
version = "0.17.2"
@@ -209,5 +226,5 @@ files = [
[metadata]
lock-version = "2.0"
-python-versions = "^3.11"
-content-hash = "935f15fce4e5d028f8ce6d50027793a43bb6e04f7c908008467ee10f71f12c16"
+python-versions = ">=3.7"
+content-hash = "1c0d506301f62083af93677720d23446e6f1d2f0b17df857b514c06d613f813a"
diff --git a/clients/fern/api/python_sdk/prompton/__init__.py b/clients/fern/api/python_sdk/prompton/__init__.py
index 480e8a1..3594176 100644
--- a/clients/fern/api/python_sdk/prompton/__init__.py
+++ b/clients/fern/api/python_sdk/prompton/__init__.py
@@ -1,7 +1,7 @@
# This file was auto-generated by Fern from our API Definition.
-from .errors import BadRequestError, NotFoundError, UnauthorizedError, UnprocessableEntityError
-from .resources import authentication, inferences, orgs, prompt_versions, prompts, server_status, users
+from .errors import BadRequestError, ConflictError, NotFoundError, UnauthorizedError, UnprocessableEntityError
+from .resources import authentication, feedbacks, inferences, orgs, prompt_versions, prompts, server_status, users
from .types import (
ApiStatusResponse,
BodyGetAccessTokenExtendedTokenPost,
@@ -15,7 +15,12 @@
ChatGptRole,
ChatGptTokenUsage,
DbStatus,
+ DefaultPostResponse,
+ FeedbackRead,
HttpValidationError,
+ InferenceCreateByPromptId,
+ InferenceCreateByPromptVersionId,
+ InferenceError,
InferencePostResponse,
InferencePostResponseResponse,
InferenceRead,
@@ -24,6 +29,7 @@
InferenceResponseData,
InferenceResponseError,
InferenceResponseStatus,
+ NewInferenceRequest,
OrgRead,
PromptRead,
PromptStatus,
@@ -50,8 +56,14 @@
"ChatGptMessage",
"ChatGptRole",
"ChatGptTokenUsage",
+ "ConflictError",
"DbStatus",
+ "DefaultPostResponse",
+ "FeedbackRead",
"HttpValidationError",
+ "InferenceCreateByPromptId",
+ "InferenceCreateByPromptVersionId",
+ "InferenceError",
"InferencePostResponse",
"InferencePostResponseResponse",
"InferenceRead",
@@ -60,6 +72,7 @@
"InferenceResponseData",
"InferenceResponseError",
"InferenceResponseStatus",
+ "NewInferenceRequest",
"NotFoundError",
"OrgRead",
"PromptRead",
@@ -75,6 +88,7 @@
"ValidationError",
"ValidationErrorLocItem",
"authentication",
+ "feedbacks",
"inferences",
"orgs",
"prompt_versions",
diff --git a/clients/fern/api/python_sdk/prompton/client.py b/clients/fern/api/python_sdk/prompton/client.py
index ddf3948..2c625a3 100644
--- a/clients/fern/api/python_sdk/prompton/client.py
+++ b/clients/fern/api/python_sdk/prompton/client.py
@@ -3,6 +3,7 @@
import typing
from .resources.authentication.client import AsyncAuthenticationClient, AuthenticationClient
+from .resources.feedbacks.client import AsyncFeedbacksClient, FeedbacksClient
from .resources.inferences.client import AsyncInferencesClient, InferencesClient
from .resources.orgs.client import AsyncOrgsClient, OrgsClient
from .resources.prompt_versions.client import AsyncPromptVersionsClient, PromptVersionsClient
@@ -22,6 +23,7 @@ def __init__(self, *, environment: str, token: typing.Optional[str] = None):
self.inferences = InferencesClient(environment=self._environment, token=self._token)
self.orgs = OrgsClient(environment=self._environment, token=self._token)
self.users = UsersClient(environment=self._environment, token=self._token)
+ self.feedbacks = FeedbacksClient(environment=self._environment, token=self._token)
class AsyncPromptonApi:
@@ -35,3 +37,4 @@ def __init__(self, *, environment: str, token: typing.Optional[str] = None):
self.inferences = AsyncInferencesClient(environment=self._environment, token=self._token)
self.orgs = AsyncOrgsClient(environment=self._environment, token=self._token)
self.users = AsyncUsersClient(environment=self._environment, token=self._token)
+ self.feedbacks = AsyncFeedbacksClient(environment=self._environment, token=self._token)
diff --git a/clients/fern/api/python_sdk/prompton/errors/__init__.py b/clients/fern/api/python_sdk/prompton/errors/__init__.py
index abc026c..4a41c7d 100644
--- a/clients/fern/api/python_sdk/prompton/errors/__init__.py
+++ b/clients/fern/api/python_sdk/prompton/errors/__init__.py
@@ -1,8 +1,9 @@
# This file was auto-generated by Fern from our API Definition.
from .bad_request_error import BadRequestError
+from .conflict_error import ConflictError
from .not_found_error import NotFoundError
from .unauthorized_error import UnauthorizedError
from .unprocessable_entity_error import UnprocessableEntityError
-__all__ = ["BadRequestError", "NotFoundError", "UnauthorizedError", "UnprocessableEntityError"]
+__all__ = ["BadRequestError", "ConflictError", "NotFoundError", "UnauthorizedError", "UnprocessableEntityError"]
diff --git a/clients/fern/api/python_sdk/prompton/errors/conflict_error.py b/clients/fern/api/python_sdk/prompton/errors/conflict_error.py
new file mode 100644
index 0000000..416399a
--- /dev/null
+++ b/clients/fern/api/python_sdk/prompton/errors/conflict_error.py
@@ -0,0 +1,10 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+from ..core.api_error import ApiError
+
+
+class ConflictError(ApiError):
+ def __init__(self, body: typing.Any):
+ super().__init__(status_code=409, body=body)
diff --git a/clients/fern/api/python_sdk/prompton/resources/__init__.py b/clients/fern/api/python_sdk/prompton/resources/__init__.py
index 3fc653c..aa0d430 100644
--- a/clients/fern/api/python_sdk/prompton/resources/__init__.py
+++ b/clients/fern/api/python_sdk/prompton/resources/__init__.py
@@ -1,5 +1,5 @@
# This file was auto-generated by Fern from our API Definition.
-from . import authentication, inferences, orgs, prompt_versions, prompts, server_status, users
+from . import authentication, feedbacks, inferences, orgs, prompt_versions, prompts, server_status, users
-__all__ = ["authentication", "inferences", "orgs", "prompt_versions", "prompts", "server_status", "users"]
+__all__ = ["authentication", "feedbacks", "inferences", "orgs", "prompt_versions", "prompts", "server_status", "users"]
diff --git a/clients/fern/api/python_sdk/prompton/resources/feedbacks/__init__.py b/clients/fern/api/python_sdk/prompton/resources/feedbacks/__init__.py
new file mode 100644
index 0000000..f3ea265
--- /dev/null
+++ b/clients/fern/api/python_sdk/prompton/resources/feedbacks/__init__.py
@@ -0,0 +1,2 @@
+# This file was auto-generated by Fern from our API Definition.
+
diff --git a/clients/fern/api/python_sdk/prompton/resources/feedbacks/client.py b/clients/fern/api/python_sdk/prompton/resources/feedbacks/client.py
new file mode 100644
index 0000000..c0d0fae
--- /dev/null
+++ b/clients/fern/api/python_sdk/prompton/resources/feedbacks/client.py
@@ -0,0 +1,252 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+import urllib.parse
+from json.decoder import JSONDecodeError
+
+import httpx
+import pydantic
+
+from ...core.api_error import ApiError
+from ...core.jsonable_encoder import jsonable_encoder
+from ...core.remove_none_from_headers import remove_none_from_headers
+from ...errors.bad_request_error import BadRequestError
+from ...errors.not_found_error import NotFoundError
+from ...errors.unauthorized_error import UnauthorizedError
+from ...errors.unprocessable_entity_error import UnprocessableEntityError
+from ...types.default_post_response import DefaultPostResponse
+from ...types.feedback_read import FeedbackRead
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class FeedbacksClient:
+ def __init__(self, *, environment: str, token: typing.Optional[str] = None):
+ self._environment = environment
+ self._token = token
+
+ def get_feedbacks_list(
+ self,
+ *,
+ prompt_version_id: typing.Optional[str] = None,
+ prompton_user_id: typing.Optional[str] = None,
+ inference_id: typing.Optional[str] = None,
+ ) -> typing.List[FeedbackRead]:
+ _response = httpx.request(
+ "GET",
+ urllib.parse.urljoin(f"{self._environment}/", "feedbacks"),
+ params={
+ "prompt_version_id": prompt_version_id,
+ "prompton_user_id": prompton_user_id,
+ "inference_id": inference_id,
+ },
+ headers=remove_none_from_headers(
+ {"Authorization": f"Bearer {self._token}" if self._token is not None else None}
+ ),
+ timeout=60,
+ )
+ if 200 <= _response.status_code < 300:
+ return pydantic.parse_obj_as(typing.List[FeedbackRead], _response.json()) # type: ignore
+ if _response.status_code == 400:
+ raise BadRequestError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ if _response.status_code == 401:
+ raise UnauthorizedError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ if _response.status_code == 404:
+ raise NotFoundError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ try:
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ def add_feedback(
+ self,
+ *,
+ inference_id: str,
+ end_user_id: typing.Optional[str] = OMIT,
+ feedback_for_part: typing.Optional[str] = OMIT,
+ score: typing.Optional[int] = OMIT,
+ flag: typing.Optional[str] = OMIT,
+ note: typing.Optional[str] = OMIT,
+ metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
+ ) -> DefaultPostResponse:
+ _request: typing.Dict[str, typing.Any] = {"inference_id": inference_id}
+ if end_user_id is not OMIT:
+ _request["end_user_id"] = end_user_id
+ if feedback_for_part is not OMIT:
+ _request["feedback_for_part"] = feedback_for_part
+ if score is not OMIT:
+ _request["score"] = score
+ if flag is not OMIT:
+ _request["flag"] = flag
+ if note is not OMIT:
+ _request["note"] = note
+ if metadata is not OMIT:
+ _request["metadata"] = metadata
+ _response = httpx.request(
+ "POST",
+ urllib.parse.urljoin(f"{self._environment}/", "feedbacks"),
+ json=jsonable_encoder(_request),
+ headers=remove_none_from_headers(
+ {"Authorization": f"Bearer {self._token}" if self._token is not None else None}
+ ),
+ timeout=60,
+ )
+ if 200 <= _response.status_code < 300:
+ return pydantic.parse_obj_as(DefaultPostResponse, _response.json()) # type: ignore
+ if _response.status_code == 400:
+ raise BadRequestError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ if _response.status_code == 401:
+ raise UnauthorizedError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ try:
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ def get_feedback_by_id(self, id: str) -> FeedbackRead:
+ _response = httpx.request(
+ "GET",
+ urllib.parse.urljoin(f"{self._environment}/", f"feedbacks/{id}"),
+ headers=remove_none_from_headers(
+ {"Authorization": f"Bearer {self._token}" if self._token is not None else None}
+ ),
+ timeout=60,
+ )
+ if 200 <= _response.status_code < 300:
+ return pydantic.parse_obj_as(FeedbackRead, _response.json()) # type: ignore
+ if _response.status_code == 400:
+ raise BadRequestError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ if _response.status_code == 401:
+ raise UnauthorizedError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ if _response.status_code == 404:
+ raise NotFoundError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ try:
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+
+class AsyncFeedbacksClient:
+ def __init__(self, *, environment: str, token: typing.Optional[str] = None):
+ self._environment = environment
+ self._token = token
+
+ async def get_feedbacks_list(
+ self,
+ *,
+ prompt_version_id: typing.Optional[str] = None,
+ prompton_user_id: typing.Optional[str] = None,
+ inference_id: typing.Optional[str] = None,
+ ) -> typing.List[FeedbackRead]:
+ async with httpx.AsyncClient() as _client:
+ _response = await _client.request(
+ "GET",
+ urllib.parse.urljoin(f"{self._environment}/", "feedbacks"),
+ params={
+ "prompt_version_id": prompt_version_id,
+ "prompton_user_id": prompton_user_id,
+ "inference_id": inference_id,
+ },
+ headers=remove_none_from_headers(
+ {"Authorization": f"Bearer {self._token}" if self._token is not None else None}
+ ),
+ timeout=60,
+ )
+ if 200 <= _response.status_code < 300:
+ return pydantic.parse_obj_as(typing.List[FeedbackRead], _response.json()) # type: ignore
+ if _response.status_code == 400:
+ raise BadRequestError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ if _response.status_code == 401:
+ raise UnauthorizedError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ if _response.status_code == 404:
+ raise NotFoundError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ try:
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ async def add_feedback(
+ self,
+ *,
+ inference_id: str,
+ end_user_id: typing.Optional[str] = OMIT,
+ feedback_for_part: typing.Optional[str] = OMIT,
+ score: typing.Optional[int] = OMIT,
+ flag: typing.Optional[str] = OMIT,
+ note: typing.Optional[str] = OMIT,
+ metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
+ ) -> DefaultPostResponse:
+ _request: typing.Dict[str, typing.Any] = {"inference_id": inference_id}
+ if end_user_id is not OMIT:
+ _request["end_user_id"] = end_user_id
+ if feedback_for_part is not OMIT:
+ _request["feedback_for_part"] = feedback_for_part
+ if score is not OMIT:
+ _request["score"] = score
+ if flag is not OMIT:
+ _request["flag"] = flag
+ if note is not OMIT:
+ _request["note"] = note
+ if metadata is not OMIT:
+ _request["metadata"] = metadata
+ async with httpx.AsyncClient() as _client:
+ _response = await _client.request(
+ "POST",
+ urllib.parse.urljoin(f"{self._environment}/", "feedbacks"),
+ json=jsonable_encoder(_request),
+ headers=remove_none_from_headers(
+ {"Authorization": f"Bearer {self._token}" if self._token is not None else None}
+ ),
+ timeout=60,
+ )
+ if 200 <= _response.status_code < 300:
+ return pydantic.parse_obj_as(DefaultPostResponse, _response.json()) # type: ignore
+ if _response.status_code == 400:
+ raise BadRequestError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ if _response.status_code == 401:
+ raise UnauthorizedError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ try:
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ async def get_feedback_by_id(self, id: str) -> FeedbackRead:
+ async with httpx.AsyncClient() as _client:
+ _response = await _client.request(
+ "GET",
+ urllib.parse.urljoin(f"{self._environment}/", f"feedbacks/{id}"),
+ headers=remove_none_from_headers(
+ {"Authorization": f"Bearer {self._token}" if self._token is not None else None}
+ ),
+ timeout=60,
+ )
+ if 200 <= _response.status_code < 300:
+ return pydantic.parse_obj_as(FeedbackRead, _response.json()) # type: ignore
+ if _response.status_code == 400:
+ raise BadRequestError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ if _response.status_code == 401:
+ raise UnauthorizedError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ if _response.status_code == 404:
+ raise NotFoundError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ try:
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
diff --git a/clients/fern/api/python_sdk/prompton/resources/inferences/client.py b/clients/fern/api/python_sdk/prompton/resources/inferences/client.py
index fbfbc57..c40bc70 100644
--- a/clients/fern/api/python_sdk/prompton/resources/inferences/client.py
+++ b/clients/fern/api/python_sdk/prompton/resources/inferences/client.py
@@ -16,9 +16,7 @@
from ...errors.unprocessable_entity_error import UnprocessableEntityError
from ...types.inference_post_response import InferencePostResponse
from ...types.inference_read import InferenceRead
-
-# this is used as the default value for optional parameters
-OMIT = typing.cast(typing.Any, ...)
+from ...types.new_inference_request import NewInferenceRequest
class InferencesClient:
@@ -54,31 +52,11 @@ def get_inferences_list(
raise ApiError(status_code=_response.status_code, body=_response.text)
raise ApiError(status_code=_response.status_code, body=_response_json)
- def new_inference(
- self,
- *,
- end_user_id: str,
- source: str,
- template_args: typing.Optional[typing.Dict[str, str]] = OMIT,
- metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
- request_timeout: typing.Optional[float] = OMIT,
- prompt_version_id: str,
- ) -> InferencePostResponse:
- _request: typing.Dict[str, typing.Any] = {
- "end_user_id": end_user_id,
- "source": source,
- "prompt_version_id": prompt_version_id,
- }
- if template_args is not OMIT:
- _request["template_args"] = template_args
- if metadata is not OMIT:
- _request["metadata"] = metadata
- if request_timeout is not OMIT:
- _request["request_timeout"] = request_timeout
+ def new_inference(self, *, request: NewInferenceRequest) -> InferencePostResponse:
_response = httpx.request(
"POST",
urllib.parse.urljoin(f"{self._environment}/", "inferences"),
- json=jsonable_encoder(_request),
+ json=jsonable_encoder(request),
headers=remove_none_from_headers(
{"Authorization": f"Bearer {self._token}" if self._token is not None else None}
),
@@ -158,32 +136,12 @@ async def get_inferences_list(
raise ApiError(status_code=_response.status_code, body=_response.text)
raise ApiError(status_code=_response.status_code, body=_response_json)
- async def new_inference(
- self,
- *,
- end_user_id: str,
- source: str,
- template_args: typing.Optional[typing.Dict[str, str]] = OMIT,
- metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
- request_timeout: typing.Optional[float] = OMIT,
- prompt_version_id: str,
- ) -> InferencePostResponse:
- _request: typing.Dict[str, typing.Any] = {
- "end_user_id": end_user_id,
- "source": source,
- "prompt_version_id": prompt_version_id,
- }
- if template_args is not OMIT:
- _request["template_args"] = template_args
- if metadata is not OMIT:
- _request["metadata"] = metadata
- if request_timeout is not OMIT:
- _request["request_timeout"] = request_timeout
+ async def new_inference(self, *, request: NewInferenceRequest) -> InferencePostResponse:
async with httpx.AsyncClient() as _client:
_response = await _client.request(
"POST",
urllib.parse.urljoin(f"{self._environment}/", "inferences"),
- json=jsonable_encoder(_request),
+ json=jsonable_encoder(request),
headers=remove_none_from_headers(
{"Authorization": f"Bearer {self._token}" if self._token is not None else None}
),
diff --git a/clients/fern/api/python_sdk/prompton/resources/orgs/client.py b/clients/fern/api/python_sdk/prompton/resources/orgs/client.py
index 76fcb5e..aeecc0c 100644
--- a/clients/fern/api/python_sdk/prompton/resources/orgs/client.py
+++ b/clients/fern/api/python_sdk/prompton/resources/orgs/client.py
@@ -14,6 +14,7 @@
from ...errors.not_found_error import NotFoundError
from ...errors.unauthorized_error import UnauthorizedError
from ...errors.unprocessable_entity_error import UnprocessableEntityError
+from ...types.default_post_response import DefaultPostResponse
from ...types.org_read import OrgRead
# this is used as the default value for optional parameters
@@ -25,7 +26,7 @@ def __init__(self, *, environment: str, token: typing.Optional[str] = None):
self._environment = environment
self._token = token
- def get_org_list(self) -> typing.List[OrgRead]:
+ def get_orgs_list(self) -> typing.List[OrgRead]:
_response = httpx.request(
"GET",
urllib.parse.urljoin(f"{self._environment}/", "orgs"),
@@ -42,10 +43,18 @@ def get_org_list(self) -> typing.List[OrgRead]:
raise ApiError(status_code=_response.status_code, body=_response.text)
raise ApiError(status_code=_response.status_code, body=_response_json)
- def add_org(self, *, name: str, access_keys: typing.Optional[typing.Dict[str, str]] = OMIT) -> typing.Any:
+ def add_org(
+ self,
+ *,
+ name: str,
+ access_keys: typing.Optional[typing.Dict[str, str]] = OMIT,
+ oauth_domain: typing.Optional[str] = OMIT,
+ ) -> DefaultPostResponse:
_request: typing.Dict[str, typing.Any] = {"name": name}
if access_keys is not OMIT:
_request["access_keys"] = access_keys
+ if oauth_domain is not OMIT:
+ _request["oauth_domain"] = oauth_domain
_response = httpx.request(
"POST",
urllib.parse.urljoin(f"{self._environment}/", "orgs"),
@@ -56,7 +65,7 @@ def add_org(self, *, name: str, access_keys: typing.Optional[typing.Dict[str, st
timeout=60,
)
if 200 <= _response.status_code < 300:
- return pydantic.parse_obj_as(typing.Any, _response.json()) # type: ignore
+ return pydantic.parse_obj_as(DefaultPostResponse, _response.json()) # type: ignore
if _response.status_code == 400:
raise BadRequestError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
if _response.status_code == 401:
@@ -120,13 +129,20 @@ def get_org_by_id(self, id: str) -> OrgRead:
raise ApiError(status_code=_response.status_code, body=_response_json)
def update_org(
- self, id: str, *, name: typing.Optional[str] = OMIT, access_keys: typing.Optional[typing.Dict[str, str]] = OMIT
+ self,
+ id: str,
+ *,
+ name: typing.Optional[str] = OMIT,
+ access_keys: typing.Optional[typing.Dict[str, str]] = OMIT,
+ oauth_domain: typing.Optional[str] = OMIT,
) -> OrgRead:
_request: typing.Dict[str, typing.Any] = {}
if name is not OMIT:
_request["name"] = name
if access_keys is not OMIT:
_request["access_keys"] = access_keys
+ if oauth_domain is not OMIT:
+ _request["oauth_domain"] = oauth_domain
_response = httpx.request(
"PATCH",
urllib.parse.urljoin(f"{self._environment}/", f"orgs/{id}"),
@@ -158,7 +174,7 @@ def __init__(self, *, environment: str, token: typing.Optional[str] = None):
self._environment = environment
self._token = token
- async def get_org_list(self) -> typing.List[OrgRead]:
+ async def get_orgs_list(self) -> typing.List[OrgRead]:
async with httpx.AsyncClient() as _client:
_response = await _client.request(
"GET",
@@ -176,10 +192,18 @@ async def get_org_list(self) -> typing.List[OrgRead]:
raise ApiError(status_code=_response.status_code, body=_response.text)
raise ApiError(status_code=_response.status_code, body=_response_json)
- async def add_org(self, *, name: str, access_keys: typing.Optional[typing.Dict[str, str]] = OMIT) -> typing.Any:
+ async def add_org(
+ self,
+ *,
+ name: str,
+ access_keys: typing.Optional[typing.Dict[str, str]] = OMIT,
+ oauth_domain: typing.Optional[str] = OMIT,
+ ) -> DefaultPostResponse:
_request: typing.Dict[str, typing.Any] = {"name": name}
if access_keys is not OMIT:
_request["access_keys"] = access_keys
+ if oauth_domain is not OMIT:
+ _request["oauth_domain"] = oauth_domain
async with httpx.AsyncClient() as _client:
_response = await _client.request(
"POST",
@@ -191,7 +215,7 @@ async def add_org(self, *, name: str, access_keys: typing.Optional[typing.Dict[s
timeout=60,
)
if 200 <= _response.status_code < 300:
- return pydantic.parse_obj_as(typing.Any, _response.json()) # type: ignore
+ return pydantic.parse_obj_as(DefaultPostResponse, _response.json()) # type: ignore
if _response.status_code == 400:
raise BadRequestError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
if _response.status_code == 401:
@@ -257,13 +281,20 @@ async def get_org_by_id(self, id: str) -> OrgRead:
raise ApiError(status_code=_response.status_code, body=_response_json)
async def update_org(
- self, id: str, *, name: typing.Optional[str] = OMIT, access_keys: typing.Optional[typing.Dict[str, str]] = OMIT
+ self,
+ id: str,
+ *,
+ name: typing.Optional[str] = OMIT,
+ access_keys: typing.Optional[typing.Dict[str, str]] = OMIT,
+ oauth_domain: typing.Optional[str] = OMIT,
) -> OrgRead:
_request: typing.Dict[str, typing.Any] = {}
if name is not OMIT:
_request["name"] = name
if access_keys is not OMIT:
_request["access_keys"] = access_keys
+ if oauth_domain is not OMIT:
+ _request["oauth_domain"] = oauth_domain
async with httpx.AsyncClient() as _client:
_response = await _client.request(
"PATCH",
diff --git a/clients/fern/api/python_sdk/prompton/resources/prompt_versions/client.py b/clients/fern/api/python_sdk/prompton/resources/prompt_versions/client.py
index 36a1dba..8af9704 100644
--- a/clients/fern/api/python_sdk/prompton/resources/prompt_versions/client.py
+++ b/clients/fern/api/python_sdk/prompton/resources/prompt_versions/client.py
@@ -16,6 +16,7 @@
from ...errors.unprocessable_entity_error import UnprocessableEntityError
from ...types.chat_gpt_chat_completition_config import ChatGptChatCompletitionConfig
from ...types.chat_gpt_message import ChatGptMessage
+from ...types.default_post_response import DefaultPostResponse
from ...types.prompt_version_providers import PromptVersionProviders
from ...types.prompt_version_read import PromptVersionRead
from ...types.prompt_version_status import PromptVersionStatus
@@ -65,7 +66,7 @@ def add_prompt_version(
prompt_id: str,
template: typing.Optional[typing.List[ChatGptMessage]] = OMIT,
model_config: typing.Optional[ChatGptChatCompletitionConfig] = OMIT,
- ) -> typing.Any:
+ ) -> DefaultPostResponse:
_request: typing.Dict[str, typing.Any] = {"name": name, "prompt_id": prompt_id}
if status is not OMIT:
_request["status"] = status
@@ -87,7 +88,7 @@ def add_prompt_version(
timeout=60,
)
if 200 <= _response.status_code < 300:
- return pydantic.parse_obj_as(typing.Any, _response.json()) # type: ignore
+ return pydantic.parse_obj_as(DefaultPostResponse, _response.json()) # type: ignore
if _response.status_code == 400:
raise BadRequestError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
if _response.status_code == 401:
@@ -222,7 +223,7 @@ async def add_prompt_version(
prompt_id: str,
template: typing.Optional[typing.List[ChatGptMessage]] = OMIT,
model_config: typing.Optional[ChatGptChatCompletitionConfig] = OMIT,
- ) -> typing.Any:
+ ) -> DefaultPostResponse:
_request: typing.Dict[str, typing.Any] = {"name": name, "prompt_id": prompt_id}
if status is not OMIT:
_request["status"] = status
@@ -245,7 +246,7 @@ async def add_prompt_version(
timeout=60,
)
if 200 <= _response.status_code < 300:
- return pydantic.parse_obj_as(typing.Any, _response.json()) # type: ignore
+ return pydantic.parse_obj_as(DefaultPostResponse, _response.json()) # type: ignore
if _response.status_code == 400:
raise BadRequestError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
if _response.status_code == 401:
diff --git a/clients/fern/api/python_sdk/prompton/resources/prompts/client.py b/clients/fern/api/python_sdk/prompton/resources/prompts/client.py
index d1efdbb..a9e0884 100644
--- a/clients/fern/api/python_sdk/prompton/resources/prompts/client.py
+++ b/clients/fern/api/python_sdk/prompton/resources/prompts/client.py
@@ -14,6 +14,7 @@
from ...errors.not_found_error import NotFoundError
from ...errors.unauthorized_error import UnauthorizedError
from ...errors.unprocessable_entity_error import UnprocessableEntityError
+from ...types.default_post_response import DefaultPostResponse
from ...types.prompt_read import PromptRead
from ...types.prompt_status import PromptStatus
@@ -26,7 +27,7 @@ def __init__(self, *, environment: str, token: typing.Optional[str] = None):
self._environment = environment
self._token = token
- def get_prompt_list(self) -> typing.List[PromptRead]:
+ def get_prompts_list(self) -> typing.List[PromptRead]:
_response = httpx.request(
"GET",
urllib.parse.urljoin(f"{self._environment}/", "prompts"),
@@ -53,7 +54,7 @@ def get_prompt_list(self) -> typing.List[PromptRead]:
def add_prompt(
self, *, status: typing.Optional[PromptStatus] = OMIT, name: str, description: typing.Optional[str] = OMIT
- ) -> typing.Any:
+ ) -> DefaultPostResponse:
_request: typing.Dict[str, typing.Any] = {"name": name}
if status is not OMIT:
_request["status"] = status
@@ -69,7 +70,7 @@ def add_prompt(
timeout=60,
)
if 200 <= _response.status_code < 300:
- return pydantic.parse_obj_as(typing.Any, _response.json()) # type: ignore
+ return pydantic.parse_obj_as(DefaultPostResponse, _response.json()) # type: ignore
if _response.status_code == 400:
raise BadRequestError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
if _response.status_code == 401:
@@ -174,7 +175,7 @@ def __init__(self, *, environment: str, token: typing.Optional[str] = None):
self._environment = environment
self._token = token
- async def get_prompt_list(self) -> typing.List[PromptRead]:
+ async def get_prompts_list(self) -> typing.List[PromptRead]:
async with httpx.AsyncClient() as _client:
_response = await _client.request(
"GET",
@@ -202,7 +203,7 @@ async def get_prompt_list(self) -> typing.List[PromptRead]:
async def add_prompt(
self, *, status: typing.Optional[PromptStatus] = OMIT, name: str, description: typing.Optional[str] = OMIT
- ) -> typing.Any:
+ ) -> DefaultPostResponse:
_request: typing.Dict[str, typing.Any] = {"name": name}
if status is not OMIT:
_request["status"] = status
@@ -219,7 +220,7 @@ async def add_prompt(
timeout=60,
)
if 200 <= _response.status_code < 300:
- return pydantic.parse_obj_as(typing.Any, _response.json()) # type: ignore
+ return pydantic.parse_obj_as(DefaultPostResponse, _response.json()) # type: ignore
if _response.status_code == 400:
raise BadRequestError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
if _response.status_code == 401:
diff --git a/clients/fern/api/python_sdk/prompton/resources/users/client.py b/clients/fern/api/python_sdk/prompton/resources/users/client.py
index cbe56cf..877d1f7 100644
--- a/clients/fern/api/python_sdk/prompton/resources/users/client.py
+++ b/clients/fern/api/python_sdk/prompton/resources/users/client.py
@@ -11,9 +11,11 @@
from ...core.jsonable_encoder import jsonable_encoder
from ...core.remove_none_from_headers import remove_none_from_headers
from ...errors.bad_request_error import BadRequestError
+from ...errors.conflict_error import ConflictError
from ...errors.not_found_error import NotFoundError
from ...errors.unauthorized_error import UnauthorizedError
from ...errors.unprocessable_entity_error import UnprocessableEntityError
+from ...types.default_post_response import DefaultPostResponse
from ...types.user_read import UserRead
from ...types.user_roles import UserRoles
@@ -60,7 +62,7 @@ def add_new_user(
org_id: str,
email: str,
plain_password: str,
- ) -> typing.Any:
+ ) -> DefaultPostResponse:
_request: typing.Dict[str, typing.Any] = {"org_id": org_id, "email": email, "plain_password": plain_password}
if full_name is not OMIT:
_request["full_name"] = full_name
@@ -78,11 +80,13 @@ def add_new_user(
timeout=60,
)
if 200 <= _response.status_code < 300:
- return pydantic.parse_obj_as(typing.Any, _response.json()) # type: ignore
+ return pydantic.parse_obj_as(DefaultPostResponse, _response.json()) # type: ignore
if _response.status_code == 400:
raise BadRequestError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
if _response.status_code == 401:
raise UnauthorizedError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ if _response.status_code == 409:
+ raise ConflictError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
if _response.status_code == 422:
raise UnprocessableEntityError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
try:
@@ -182,7 +186,7 @@ async def add_new_user(
org_id: str,
email: str,
plain_password: str,
- ) -> typing.Any:
+ ) -> DefaultPostResponse:
_request: typing.Dict[str, typing.Any] = {"org_id": org_id, "email": email, "plain_password": plain_password}
if full_name is not OMIT:
_request["full_name"] = full_name
@@ -201,11 +205,13 @@ async def add_new_user(
timeout=60,
)
if 200 <= _response.status_code < 300:
- return pydantic.parse_obj_as(typing.Any, _response.json()) # type: ignore
+ return pydantic.parse_obj_as(DefaultPostResponse, _response.json()) # type: ignore
if _response.status_code == 400:
raise BadRequestError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
if _response.status_code == 401:
raise UnauthorizedError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
+ if _response.status_code == 409:
+ raise ConflictError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
if _response.status_code == 422:
raise UnprocessableEntityError(pydantic.parse_obj_as(typing.Any, _response.json())) # type: ignore
try:
diff --git a/clients/fern/api/python_sdk/prompton/types/__init__.py b/clients/fern/api/python_sdk/prompton/types/__init__.py
index 65567c5..e3a47ea 100644
--- a/clients/fern/api/python_sdk/prompton/types/__init__.py
+++ b/clients/fern/api/python_sdk/prompton/types/__init__.py
@@ -12,7 +12,12 @@
from .chat_gpt_role import ChatGptRole
from .chat_gpt_token_usage import ChatGptTokenUsage
from .db_status import DbStatus
+from .default_post_response import DefaultPostResponse
+from .feedback_read import FeedbackRead
from .http_validation_error import HttpValidationError
+from .inference_create_by_prompt_id import InferenceCreateByPromptId
+from .inference_create_by_prompt_version_id import InferenceCreateByPromptVersionId
+from .inference_error import InferenceError
from .inference_post_response import InferencePostResponse
from .inference_post_response_response import InferencePostResponseResponse
from .inference_read import InferenceRead
@@ -21,6 +26,7 @@
from .inference_response_data import InferenceResponseData
from .inference_response_error import InferenceResponseError
from .inference_response_status import InferenceResponseStatus
+from .new_inference_request import NewInferenceRequest
from .org_read import OrgRead
from .prompt_read import PromptRead
from .prompt_status import PromptStatus
@@ -46,7 +52,12 @@
"ChatGptRole",
"ChatGptTokenUsage",
"DbStatus",
+ "DefaultPostResponse",
+ "FeedbackRead",
"HttpValidationError",
+ "InferenceCreateByPromptId",
+ "InferenceCreateByPromptVersionId",
+ "InferenceError",
"InferencePostResponse",
"InferencePostResponseResponse",
"InferenceRead",
@@ -55,6 +66,7 @@
"InferenceResponseData",
"InferenceResponseError",
"InferenceResponseStatus",
+ "NewInferenceRequest",
"OrgRead",
"PromptRead",
"PromptStatus",
diff --git a/clients/fern/api/python_sdk/prompton/types/chat_gpt_chat_completition_config.py b/clients/fern/api/python_sdk/prompton/types/chat_gpt_chat_completition_config.py
index 953c186..b0998ed 100644
--- a/clients/fern/api/python_sdk/prompton/types/chat_gpt_chat_completition_config.py
+++ b/clients/fern/api/python_sdk/prompton/types/chat_gpt_chat_completition_config.py
@@ -10,7 +10,7 @@
class ChatGptChatCompletitionConfig(pydantic.BaseModel):
- model: typing.Optional[str] = pydantic.Field(description=("`non-empty`\n"))
+ model: typing.Optional[str] = pydantic.Field(description=('`non-empty`\n'))
temperature: typing.Optional[float]
top_p: typing.Optional[float]
stop: typing.Optional[ChatGptChatCompletitionConfigStop]
diff --git a/clients/fern/api/python_sdk/prompton/types/chat_gpt_chat_completition_request.py b/clients/fern/api/python_sdk/prompton/types/chat_gpt_chat_completition_request.py
index 4125025..da456d2 100644
--- a/clients/fern/api/python_sdk/prompton/types/chat_gpt_chat_completition_request.py
+++ b/clients/fern/api/python_sdk/prompton/types/chat_gpt_chat_completition_request.py
@@ -11,7 +11,7 @@
class ChatGptChatCompletitionRequest(pydantic.BaseModel):
- model: typing.Optional[str] = pydantic.Field(description=("`non-empty`\n"))
+ model: typing.Optional[str] = pydantic.Field(description=('`non-empty`\n'))
temperature: typing.Optional[float]
top_p: typing.Optional[float]
stop: typing.Optional[ChatGptChatCompletitionRequestStop]
diff --git a/clients/fern/api/python_sdk/prompton/types/default_post_response.py b/clients/fern/api/python_sdk/prompton/types/default_post_response.py
new file mode 100644
index 0000000..f055fa1
--- /dev/null
+++ b/clients/fern/api/python_sdk/prompton/types/default_post_response.py
@@ -0,0 +1,28 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import datetime as dt
+import typing
+
+import pydantic
+
+from ..core.datetime_utils import serialize_datetime
+
+
+class DefaultPostResponse(pydantic.BaseModel):
+ """
+ Standard response for POST requests. Contains the id of the created item.
+ """
+
+ id: str = pydantic.Field(description=("The id of the created item\n"))
+
+ def json(self, **kwargs: typing.Any) -> str:
+ kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
+ return super().json(**kwargs_with_defaults)
+
+ def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
+ kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
+ return super().dict(**kwargs_with_defaults)
+
+ class Config:
+ frozen = True
+ json_encoders = {dt.datetime: serialize_datetime}
diff --git a/clients/fern/api/python_sdk/prompton/types/feedback_read.py b/clients/fern/api/python_sdk/prompton/types/feedback_read.py
new file mode 100644
index 0000000..b6ad4e2
--- /dev/null
+++ b/clients/fern/api/python_sdk/prompton/types/feedback_read.py
@@ -0,0 +1,52 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import datetime as dt
+import typing
+
+import pydantic
+
+from ..core.datetime_utils import serialize_datetime
+
+
+class FeedbackRead(pydantic.BaseModel):
+ """
+ Base model for reading from MongoDB. Same as MongoBaseCreate but assumes all DB base fields are populated so generated clients doesn't requrie None checks
+ """
+
+ id: str = pydantic.Field(alias="_id")
+ created_at: str
+ created_by_user_id: str
+ created_by_org_id: str
+ inference_id: str = pydantic.Field(description=("The inference being rated\n"))
+ end_user_id: typing.Optional[str] = pydantic.Field(
+ description=("API consumers' end user id If feedback from end user otherwise null\n")
+ )
+ feedback_for_part: typing.Optional[str] = pydantic.Field(
+ description=(
+ "Specifies which part of the output the feedback is about. Can be used when the inference has multiple sections which require separate feedback\n"
+ )
+ )
+ score: typing.Optional[int] = pydantic.Field(
+ description=(
+ "Any integer score. Rules are up to the API consumer. Can be null if it was flagging or note only\n"
+ )
+ )
+ flag: typing.Optional[str] = pydantic.Field(
+ description=("Any string when inference was flagged. Can be null if it is scoring or note only\n")
+ )
+ note: typing.Optional[str]
+ metadata: typing.Optional[typing.Dict[str, typing.Any]]
+ prompt_version_id: typing.Optional[str]
+
+ def json(self, **kwargs: typing.Any) -> str:
+ kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
+ return super().json(**kwargs_with_defaults)
+
+ def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
+ kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
+ return super().dict(**kwargs_with_defaults)
+
+ class Config:
+ frozen = True
+ allow_population_by_field_name = True
+ json_encoders = {dt.datetime: serialize_datetime}
diff --git a/clients/fern/api/python_sdk/prompton/types/inference_create_by_prompt_id.py b/clients/fern/api/python_sdk/prompton/types/inference_create_by_prompt_id.py
new file mode 100644
index 0000000..0b829ef
--- /dev/null
+++ b/clients/fern/api/python_sdk/prompton/types/inference_create_by_prompt_id.py
@@ -0,0 +1,48 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import datetime as dt
+import typing
+
+import pydantic
+
+from ..core.datetime_utils import serialize_datetime
+
+
+class InferenceCreateByPromptId(pydantic.BaseModel):
+ """
+ Create inference by `prompt_id`. It can only be used if there is at least one 'Live' status prompt version for the provided `prompt_id`.
+ If there are multiple prompt versions in Live status it will pick one randomly. Useful for split testing prompt versions.
+ It stores all other `prompt_version_id`s in Live status at the time of the inference in `prompt_version_ids_considered` field.
+ """
+
+ end_user_id: typing.Optional[str] = pydantic.Field(
+ description=(
+ "The API consumer's internal user reference for metrics. It is also relayed to the provider as part of the request if the provider supports it (eg. OpenAI's user field).\n"
+ )
+ )
+ source: typing.Optional[str] = pydantic.Field(
+ description=("The API consumer's source for metrics (e.g. AndroidApp etc).\n")
+ )
+ client_ref_id: typing.Optional[str] = pydantic.Field(
+ description=("The API consumer's internal reference id to able to link references to their sessions.\n")
+ )
+ template_args: typing.Optional[typing.Dict[str, str]]
+ metadata: typing.Optional[typing.Dict[str, typing.Any]]
+ request_timeout: typing.Optional[float] = pydantic.Field(
+ description=(
+ "Provider request timout in seconds. If not provided, then Prompton API's default timeout for the provider will be used (90sec or `DEFAULT_OPENAI_REQUEST_TIMEOUT_SECONDS` env var if provided).\n"
+ )
+ )
+ prompt_id: str
+
+ def json(self, **kwargs: typing.Any) -> str:
+ kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
+ return super().json(**kwargs_with_defaults)
+
+ def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
+ kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
+ return super().dict(**kwargs_with_defaults)
+
+ class Config:
+ frozen = True
+ json_encoders = {dt.datetime: serialize_datetime}
diff --git a/clients/fern/api/python_sdk/prompton/types/inference_create_by_prompt_version_id.py b/clients/fern/api/python_sdk/prompton/types/inference_create_by_prompt_version_id.py
new file mode 100644
index 0000000..d458307
--- /dev/null
+++ b/clients/fern/api/python_sdk/prompton/types/inference_create_by_prompt_version_id.py
@@ -0,0 +1,42 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import datetime as dt
+import typing
+
+import pydantic
+
+from ..core.datetime_utils import serialize_datetime
+
+
+class InferenceCreateByPromptVersionId(pydantic.BaseModel):
+ end_user_id: typing.Optional[str] = pydantic.Field(
+ description=(
+ "The API consumer's internal user reference for metrics. It is also relayed to the provider as part of the request if the provider supports it (eg. OpenAI's user field).\n"
+ )
+ )
+ source: typing.Optional[str] = pydantic.Field(
+ description=("The API consumer's source for metrics (e.g. AndroidApp etc).\n")
+ )
+ client_ref_id: typing.Optional[str] = pydantic.Field(
+ description=("The API consumer's internal reference id to able to link references to their sessions.\n")
+ )
+ template_args: typing.Optional[typing.Dict[str, str]]
+ metadata: typing.Optional[typing.Dict[str, typing.Any]]
+ request_timeout: typing.Optional[float] = pydantic.Field(
+ description=(
+ "Provider request timout in seconds. If not provided, then Prompton API's default timeout for the provider will be used (90sec or `DEFAULT_OPENAI_REQUEST_TIMEOUT_SECONDS` env var if provided).\n"
+ )
+ )
+ prompt_version_id: str
+
+ def json(self, **kwargs: typing.Any) -> str:
+ kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
+ return super().json(**kwargs_with_defaults)
+
+ def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
+ kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
+ return super().dict(**kwargs_with_defaults)
+
+ class Config:
+ frozen = True
+ json_encoders = {dt.datetime: serialize_datetime}
diff --git a/clients/fern/api/python_sdk/prompton/types/inference_error.py b/clients/fern/api/python_sdk/prompton/types/inference_error.py
new file mode 100644
index 0000000..6cf3081
--- /dev/null
+++ b/clients/fern/api/python_sdk/prompton/types/inference_error.py
@@ -0,0 +1,26 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import datetime as dt
+import typing
+
+import pydantic
+
+from ..core.datetime_utils import serialize_datetime
+
+
+class InferenceError(pydantic.BaseModel):
+ error_class: str
+ message: str
+ details: typing.Optional[typing.Any]
+
+ def json(self, **kwargs: typing.Any) -> str:
+ kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
+ return super().json(**kwargs_with_defaults)
+
+ def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
+ kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
+ return super().dict(**kwargs_with_defaults)
+
+ class Config:
+ frozen = True
+ json_encoders = {dt.datetime: serialize_datetime}
diff --git a/clients/fern/api/python_sdk/prompton/types/inference_read.py b/clients/fern/api/python_sdk/prompton/types/inference_read.py
index 12d0192..3c5e0b5 100644
--- a/clients/fern/api/python_sdk/prompton/types/inference_read.py
+++ b/clients/fern/api/python_sdk/prompton/types/inference_read.py
@@ -12,20 +12,38 @@
class InferenceRead(pydantic.BaseModel):
- id: typing.Optional[str] = pydantic.Field(alias="_id")
- created_at: typing.Optional[str]
- created_by_user_id: typing.Optional[str]
- created_by_org_id: typing.Optional[str]
- end_user_id: str = pydantic.Field(description=("`non-empty`\n"))
- source: str = pydantic.Field(description=("`non-empty`\n"))
- template_args: typing.Optional[typing.Dict[str, str]]
+ """
+ Base model for reading from MongoDB. Same as MongoBaseCreate but assumes all DB base fields are populated so generated clients doesn't requrie None checks
+ """
+
+ id: str = pydantic.Field(alias="_id")
+ created_at: str
+ created_by_user_id: str
+ created_by_org_id: str
+ end_user_id: typing.Optional[str] = pydantic.Field(
+ description=(
+ "The API consumer's internal user reference for metrics. It is also relayed to the provider as part of the request if the provider supports it (eg. OpenAI's user field).\n"
+ )
+ )
+ source: typing.Optional[str] = pydantic.Field(
+ description=("The API consumer's source for metrics (e.g. AndroidApp etc).\n")
+ )
+ client_ref_id: typing.Optional[str] = pydantic.Field(
+ description=("The API consumer's internal reference id to able to link references to their sessions.\n")
+ )
+ template_args: typing.Dict[str, str]
metadata: typing.Optional[typing.Dict[str, typing.Any]]
- request_timeout: typing.Optional[float]
+ request_timeout: typing.Optional[float] = pydantic.Field(
+ description=(
+ "Provider request timout in seconds. If not provided, then Prompton API's default timeout for the provider will be used (90sec or `DEFAULT_OPENAI_REQUEST_TIMEOUT_SECONDS` env var if provided).\n"
+ )
+ )
prompt_version_id: str
+ prompt_version_ids_considered: typing.List[str]
prompt_id: str
- prompt_version_name: typing.Optional[str]
- status: typing.Optional[InferenceResponseStatus]
- request: typing.Optional[InferenceRequestData]
+ prompt_version_name: str
+ status: InferenceResponseStatus
+ request: InferenceRequestData
response: typing.Optional[InferenceReadResponse]
def json(self, **kwargs: typing.Any) -> str:
diff --git a/clients/fern/api/python_sdk/prompton/types/inference_response_data.py b/clients/fern/api/python_sdk/prompton/types/inference_response_data.py
index d7bbfb3..e3a4a90 100644
--- a/clients/fern/api/python_sdk/prompton/types/inference_response_data.py
+++ b/clients/fern/api/python_sdk/prompton/types/inference_response_data.py
@@ -7,7 +7,6 @@
from ..core.datetime_utils import serialize_datetime
from .chat_gpt_chat_completition_response import ChatGptChatCompletitionResponse
-from .chat_gpt_message import ChatGptMessage
from .chat_gpt_token_usage import ChatGptTokenUsage
@@ -16,7 +15,6 @@ class InferenceResponseData(pydantic.BaseModel):
completition_duration_seconds: typing.Optional[float]
is_client_connected_at_finish: typing.Optional[bool]
is_error: typing.Optional[bool] = pydantic.Field(alias="isError")
- first_message: ChatGptMessage
token_usage: ChatGptTokenUsage
raw_response: ChatGptChatCompletitionResponse
diff --git a/clients/fern/api/python_sdk/prompton/types/inference_response_error.py b/clients/fern/api/python_sdk/prompton/types/inference_response_error.py
index 50c2ffd..6993993 100644
--- a/clients/fern/api/python_sdk/prompton/types/inference_response_error.py
+++ b/clients/fern/api/python_sdk/prompton/types/inference_response_error.py
@@ -6,6 +6,7 @@
import pydantic
from ..core.datetime_utils import serialize_datetime
+from .inference_error import InferenceError
class InferenceResponseError(pydantic.BaseModel):
@@ -13,7 +14,7 @@ class InferenceResponseError(pydantic.BaseModel):
completition_duration_seconds: typing.Optional[float]
is_client_connected_at_finish: typing.Optional[bool]
is_error: typing.Optional[bool] = pydantic.Field(alias="isError")
- error: typing.Optional[typing.Any]
+ error: InferenceError
def json(self, **kwargs: typing.Any) -> str:
kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
diff --git a/clients/fern/api/python_sdk/prompton/types/new_inference_request.py b/clients/fern/api/python_sdk/prompton/types/new_inference_request.py
new file mode 100644
index 0000000..6540661
--- /dev/null
+++ b/clients/fern/api/python_sdk/prompton/types/new_inference_request.py
@@ -0,0 +1,8 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+from .inference_create_by_prompt_id import InferenceCreateByPromptId
+from .inference_create_by_prompt_version_id import InferenceCreateByPromptVersionId
+
+NewInferenceRequest = typing.Union[InferenceCreateByPromptVersionId, InferenceCreateByPromptId]
diff --git a/clients/fern/api/python_sdk/prompton/types/org_read.py b/clients/fern/api/python_sdk/prompton/types/org_read.py
index 953fcd9..e44feb2 100644
--- a/clients/fern/api/python_sdk/prompton/types/org_read.py
+++ b/clients/fern/api/python_sdk/prompton/types/org_read.py
@@ -9,11 +9,20 @@
class OrgRead(pydantic.BaseModel):
- id: typing.Optional[str] = pydantic.Field(alias="_id")
- created_at: typing.Optional[str]
- created_by_user_id: typing.Optional[str]
- created_by_org_id: typing.Optional[str]
- name: str = pydantic.Field(description=("`non-empty`\n"))
+ """
+ Base model for reading from MongoDB. Same as MongoBaseCreate but assumes all DB base fields are populated so generated clients doesn't requrie None checks
+ """
+
+ id: str = pydantic.Field(alias="_id")
+ created_at: str
+ created_by_user_id: str
+ created_by_org_id: str
+ name: str
+ oauth_domain: typing.Optional[str] = pydantic.Field(
+ description=(
+ "APEX domain for oauth single sign on. Anyone with an email address ending in this domain will be able to register to the org after google account sign in. Only Google OAuth is supported for now.\n"
+ )
+ )
access_keys: typing.Optional[typing.Dict[str, str]]
def json(self, **kwargs: typing.Any) -> str:
diff --git a/clients/fern/api/python_sdk/prompton/types/prompt_read.py b/clients/fern/api/python_sdk/prompton/types/prompt_read.py
index 2dfc939..85a954a 100644
--- a/clients/fern/api/python_sdk/prompton/types/prompt_read.py
+++ b/clients/fern/api/python_sdk/prompton/types/prompt_read.py
@@ -10,12 +10,16 @@
class PromptRead(pydantic.BaseModel):
- id: typing.Optional[str] = pydantic.Field(alias="_id")
- created_at: typing.Optional[str]
- created_by_user_id: typing.Optional[str]
- created_by_org_id: typing.Optional[str]
- status: typing.Optional[PromptStatus]
- name: str = pydantic.Field(description=("`non-empty`\n"))
+ """
+ Base model for reading from MongoDB. Same as MongoBaseCreate but assumes all DB base fields are populated so generated clients doesn't requrie None checks
+ """
+
+ id: str = pydantic.Field(alias="_id")
+ created_at: str
+ created_by_user_id: str
+ created_by_org_id: str
+ status: PromptStatus
+ name: str = pydantic.Field(description=('`non-empty`\n'))
description: typing.Optional[str]
def json(self, **kwargs: typing.Any) -> str:
diff --git a/clients/fern/api/python_sdk/prompton/types/prompt_version_providers.py b/clients/fern/api/python_sdk/prompton/types/prompt_version_providers.py
index fb4f6df..c2ec9ad 100644
--- a/clients/fern/api/python_sdk/prompton/types/prompt_version_providers.py
+++ b/clients/fern/api/python_sdk/prompton/types/prompt_version_providers.py
@@ -1,18 +1,5 @@
# This file was auto-generated by Fern from our API Definition.
-import enum
-import typing
+import typing_extensions
-T_Result = typing.TypeVar("T_Result")
-
-
-class PromptVersionProviders(str, enum.Enum):
- """
- Currently only OpenAI is supported
- """
-
- OPEN_AI = "OpenAI"
-
- def visit(self, open_ai: typing.Callable[[], T_Result]) -> T_Result:
- if self is PromptVersionProviders.OPEN_AI:
- return open_ai()
+PromptVersionProviders = typing_extensions.Literal["OpenAI"]
diff --git a/clients/fern/api/python_sdk/prompton/types/prompt_version_read.py b/clients/fern/api/python_sdk/prompton/types/prompt_version_read.py
index 7d42efa..a8253bd 100644
--- a/clients/fern/api/python_sdk/prompton/types/prompt_version_read.py
+++ b/clients/fern/api/python_sdk/prompton/types/prompt_version_read.py
@@ -13,18 +13,24 @@
class PromptVersionRead(pydantic.BaseModel):
- id: typing.Optional[str] = pydantic.Field(alias="_id")
- created_at: typing.Optional[str]
- created_by_user_id: typing.Optional[str]
- created_by_org_id: typing.Optional[str]
- status: typing.Optional[PromptVersionStatus]
- provider: typing.Optional[PromptVersionProviders]
- name: str = pydantic.Field(description=("`non-empty`\n"))
+ """
+ Base model for reading from MongoDB. Same as MongoBaseCreate but assumes all DB base fields are populated so generated clients doesn't requrie None checks
+ """
+
+ id: str = pydantic.Field(alias="_id")
+ created_at: str
+ created_by_user_id: str
+ created_by_org_id: str
+ status: PromptVersionStatus
+ provider: PromptVersionProviders
+ name: str = pydantic.Field(description=('`non-empty`\n'))
description: typing.Optional[str]
prompt_id: str
- template: typing.Optional[typing.List[ChatGptMessage]]
+ template: typing.List[ChatGptMessage]
model_config: typing.Optional[ChatGptChatCompletitionConfig]
- template_arg_names: typing.Optional[typing.List[str]]
+ template_arg_names: typing.List[str] = pydantic.Field(
+ description=("List of args in the template - populated by server at PATHC and POST\n")
+ )
def json(self, **kwargs: typing.Any) -> str:
kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
diff --git a/clients/fern/api/python_sdk/prompton/types/user_read.py b/clients/fern/api/python_sdk/prompton/types/user_read.py
index 3d4e079..44f225d 100644
--- a/clients/fern/api/python_sdk/prompton/types/user_read.py
+++ b/clients/fern/api/python_sdk/prompton/types/user_read.py
@@ -10,12 +10,18 @@
class UserRead(pydantic.BaseModel):
- id: typing.Optional[str] = pydantic.Field(alias="_id")
- created_at: typing.Optional[str]
- created_by_user_id: typing.Optional[str]
- created_by_org_id: typing.Optional[str]
- full_name: typing.Optional[str] = pydantic.Field(description=("`non-empty`\n"))
- disabled: typing.Optional[bool]
+ """
+ Base model for reading from MongoDB. Same as MongoBaseCreate but assumes all DB base fields are populated so generated clients doesn't requrie None checks
+ """
+
+ id: str = pydantic.Field(alias="_id")
+ created_at: str
+ created_by_user_id: str
+ created_by_org_id: str
+ full_name: typing.Optional[str] = pydantic.Field(
+ description=('`non-empty`\n')
+ )
+ disabled: bool
role: typing.Optional[UserRoles]
org_id: str
email: str
diff --git a/clients/fern/api/python_sdk/prompton/types/user_roles.py b/clients/fern/api/python_sdk/prompton/types/user_roles.py
index 4b01c28..93e8fc2 100644
--- a/clients/fern/api/python_sdk/prompton/types/user_roles.py
+++ b/clients/fern/api/python_sdk/prompton/types/user_roles.py
@@ -12,17 +12,21 @@ class UserRoles(str, enum.Enum):
"""
BASIC = "Basic"
+ PROMPT_ADMIN = "PromptAdmin"
ORG_ADMIN = "OrgAdmin"
SUPER_ADMIN = "SuperAdmin"
def visit(
self,
basic: typing.Callable[[], T_Result],
+ prompt_admin: typing.Callable[[], T_Result],
org_admin: typing.Callable[[], T_Result],
super_admin: typing.Callable[[], T_Result],
) -> T_Result:
if self is UserRoles.BASIC:
return basic()
+ if self is UserRoles.PROMPT_ADMIN:
+ return prompt_admin()
if self is UserRoles.ORG_ADMIN:
return org_admin()
if self is UserRoles.SUPER_ADMIN:
diff --git a/clients/fern/api/python_sdk/pyproject.toml b/clients/fern/api/python_sdk/pyproject.toml
index 7b38820..83c5111 100644
--- a/clients/fern/api/python_sdk/pyproject.toml
+++ b/clients/fern/api/python_sdk/pyproject.toml
@@ -1,12 +1,12 @@
[tool.poetry]
name = "prompton"
-version = "0.0.2"
+version = "0.0.10"
description = "Chat prompt template evaluation and inference monitoring"
authors = ["PromptOn "]
readme = "README.md"
[tool.poetry.dependencies]
-python = ">=3.10"
+python = ">=3.7"
httpx = "^0.24.1"
pydantic = { version = "^1.10.8", extras = ["email"] }
diff --git a/clients/fern/fern.config.json b/clients/fern/fern.config.json
index 692ff4b..aa9887d 100644
--- a/clients/fern/fern.config.json
+++ b/clients/fern/fern.config.json
@@ -1,4 +1,4 @@
{
"organization": "prompton",
- "version": "0.10.15"
+ "version": "0.11.2"
}
\ No newline at end of file
diff --git a/clients/justfile b/clients/justfile
index 14cf7e4..7bf3b26 100644
--- a/clients/justfile
+++ b/clients/justfile
@@ -1,4 +1,5 @@
# Client SDK generation scripts
+# TODO: clean and build all clients before generating
default:
just --list
@@ -6,5 +7,36 @@ default:
install:
npm install
+# updates openapi.yml from server/generated and generates clients with fern
generate-clients:
- npx fern generate
\ No newline at end of file
+ cp ../server/generated/openapi/openapi.yml fern/api/openapi
+ npx fern generate
+
+# bump version numbers manually in all packages before!
+publish-all-clients:
+ just publish-fern-python
+ just publish-fern-node
+
+# requires manual version bump in pyproject.toml before!
+publish-fern-python:
+ #!/usr/bin/env bash
+ cd fern/api/python_sdk
+ just install
+ just build-publish
+
+# requires manual version bump in package.json before!
+publish-fern-node:
+ #!/usr/bin/env bash
+ cd fern/api/node_sdk
+ just install
+ just build-publish
+
+# testing openapi-generator (not in use)
+openapi-generator-generate-node:
+ #!/usr/bin/env bash
+ # npx @openapitools/openapi-generator-cli generate -i openapi/openapi.yml -g typescript-axios -o openapi/generated
+ npx openapi-generator-cli generate -i ./fern/api/openapi/openapi.yml -g typescript-node -o ./openapi-generator/typescript-node --additional-properties=supportsES6=true,npmName=@prompton/api
+
+# testing openapi-generator (not in use)
+openapi-generator-generate-python:
+ npx openapi-generator-cli generate -i ./fern/api/openapi/openapi.yml -g python-nextgen -o ./openapi-generator/python-nextgen
\ No newline at end of file
diff --git a/clients/openapi-generator/openapitools.json b/clients/openapi-generator/openapitools.json
new file mode 100644
index 0000000..cd53ff4
--- /dev/null
+++ b/clients/openapi-generator/openapitools.json
@@ -0,0 +1,7 @@
+{
+ "$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json",
+ "spaces": 2,
+ "generator-cli": {
+ "version": "6.6.0"
+ }
+}
diff --git a/clients/openapi-generator/typescript-node/.gitignore b/clients/openapi-generator/typescript-node/.gitignore
new file mode 100644
index 0000000..149b576
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/.gitignore
@@ -0,0 +1,4 @@
+wwwroot/*.js
+node_modules
+typings
+dist
diff --git a/clients/openapi-generator/typescript-node/.openapi-generator-ignore b/clients/openapi-generator/typescript-node/.openapi-generator-ignore
new file mode 100644
index 0000000..7484ee5
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/.openapi-generator-ignore
@@ -0,0 +1,23 @@
+# OpenAPI Generator Ignore
+# Generated by openapi-generator https://github.com/openapitools/openapi-generator
+
+# Use this file to prevent files from being overwritten by the generator.
+# The patterns follow closely to .gitignore or .dockerignore.
+
+# As an example, the C# client generator defines ApiClient.cs.
+# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
+#ApiClient.cs
+
+# You can match any string of characters against a directory, file or extension with a single asterisk (*):
+#foo/*/qux
+# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
+
+# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
+#foo/**/qux
+# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
+
+# You can also negate patterns with an exclamation (!).
+# For example, you can ignore all files in a docs folder with the file extension .md:
+#docs/*.md
+# Then explicitly reverse the ignore rule for a single file:
+#!docs/README.md
diff --git a/clients/openapi-generator/typescript-node/.openapi-generator/FILES b/clients/openapi-generator/typescript-node/.openapi-generator/FILES
new file mode 100644
index 0000000..4e763ea
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/.openapi-generator/FILES
@@ -0,0 +1,55 @@
+.gitignore
+api.ts
+api/apis.ts
+api/authenticationApi.ts
+api/defaultApi.ts
+api/inferencesApi.ts
+api/orgsApi.ts
+api/promptVersionsApi.ts
+api/promptsApi.ts
+api/serverStatusApi.ts
+api/usersApi.ts
+git_push.sh
+model/apiStatusResponse.ts
+model/chatGPTChatCompletitionConfig.ts
+model/chatGPTChatCompletitionRequest.ts
+model/chatGPTChatCompletitionResponse.ts
+model/chatGPTCompletitionChoice.ts
+model/chatGPTMessage.ts
+model/chatGPTRole.ts
+model/chatGPTTokenUsage.ts
+model/dBStatus.ts
+model/hTTPValidationError.ts
+model/inferenceCreateByPromptId.ts
+model/inferenceCreateByPromptVersionId.ts
+model/inferencePostResponse.ts
+model/inferenceRead.ts
+model/inferenceRequestData.ts
+model/inferenceResponseData.ts
+model/inferenceResponseError.ts
+model/inferenceResponseStatus.ts
+model/inferencerequest.ts
+model/locationInner.ts
+model/loginCredentialsPost.ts
+model/models.ts
+model/orgCreate.ts
+model/orgRead.ts
+model/orgUpdate.ts
+model/promptCreate.ts
+model/promptRead.ts
+model/promptStatus.ts
+model/promptUpdate.ts
+model/promptVersionCreate.ts
+model/promptVersionProviders.ts
+model/promptVersionRead.ts
+model/promptVersionStatus.ts
+model/promptVersionUpdate.ts
+model/response.ts
+model/stop.ts
+model/token.ts
+model/userCreate.ts
+model/userRead.ts
+model/userRoles.ts
+model/validationError.ts
+package.json
+tsconfig.json
diff --git a/clients/openapi-generator/typescript-node/.openapi-generator/VERSION b/clients/openapi-generator/typescript-node/.openapi-generator/VERSION
new file mode 100644
index 0000000..cd802a1
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/.openapi-generator/VERSION
@@ -0,0 +1 @@
+6.6.0
\ No newline at end of file
diff --git a/clients/openapi-generator/typescript-node/api.ts b/clients/openapi-generator/typescript-node/api.ts
new file mode 100644
index 0000000..4b76122
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/api.ts
@@ -0,0 +1,3 @@
+// This is the entrypoint for the package
+export * from './api/apis';
+export * from './model/models';
\ No newline at end of file
diff --git a/clients/openapi-generator/typescript-node/api/apis.ts b/clients/openapi-generator/typescript-node/api/apis.ts
new file mode 100644
index 0000000..b801d1b
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/api/apis.ts
@@ -0,0 +1,28 @@
+export * from './authenticationApi';
+import { AuthenticationApi } from './authenticationApi';
+export * from './defaultApi';
+import { DefaultApi } from './defaultApi';
+export * from './inferencesApi';
+import { InferencesApi } from './inferencesApi';
+export * from './orgsApi';
+import { OrgsApi } from './orgsApi';
+export * from './promptVersionsApi';
+import { PromptVersionsApi } from './promptVersionsApi';
+export * from './promptsApi';
+import { PromptsApi } from './promptsApi';
+export * from './serverStatusApi';
+import { ServerStatusApi } from './serverStatusApi';
+export * from './usersApi';
+import { UsersApi } from './usersApi';
+import * as http from 'http';
+
+export class HttpError extends Error {
+ constructor (public response: http.IncomingMessage, public body: any, public statusCode?: number) {
+ super('HTTP request failed');
+ this.name = 'HttpError';
+ }
+}
+
+export { RequestFile } from '../model/models';
+
+export const APIS = [AuthenticationApi, DefaultApi, InferencesApi, OrgsApi, PromptVersionsApi, PromptsApi, ServerStatusApi, UsersApi];
diff --git a/clients/openapi-generator/typescript-node/api/authenticationApi.ts b/clients/openapi-generator/typescript-node/api/authenticationApi.ts
new file mode 100644
index 0000000..fe3166a
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/api/authenticationApi.ts
@@ -0,0 +1,268 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+import localVarRequest from 'request';
+import http from 'http';
+
+/* tslint:disable:no-unused-locals */
+import { HTTPValidationError } from '../model/hTTPValidationError';
+import { LoginCredentialsPost } from '../model/loginCredentialsPost';
+import { Token } from '../model/token';
+
+import { ObjectSerializer, Authentication, VoidAuth, Interceptor } from '../model/models';
+import { HttpBasicAuth, HttpBearerAuth, ApiKeyAuth, OAuth } from '../model/models';
+
+import { HttpError, RequestFile } from './apis';
+
+let defaultBasePath = 'http://localhost';
+
+// ===============================================
+// This file is autogenerated - Please do not edit
+// ===============================================
+
+export enum AuthenticationApiApiKeys {
+}
+
+export class AuthenticationApi {
+ protected _basePath = defaultBasePath;
+ protected _defaultHeaders : any = {};
+ protected _useQuerystring : boolean = false;
+
+ protected authentications = {
+ 'default': new VoidAuth(),
+ 'JWT': new OAuth(),
+ }
+
+ protected interceptors: Interceptor[] = [];
+
+ constructor(basePath?: string);
+ constructor(basePathOrUsername: string, password?: string, basePath?: string) {
+ if (password) {
+ if (basePath) {
+ this.basePath = basePath;
+ }
+ } else {
+ if (basePathOrUsername) {
+ this.basePath = basePathOrUsername
+ }
+ }
+ }
+
+ set useQuerystring(value: boolean) {
+ this._useQuerystring = value;
+ }
+
+ set basePath(basePath: string) {
+ this._basePath = basePath;
+ }
+
+ set defaultHeaders(defaultHeaders: any) {
+ this._defaultHeaders = defaultHeaders;
+ }
+
+ get defaultHeaders() {
+ return this._defaultHeaders;
+ }
+
+ get basePath() {
+ return this._basePath;
+ }
+
+ public setDefaultAuthentication(auth: Authentication) {
+ this.authentications.default = auth;
+ }
+
+ public setApiKey(key: AuthenticationApiApiKeys, value: string) {
+ (this.authentications as any)[AuthenticationApiApiKeys[key]].apiKey = value;
+ }
+
+ set accessToken(token: string) {
+ this.authentications.JWT.accessToken = token;
+ }
+
+ public addInterceptor(interceptor: Interceptor) {
+ this.interceptors.push(interceptor);
+ }
+
+ /**
+ * Same functionality as /token but taking `username` and `password` args as `application/json` type instead of `application/x-www-form-urlencoded` Don\'t use it becuase it\'s a **temporary** workaround for client lib generator and will be removed in the future.
+ * @summary Get Access Token
+ * @param loginCredentialsPost
+ */
+ public async getAccessToken (loginCredentialsPost: LoginCredentialsPost, options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: Token; }> {
+ const localVarPath = this.basePath + '/token_basic';
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ // verify required parameter 'loginCredentialsPost' is not null or undefined
+ if (loginCredentialsPost === null || loginCredentialsPost === undefined) {
+ throw new Error('Required parameter loginCredentialsPost was null or undefined when calling getAccessToken.');
+ }
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'POST',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ body: ObjectSerializer.serialize(loginCredentialsPost, "LoginCredentialsPost")
+ };
+
+ let authenticationPromise = Promise.resolve();
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: Token; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "Token");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+ /**
+ *
+ * @summary Get Access Token Extended
+ * @param username
+ * @param password
+ * @param grantType
+ * @param scope
+ * @param clientId
+ * @param clientSecret
+ */
+ public async getAccessTokenExtended (username: string, password: string, grantType?: string, scope?: string, clientId?: string, clientSecret?: string, options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: Token; }> {
+ const localVarPath = this.basePath + '/token';
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ // verify required parameter 'username' is not null or undefined
+ if (username === null || username === undefined) {
+ throw new Error('Required parameter username was null or undefined when calling getAccessTokenExtended.');
+ }
+
+ // verify required parameter 'password' is not null or undefined
+ if (password === null || password === undefined) {
+ throw new Error('Required parameter password was null or undefined when calling getAccessTokenExtended.');
+ }
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ if (grantType !== undefined) {
+ localVarFormParams['grant_type'] = ObjectSerializer.serialize(grantType, "string");
+ }
+
+ if (username !== undefined) {
+ localVarFormParams['username'] = ObjectSerializer.serialize(username, "string");
+ }
+
+ if (password !== undefined) {
+ localVarFormParams['password'] = ObjectSerializer.serialize(password, "string");
+ }
+
+ if (scope !== undefined) {
+ localVarFormParams['scope'] = ObjectSerializer.serialize(scope, "string");
+ }
+
+ if (clientId !== undefined) {
+ localVarFormParams['client_id'] = ObjectSerializer.serialize(clientId, "string");
+ }
+
+ if (clientSecret !== undefined) {
+ localVarFormParams['client_secret'] = ObjectSerializer.serialize(clientSecret, "string");
+ }
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'POST',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ };
+
+ let authenticationPromise = Promise.resolve();
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: Token; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "Token");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+}
diff --git a/clients/openapi-generator/typescript-node/api/defaultApi.ts b/clients/openapi-generator/typescript-node/api/defaultApi.ts
new file mode 100644
index 0000000..722c740
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/api/defaultApi.ts
@@ -0,0 +1,156 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+import localVarRequest from 'request';
+import http from 'http';
+
+/* tslint:disable:no-unused-locals */
+
+import { ObjectSerializer, Authentication, VoidAuth, Interceptor } from '../model/models';
+import { HttpBasicAuth, HttpBearerAuth, ApiKeyAuth, OAuth } from '../model/models';
+
+import { HttpError, RequestFile } from './apis';
+
+let defaultBasePath = 'http://localhost';
+
+// ===============================================
+// This file is autogenerated - Please do not edit
+// ===============================================
+
+export enum DefaultApiApiKeys {
+}
+
+export class DefaultApi {
+ protected _basePath = defaultBasePath;
+ protected _defaultHeaders : any = {};
+ protected _useQuerystring : boolean = false;
+
+ protected authentications = {
+ 'default': new VoidAuth(),
+ 'JWT': new OAuth(),
+ }
+
+ protected interceptors: Interceptor[] = [];
+
+ constructor(basePath?: string);
+ constructor(basePathOrUsername: string, password?: string, basePath?: string) {
+ if (password) {
+ if (basePath) {
+ this.basePath = basePath;
+ }
+ } else {
+ if (basePathOrUsername) {
+ this.basePath = basePathOrUsername
+ }
+ }
+ }
+
+ set useQuerystring(value: boolean) {
+ this._useQuerystring = value;
+ }
+
+ set basePath(basePath: string) {
+ this._basePath = basePath;
+ }
+
+ set defaultHeaders(defaultHeaders: any) {
+ this._defaultHeaders = defaultHeaders;
+ }
+
+ get defaultHeaders() {
+ return this._defaultHeaders;
+ }
+
+ get basePath() {
+ return this._basePath;
+ }
+
+ public setDefaultAuthentication(auth: Authentication) {
+ this.authentications.default = auth;
+ }
+
+ public setApiKey(key: DefaultApiApiKeys, value: string) {
+ (this.authentications as any)[DefaultApiApiKeys[key]].apiKey = value;
+ }
+
+ set accessToken(token: string) {
+ this.authentications.JWT.accessToken = token;
+ }
+
+ public addInterceptor(interceptor: Interceptor) {
+ this.interceptors.push(interceptor);
+ }
+
+ /**
+ *
+ * @summary Swagger Docs
+ */
+ public async swaggerDocsHead (options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: any; }> {
+ const localVarPath = this.basePath + '/';
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'HEAD',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ };
+
+ let authenticationPromise = Promise.resolve();
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: any; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "any");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+}
diff --git a/clients/openapi-generator/typescript-node/api/inferencesApi.ts b/clients/openapi-generator/typescript-node/api/inferencesApi.ts
new file mode 100644
index 0000000..7831957
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/api/inferencesApi.ts
@@ -0,0 +1,317 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+import localVarRequest from 'request';
+import http from 'http';
+
+/* tslint:disable:no-unused-locals */
+import { HTTPValidationError } from '../model/hTTPValidationError';
+import { InferencePostResponse } from '../model/inferencePostResponse';
+import { InferenceRead } from '../model/inferenceRead';
+import { Inferencerequest } from '../model/inferencerequest';
+
+import { ObjectSerializer, Authentication, VoidAuth, Interceptor } from '../model/models';
+import { HttpBasicAuth, HttpBearerAuth, ApiKeyAuth, OAuth } from '../model/models';
+
+import { HttpError, RequestFile } from './apis';
+
+let defaultBasePath = 'http://localhost';
+
+// ===============================================
+// This file is autogenerated - Please do not edit
+// ===============================================
+
+export enum InferencesApiApiKeys {
+}
+
+export class InferencesApi {
+ protected _basePath = defaultBasePath;
+ protected _defaultHeaders : any = {};
+ protected _useQuerystring : boolean = false;
+
+ protected authentications = {
+ 'default': new VoidAuth(),
+ 'JWT': new OAuth(),
+ }
+
+ protected interceptors: Interceptor[] = [];
+
+ constructor(basePath?: string);
+ constructor(basePathOrUsername: string, password?: string, basePath?: string) {
+ if (password) {
+ if (basePath) {
+ this.basePath = basePath;
+ }
+ } else {
+ if (basePathOrUsername) {
+ this.basePath = basePathOrUsername
+ }
+ }
+ }
+
+ set useQuerystring(value: boolean) {
+ this._useQuerystring = value;
+ }
+
+ set basePath(basePath: string) {
+ this._basePath = basePath;
+ }
+
+ set defaultHeaders(defaultHeaders: any) {
+ this._defaultHeaders = defaultHeaders;
+ }
+
+ get defaultHeaders() {
+ return this._defaultHeaders;
+ }
+
+ get basePath() {
+ return this._basePath;
+ }
+
+ public setDefaultAuthentication(auth: Authentication) {
+ this.authentications.default = auth;
+ }
+
+ public setApiKey(key: InferencesApiApiKeys, value: string) {
+ (this.authentications as any)[InferencesApiApiKeys[key]].apiKey = value;
+ }
+
+ set accessToken(token: string) {
+ this.authentications.JWT.accessToken = token;
+ }
+
+ public addInterceptor(interceptor: Interceptor) {
+ this.interceptors.push(interceptor);
+ }
+
+ /**
+ *
+ * @summary Get Inference By Id
+ * @param id
+ */
+ public async getInferenceById (id: string, options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: InferenceRead; }> {
+ const localVarPath = this.basePath + '/inferences/{id}'
+ .replace('{' + 'id' + '}', encodeURIComponent(String(id)));
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ // verify required parameter 'id' is not null or undefined
+ if (id === null || id === undefined) {
+ throw new Error('Required parameter id was null or undefined when calling getInferenceById.');
+ }
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'GET',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ };
+
+ let authenticationPromise = Promise.resolve();
+ if (this.authentications.JWT.accessToken) {
+ authenticationPromise = authenticationPromise.then(() => this.authentications.JWT.applyToRequest(localVarRequestOptions));
+ }
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: InferenceRead; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "InferenceRead");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+ /**
+ *
+ * @summary Get Inferences List
+ * @param promptVersionId
+ * @param promptId
+ */
+ public async getInferencesList (promptVersionId?: string, promptId?: string, options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: Array; }> {
+ const localVarPath = this.basePath + '/inferences';
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ if (promptVersionId !== undefined) {
+ localVarQueryParameters['prompt_version_id'] = ObjectSerializer.serialize(promptVersionId, "string");
+ }
+
+ if (promptId !== undefined) {
+ localVarQueryParameters['prompt_id'] = ObjectSerializer.serialize(promptId, "string");
+ }
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'GET',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ };
+
+ let authenticationPromise = Promise.resolve();
+ if (this.authentications.JWT.accessToken) {
+ authenticationPromise = authenticationPromise.then(() => this.authentications.JWT.applyToRequest(localVarRequestOptions));
+ }
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: Array; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "Array");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+ /**
+ * The core of the functionality: 1. Populating the template from prompt version with the passed values 2. Logging the request 3. Sending request to provider 4. Logging response 4. Returning response with `inference_id` You can specify which prompt version you want to use in two ways by setting on of: - `prompt_version_id` - uses the specified prompt version - `prompt_id` - uses the `Live` status prompt version assigned to the given `prompt_id`. This allows to release new prompt versions using Prompton API if you only reference `prompt_id` in your client code. If there are multiple prompt versions in `Live` status for the prompt_id then it picks one randomly. It\'s useful for split testing. This method will return an error if there is no `Live` status message. It also handles errors, timeouts and sets the inference status accordingly. It will still process response if client disconnects before it arrives. _Note: raw request data is also logged, GET `inferences/{id}` reponse includes it as well._ You can use a few easter eggs to test it without a valid api key: - `\"end_user_id\": \"mock_me_softly\"` - `\"end_user_id\": \"timeout_me_softly\"` - `\"end_user_id\": \"fail_me_softly\"`
+ * @summary New Inference
+ * @param inferencerequest
+ */
+ public async newInference (inferencerequest: Inferencerequest, options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: InferencePostResponse; }> {
+ const localVarPath = this.basePath + '/inferences';
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ // verify required parameter 'inferencerequest' is not null or undefined
+ if (inferencerequest === null || inferencerequest === undefined) {
+ throw new Error('Required parameter inferencerequest was null or undefined when calling newInference.');
+ }
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'POST',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ body: ObjectSerializer.serialize(inferencerequest, "Inferencerequest")
+ };
+
+ let authenticationPromise = Promise.resolve();
+ if (this.authentications.JWT.accessToken) {
+ authenticationPromise = authenticationPromise.then(() => this.authentications.JWT.applyToRequest(localVarRequestOptions));
+ }
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: InferencePostResponse; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "InferencePostResponse");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+}
diff --git a/clients/openapi-generator/typescript-node/api/orgsApi.ts b/clients/openapi-generator/typescript-node/api/orgsApi.ts
new file mode 100644
index 0000000..bb7ab58
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/api/orgsApi.ts
@@ -0,0 +1,451 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+import localVarRequest from 'request';
+import http from 'http';
+
+/* tslint:disable:no-unused-locals */
+import { HTTPValidationError } from '../model/hTTPValidationError';
+import { OrgCreate } from '../model/orgCreate';
+import { OrgRead } from '../model/orgRead';
+import { OrgUpdate } from '../model/orgUpdate';
+
+import { ObjectSerializer, Authentication, VoidAuth, Interceptor } from '../model/models';
+import { HttpBasicAuth, HttpBearerAuth, ApiKeyAuth, OAuth } from '../model/models';
+
+import { HttpError, RequestFile } from './apis';
+
+let defaultBasePath = 'http://localhost';
+
+// ===============================================
+// This file is autogenerated - Please do not edit
+// ===============================================
+
+export enum OrgsApiApiKeys {
+}
+
+export class OrgsApi {
+ protected _basePath = defaultBasePath;
+ protected _defaultHeaders : any = {};
+ protected _useQuerystring : boolean = false;
+
+ protected authentications = {
+ 'default': new VoidAuth(),
+ 'JWT': new OAuth(),
+ }
+
+ protected interceptors: Interceptor[] = [];
+
+ constructor(basePath?: string);
+ constructor(basePathOrUsername: string, password?: string, basePath?: string) {
+ if (password) {
+ if (basePath) {
+ this.basePath = basePath;
+ }
+ } else {
+ if (basePathOrUsername) {
+ this.basePath = basePathOrUsername
+ }
+ }
+ }
+
+ set useQuerystring(value: boolean) {
+ this._useQuerystring = value;
+ }
+
+ set basePath(basePath: string) {
+ this._basePath = basePath;
+ }
+
+ set defaultHeaders(defaultHeaders: any) {
+ this._defaultHeaders = defaultHeaders;
+ }
+
+ get defaultHeaders() {
+ return this._defaultHeaders;
+ }
+
+ get basePath() {
+ return this._basePath;
+ }
+
+ public setDefaultAuthentication(auth: Authentication) {
+ this.authentications.default = auth;
+ }
+
+ public setApiKey(key: OrgsApiApiKeys, value: string) {
+ (this.authentications as any)[OrgsApiApiKeys[key]].apiKey = value;
+ }
+
+ set accessToken(token: string) {
+ this.authentications.JWT.accessToken = token;
+ }
+
+ public addInterceptor(interceptor: Interceptor) {
+ this.interceptors.push(interceptor);
+ }
+
+ /**
+ *
+ * @summary Add Org
+ * @param orgCreate
+ */
+ public async addOrg (orgCreate: OrgCreate, options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: any; }> {
+ const localVarPath = this.basePath + '/orgs';
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ // verify required parameter 'orgCreate' is not null or undefined
+ if (orgCreate === null || orgCreate === undefined) {
+ throw new Error('Required parameter orgCreate was null or undefined when calling addOrg.');
+ }
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'POST',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ body: ObjectSerializer.serialize(orgCreate, "OrgCreate")
+ };
+
+ let authenticationPromise = Promise.resolve();
+ if (this.authentications.JWT.accessToken) {
+ authenticationPromise = authenticationPromise.then(() => this.authentications.JWT.applyToRequest(localVarRequestOptions));
+ }
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: any; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "any");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+ /**
+ *
+ * @summary Get Current User Org
+ */
+ public async getCurrentUserOrg (options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: OrgRead; }> {
+ const localVarPath = this.basePath + '/orgs/me';
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'GET',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ };
+
+ let authenticationPromise = Promise.resolve();
+ if (this.authentications.JWT.accessToken) {
+ authenticationPromise = authenticationPromise.then(() => this.authentications.JWT.applyToRequest(localVarRequestOptions));
+ }
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: OrgRead; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "OrgRead");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+ /**
+ *
+ * @summary Get Org By Id
+ * @param id
+ */
+ public async getOrgById (id: string, options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: OrgRead; }> {
+ const localVarPath = this.basePath + '/orgs/{id}'
+ .replace('{' + 'id' + '}', encodeURIComponent(String(id)));
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ // verify required parameter 'id' is not null or undefined
+ if (id === null || id === undefined) {
+ throw new Error('Required parameter id was null or undefined when calling getOrgById.');
+ }
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'GET',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ };
+
+ let authenticationPromise = Promise.resolve();
+ if (this.authentications.JWT.accessToken) {
+ authenticationPromise = authenticationPromise.then(() => this.authentications.JWT.applyToRequest(localVarRequestOptions));
+ }
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: OrgRead; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "OrgRead");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+ /**
+ *
+ * @summary Get Orgs List
+ */
+ public async getOrgsList (options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: Array; }> {
+ const localVarPath = this.basePath + '/orgs';
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'GET',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ };
+
+ let authenticationPromise = Promise.resolve();
+ if (this.authentications.JWT.accessToken) {
+ authenticationPromise = authenticationPromise.then(() => this.authentications.JWT.applyToRequest(localVarRequestOptions));
+ }
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: Array; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "Array");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+ /**
+ *
+ * @summary Update Org
+ * @param id
+ * @param orgUpdate
+ */
+ public async updateOrg (id: string, orgUpdate: OrgUpdate, options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: OrgRead; }> {
+ const localVarPath = this.basePath + '/orgs/{id}'
+ .replace('{' + 'id' + '}', encodeURIComponent(String(id)));
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ // verify required parameter 'id' is not null or undefined
+ if (id === null || id === undefined) {
+ throw new Error('Required parameter id was null or undefined when calling updateOrg.');
+ }
+
+ // verify required parameter 'orgUpdate' is not null or undefined
+ if (orgUpdate === null || orgUpdate === undefined) {
+ throw new Error('Required parameter orgUpdate was null or undefined when calling updateOrg.');
+ }
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'PATCH',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ body: ObjectSerializer.serialize(orgUpdate, "OrgUpdate")
+ };
+
+ let authenticationPromise = Promise.resolve();
+ if (this.authentications.JWT.accessToken) {
+ authenticationPromise = authenticationPromise.then(() => this.authentications.JWT.applyToRequest(localVarRequestOptions));
+ }
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: OrgRead; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "OrgRead");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+}
diff --git a/clients/openapi-generator/typescript-node/api/promptVersionsApi.ts b/clients/openapi-generator/typescript-node/api/promptVersionsApi.ts
new file mode 100644
index 0000000..47acb86
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/api/promptVersionsApi.ts
@@ -0,0 +1,391 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+import localVarRequest from 'request';
+import http from 'http';
+
+/* tslint:disable:no-unused-locals */
+import { HTTPValidationError } from '../model/hTTPValidationError';
+import { PromptVersionCreate } from '../model/promptVersionCreate';
+import { PromptVersionRead } from '../model/promptVersionRead';
+import { PromptVersionUpdate } from '../model/promptVersionUpdate';
+
+import { ObjectSerializer, Authentication, VoidAuth, Interceptor } from '../model/models';
+import { HttpBasicAuth, HttpBearerAuth, ApiKeyAuth, OAuth } from '../model/models';
+
+import { HttpError, RequestFile } from './apis';
+
+let defaultBasePath = 'http://localhost';
+
+// ===============================================
+// This file is autogenerated - Please do not edit
+// ===============================================
+
+export enum PromptVersionsApiApiKeys {
+}
+
+export class PromptVersionsApi {
+ protected _basePath = defaultBasePath;
+ protected _defaultHeaders : any = {};
+ protected _useQuerystring : boolean = false;
+
+ protected authentications = {
+ 'default': new VoidAuth(),
+ 'JWT': new OAuth(),
+ }
+
+ protected interceptors: Interceptor[] = [];
+
+ constructor(basePath?: string);
+ constructor(basePathOrUsername: string, password?: string, basePath?: string) {
+ if (password) {
+ if (basePath) {
+ this.basePath = basePath;
+ }
+ } else {
+ if (basePathOrUsername) {
+ this.basePath = basePathOrUsername
+ }
+ }
+ }
+
+ set useQuerystring(value: boolean) {
+ this._useQuerystring = value;
+ }
+
+ set basePath(basePath: string) {
+ this._basePath = basePath;
+ }
+
+ set defaultHeaders(defaultHeaders: any) {
+ this._defaultHeaders = defaultHeaders;
+ }
+
+ get defaultHeaders() {
+ return this._defaultHeaders;
+ }
+
+ get basePath() {
+ return this._basePath;
+ }
+
+ public setDefaultAuthentication(auth: Authentication) {
+ this.authentications.default = auth;
+ }
+
+ public setApiKey(key: PromptVersionsApiApiKeys, value: string) {
+ (this.authentications as any)[PromptVersionsApiApiKeys[key]].apiKey = value;
+ }
+
+ set accessToken(token: string) {
+ this.authentications.JWT.accessToken = token;
+ }
+
+ public addInterceptor(interceptor: Interceptor) {
+ this.interceptors.push(interceptor);
+ }
+
+ /**
+ *
+ * @summary Add Promptversion
+ * @param promptVersionCreate
+ */
+ public async addPromptVersion (promptVersionCreate: PromptVersionCreate, options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: any; }> {
+ const localVarPath = this.basePath + '/promptVersions';
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ // verify required parameter 'promptVersionCreate' is not null or undefined
+ if (promptVersionCreate === null || promptVersionCreate === undefined) {
+ throw new Error('Required parameter promptVersionCreate was null or undefined when calling addPromptVersion.');
+ }
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'POST',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ body: ObjectSerializer.serialize(promptVersionCreate, "PromptVersionCreate")
+ };
+
+ let authenticationPromise = Promise.resolve();
+ if (this.authentications.JWT.accessToken) {
+ authenticationPromise = authenticationPromise.then(() => this.authentications.JWT.applyToRequest(localVarRequestOptions));
+ }
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: any; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "any");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+ /**
+ *
+ * @summary Get Promptversion By Id
+ * @param id
+ */
+ public async getPromptVersionById (id: string, options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: PromptVersionRead; }> {
+ const localVarPath = this.basePath + '/promptVersions/{id}'
+ .replace('{' + 'id' + '}', encodeURIComponent(String(id)));
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ // verify required parameter 'id' is not null or undefined
+ if (id === null || id === undefined) {
+ throw new Error('Required parameter id was null or undefined when calling getPromptVersionById.');
+ }
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'GET',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ };
+
+ let authenticationPromise = Promise.resolve();
+ if (this.authentications.JWT.accessToken) {
+ authenticationPromise = authenticationPromise.then(() => this.authentications.JWT.applyToRequest(localVarRequestOptions));
+ }
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: PromptVersionRead; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "PromptVersionRead");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+ /**
+ *
+ * @summary Get Prompt Versions List
+ * @param promptId
+ */
+ public async getPromptVersionsList (promptId?: string, options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: Array; }> {
+ const localVarPath = this.basePath + '/promptVersions';
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ if (promptId !== undefined) {
+ localVarQueryParameters['prompt_id'] = ObjectSerializer.serialize(promptId, "string");
+ }
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'GET',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ };
+
+ let authenticationPromise = Promise.resolve();
+ if (this.authentications.JWT.accessToken) {
+ authenticationPromise = authenticationPromise.then(() => this.authentications.JWT.applyToRequest(localVarRequestOptions));
+ }
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: Array; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "Array");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+ /**
+ *
+ * @summary Update Promptversion
+ * @param id
+ * @param promptVersionUpdate
+ */
+ public async updatePromptVersion (id: string, promptVersionUpdate: PromptVersionUpdate, options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: PromptVersionRead; }> {
+ const localVarPath = this.basePath + '/promptVersions/{id}'
+ .replace('{' + 'id' + '}', encodeURIComponent(String(id)));
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ // verify required parameter 'id' is not null or undefined
+ if (id === null || id === undefined) {
+ throw new Error('Required parameter id was null or undefined when calling updatePromptVersion.');
+ }
+
+ // verify required parameter 'promptVersionUpdate' is not null or undefined
+ if (promptVersionUpdate === null || promptVersionUpdate === undefined) {
+ throw new Error('Required parameter promptVersionUpdate was null or undefined when calling updatePromptVersion.');
+ }
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'PATCH',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ body: ObjectSerializer.serialize(promptVersionUpdate, "PromptVersionUpdate")
+ };
+
+ let authenticationPromise = Promise.resolve();
+ if (this.authentications.JWT.accessToken) {
+ authenticationPromise = authenticationPromise.then(() => this.authentications.JWT.applyToRequest(localVarRequestOptions));
+ }
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: PromptVersionRead; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "PromptVersionRead");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+}
diff --git a/clients/openapi-generator/typescript-node/api/promptsApi.ts b/clients/openapi-generator/typescript-node/api/promptsApi.ts
new file mode 100644
index 0000000..79f6290
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/api/promptsApi.ts
@@ -0,0 +1,457 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+import localVarRequest from 'request';
+import http from 'http';
+
+/* tslint:disable:no-unused-locals */
+import { HTTPValidationError } from '../model/hTTPValidationError';
+import { PromptCreate } from '../model/promptCreate';
+import { PromptRead } from '../model/promptRead';
+import { PromptUpdate } from '../model/promptUpdate';
+
+import { ObjectSerializer, Authentication, VoidAuth, Interceptor } from '../model/models';
+import { HttpBasicAuth, HttpBearerAuth, ApiKeyAuth, OAuth } from '../model/models';
+
+import { HttpError, RequestFile } from './apis';
+
+let defaultBasePath = 'http://localhost';
+
+// ===============================================
+// This file is autogenerated - Please do not edit
+// ===============================================
+
+export enum PromptsApiApiKeys {
+}
+
+export class PromptsApi {
+ protected _basePath = defaultBasePath;
+ protected _defaultHeaders : any = {};
+ protected _useQuerystring : boolean = false;
+
+ protected authentications = {
+ 'default': new VoidAuth(),
+ 'JWT': new OAuth(),
+ }
+
+ protected interceptors: Interceptor[] = [];
+
+ constructor(basePath?: string);
+ constructor(basePathOrUsername: string, password?: string, basePath?: string) {
+ if (password) {
+ if (basePath) {
+ this.basePath = basePath;
+ }
+ } else {
+ if (basePathOrUsername) {
+ this.basePath = basePathOrUsername
+ }
+ }
+ }
+
+ set useQuerystring(value: boolean) {
+ this._useQuerystring = value;
+ }
+
+ set basePath(basePath: string) {
+ this._basePath = basePath;
+ }
+
+ set defaultHeaders(defaultHeaders: any) {
+ this._defaultHeaders = defaultHeaders;
+ }
+
+ get defaultHeaders() {
+ return this._defaultHeaders;
+ }
+
+ get basePath() {
+ return this._basePath;
+ }
+
+ public setDefaultAuthentication(auth: Authentication) {
+ this.authentications.default = auth;
+ }
+
+ public setApiKey(key: PromptsApiApiKeys, value: string) {
+ (this.authentications as any)[PromptsApiApiKeys[key]].apiKey = value;
+ }
+
+ set accessToken(token: string) {
+ this.authentications.JWT.accessToken = token;
+ }
+
+ public addInterceptor(interceptor: Interceptor) {
+ this.interceptors.push(interceptor);
+ }
+
+ /**
+ *
+ * @summary Add Prompt
+ * @param promptCreate
+ */
+ public async addPrompt (promptCreate: PromptCreate, options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: any; }> {
+ const localVarPath = this.basePath + '/prompts';
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ // verify required parameter 'promptCreate' is not null or undefined
+ if (promptCreate === null || promptCreate === undefined) {
+ throw new Error('Required parameter promptCreate was null or undefined when calling addPrompt.');
+ }
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'POST',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ body: ObjectSerializer.serialize(promptCreate, "PromptCreate")
+ };
+
+ let authenticationPromise = Promise.resolve();
+ if (this.authentications.JWT.accessToken) {
+ authenticationPromise = authenticationPromise.then(() => this.authentications.JWT.applyToRequest(localVarRequestOptions));
+ }
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: any; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "any");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+ /**
+ * Not implemented
+ * @summary Delete Prompt
+ * @param id
+ */
+ public async deletePrompt (id: string, options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body?: any; }> {
+ const localVarPath = this.basePath + '/prompts/{id}'
+ .replace('{' + 'id' + '}', encodeURIComponent(String(id)));
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ // verify required parameter 'id' is not null or undefined
+ if (id === null || id === undefined) {
+ throw new Error('Required parameter id was null or undefined when calling deletePrompt.');
+ }
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'DELETE',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ };
+
+ let authenticationPromise = Promise.resolve();
+ if (this.authentications.JWT.accessToken) {
+ authenticationPromise = authenticationPromise.then(() => this.authentications.JWT.applyToRequest(localVarRequestOptions));
+ }
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body?: any; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+ /**
+ *
+ * @summary Get Prompt By Id
+ * @param id
+ */
+ public async getPromptById (id: string, options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: PromptRead; }> {
+ const localVarPath = this.basePath + '/prompts/{id}'
+ .replace('{' + 'id' + '}', encodeURIComponent(String(id)));
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ // verify required parameter 'id' is not null or undefined
+ if (id === null || id === undefined) {
+ throw new Error('Required parameter id was null or undefined when calling getPromptById.');
+ }
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'GET',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ };
+
+ let authenticationPromise = Promise.resolve();
+ if (this.authentications.JWT.accessToken) {
+ authenticationPromise = authenticationPromise.then(() => this.authentications.JWT.applyToRequest(localVarRequestOptions));
+ }
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: PromptRead; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "PromptRead");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+ /**
+ *
+ * @summary Get Prompts List
+ */
+ public async getPromptsList (options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: Array; }> {
+ const localVarPath = this.basePath + '/prompts';
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'GET',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ };
+
+ let authenticationPromise = Promise.resolve();
+ if (this.authentications.JWT.accessToken) {
+ authenticationPromise = authenticationPromise.then(() => this.authentications.JWT.applyToRequest(localVarRequestOptions));
+ }
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: Array; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "Array");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+ /**
+ *
+ * @summary Update Prompt
+ * @param id
+ * @param promptUpdate
+ */
+ public async updatePrompt (id: string, promptUpdate: PromptUpdate, options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: PromptRead; }> {
+ const localVarPath = this.basePath + '/prompts/{id}'
+ .replace('{' + 'id' + '}', encodeURIComponent(String(id)));
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ // verify required parameter 'id' is not null or undefined
+ if (id === null || id === undefined) {
+ throw new Error('Required parameter id was null or undefined when calling updatePrompt.');
+ }
+
+ // verify required parameter 'promptUpdate' is not null or undefined
+ if (promptUpdate === null || promptUpdate === undefined) {
+ throw new Error('Required parameter promptUpdate was null or undefined when calling updatePrompt.');
+ }
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'PATCH',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ body: ObjectSerializer.serialize(promptUpdate, "PromptUpdate")
+ };
+
+ let authenticationPromise = Promise.resolve();
+ if (this.authentications.JWT.accessToken) {
+ authenticationPromise = authenticationPromise.then(() => this.authentications.JWT.applyToRequest(localVarRequestOptions));
+ }
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: PromptRead; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "PromptRead");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+}
diff --git a/clients/openapi-generator/typescript-node/api/serverStatusApi.ts b/clients/openapi-generator/typescript-node/api/serverStatusApi.ts
new file mode 100644
index 0000000..d0d783a
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/api/serverStatusApi.ts
@@ -0,0 +1,157 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+import localVarRequest from 'request';
+import http from 'http';
+
+/* tslint:disable:no-unused-locals */
+import { ApiStatusResponse } from '../model/apiStatusResponse';
+
+import { ObjectSerializer, Authentication, VoidAuth, Interceptor } from '../model/models';
+import { HttpBasicAuth, HttpBearerAuth, ApiKeyAuth, OAuth } from '../model/models';
+
+import { HttpError, RequestFile } from './apis';
+
+let defaultBasePath = 'http://localhost';
+
+// ===============================================
+// This file is autogenerated - Please do not edit
+// ===============================================
+
+export enum ServerStatusApiApiKeys {
+}
+
+export class ServerStatusApi {
+ protected _basePath = defaultBasePath;
+ protected _defaultHeaders : any = {};
+ protected _useQuerystring : boolean = false;
+
+ protected authentications = {
+ 'default': new VoidAuth(),
+ 'JWT': new OAuth(),
+ }
+
+ protected interceptors: Interceptor[] = [];
+
+ constructor(basePath?: string);
+ constructor(basePathOrUsername: string, password?: string, basePath?: string) {
+ if (password) {
+ if (basePath) {
+ this.basePath = basePath;
+ }
+ } else {
+ if (basePathOrUsername) {
+ this.basePath = basePathOrUsername
+ }
+ }
+ }
+
+ set useQuerystring(value: boolean) {
+ this._useQuerystring = value;
+ }
+
+ set basePath(basePath: string) {
+ this._basePath = basePath;
+ }
+
+ set defaultHeaders(defaultHeaders: any) {
+ this._defaultHeaders = defaultHeaders;
+ }
+
+ get defaultHeaders() {
+ return this._defaultHeaders;
+ }
+
+ get basePath() {
+ return this._basePath;
+ }
+
+ public setDefaultAuthentication(auth: Authentication) {
+ this.authentications.default = auth;
+ }
+
+ public setApiKey(key: ServerStatusApiApiKeys, value: string) {
+ (this.authentications as any)[ServerStatusApiApiKeys[key]].apiKey = value;
+ }
+
+ set accessToken(token: string) {
+ this.authentications.JWT.accessToken = token;
+ }
+
+ public addInterceptor(interceptor: Interceptor) {
+ this.interceptors.push(interceptor);
+ }
+
+ /**
+ *
+ * @summary Get Status
+ */
+ public async getStatus (options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: ApiStatusResponse; }> {
+ const localVarPath = this.basePath + '/status';
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'GET',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ };
+
+ let authenticationPromise = Promise.resolve();
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: ApiStatusResponse; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "ApiStatusResponse");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+}
diff --git a/clients/openapi-generator/typescript-node/api/usersApi.ts b/clients/openapi-generator/typescript-node/api/usersApi.ts
new file mode 100644
index 0000000..f0d2fec
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/api/usersApi.ts
@@ -0,0 +1,371 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+import localVarRequest from 'request';
+import http from 'http';
+
+/* tslint:disable:no-unused-locals */
+import { HTTPValidationError } from '../model/hTTPValidationError';
+import { UserCreate } from '../model/userCreate';
+import { UserRead } from '../model/userRead';
+
+import { ObjectSerializer, Authentication, VoidAuth, Interceptor } from '../model/models';
+import { HttpBasicAuth, HttpBearerAuth, ApiKeyAuth, OAuth } from '../model/models';
+
+import { HttpError, RequestFile } from './apis';
+
+let defaultBasePath = 'http://localhost';
+
+// ===============================================
+// This file is autogenerated - Please do not edit
+// ===============================================
+
+export enum UsersApiApiKeys {
+}
+
+export class UsersApi {
+ protected _basePath = defaultBasePath;
+ protected _defaultHeaders : any = {};
+ protected _useQuerystring : boolean = false;
+
+ protected authentications = {
+ 'default': new VoidAuth(),
+ 'JWT': new OAuth(),
+ }
+
+ protected interceptors: Interceptor[] = [];
+
+ constructor(basePath?: string);
+ constructor(basePathOrUsername: string, password?: string, basePath?: string) {
+ if (password) {
+ if (basePath) {
+ this.basePath = basePath;
+ }
+ } else {
+ if (basePathOrUsername) {
+ this.basePath = basePathOrUsername
+ }
+ }
+ }
+
+ set useQuerystring(value: boolean) {
+ this._useQuerystring = value;
+ }
+
+ set basePath(basePath: string) {
+ this._basePath = basePath;
+ }
+
+ set defaultHeaders(defaultHeaders: any) {
+ this._defaultHeaders = defaultHeaders;
+ }
+
+ get defaultHeaders() {
+ return this._defaultHeaders;
+ }
+
+ get basePath() {
+ return this._basePath;
+ }
+
+ public setDefaultAuthentication(auth: Authentication) {
+ this.authentications.default = auth;
+ }
+
+ public setApiKey(key: UsersApiApiKeys, value: string) {
+ (this.authentications as any)[UsersApiApiKeys[key]].apiKey = value;
+ }
+
+ set accessToken(token: string) {
+ this.authentications.JWT.accessToken = token;
+ }
+
+ public addInterceptor(interceptor: Interceptor) {
+ this.interceptors.push(interceptor);
+ }
+
+ /**
+ *
+ * @summary Add New User
+ * @param userCreate
+ */
+ public async addNewUser (userCreate: UserCreate, options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: any; }> {
+ const localVarPath = this.basePath + '/users';
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ // verify required parameter 'userCreate' is not null or undefined
+ if (userCreate === null || userCreate === undefined) {
+ throw new Error('Required parameter userCreate was null or undefined when calling addNewUser.');
+ }
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'POST',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ body: ObjectSerializer.serialize(userCreate, "UserCreate")
+ };
+
+ let authenticationPromise = Promise.resolve();
+ if (this.authentications.JWT.accessToken) {
+ authenticationPromise = authenticationPromise.then(() => this.authentications.JWT.applyToRequest(localVarRequestOptions));
+ }
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: any; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "any");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+ /**
+ *
+ * @summary Get Current User
+ */
+ public async getCurrentUser (options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: UserRead; }> {
+ const localVarPath = this.basePath + '/users/me';
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'GET',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ };
+
+ let authenticationPromise = Promise.resolve();
+ if (this.authentications.JWT.accessToken) {
+ authenticationPromise = authenticationPromise.then(() => this.authentications.JWT.applyToRequest(localVarRequestOptions));
+ }
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: UserRead; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "UserRead");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+ /**
+ *
+ * @summary Get User By Id
+ * @param id
+ */
+ public async getUserById (id: string, options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: UserRead; }> {
+ const localVarPath = this.basePath + '/users/{id}'
+ .replace('{' + 'id' + '}', encodeURIComponent(String(id)));
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ // verify required parameter 'id' is not null or undefined
+ if (id === null || id === undefined) {
+ throw new Error('Required parameter id was null or undefined when calling getUserById.');
+ }
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'GET',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ };
+
+ let authenticationPromise = Promise.resolve();
+ if (this.authentications.JWT.accessToken) {
+ authenticationPromise = authenticationPromise.then(() => this.authentications.JWT.applyToRequest(localVarRequestOptions));
+ }
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: UserRead; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "UserRead");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+ /**
+ *
+ * @summary Get Users List
+ */
+ public async getUsersList (options: {headers: {[name: string]: string}} = {headers: {}}) : Promise<{ response: http.IncomingMessage; body: Array; }> {
+ const localVarPath = this.basePath + '/users';
+ let localVarQueryParameters: any = {};
+ let localVarHeaderParams: any = (Object).assign({}, this._defaultHeaders);
+ const produces = ['application/json'];
+ // give precedence to 'application/json'
+ if (produces.indexOf('application/json') >= 0) {
+ localVarHeaderParams.Accept = 'application/json';
+ } else {
+ localVarHeaderParams.Accept = produces.join(',');
+ }
+ let localVarFormParams: any = {};
+
+ (Object).assign(localVarHeaderParams, options.headers);
+
+ let localVarUseFormData = false;
+
+ let localVarRequestOptions: localVarRequest.Options = {
+ method: 'GET',
+ qs: localVarQueryParameters,
+ headers: localVarHeaderParams,
+ uri: localVarPath,
+ useQuerystring: this._useQuerystring,
+ json: true,
+ };
+
+ let authenticationPromise = Promise.resolve();
+ if (this.authentications.JWT.accessToken) {
+ authenticationPromise = authenticationPromise.then(() => this.authentications.JWT.applyToRequest(localVarRequestOptions));
+ }
+ authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
+
+ let interceptorPromise = authenticationPromise;
+ for (const interceptor of this.interceptors) {
+ interceptorPromise = interceptorPromise.then(() => interceptor(localVarRequestOptions));
+ }
+
+ return interceptorPromise.then(() => {
+ if (Object.keys(localVarFormParams).length) {
+ if (localVarUseFormData) {
+ (localVarRequestOptions).formData = localVarFormParams;
+ } else {
+ localVarRequestOptions.form = localVarFormParams;
+ }
+ }
+ return new Promise<{ response: http.IncomingMessage; body: Array; }>((resolve, reject) => {
+ localVarRequest(localVarRequestOptions, (error, response, body) => {
+ if (error) {
+ reject(error);
+ } else {
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+ body = ObjectSerializer.deserialize(body, "Array");
+ resolve({ response: response, body: body });
+ } else {
+ reject(new HttpError(response, body, response.statusCode));
+ }
+ }
+ });
+ });
+ });
+ }
+}
diff --git a/clients/openapi-generator/typescript-node/git_push.sh b/clients/openapi-generator/typescript-node/git_push.sh
new file mode 100644
index 0000000..f53a75d
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/git_push.sh
@@ -0,0 +1,57 @@
+#!/bin/sh
+# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/
+#
+# Usage example: /bin/sh ./git_push.sh wing328 openapi-petstore-perl "minor update" "gitlab.com"
+
+git_user_id=$1
+git_repo_id=$2
+release_note=$3
+git_host=$4
+
+if [ "$git_host" = "" ]; then
+ git_host="github.com"
+ echo "[INFO] No command line input provided. Set \$git_host to $git_host"
+fi
+
+if [ "$git_user_id" = "" ]; then
+ git_user_id="GIT_USER_ID"
+ echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id"
+fi
+
+if [ "$git_repo_id" = "" ]; then
+ git_repo_id="GIT_REPO_ID"
+ echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id"
+fi
+
+if [ "$release_note" = "" ]; then
+ release_note="Minor update"
+ echo "[INFO] No command line input provided. Set \$release_note to $release_note"
+fi
+
+# Initialize the local directory as a Git repository
+git init
+
+# Adds the files in the local repository and stages them for commit.
+git add .
+
+# Commits the tracked changes and prepares them to be pushed to a remote repository.
+git commit -m "$release_note"
+
+# Sets the new remote
+git_remote=$(git remote)
+if [ "$git_remote" = "" ]; then # git remote not defined
+
+ if [ "$GIT_TOKEN" = "" ]; then
+ echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment."
+ git remote add origin https://${git_host}/${git_user_id}/${git_repo_id}.git
+ else
+ git remote add origin https://${git_user_id}:"${GIT_TOKEN}"@${git_host}/${git_user_id}/${git_repo_id}.git
+ fi
+
+fi
+
+git pull origin master
+
+# Pushes (Forces) the changes in the local repository up to the remote repository
+echo "Git pushing to https://${git_host}/${git_user_id}/${git_repo_id}.git"
+git push origin master 2>&1 | grep -v 'To https'
diff --git a/clients/openapi-generator/typescript-node/model/apiStatusResponse.ts b/clients/openapi-generator/typescript-node/model/apiStatusResponse.ts
new file mode 100644
index 0000000..6106b10
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/apiStatusResponse.ts
@@ -0,0 +1,56 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { DBStatus } from './dBStatus';
+
+export class ApiStatusResponse {
+ 'version': string;
+ 'message': string;
+ 'dbstatus': DBStatus;
+ 'githubSha'?: string;
+ 'githubEnv'?: string;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "version",
+ "baseName": "version",
+ "type": "string"
+ },
+ {
+ "name": "message",
+ "baseName": "message",
+ "type": "string"
+ },
+ {
+ "name": "dbstatus",
+ "baseName": "dbstatus",
+ "type": "DBStatus"
+ },
+ {
+ "name": "githubSha",
+ "baseName": "github_sha",
+ "type": "string"
+ },
+ {
+ "name": "githubEnv",
+ "baseName": "github_env",
+ "type": "string"
+ } ];
+
+ static getAttributeTypeMap() {
+ return ApiStatusResponse.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/chatGPTChatCompletitionConfig.ts b/clients/openapi-generator/typescript-node/model/chatGPTChatCompletitionConfig.ts
new file mode 100644
index 0000000..a72159e
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/chatGPTChatCompletitionConfig.ts
@@ -0,0 +1,74 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { Stop } from './stop';
+
+export class ChatGPTChatCompletitionConfig {
+ 'model'?: string;
+ 'temperature'?: number;
+ 'topP'?: number;
+ 'stop'?: Stop;
+ 'maxTokens'?: number;
+ 'presencePenalty'?: number;
+ 'frequencyPenalty'?: number;
+ 'logitBias'?: { [key: string]: number; };
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "model",
+ "baseName": "model",
+ "type": "string"
+ },
+ {
+ "name": "temperature",
+ "baseName": "temperature",
+ "type": "number"
+ },
+ {
+ "name": "topP",
+ "baseName": "top_p",
+ "type": "number"
+ },
+ {
+ "name": "stop",
+ "baseName": "stop",
+ "type": "Stop"
+ },
+ {
+ "name": "maxTokens",
+ "baseName": "max_tokens",
+ "type": "number"
+ },
+ {
+ "name": "presencePenalty",
+ "baseName": "presence_penalty",
+ "type": "number"
+ },
+ {
+ "name": "frequencyPenalty",
+ "baseName": "frequency_penalty",
+ "type": "number"
+ },
+ {
+ "name": "logitBias",
+ "baseName": "logit_bias",
+ "type": "{ [key: string]: number; }"
+ } ];
+
+ static getAttributeTypeMap() {
+ return ChatGPTChatCompletitionConfig.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/chatGPTChatCompletitionRequest.ts b/clients/openapi-generator/typescript-node/model/chatGPTChatCompletitionRequest.ts
new file mode 100644
index 0000000..aa48829
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/chatGPTChatCompletitionRequest.ts
@@ -0,0 +1,99 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { ChatGPTMessage } from './chatGPTMessage';
+import { Stop } from './stop';
+
+export class ChatGPTChatCompletitionRequest {
+ 'model'?: string;
+ 'temperature'?: number;
+ 'topP'?: number;
+ 'stop'?: Stop;
+ 'maxTokens'?: number;
+ 'presencePenalty'?: number;
+ 'frequencyPenalty'?: number;
+ 'logitBias'?: { [key: string]: number; };
+ 'messages': Array;
+ 'n'?: number = 1;
+ 'stream'?: boolean = false;
+ 'user'?: string;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "model",
+ "baseName": "model",
+ "type": "string"
+ },
+ {
+ "name": "temperature",
+ "baseName": "temperature",
+ "type": "number"
+ },
+ {
+ "name": "topP",
+ "baseName": "top_p",
+ "type": "number"
+ },
+ {
+ "name": "stop",
+ "baseName": "stop",
+ "type": "Stop"
+ },
+ {
+ "name": "maxTokens",
+ "baseName": "max_tokens",
+ "type": "number"
+ },
+ {
+ "name": "presencePenalty",
+ "baseName": "presence_penalty",
+ "type": "number"
+ },
+ {
+ "name": "frequencyPenalty",
+ "baseName": "frequency_penalty",
+ "type": "number"
+ },
+ {
+ "name": "logitBias",
+ "baseName": "logit_bias",
+ "type": "{ [key: string]: number; }"
+ },
+ {
+ "name": "messages",
+ "baseName": "messages",
+ "type": "Array"
+ },
+ {
+ "name": "n",
+ "baseName": "n",
+ "type": "number"
+ },
+ {
+ "name": "stream",
+ "baseName": "stream",
+ "type": "boolean"
+ },
+ {
+ "name": "user",
+ "baseName": "user",
+ "type": "string"
+ } ];
+
+ static getAttributeTypeMap() {
+ return ChatGPTChatCompletitionRequest.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/chatGPTChatCompletitionResponse.ts b/clients/openapi-generator/typescript-node/model/chatGPTChatCompletitionResponse.ts
new file mode 100644
index 0000000..fb38854
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/chatGPTChatCompletitionResponse.ts
@@ -0,0 +1,63 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { ChatGPTCompletitionChoice } from './chatGPTCompletitionChoice';
+import { ChatGPTTokenUsage } from './chatGPTTokenUsage';
+
+export class ChatGPTChatCompletitionResponse {
+ 'id': string;
+ 'object': string;
+ 'created': number;
+ 'model': string;
+ 'usage': ChatGPTTokenUsage;
+ 'choices': Array;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "id",
+ "baseName": "id",
+ "type": "string"
+ },
+ {
+ "name": "object",
+ "baseName": "object",
+ "type": "string"
+ },
+ {
+ "name": "created",
+ "baseName": "created",
+ "type": "number"
+ },
+ {
+ "name": "model",
+ "baseName": "model",
+ "type": "string"
+ },
+ {
+ "name": "usage",
+ "baseName": "usage",
+ "type": "ChatGPTTokenUsage"
+ },
+ {
+ "name": "choices",
+ "baseName": "choices",
+ "type": "Array"
+ } ];
+
+ static getAttributeTypeMap() {
+ return ChatGPTChatCompletitionResponse.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/chatGPTCompletitionChoice.ts b/clients/openapi-generator/typescript-node/model/chatGPTCompletitionChoice.ts
new file mode 100644
index 0000000..de0ca3f
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/chatGPTCompletitionChoice.ts
@@ -0,0 +1,44 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { ChatGPTMessage } from './chatGPTMessage';
+
+export class ChatGPTCompletitionChoice {
+ 'message': ChatGPTMessage;
+ 'finishReason': string;
+ 'index': number;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "message",
+ "baseName": "message",
+ "type": "ChatGPTMessage"
+ },
+ {
+ "name": "finishReason",
+ "baseName": "finish_reason",
+ "type": "string"
+ },
+ {
+ "name": "index",
+ "baseName": "index",
+ "type": "number"
+ } ];
+
+ static getAttributeTypeMap() {
+ return ChatGPTCompletitionChoice.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/chatGPTMessage.ts b/clients/openapi-generator/typescript-node/model/chatGPTMessage.ts
new file mode 100644
index 0000000..7c3e97e
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/chatGPTMessage.ts
@@ -0,0 +1,46 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { ChatGPTRole } from './chatGPTRole';
+
+export class ChatGPTMessage {
+ 'role': ChatGPTRole;
+ 'content': string;
+ 'name'?: string;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "role",
+ "baseName": "role",
+ "type": "ChatGPTRole"
+ },
+ {
+ "name": "content",
+ "baseName": "content",
+ "type": "string"
+ },
+ {
+ "name": "name",
+ "baseName": "name",
+ "type": "string"
+ } ];
+
+ static getAttributeTypeMap() {
+ return ChatGPTMessage.attributeTypeMap;
+ }
+}
+
+export namespace ChatGPTMessage {
+}
diff --git a/clients/openapi-generator/typescript-node/model/chatGPTRole.ts b/clients/openapi-generator/typescript-node/model/chatGPTRole.ts
new file mode 100644
index 0000000..cebede3
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/chatGPTRole.ts
@@ -0,0 +1,22 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+
+/**
+* An enumeration.
+*/
+export enum ChatGPTRole {
+ System = 'system',
+ User = 'user',
+ Assistant = 'assistant'
+}
diff --git a/clients/openapi-generator/typescript-node/model/chatGPTTokenUsage.ts b/clients/openapi-generator/typescript-node/model/chatGPTTokenUsage.ts
new file mode 100644
index 0000000..c823071
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/chatGPTTokenUsage.ts
@@ -0,0 +1,43 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+
+export class ChatGPTTokenUsage {
+ 'promptTokens': number;
+ 'completionTokens': number;
+ 'totalTokens': number;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "promptTokens",
+ "baseName": "prompt_tokens",
+ "type": "number"
+ },
+ {
+ "name": "completionTokens",
+ "baseName": "completion_tokens",
+ "type": "number"
+ },
+ {
+ "name": "totalTokens",
+ "baseName": "total_tokens",
+ "type": "number"
+ } ];
+
+ static getAttributeTypeMap() {
+ return ChatGPTTokenUsage.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/dBStatus.ts b/clients/openapi-generator/typescript-node/model/dBStatus.ts
new file mode 100644
index 0000000..373e580
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/dBStatus.ts
@@ -0,0 +1,37 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+
+export class DBStatus {
+ 'statusCode': number;
+ 'statusMessage': string;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "statusCode",
+ "baseName": "status_code",
+ "type": "number"
+ },
+ {
+ "name": "statusMessage",
+ "baseName": "status_message",
+ "type": "string"
+ } ];
+
+ static getAttributeTypeMap() {
+ return DBStatus.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/hTTPValidationError.ts b/clients/openapi-generator/typescript-node/model/hTTPValidationError.ts
new file mode 100644
index 0000000..047c4c6
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/hTTPValidationError.ts
@@ -0,0 +1,32 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { ValidationError } from './validationError';
+
+export class HTTPValidationError {
+ 'detail'?: Array;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "detail",
+ "baseName": "detail",
+ "type": "Array"
+ } ];
+
+ static getAttributeTypeMap() {
+ return HTTPValidationError.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/inferenceCreateByPromptId.ts b/clients/openapi-generator/typescript-node/model/inferenceCreateByPromptId.ts
new file mode 100644
index 0000000..0f64553
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/inferenceCreateByPromptId.ts
@@ -0,0 +1,82 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+
+/**
+* Create inference by `prompt_id`. It can only be used if there is at least one \'Live\' status prompt version for the provided `prompt_id`. If there are multiple prompt versions in Live status it will pick one randomly. Useful for split testing prompt versions. It stores all other `prompt_version_id`s in Live status at the time of the inference in `prompt_version_ids_considered` field.
+*/
+export class InferenceCreateByPromptId {
+ /**
+ * The API consumer\'s internal user reference for metrics. It is also relayed to the provider as part of the request if the provider supports it (eg. OpenAI\'s user field).
+ */
+ 'endUserId'?: string;
+ /**
+ * The API consumer\'s source for metrics (e.g. AndroidApp etc).
+ */
+ 'source'?: string;
+ /**
+ * The API consumer\'s internal reference id to able to link references to their sessions.
+ */
+ 'clientRefId'?: string;
+ 'templateArgs'?: { [key: string]: string; };
+ 'metadata'?: object;
+ /**
+ * Provider request timout in seconds. If not provided, then Prompton API\'s default timeout for the provider will be used (90sec or `DEFAULT_OPENAI_REQUEST_TIMEOUT_SECONDS` env var if provided).
+ */
+ 'requestTimeout'?: number;
+ 'promptId': string;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "endUserId",
+ "baseName": "end_user_id",
+ "type": "string"
+ },
+ {
+ "name": "source",
+ "baseName": "source",
+ "type": "string"
+ },
+ {
+ "name": "clientRefId",
+ "baseName": "client_ref_id",
+ "type": "string"
+ },
+ {
+ "name": "templateArgs",
+ "baseName": "template_args",
+ "type": "{ [key: string]: string; }"
+ },
+ {
+ "name": "metadata",
+ "baseName": "metadata",
+ "type": "object"
+ },
+ {
+ "name": "requestTimeout",
+ "baseName": "request_timeout",
+ "type": "number"
+ },
+ {
+ "name": "promptId",
+ "baseName": "prompt_id",
+ "type": "string"
+ } ];
+
+ static getAttributeTypeMap() {
+ return InferenceCreateByPromptId.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/inferenceCreateByPromptVersionId.ts b/clients/openapi-generator/typescript-node/model/inferenceCreateByPromptVersionId.ts
new file mode 100644
index 0000000..ece7b0f
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/inferenceCreateByPromptVersionId.ts
@@ -0,0 +1,79 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+
+export class InferenceCreateByPromptVersionId {
+ /**
+ * The API consumer\'s internal user reference for metrics. It is also relayed to the provider as part of the request if the provider supports it (eg. OpenAI\'s user field).
+ */
+ 'endUserId'?: string;
+ /**
+ * The API consumer\'s source for metrics (e.g. AndroidApp etc).
+ */
+ 'source'?: string;
+ /**
+ * The API consumer\'s internal reference id to able to link references to their sessions.
+ */
+ 'clientRefId'?: string;
+ 'templateArgs'?: { [key: string]: string; };
+ 'metadata'?: object;
+ /**
+ * Provider request timout in seconds. If not provided, then Prompton API\'s default timeout for the provider will be used (90sec or `DEFAULT_OPENAI_REQUEST_TIMEOUT_SECONDS` env var if provided).
+ */
+ 'requestTimeout'?: number;
+ 'promptVersionId': string;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "endUserId",
+ "baseName": "end_user_id",
+ "type": "string"
+ },
+ {
+ "name": "source",
+ "baseName": "source",
+ "type": "string"
+ },
+ {
+ "name": "clientRefId",
+ "baseName": "client_ref_id",
+ "type": "string"
+ },
+ {
+ "name": "templateArgs",
+ "baseName": "template_args",
+ "type": "{ [key: string]: string; }"
+ },
+ {
+ "name": "metadata",
+ "baseName": "metadata",
+ "type": "object"
+ },
+ {
+ "name": "requestTimeout",
+ "baseName": "request_timeout",
+ "type": "number"
+ },
+ {
+ "name": "promptVersionId",
+ "baseName": "prompt_version_id",
+ "type": "string"
+ } ];
+
+ static getAttributeTypeMap() {
+ return InferenceCreateByPromptVersionId.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/inferencePostResponse.ts b/clients/openapi-generator/typescript-node/model/inferencePostResponse.ts
new file mode 100644
index 0000000..deff2d7
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/inferencePostResponse.ts
@@ -0,0 +1,41 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { Response } from './response';
+
+/**
+* Used for FastAPI response model
+*/
+export class InferencePostResponse {
+ 'id': string;
+ 'response': Response;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "id",
+ "baseName": "id",
+ "type": "string"
+ },
+ {
+ "name": "response",
+ "baseName": "response",
+ "type": "Response"
+ } ];
+
+ static getAttributeTypeMap() {
+ return InferencePostResponse.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/inferenceRead.ts b/clients/openapi-generator/typescript-node/model/inferenceRead.ts
new file mode 100644
index 0000000..adb544c
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/inferenceRead.ts
@@ -0,0 +1,147 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { InferenceRequestData } from './inferenceRequestData';
+import { InferenceResponseStatus } from './inferenceResponseStatus';
+import { Response } from './response';
+
+export class InferenceRead {
+ 'id'?: string;
+ 'createdAt'?: Date;
+ 'createdByUserId'?: string;
+ 'createdByOrgId'?: string;
+ /**
+ * The API consumer\'s internal user reference for metrics. It is also relayed to the provider as part of the request if the provider supports it (eg. OpenAI\'s user field).
+ */
+ 'endUserId'?: string;
+ /**
+ * The API consumer\'s source for metrics (e.g. AndroidApp etc).
+ */
+ 'source'?: string;
+ /**
+ * The API consumer\'s internal reference id to able to link references to their sessions.
+ */
+ 'clientRefId'?: string;
+ 'templateArgs'?: { [key: string]: string; };
+ 'metadata'?: object;
+ /**
+ * Provider request timout in seconds. If not provided, then Prompton API\'s default timeout for the provider will be used (90sec or `DEFAULT_OPENAI_REQUEST_TIMEOUT_SECONDS` env var if provided).
+ */
+ 'requestTimeout'?: number;
+ 'promptVersionId': string;
+ /**
+ * If inference was by prompt_id then a list of all other prompt versions considered for this inference. I.e. all prompt versions in Live status at the time of the inference
+ */
+ 'promptVersionIdsConsidered'?: Array;
+ 'promptId': string;
+ 'promptVersionName'?: string;
+ 'status'?: InferenceResponseStatus;
+ 'request'?: InferenceRequestData;
+ 'response'?: Response;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "id",
+ "baseName": "_id",
+ "type": "string"
+ },
+ {
+ "name": "createdAt",
+ "baseName": "created_at",
+ "type": "Date"
+ },
+ {
+ "name": "createdByUserId",
+ "baseName": "created_by_user_id",
+ "type": "string"
+ },
+ {
+ "name": "createdByOrgId",
+ "baseName": "created_by_org_id",
+ "type": "string"
+ },
+ {
+ "name": "endUserId",
+ "baseName": "end_user_id",
+ "type": "string"
+ },
+ {
+ "name": "source",
+ "baseName": "source",
+ "type": "string"
+ },
+ {
+ "name": "clientRefId",
+ "baseName": "client_ref_id",
+ "type": "string"
+ },
+ {
+ "name": "templateArgs",
+ "baseName": "template_args",
+ "type": "{ [key: string]: string; }"
+ },
+ {
+ "name": "metadata",
+ "baseName": "metadata",
+ "type": "object"
+ },
+ {
+ "name": "requestTimeout",
+ "baseName": "request_timeout",
+ "type": "number"
+ },
+ {
+ "name": "promptVersionId",
+ "baseName": "prompt_version_id",
+ "type": "string"
+ },
+ {
+ "name": "promptVersionIdsConsidered",
+ "baseName": "prompt_version_ids_considered",
+ "type": "Array"
+ },
+ {
+ "name": "promptId",
+ "baseName": "prompt_id",
+ "type": "string"
+ },
+ {
+ "name": "promptVersionName",
+ "baseName": "prompt_version_name",
+ "type": "string"
+ },
+ {
+ "name": "status",
+ "baseName": "status",
+ "type": "InferenceResponseStatus"
+ },
+ {
+ "name": "request",
+ "baseName": "request",
+ "type": "InferenceRequestData"
+ },
+ {
+ "name": "response",
+ "baseName": "response",
+ "type": "Response"
+ } ];
+
+ static getAttributeTypeMap() {
+ return InferenceRead.attributeTypeMap;
+ }
+}
+
+export namespace InferenceRead {
+}
diff --git a/clients/openapi-generator/typescript-node/model/inferenceRequestData.ts b/clients/openapi-generator/typescript-node/model/inferenceRequestData.ts
new file mode 100644
index 0000000..0938332
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/inferenceRequestData.ts
@@ -0,0 +1,41 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { ChatGPTChatCompletitionRequest } from './chatGPTChatCompletitionRequest';
+import { PromptVersionProviders } from './promptVersionProviders';
+
+export class InferenceRequestData {
+ 'provider': PromptVersionProviders;
+ 'rawRequest': ChatGPTChatCompletitionRequest;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "provider",
+ "baseName": "provider",
+ "type": "PromptVersionProviders"
+ },
+ {
+ "name": "rawRequest",
+ "baseName": "raw_request",
+ "type": "ChatGPTChatCompletitionRequest"
+ } ];
+
+ static getAttributeTypeMap() {
+ return InferenceRequestData.attributeTypeMap;
+ }
+}
+
+export namespace InferenceRequestData {
+}
diff --git a/clients/openapi-generator/typescript-node/model/inferenceResponseData.ts b/clients/openapi-generator/typescript-node/model/inferenceResponseData.ts
new file mode 100644
index 0000000..1a9bbb0
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/inferenceResponseData.ts
@@ -0,0 +1,63 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { ChatGPTChatCompletitionResponse } from './chatGPTChatCompletitionResponse';
+import { ChatGPTTokenUsage } from './chatGPTTokenUsage';
+
+export class InferenceResponseData {
+ 'completedAt'?: Date;
+ 'completitionDurationSeconds'?: number;
+ 'isClientConnectedAtFinish'?: boolean;
+ 'isError'?: boolean = false;
+ 'tokenUsage': ChatGPTTokenUsage;
+ 'rawResponse': ChatGPTChatCompletitionResponse;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "completedAt",
+ "baseName": "completed_at",
+ "type": "Date"
+ },
+ {
+ "name": "completitionDurationSeconds",
+ "baseName": "completition_duration_seconds",
+ "type": "number"
+ },
+ {
+ "name": "isClientConnectedAtFinish",
+ "baseName": "is_client_connected_at_finish",
+ "type": "boolean"
+ },
+ {
+ "name": "isError",
+ "baseName": "isError",
+ "type": "boolean"
+ },
+ {
+ "name": "tokenUsage",
+ "baseName": "token_usage",
+ "type": "ChatGPTTokenUsage"
+ },
+ {
+ "name": "rawResponse",
+ "baseName": "raw_response",
+ "type": "ChatGPTChatCompletitionResponse"
+ } ];
+
+ static getAttributeTypeMap() {
+ return InferenceResponseData.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/inferenceResponseError.ts b/clients/openapi-generator/typescript-node/model/inferenceResponseError.ts
new file mode 100644
index 0000000..7fa38ce
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/inferenceResponseError.ts
@@ -0,0 +1,55 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+
+export class InferenceResponseError {
+ 'completedAt'?: Date;
+ 'completitionDurationSeconds'?: number;
+ 'isClientConnectedAtFinish'?: boolean;
+ 'isError'?: boolean = true;
+ 'error'?: any | null;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "completedAt",
+ "baseName": "completed_at",
+ "type": "Date"
+ },
+ {
+ "name": "completitionDurationSeconds",
+ "baseName": "completition_duration_seconds",
+ "type": "number"
+ },
+ {
+ "name": "isClientConnectedAtFinish",
+ "baseName": "is_client_connected_at_finish",
+ "type": "boolean"
+ },
+ {
+ "name": "isError",
+ "baseName": "isError",
+ "type": "boolean"
+ },
+ {
+ "name": "error",
+ "baseName": "error",
+ "type": "any"
+ } ];
+
+ static getAttributeTypeMap() {
+ return InferenceResponseError.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/inferenceResponseStatus.ts b/clients/openapi-generator/typescript-node/model/inferenceResponseStatus.ts
new file mode 100644
index 0000000..968e4a6
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/inferenceResponseStatus.ts
@@ -0,0 +1,23 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+
+/**
+* An enumeration.
+*/
+export enum InferenceResponseStatus {
+ RequestReceived = 'RequestReceived',
+ Processed = 'Processed',
+ CompletitionError = 'CompletitionError',
+ CompletitionTimeout = 'CompletitionTimeout'
+}
diff --git a/clients/openapi-generator/typescript-node/model/inferencerequest.ts b/clients/openapi-generator/typescript-node/model/inferencerequest.ts
new file mode 100644
index 0000000..fa0755b
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/inferencerequest.ts
@@ -0,0 +1,87 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { InferenceCreateByPromptId } from './inferenceCreateByPromptId';
+import { InferenceCreateByPromptVersionId } from './inferenceCreateByPromptVersionId';
+
+export class Inferencerequest {
+ /**
+ * The API consumer\'s internal user reference for metrics. It is also relayed to the provider as part of the request if the provider supports it (eg. OpenAI\'s user field).
+ */
+ 'endUserId'?: string;
+ /**
+ * The API consumer\'s source for metrics (e.g. AndroidApp etc).
+ */
+ 'source'?: string;
+ /**
+ * The API consumer\'s internal reference id to able to link references to their sessions.
+ */
+ 'clientRefId'?: string;
+ 'templateArgs'?: { [key: string]: string; };
+ 'metadata'?: object;
+ /**
+ * Provider request timout in seconds. If not provided, then Prompton API\'s default timeout for the provider will be used (90sec or `DEFAULT_OPENAI_REQUEST_TIMEOUT_SECONDS` env var if provided).
+ */
+ 'requestTimeout'?: number;
+ 'promptVersionId': string;
+ 'promptId': string;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "endUserId",
+ "baseName": "end_user_id",
+ "type": "string"
+ },
+ {
+ "name": "source",
+ "baseName": "source",
+ "type": "string"
+ },
+ {
+ "name": "clientRefId",
+ "baseName": "client_ref_id",
+ "type": "string"
+ },
+ {
+ "name": "templateArgs",
+ "baseName": "template_args",
+ "type": "{ [key: string]: string; }"
+ },
+ {
+ "name": "metadata",
+ "baseName": "metadata",
+ "type": "object"
+ },
+ {
+ "name": "requestTimeout",
+ "baseName": "request_timeout",
+ "type": "number"
+ },
+ {
+ "name": "promptVersionId",
+ "baseName": "prompt_version_id",
+ "type": "string"
+ },
+ {
+ "name": "promptId",
+ "baseName": "prompt_id",
+ "type": "string"
+ } ];
+
+ static getAttributeTypeMap() {
+ return Inferencerequest.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/locationInner.ts b/clients/openapi-generator/typescript-node/model/locationInner.ts
new file mode 100644
index 0000000..12f9b62
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/locationInner.ts
@@ -0,0 +1,26 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+
+export class LocationInner {
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ ];
+
+ static getAttributeTypeMap() {
+ return LocationInner.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/loginCredentialsPost.ts b/clients/openapi-generator/typescript-node/model/loginCredentialsPost.ts
new file mode 100644
index 0000000..099a48f
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/loginCredentialsPost.ts
@@ -0,0 +1,37 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+
+export class LoginCredentialsPost {
+ 'username': string;
+ 'password': string;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "username",
+ "baseName": "username",
+ "type": "string"
+ },
+ {
+ "name": "password",
+ "baseName": "password",
+ "type": "string"
+ } ];
+
+ static getAttributeTypeMap() {
+ return LoginCredentialsPost.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/models.ts b/clients/openapi-generator/typescript-node/model/models.ts
new file mode 100644
index 0000000..f7ad60d
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/models.ts
@@ -0,0 +1,339 @@
+import localVarRequest from 'request';
+
+export * from './apiStatusResponse';
+export * from './chatGPTChatCompletitionConfig';
+export * from './chatGPTChatCompletitionRequest';
+export * from './chatGPTChatCompletitionResponse';
+export * from './chatGPTCompletitionChoice';
+export * from './chatGPTMessage';
+export * from './chatGPTRole';
+export * from './chatGPTTokenUsage';
+export * from './dBStatus';
+export * from './hTTPValidationError';
+export * from './inferenceCreateByPromptId';
+export * from './inferenceCreateByPromptVersionId';
+export * from './inferencePostResponse';
+export * from './inferenceRead';
+export * from './inferenceRequestData';
+export * from './inferenceResponseData';
+export * from './inferenceResponseError';
+export * from './inferenceResponseStatus';
+export * from './inferencerequest';
+export * from './locationInner';
+export * from './loginCredentialsPost';
+export * from './orgCreate';
+export * from './orgRead';
+export * from './orgUpdate';
+export * from './promptCreate';
+export * from './promptRead';
+export * from './promptStatus';
+export * from './promptUpdate';
+export * from './promptVersionCreate';
+export * from './promptVersionProviders';
+export * from './promptVersionRead';
+export * from './promptVersionStatus';
+export * from './promptVersionUpdate';
+export * from './response';
+export * from './stop';
+export * from './token';
+export * from './userCreate';
+export * from './userRead';
+export * from './userRoles';
+export * from './validationError';
+
+import * as fs from 'fs';
+
+export interface RequestDetailedFile {
+ value: Buffer;
+ options?: {
+ filename?: string;
+ contentType?: string;
+ }
+}
+
+export type RequestFile = string | Buffer | fs.ReadStream | RequestDetailedFile;
+
+
+import { ApiStatusResponse } from './apiStatusResponse';
+import { ChatGPTChatCompletitionConfig } from './chatGPTChatCompletitionConfig';
+import { ChatGPTChatCompletitionRequest } from './chatGPTChatCompletitionRequest';
+import { ChatGPTChatCompletitionResponse } from './chatGPTChatCompletitionResponse';
+import { ChatGPTCompletitionChoice } from './chatGPTCompletitionChoice';
+import { ChatGPTMessage } from './chatGPTMessage';
+import { ChatGPTRole } from './chatGPTRole';
+import { ChatGPTTokenUsage } from './chatGPTTokenUsage';
+import { DBStatus } from './dBStatus';
+import { HTTPValidationError } from './hTTPValidationError';
+import { InferenceCreateByPromptId } from './inferenceCreateByPromptId';
+import { InferenceCreateByPromptVersionId } from './inferenceCreateByPromptVersionId';
+import { InferencePostResponse } from './inferencePostResponse';
+import { InferenceRead } from './inferenceRead';
+import { InferenceRequestData } from './inferenceRequestData';
+import { InferenceResponseData } from './inferenceResponseData';
+import { InferenceResponseError } from './inferenceResponseError';
+import { InferenceResponseStatus } from './inferenceResponseStatus';
+import { Inferencerequest } from './inferencerequest';
+import { LocationInner } from './locationInner';
+import { LoginCredentialsPost } from './loginCredentialsPost';
+import { OrgCreate } from './orgCreate';
+import { OrgRead } from './orgRead';
+import { OrgUpdate } from './orgUpdate';
+import { PromptCreate } from './promptCreate';
+import { PromptRead } from './promptRead';
+import { PromptStatus } from './promptStatus';
+import { PromptUpdate } from './promptUpdate';
+import { PromptVersionCreate } from './promptVersionCreate';
+import { PromptVersionProviders } from './promptVersionProviders';
+import { PromptVersionRead } from './promptVersionRead';
+import { PromptVersionStatus } from './promptVersionStatus';
+import { PromptVersionUpdate } from './promptVersionUpdate';
+import { Response } from './response';
+import { Stop } from './stop';
+import { Token } from './token';
+import { UserCreate } from './userCreate';
+import { UserRead } from './userRead';
+import { UserRoles } from './userRoles';
+import { ValidationError } from './validationError';
+
+/* tslint:disable:no-unused-variable */
+let primitives = [
+ "string",
+ "boolean",
+ "double",
+ "integer",
+ "long",
+ "float",
+ "number",
+ "any"
+ ];
+
+let enumsMap: {[index: string]: any} = {
+ "ChatGPTRole": ChatGPTRole,
+ "InferenceResponseStatus": InferenceResponseStatus,
+ "PromptStatus": PromptStatus,
+ "PromptVersionProviders": PromptVersionProviders,
+ "PromptVersionStatus": PromptVersionStatus,
+ "UserRoles": UserRoles,
+}
+
+let typeMap: {[index: string]: any} = {
+ "ApiStatusResponse": ApiStatusResponse,
+ "ChatGPTChatCompletitionConfig": ChatGPTChatCompletitionConfig,
+ "ChatGPTChatCompletitionRequest": ChatGPTChatCompletitionRequest,
+ "ChatGPTChatCompletitionResponse": ChatGPTChatCompletitionResponse,
+ "ChatGPTCompletitionChoice": ChatGPTCompletitionChoice,
+ "ChatGPTMessage": ChatGPTMessage,
+ "ChatGPTTokenUsage": ChatGPTTokenUsage,
+ "DBStatus": DBStatus,
+ "HTTPValidationError": HTTPValidationError,
+ "InferenceCreateByPromptId": InferenceCreateByPromptId,
+ "InferenceCreateByPromptVersionId": InferenceCreateByPromptVersionId,
+ "InferencePostResponse": InferencePostResponse,
+ "InferenceRead": InferenceRead,
+ "InferenceRequestData": InferenceRequestData,
+ "InferenceResponseData": InferenceResponseData,
+ "InferenceResponseError": InferenceResponseError,
+ "Inferencerequest": Inferencerequest,
+ "LocationInner": LocationInner,
+ "LoginCredentialsPost": LoginCredentialsPost,
+ "OrgCreate": OrgCreate,
+ "OrgRead": OrgRead,
+ "OrgUpdate": OrgUpdate,
+ "PromptCreate": PromptCreate,
+ "PromptRead": PromptRead,
+ "PromptUpdate": PromptUpdate,
+ "PromptVersionCreate": PromptVersionCreate,
+ "PromptVersionRead": PromptVersionRead,
+ "PromptVersionUpdate": PromptVersionUpdate,
+ "Response": Response,
+ "Stop": Stop,
+ "Token": Token,
+ "UserCreate": UserCreate,
+ "UserRead": UserRead,
+ "ValidationError": ValidationError,
+}
+
+export class ObjectSerializer {
+ public static findCorrectType(data: any, expectedType: string) {
+ if (data == undefined) {
+ return expectedType;
+ } else if (primitives.indexOf(expectedType.toLowerCase()) !== -1) {
+ return expectedType;
+ } else if (expectedType === "Date") {
+ return expectedType;
+ } else {
+ if (enumsMap[expectedType]) {
+ return expectedType;
+ }
+
+ if (!typeMap[expectedType]) {
+ return expectedType; // w/e we don't know the type
+ }
+
+ // Check the discriminator
+ let discriminatorProperty = typeMap[expectedType].discriminator;
+ if (discriminatorProperty == null) {
+ return expectedType; // the type does not have a discriminator. use it.
+ } else {
+ if (data[discriminatorProperty]) {
+ var discriminatorType = data[discriminatorProperty];
+ if(typeMap[discriminatorType]){
+ return discriminatorType; // use the type given in the discriminator
+ } else {
+ return expectedType; // discriminator did not map to a type
+ }
+ } else {
+ return expectedType; // discriminator was not present (or an empty string)
+ }
+ }
+ }
+ }
+
+ public static serialize(data: any, type: string) {
+ if (data == undefined) {
+ return data;
+ } else if (primitives.indexOf(type.toLowerCase()) !== -1) {
+ return data;
+ } else if (type.lastIndexOf("Array<", 0) === 0) { // string.startsWith pre es6
+ let subType: string = type.replace("Array<", ""); // Array => Type>
+ subType = subType.substring(0, subType.length - 1); // Type> => Type
+ let transformedData: any[] = [];
+ for (let index = 0; index < data.length; index++) {
+ let datum = data[index];
+ transformedData.push(ObjectSerializer.serialize(datum, subType));
+ }
+ return transformedData;
+ } else if (type === "Date") {
+ return data.toISOString();
+ } else {
+ if (enumsMap[type]) {
+ return data;
+ }
+ if (!typeMap[type]) { // in case we dont know the type
+ return data;
+ }
+
+ // Get the actual type of this object
+ type = this.findCorrectType(data, type);
+
+ // get the map for the correct type.
+ let attributeTypes = typeMap[type].getAttributeTypeMap();
+ let instance: {[index: string]: any} = {};
+ for (let index = 0; index < attributeTypes.length; index++) {
+ let attributeType = attributeTypes[index];
+ instance[attributeType.baseName] = ObjectSerializer.serialize(data[attributeType.name], attributeType.type);
+ }
+ return instance;
+ }
+ }
+
+ public static deserialize(data: any, type: string) {
+ // polymorphism may change the actual type.
+ type = ObjectSerializer.findCorrectType(data, type);
+ if (data == undefined) {
+ return data;
+ } else if (primitives.indexOf(type.toLowerCase()) !== -1) {
+ return data;
+ } else if (type.lastIndexOf("Array<", 0) === 0) { // string.startsWith pre es6
+ let subType: string = type.replace("Array<", ""); // Array => Type>
+ subType = subType.substring(0, subType.length - 1); // Type> => Type
+ let transformedData: any[] = [];
+ for (let index = 0; index < data.length; index++) {
+ let datum = data[index];
+ transformedData.push(ObjectSerializer.deserialize(datum, subType));
+ }
+ return transformedData;
+ } else if (type === "Date") {
+ return new Date(data);
+ } else {
+ if (enumsMap[type]) {// is Enum
+ return data;
+ }
+
+ if (!typeMap[type]) { // dont know the type
+ return data;
+ }
+ let instance = new typeMap[type]();
+ let attributeTypes = typeMap[type].getAttributeTypeMap();
+ for (let index = 0; index < attributeTypes.length; index++) {
+ let attributeType = attributeTypes[index];
+ instance[attributeType.name] = ObjectSerializer.deserialize(data[attributeType.baseName], attributeType.type);
+ }
+ return instance;
+ }
+ }
+}
+
+export interface Authentication {
+ /**
+ * Apply authentication settings to header and query params.
+ */
+ applyToRequest(requestOptions: localVarRequest.Options): Promise | void;
+}
+
+export class HttpBasicAuth implements Authentication {
+ public username: string = '';
+ public password: string = '';
+
+ applyToRequest(requestOptions: localVarRequest.Options): void {
+ requestOptions.auth = {
+ username: this.username, password: this.password
+ }
+ }
+}
+
+export class HttpBearerAuth implements Authentication {
+ public accessToken: string | (() => string) = '';
+
+ applyToRequest(requestOptions: localVarRequest.Options): void {
+ if (requestOptions && requestOptions.headers) {
+ const accessToken = typeof this.accessToken === 'function'
+ ? this.accessToken()
+ : this.accessToken;
+ requestOptions.headers["Authorization"] = "Bearer " + accessToken;
+ }
+ }
+}
+
+export class ApiKeyAuth implements Authentication {
+ public apiKey: string = '';
+
+ constructor(private location: string, private paramName: string) {
+ }
+
+ applyToRequest(requestOptions: localVarRequest.Options): void {
+ if (this.location == "query") {
+ (requestOptions.qs)[this.paramName] = this.apiKey;
+ } else if (this.location == "header" && requestOptions && requestOptions.headers) {
+ requestOptions.headers[this.paramName] = this.apiKey;
+ } else if (this.location == 'cookie' && requestOptions && requestOptions.headers) {
+ if (requestOptions.headers['Cookie']) {
+ requestOptions.headers['Cookie'] += '; ' + this.paramName + '=' + encodeURIComponent(this.apiKey);
+ }
+ else {
+ requestOptions.headers['Cookie'] = this.paramName + '=' + encodeURIComponent(this.apiKey);
+ }
+ }
+ }
+}
+
+export class OAuth implements Authentication {
+ public accessToken: string = '';
+
+ applyToRequest(requestOptions: localVarRequest.Options): void {
+ if (requestOptions && requestOptions.headers) {
+ requestOptions.headers["Authorization"] = "Bearer " + this.accessToken;
+ }
+ }
+}
+
+export class VoidAuth implements Authentication {
+ public username: string = '';
+ public password: string = '';
+
+ applyToRequest(_: localVarRequest.Options): void {
+ // Do nothing
+ }
+}
+
+export type Interceptor = (requestOptions: localVarRequest.Options) => (Promise | void);
diff --git a/clients/openapi-generator/typescript-node/model/orgCreate.ts b/clients/openapi-generator/typescript-node/model/orgCreate.ts
new file mode 100644
index 0000000..a043981
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/orgCreate.ts
@@ -0,0 +1,37 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+
+export class OrgCreate {
+ 'name': string;
+ 'accessKeys'?: { [key: string]: string; };
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "name",
+ "baseName": "name",
+ "type": "string"
+ },
+ {
+ "name": "accessKeys",
+ "baseName": "access_keys",
+ "type": "{ [key: string]: string; }"
+ } ];
+
+ static getAttributeTypeMap() {
+ return OrgCreate.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/orgRead.ts b/clients/openapi-generator/typescript-node/model/orgRead.ts
new file mode 100644
index 0000000..1492284
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/orgRead.ts
@@ -0,0 +1,61 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+
+export class OrgRead {
+ 'id'?: string;
+ 'createdAt'?: Date;
+ 'createdByUserId'?: string;
+ 'createdByOrgId'?: string;
+ 'name': string;
+ 'accessKeys'?: { [key: string]: string; };
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "id",
+ "baseName": "_id",
+ "type": "string"
+ },
+ {
+ "name": "createdAt",
+ "baseName": "created_at",
+ "type": "Date"
+ },
+ {
+ "name": "createdByUserId",
+ "baseName": "created_by_user_id",
+ "type": "string"
+ },
+ {
+ "name": "createdByOrgId",
+ "baseName": "created_by_org_id",
+ "type": "string"
+ },
+ {
+ "name": "name",
+ "baseName": "name",
+ "type": "string"
+ },
+ {
+ "name": "accessKeys",
+ "baseName": "access_keys",
+ "type": "{ [key: string]: string; }"
+ } ];
+
+ static getAttributeTypeMap() {
+ return OrgRead.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/orgUpdate.ts b/clients/openapi-generator/typescript-node/model/orgUpdate.ts
new file mode 100644
index 0000000..1e2faab
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/orgUpdate.ts
@@ -0,0 +1,37 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+
+export class OrgUpdate {
+ 'name'?: string;
+ 'accessKeys'?: { [key: string]: string; };
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "name",
+ "baseName": "name",
+ "type": "string"
+ },
+ {
+ "name": "accessKeys",
+ "baseName": "access_keys",
+ "type": "{ [key: string]: string; }"
+ } ];
+
+ static getAttributeTypeMap() {
+ return OrgUpdate.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/promptCreate.ts b/clients/openapi-generator/typescript-node/model/promptCreate.ts
new file mode 100644
index 0000000..0e47d66
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/promptCreate.ts
@@ -0,0 +1,46 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { PromptStatus } from './promptStatus';
+
+export class PromptCreate {
+ 'status'?: PromptStatus;
+ 'name': string;
+ 'description'?: string;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "status",
+ "baseName": "status",
+ "type": "PromptStatus"
+ },
+ {
+ "name": "name",
+ "baseName": "name",
+ "type": "string"
+ },
+ {
+ "name": "description",
+ "baseName": "description",
+ "type": "string"
+ } ];
+
+ static getAttributeTypeMap() {
+ return PromptCreate.attributeTypeMap;
+ }
+}
+
+export namespace PromptCreate {
+}
diff --git a/clients/openapi-generator/typescript-node/model/promptRead.ts b/clients/openapi-generator/typescript-node/model/promptRead.ts
new file mode 100644
index 0000000..4f6d58b
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/promptRead.ts
@@ -0,0 +1,70 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { PromptStatus } from './promptStatus';
+
+export class PromptRead {
+ 'id'?: string;
+ 'createdAt'?: Date;
+ 'createdByUserId'?: string;
+ 'createdByOrgId'?: string;
+ 'status'?: PromptStatus;
+ 'name': string;
+ 'description'?: string;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "id",
+ "baseName": "_id",
+ "type": "string"
+ },
+ {
+ "name": "createdAt",
+ "baseName": "created_at",
+ "type": "Date"
+ },
+ {
+ "name": "createdByUserId",
+ "baseName": "created_by_user_id",
+ "type": "string"
+ },
+ {
+ "name": "createdByOrgId",
+ "baseName": "created_by_org_id",
+ "type": "string"
+ },
+ {
+ "name": "status",
+ "baseName": "status",
+ "type": "PromptStatus"
+ },
+ {
+ "name": "name",
+ "baseName": "name",
+ "type": "string"
+ },
+ {
+ "name": "description",
+ "baseName": "description",
+ "type": "string"
+ } ];
+
+ static getAttributeTypeMap() {
+ return PromptRead.attributeTypeMap;
+ }
+}
+
+export namespace PromptRead {
+}
diff --git a/clients/openapi-generator/typescript-node/model/promptStatus.ts b/clients/openapi-generator/typescript-node/model/promptStatus.ts
new file mode 100644
index 0000000..9d0cd20
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/promptStatus.ts
@@ -0,0 +1,21 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+
+/**
+* An enumeration.
+*/
+export enum PromptStatus {
+ Active = 'Active',
+ Archived = 'Archived'
+}
diff --git a/clients/openapi-generator/typescript-node/model/promptUpdate.ts b/clients/openapi-generator/typescript-node/model/promptUpdate.ts
new file mode 100644
index 0000000..15bc806
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/promptUpdate.ts
@@ -0,0 +1,46 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { PromptStatus } from './promptStatus';
+
+export class PromptUpdate {
+ 'status'?: PromptStatus;
+ 'name'?: string;
+ 'description'?: string;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "status",
+ "baseName": "status",
+ "type": "PromptStatus"
+ },
+ {
+ "name": "name",
+ "baseName": "name",
+ "type": "string"
+ },
+ {
+ "name": "description",
+ "baseName": "description",
+ "type": "string"
+ } ];
+
+ static getAttributeTypeMap() {
+ return PromptUpdate.attributeTypeMap;
+ }
+}
+
+export namespace PromptUpdate {
+}
diff --git a/clients/openapi-generator/typescript-node/model/promptVersionCreate.ts b/clients/openapi-generator/typescript-node/model/promptVersionCreate.ts
new file mode 100644
index 0000000..b7ad1a6
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/promptVersionCreate.ts
@@ -0,0 +1,73 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { ChatGPTChatCompletitionConfig } from './chatGPTChatCompletitionConfig';
+import { ChatGPTMessage } from './chatGPTMessage';
+import { PromptVersionProviders } from './promptVersionProviders';
+import { PromptVersionStatus } from './promptVersionStatus';
+
+export class PromptVersionCreate {
+ 'status'?: PromptVersionStatus;
+ 'provider'?: PromptVersionProviders;
+ 'name': string;
+ 'description'?: string;
+ 'promptId': string;
+ 'template'?: Array;
+ 'modelConfig'?: ChatGPTChatCompletitionConfig;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "status",
+ "baseName": "status",
+ "type": "PromptVersionStatus"
+ },
+ {
+ "name": "provider",
+ "baseName": "provider",
+ "type": "PromptVersionProviders"
+ },
+ {
+ "name": "name",
+ "baseName": "name",
+ "type": "string"
+ },
+ {
+ "name": "description",
+ "baseName": "description",
+ "type": "string"
+ },
+ {
+ "name": "promptId",
+ "baseName": "prompt_id",
+ "type": "string"
+ },
+ {
+ "name": "template",
+ "baseName": "template",
+ "type": "Array"
+ },
+ {
+ "name": "modelConfig",
+ "baseName": "model_config",
+ "type": "ChatGPTChatCompletitionConfig"
+ } ];
+
+ static getAttributeTypeMap() {
+ return PromptVersionCreate.attributeTypeMap;
+ }
+}
+
+export namespace PromptVersionCreate {
+}
diff --git a/clients/openapi-generator/typescript-node/model/promptVersionProviders.ts b/clients/openapi-generator/typescript-node/model/promptVersionProviders.ts
new file mode 100644
index 0000000..874e766
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/promptVersionProviders.ts
@@ -0,0 +1,20 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+
+/**
+* Currently only OpenAI is supported
+*/
+export enum PromptVersionProviders {
+ OpenAi = 'OpenAI'
+}
diff --git a/clients/openapi-generator/typescript-node/model/promptVersionRead.ts b/clients/openapi-generator/typescript-node/model/promptVersionRead.ts
new file mode 100644
index 0000000..600fd97
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/promptVersionRead.ts
@@ -0,0 +1,103 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { ChatGPTChatCompletitionConfig } from './chatGPTChatCompletitionConfig';
+import { ChatGPTMessage } from './chatGPTMessage';
+import { PromptVersionProviders } from './promptVersionProviders';
+import { PromptVersionStatus } from './promptVersionStatus';
+
+export class PromptVersionRead {
+ 'id'?: string;
+ 'createdAt'?: Date;
+ 'createdByUserId'?: string;
+ 'createdByOrgId'?: string;
+ 'status'?: PromptVersionStatus;
+ 'provider'?: PromptVersionProviders;
+ 'name': string;
+ 'description'?: string;
+ 'promptId': string;
+ 'template'?: Array;
+ 'modelConfig'?: ChatGPTChatCompletitionConfig;
+ 'templateArgNames'?: Array;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "id",
+ "baseName": "_id",
+ "type": "string"
+ },
+ {
+ "name": "createdAt",
+ "baseName": "created_at",
+ "type": "Date"
+ },
+ {
+ "name": "createdByUserId",
+ "baseName": "created_by_user_id",
+ "type": "string"
+ },
+ {
+ "name": "createdByOrgId",
+ "baseName": "created_by_org_id",
+ "type": "string"
+ },
+ {
+ "name": "status",
+ "baseName": "status",
+ "type": "PromptVersionStatus"
+ },
+ {
+ "name": "provider",
+ "baseName": "provider",
+ "type": "PromptVersionProviders"
+ },
+ {
+ "name": "name",
+ "baseName": "name",
+ "type": "string"
+ },
+ {
+ "name": "description",
+ "baseName": "description",
+ "type": "string"
+ },
+ {
+ "name": "promptId",
+ "baseName": "prompt_id",
+ "type": "string"
+ },
+ {
+ "name": "template",
+ "baseName": "template",
+ "type": "Array"
+ },
+ {
+ "name": "modelConfig",
+ "baseName": "model_config",
+ "type": "ChatGPTChatCompletitionConfig"
+ },
+ {
+ "name": "templateArgNames",
+ "baseName": "template_arg_names",
+ "type": "Array"
+ } ];
+
+ static getAttributeTypeMap() {
+ return PromptVersionRead.attributeTypeMap;
+ }
+}
+
+export namespace PromptVersionRead {
+}
diff --git a/clients/openapi-generator/typescript-node/model/promptVersionStatus.ts b/clients/openapi-generator/typescript-node/model/promptVersionStatus.ts
new file mode 100644
index 0000000..5d80a15
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/promptVersionStatus.ts
@@ -0,0 +1,23 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+
+/**
+* An enumeration.
+*/
+export enum PromptVersionStatus {
+ Draft = 'Draft',
+ Testing = 'Testing',
+ Live = 'Live',
+ Archived = 'Archived'
+}
diff --git a/clients/openapi-generator/typescript-node/model/promptVersionUpdate.ts b/clients/openapi-generator/typescript-node/model/promptVersionUpdate.ts
new file mode 100644
index 0000000..62c14b1
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/promptVersionUpdate.ts
@@ -0,0 +1,73 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { ChatGPTChatCompletitionConfig } from './chatGPTChatCompletitionConfig';
+import { ChatGPTMessage } from './chatGPTMessage';
+import { PromptVersionProviders } from './promptVersionProviders';
+import { PromptVersionStatus } from './promptVersionStatus';
+
+export class PromptVersionUpdate {
+ 'status'?: PromptVersionStatus;
+ 'provider'?: PromptVersionProviders;
+ 'name'?: string;
+ 'description'?: string;
+ 'promptId'?: string;
+ 'template'?: Array;
+ 'modelConfig'?: ChatGPTChatCompletitionConfig;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "status",
+ "baseName": "status",
+ "type": "PromptVersionStatus"
+ },
+ {
+ "name": "provider",
+ "baseName": "provider",
+ "type": "PromptVersionProviders"
+ },
+ {
+ "name": "name",
+ "baseName": "name",
+ "type": "string"
+ },
+ {
+ "name": "description",
+ "baseName": "description",
+ "type": "string"
+ },
+ {
+ "name": "promptId",
+ "baseName": "prompt_id",
+ "type": "string"
+ },
+ {
+ "name": "template",
+ "baseName": "template",
+ "type": "Array"
+ },
+ {
+ "name": "modelConfig",
+ "baseName": "model_config",
+ "type": "ChatGPTChatCompletitionConfig"
+ } ];
+
+ static getAttributeTypeMap() {
+ return PromptVersionUpdate.attributeTypeMap;
+ }
+}
+
+export namespace PromptVersionUpdate {
+}
diff --git a/clients/openapi-generator/typescript-node/model/response.ts b/clients/openapi-generator/typescript-node/model/response.ts
new file mode 100644
index 0000000..c657e63
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/response.ts
@@ -0,0 +1,71 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { ChatGPTChatCompletitionResponse } from './chatGPTChatCompletitionResponse';
+import { ChatGPTTokenUsage } from './chatGPTTokenUsage';
+import { InferenceResponseData } from './inferenceResponseData';
+import { InferenceResponseError } from './inferenceResponseError';
+
+export class Response {
+ 'completedAt'?: Date;
+ 'completitionDurationSeconds'?: number;
+ 'isClientConnectedAtFinish'?: boolean;
+ 'isError'?: boolean = true;
+ 'tokenUsage': ChatGPTTokenUsage;
+ 'rawResponse': ChatGPTChatCompletitionResponse;
+ 'error'?: any | null;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "completedAt",
+ "baseName": "completed_at",
+ "type": "Date"
+ },
+ {
+ "name": "completitionDurationSeconds",
+ "baseName": "completition_duration_seconds",
+ "type": "number"
+ },
+ {
+ "name": "isClientConnectedAtFinish",
+ "baseName": "is_client_connected_at_finish",
+ "type": "boolean"
+ },
+ {
+ "name": "isError",
+ "baseName": "isError",
+ "type": "boolean"
+ },
+ {
+ "name": "tokenUsage",
+ "baseName": "token_usage",
+ "type": "ChatGPTTokenUsage"
+ },
+ {
+ "name": "rawResponse",
+ "baseName": "raw_response",
+ "type": "ChatGPTChatCompletitionResponse"
+ },
+ {
+ "name": "error",
+ "baseName": "error",
+ "type": "any"
+ } ];
+
+ static getAttributeTypeMap() {
+ return Response.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/stop.ts b/clients/openapi-generator/typescript-node/model/stop.ts
new file mode 100644
index 0000000..e7abc7f
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/stop.ts
@@ -0,0 +1,26 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+
+export class Stop {
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ ];
+
+ static getAttributeTypeMap() {
+ return Stop.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/token.ts b/clients/openapi-generator/typescript-node/model/token.ts
new file mode 100644
index 0000000..4c45fab
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/token.ts
@@ -0,0 +1,37 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+
+export class Token {
+ 'accessToken': string;
+ 'tokenType': string;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "accessToken",
+ "baseName": "access_token",
+ "type": "string"
+ },
+ {
+ "name": "tokenType",
+ "baseName": "token_type",
+ "type": "string"
+ } ];
+
+ static getAttributeTypeMap() {
+ return Token.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/model/userCreate.ts b/clients/openapi-generator/typescript-node/model/userCreate.ts
new file mode 100644
index 0000000..4feaf09
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/userCreate.ts
@@ -0,0 +1,64 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { UserRoles } from './userRoles';
+
+export class UserCreate {
+ 'fullName'?: string;
+ 'disabled'?: boolean = false;
+ 'role'?: UserRoles;
+ 'orgId': string;
+ 'email': string;
+ 'plainPassword': string;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "fullName",
+ "baseName": "full_name",
+ "type": "string"
+ },
+ {
+ "name": "disabled",
+ "baseName": "disabled",
+ "type": "boolean"
+ },
+ {
+ "name": "role",
+ "baseName": "role",
+ "type": "UserRoles"
+ },
+ {
+ "name": "orgId",
+ "baseName": "org_id",
+ "type": "string"
+ },
+ {
+ "name": "email",
+ "baseName": "email",
+ "type": "string"
+ },
+ {
+ "name": "plainPassword",
+ "baseName": "plain_password",
+ "type": "string"
+ } ];
+
+ static getAttributeTypeMap() {
+ return UserCreate.attributeTypeMap;
+ }
+}
+
+export namespace UserCreate {
+}
diff --git a/clients/openapi-generator/typescript-node/model/userRead.ts b/clients/openapi-generator/typescript-node/model/userRead.ts
new file mode 100644
index 0000000..2aa48f9
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/userRead.ts
@@ -0,0 +1,82 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { UserRoles } from './userRoles';
+
+export class UserRead {
+ 'id'?: string;
+ 'createdAt'?: Date;
+ 'createdByUserId'?: string;
+ 'createdByOrgId'?: string;
+ 'fullName'?: string;
+ 'disabled'?: boolean = false;
+ 'role'?: UserRoles;
+ 'orgId': string;
+ 'email': string;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "id",
+ "baseName": "_id",
+ "type": "string"
+ },
+ {
+ "name": "createdAt",
+ "baseName": "created_at",
+ "type": "Date"
+ },
+ {
+ "name": "createdByUserId",
+ "baseName": "created_by_user_id",
+ "type": "string"
+ },
+ {
+ "name": "createdByOrgId",
+ "baseName": "created_by_org_id",
+ "type": "string"
+ },
+ {
+ "name": "fullName",
+ "baseName": "full_name",
+ "type": "string"
+ },
+ {
+ "name": "disabled",
+ "baseName": "disabled",
+ "type": "boolean"
+ },
+ {
+ "name": "role",
+ "baseName": "role",
+ "type": "UserRoles"
+ },
+ {
+ "name": "orgId",
+ "baseName": "org_id",
+ "type": "string"
+ },
+ {
+ "name": "email",
+ "baseName": "email",
+ "type": "string"
+ } ];
+
+ static getAttributeTypeMap() {
+ return UserRead.attributeTypeMap;
+ }
+}
+
+export namespace UserRead {
+}
diff --git a/clients/openapi-generator/typescript-node/model/userRoles.ts b/clients/openapi-generator/typescript-node/model/userRoles.ts
new file mode 100644
index 0000000..c884204
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/userRoles.ts
@@ -0,0 +1,22 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+
+/**
+* An enumeration.
+*/
+export enum UserRoles {
+ Basic = 'Basic',
+ OrgAdmin = 'OrgAdmin',
+ SuperAdmin = 'SuperAdmin'
+}
diff --git a/clients/openapi-generator/typescript-node/model/validationError.ts b/clients/openapi-generator/typescript-node/model/validationError.ts
new file mode 100644
index 0000000..c166389
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/model/validationError.ts
@@ -0,0 +1,44 @@
+/**
+ * prompton-api
+ * API for prompton - managing full lifecycle of AI chat prompts.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { RequestFile } from './models';
+import { LocationInner } from './locationInner';
+
+export class ValidationError {
+ 'loc': Array;
+ 'msg': string;
+ 'type': string;
+
+ static discriminator: string | undefined = undefined;
+
+ static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+ {
+ "name": "loc",
+ "baseName": "loc",
+ "type": "Array"
+ },
+ {
+ "name": "msg",
+ "baseName": "msg",
+ "type": "string"
+ },
+ {
+ "name": "type",
+ "baseName": "type",
+ "type": "string"
+ } ];
+
+ static getAttributeTypeMap() {
+ return ValidationError.attributeTypeMap;
+ }
+}
+
diff --git a/clients/openapi-generator/typescript-node/package-lock.json b/clients/openapi-generator/typescript-node/package-lock.json
new file mode 100644
index 0000000..3f0f4a2
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/package-lock.json
@@ -0,0 +1,1592 @@
+{
+ "name": "@prompton/api",
+ "version": "0.0.1",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "@prompton/api",
+ "version": "0.0.1",
+ "license": "Unlicense",
+ "dependencies": {
+ "bluebird": "^3.5.0",
+ "request": "^2.81.0",
+ "rewire": "^6.0.0"
+ },
+ "devDependencies": {
+ "@types/bluebird": "^3.5.33",
+ "@types/node": "^12",
+ "@types/request": "^2.48.8",
+ "typescript": "^4.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+ "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+ "dependencies": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz",
+ "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz",
+ "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.22.5",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
+ "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.1.1",
+ "espree": "^7.3.0",
+ "globals": "^13.9.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^3.13.1",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
+ "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==",
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.0",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA=="
+ },
+ "node_modules/@types/bluebird": {
+ "version": "3.5.38",
+ "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.38.tgz",
+ "integrity": "sha512-yR/Kxc0dd4FfwtEoLZMoqJbM/VE/W7hXn/MIjb+axcwag0iFmSPK7OBUZq1YWLynJUoWQkfUrI7T0HDqGApNSg==",
+ "dev": true
+ },
+ "node_modules/@types/caseless": {
+ "version": "0.12.2",
+ "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz",
+ "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "12.20.55",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz",
+ "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==",
+ "dev": true
+ },
+ "node_modules/@types/request": {
+ "version": "2.48.8",
+ "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz",
+ "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/caseless": "*",
+ "@types/node": "*",
+ "@types/tough-cookie": "*",
+ "form-data": "^2.5.0"
+ }
+ },
+ "node_modules/@types/tough-cookie": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz",
+ "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==",
+ "dev": true
+ },
+ "node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/asn1": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+ "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+ "dependencies": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "node_modules/assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/aws4": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
+ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg=="
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "node_modules/bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+ "dependencies": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+ "dependencies": {
+ "assert-plus": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+ "dependencies": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ },
+ "node_modules/enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dependencies": {
+ "ansi-colors": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "7.32.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz",
+ "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==",
+ "dependencies": {
+ "@babel/code-frame": "7.12.11",
+ "@eslint/eslintrc": "^0.4.3",
+ "@humanwhocodes/config-array": "^0.5.0",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.1.2",
+ "globals": "^13.6.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^6.0.9",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "dependencies": {
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/espree": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+ "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
+ "dependencies": {
+ "acorn": "^7.4.0",
+ "acorn-jsx": "^5.3.1",
+ "eslint-visitor-keys": "^1.3.0"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/espree/node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esquery/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ },
+ "node_modules/extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+ "engines": [
+ "node >=0.6.0"
+ ]
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dependencies": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ=="
+ },
+ "node_modules/forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
+ "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
+ "dev": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 0.12"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "node_modules/functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g=="
+ },
+ "node_modules/getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+ "dependencies": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/har-validator": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+ "deprecated": "this library is no longer supported",
+ "dependencies": {
+ "ajv": "^6.12.3",
+ "har-schema": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ },
+ "engines": {
+ "node": ">=0.8",
+ "npm": ">=1.3.7"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+ },
+ "node_modules/isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
+ },
+ "node_modules/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="
+ },
+ "node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
+ },
+ "node_modules/jsprim": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
+ "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
+ "dependencies": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.4.0",
+ "verror": "1.10.0"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
+ },
+ "node_modules/lodash.truncate": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw=="
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="
+ },
+ "node_modules/oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/psl": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
+ },
+ "node_modules/punycode": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+ "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/request": {
+ "version": "2.88.2",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+ "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
+ "dependencies": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.3",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/request/node_modules/form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 0.12"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/rewire": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/rewire/-/rewire-6.0.0.tgz",
+ "integrity": "sha512-7sZdz5dptqBCapJYocw9EcppLU62KMEqDLIILJnNET2iqzXHaQfaVP5SOJ06XvjX+dNIDJbzjw0ZWzrgDhtjYg==",
+ "dependencies": {
+ "eslint": "^7.32.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "node_modules/semver": {
+ "version": "7.5.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz",
+ "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
+ },
+ "node_modules/sshpk": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
+ "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
+ "dependencies": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ },
+ "bin": {
+ "sshpk-conv": "bin/sshpk-conv",
+ "sshpk-sign": "bin/sshpk-sign",
+ "sshpk-verify": "bin/sshpk-verify"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/table": {
+ "version": "6.8.1",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz",
+ "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==",
+ "dependencies": {
+ "ajv": "^8.0.1",
+ "lodash.truncate": "^4.4.2",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/table/node_modules/ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/table/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="
+ },
+ "node_modules/tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "dependencies": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "4.9.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
+ "bin": {
+ "uuid": "bin/uuid"
+ }
+ },
+ "node_modules/v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA=="
+ },
+ "node_modules/verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ }
+ }
+}
diff --git a/clients/openapi-generator/typescript-node/package.json b/clients/openapi-generator/typescript-node/package.json
new file mode 100644
index 0000000..d0d9363
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "@prompton/api",
+ "version": "0.0.1",
+ "description": "NodeJS client for @prompton/api",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/GIT_USER_ID/GIT_REPO_ID.git"
+ },
+ "main": "dist/api.js",
+ "types": "dist/api.d.ts",
+ "scripts": {
+ "clean": "rm -Rf node_modules/ *.js",
+ "build": "tsc",
+ "test": "npm run build && node dist/client.js"
+ },
+ "author": "OpenAPI-Generator Contributors",
+ "license": "Unlicense",
+ "dependencies": {
+ "bluebird": "^3.5.0",
+ "request": "^2.81.0",
+ "rewire": "^6.0.0"
+ },
+ "devDependencies": {
+ "@types/bluebird": "^3.5.33",
+ "@types/node": "^12",
+ "@types/request": "^2.48.8",
+ "typescript": "^4.0"
+ }
+}
diff --git a/clients/openapi-generator/typescript-node/tsconfig.json b/clients/openapi-generator/typescript-node/tsconfig.json
new file mode 100644
index 0000000..82a8b63
--- /dev/null
+++ b/clients/openapi-generator/typescript-node/tsconfig.json
@@ -0,0 +1,25 @@
+{
+ "compilerOptions": {
+ "module": "commonjs",
+ "noImplicitAny": false,
+ "suppressImplicitAnyIndexErrors": true,
+ "target": "ES6",
+ "allowSyntheticDefaultImports": true,
+ "esModuleInterop": true,
+ "strict": true,
+ "moduleResolution": "node",
+ "removeComments": true,
+ "sourceMap": true,
+ "noLib": false,
+ "declaration": true,
+ "lib": ["dom", "es6", "es5", "dom.iterable", "scripthost"],
+ "outDir": "dist",
+ "typeRoots": [
+ "node_modules/@types"
+ ]
+ },
+ "exclude": [
+ "dist",
+ "node_modules"
+ ]
+}
diff --git a/clients/openapitools.json b/clients/openapitools.json
new file mode 100644
index 0000000..cd53ff4
--- /dev/null
+++ b/clients/openapitools.json
@@ -0,0 +1,7 @@
+{
+ "$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json",
+ "spaces": 2,
+ "generator-cli": {
+ "version": "6.6.0"
+ }
+}
diff --git a/clients/package-lock.json b/clients/package-lock.json
index eb26b78..04b49ad 100644
--- a/clients/package-lock.json
+++ b/clients/package-lock.json
@@ -5,16 +5,1257 @@
"packages": {
"": {
"dependencies": {
- "fern-api": "0.10.15"
+ "@openapitools/openapi-generator-cli": "^2.6.0",
+ "fern-api": "0.11.2"
}
},
+ "node_modules/@babel/runtime": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz",
+ "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==",
+ "dependencies": {
+ "regenerator-runtime": "^0.13.11"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@lukeed/csprng": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz",
+ "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@nestjs/axios": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/@nestjs/axios/-/axios-0.0.8.tgz",
+ "integrity": "sha512-oJyfR9/h9tVk776il0829xyj3b2e81yTu6HjPraxynwNtMNGqZBHHmAQL24yMB3tVbBM0RvG3eUXH8+pRCGwlg==",
+ "dependencies": {
+ "axios": "0.27.2"
+ },
+ "peerDependencies": {
+ "@nestjs/common": "^7.0.0 || ^8.0.0",
+ "reflect-metadata": "^0.1.12",
+ "rxjs": "^6.0.0 || ^7.0.0"
+ }
+ },
+ "node_modules/@nestjs/common": {
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-8.4.7.tgz",
+ "integrity": "sha512-m/YsbcBal+gA5CFrDpqXqsSfylo+DIQrkFY3qhVIltsYRfu8ct8J9pqsTO6OPf3mvqdOpFGrV5sBjoyAzOBvsw==",
+ "peer": true,
+ "dependencies": {
+ "axios": "0.27.2",
+ "iterare": "1.2.1",
+ "tslib": "2.4.0",
+ "uuid": "8.3.2"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/nest"
+ },
+ "peerDependencies": {
+ "cache-manager": "*",
+ "class-transformer": "*",
+ "class-validator": "*",
+ "reflect-metadata": "^0.1.12",
+ "rxjs": "^7.1.0"
+ },
+ "peerDependenciesMeta": {
+ "cache-manager": {
+ "optional": true
+ },
+ "class-transformer": {
+ "optional": true
+ },
+ "class-validator": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nestjs/common/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==",
+ "peer": true
+ },
+ "node_modules/@nuxtjs/opencollective": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz",
+ "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==",
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "consola": "^2.15.0",
+ "node-fetch": "^2.6.1"
+ },
+ "bin": {
+ "opencollective": "bin/opencollective.js"
+ },
+ "engines": {
+ "node": ">=8.0.0",
+ "npm": ">=5.0.0"
+ }
+ },
+ "node_modules/@openapitools/openapi-generator-cli": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@openapitools/openapi-generator-cli/-/openapi-generator-cli-2.6.0.tgz",
+ "integrity": "sha512-M/aOpR7G+Y1nMf+ofuar8pGszajgfhs1aSPSijkcr2tHTxKAI3sA3YYcOGbszxaNRKFyvOcDq+KP9pcJvKoCHg==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@nestjs/axios": "0.0.8",
+ "@nestjs/common": "9.3.11",
+ "@nestjs/core": "9.3.11",
+ "@nuxtjs/opencollective": "0.3.2",
+ "chalk": "4.1.2",
+ "commander": "8.3.0",
+ "compare-versions": "4.1.4",
+ "concurrently": "6.5.1",
+ "console.table": "0.10.0",
+ "fs-extra": "10.1.0",
+ "glob": "7.1.6",
+ "inquirer": "8.2.5",
+ "lodash": "4.17.21",
+ "reflect-metadata": "0.1.13",
+ "rxjs": "7.8.0",
+ "tslib": "2.0.3"
+ },
+ "bin": {
+ "openapi-generator-cli": "main.js"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/openapi_generator"
+ }
+ },
+ "node_modules/@openapitools/openapi-generator-cli/node_modules/@nestjs/common": {
+ "version": "9.3.11",
+ "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-9.3.11.tgz",
+ "integrity": "sha512-IFZ2G/5UKWC2Uo7tJ4SxGed2+aiA+sJyWeWsGTogKVDhq90oxVBToh+uCDeI31HNUpqYGoWmkletfty42zUd8A==",
+ "dependencies": {
+ "iterare": "1.2.1",
+ "tslib": "2.5.0",
+ "uid": "2.0.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/nest"
+ },
+ "peerDependencies": {
+ "cache-manager": "<=5",
+ "class-transformer": "*",
+ "class-validator": "*",
+ "reflect-metadata": "^0.1.12",
+ "rxjs": "^7.1.0"
+ },
+ "peerDependenciesMeta": {
+ "cache-manager": {
+ "optional": true
+ },
+ "class-transformer": {
+ "optional": true
+ },
+ "class-validator": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@openapitools/openapi-generator-cli/node_modules/@nestjs/common/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
+ },
+ "node_modules/@openapitools/openapi-generator-cli/node_modules/@nestjs/core": {
+ "version": "9.3.11",
+ "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-9.3.11.tgz",
+ "integrity": "sha512-CI27a2JFd5rvvbgkalWqsiwQNhcP4EAG5BUK8usjp29wVp1kx30ghfBT8FLqIgmkRVo65A0IcEnWsxeXMntkxQ==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@nuxtjs/opencollective": "0.3.2",
+ "fast-safe-stringify": "2.1.1",
+ "iterare": "1.2.1",
+ "path-to-regexp": "3.2.0",
+ "tslib": "2.5.0",
+ "uid": "2.0.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/nest"
+ },
+ "peerDependencies": {
+ "@nestjs/common": "^9.0.0",
+ "@nestjs/microservices": "^9.0.0",
+ "@nestjs/platform-express": "^9.0.0",
+ "@nestjs/websockets": "^9.0.0",
+ "reflect-metadata": "^0.1.12",
+ "rxjs": "^7.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@nestjs/microservices": {
+ "optional": true
+ },
+ "@nestjs/platform-express": {
+ "optional": true
+ },
+ "@nestjs/websockets": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@openapitools/openapi-generator-cli/node_modules/@nestjs/core/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/axios": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
+ "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
+ "dependencies": {
+ "follow-redirects": "^1.14.9",
+ "form-data": "^4.0.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chardet": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
+ },
+ "node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dependencies": {
+ "restore-cursor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-spinners": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz",
+ "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-width": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
+ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/compare-versions": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-4.1.4.tgz",
+ "integrity": "sha512-FemMreK9xNyL8gQevsdRMrvO4lFCkQP7qbuktn1q8ndcNk1+0mz7lgE7b/sNvbhVgY4w6tMN1FDp6aADjqw2rw=="
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "node_modules/concurrently": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-6.5.1.tgz",
+ "integrity": "sha512-FlSwNpGjWQfRwPLXvJ/OgysbBxPkWpiVjy1042b0U7on7S7qwwMIILRj7WTN1mTgqa582bG6NFuScOoh6Zgdag==",
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "date-fns": "^2.16.1",
+ "lodash": "^4.17.21",
+ "rxjs": "^6.6.3",
+ "spawn-command": "^0.0.2-1",
+ "supports-color": "^8.1.0",
+ "tree-kill": "^1.2.2",
+ "yargs": "^16.2.0"
+ },
+ "bin": {
+ "concurrently": "bin/concurrently.js"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/concurrently/node_modules/rxjs": {
+ "version": "6.6.7",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
+ "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
+ "dependencies": {
+ "tslib": "^1.9.0"
+ },
+ "engines": {
+ "npm": ">=2.0.0"
+ }
+ },
+ "node_modules/concurrently/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/concurrently/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "node_modules/consola": {
+ "version": "2.15.3",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz",
+ "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw=="
+ },
+ "node_modules/console.table": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/console.table/-/console.table-0.10.0.tgz",
+ "integrity": "sha512-dPyZofqggxuvSf7WXvNjuRfnsOk1YazkVP8FdxH4tcH2c37wc79/Yl6Bhr7Lsu00KMgy2ql/qCMuNu8xctZM8g==",
+ "dependencies": {
+ "easy-table": "1.1.0"
+ },
+ "engines": {
+ "node": "> 0.10"
+ }
+ },
+ "node_modules/date-fns": {
+ "version": "2.30.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
+ "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
+ "dependencies": {
+ "@babel/runtime": "^7.21.0"
+ },
+ "engines": {
+ "node": ">=0.11"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/date-fns"
+ }
+ },
+ "node_modules/defaults": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+ "dependencies": {
+ "clone": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/easy-table": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.1.0.tgz",
+ "integrity": "sha512-oq33hWOSSnl2Hoh00tZWaIPi1ievrD9aFG82/IgjlycAnW9hHx5PkJiXpxPsgEE+H7BsbVQXFVFST8TEXS6/pA==",
+ "optionalDependencies": {
+ "wcwidth": ">=1.0.1"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/external-editor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+ "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+ "dependencies": {
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
+ "tmp": "^0.0.33"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/fast-safe-stringify": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
+ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="
+ },
"node_modules/fern-api": {
- "version": "0.10.15",
- "resolved": "https://registry.npmjs.org/fern-api/-/fern-api-0.10.15.tgz",
- "integrity": "sha512-xFEjF5K2Ekqh+9H0GTu1AM6krfGKowgYprp7Z9eKTURAXR34MBwc8EEAVUueqJpdbKi3CnvjaKkcmvARE07Y3A==",
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/fern-api/-/fern-api-0.11.2.tgz",
+ "integrity": "sha512-R2vn/U4qaC1wqUVxX32ZLUMNvFzwmtN+PAS8auuTcC5N8IS+g9ZSdKqQX9egcDYcSvf98+AtlG3Nx82ZswkkoA==",
"bin": {
"fern": "cli.cjs"
}
+ },
+ "node_modules/figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.2",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+ "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/inquirer": {
+ "version": "8.2.5",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz",
+ "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==",
+ "dependencies": {
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.1.1",
+ "cli-cursor": "^3.1.0",
+ "cli-width": "^3.0.0",
+ "external-editor": "^3.0.3",
+ "figures": "^3.0.0",
+ "lodash": "^4.17.21",
+ "mute-stream": "0.0.8",
+ "ora": "^5.4.1",
+ "run-async": "^2.4.0",
+ "rxjs": "^7.5.5",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "through": "^2.3.6",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/iterare": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz",
+ "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/mute-stream": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
+ },
+ "node_modules/node-fetch": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz",
+ "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ora": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+ "dependencies": {
+ "bl": "^4.1.0",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-spinners": "^2.5.0",
+ "is-interactive": "^1.0.0",
+ "is-unicode-supported": "^0.1.0",
+ "log-symbols": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-to-regexp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz",
+ "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA=="
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/reflect-metadata": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz",
+ "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg=="
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/run-async": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/rxjs": {
+ "version": "7.8.0",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz",
+ "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/rxjs/node_modules/tslib": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
+ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
+ },
+ "node_modules/spawn-command": {
+ "version": "0.0.2-1",
+ "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz",
+ "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg=="
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="
+ },
+ "node_modules/tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dependencies": {
+ "os-tmpdir": "~1.0.2"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+ },
+ "node_modules/tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+ "bin": {
+ "tree-kill": "cli.js"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+ "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
+ },
+ "node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/uid": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.1.tgz",
+ "integrity": "sha512-PF+1AnZgycpAIEmNtjxGBVmKbZAQguaa4pBUq6KNaGEcpzZ2klCNZLM34tsjp76maN00TttiiUf6zkIBpJQm2A==",
+ "dependencies": {
+ "@lukeed/csprng": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "peer": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+ "dependencies": {
+ "defaults": "^1.0.3"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "engines": {
+ "node": ">=10"
+ }
}
}
}
diff --git a/clients/package.json b/clients/package.json
index 4c5551f..697f4c5 100644
--- a/clients/package.json
+++ b/clients/package.json
@@ -1,5 +1,6 @@
{
"dependencies": {
- "fern-api": "0.10.15"
+ "@openapitools/openapi-generator-cli": "^2.6.0",
+ "fern-api": "0.11.2"
}
}
\ No newline at end of file
diff --git a/privacy_policy.md b/privacy_policy.md
new file mode 100644
index 0000000..621ecd8
--- /dev/null
+++ b/privacy_policy.md
@@ -0,0 +1,33 @@
+# Privacy Policy
+
+PromptOn takes your privacy seriously. To better protect your privacy we provide this privacy policy notice explaining the way your personal information is collected and used.
+
+## Collection of Routine Information
+
+This website and app track basic information about their users. This information includes, but is not limited to, IP addresses, browser details, timestamps and referring pages. None of this information can personally identify specific user to this website or app. The information is tracked for routine administration and maintenance purposes.
+
+## Cookies
+
+Where necessary, this website and app uses cookies to store information about a visitor’s preferences and history in order to better serve the user and/or present the user with customized content.
+
+## Advertisement and Other Third Parties
+
+Advertising partners and other third parties may use cookies, scripts and/or web beacons to track user activities on this website or app in order to display advertisements and other useful information. Such tracking is done directly by the third parties through their own servers and is subject to their own privacy policies. This website and app has no access or control over these cookies, scripts and/or web beacons that may be used by third parties. Learn how to [opt out of Google’s cookie usage](http://www.google.com/privacy_ads.html).
+
+## Links to Third Party Websites
+
+We have included links on this website and app for your use and reference. We are not responsible for the privacy policies on these websites. You should be aware that the privacy policies of these websites may differ from our own.
+
+## Security
+
+The security of your personal information is important to us, but remember that no method of transmission over the Internet, or method of electronic storage, is 100% secure. While we strive to use commercially acceptable means to protect your personal information, we cannot guarantee its absolute security.
+
+## Changes To This Privacy Policy
+
+This Privacy Policy is effective as of 27-Jun-2023 and will remain in effect except with respect to any changes in its provisions in the future, which will be in effect immediately after being posted on this page.
+
+We reserve the right to update or change our Privacy Policy at any time and you should check this Privacy Policy periodically. If we make any material changes to this Privacy Policy, we will notify you either through the email address you have provided us, or by placing a prominent notice on our website or app.
+
+## Contact Information
+
+For any questions or concerns regarding the privacy policy, please send us an email to hello@prompton.ai.
diff --git a/prompton.code-workspace b/prompton.code-workspace
index df27028..f988dfb 100644
--- a/prompton.code-workspace
+++ b/prompton.code-workspace
@@ -1,7 +1,22 @@
{
"folders": [
{
+ "name": "root",
"path": "."
+ },
+ {
+ "path": "server"
+ },
+ {
+ "path": "clients"
+ },
+ {
+ "name": "python_sdk",
+ "path": "clients/fern/api/python_sdk"
+ },
+ {
+ "name": "node_sdk",
+ "path": "clients/fern/api/node_sdk"
}
],
"settings": {
diff --git a/server/.env.example b/server/.env.example
index 2bc474c..12e4446 100644
--- a/server/.env.example
+++ b/server/.env.example
@@ -4,7 +4,7 @@ MONGO_USER=apidbuser
MONGO_PASSWORD=justlocaldevapi
JWT_SECRET_KEY = 50cde2d3d59d11d233c6d6793720a0f3cb764721ec9d7844757936ccb3279448 # get your own: openssl rand -hex 32
-# JWT_ACCESS_TOKEN_EXPIRE_MINUTES = 30 # defaults to 15 mins if no env var
+# JWT_ACCESS_TOKEN_EXPIRE_MINUTES = 30 # defaults to 60 mins if no env var
# JWT_ALGORITHM = "HS512" # defaults to HS256 if no env var
# used if request_timout not specified in inference reqest body params.
@@ -23,4 +23,10 @@ PROMPTON_ORG_NAME = Prompton # the initial org created by the app
PROMPTON_ORG_OPENAI_API_KEY = #
# initial superuser email & pass
PROMPTON_USER_EMAIL = hal@prompton.ai # must be valid email format
-PROMPTON_USER_PASSWORD_HASH = '$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW' # secret
\ No newline at end of file
+PROMPTON_USER_PASSWORD_HASH = '$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW' # secret
+
+
+# Google OAuth2
+GOOGLE_CLIENT_ID=
+GOOGLE_CLIENT_SECRET=
+STARLETTE_SESSION_SECRET= # for starlette SessionMiddleware. Generate your own eg: secrets.token_urlsafe(30)
\ No newline at end of file
diff --git a/server/.flake8 b/server/.flake8
new file mode 100644
index 0000000..69f9d74
--- /dev/null
+++ b/server/.flake8
@@ -0,0 +1,23 @@
+[flake8]
+exclude =
+ .history,
+ .git,
+ __pycache__
+
+; max-line-length = 88
+
+ignore =
+ # any line length:
+ E501
+ # line break before binary operator (conflicting black's):
+ W503
+
+per-file-ignores =
+ # import * for mocks
+ tests/*: F403, F401
+ # allow any line length for test files
+; tests/*: E501
+
+extend-ignore =
+ # See https://github.com/PyCQA/pycodestyle/issues/373
+ E203,
\ No newline at end of file
diff --git a/server/docker-compose-dev.yml b/server/docker-compose-dev.yml
index 1d23da6..71af556 100644
--- a/server/docker-compose-dev.yml
+++ b/server/docker-compose-dev.yml
@@ -1,7 +1,7 @@
version: '3.8'
services:
mongodb:
- image: mongo:6.0.5 # mongodb/mongodb-community-server:6.0.5-ubi8 ?
+ image: mongo:6.0.6 # mongodb/mongodb-community-server:6.0.5-ubi8 ?
container_name: mongodb
restart: unless-stopped
# command: '/bin/bash -c "sleep 5; mongosh $$CONN_STR --eval \"show dbs;\""'
diff --git a/server/generated/openapi/openapi.json b/server/generated/openapi/openapi.json
index e0be762..4d6549b 100644
--- a/server/generated/openapi/openapi.json
+++ b/server/generated/openapi/openapi.json
@@ -127,15 +127,15 @@
"tags": [
"prompts"
],
- "summary": "Get Prompt List",
- "operationId": "get_prompt_list",
+ "summary": "Get Prompts List",
+ "operationId": "get_prompts_list",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
- "title": "Response Get Prompt List Prompts Get",
+ "title": "Response Get Prompts List Prompts Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/PromptRead"
@@ -184,7 +184,9 @@
"description": "Item created",
"content": {
"application/json": {
- "schema": {}
+ "schema": {
+ "$ref": "#/components/schemas/DefaultPostResponse"
+ }
}
}
},
@@ -363,8 +365,8 @@
"tags": [
"promptVersions"
],
- "summary": "Get Promptversions List",
- "operationId": "get_promptVersions_list",
+ "summary": "Get Prompt Versions List",
+ "operationId": "get_prompt_versions_list",
"parameters": [
{
"required": false,
@@ -382,7 +384,7 @@
"content": {
"application/json": {
"schema": {
- "title": "Response Get Promptversions List Promptversions Get",
+ "title": "Response Get Prompt Versions List Promptversions Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/PromptVersionRead"
@@ -431,7 +433,9 @@
"description": "Item created",
"content": {
"application/json": {
- "schema": {}
+ "schema": {
+ "$ref": "#/components/schemas/DefaultPostResponse"
+ }
}
}
},
@@ -631,12 +635,21 @@
"inferences"
],
"summary": "New Inference",
+ "description": "The core of the functionality:\n1. Populating the template from prompt version with the passed values\n2. Logging the request\n3. Sending request to provider\n4. Logging response\n4. Returning response with `inference_id`\n\nYou can specify which prompt version you want to use in two ways by setting on of:\n\n - `prompt_version_id` - uses the specified prompt version\n - `prompt_id` - uses the `Live` status prompt version assigned to the given `prompt_id`. This allows to release new prompt versions using Prompton API if you only reference `prompt_id` in your client code.\n\n If there are multiple prompt versions in `Live` status for the prompt_id then it picks one randomly. It's useful for split testing.\n This method will return an error if there is no `Live` status message.\n\nIt also handles errors, timeouts and sets the inference status accordingly. It will still process response if client disconnects before it arrives.\n\n_Note: raw request data is also logged, GET `inferences/{id}` reponse includes it as well._\n\nYou can use a few easter eggs to test it without a valid api key:\n\n - `\"end_user_id\": \"mock_me_softly\"`\n - `\"end_user_id\": \"timeout_me_softly\"`\n - `\"end_user_id\": \"fail_me_softly\"`",
"operationId": "new_inference",
"requestBody": {
"content": {
"application/json": {
"schema": {
- "$ref": "#/components/schemas/InferenceCreate"
+ "title": "Inferencerequest",
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/InferenceCreateByPromptVersionId"
+ },
+ {
+ "$ref": "#/components/schemas/InferenceCreateByPromptId"
+ }
+ ]
}
}
},
@@ -737,15 +750,15 @@
"tags": [
"orgs"
],
- "summary": "Get Org List",
- "operationId": "get_org_list",
+ "summary": "Get Orgs List",
+ "operationId": "get_orgs_list",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
- "title": "Response Get Org List Orgs Get",
+ "title": "Response Get Orgs List Orgs Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/OrgRead"
@@ -782,7 +795,9 @@
"description": "Item created",
"content": {
"application/json": {
- "schema": {}
+ "schema": {
+ "$ref": "#/components/schemas/DefaultPostResponse"
+ }
}
}
},
@@ -1016,7 +1031,9 @@
"description": "Item created",
"content": {
"application/json": {
- "schema": {}
+ "schema": {
+ "$ref": "#/components/schemas/DefaultPostResponse"
+ }
}
}
},
@@ -1026,6 +1043,9 @@
"401": {
"description": "Not authenticated"
},
+ "409": {
+ "description": "Email already exists"
+ },
"422": {
"description": "Validation Error",
"content": {
@@ -1131,6 +1151,177 @@
]
}
},
+ "/feedbacks": {
+ "get": {
+ "tags": [
+ "feedbacks"
+ ],
+ "summary": "Get Feedbacks List",
+ "operationId": "get_feedbacks_list",
+ "parameters": [
+ {
+ "required": false,
+ "schema": {
+ "title": "Prompt Version Id",
+ "type": "string"
+ },
+ "name": "prompt_version_id",
+ "in": "query"
+ },
+ {
+ "required": false,
+ "schema": {
+ "title": "Prompton User Id",
+ "type": "string"
+ },
+ "name": "prompton_user_id",
+ "in": "query"
+ },
+ {
+ "required": false,
+ "schema": {
+ "title": "Inference Id",
+ "type": "string"
+ },
+ "name": "inference_id",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "title": "Response Get Feedbacks List Feedbacks Get",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/FeedbackRead"
+ }
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Invalid itemid supplied"
+ },
+ "404": {
+ "description": "Item not found"
+ },
+ "400": {
+ "description": "Malformed request"
+ },
+ "401": {
+ "description": "Not authenticated"
+ }
+ },
+ "security": [
+ {
+ "JWT": []
+ }
+ ]
+ },
+ "post": {
+ "tags": [
+ "feedbacks"
+ ],
+ "summary": "Add Feedback",
+ "description": "Feedback about an inference from an end user or from a PromptOn user.\n\nAt least one of `score`, `flag` or `note` required\n\n`end_user_id` is null if from PromptOn user.\n\n`score` can be null if flagging or note only. Scoring method are for API consumer consideration. Eg. end users can thumbs down/up mapped to -1 +1 `score`, internal users rate between from 0 to 100.\n\n`flag` is any string when inference was flagged. Can be null if it is scoring or note only\n\n`feedback_for_part` is optional and can be used when the inference has multiple sections which require separate feedback.\n\n`metadata` is any dict for additional information.",
+ "operationId": "add_feedback",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FeedbackCreate"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "201": {
+ "description": "Item created",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DefaultPostResponse"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Malformed request"
+ },
+ "401": {
+ "description": "Not authenticated"
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "JWT": []
+ }
+ ]
+ }
+ },
+ "/feedbacks/{id}": {
+ "get": {
+ "tags": [
+ "feedbacks"
+ ],
+ "summary": "Get Feedback By Id",
+ "operationId": "get_feedback_by_id",
+ "parameters": [
+ {
+ "required": true,
+ "schema": {
+ "title": "Id",
+ "type": "string"
+ },
+ "name": "id",
+ "in": "path"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FeedbackRead"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Invalid itemid supplied"
+ },
+ "404": {
+ "description": "Item not found"
+ },
+ "400": {
+ "description": "Malformed request"
+ },
+ "401": {
+ "description": "Not authenticated"
+ }
+ },
+ "security": [
+ {
+ "JWT": []
+ }
+ ]
+ }
+ },
"/": {
"head": {
"summary": "Swagger Docs",
@@ -1503,6 +1694,132 @@
},
"additionalProperties": false
},
+ "DefaultPostResponse": {
+ "title": "DefaultPostResponse",
+ "required": [
+ "id"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "title": "Id",
+ "type": "string",
+ "description": "The id of the created item"
+ }
+ },
+ "description": "Standard response for POST requests. Contains the id of the created item."
+ },
+ "FeedbackCreate": {
+ "title": "FeedbackCreate",
+ "required": [
+ "inference_id"
+ ],
+ "type": "object",
+ "properties": {
+ "inference_id": {
+ "title": "Inference Id",
+ "type": "string",
+ "description": "The inference being rated"
+ },
+ "end_user_id": {
+ "title": "End User Id",
+ "type": "string",
+ "description": "API consumers' end user id If feedback from end user otherwise null"
+ },
+ "feedback_for_part": {
+ "title": "Feedback For Part",
+ "type": "string",
+ "description": "Specifies which part of the output the feedback is about. Can be used when the inference has multiple sections which require separate feedback"
+ },
+ "score": {
+ "title": "Score",
+ "type": "integer",
+ "description": "Any integer score. Rules are up to the API consumer. Can be null if it was flagging or note only"
+ },
+ "flag": {
+ "title": "Flag",
+ "type": "string",
+ "description": "Any string when inference was flagged. Can be null if it is scoring or note only"
+ },
+ "note": {
+ "title": "Note",
+ "type": "string"
+ },
+ "metadata": {
+ "title": "Metadata",
+ "type": "object"
+ }
+ },
+ "additionalProperties": false
+ },
+ "FeedbackRead": {
+ "title": "FeedbackRead",
+ "required": [
+ "_id",
+ "created_at",
+ "created_by_user_id",
+ "created_by_org_id",
+ "inference_id"
+ ],
+ "type": "object",
+ "properties": {
+ "_id": {
+ "title": " Id",
+ "type": "string"
+ },
+ "created_at": {
+ "title": "Created At",
+ "type": "string",
+ "format": "date-time"
+ },
+ "created_by_user_id": {
+ "title": "Created By User Id",
+ "type": "string"
+ },
+ "created_by_org_id": {
+ "title": "Created By Org Id",
+ "type": "string"
+ },
+ "inference_id": {
+ "title": "Inference Id",
+ "type": "string",
+ "description": "The inference being rated"
+ },
+ "end_user_id": {
+ "title": "End User Id",
+ "type": "string",
+ "description": "API consumers' end user id If feedback from end user otherwise null"
+ },
+ "feedback_for_part": {
+ "title": "Feedback For Part",
+ "type": "string",
+ "description": "Specifies which part of the output the feedback is about. Can be used when the inference has multiple sections which require separate feedback"
+ },
+ "score": {
+ "title": "Score",
+ "type": "integer",
+ "description": "Any integer score. Rules are up to the API consumer. Can be null if it was flagging or note only"
+ },
+ "flag": {
+ "title": "Flag",
+ "type": "string",
+ "description": "Any string when inference was flagged. Can be null if it is scoring or note only"
+ },
+ "note": {
+ "title": "Note",
+ "type": "string"
+ },
+ "metadata": {
+ "title": "Metadata",
+ "type": "object"
+ },
+ "prompt_version_id": {
+ "title": "Prompt Version Id",
+ "type": "string"
+ }
+ },
+ "description": "Base model for reading from MongoDB. Same as MongoBaseCreate but assumes all DB base fields are populated so generated clients doesn't requrie None checks"
+ },
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
@@ -1516,31 +1833,82 @@
}
}
},
- "InferenceCreate": {
- "title": "InferenceCreate",
+ "InferenceCreateByPromptId": {
+ "title": "InferenceCreateByPromptId",
"required": [
- "end_user_id",
- "source",
- "prompt_version_id"
+ "prompt_id"
],
"type": "object",
"properties": {
"end_user_id": {
"title": "End User Id",
- "minLength": 1,
- "type": "string"
+ "type": "string",
+ "description": "The API consumer's internal user reference for metrics. It is also relayed to the provider as part of the request if the provider supports it (eg. OpenAI's user field)."
},
"source": {
"title": "Source",
- "minLength": 1,
+ "type": "string",
+ "description": "The API consumer's source for metrics (e.g. AndroidApp etc)."
+ },
+ "client_ref_id": {
+ "title": "Client Ref Id",
+ "type": "string",
+ "description": "The API consumer's internal reference id to able to link references to their sessions."
+ },
+ "template_args": {
+ "title": "Template Args",
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ },
+ "default": {}
+ },
+ "metadata": {
+ "title": "Metadata",
+ "type": "object"
+ },
+ "request_timeout": {
+ "title": "Request Timeout",
+ "type": "number",
+ "description": "Provider request timout in seconds. If not provided, then Prompton API's default timeout for the provider will be used (90sec or `DEFAULT_OPENAI_REQUEST_TIMEOUT_SECONDS` env var if provided)."
+ },
+ "prompt_id": {
+ "title": "Prompt Id",
"type": "string"
+ }
+ },
+ "additionalProperties": false,
+ "description": "Create inference by `prompt_id`. It can only be used if there is at least one 'Live' status prompt version for the provided `prompt_id`.\nIf there are multiple prompt versions in Live status it will pick one randomly. Useful for split testing prompt versions.\nIt stores all other `prompt_version_id`s in Live status at the time of the inference in `prompt_version_ids_considered` field."
+ },
+ "InferenceCreateByPromptVersionId": {
+ "title": "InferenceCreateByPromptVersionId",
+ "required": [
+ "prompt_version_id"
+ ],
+ "type": "object",
+ "properties": {
+ "end_user_id": {
+ "title": "End User Id",
+ "type": "string",
+ "description": "The API consumer's internal user reference for metrics. It is also relayed to the provider as part of the request if the provider supports it (eg. OpenAI's user field)."
+ },
+ "source": {
+ "title": "Source",
+ "type": "string",
+ "description": "The API consumer's source for metrics (e.g. AndroidApp etc)."
+ },
+ "client_ref_id": {
+ "title": "Client Ref Id",
+ "type": "string",
+ "description": "The API consumer's internal reference id to able to link references to their sessions."
},
"template_args": {
"title": "Template Args",
"type": "object",
"additionalProperties": {
"type": "string"
- }
+ },
+ "default": {}
},
"metadata": {
"title": "Metadata",
@@ -1548,7 +1916,8 @@
},
"request_timeout": {
"title": "Request Timeout",
- "type": "number"
+ "type": "number",
+ "description": "Provider request timout in seconds. If not provided, then Prompton API's default timeout for the provider will be used (90sec or `DEFAULT_OPENAI_REQUEST_TIMEOUT_SECONDS` env var if provided)."
},
"prompt_version_id": {
"title": "Prompt Version Id",
@@ -1557,6 +1926,27 @@
},
"additionalProperties": false
},
+ "InferenceError": {
+ "title": "InferenceError",
+ "required": [
+ "error_class",
+ "message"
+ ],
+ "type": "object",
+ "properties": {
+ "error_class": {
+ "title": "Error Class",
+ "type": "string"
+ },
+ "message": {
+ "title": "Message",
+ "type": "string"
+ },
+ "details": {
+ "title": "Details"
+ }
+ }
+ },
"InferencePostResponse": {
"title": "InferencePostResponse",
"required": [
@@ -1586,10 +1976,17 @@
"InferenceRead": {
"title": "InferenceRead",
"required": [
- "end_user_id",
- "source",
+ "_id",
+ "created_at",
+ "created_by_user_id",
+ "created_by_org_id",
+ "template_args",
"prompt_version_id",
- "prompt_id"
+ "prompt_version_ids_considered",
+ "prompt_id",
+ "prompt_version_name",
+ "status",
+ "request"
],
"type": "object",
"properties": {
@@ -1612,13 +2009,18 @@
},
"end_user_id": {
"title": "End User Id",
- "minLength": 1,
- "type": "string"
+ "type": "string",
+ "description": "The API consumer's internal user reference for metrics. It is also relayed to the provider as part of the request if the provider supports it (eg. OpenAI's user field)."
},
"source": {
"title": "Source",
- "minLength": 1,
- "type": "string"
+ "type": "string",
+ "description": "The API consumer's source for metrics (e.g. AndroidApp etc)."
+ },
+ "client_ref_id": {
+ "title": "Client Ref Id",
+ "type": "string",
+ "description": "The API consumer's internal reference id to able to link references to their sessions."
},
"template_args": {
"title": "Template Args",
@@ -1633,12 +2035,20 @@
},
"request_timeout": {
"title": "Request Timeout",
- "type": "number"
+ "type": "number",
+ "description": "Provider request timout in seconds. If not provided, then Prompton API's default timeout for the provider will be used (90sec or `DEFAULT_OPENAI_REQUEST_TIMEOUT_SECONDS` env var if provided)."
},
"prompt_version_id": {
"title": "Prompt Version Id",
"type": "string"
},
+ "prompt_version_ids_considered": {
+ "title": "Prompt Version Ids Considered",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
"prompt_id": {
"title": "Prompt Id",
"type": "string"
@@ -1648,12 +2058,7 @@
"type": "string"
},
"status": {
- "allOf": [
- {
- "$ref": "#/components/schemas/InferenceResponseStatus"
- }
- ],
- "default": "RequestReceived"
+ "$ref": "#/components/schemas/InferenceResponseStatus"
},
"request": {
"$ref": "#/components/schemas/InferenceRequestData"
@@ -1669,7 +2074,8 @@
}
]
}
- }
+ },
+ "description": "Base model for reading from MongoDB. Same as MongoBaseCreate but assumes all DB base fields are populated so generated clients doesn't requrie None checks"
},
"InferenceRequestData": {
"title": "InferenceRequestData",
@@ -1691,7 +2097,6 @@
"InferenceResponseData": {
"title": "InferenceResponseData",
"required": [
- "first_message",
"token_usage",
"raw_response"
],
@@ -1715,9 +2120,6 @@
"type": "boolean",
"default": false
},
- "first_message": {
- "$ref": "#/components/schemas/ChatGPTMessage"
- },
"token_usage": {
"$ref": "#/components/schemas/ChatGPTTokenUsage"
},
@@ -1729,6 +2131,9 @@
},
"InferenceResponseError": {
"title": "InferenceResponseError",
+ "required": [
+ "error"
+ ],
"type": "object",
"properties": {
"completed_at": {
@@ -1750,7 +2155,7 @@
"default": true
},
"error": {
- "title": "Error"
+ "$ref": "#/components/schemas/InferenceError"
}
},
"additionalProperties": false
@@ -1806,6 +2211,11 @@
"additionalProperties": {
"type": "string"
}
+ },
+ "oauth_domain": {
+ "title": "Oauth Domain",
+ "type": "string",
+ "description": "APEX domain for oauth single sign on. Anyone with an email address ending in this domain will be able to register to the org after google account sign in. Only Google OAuth is supported for now."
}
},
"additionalProperties": false
@@ -1813,6 +2223,10 @@
"OrgRead": {
"title": "OrgRead",
"required": [
+ "_id",
+ "created_at",
+ "created_by_user_id",
+ "created_by_org_id",
"name"
],
"type": "object",
@@ -1838,6 +2252,11 @@
"title": "Name",
"type": "string"
},
+ "oauth_domain": {
+ "title": "Oauth Domain",
+ "type": "string",
+ "description": "APEX domain for oauth single sign on. Anyone with an email address ending in this domain will be able to register to the org after google account sign in. Only Google OAuth is supported for now."
+ },
"access_keys": {
"title": "Access Keys",
"type": "object",
@@ -1847,7 +2266,8 @@
"writeOnly": true
}
}
- }
+ },
+ "description": "Base model for reading from MongoDB. Same as MongoBaseCreate but assumes all DB base fields are populated so generated clients doesn't requrie None checks"
},
"OrgUpdate": {
"title": "OrgUpdate",
@@ -1864,6 +2284,11 @@
"additionalProperties": {
"type": "string"
}
+ },
+ "oauth_domain": {
+ "title": "Oauth Domain",
+ "type": "string",
+ "description": "APEX domain for oauth single sign on. Anyone with an email address ending in this domain will be able to register to the org after google account sign in. Only Google OAuth is supported for now."
}
},
"additionalProperties": false
@@ -1881,6 +2306,7 @@
"$ref": "#/components/schemas/PromptStatus"
}
],
+ "description": "Prompt status for client consideration only, currently not used in server logic.",
"default": "Active"
},
"name": {
@@ -1898,6 +2324,11 @@
"PromptRead": {
"title": "PromptRead",
"required": [
+ "_id",
+ "created_at",
+ "created_by_user_id",
+ "created_by_org_id",
+ "status",
"name"
],
"type": "object",
@@ -1920,12 +2351,7 @@
"type": "string"
},
"status": {
- "allOf": [
- {
- "$ref": "#/components/schemas/PromptStatus"
- }
- ],
- "default": "Active"
+ "$ref": "#/components/schemas/PromptStatus"
},
"name": {
"title": "Name",
@@ -1936,7 +2362,8 @@
"title": "Description",
"type": "string"
}
- }
+ },
+ "description": "Base model for reading from MongoDB. Same as MongoBaseCreate but assumes all DB base fields are populated so generated clients doesn't requrie None checks"
},
"PromptStatus": {
"title": "PromptStatus",
@@ -1957,6 +2384,7 @@
"$ref": "#/components/schemas/PromptStatus"
}
],
+ "description": "Prompt status for client consideration only, currently not used in server logic.",
"default": "Active"
},
"name": {
@@ -2013,7 +2441,8 @@
"type": "array",
"items": {
"$ref": "#/components/schemas/ChatGPTMessage"
- }
+ },
+ "default": []
},
"model_config": {
"$ref": "#/components/schemas/ChatGPTChatCompletitionConfig"
@@ -2032,8 +2461,16 @@
"PromptVersionRead": {
"title": "PromptVersionRead",
"required": [
+ "_id",
+ "created_at",
+ "created_by_user_id",
+ "created_by_org_id",
+ "status",
+ "provider",
"name",
- "prompt_id"
+ "prompt_id",
+ "template",
+ "template_arg_names"
],
"type": "object",
"properties": {
@@ -2055,20 +2492,10 @@
"type": "string"
},
"status": {
- "allOf": [
- {
- "$ref": "#/components/schemas/PromptVersionStatus"
- }
- ],
- "default": "Draft"
+ "$ref": "#/components/schemas/PromptVersionStatus"
},
"provider": {
- "allOf": [
- {
- "$ref": "#/components/schemas/PromptVersionProviders"
- }
- ],
- "default": "OpenAI"
+ "$ref": "#/components/schemas/PromptVersionProviders"
},
"name": {
"title": "Name",
@@ -2099,9 +2526,10 @@
"items": {
"type": "string"
},
- "default": []
+ "description": "List of args in the template - populated by server at PATHC and POST"
}
- }
+ },
+ "description": "Base model for reading from MongoDB. Same as MongoBaseCreate but assumes all DB base fields are populated so generated clients doesn't requrie None checks"
},
"PromptVersionStatus": {
"title": "PromptVersionStatus",
@@ -2152,7 +2580,8 @@
"type": "array",
"items": {
"$ref": "#/components/schemas/ChatGPTMessage"
- }
+ },
+ "default": []
},
"model_config": {
"$ref": "#/components/schemas/ChatGPTChatCompletitionConfig"
@@ -2226,6 +2655,11 @@
"UserRead": {
"title": "UserRead",
"required": [
+ "_id",
+ "created_at",
+ "created_by_user_id",
+ "created_by_org_id",
+ "disabled",
"org_id",
"email"
],
@@ -2255,8 +2689,7 @@
},
"disabled": {
"title": "Disabled",
- "type": "boolean",
- "default": false
+ "type": "boolean"
},
"role": {
"allOf": [
@@ -2274,12 +2707,14 @@
"title": "Email",
"type": "string"
}
- }
+ },
+ "description": "Base model for reading from MongoDB. Same as MongoBaseCreate but assumes all DB base fields are populated so generated clients doesn't requrie None checks"
},
"UserRoles": {
"title": "UserRoles",
"enum": [
"Basic",
+ "PromptAdmin",
"OrgAdmin",
"SuperAdmin"
],
diff --git a/server/generated/openapi/openapi.yml b/server/generated/openapi/openapi.yml
index a4bf65f..462b453 100644
--- a/server/generated/openapi/openapi.yml
+++ b/server/generated/openapi/openapi.yml
@@ -85,15 +85,15 @@ paths:
get:
tags:
- prompts
- summary: Get Prompt List
- operationId: get_prompt_list
+ summary: Get Prompts List
+ operationId: get_prompts_list
responses:
'200':
description: Successful Response
content:
application/json:
schema:
- title: Response Get Prompt List Prompts Get
+ title: Response Get Prompts List Prompts Get
type: array
items:
$ref: '#/components/schemas/PromptRead'
@@ -123,7 +123,8 @@ paths:
description: Item created
content:
application/json:
- schema: {}
+ schema:
+ $ref: '#/components/schemas/DefaultPostResponse'
'400':
description: Malformed request
'401':
@@ -230,8 +231,8 @@ paths:
get:
tags:
- promptVersions
- summary: Get Promptversions List
- operationId: get_promptVersions_list
+ summary: Get Prompt Versions List
+ operationId: get_prompt_versions_list
parameters:
- required: false
schema:
@@ -245,7 +246,7 @@ paths:
content:
application/json:
schema:
- title: Response Get Promptversions List Promptversions Get
+ title: Response Get Prompt Versions List Promptversions Get
type: array
items:
$ref: '#/components/schemas/PromptVersionRead'
@@ -275,7 +276,8 @@ paths:
description: Item created
content:
application/json:
- schema: {}
+ schema:
+ $ref: '#/components/schemas/DefaultPostResponse'
'400':
description: Malformed request
'401':
@@ -396,12 +398,32 @@ paths:
tags:
- inferences
summary: New Inference
+ description: "The core of the functionality:\n1. Populating the template from\
+ \ prompt version with the passed values\n2. Logging the request\n3. Sending\
+ \ request to provider\n4. Logging response\n4. Returning response with `inference_id`\n\
+ \nYou can specify which prompt version you want to use in two ways by setting\
+ \ on of:\n\n - `prompt_version_id` - uses the specified prompt version\n -\
+ \ `prompt_id` - uses the `Live` status prompt version assigned to the given\
+ \ `prompt_id`. This allows to release new prompt versions using Prompton API\
+ \ if you only reference `prompt_id` in your client code.\n\n If there\
+ \ are multiple prompt versions in `Live` status for the prompt_id then it\
+ \ picks one randomly. It's useful for split testing.\n This method will\
+ \ return an error if there is no `Live` status message.\n\nIt also handles\
+ \ errors, timeouts and sets the inference status accordingly. It will still\
+ \ process response if client disconnects before it arrives.\n\n_Note: raw\
+ \ request data is also logged, GET `inferences/{id}` reponse includes it as\
+ \ well._\n\nYou can use a few easter eggs to test it without a valid api key:\n\
+ \n - `\"end_user_id\": \"mock_me_softly\"`\n - `\"end_user_id\": \"timeout_me_softly\"\
+ `\n - `\"end_user_id\": \"fail_me_softly\"`"
operationId: new_inference
requestBody:
content:
application/json:
schema:
- $ref: '#/components/schemas/InferenceCreate'
+ title: Inferencerequest
+ anyOf:
+ - $ref: '#/components/schemas/InferenceCreateByPromptVersionId'
+ - $ref: '#/components/schemas/InferenceCreateByPromptId'
required: true
responses:
'201':
@@ -460,15 +482,15 @@ paths:
get:
tags:
- orgs
- summary: Get Org List
- operationId: get_org_list
+ summary: Get Orgs List
+ operationId: get_orgs_list
responses:
'200':
description: Successful Response
content:
application/json:
schema:
- title: Response Get Org List Orgs Get
+ title: Response Get Orgs List Orgs Get
type: array
items:
$ref: '#/components/schemas/OrgRead'
@@ -490,7 +512,8 @@ paths:
description: Item created
content:
application/json:
- schema: {}
+ schema:
+ $ref: '#/components/schemas/DefaultPostResponse'
'400':
description: Malformed request
'401':
@@ -633,11 +656,14 @@ paths:
description: Item created
content:
application/json:
- schema: {}
+ schema:
+ $ref: '#/components/schemas/DefaultPostResponse'
'400':
description: Malformed request
'401':
description: Not authenticated
+ '409':
+ description: Email already exists
'422':
description: Validation Error
content:
@@ -699,6 +725,135 @@ paths:
description: Not authenticated
security:
- JWT: []
+ /feedbacks:
+ get:
+ tags:
+ - feedbacks
+ summary: Get Feedbacks List
+ operationId: get_feedbacks_list
+ parameters:
+ - required: false
+ schema:
+ title: Prompt Version Id
+ type: string
+ name: prompt_version_id
+ in: query
+ - required: false
+ schema:
+ title: Prompton User Id
+ type: string
+ name: prompton_user_id
+ in: query
+ - required: false
+ schema:
+ title: Inference Id
+ type: string
+ name: inference_id
+ in: query
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ title: Response Get Feedbacks List Feedbacks Get
+ type: array
+ items:
+ $ref: '#/components/schemas/FeedbackRead'
+ '422':
+ description: Invalid itemid supplied
+ '404':
+ description: Item not found
+ '400':
+ description: Malformed request
+ '401':
+ description: Not authenticated
+ security:
+ - JWT: []
+ post:
+ tags:
+ - feedbacks
+ summary: Add Feedback
+ description: 'Feedback about an inference from an end user or from a PromptOn
+ user.
+
+
+ At least one of `score`, `flag` or `note` required
+
+
+ `end_user_id` is null if from PromptOn user.
+
+
+ `score` can be null if flagging or note only. Scoring method are for API consumer
+ consideration. Eg. end users can thumbs down/up mapped to -1 +1 `score`, internal
+ users rate between from 0 to 100.
+
+
+ `flag` is any string when inference was flagged. Can be null if it is scoring
+ or note only
+
+
+ `feedback_for_part` is optional and can be used when the inference has multiple
+ sections which require separate feedback.
+
+
+ `metadata` is any dict for additional information.'
+ operationId: add_feedback
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/FeedbackCreate'
+ required: true
+ responses:
+ '201':
+ description: Item created
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DefaultPostResponse'
+ '400':
+ description: Malformed request
+ '401':
+ description: Not authenticated
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+ security:
+ - JWT: []
+ /feedbacks/{id}:
+ get:
+ tags:
+ - feedbacks
+ summary: Get Feedback By Id
+ operationId: get_feedback_by_id
+ parameters:
+ - required: true
+ schema:
+ title: Id
+ type: string
+ name: id
+ in: path
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/FeedbackRead'
+ '422':
+ description: Invalid itemid supplied
+ '404':
+ description: Item not found
+ '400':
+ description: Malformed request
+ '401':
+ description: Not authenticated
+ security:
+ - JWT: []
/:
head:
summary: Swagger Docs
@@ -972,6 +1127,116 @@ components:
title: Status Message
type: string
additionalProperties: false
+ DefaultPostResponse:
+ title: DefaultPostResponse
+ required:
+ - id
+ type: object
+ properties:
+ id:
+ title: Id
+ type: string
+ description: The id of the created item
+ description: Standard response for POST requests. Contains the id of the created
+ item.
+ FeedbackCreate:
+ title: FeedbackCreate
+ required:
+ - inference_id
+ type: object
+ properties:
+ inference_id:
+ title: Inference Id
+ type: string
+ description: The inference being rated
+ end_user_id:
+ title: End User Id
+ type: string
+ description: API consumers' end user id If feedback from end user otherwise
+ null
+ feedback_for_part:
+ title: Feedback For Part
+ type: string
+ description: Specifies which part of the output the feedback is about. Can
+ be used when the inference has multiple sections which require separate
+ feedback
+ score:
+ title: Score
+ type: integer
+ description: Any integer score. Rules are up to the API consumer. Can be
+ null if it was flagging or note only
+ flag:
+ title: Flag
+ type: string
+ description: Any string when inference was flagged. Can be null if it is
+ scoring or note only
+ note:
+ title: Note
+ type: string
+ metadata:
+ title: Metadata
+ type: object
+ additionalProperties: false
+ FeedbackRead:
+ title: FeedbackRead
+ required:
+ - _id
+ - created_at
+ - created_by_user_id
+ - created_by_org_id
+ - inference_id
+ type: object
+ properties:
+ _id:
+ title: ' Id'
+ type: string
+ created_at:
+ title: Created At
+ type: string
+ format: date-time
+ created_by_user_id:
+ title: Created By User Id
+ type: string
+ created_by_org_id:
+ title: Created By Org Id
+ type: string
+ inference_id:
+ title: Inference Id
+ type: string
+ description: The inference being rated
+ end_user_id:
+ title: End User Id
+ type: string
+ description: API consumers' end user id If feedback from end user otherwise
+ null
+ feedback_for_part:
+ title: Feedback For Part
+ type: string
+ description: Specifies which part of the output the feedback is about. Can
+ be used when the inference has multiple sections which require separate
+ feedback
+ score:
+ title: Score
+ type: integer
+ description: Any integer score. Rules are up to the API consumer. Can be
+ null if it was flagging or note only
+ flag:
+ title: Flag
+ type: string
+ description: Any string when inference was flagged. Can be null if it is
+ scoring or note only
+ note:
+ title: Note
+ type: string
+ metadata:
+ title: Metadata
+ type: object
+ prompt_version_id:
+ title: Prompt Version Id
+ type: string
+ description: Base model for reading from MongoDB. Same as MongoBaseCreate but
+ assumes all DB base fields are populated so generated clients doesn't requrie
+ None checks
HTTPValidationError:
title: HTTPValidationError
type: object
@@ -981,37 +1246,109 @@ components:
type: array
items:
$ref: '#/components/schemas/ValidationError'
- InferenceCreate:
- title: InferenceCreate
+ InferenceCreateByPromptId:
+ title: InferenceCreateByPromptId
+ required:
+ - prompt_id
+ type: object
+ properties:
+ end_user_id:
+ title: End User Id
+ type: string
+ description: The API consumer's internal user reference for metrics. It
+ is also relayed to the provider as part of the request if the provider
+ supports it (eg. OpenAI's user field).
+ source:
+ title: Source
+ type: string
+ description: The API consumer's source for metrics (e.g. AndroidApp etc).
+ client_ref_id:
+ title: Client Ref Id
+ type: string
+ description: The API consumer's internal reference id to able to link references
+ to their sessions.
+ template_args:
+ title: Template Args
+ type: object
+ additionalProperties:
+ type: string
+ default: {}
+ metadata:
+ title: Metadata
+ type: object
+ request_timeout:
+ title: Request Timeout
+ type: number
+ description: Provider request timout in seconds. If not provided, then Prompton
+ API's default timeout for the provider will be used (90sec or `DEFAULT_OPENAI_REQUEST_TIMEOUT_SECONDS`
+ env var if provided).
+ prompt_id:
+ title: Prompt Id
+ type: string
+ additionalProperties: false
+ description: 'Create inference by `prompt_id`. It can only be used if there
+ is at least one ''Live'' status prompt version for the provided `prompt_id`.
+
+ If there are multiple prompt versions in Live status it will pick one randomly.
+ Useful for split testing prompt versions.
+
+ It stores all other `prompt_version_id`s in Live status at the time of the
+ inference in `prompt_version_ids_considered` field.'
+ InferenceCreateByPromptVersionId:
+ title: InferenceCreateByPromptVersionId
required:
- - end_user_id
- - source
- prompt_version_id
type: object
properties:
end_user_id:
title: End User Id
- minLength: 1
type: string
+ description: The API consumer's internal user reference for metrics. It
+ is also relayed to the provider as part of the request if the provider
+ supports it (eg. OpenAI's user field).
source:
title: Source
- minLength: 1
type: string
+ description: The API consumer's source for metrics (e.g. AndroidApp etc).
+ client_ref_id:
+ title: Client Ref Id
+ type: string
+ description: The API consumer's internal reference id to able to link references
+ to their sessions.
template_args:
title: Template Args
type: object
additionalProperties:
type: string
+ default: {}
metadata:
title: Metadata
type: object
request_timeout:
title: Request Timeout
type: number
+ description: Provider request timout in seconds. If not provided, then Prompton
+ API's default timeout for the provider will be used (90sec or `DEFAULT_OPENAI_REQUEST_TIMEOUT_SECONDS`
+ env var if provided).
prompt_version_id:
title: Prompt Version Id
type: string
additionalProperties: false
+ InferenceError:
+ title: InferenceError
+ required:
+ - error_class
+ - message
+ type: object
+ properties:
+ error_class:
+ title: Error Class
+ type: string
+ message:
+ title: Message
+ type: string
+ details:
+ title: Details
InferencePostResponse:
title: InferencePostResponse
required:
@@ -1031,10 +1368,17 @@ components:
InferenceRead:
title: InferenceRead
required:
- - end_user_id
- - source
+ - _id
+ - created_at
+ - created_by_user_id
+ - created_by_org_id
+ - template_args
- prompt_version_id
+ - prompt_version_ids_considered
- prompt_id
+ - prompt_version_name
+ - status
+ - request
type: object
properties:
_id:
@@ -1052,12 +1396,19 @@ components:
type: string
end_user_id:
title: End User Id
- minLength: 1
type: string
+ description: The API consumer's internal user reference for metrics. It
+ is also relayed to the provider as part of the request if the provider
+ supports it (eg. OpenAI's user field).
source:
title: Source
- minLength: 1
type: string
+ description: The API consumer's source for metrics (e.g. AndroidApp etc).
+ client_ref_id:
+ title: Client Ref Id
+ type: string
+ description: The API consumer's internal reference id to able to link references
+ to their sessions.
template_args:
title: Template Args
type: object
@@ -1069,9 +1420,17 @@ components:
request_timeout:
title: Request Timeout
type: number
+ description: Provider request timout in seconds. If not provided, then Prompton
+ API's default timeout for the provider will be used (90sec or `DEFAULT_OPENAI_REQUEST_TIMEOUT_SECONDS`
+ env var if provided).
prompt_version_id:
title: Prompt Version Id
type: string
+ prompt_version_ids_considered:
+ title: Prompt Version Ids Considered
+ type: array
+ items:
+ type: string
prompt_id:
title: Prompt Id
type: string
@@ -1079,9 +1438,7 @@ components:
title: Prompt Version Name
type: string
status:
- allOf:
- - $ref: '#/components/schemas/InferenceResponseStatus'
- default: RequestReceived
+ $ref: '#/components/schemas/InferenceResponseStatus'
request:
$ref: '#/components/schemas/InferenceRequestData'
response:
@@ -1089,6 +1446,9 @@ components:
anyOf:
- $ref: '#/components/schemas/InferenceResponseData'
- $ref: '#/components/schemas/InferenceResponseError'
+ description: Base model for reading from MongoDB. Same as MongoBaseCreate but
+ assumes all DB base fields are populated so generated clients doesn't requrie
+ None checks
InferenceRequestData:
title: InferenceRequestData
required:
@@ -1104,7 +1464,6 @@ components:
InferenceResponseData:
title: InferenceResponseData
required:
- - first_message
- token_usage
- raw_response
type: object
@@ -1123,8 +1482,6 @@ components:
title: Iserror
type: boolean
default: false
- first_message:
- $ref: '#/components/schemas/ChatGPTMessage'
token_usage:
$ref: '#/components/schemas/ChatGPTTokenUsage'
raw_response:
@@ -1132,6 +1489,8 @@ components:
additionalProperties: false
InferenceResponseError:
title: InferenceResponseError
+ required:
+ - error
type: object
properties:
completed_at:
@@ -1149,7 +1508,7 @@ components:
type: boolean
default: true
error:
- title: Error
+ $ref: '#/components/schemas/InferenceError'
additionalProperties: false
InferenceResponseStatus:
title: InferenceResponseStatus
@@ -1192,10 +1551,20 @@ components:
type: object
additionalProperties:
type: string
+ oauth_domain:
+ title: Oauth Domain
+ type: string
+ description: APEX domain for oauth single sign on. Anyone with an email
+ address ending in this domain will be able to register to the org after
+ google account sign in. Only Google OAuth is supported for now.
additionalProperties: false
OrgRead:
title: OrgRead
required:
+ - _id
+ - created_at
+ - created_by_user_id
+ - created_by_org_id
- name
type: object
properties:
@@ -1215,6 +1584,12 @@ components:
name:
title: Name
type: string
+ oauth_domain:
+ title: Oauth Domain
+ type: string
+ description: APEX domain for oauth single sign on. Anyone with an email
+ address ending in this domain will be able to register to the org after
+ google account sign in. Only Google OAuth is supported for now.
access_keys:
title: Access Keys
type: object
@@ -1222,6 +1597,9 @@ components:
type: string
format: password
writeOnly: true
+ description: Base model for reading from MongoDB. Same as MongoBaseCreate but
+ assumes all DB base fields are populated so generated clients doesn't requrie
+ None checks
OrgUpdate:
title: OrgUpdate
type: object
@@ -1235,6 +1613,12 @@ components:
type: object
additionalProperties:
type: string
+ oauth_domain:
+ title: Oauth Domain
+ type: string
+ description: APEX domain for oauth single sign on. Anyone with an email
+ address ending in this domain will be able to register to the org after
+ google account sign in. Only Google OAuth is supported for now.
additionalProperties: false
PromptCreate:
title: PromptCreate
@@ -1245,6 +1629,8 @@ components:
status:
allOf:
- $ref: '#/components/schemas/PromptStatus'
+ description: Prompt status for client consideration only, currently not
+ used in server logic.
default: Active
name:
title: Name
@@ -1257,6 +1643,11 @@ components:
PromptRead:
title: PromptRead
required:
+ - _id
+ - created_at
+ - created_by_user_id
+ - created_by_org_id
+ - status
- name
type: object
properties:
@@ -1274,9 +1665,7 @@ components:
title: Created By Org Id
type: string
status:
- allOf:
- - $ref: '#/components/schemas/PromptStatus'
- default: Active
+ $ref: '#/components/schemas/PromptStatus'
name:
title: Name
minLength: 1
@@ -1284,6 +1673,9 @@ components:
description:
title: Description
type: string
+ description: Base model for reading from MongoDB. Same as MongoBaseCreate but
+ assumes all DB base fields are populated so generated clients doesn't requrie
+ None checks
PromptStatus:
title: PromptStatus
enum:
@@ -1298,6 +1690,8 @@ components:
status:
allOf:
- $ref: '#/components/schemas/PromptStatus'
+ description: Prompt status for client consideration only, currently not
+ used in server logic.
default: Active
name:
title: Name
@@ -1337,6 +1731,7 @@ components:
type: array
items:
$ref: '#/components/schemas/ChatGPTMessage'
+ default: []
model_config:
$ref: '#/components/schemas/ChatGPTChatCompletitionConfig'
additionalProperties: false
@@ -1349,8 +1744,16 @@ components:
PromptVersionRead:
title: PromptVersionRead
required:
+ - _id
+ - created_at
+ - created_by_user_id
+ - created_by_org_id
+ - status
+ - provider
- name
- prompt_id
+ - template
+ - template_arg_names
type: object
properties:
_id:
@@ -1367,13 +1770,9 @@ components:
title: Created By Org Id
type: string
status:
- allOf:
- - $ref: '#/components/schemas/PromptVersionStatus'
- default: Draft
+ $ref: '#/components/schemas/PromptVersionStatus'
provider:
- allOf:
- - $ref: '#/components/schemas/PromptVersionProviders'
- default: OpenAI
+ $ref: '#/components/schemas/PromptVersionProviders'
name:
title: Name
minLength: 1
@@ -1396,7 +1795,11 @@ components:
type: array
items:
type: string
- default: []
+ description: List of args in the template - populated by server at PATHC
+ and POST
+ description: Base model for reading from MongoDB. Same as MongoBaseCreate but
+ assumes all DB base fields are populated so generated clients doesn't requrie
+ None checks
PromptVersionStatus:
title: PromptVersionStatus
enum:
@@ -1433,6 +1836,7 @@ components:
type: array
items:
$ref: '#/components/schemas/ChatGPTMessage'
+ default: []
model_config:
$ref: '#/components/schemas/ChatGPTChatCompletitionConfig'
additionalProperties: false
@@ -1485,6 +1889,11 @@ components:
UserRead:
title: UserRead
required:
+ - _id
+ - created_at
+ - created_by_user_id
+ - created_by_org_id
+ - disabled
- org_id
- email
type: object
@@ -1509,7 +1918,6 @@ components:
disabled:
title: Disabled
type: boolean
- default: false
role:
allOf:
- $ref: '#/components/schemas/UserRoles'
@@ -1520,10 +1928,14 @@ components:
email:
title: Email
type: string
+ description: Base model for reading from MongoDB. Same as MongoBaseCreate but
+ assumes all DB base fields are populated so generated clients doesn't requrie
+ None checks
UserRoles:
title: UserRoles
enum:
- Basic
+ - PromptAdmin
- OrgAdmin
- SuperAdmin
type: string
diff --git a/server/justfile b/server/justfile
index ae1b963..de68a04 100644
--- a/server/justfile
+++ b/server/justfile
@@ -47,6 +47,11 @@ devdb-init-purge:
poetry run python -m scripts.db_init_add_api_user
poetry run python -m scripts.db_init_indexes_and_first_user
+lint:
+ poetry run mypy src/ tests/ scripts/
+ poetry run pyright
+ poetry run flake8 src/ tests/ scripts/
+
build-docker:
docker build -t prompton-api-server:localdev .
diff --git a/server/mongo-init-docker-dev/02_indexes.js b/server/mongo-init-docker-dev/02_indexes.js
index cc6bdb6..ec3c4bb 100644
--- a/server/mongo-init-docker-dev/02_indexes.js
+++ b/server/mongo-init-docker-dev/02_indexes.js
@@ -5,15 +5,22 @@ db.auth(process.env.MONGO_USER, process.env.MONGO_PASSWORD);
db.users.createIndex({ email: 1 }, { unique: true });
+db.orgs.createIndex({ oauth_domain: 1 });
+
db.users.createIndex({ created_by_org_id: 1 });
db.orgs.createIndex({ created_by_org_id: 1 });
db.prompts.createIndex({ created_by_org_id: 1 });
db.promptVersions.createIndex({ created_by_org_id: 1 });
db.inferences.createIndex({ created_by_org_id: 1 });
+db.feedbacks.createIndex({ created_by_org_id: 1 });
db.promptVersions.createIndex({ prompt_id: 1 });
-db.inferences.createIndex({ prompt_id: 1 });
+db.inferences.createIndex({ prompt_id: 1 });
db.inferences.createIndex({ prompt_version_id: 1 });
+db.inferences.createIndex({ end_user_id: 1 });
+db.inferences.createIndex({ client_ref_id: 1 });
-console.log("<<<<<<<<<<<<< 02_indexes.js finished. ");
+db.feedbacks.createIndex({ inference_id: -1 });
+db.feedbacks.createIndex({ prompt_version_id: -1 });
+db.feedbacks.createIndex({ created_by_user_id: 1 });
diff --git a/server/mypy.ini b/server/mypy.ini
new file mode 100644
index 0000000..c007dd3
--- /dev/null
+++ b/server/mypy.ini
@@ -0,0 +1,14 @@
+[mypy]
+ignore_missing_imports = False
+
+[mypy-deepdiff.*]
+ignore_missing_imports = True
+
+[mypy-motor.motor_asyncio.*]
+ignore_missing_imports = True
+
+[mypy-mongomock_motor.*]
+ignore_missing_imports = True
+
+[mypy-authlib.integrations.starlette_client.*]
+ignore_missing_imports = True
\ No newline at end of file
diff --git a/server/poetry.lock b/server/poetry.lock
index 1ea312d..9db5f47 100644
--- a/server/poetry.lock
+++ b/server/poetry.lock
@@ -171,6 +171,20 @@ docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-
tests = ["attrs[tests-no-zope]", "zope-interface"]
tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"]
+[[package]]
+name = "authlib"
+version = "1.2.1"
+description = "The ultimate Python library in building OAuth and OpenID Connect servers and clients."
+optional = false
+python-versions = "*"
+files = [
+ {file = "Authlib-1.2.1-py2.py3-none-any.whl", hash = "sha256:c88984ea00149a90e3537c964327da930779afa4564e354edfd98410bea01911"},
+ {file = "Authlib-1.2.1.tar.gz", hash = "sha256:421f7c6b468d907ca2d9afede256f068f87e34d23dd221c07d13d4c234726afb"},
+]
+
+[package.dependencies]
+cryptography = ">=3.2"
+
[[package]]
name = "bcrypt"
version = "4.0.1"
@@ -205,6 +219,53 @@ files = [
tests = ["pytest (>=3.2.1,!=3.3.0)"]
typecheck = ["mypy"]
+[[package]]
+name = "black"
+version = "23.3.0"
+description = "The uncompromising code formatter."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915"},
+ {file = "black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9"},
+ {file = "black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2"},
+ {file = "black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c"},
+ {file = "black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c"},
+ {file = "black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6"},
+ {file = "black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b"},
+ {file = "black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d"},
+ {file = "black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70"},
+ {file = "black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326"},
+ {file = "black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b"},
+ {file = "black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2"},
+ {file = "black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925"},
+ {file = "black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27"},
+ {file = "black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331"},
+ {file = "black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5"},
+ {file = "black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961"},
+ {file = "black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8"},
+ {file = "black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30"},
+ {file = "black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3"},
+ {file = "black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266"},
+ {file = "black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab"},
+ {file = "black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb"},
+ {file = "black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4"},
+ {file = "black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940"},
+]
+
+[package.dependencies]
+click = ">=8.0.0"
+mypy-extensions = ">=0.4.3"
+packaging = ">=22.0"
+pathspec = ">=0.9.0"
+platformdirs = ">=2"
+
+[package.extras]
+colorama = ["colorama (>=0.4.3)"]
+d = ["aiohttp (>=3.7.4)"]
+jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
+uvloop = ["uvloop (>=0.15.2)"]
+
[[package]]
name = "certifi"
version = "2023.5.7"
@@ -515,24 +576,55 @@ idna = ">=2.0.0"
[[package]]
name = "fastapi"
-version = "0.96.0"
+version = "0.98.0"
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
optional = false
python-versions = ">=3.7"
files = [
- {file = "fastapi-0.96.0-py3-none-any.whl", hash = "sha256:b8e11fe81e81eab4e1504209917338e0b80f783878a42c2b99467e5e1019a1e9"},
- {file = "fastapi-0.96.0.tar.gz", hash = "sha256:71232d47c2787446991c81c41c249f8a16238d52d779c0e6b43927d3773dbe3c"},
+ {file = "fastapi-0.98.0-py3-none-any.whl", hash = "sha256:f4165fb1fe3610c52cb1b8282c1480de9c34bc270f56a965aa93a884c350d605"},
+ {file = "fastapi-0.98.0.tar.gz", hash = "sha256:0d3c18886f652038262b5898fec6b09f4ca92ee23e9d9b1d1d24e429f84bf27b"},
]
[package.dependencies]
-pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0"
+pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0"
starlette = ">=0.27.0,<0.28.0"
[package.extras]
all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
-dev = ["pre-commit (>=2.17.0,<3.0.0)", "ruff (==0.0.138)", "uvicorn[standard] (>=0.12.0,<0.21.0)"]
-doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer-cli (>=0.0.13,<0.0.14)", "typer[all] (>=0.6.1,<0.8.0)"]
-test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==23.1.0)", "coverage[toml] (>=6.5.0,<8.0)", "databases[sqlite] (>=0.3.2,<0.7.0)", "email-validator (>=1.1.1,<2.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.23.0,<0.24.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.982)", "orjson (>=3.2.1,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=7.1.3,<8.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.7)", "pyyaml (>=5.3.1,<7.0.0)", "ruff (==0.0.138)", "sqlalchemy (>=1.3.18,<1.4.43)", "types-orjson (==3.6.2)", "types-ujson (==5.7.0.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"]
+
+[[package]]
+name = "flake8"
+version = "6.0.0"
+description = "the modular source code checker: pep8 pyflakes and co"
+optional = false
+python-versions = ">=3.8.1"
+files = [
+ {file = "flake8-6.0.0-py2.py3-none-any.whl", hash = "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7"},
+ {file = "flake8-6.0.0.tar.gz", hash = "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181"},
+]
+
+[package.dependencies]
+mccabe = ">=0.7.0,<0.8.0"
+pycodestyle = ">=2.10.0,<2.11.0"
+pyflakes = ">=3.0.0,<3.1.0"
+
+[[package]]
+name = "flake8-black"
+version = "0.3.6"
+description = "flake8 plugin to call black as a code style validator"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "flake8-black-0.3.6.tar.gz", hash = "sha256:0dfbca3274777792a5bcb2af887a4cad72c72d0e86c94e08e3a3de151bb41c34"},
+ {file = "flake8_black-0.3.6-py3-none-any.whl", hash = "sha256:fe8ea2eca98d8a504f22040d9117347f6b367458366952862ac3586e7d4eeaca"},
+]
+
+[package.dependencies]
+black = ">=22.1.0"
+flake8 = ">=3"
+
+[package.extras]
+develop = ["build", "twine"]
[[package]]
name = "frozenlist"
@@ -694,6 +786,17 @@ files = [
{file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
]
+[[package]]
+name = "itsdangerous"
+version = "2.1.2"
+description = "Safely pass data to untrusted environments and back."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"},
+ {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"},
+]
+
[[package]]
name = "mangum"
version = "0.17.0"
@@ -708,6 +811,17 @@ files = [
[package.dependencies]
typing-extensions = "*"
+[[package]]
+name = "mccabe"
+version = "0.7.0"
+description = "McCabe checker, plugin for flake8"
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"},
+ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"},
+]
+
[[package]]
name = "mongomock"
version = "4.1.2"
@@ -725,13 +839,13 @@ sentinels = "*"
[[package]]
name = "mongomock-motor"
-version = "0.0.19"
+version = "0.0.20"
description = "Library for mocking AsyncIOMotorClient built on top of mongomock."
optional = false
python-versions = ">=3.6"
files = [
- {file = "mongomock_motor-0.0.19-py3-none-any.whl", hash = "sha256:954444de0a6371acbd45b0ecad6a9daab99e0e652c863d15a65189a196201cc5"},
- {file = "mongomock_motor-0.0.19.tar.gz", hash = "sha256:1d716c20b982c11fad2569d0d220c570fdaf63a90a719a00bb83622fefcd6646"},
+ {file = "mongomock_motor-0.0.20-py3-none-any.whl", hash = "sha256:908bc8f969ced87e11e2c526b3f215d51410c28148cc7374d0ee285d64c98d91"},
+ {file = "mongomock_motor-0.0.20.tar.gz", hash = "sha256:f708073db304ebee95bfd37ea9ef93019196082cd11dd5e61d34c9e8be213521"},
]
[package.dependencies]
@@ -739,26 +853,26 @@ mongomock = ">=3.23.0,<5.0.0"
[[package]]
name = "motor"
-version = "3.1.2"
+version = "3.2.0"
description = "Non-blocking MongoDB driver for Tornado or asyncio"
optional = false
python-versions = ">=3.7"
files = [
- {file = "motor-3.1.2-py3-none-any.whl", hash = "sha256:4bfc65230853ad61af447088527c1197f91c20ee957cfaea3144226907335716"},
- {file = "motor-3.1.2.tar.gz", hash = "sha256:80c08477c09e70db4f85c99d484f2bafa095772f1d29b3ccb253270f9041da9a"},
+ {file = "motor-3.2.0-py3-none-any.whl", hash = "sha256:82cd3d8a3b57e322c3fa382a393b52828c9a2e98b315c78af36f01bae78af6a6"},
+ {file = "motor-3.2.0.tar.gz", hash = "sha256:4fb1e8502260f853554f24115421584e83904a6debb577354d33e9711ee99008"},
]
[package.dependencies]
-pymongo = ">=4.1,<5"
+pymongo = ">=4.4,<5"
[package.extras]
-aws = ["pymongo[aws] (>=4.1,<5)"]
-encryption = ["pymongo[encryption] (>=4.1,<5)"]
-gssapi = ["pymongo[gssapi] (>=4.1,<5)"]
-ocsp = ["pymongo[ocsp] (>=4.1,<5)"]
-snappy = ["pymongo[snappy] (>=4.1,<5)"]
-srv = ["pymongo[srv] (>=4.1,<5)"]
-zstd = ["pymongo[zstd] (>=4.1,<5)"]
+aws = ["pymongo[aws] (>=4.4,<5)"]
+encryption = ["pymongo[encryption] (>=4.4,<5)"]
+gssapi = ["pymongo[gssapi] (>=4.4,<5)"]
+ocsp = ["pymongo[ocsp] (>=4.4,<5)"]
+snappy = ["pymongo[snappy] (>=4.4,<5)"]
+srv = ["pymongo[srv] (>=4.4,<5)"]
+zstd = ["pymongo[zstd] (>=4.4,<5)"]
[[package]]
name = "multidict"
@@ -845,42 +959,42 @@ files = [
[[package]]
name = "mypy"
-version = "1.3.0"
+version = "1.4.1"
description = "Optional static typing for Python"
optional = false
python-versions = ">=3.7"
files = [
- {file = "mypy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c1eb485cea53f4f5284e5baf92902cd0088b24984f4209e25981cc359d64448d"},
- {file = "mypy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4c99c3ecf223cf2952638da9cd82793d8f3c0c5fa8b6ae2b2d9ed1e1ff51ba85"},
- {file = "mypy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:550a8b3a19bb6589679a7c3c31f64312e7ff482a816c96e0cecec9ad3a7564dd"},
- {file = "mypy-1.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cbc07246253b9e3d7d74c9ff948cd0fd7a71afcc2b77c7f0a59c26e9395cb152"},
- {file = "mypy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:a22435632710a4fcf8acf86cbd0d69f68ac389a3892cb23fbad176d1cddaf228"},
- {file = "mypy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6e33bb8b2613614a33dff70565f4c803f889ebd2f859466e42b46e1df76018dd"},
- {file = "mypy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7d23370d2a6b7a71dc65d1266f9a34e4cde9e8e21511322415db4b26f46f6b8c"},
- {file = "mypy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:658fe7b674769a0770d4b26cb4d6f005e88a442fe82446f020be8e5f5efb2fae"},
- {file = "mypy-1.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e42d29e324cdda61daaec2336c42512e59c7c375340bd202efa1fe0f7b8f8ca"},
- {file = "mypy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:d0b6c62206e04061e27009481cb0ec966f7d6172b5b936f3ead3d74f29fe3dcf"},
- {file = "mypy-1.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:76ec771e2342f1b558c36d49900dfe81d140361dd0d2df6cd71b3db1be155409"},
- {file = "mypy-1.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebc95f8386314272bbc817026f8ce8f4f0d2ef7ae44f947c4664efac9adec929"},
- {file = "mypy-1.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:faff86aa10c1aa4a10e1a301de160f3d8fc8703b88c7e98de46b531ff1276a9a"},
- {file = "mypy-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:8c5979d0deb27e0f4479bee18ea0f83732a893e81b78e62e2dda3e7e518c92ee"},
- {file = "mypy-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c5d2cc54175bab47011b09688b418db71403aefad07cbcd62d44010543fc143f"},
- {file = "mypy-1.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:87df44954c31d86df96c8bd6e80dfcd773473e877ac6176a8e29898bfb3501cb"},
- {file = "mypy-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:473117e310febe632ddf10e745a355714e771ffe534f06db40702775056614c4"},
- {file = "mypy-1.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:74bc9b6e0e79808bf8678d7678b2ae3736ea72d56eede3820bd3849823e7f305"},
- {file = "mypy-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:44797d031a41516fcf5cbfa652265bb994e53e51994c1bd649ffcd0c3a7eccbf"},
- {file = "mypy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ddae0f39ca146972ff6bb4399f3b2943884a774b8771ea0a8f50e971f5ea5ba8"},
- {file = "mypy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c4c42c60a8103ead4c1c060ac3cdd3ff01e18fddce6f1016e08939647a0e703"},
- {file = "mypy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e86c2c6852f62f8f2b24cb7a613ebe8e0c7dc1402c61d36a609174f63e0ff017"},
- {file = "mypy-1.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f9dca1e257d4cc129517779226753dbefb4f2266c4eaad610fc15c6a7e14283e"},
- {file = "mypy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:95d8d31a7713510685b05fbb18d6ac287a56c8f6554d88c19e73f724a445448a"},
- {file = "mypy-1.3.0-py3-none-any.whl", hash = "sha256:a8763e72d5d9574d45ce5881962bc8e9046bf7b375b0abf031f3e6811732a897"},
- {file = "mypy-1.3.0.tar.gz", hash = "sha256:e1f4d16e296f5135624b34e8fb741eb0eadedca90862405b1f1fde2040b9bd11"},
+ {file = "mypy-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:566e72b0cd6598503e48ea610e0052d1b8168e60a46e0bfd34b3acf2d57f96a8"},
+ {file = "mypy-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ca637024ca67ab24a7fd6f65d280572c3794665eaf5edcc7e90a866544076878"},
+ {file = "mypy-1.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dde1d180cd84f0624c5dcaaa89c89775550a675aff96b5848de78fb11adabcd"},
+ {file = "mypy-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8c4d8e89aa7de683e2056a581ce63c46a0c41e31bd2b6d34144e2c80f5ea53dc"},
+ {file = "mypy-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:bfdca17c36ae01a21274a3c387a63aa1aafe72bff976522886869ef131b937f1"},
+ {file = "mypy-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7549fbf655e5825d787bbc9ecf6028731973f78088fbca3a1f4145c39ef09462"},
+ {file = "mypy-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:98324ec3ecf12296e6422939e54763faedbfcc502ea4a4c38502082711867258"},
+ {file = "mypy-1.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:141dedfdbfe8a04142881ff30ce6e6653c9685b354876b12e4fe6c78598b45e2"},
+ {file = "mypy-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8207b7105829eca6f3d774f64a904190bb2231de91b8b186d21ffd98005f14a7"},
+ {file = "mypy-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:16f0db5b641ba159eff72cff08edc3875f2b62b2fa2bc24f68c1e7a4e8232d01"},
+ {file = "mypy-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:470c969bb3f9a9efcedbadcd19a74ffb34a25f8e6b0e02dae7c0e71f8372f97b"},
+ {file = "mypy-1.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5952d2d18b79f7dc25e62e014fe5a23eb1a3d2bc66318df8988a01b1a037c5b"},
+ {file = "mypy-1.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:190b6bab0302cec4e9e6767d3eb66085aef2a1cc98fe04936d8a42ed2ba77bb7"},
+ {file = "mypy-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9d40652cc4fe33871ad3338581dca3297ff5f2213d0df345bcfbde5162abf0c9"},
+ {file = "mypy-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01fd2e9f85622d981fd9063bfaef1aed6e336eaacca00892cd2d82801ab7c042"},
+ {file = "mypy-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2460a58faeea905aeb1b9b36f5065f2dc9a9c6e4c992a6499a2360c6c74ceca3"},
+ {file = "mypy-1.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2746d69a8196698146a3dbe29104f9eb6a2a4d8a27878d92169a6c0b74435b6"},
+ {file = "mypy-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ae704dcfaa180ff7c4cfbad23e74321a2b774f92ca77fd94ce1049175a21c97f"},
+ {file = "mypy-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:43d24f6437925ce50139a310a64b2ab048cb2d3694c84c71c3f2a1626d8101dc"},
+ {file = "mypy-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c482e1246726616088532b5e964e39765b6d1520791348e6c9dc3af25b233828"},
+ {file = "mypy-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:43b592511672017f5b1a483527fd2684347fdffc041c9ef53428c8dc530f79a3"},
+ {file = "mypy-1.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34a9239d5b3502c17f07fd7c0b2ae6b7dd7d7f6af35fbb5072c6208e76295816"},
+ {file = "mypy-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5703097c4936bbb9e9bce41478c8d08edd2865e177dc4c52be759f81ee4dd26c"},
+ {file = "mypy-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e02d700ec8d9b1859790c0475df4e4092c7bf3272a4fd2c9f33d87fac4427b8f"},
+ {file = "mypy-1.4.1-py3-none-any.whl", hash = "sha256:45d32cec14e7b97af848bddd97d85ea4f0db4d5a149ed9676caa4eb2f7402bb4"},
+ {file = "mypy-1.4.1.tar.gz", hash = "sha256:9bbcd9ab8ea1f2e1c8031c21445b511442cc45c89951e49bbf852cbb70755b1b"},
]
[package.dependencies]
mypy-extensions = ">=1.0.0"
-typing-extensions = ">=3.10"
+typing-extensions = ">=4.1.0"
[package.extras]
dmypy = ["psutil (>=4.0)"]
@@ -899,6 +1013,20 @@ files = [
{file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
]
+[[package]]
+name = "nodeenv"
+version = "1.8.0"
+description = "Node.js virtual environment builder"
+optional = false
+python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*"
+files = [
+ {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"},
+ {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"},
+]
+
+[package.dependencies]
+setuptools = "*"
+
[[package]]
name = "openai"
version = "0.27.8"
@@ -966,15 +1094,41 @@ bcrypt = ["bcrypt (>=3.1.0)"]
build-docs = ["cloud-sptheme (>=1.10.1)", "sphinx (>=1.6)", "sphinxcontrib-fulltoc (>=1.2.0)"]
totp = ["cryptography"]
+[[package]]
+name = "pathspec"
+version = "0.11.1"
+description = "Utility library for gitignore style pattern matching of file paths."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"},
+ {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"},
+]
+
+[[package]]
+name = "platformdirs"
+version = "3.8.0"
+description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "platformdirs-3.8.0-py3-none-any.whl", hash = "sha256:ca9ed98ce73076ba72e092b23d3c93ea6c4e186b3f1c3dad6edd98ff6ffcca2e"},
+ {file = "platformdirs-3.8.0.tar.gz", hash = "sha256:b0cabcb11063d21a0b261d557acb0a9d2126350e63b70cdf7db6347baea456dc"},
+]
+
+[package.extras]
+docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"]
+test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"]
+
[[package]]
name = "pluggy"
-version = "1.0.0"
+version = "1.2.0"
description = "plugin and hook calling mechanisms for python"
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
files = [
- {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
- {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
+ {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"},
+ {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"},
]
[package.extras]
@@ -992,6 +1146,17 @@ files = [
{file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"},
]
+[[package]]
+name = "pycodestyle"
+version = "2.10.0"
+description = "Python style guide checker"
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "pycodestyle-2.10.0-py2.py3-none-any.whl", hash = "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610"},
+ {file = "pycodestyle-2.10.0.tar.gz", hash = "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053"},
+]
+
[[package]]
name = "pycparser"
version = "2.21"
@@ -1005,47 +1170,47 @@ files = [
[[package]]
name = "pydantic"
-version = "1.10.8"
+version = "1.10.9"
description = "Data validation and settings management using python type hints"
optional = false
python-versions = ">=3.7"
files = [
- {file = "pydantic-1.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1243d28e9b05003a89d72e7915fdb26ffd1d39bdd39b00b7dbe4afae4b557f9d"},
- {file = "pydantic-1.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0ab53b609c11dfc0c060d94335993cc2b95b2150e25583bec37a49b2d6c6c3f"},
- {file = "pydantic-1.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9613fadad06b4f3bc5db2653ce2f22e0de84a7c6c293909b48f6ed37b83c61f"},
- {file = "pydantic-1.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df7800cb1984d8f6e249351139667a8c50a379009271ee6236138a22a0c0f319"},
- {file = "pydantic-1.10.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0c6fafa0965b539d7aab0a673a046466d23b86e4b0e8019d25fd53f4df62c277"},
- {file = "pydantic-1.10.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e82d4566fcd527eae8b244fa952d99f2ca3172b7e97add0b43e2d97ee77f81ab"},
- {file = "pydantic-1.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:ab523c31e22943713d80d8d342d23b6f6ac4b792a1e54064a8d0cf78fd64e800"},
- {file = "pydantic-1.10.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:666bdf6066bf6dbc107b30d034615d2627e2121506c555f73f90b54a463d1f33"},
- {file = "pydantic-1.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:35db5301b82e8661fa9c505c800d0990bc14e9f36f98932bb1d248c0ac5cada5"},
- {file = "pydantic-1.10.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f90c1e29f447557e9e26afb1c4dbf8768a10cc676e3781b6a577841ade126b85"},
- {file = "pydantic-1.10.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93e766b4a8226e0708ef243e843105bf124e21331694367f95f4e3b4a92bbb3f"},
- {file = "pydantic-1.10.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:88f195f582851e8db960b4a94c3e3ad25692c1c1539e2552f3df7a9e972ef60e"},
- {file = "pydantic-1.10.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:34d327c81e68a1ecb52fe9c8d50c8a9b3e90d3c8ad991bfc8f953fb477d42fb4"},
- {file = "pydantic-1.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:d532bf00f381bd6bc62cabc7d1372096b75a33bc197a312b03f5838b4fb84edd"},
- {file = "pydantic-1.10.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7d5b8641c24886d764a74ec541d2fc2c7fb19f6da2a4001e6d580ba4a38f7878"},
- {file = "pydantic-1.10.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b1f6cb446470b7ddf86c2e57cd119a24959af2b01e552f60705910663af09a4"},
- {file = "pydantic-1.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c33b60054b2136aef8cf190cd4c52a3daa20b2263917c49adad20eaf381e823b"},
- {file = "pydantic-1.10.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1952526ba40b220b912cdc43c1c32bcf4a58e3f192fa313ee665916b26befb68"},
- {file = "pydantic-1.10.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bb14388ec45a7a0dc429e87def6396f9e73c8c77818c927b6a60706603d5f2ea"},
- {file = "pydantic-1.10.8-cp37-cp37m-win_amd64.whl", hash = "sha256:16f8c3e33af1e9bb16c7a91fc7d5fa9fe27298e9f299cff6cb744d89d573d62c"},
- {file = "pydantic-1.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1ced8375969673929809d7f36ad322934c35de4af3b5e5b09ec967c21f9f7887"},
- {file = "pydantic-1.10.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:93e6bcfccbd831894a6a434b0aeb1947f9e70b7468f274154d03d71fabb1d7c6"},
- {file = "pydantic-1.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:191ba419b605f897ede9892f6c56fb182f40a15d309ef0142212200a10af4c18"},
- {file = "pydantic-1.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:052d8654cb65174d6f9490cc9b9a200083a82cf5c3c5d3985db765757eb3b375"},
- {file = "pydantic-1.10.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ceb6a23bf1ba4b837d0cfe378329ad3f351b5897c8d4914ce95b85fba96da5a1"},
- {file = "pydantic-1.10.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f2e754d5566f050954727c77f094e01793bcb5725b663bf628fa6743a5a9108"},
- {file = "pydantic-1.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:6a82d6cda82258efca32b40040228ecf43a548671cb174a1e81477195ed3ed56"},
- {file = "pydantic-1.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e59417ba8a17265e632af99cc5f35ec309de5980c440c255ab1ca3ae96a3e0e"},
- {file = "pydantic-1.10.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:84d80219c3f8d4cad44575e18404099c76851bc924ce5ab1c4c8bb5e2a2227d0"},
- {file = "pydantic-1.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e4148e635994d57d834be1182a44bdb07dd867fa3c2d1b37002000646cc5459"},
- {file = "pydantic-1.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12f7b0bf8553e310e530e9f3a2f5734c68699f42218bf3568ef49cd9b0e44df4"},
- {file = "pydantic-1.10.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:42aa0c4b5c3025483240a25b09f3c09a189481ddda2ea3a831a9d25f444e03c1"},
- {file = "pydantic-1.10.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17aef11cc1b997f9d574b91909fed40761e13fac438d72b81f902226a69dac01"},
- {file = "pydantic-1.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:66a703d1983c675a6e0fed8953b0971c44dba48a929a2000a493c3772eb61a5a"},
- {file = "pydantic-1.10.8-py3-none-any.whl", hash = "sha256:7456eb22ed9aaa24ff3e7b4757da20d9e5ce2a81018c1b3ebd81a0b88a18f3b2"},
- {file = "pydantic-1.10.8.tar.gz", hash = "sha256:1410275520dfa70effadf4c21811d755e7ef9bb1f1d077a21958153a92c8d9ca"},
+ {file = "pydantic-1.10.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e692dec4a40bfb40ca530e07805b1208c1de071a18d26af4a2a0d79015b352ca"},
+ {file = "pydantic-1.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c52eb595db83e189419bf337b59154bdcca642ee4b2a09e5d7797e41ace783f"},
+ {file = "pydantic-1.10.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:939328fd539b8d0edf244327398a667b6b140afd3bf7e347cf9813c736211896"},
+ {file = "pydantic-1.10.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b48d3d634bca23b172f47f2335c617d3fcb4b3ba18481c96b7943a4c634f5c8d"},
+ {file = "pydantic-1.10.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f0b7628fb8efe60fe66fd4adadd7ad2304014770cdc1f4934db41fe46cc8825f"},
+ {file = "pydantic-1.10.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e1aa5c2410769ca28aa9a7841b80d9d9a1c5f223928ca8bec7e7c9a34d26b1d4"},
+ {file = "pydantic-1.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:eec39224b2b2e861259d6f3c8b6290d4e0fbdce147adb797484a42278a1a486f"},
+ {file = "pydantic-1.10.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d111a21bbbfd85c17248130deac02bbd9b5e20b303338e0dbe0faa78330e37e0"},
+ {file = "pydantic-1.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e9aec8627a1a6823fc62fb96480abe3eb10168fd0d859ee3d3b395105ae19a7"},
+ {file = "pydantic-1.10.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07293ab08e7b4d3c9d7de4949a0ea571f11e4557d19ea24dd3ae0c524c0c334d"},
+ {file = "pydantic-1.10.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ee829b86ce984261d99ff2fd6e88f2230068d96c2a582f29583ed602ef3fc2c"},
+ {file = "pydantic-1.10.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4b466a23009ff5cdd7076eb56aca537c745ca491293cc38e72bf1e0e00de5b91"},
+ {file = "pydantic-1.10.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7847ca62e581e6088d9000f3c497267868ca2fa89432714e21a4fb33a04d52e8"},
+ {file = "pydantic-1.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:7845b31959468bc5b78d7b95ec52fe5be32b55d0d09983a877cca6aedc51068f"},
+ {file = "pydantic-1.10.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:517a681919bf880ce1dac7e5bc0c3af1e58ba118fd774da2ffcd93c5f96eaece"},
+ {file = "pydantic-1.10.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67195274fd27780f15c4c372f4ba9a5c02dad6d50647b917b6a92bf00b3d301a"},
+ {file = "pydantic-1.10.9-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2196c06484da2b3fded1ab6dbe182bdabeb09f6318b7fdc412609ee2b564c49a"},
+ {file = "pydantic-1.10.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6257bb45ad78abacda13f15bde5886efd6bf549dd71085e64b8dcf9919c38b60"},
+ {file = "pydantic-1.10.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3283b574b01e8dbc982080d8287c968489d25329a463b29a90d4157de4f2baaf"},
+ {file = "pydantic-1.10.9-cp37-cp37m-win_amd64.whl", hash = "sha256:5f8bbaf4013b9a50e8100333cc4e3fa2f81214033e05ac5aa44fa24a98670a29"},
+ {file = "pydantic-1.10.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9cd67fb763248cbe38f0593cd8611bfe4b8ad82acb3bdf2b0898c23415a1f82"},
+ {file = "pydantic-1.10.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f50e1764ce9353be67267e7fd0da08349397c7db17a562ad036aa7c8f4adfdb6"},
+ {file = "pydantic-1.10.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73ef93e5e1d3c8e83f1ff2e7fdd026d9e063c7e089394869a6e2985696693766"},
+ {file = "pydantic-1.10.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:128d9453d92e6e81e881dd7e2484e08d8b164da5507f62d06ceecf84bf2e21d3"},
+ {file = "pydantic-1.10.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ad428e92ab68798d9326bb3e5515bc927444a3d71a93b4a2ca02a8a5d795c572"},
+ {file = "pydantic-1.10.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fab81a92f42d6d525dd47ced310b0c3e10c416bbfae5d59523e63ea22f82b31e"},
+ {file = "pydantic-1.10.9-cp38-cp38-win_amd64.whl", hash = "sha256:963671eda0b6ba6926d8fc759e3e10335e1dc1b71ff2a43ed2efd6996634dafb"},
+ {file = "pydantic-1.10.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:970b1bdc6243ef663ba5c7e36ac9ab1f2bfecb8ad297c9824b542d41a750b298"},
+ {file = "pydantic-1.10.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7e1d5290044f620f80cf1c969c542a5468f3656de47b41aa78100c5baa2b8276"},
+ {file = "pydantic-1.10.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83fcff3c7df7adff880622a98022626f4f6dbce6639a88a15a3ce0f96466cb60"},
+ {file = "pydantic-1.10.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0da48717dc9495d3a8f215e0d012599db6b8092db02acac5e0d58a65248ec5bc"},
+ {file = "pydantic-1.10.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0a2aabdc73c2a5960e87c3ffebca6ccde88665616d1fd6d3db3178ef427b267a"},
+ {file = "pydantic-1.10.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9863b9420d99dfa9c064042304868e8ba08e89081428a1c471858aa2af6f57c4"},
+ {file = "pydantic-1.10.9-cp39-cp39-win_amd64.whl", hash = "sha256:e7c9900b43ac14110efa977be3da28931ffc74c27e96ee89fbcaaf0b0fe338e1"},
+ {file = "pydantic-1.10.9-py3-none-any.whl", hash = "sha256:6cafde02f6699ce4ff643417d1a9223716ec25e228ddc3b436fe7e2d25a1f305"},
+ {file = "pydantic-1.10.9.tar.gz", hash = "sha256:95c70da2cd3b6ddf3b9645ecaa8d98f3d80c606624b6d245558d202cd23ea3be"},
]
[package.dependencies]
@@ -1057,87 +1222,98 @@ typing-extensions = ">=4.2.0"
dotenv = ["python-dotenv (>=0.10.4)"]
email = ["email-validator (>=1.0.3)"]
+[[package]]
+name = "pyflakes"
+version = "3.0.1"
+description = "passive checker of Python programs"
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "pyflakes-3.0.1-py2.py3-none-any.whl", hash = "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf"},
+ {file = "pyflakes-3.0.1.tar.gz", hash = "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd"},
+]
+
[[package]]
name = "pymongo"
-version = "4.3.3"
+version = "4.4.0"
description = "Python driver for MongoDB "
optional = false
python-versions = ">=3.7"
files = [
- {file = "pymongo-4.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:74731c9e423c93cbe791f60c27030b6af6a948cef67deca079da6cd1bb583a8e"},
- {file = "pymongo-4.3.3-cp310-cp310-manylinux1_i686.whl", hash = "sha256:66413c50d510e5bcb0afc79880d1693a2185bcea003600ed898ada31338c004e"},
- {file = "pymongo-4.3.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:9b87b23570565a6ddaa9244d87811c2ee9cffb02a753c8a2da9c077283d85845"},
- {file = "pymongo-4.3.3-cp310-cp310-manylinux2014_i686.whl", hash = "sha256:695939036a320f4329ccf1627edefbbb67cc7892b8222d297b0dd2313742bfee"},
- {file = "pymongo-4.3.3-cp310-cp310-manylinux2014_ppc64le.whl", hash = "sha256:ffcc8394123ea8d43fff8e5d000095fe7741ce3f8988366c5c919c4f5eb179d3"},
- {file = "pymongo-4.3.3-cp310-cp310-manylinux2014_s390x.whl", hash = "sha256:943f208840777f34312c103a2d1caab02d780c4e9be26b3714acf6c4715ba7e1"},
- {file = "pymongo-4.3.3-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:01f7cbe88d22440b6594c955e37312d932fd632ffed1a86d0c361503ca82cc9d"},
- {file = "pymongo-4.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdb87309de97c63cb9a69132e1cb16be470e58cffdfbad68fdd1dc292b22a840"},
- {file = "pymongo-4.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d86c35d94b5499689354ccbc48438a79f449481ee6300f3e905748edceed78e7"},
- {file = "pymongo-4.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a966d5304b7d90c45c404914e06bbf02c5bf7e99685c6c12f0047ef2aa837142"},
- {file = "pymongo-4.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be1d2ce7e269215c3ee9a215e296b7a744aff4f39233486d2c4d77f5f0c561a6"},
- {file = "pymongo-4.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:55b6163dac53ef1e5d834297810c178050bd0548a4136cd4e0f56402185916ca"},
- {file = "pymongo-4.3.3-cp310-cp310-win32.whl", hash = "sha256:dc0cff74cd36d7e1edba91baa09622c35a8a57025f2f2b7a41e3f83b1db73186"},
- {file = "pymongo-4.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:cafa52873ae12baa512a8721afc20de67a36886baae6a5f394ddef0ce9391f91"},
- {file = "pymongo-4.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:599d3f6fbef31933b96e2d906b0f169b3371ff79ea6aaf6ecd76c947a3508a3d"},
- {file = "pymongo-4.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0640b4e9d008e13956b004d1971a23377b3d45491f87082161c92efb1e6c0d6"},
- {file = "pymongo-4.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:341221e2f2866a5960e6f8610f4cbac0bb13097f3b1a289aa55aba984fc0d969"},
- {file = "pymongo-4.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e7fac06a539daef4fcf5d8288d0d21b412f9b750454cd5a3cf90484665db442a"},
- {file = "pymongo-4.3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3a51901066696c4af38c6c63a1f0aeffd5e282367ff475de8c191ec9609b56d"},
- {file = "pymongo-4.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3055510fdfdb1775bc8baa359783022f70bb553f2d46e153c094dfcb08578ff"},
- {file = "pymongo-4.3.3-cp311-cp311-win32.whl", hash = "sha256:524d78673518dcd352a91541ecd2839c65af92dc883321c2109ef6e5cd22ef23"},
- {file = "pymongo-4.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:b8a03af1ce79b902a43f5f694c4ca8d92c2a4195db0966f08f266549e2fc49bc"},
- {file = "pymongo-4.3.3-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:39b03045c71f761aee96a12ebfbc2f4be89e724ff6f5e31c2574c1a0e2add8bd"},
- {file = "pymongo-4.3.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6fcfbf435eebf8a1765c6d1f46821740ebe9f54f815a05c8fc30d789ef43cb12"},
- {file = "pymongo-4.3.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:7d43ac9c7eeda5100fb0a7152fab7099c9cf9e5abd3bb36928eb98c7d7a339c6"},
- {file = "pymongo-4.3.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3b93043b14ba7eb08c57afca19751658ece1cfa2f0b7b1fb5c7a41452fbb8482"},
- {file = "pymongo-4.3.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:c09956606c08c4a7c6178a04ba2dd9388fcc5db32002ade9c9bc865ab156ab6d"},
- {file = "pymongo-4.3.3-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:b0cfe925610f2fd59555bb7fc37bd739e4b197d33f2a8b2fae7b9c0c6640318c"},
- {file = "pymongo-4.3.3-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:4d00b91c77ceb064c9b0459f0d6ea5bfdbc53ea9e17cf75731e151ef25a830c7"},
- {file = "pymongo-4.3.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:c6258a3663780ae47ba73d43eb63c79c40ffddfb764e09b56df33be2f9479837"},
- {file = "pymongo-4.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c29e758f0e734e1e90357ae01ec9c6daf19ff60a051192fe110d8fb25c62600e"},
- {file = "pymongo-4.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f3621a46cdc7a9ba8080422262398a91762a581d27e0647746588d3f995c88"},
- {file = "pymongo-4.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:47f7aa217b25833cd6f0e72b0d224be55393c2692b4f5e0561cb3beeb10296e9"},
- {file = "pymongo-4.3.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c2fdc855149efe7cdcc2a01ca02bfa24761c640203ea94df467f3baf19078be"},
- {file = "pymongo-4.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5effd87c7d363890259eac16c56a4e8da307286012c076223997f8cc4a8c435b"},
- {file = "pymongo-4.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6dd1cf2995fdbd64fc0802313e8323f5fa18994d51af059b5b8862b73b5e53f0"},
- {file = "pymongo-4.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:bb869707d8e30645ed6766e44098600ca6cdf7989c22a3ea2b7966bb1d98d4b2"},
- {file = "pymongo-4.3.3-cp37-cp37m-win32.whl", hash = "sha256:49210feb0be8051a64d71691f0acbfbedc33e149f0a5d6e271fddf6a12493fed"},
- {file = "pymongo-4.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:54c377893f2cbbffe39abcff5ff2e917b082c364521fa079305f6f064e1a24a9"},
- {file = "pymongo-4.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c184ec5be465c0319440734491e1aa4709b5f3ba75fdfc9dbbc2ae715a7f6829"},
- {file = "pymongo-4.3.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:dca34367a4e77fcab0693e603a959878eaf2351585e7d752cac544bc6b2dee46"},
- {file = "pymongo-4.3.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cd6a4afb20fb3c26a7bfd4611a0bbb24d93cbd746f5eb881f114b5e38fd55501"},
- {file = "pymongo-4.3.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0c466710871d0026c190fc4141e810cf9d9affbf4935e1d273fbdc7d7cda6143"},
- {file = "pymongo-4.3.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:d07d06dba5b5f7d80f9cc45501456e440f759fe79f9895922ed486237ac378a8"},
- {file = "pymongo-4.3.3-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:711bc52cb98e7892c03e9b669bebd89c0a890a90dbc6d5bb2c47f30239bac6e9"},
- {file = "pymongo-4.3.3-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:34b040e095e1671df0c095ec0b04fc4ebb19c4c160f87c2b55c079b16b1a6b00"},
- {file = "pymongo-4.3.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:4ed00f96e147f40b565fe7530d1da0b0f3ab803d5dd5b683834500fa5d195ec4"},
- {file = "pymongo-4.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef888f48eb9203ee1e04b9fb27429017b290fb916f1e7826c2f7808c88798394"},
- {file = "pymongo-4.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:316498b642c00401370b2156b5233b256f9b33799e0a8d9d0b8a7da217a20fca"},
- {file = "pymongo-4.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa7e202feb683dad74f00dea066690448d0cfa310f8a277db06ec8eb466601b5"},
- {file = "pymongo-4.3.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52896e22115c97f1c829db32aa2760b0d61839cfe08b168c2b1d82f31dbc5f55"},
- {file = "pymongo-4.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c051fe37c96b9878f37fa58906cb53ecd13dcb7341d3a85f1e2e2f6b10782d9"},
- {file = "pymongo-4.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5134d33286c045393c7beb51be29754647cec5ebc051cf82799c5ce9820a2ca2"},
- {file = "pymongo-4.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a9c2885b4a8e6e39db5662d8b02ca6dcec796a45e48c2de12552841f061692ba"},
- {file = "pymongo-4.3.3-cp38-cp38-win32.whl", hash = "sha256:a6cd6f1db75eb07332bd3710f58f5fce4967eadbf751bad653842750a61bda62"},
- {file = "pymongo-4.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:d5571b6978750601f783cea07fb6b666837010ca57e5cefa389c1d456f6222e2"},
- {file = "pymongo-4.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:81d1a7303bd02ca1c5be4aacd4db73593f573ba8e0c543c04c6da6275fd7a47e"},
- {file = "pymongo-4.3.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:016c412118e1c23fef3a1eada4f83ae6e8844fd91986b2e066fc1b0013cdd9ae"},
- {file = "pymongo-4.3.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:8fd6e191b92a10310f5a6cfe10d6f839d79d192fb02480bda325286bd1c7b385"},
- {file = "pymongo-4.3.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:e2961b05f9c04a53da8bfc72f1910b6aec7205fcf3ac9c036d24619979bbee4b"},
- {file = "pymongo-4.3.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:b38a96b3eed8edc515b38257f03216f382c4389d022a8834667e2bc63c0c0c31"},
- {file = "pymongo-4.3.3-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:c1a70c51da9fa95bd75c167edb2eb3f3c4d27bc4ddd29e588f21649d014ec0b7"},
- {file = "pymongo-4.3.3-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:8a06a0c02f5606330e8f2e2f3b7949877ca7e4024fa2bff5a4506bec66c49ec7"},
- {file = "pymongo-4.3.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:6c2216d8b6a6d019c6f4b1ad55f890e5e77eb089309ffc05b6911c09349e7474"},
- {file = "pymongo-4.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eac0a143ef4f28f49670bf89cb15847eb80b375d55eba401ca2f777cd425f338"},
- {file = "pymongo-4.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:08fc250b5552ee97ceeae0f52d8b04f360291285fc7437f13daa516ce38fdbc6"},
- {file = "pymongo-4.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704d939656e21b073bfcddd7228b29e0e8a93dd27b54240eaafc0b9a631629a6"},
- {file = "pymongo-4.3.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1074f1a6f23e28b983c96142f2d45be03ec55d93035b471c26889a7ad2365db3"},
- {file = "pymongo-4.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b16250238de8dafca225647608dddc7bbb5dce3dd53b4d8e63c1cc287394c2f"},
- {file = "pymongo-4.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7761cacb8745093062695b11574effea69db636c2fd0a9269a1f0183712927b4"},
- {file = "pymongo-4.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fd7bb378d82b88387dc10227cfd964f6273eb083e05299e9b97cbe075da12d11"},
- {file = "pymongo-4.3.3-cp39-cp39-win32.whl", hash = "sha256:dc24d245026a72d9b4953729d31813edd4bd4e5c13622d96e27c284942d33f24"},
- {file = "pymongo-4.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:fc28e8d85d392a06434e9a934908d97e2cf453d69488d2bcd0bfb881497fd975"},
- {file = "pymongo-4.3.3.tar.gz", hash = "sha256:34e95ffb0a68bffbc3b437f2d1f25fc916fef3df5cdeed0992da5f42fae9b807"},
+ {file = "pymongo-4.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:50294bae0f20ec4f8d3f5eefd133956f582942c156d08f6b88f2a1b1efe04c53"},
+ {file = "pymongo-4.4.0-cp310-cp310-manylinux1_i686.whl", hash = "sha256:88ceab5cd84f7d86f018fa66377d6f90fcf3643d56283f2f4124ccef58390a0e"},
+ {file = "pymongo-4.4.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:2578f077b9448b7a420b3e9b0efdfb7ecdb2a3c27e00c181610809717c900cd9"},
+ {file = "pymongo-4.4.0-cp310-cp310-manylinux2014_i686.whl", hash = "sha256:ebe1954aa85e622674ea01828419f129527c95c40a392e0f7761e242d85a772f"},
+ {file = "pymongo-4.4.0-cp310-cp310-manylinux2014_ppc64le.whl", hash = "sha256:7e0fbf05bb74a3f610f970a178bfb4e048f6b82fc22dda5e14e0ddfc4d66c9b7"},
+ {file = "pymongo-4.4.0-cp310-cp310-manylinux2014_s390x.whl", hash = "sha256:4b43ae6e1c4b972761065f77f3eff4b914154bc5bd74d632305875c5309eafd1"},
+ {file = "pymongo-4.4.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:18acb807de39eb9b8ff7122094920f1da79c1781dc96cfef73dd97da51448f7b"},
+ {file = "pymongo-4.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5c56169effa5bf9fae5e9a66efc211b3f252869d99d6c400792eced7f213b9"},
+ {file = "pymongo-4.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c6bd8470c89b2cd6312fa685dbf4c64371a04a7e4a3a55e2007626f8f997103"},
+ {file = "pymongo-4.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:02f535bc8f8d75d45ec6cd944804d466a73a46afc368d6c36e232b887edd0475"},
+ {file = "pymongo-4.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff281a66925790a05e3c7e0de1350a0992b66a4e51724317ac35026ac856ae28"},
+ {file = "pymongo-4.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6aa18b255af46641d167378f8b8f06becb6eb1670f622aefa34e502362267fa9"},
+ {file = "pymongo-4.4.0-cp310-cp310-win32.whl", hash = "sha256:34ea6ffb77f0cf8d01c4c1df60dc68141859ada1507c326380ef81e23b58c9cc"},
+ {file = "pymongo-4.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:071c256fbb35c6942970b8b6eb6b89bac302db49a2d6d35e68c35b442a0ce710"},
+ {file = "pymongo-4.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d0a8f16a97758ca9af1baa927521b24175dba7e95ce745d5bf64a5c75fe61df8"},
+ {file = "pymongo-4.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02060ced24a26e1c73b6f491b728fe99e73f38ba3a1e4b882dc7b873d419ab3e"},
+ {file = "pymongo-4.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38ece8d2892de19fa437bc4f60b0d8c5353b185e8cc1c543212a488c93c74834"},
+ {file = "pymongo-4.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2128592140426044d59a89f30b7aba1e185faf2553b3d161dcca0aa970ba40c7"},
+ {file = "pymongo-4.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8d482e2ae01a5ac17183afe8c808cb6919889bdf22f0d3663105ccf0ea89adf"},
+ {file = "pymongo-4.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0ddb34591f5e19296ef5b643e23ec5179a7c1d2b73c17701f50dcfa493e0252"},
+ {file = "pymongo-4.4.0-cp311-cp311-win32.whl", hash = "sha256:23bfd793be088470a1c7bca5c907ae3180e6a4cf731e96a194c89413c042cf4c"},
+ {file = "pymongo-4.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:48908eaca3dccc2af8b4eae73ee00d2e1e7ffe91ce630c8906981c075161ad8c"},
+ {file = "pymongo-4.4.0-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:a4315509a4e155e6bd4b199bd435ff2bb31f558915726e0c50a725ae7b99727f"},
+ {file = "pymongo-4.4.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:93d8d5ee37cd9634747a1363496fd3949451bdaeb9539278985cb6fd08d929cf"},
+ {file = "pymongo-4.4.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3e6efcf768209dc4d966fabbbe4dcd2dd2d60ec4d8342668da02664f0c73a9e8"},
+ {file = "pymongo-4.4.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e5f19bb887d83959ba1c359fba16cdedb0f868ba85ae375c3e4e0fdf5697a524"},
+ {file = "pymongo-4.4.0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:b641683de9bf05b4b52a629bf8ddd5fa0fb061ca54bc2412ce89ce2de2beda36"},
+ {file = "pymongo-4.4.0-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:2f74b606c11c570ec2a6c384fc194d96f00eaa829c7c08cbec455f7b02d28774"},
+ {file = "pymongo-4.4.0-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:242d1a30162ead28e69df37748021039c4b292bbfd7c5449294a26c8365d342d"},
+ {file = "pymongo-4.4.0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:4b092e2a11f37a41e1767a221ff2719397ae2e033f978de236ce10c4b1916227"},
+ {file = "pymongo-4.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c96a080cae86c1c27758fdd3fbee0298a006b05272de4dff9dea21ca34952c72"},
+ {file = "pymongo-4.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:67aa85bbab597615efd83f521c8da34dd9a19b7456cc919c227378c793073183"},
+ {file = "pymongo-4.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1eea8af506b8b33573c76942a5c2390f2cddb4e195b1cdfc373ca919e9b95904"},
+ {file = "pymongo-4.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44893b6788da1d67696ff2f27e42e315d40965a4fa23786dcc26c932c5b02149"},
+ {file = "pymongo-4.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01807a3d0b758cbf65e7b3af84a24d2ee58c9d6c0af8b0af99b581bcaa75a931"},
+ {file = "pymongo-4.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9f3e8fc3433a86ab0b3d960f8fb48fe7135876df04987dd04b3bf35d9b49ae92"},
+ {file = "pymongo-4.4.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0669823de06c3a77fddf738f6250688b7fdae2b44edbe3c103b7fbfdfc848392"},
+ {file = "pymongo-4.4.0-cp37-cp37m-win32.whl", hash = "sha256:95a5036b7046f617207f38936c188eeb56dbe740cba0fa1215df2e1b9ee38c74"},
+ {file = "pymongo-4.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:45838fa9abf3bce35a24fffcd289de23f3d6edc4cc9beac28037df3e1009f892"},
+ {file = "pymongo-4.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:40ad38ad6f6dbd8a9dbd05195a15fe7749a0692dc895274a4f806d9831fceb3c"},
+ {file = "pymongo-4.4.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:028addb304bc525d4a10c5c6e59ef5f140e528ae285c10e1d43f19905631e32f"},
+ {file = "pymongo-4.4.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:093c5343c5863e87023318050507511fa7458b0376caabcc41abff0e36aaabc8"},
+ {file = "pymongo-4.4.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:1a1bb096579ffa59143a8d8fc9d4692db3e04305cf5a0e48e0724ae47a836255"},
+ {file = "pymongo-4.4.0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:b100895d6b57d6a7e8de5fd15578aaa46170b56d978baf56182c10e8ba725fbf"},
+ {file = "pymongo-4.4.0-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:29956f61ab885c28b190ff817de7ad0c75a470699632b44848b102640fbf9e73"},
+ {file = "pymongo-4.4.0-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:f38bbab4d13d180ed00c2f107e36503bd2e2cc4c6d4ae2734c0a85c2edaf2d2e"},
+ {file = "pymongo-4.4.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:274eb75231aca12d54d421852fc230e8655e4b33b30e9eb7fd34269955e125dd"},
+ {file = "pymongo-4.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6603315f9a15e5ed80143a5a744c695a8503e27a76fb5828f7269225f39ddd"},
+ {file = "pymongo-4.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d368def4564681f681f4fe1ae906239bb4dc7dd403c49d15d3a6fe2688950f13"},
+ {file = "pymongo-4.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf4e83af0bd3cf4c98eaf1ed2d028afd520bdffd6f7570f6cc5a44e9363fbb9a"},
+ {file = "pymongo-4.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eba5abcee347bdaa7f1a3f18fd97758f0b75a6dc5704885e793aeb51e8e5e32"},
+ {file = "pymongo-4.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a2e496753e91bc82dfbe1f3bab21e0907866dab3c810e255ebaf991cd5c5455d"},
+ {file = "pymongo-4.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8edb59aa5c10a3fb8d3a0c2cac8ba58c0d8f4e56f9003378ac1fff503a8d3f42"},
+ {file = "pymongo-4.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:801094c80d117b0d476f0afbe16cdfe438cc4069c5b0f2578564cb4b3c83f80f"},
+ {file = "pymongo-4.4.0-cp38-cp38-win32.whl", hash = "sha256:8fd68b540fb70954deeb2b6a1fb2f34d6342bcf221e003e6063e3b28e87b2778"},
+ {file = "pymongo-4.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a5551491ace0f05ae0bbe5a496c4daf216d9fc98e182940f471c228235b1626e"},
+ {file = "pymongo-4.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4481f2796d53cd0c74d988a23a11266e6cae03be3878f42ed2c221b192d14f8d"},
+ {file = "pymongo-4.4.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:6a2564ed1a07258a73f7adfb0663aa69022f1edc431d11aae4a32a29e7755d3c"},
+ {file = "pymongo-4.4.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:900c773d4f9d68747bb19ef40c35c701f4a919a6b96efa2d4e1cb50074a9738e"},
+ {file = "pymongo-4.4.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b213fae58d6ba14ac71a481691981e582ff5813630f3a82aaf92fb79399ba0ec"},
+ {file = "pymongo-4.4.0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:4a0cfab6b6c1826e8dfe4453c08aa70343a693dede7c09dca564a9b1f2393374"},
+ {file = "pymongo-4.4.0-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:8d8a8aef8724058d416536902e680f2b06499e58c54220becdfcd3ff8e5dccfd"},
+ {file = "pymongo-4.4.0-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:6acedf0778b79b6ea111a28fb23760b5f6b7b1c3e1f1e3595cf87ce709bce344"},
+ {file = "pymongo-4.4.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:15cf004b6329da48078d7d9d1c79c802df6631b94e5a1ed9a112d713cc0f66e9"},
+ {file = "pymongo-4.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2caac57d2a0160dce877e706e94e8a15b87feb71c257ecb8b5a039f7e98ba99b"},
+ {file = "pymongo-4.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2875f0bdb605e56630f46e12082f26ac2c680a5473f5f154b7131841727948c"},
+ {file = "pymongo-4.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78be52dc21f578a17e2c1cf1a222d4e64e91e0b1dba7e18f5ff7be7c0bf8053f"},
+ {file = "pymongo-4.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7eb221dcb9e27415d2bd6e2d3001d1da0f351e2aa1564f6f3987f2206c066600"},
+ {file = "pymongo-4.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3eed06a24157a891eac5f73ec2400d22cccc95cde78a3f0e2b90c5ab17f1cf1"},
+ {file = "pymongo-4.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:196c2c9ffccdf0ad4efdfae29347c4e2ae52c3415e958736cda84e4062553e96"},
+ {file = "pymongo-4.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4b65f4e66efe43dcc5fb3a285f899e798742b8365bafdd832054675d34d640d5"},
+ {file = "pymongo-4.4.0-cp39-cp39-win32.whl", hash = "sha256:4a28ad09abccc9f71632398febfea12d3f28cec7e44fe6f2b16665807e62c298"},
+ {file = "pymongo-4.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:5e13ba36f18489600db28da13da73e8e190bd48899ad268cb482fe726d31a922"},
+ {file = "pymongo-4.4.0.tar.gz", hash = "sha256:a1b5d286fee4b9b5a0312faede02f2ce2f56ac695685af1d25f428abdac9a22c"},
]
[package.dependencies]
@@ -1145,21 +1321,39 @@ dnspython = ">=1.16.0,<3.0.0"
[package.extras]
aws = ["pymongo-auth-aws (<2.0.0)"]
-encryption = ["pymongo-auth-aws (<2.0.0)", "pymongocrypt (>=1.3.0,<2.0.0)"]
-gssapi = ["pykerberos"]
+encryption = ["pymongo[aws]", "pymongocrypt (>=1.6.0,<2.0.0)"]
+gssapi = ["pykerberos", "winkerberos (>=0.5.0)"]
ocsp = ["certifi", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"]
snappy = ["python-snappy"]
zstd = ["zstandard"]
+[[package]]
+name = "pyright"
+version = "1.1.316"
+description = "Command line wrapper for pyright"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "pyright-1.1.316-py3-none-any.whl", hash = "sha256:7259d73287c882f933d8cd88c238ef02336e172171ae95117a963a962a1fed4a"},
+ {file = "pyright-1.1.316.tar.gz", hash = "sha256:bac1baf8567b90f2082ec95b61fc1cb50a68917119212c5608a72210870c6a9a"},
+]
+
+[package.dependencies]
+nodeenv = ">=1.6.0"
+
+[package.extras]
+all = ["twine (>=3.4.1)"]
+dev = ["twine (>=3.4.1)"]
+
[[package]]
name = "pytest"
-version = "7.3.1"
+version = "7.4.0"
description = "pytest: simple powerful testing with Python"
optional = false
python-versions = ">=3.7"
files = [
- {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"},
- {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"},
+ {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"},
+ {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"},
]
[package.dependencies]
@@ -1169,7 +1363,7 @@ packaging = "*"
pluggy = ">=0.12,<2.0"
[package.extras]
-testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"]
+testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
[[package]]
name = "python-dotenv"
@@ -1315,6 +1509,22 @@ files = [
{file = "sentinels-1.0.0.tar.gz", hash = "sha256:7be0704d7fe1925e397e92d18669ace2f619c92b5d4eb21a89f31e026f9ff4b1"},
]
+[[package]]
+name = "setuptools"
+version = "68.0.0"
+description = "Easily download, build, install, upgrade, and uninstall Python packages"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"},
+ {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"},
+]
+
+[package.extras]
+docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"]
+testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
+testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"]
+
[[package]]
name = "six"
version = "1.16.0"
@@ -1374,6 +1584,42 @@ notebook = ["ipywidgets (>=6)"]
slack = ["slack-sdk"]
telegram = ["requests"]
+[[package]]
+name = "types-passlib"
+version = "1.7.7.12"
+description = "Typing stubs for passlib"
+optional = false
+python-versions = "*"
+files = [
+ {file = "types-passlib-1.7.7.12.tar.gz", hash = "sha256:6abbf2400a8f1cba48639753e3a034af507a765489bb070974d7f68d9ceef883"},
+ {file = "types_passlib-1.7.7.12-py3-none-any.whl", hash = "sha256:7a4df64b53c2746f804aa29fb361974e5894e0df30ff18cf60b9518696ffc9d3"},
+]
+
+[[package]]
+name = "types-pyasn1"
+version = "0.4.0.5"
+description = "Typing stubs for pyasn1"
+optional = false
+python-versions = "*"
+files = [
+ {file = "types-pyasn1-0.4.0.5.tar.gz", hash = "sha256:d88aca717d15032a6e32050f473fbc73d880b81cb6408bfbea75a3a0bd43a0bd"},
+ {file = "types_pyasn1-0.4.0.5-py3-none-any.whl", hash = "sha256:c5d661b820922b9a99b984b6c2c051734b5ceaa8732206f7196055b5f799ddb6"},
+]
+
+[[package]]
+name = "types-python-jose"
+version = "3.3.4.7"
+description = "Typing stubs for python-jose"
+optional = false
+python-versions = "*"
+files = [
+ {file = "types-python-jose-3.3.4.7.tar.gz", hash = "sha256:33c033d313a02457b09874a7e516c75da2538069ffe30f779968482bd6f3b123"},
+ {file = "types_python_jose-3.3.4.7-py3-none-any.whl", hash = "sha256:896ba4b99c2da8f3546ef02db32e39d69f4ea75c0e9ed8ae3664bc40bc72c7d8"},
+]
+
+[package.dependencies]
+types-pyasn1 = "*"
+
[[package]]
name = "types-pyyaml"
version = "6.0.12.10"
@@ -1387,13 +1633,13 @@ files = [
[[package]]
name = "typing-extensions"
-version = "4.6.3"
+version = "4.7.0"
description = "Backported and Experimental Type Hints for Python 3.7+"
optional = false
python-versions = ">=3.7"
files = [
- {file = "typing_extensions-4.6.3-py3-none-any.whl", hash = "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26"},
- {file = "typing_extensions-4.6.3.tar.gz", hash = "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"},
+ {file = "typing_extensions-4.7.0-py3-none-any.whl", hash = "sha256:5d8c9dac95c27d20df12fb1d97b9793ab8b2af8a3a525e68c80e21060c161771"},
+ {file = "typing_extensions-4.7.0.tar.gz", hash = "sha256:935ccf31549830cda708b42289d44b6f74084d616a00be651601a4f968e77c82"},
]
[[package]]
@@ -1521,4 +1767,4 @@ multidict = ">=4.0"
[metadata]
lock-version = "2.0"
python-versions = "^3.11"
-content-hash = "7a78d9a8680030e4414b8aa03bd2d40f384a6877afffc727fd4b6e8623e8ab7b"
+content-hash = "1522b00552e9c2d241c4993e5dff62da13229a5d65fd82fd603271e6dd714b49"
diff --git a/server/pyproject.toml b/server/pyproject.toml
index d2a229f..4a7166c 100644
--- a/server/pyproject.toml
+++ b/server/pyproject.toml
@@ -7,8 +7,8 @@ readme = "README.md"
[tool.poetry.dependencies]
python = "^3.11"
-fastapi = "^0.96.0"
-motor = "^3.1.2"
+fastapi = "0.98.0"
+motor = "^3.2.0"
uvicorn = "^0.22.0"
httpx = "^0.24.1"
aiohttp = "^3.8.4"
@@ -18,16 +18,23 @@ passlib = { version = "^1.7.4", extras = ["bcrypt"] }
python-multipart = "^0.0.6"
pydantic = { version = "^1.10.8", extras = ["email", "dotenv"] }
mangum = "^0.17.0"
+authlib = "^1.2.1"
+itsdangerous = "^2.1.2"
[tool.poetry.group.dev.dependencies]
-mypy = "^1.3.0"
-pytest = "^7.3.1"
-mongomock-motor = "^0.0.19"
+mypy = "^1.4.1"
+pytest = "^7.4.0"
+mongomock-motor = "0.0.20"
deepdiff = "^6.3.0"
python-dotenv = "^1.0.0"
pyyaml = "^6.0"
types-pyyaml = "^6.0.12.10"
+types-python-jose = "^3.3.4.7"
+types-passlib = "^1.7.7.12"
+pyright = "^1.1.316"
+flake8 = "^6.0.0"
+flake8-black = "^0.3.6"
[build-system]
requires = ["poetry-core"]
diff --git a/server/pyrightconfig.json b/server/pyrightconfig.json
new file mode 100644
index 0000000..1d57a30
--- /dev/null
+++ b/server/pyrightconfig.json
@@ -0,0 +1,17 @@
+{
+ "include": [
+ "src",
+ "tests",
+ "scripts",
+ ],
+ "exclude": [
+ "**/node_modules",
+ "**/__pycache__"
+ ],
+ "reportUnusedImport": "warning",
+ "ignore": [
+ "*/deepdiff/*",
+ "**/motor/motor_asyncio.py",
+ "**/mongomock_motor/**/*.py"
+ ]
+}
\ No newline at end of file
diff --git a/server/scripts/db_init_add_api_user.py b/server/scripts/db_init_add_api_user.py
index 0b1b48b..e58116c 100644
--- a/server/scripts/db_init_add_api_user.py
+++ b/server/scripts/db_init_add_api_user.py
@@ -1,11 +1,10 @@
-""" DB Creates a DB user for the API
-Not in use currently because using Mongo Atlas provided user
+""" DB Creates a DB user for the API
+Not in use currently because using Mongo Atlas provided user
using the env vars:
- - MONGO_DATABASE, MONGO_USER, MONGO_PASSWORD,
+ - MONGO_DATABASE, MONGO_USER, MONGO_PASSWORD,
- MONGO_INITDB_ADMIN_URL, MONGO_INITDB_ROOT_USERNAME, MONGO_INITDB_ROOT_PASSWORD
-NB: this is practially a duplicate of the dev DB docker init script in mongo_init_docker-dev
-
+NB: this is practially a duplicate of the dev DB docker init script in mongo_init_docker-dev
"""
import asyncio
import os
diff --git a/server/scripts/db_init_indexes_and_first_user.py b/server/scripts/db_init_indexes_and_first_user.py
index 8573b57..1307d80 100644
--- a/server/scripts/db_init_indexes_and_first_user.py
+++ b/server/scripts/db_init_indexes_and_first_user.py
@@ -1,17 +1,16 @@
-""" Performs initial setup of the database:
-- indexes
+"""Performs initial setup of the database:
+- indexes
- initial SuperAdmin user + org set in env vars:
- PROMPTON_ORG_NAME, PROMPTON_ORG_OPENAI_API_KEY
- PROMPTON_USER_EMAIL, PROMPTON_USER_PASSWORD_HASH
Should be part of a db migrations system when we have more than one migration to run.
-NB: this is practically a duplicate of the dev DB docker init scripts in mongo_init_docker-dev
-
+NB: this is practically a duplicate of the dev DB docker init scripts in mongo_init_docker-dev
"""
import asyncio
import os
from bson import ObjectId
-from pymongo import ASCENDING
+from pymongo import ASCENDING, DESCENDING
from datetime import datetime
from dotenv import load_dotenv
@@ -30,16 +29,25 @@ async def run():
print("Creating indexes")
await db.users.create_index([("email", ASCENDING)], unique=True)
+ await db.orgs.create_index([("oauth_domain", ASCENDING)])
+
await db.users.create_index([("created_by_org_id", ASCENDING)])
await db.orgs.create_index([("created_by_org_id", ASCENDING)])
await db.prompts.create_index([("created_by_org_id", ASCENDING)])
await db.promptVersions.create_index([("created_by_org_id", ASCENDING)])
await db.inferences.create_index([("created_by_org_id", ASCENDING)])
+ await db.feedbacks.create_index([("created_by_org_id", ASCENDING)])
await db.promptVersions.create_index([("prompt_id", ASCENDING)])
- await db.inferences.create_index([("prompt_id", ASCENDING)])
+ await db.inferences.create_index([("prompt_id", ASCENDING)])
await db.inferences.create_index([("prompt_version_id", ASCENDING)])
+ await db.inferences.create_index([("end_user_id", ASCENDING)])
+ await db.inferences.create_index([("client_ref_id", ASCENDING)])
+
+ await db.feedbacks.create_index([("inference_id", DESCENDING)])
+ await db.feedbacks.create_index([("prompt_version_id", DESCENDING)])
+ await db.feedbacks.create_index([("created_by_user_id", ASCENDING)])
print("Adding inital user: ", os.getenv("PROMPTON_USER_EMAIL"))
org = {
diff --git a/server/src/asgi.py b/server/src/asgi.py
index abbad18..c91b809 100644
--- a/server/src/asgi.py
+++ b/server/src/asgi.py
@@ -8,8 +8,8 @@
from src.core import database
-# from src.routers import all_routers, use_route_names_as_operation_ids
import src.routers as routers
+from src.endpoints.google_oauth import app as app_google_oauth
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
@@ -23,6 +23,8 @@
docs_url=None,
)
+app.mount("/oauth", app_google_oauth)
+
app.include_router(routers.all_routers)
routers.use_route_names_as_operation_ids(app) # for generated API clients
@@ -44,7 +46,6 @@ async def shutdown():
await database.disconnect_db()
-@app.head("/") # allow head for quick health check
@app.head("/") # allow head for quick health check
@app.get("/", include_in_schema=False)
async def swagger_docs():
diff --git a/server/src/core/__init__.py b/server/src/core/__init__.py
index 8b13789..e69de29 100644
--- a/server/src/core/__init__.py
+++ b/server/src/core/__init__.py
@@ -1 +0,0 @@
-
diff --git a/server/src/core/auth.py b/server/src/core/auth.py
index 814eefd..08462bb 100644
--- a/server/src/core/auth.py
+++ b/server/src/core/auth.py
@@ -46,7 +46,9 @@ def create_access_token(data: dict, expires_delta_minutes: timedelta | None = No
to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(
- to_encode, settings.JWT_SECRET_KEY, algorithm=settings.JWT_ALGORITHM
+ to_encode,
+ settings.JWT_SECRET_KEY.get_secret_value(),
+ algorithm=settings.JWT_ALGORITHM,
)
return encoded_jwt
@@ -58,7 +60,9 @@ async def get_current_user(
"""returns user associated with token. raises if token is invalid or expired"""
try:
payload = jwt.decode(
- token, settings.JWT_SECRET_KEY, algorithms=[settings.JWT_ALGORITHM]
+ token,
+ settings.JWT_SECRET_KEY.get_secret_value(),
+ algorithms=[settings.JWT_ALGORITHM],
)
email: str | None = payload.get("sub")
diff --git a/server/src/core/completition.py b/server/src/core/completition.py
index fda8e60..8a12bc4 100644
--- a/server/src/core/completition.py
+++ b/server/src/core/completition.py
@@ -2,18 +2,15 @@
import time
import openai
-from src.core.database import get_db
-from src.crud.promptVersion import promptVersion_crud
-from src.core.utils import str_to_ObjectId
from src.schemas.openAI import (
ChatGPTChatCompletitionRequest,
ChatGPTChatCompletitionResponse,
)
from src.schemas.inference import (
+ InferenceError,
InferenceResponseData,
InferenceResponseError,
)
-from src.schemas.promptVersion import PromptVersionStatus
from src.core.settings import settings
@@ -25,7 +22,10 @@
"usage": {"prompt_tokens": 25, "completion_tokens": 1, "total_tokens": 26},
"choices": [
{
- "message": {"role": "assistant", "content": "71"},
+ "message": {
+ "role": "assistant",
+ "content": "This is a mocked response - called with 'mock_me_softly'",
+ },
"finish_reason": "stop",
"index": 0,
}
@@ -83,19 +83,15 @@ async def get_openai_chat_completition(
response = InferenceResponseData(
token_usage=raw_response.usage,
- first_message=raw_response.choices[0].message,
raw_response=raw_response,
)
except Exception as e:
full_classname = f"{e.__class__.__module__}.{e.__class__.__name__}"
response = InferenceResponseError(
- error={
- "error_class": full_classname,
- "error": vars(e)["error"] if "error" in vars(e) else None,
- "message": str(e),
- "details": {**vars(e)},
- },
+ error=InferenceError(
+ error_class=full_classname, message=str(e), details={**vars(e)}
+ )
)
finally:
end_time = time.perf_counter()
diff --git a/server/src/core/database.py b/server/src/core/database.py
index 8dfcfd7..29c275c 100644
--- a/server/src/core/database.py
+++ b/server/src/core/database.py
@@ -40,7 +40,7 @@ async def connect_db():
if db_client is not None:
raise Exception("Database client is already initialized")
- db_client = AsyncIOMotorClient(settings.DATABASE_URL)
+ db_client = AsyncIOMotorClient(settings.DATABASE_URL.get_secret_value())
db = db_client[settings.MONGO_DATABASE]
diff --git a/server/src/core/settings.py b/server/src/core/settings.py
index 12d3894..296b3a0 100644
--- a/server/src/core/settings.py
+++ b/server/src/core/settings.py
@@ -1,16 +1,20 @@
-from pydantic import BaseSettings
+from pydantic import BaseSettings, SecretStr
class Settings(BaseSettings):
- DATABASE_URL: str
+ DATABASE_URL: SecretStr
MONGO_DATABASE: str
DEFAULT_OPENAI_REQUEST_TIMEOUT_SECONDS: float = 90
- JWT_ACCESS_TOKEN_EXPIRE_MINUTES: int = 15
- JWT_SECRET_KEY: str
+ JWT_ACCESS_TOKEN_EXPIRE_MINUTES: int = 60
+ JWT_SECRET_KEY: SecretStr
JWT_ALGORITHM: str = "HS256"
+ GOOGLE_CLIENT_ID: SecretStr | None = None
+ GOOGLE_CLIENT_SECRET: SecretStr | None = None
+ STARLETTE_SESSION_SECRET: SecretStr | None = None
+
GITHUB_ENV: str | None
GITHUB_SHA: str | None
diff --git a/server/src/core/templateProcessing.py b/server/src/core/templateProcessing.py
index 0fd8bfb..4eb75ca 100644
--- a/server/src/core/templateProcessing.py
+++ b/server/src/core/templateProcessing.py
@@ -28,7 +28,7 @@ def get_arg_identifiers(template: ChatGPTMessageTemplate):
def get_populated_template(template: ChatGPTMessageTemplate, args: dict[str, str]):
res: ChatGPTMessageTemplate = []
- if template is not None and args is not None:
+ if template is not None and args is not None and len(args) > 0:
for msg in template:
res.append(
ChatGPTMessage(
@@ -40,7 +40,7 @@ def get_populated_template(template: ChatGPTMessageTemplate, args: dict[str, str
} # type: ignore[arg-type]
)
)
- if args is None:
+ else:
res = copy.deepcopy(template)
return res
diff --git a/server/src/core/user.py b/server/src/core/user.py
index 875d786..c746149 100644
--- a/server/src/core/user.py
+++ b/server/src/core/user.py
@@ -15,6 +15,21 @@ async def get_current_active_user(
return current_user
+async def get_current_prompt_admin_user(
+ current_user: Annotated[UserInDB, Depends(auth.get_current_user)]
+):
+ if current_user.role not in [
+ UserRoles.ORG_ADMIN,
+ UserRoles.SUPER_ADMIN,
+ UserRoles.PROMPT_ADMIN,
+ ]:
+ raise PermissionValidationError(
+ "Method Requires `PromptAdmin`, `OrgAdmin` or `SuperAdmin` role"
+ )
+
+ return current_user
+
+
async def get_current_org_admin_user(
current_user: Annotated[UserInDB, Depends(get_current_active_user)]
):
diff --git a/server/src/crud/base.py b/server/src/crud/base.py
index 377caf6..d1265b4 100644
--- a/server/src/crud/base.py
+++ b/server/src/crud/base.py
@@ -11,11 +11,11 @@
ItemNotFoundException,
NoItemUpdatedException,
)
-from src.schemas.base import MongoBase
+from src.schemas.base import MongoBaseCreate
from src.schemas.user import UserInDB, UserRoles
-DBModelType = TypeVar("DBModelType", bound=MongoBase)
+DBModelType = TypeVar("DBModelType", bound=MongoBaseCreate)
CreateSchemaType = TypeVar("CreateSchemaType", bound=BaseModel)
UpdateSchemaType = TypeVar("UpdateSchemaType", bound=BaseModel)
UpdateResponseSchemaType = TypeVar("UpdateResponseSchemaType", bound=BaseModel)
@@ -45,7 +45,11 @@ def __init__(
self.org_id_check_field_name = org_id_check_field_name
async def get_raw(
- self, db, id: str | ObjectId, current_user: UserInDB | None = None
+ self,
+ db,
+ id: str | ObjectId,
+ current_user: UserInDB | None = None,
+ projection: Dict[str, Any] | None = None,
) -> dict[str, Any]:
"""Returns a one item by id as a dict from the database"""
@@ -54,7 +58,9 @@ async def get_raw(
)
if (
- item := await db[self.collection].find_one(filter_with_permissions)
+ item := await db[self.collection].find_one(
+ filter_with_permissions, projection=projection
+ )
) is None:
raise ItemNotFoundException(id, self.collection)
@@ -88,16 +94,19 @@ async def get_multi_raw(
current_user: UserInDB | None = None,
*,
filter: Dict[str, Any] | None = None,
+ projection: Dict[str, Any] | None = None,
skip: int = 0,
limit: int = 1000,
+ sort: List[tuple[str, int]] | tuple[str, int] | None = ("_id", -1),
) -> List[dict[str, Any]]:
filter_with_permissions = self._add_org_id_filter(current_user, filter)
items = (
await db[self.collection]
- .find(filter_with_permissions)
+ .find(filter_with_permissions, projection=projection)
.skip(skip)
.limit(limit)
+ .sort(*sort)
.to_list(limit)
)
@@ -111,10 +120,10 @@ async def get_multi(
filter: Dict[str, Any] | None = None,
skip: int = 0,
limit: int = 1000,
+ sort: List[tuple[str, int]] | tuple[str, int] | None = ("_id", -1),
) -> List[DBModelType]:
- # items_raw = await self.get_multi_raw(db, current_user, filter, skip, limit, )
items_raw = await self.get_multi_raw(
- db, current_user, filter=filter, skip=skip, limit=limit
+ db, current_user, filter=filter, skip=skip, limit=limit, sort=sort
)
items = [self.db_schema.parse_obj(item) for item in items_raw]
diff --git a/server/src/crud/feedback.py b/server/src/crud/feedback.py
new file mode 100644
index 0000000..0a97b15
--- /dev/null
+++ b/server/src/crud/feedback.py
@@ -0,0 +1,36 @@
+from pymongo.results import InsertOneResult
+
+from src.crud.base import CrudBase
+from src.crud.inference import inference_crud
+from src.schemas.feedback import FeedbackInDB, FeedbackCreate, FeedbackUpdate
+from src.schemas.user import UserInDB
+
+
+class FeedbackCRUD(CrudBase[FeedbackInDB, FeedbackCreate, FeedbackUpdate]):
+ async def create(
+ self, db, obj_in: FeedbackCreate, current_user: UserInDB
+ ) -> InsertOneResult:
+ inf = await inference_crud.get_raw(
+ db,
+ obj_in.inference_id,
+ current_user=current_user,
+ projection={"prompt_version_id": 1},
+ )
+
+ prompt_version_id = inf["prompt_version_id"]
+
+ fb_in_raw = obj_in.dict(by_alias=True, exclude_unset=True)
+ fb_in_db = self.db_schema(**fb_in_raw, prompt_version_id=prompt_version_id)
+
+ fb_in_db_raw = fb_in_db.dict(by_alias=True, exclude_unset=False)
+
+ insert_res = await super().create_from_raw(db, fb_in_db_raw, current_user)
+
+ return insert_res
+
+
+feedback_crud = FeedbackCRUD(
+ db_schema=FeedbackInDB,
+ collection="feedbacks",
+ org_id_check_field_name="created_by_org_id",
+)
diff --git a/server/src/crud/inference.py b/server/src/crud/inference.py
index 798790f..f73bcf6 100644
--- a/server/src/crud/inference.py
+++ b/server/src/crud/inference.py
@@ -1,4 +1,4 @@
-from bson import ObjectId
+import random
from pymongo.results import InsertOneResult
@@ -6,11 +6,17 @@
from src.core.templateProcessing import get_populated_template
from src.crud.promptVersion import promptVersion_crud
-from src.endpoints.endpoint_exceptions import EndPointValidationError
+from src.endpoints.endpoint_exceptions import (
+ EndPointValidationError,
+ ItemNotFoundException,
+)
+from src.schemas.base import PyObjectId
from src.schemas.inference import (
InferenceInDB,
- InferenceCreate,
+ InferenceCreateByPromptVersionId,
+ InferenceCreateByPromptId,
InferenceRequestData,
+ InferenceResponseStatus,
InferenceUpdate,
)
from src.schemas.openAI import ChatGPTChatCompletitionRequest
@@ -18,9 +24,14 @@
from src.schemas.user import UserInDB
-class InferenceCRUD(CrudBase[InferenceInDB, InferenceCreate, InferenceUpdate]):
+class InferenceCRUD(
+ CrudBase[InferenceInDB, InferenceCreateByPromptVersionId, InferenceUpdate]
+):
async def create(
- self, db, obj_in: InferenceCreate, current_user: UserInDB
+ self,
+ db,
+ obj_in: InferenceCreateByPromptVersionId | InferenceCreateByPromptId,
+ current_user: UserInDB,
) -> InsertOneResult:
update_data_obj = await self.process_create_data(
db, current_user=current_user, obj_in=obj_in
@@ -31,13 +42,52 @@ async def create(
return update_res
async def process_create_data(
- self, db, *, current_user: UserInDB, obj_in: InferenceCreate
+ self,
+ db,
+ *,
+ current_user: UserInDB,
+ obj_in: InferenceCreateByPromptVersionId | InferenceCreateByPromptId,
) -> InferenceInDB:
- promptVersion = await promptVersion_crud.get(
- db, obj_in.prompt_version_id, current_user=current_user
+ selected_prompt_version_id: PyObjectId | None = None
+ prompt_version_ids_considered = []
+
+ if isinstance(obj_in, InferenceCreateByPromptVersionId):
+ selected_prompt_version_id = obj_in.prompt_version_id
+
+ else:
+ # Random pick from LIVE prompt versions with the given prompt_id
+ prompt_versions_results = await promptVersion_crud.get_multi_raw(
+ db,
+ current_user,
+ filter={
+ "prompt_id": obj_in.prompt_id,
+ "status": PromptVersionStatus.LIVE.value,
+ },
+ projection={"_id": 1},
+ )
+
+ if prompt_versions_results == []:
+ raise ItemNotFoundException(
+ f"No { PromptVersionStatus.LIVE.value} promptVersions found for prompt_id: {obj_in.prompt_id}"
+ )
+
+ prompt_version_ids_considered = [d["_id"] for d in prompt_versions_results]
+
+ random_index = random.randint(0, len(prompt_version_ids_considered) - 1)
+ selected_prompt_version_id = prompt_version_ids_considered[random_index]
+
+ prompt_version_ids_considered.pop(random_index)
+
+ if selected_prompt_version_id is None:
+ raise Exception(
+ f"Received None _id from promptVersions query for prompt_id: {obj_in.prompt_id} "
+ )
+
+ prompt_version = await promptVersion_crud.get(
+ db, selected_prompt_version_id, current_user=current_user
) # raises ItemNotFound HTTP if not found or not permitted
- if promptVersion.status == PromptVersionStatus.DRAFT:
+ if prompt_version.status == PromptVersionStatus.DRAFT:
raise EndPointValidationError(
"Inference on promptVersion in Draft `status` is not allowed. Change the status of promptVersion to Testing or Live first"
)
@@ -45,31 +95,34 @@ async def process_create_data(
template_pop = None
if obj_in.template_args is None:
- template_pop = promptVersion.template
+ template_pop = prompt_version.template
else:
template_pop = get_populated_template(
- promptVersion.template, obj_in.template_args
+ prompt_version.template, obj_in.template_args
)
raw_request = ChatGPTChatCompletitionRequest.parse_obj(
{
- **promptVersion.model_config.dict(),
+ **prompt_version.model_config.dict(),
"messages": template_pop,
"user": obj_in.end_user_id,
}
)
inference_request_data = InferenceRequestData(
- provider=promptVersion.provider,
+ provider=prompt_version.provider,
raw_request=raw_request,
)
inferenceDB = InferenceInDB(
- prompt_id=promptVersion.prompt_id,
- prompt_version_id=obj_in.prompt_version_id,
- prompt_version_name=promptVersion.name,
+ status=InferenceResponseStatus.REQUEST_RECEIVED,
+ prompt_id=prompt_version.prompt_id,
+ prompt_version_id=selected_prompt_version_id,
+ prompt_version_name=prompt_version.name,
+ prompt_version_ids_considered=prompt_version_ids_considered,
end_user_id=obj_in.end_user_id,
source=obj_in.source,
+ client_ref_id=obj_in.client_ref_id,
template_args=obj_in.template_args,
metadata=obj_in.metadata,
request=inference_request_data,
diff --git a/server/src/crud/user.py b/server/src/crud/user.py
index bb3d824..dc3b85d 100644
--- a/server/src/crud/user.py
+++ b/server/src/crud/user.py
@@ -2,11 +2,22 @@
from src.core.database import Db
from src.crud.base import CrudBase
-from src.schemas.user import UserInDB, UserCreate, UserUpdate, Token
+from src.schemas.base import NonEmptyStrField, PyObjectId
+from src.schemas.user import (
+ UserInDB,
+ UserCreate,
+ UserRoles,
+ UserUpdate,
+ Token,
+ OauthUserInfo,
+)
import src.core.auth as auth
from src.crud.org import org_crud
-from src.endpoints.endpoint_exceptions import InvalidUserNameOrPassword
+from src.endpoints.endpoint_exceptions import (
+ InvalidUserNameOrPassword,
+ NoOrgMatchForOAuthUserDomain,
+)
class UserCRUD(CrudBase[UserInDB, UserCreate, UserUpdate]):
@@ -30,6 +41,42 @@ async def authenticate_user(self, db: Db, email: str, password: str):
return False
return user
+ async def get_token_after_oauth(self, db, userInfo: OauthUserInfo) -> Token:
+ """Assuming user already authenticated with google and we have his email
+ Returns token if useremail already exists
+ If user doesn't exists it creates the email domain part is matching an orgs.google_auth_domain
+ """
+ domain = userInfo.email.split("@")[1]
+
+ user = await self.find_one(db, {"email": userInfo.email})
+ if not user:
+ org = await org_crud.find_one(db, {"oauth_domain": domain})
+ if not org:
+ raise NoOrgMatchForOAuthUserDomain(oAuthDomain=domain)
+
+ full_name = NonEmptyStrField(
+ userInfo.name if userInfo.name else userInfo.email.split("@")[0]
+ )
+
+ user = UserInDB(
+ email=userInfo.email,
+ org_id=org.id,
+ created_by_user_id=PyObjectId("111111111111111111111111"),
+ created_by_org_id=org.id,
+ full_name=full_name,
+ hashed_password="google oauth",
+ disabled=False,
+ role=UserRoles.BASIC, # TODO: user feedbackonly role as default
+ )
+
+ user_in_db_raw = user.dict(by_alias=True, exclude_unset=False)
+
+ _ = await db[self.collection].insert_one(user_in_db_raw)
+
+ access_token = auth.create_access_token(data={"sub": userInfo.email})
+
+ return Token(access_token=access_token, token_type="bearer")
+
async def create(
self, db, obj_in: UserCreate, current_user: UserInDB
) -> InsertOneResult:
diff --git a/server/src/endpoints/ApiResponses.py b/server/src/endpoints/ApiResponses.py
index 3e41dc7..6a93e0f 100644
--- a/server/src/endpoints/ApiResponses.py
+++ b/server/src/endpoints/ApiResponses.py
@@ -50,6 +50,10 @@ class ReqResponses:
status.HTTP_401_UNAUTHORIZED: {"description": "Incorrect username or password"}
}
+ EMAIL_ALREADY_EXISTS: rtype = {
+ status.HTTP_409_CONFLICT: {"description": "Email already exists"}
+ }
+
PATCH_RESPONSES: rtype = {
**INVALID_ITEM_ID,
**PATH_UPDATED,
diff --git a/server/src/endpoints/endpoint_exceptions.py b/server/src/endpoints/endpoint_exceptions.py
index bd1d65f..f95ec49 100644
--- a/server/src/endpoints/endpoint_exceptions.py
+++ b/server/src/endpoints/endpoint_exceptions.py
@@ -1,11 +1,18 @@
from fastapi import HTTPException, status
+from src.schemas.inference import InferenceResponseError
+
class ItemNotFoundException(HTTPException):
- def __init__(self, id, collection_name: str | None = None):
+ def __init__(
+ self, id, collection_name: str | None = None, message: str | None = None
+ ):
self.id = id
self.collection_name = collection_name
- self.message = f"Item id {id} not found or current user has no permission to access it. (collection: {collection_name})"
+ self.message = (
+ message
+ or f"Item id {id} not found or current user has no permission to access it. (collection: {collection_name})"
+ )
super().__init__(status_code=status.HTTP_404_NOT_FOUND, detail=self.message)
@@ -23,7 +30,7 @@ def __init__(self, featureName=None):
if featureName:
self.message = f"{featureName} not implemented"
else:
- self.message = f"Feature not implemented"
+ self.message = "Feature not implemented"
super().__init__(
status_code=status.HTTP_405_METHOD_NOT_ALLOWED, detail=self.message
)
@@ -49,6 +56,28 @@ def __init__(self, message=None):
)
+class OAuthSignInFailed(HTTPException):
+ def __init__(self, message=None):
+ self.message = f"OAuth sign in failed: {message}"
+ self.headers = {"WWW-Authenticate": "Bearer"}
+ super().__init__(
+ status_code=status.HTTP_401_UNAUTHORIZED,
+ detail=self.message,
+ headers=self.headers,
+ )
+
+
+class NoOrgMatchForOAuthUserDomain(HTTPException):
+ def __init__(self, oAuthDomain: str, message=None):
+ self.message = f"No organization match for `{oAuthDomain}` domain. Make sure you are signing it with your organisation's account and single sign on is configured in PromptOn for your org (`org.oauth_domain`)."
+ self.headers = {"WWW-Authenticate": "Bearer"}
+ super().__init__(
+ status_code=status.HTTP_401_UNAUTHORIZED,
+ detail=self.message,
+ headers=self.headers,
+ )
+
+
class PermissionValidationError(HTTPException):
def __init__(self, message=None):
"""HTTP 403 Forbidden - use this exception when operation is not permitted with current user's permissions."""
@@ -57,7 +86,13 @@ def __init__(self, message=None):
class OpenAIError(HTTPException):
- def __init__(self, message=None, inference_id=None, error=None):
+ def __init__(
+ self,
+ message=None,
+ inference_id=None,
+ *,
+ inferenceResponse: InferenceResponseError,
+ ):
"""Raises HTTP 502 Bad Gateway - use this exception when OpenAI API call returns with error."""
self.message = message
super().__init__(
@@ -65,9 +100,9 @@ def __init__(self, message=None, inference_id=None, error=None):
detail={
"inference_id": str(inference_id),
"message": self.message,
- "openAI_error_class": error.get("error_class") if error else None,
- "openAI_message": error.get("message") if error else None,
- "openAI_error": error.get("error") if error else None,
+ "openAI_error_class": inferenceResponse.error.error_class,
+ "openAI_message": inferenceResponse.error.message,
+ "openAI_error": inferenceResponse.error.details,
},
)
@@ -106,13 +141,11 @@ class EmailAlreadyExistsError(HTTPException):
def __init__(self, email=None):
self.message = f"Email `{email}` already exists"
- super().__init__(
- status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, detail=self.message
- )
+ super().__init__(status_code=status.HTTP_409_CONFLICT, detail=self.message)
class CredentialExpiredError(HTTPException):
def __init__(self):
- self.message = f"Authorization token has expired. Re-authorize and try again"
+ self.message = "Authorization token has expired. Re-authorize and try again"
super().__init__(status_code=status.HTTP_401_UNAUTHORIZED, detail=self.message)
diff --git a/server/src/endpoints/feedbacks.py b/server/src/endpoints/feedbacks.py
new file mode 100644
index 0000000..13604e4
--- /dev/null
+++ b/server/src/endpoints/feedbacks.py
@@ -0,0 +1,90 @@
+from typing import Annotated, List, Optional
+from fastapi import APIRouter, Depends, status
+
+from src.core.user import get_current_active_user
+from src.core.database import get_db
+from src.core.utils import str_to_ObjectId
+from src.endpoints.ApiResponses import ReqResponses
+
+from src.schemas.base import DefaultPostResponse
+from src.schemas.feedback import FeedbackRead, FeedbackCreate
+from src.crud.feedback import feedback_crud
+from src.schemas.user import UserInDB
+
+
+router = APIRouter()
+
+
+@router.get(
+ "/feedbacks",
+ tags=["feedbacks"],
+ responses={**ReqResponses.GET_RESPONSES},
+ response_model=List[FeedbackRead],
+)
+async def get_feedbacks_list(
+ current_user: Annotated[UserInDB, Depends(get_current_active_user)],
+ db=Depends(get_db),
+ prompt_version_id: Optional[str] = None,
+ prompton_user_id: Optional[str] = None,
+ inference_id: Optional[str] = None,
+):
+ filter = {}
+
+ # str_to_ObjectId raises if id malformed
+ if prompt_version_id:
+ filter["prompt_version_id"] = str_to_ObjectId(prompt_version_id)
+
+ if prompton_user_id:
+ filter["created_by_user_id"] = str_to_ObjectId(prompton_user_id)
+
+ if inference_id:
+ filter["inference_id"] = str_to_ObjectId(inference_id)
+
+ res = await feedback_crud.get_multi(db, current_user=current_user, filter=filter)
+
+ return res
+
+
+@router.get(
+ "/feedbacks/{id}",
+ tags=["feedbacks"],
+ response_model=FeedbackRead,
+ responses={**ReqResponses.GET_RESPONSES},
+)
+async def get_feedback_by_id(
+ id: str,
+ current_user: Annotated[UserInDB, Depends(get_current_active_user)],
+ db=Depends(get_db),
+):
+ return await feedback_crud.get(db, id, current_user)
+
+
+@router.post(
+ "/feedbacks",
+ tags=["feedbacks"],
+ status_code=status.HTTP_201_CREATED,
+ responses={**ReqResponses.POST_RESPONSES},
+)
+async def add_feedback(
+ feedback: FeedbackCreate,
+ current_user: Annotated[UserInDB, Depends(get_current_active_user)],
+ db=Depends(get_db),
+) -> DefaultPostResponse:
+ """Feedback about an inference from an end user or from a PromptOn user.
+
+ At least one of `score`, `flag` or `note` required
+
+ `end_user_id` is null if from PromptOn user.
+
+ `score` can be null if flagging or note only. Scoring method are for API consumer consideration. Eg. end users can thumbs down/up mapped to -1 +1 `score`, internal users rate between from 0 to 100.
+
+ `flag` is any string when inference was flagged. Can be null if it is scoring or note only
+
+ `feedback_for_part` is optional and can be used when the inference has multiple sections which require separate feedback.
+
+ `metadata` is any dict for additional information.
+ """
+
+ insert_res = await feedback_crud.create(db, feedback, current_user)
+
+ return DefaultPostResponse(id=str(insert_res.inserted_id))
diff --git a/server/src/endpoints/google_oauth.py b/server/src/endpoints/google_oauth.py
new file mode 100644
index 0000000..8c0ff3b
--- /dev/null
+++ b/server/src/endpoints/google_oauth.py
@@ -0,0 +1,149 @@
+import json
+import logging
+from fastapi import Depends, FastAPI, Request
+from urllib.parse import urlencode, parse_qs
+
+from src.core.settings import settings
+
+from authlib.integrations.starlette_client import OAuth
+from starlette.config import Config
+from starlette.responses import RedirectResponse, HTMLResponse
+from starlette.middleware.sessions import SessionMiddleware
+from starlette.datastructures import URL
+
+from src.core.database import get_db
+from src.crud.user import user_crud
+from src.endpoints.endpoint_exceptions import OAuthSignInFailed
+
+
+app = FastAPI(
+ title="prompton-api-google-oauth",
+ description="PromptOn Google Ouath2 endpoints",
+ version="0.0.1",
+ docs_url="/",
+)
+
+
+starlette_session_secret = (
+ settings.STARLETTE_SESSION_SECRET.get_secret_value()
+ if settings.STARLETTE_SESSION_SECRET
+ else None
+)
+app.add_middleware(SessionMiddleware, secret_key=starlette_session_secret)
+
+
+if settings.GOOGLE_CLIENT_SECRET and settings.GOOGLE_CLIENT_ID:
+ starlette_config = Config(
+ environ={
+ "GOOGLE_CLIENT_ID": settings.GOOGLE_CLIENT_ID.get_secret_value(),
+ "GOOGLE_CLIENT_SECRET": settings.GOOGLE_CLIENT_SECRET.get_secret_value(),
+ }
+ )
+
+ oauth = OAuth(starlette_config)
+ oauth.register(
+ name="google",
+ server_metadata_url="https://accounts.google.com/.well-known/openid-configuration",
+ client_kwargs={"scope": "openid email profile"},
+ )
+
+else:
+ logging.warning(
+ "No Google OAuth2 credentials found. Google OAuth2 will not work. set GOOGLE_CLIENT_SECRET and GOOGLE_CLIENT_ID env variables."
+ )
+
+
+@app.get("/login")
+async def login(request: Request):
+ if not oauth.google:
+ raise Exception(
+ "Google OAuth2 is not setup. Check GOOGLE_CLIENT_SECRET and GOOGLE_CLIENT_ID env variables."
+ )
+
+ callback_url = request.url_for("callback")
+
+ # workaround to recover protocol for callback when called via https without a reverse proxy
+ prompton_env = request.query_params.get("prompton_env")
+ if prompton_env is None:
+ redirect_url = (
+ f"{request.scope['scheme']}://{callback_url.netloc}{callback_url.path}"
+ )
+ else:
+ prompton_env_url = URL(prompton_env)
+ redirect_url = (
+ f"{prompton_env_url.scheme}://{callback_url.netloc}{callback_url.path}"
+ )
+
+ request.session["original_query_params"] = urlencode(
+ request.query_params.multi_items(), doseq=True
+ )
+
+ return await oauth.google.authorize_redirect(request, redirect_url)
+
+
+@app.get("/callback")
+async def callback(request: Request, db=Depends(get_db)):
+ if not oauth.google:
+ raise OAuthSignInFailed(
+ "Google OAuth2 is not setup. Check GOOGLE_CLIENT_SECRET and GOOGLE_CLIENT_ID env variables."
+ )
+
+ token = await oauth.google.authorize_access_token(request)
+ user = token.get("userinfo")
+ if user:
+ if not user.get("email_verified"):
+ raise OAuthSignInFailed("Google Email is not verified.")
+
+ request.session["user_email"] = user.get("email")
+ request.session["user"] = user
+
+ original_query_params = parse_qs(
+ request.session.get("original_query_params", None)
+ )
+
+ if "logged_in_redirect_uri" in original_query_params:
+ logged_in_redirect_uri = original_query_params.get(
+ "logged_in_redirect_uri", ["/oauth/logged_in"]
+ )[0]
+ del original_query_params["logged_in_redirect_uri"]
+ else:
+ logged_in_redirect_uri = "/oauth/logged_in"
+
+ headers = {}
+
+ token = await user_crud.get_token_after_oauth(db, user)
+
+ if token.access_token and user.get("email"):
+ headers = {"X-Access-Token": token.access_token, "X-User-Email": user.email}
+ request.session["access_token"] = token.access_token
+ # TODO: access_token in query param is a workaround until we figure how to read session cookie with streamlit
+ original_query_params["access_token"] = [token.access_token]
+ query_params_str = urlencode(original_query_params, doseq=True)
+
+ return RedirectResponse(
+ f"{logged_in_redirect_uri}?{query_params_str}", headers=headers
+ )
+ raise OAuthSignInFailed("Failed to fetch user info from Google.")
+
+
+@app.get("/logout")
+async def logout(request):
+ request.session.pop("user", None)
+ return RedirectResponse(url="/test")
+
+
+@app.get("/logged_in")
+async def logged_in(request: Request):
+ """FIXME: this is a debug page, remove it in production"""
+ access_token = request.session.get("access_token")
+ user_email = request.session.get("user_email")
+ user = request.session.get("user")
+
+ user = json.dumps(user, indent=4).replace("\n", "
")
+ html = f"""user_email: {user_email}
+ logout
+ login
+ token: {access_token}>
+ user: {user} """
+
+ return HTMLResponse(html)
diff --git a/server/src/endpoints/inferences.py b/server/src/endpoints/inferences.py
index 7329cee..21c20fd 100644
--- a/server/src/endpoints/inferences.py
+++ b/server/src/endpoints/inferences.py
@@ -17,7 +17,8 @@
)
from src.schemas.inference import (
- InferenceCreate,
+ InferenceCreateByPromptId,
+ InferenceCreateByPromptVersionId,
InferencePostResponse,
InferenceRead,
InferenceResponseError,
@@ -95,11 +96,38 @@ async def get_inference_by_id(
)
async def new_inference(
request: Request,
- inferenceRequest: InferenceCreate,
+ inferenceRequest: InferenceCreateByPromptVersionId | InferenceCreateByPromptId,
current_user: Annotated[UserInDB, Depends(get_current_active_user)],
db=Depends(get_db),
) -> InferencePostResponse:
- # NB: The processing doesn't stop if client disconnects See: https://github.com/tiangolo/fastapi/discussions/8805
+ """The core of the functionality:
+ 1. Populating the template from prompt version with the passed values
+ 2. Logging the request
+ 3. Sending request to provider
+ 4. Logging response
+ 4. Returning response with `inference_id`
+
+ You can specify which prompt version you want to use in two ways by setting on of:
+
+ - `prompt_version_id` - uses the specified prompt version
+ - `prompt_id` - uses the `Live` status prompt version assigned to the given `prompt_id`. This allows to release new prompt versions using Prompton API if you only reference `prompt_id` in your client code.
+
+ If there are multiple prompt versions in `Live` status for the prompt_id then it picks one randomly. It's useful for split testing.
+ This method will return an error if there is no `Live` status message.
+
+ It also handles errors, timeouts and sets the inference status accordingly. It will still process response if client disconnects before it arrives.
+
+ _Note: raw request data is also logged, GET `inferences/{id}` reponse includes it as well._
+
+ You can use a few easter eggs to test it without a valid api key:
+
+ - `"end_user_id": "mock_me_softly"`
+ - `"end_user_id": "timeout_me_softly"`
+ - `"end_user_id": "fail_me_softly"`
+
+ """
+
+ # TODO: refactor response schema - it's a pain to get id in client code from OPENAI_ERROR | OPENAI_TIMEOUT
try:
user_org = await org_crud.get(db, current_user.org_id, current_user)
@@ -135,7 +163,7 @@ async def new_inference(
if isinstance(inferenceResponse, InferenceResponseError):
inferenceResponse.isError = True
- if inferenceResponse.error.get("error_class") == "openai.error.Timeout":
+ if inferenceResponse.error.error_class == "openai.error.Timeout":
status = InferenceResponseStatus.COMPLETITION_TIMEOUT
else:
status = InferenceResponseStatus.COMPLETITION_ERROR
@@ -155,13 +183,13 @@ async def new_inference(
if status == InferenceResponseStatus.COMPLETITION_TIMEOUT:
raise OpenAIError(
inference_id=inferenceDB.id,
- error=inferenceResponse.error,
+ inferenceResponse=inferenceResponse,
message="OpenAI API Timeout Error",
)
else: # status == InferenceResponseStatus.COMPLETITION_ERROR
raise OpenAIError(
inference_id=inferenceDB.id,
- error=inferenceResponse.error,
+ inferenceResponse=inferenceResponse,
message="OpenAI API Error",
)
diff --git a/server/src/endpoints/orgs.py b/server/src/endpoints/orgs.py
index 43a3b7f..8814134 100644
--- a/server/src/endpoints/orgs.py
+++ b/server/src/endpoints/orgs.py
@@ -3,6 +3,7 @@
from src.core.database import get_db
from src.endpoints.endpoint_exceptions import PermissionValidationError
+from src.schemas.base import DefaultPostResponse
from src.schemas.user import UserInDB, UserRoles
from src.core.user import (
get_current_active_user,
@@ -17,7 +18,7 @@
@router.get("/orgs", tags=["orgs"], response_model=List[OrgRead])
-async def get_org_list(
+async def get_orgs_list(
current_user: Annotated[UserInDB, Depends(get_current_super_user)],
db=Depends(get_db),
):
@@ -62,10 +63,10 @@ async def add_org(
org: OrgCreate,
current_user: Annotated[UserInDB, Depends(get_current_super_user)],
db=Depends(get_db),
-):
+) -> DefaultPostResponse:
insert_res = await org_crud.create(db, current_user=current_user, obj_in=org)
- return {"id": str(insert_res.inserted_id)}
+ return DefaultPostResponse(id=str(insert_res.inserted_id))
@router.patch(
diff --git a/server/src/endpoints/promptVersions.py b/server/src/endpoints/promptVersions.py
index 0ed731c..700311d 100644
--- a/server/src/endpoints/promptVersions.py
+++ b/server/src/endpoints/promptVersions.py
@@ -1,10 +1,10 @@
from typing import List, Annotated
from fastapi import APIRouter, Depends, status
-
from src.core.database import get_db
+from src.schemas.base import DefaultPostResponse
from src.schemas.user import UserInDB
-from src.core.user import get_current_active_user
+from src.core.user import get_current_active_user, get_current_prompt_admin_user
from src.core.utils import str_to_ObjectId
from src.schemas.promptVersion import (
PromptVersionCreate,
@@ -27,7 +27,7 @@
responses={**ReqResponses.GET_RESPONSES},
response_model=List[PromptVersionRead],
)
-async def get_promptVersions_list(
+async def get_prompt_versions_list(
current_user: Annotated[UserInDB, Depends(get_current_active_user)],
db=Depends(get_db),
prompt_id: str | None = None,
@@ -66,14 +66,14 @@ async def get_promptVersion_by_id(
)
async def add_promptVersion(
promptVersion: PromptVersionCreate,
- current_user: Annotated[UserInDB, Depends(get_current_active_user)],
+ current_user: Annotated[UserInDB, Depends(get_current_prompt_admin_user)],
db=Depends(get_db),
-):
+) -> DefaultPostResponse:
insert_res = await promptVersion_crud.create(
db, promptVersion, current_user=current_user
)
- return {"id": str(insert_res.inserted_id)}
+ return DefaultPostResponse(id=str(insert_res.inserted_id))
@router.patch(
@@ -85,7 +85,7 @@ async def add_promptVersion(
async def update_promptVersion(
promptVersion_patch: PromptVersionUpdate,
id: str,
- current_user: Annotated[UserInDB, Depends(get_current_active_user)],
+ current_user: Annotated[UserInDB, Depends(get_current_prompt_admin_user)],
db=Depends(get_db),
):
promptVersion_updated = await promptVersion_crud.update_and_fetch(
diff --git a/server/src/endpoints/prompts.py b/server/src/endpoints/prompts.py
index d89ba4a..a638d69 100644
--- a/server/src/endpoints/prompts.py
+++ b/server/src/endpoints/prompts.py
@@ -1,10 +1,11 @@
from typing import Annotated, List
from fastapi import APIRouter, Depends, status
-from src.core.user import get_current_active_user
+from src.core.user import get_current_active_user, get_current_prompt_admin_user
from src.endpoints.endpoint_exceptions import (
NotImplementedException,
)
+from src.schemas.base import DefaultPostResponse
from src.schemas.prompt import PromptUpdate, PromptRead, PromptCreate
from src.core.database import get_db
from src.endpoints.ApiResponses import ReqResponses
@@ -28,7 +29,7 @@
responses={**ReqResponses.GET_RESPONSES},
response_model=List[PromptRead],
)
-async def get_prompt_list(
+async def get_prompts_list(
current_user: Annotated[UserInDB, Depends(get_current_active_user)],
db=Depends(get_db),
):
@@ -59,12 +60,12 @@ async def get_prompt_by_id(
)
async def add_prompt(
prompt: PromptCreate,
- current_user: Annotated[UserInDB, Depends(get_current_active_user)],
+ current_user: Annotated[UserInDB, Depends(get_current_prompt_admin_user)],
db=Depends(get_db),
-):
+) -> DefaultPostResponse:
insert_res = await prompt_crud.create(db, prompt, current_user)
- return {"id": str(insert_res.inserted_id)}
+ return DefaultPostResponse(id=str(insert_res.inserted_id))
@router.patch(
@@ -76,7 +77,7 @@ async def add_prompt(
async def update_prompt(
prompt_patch: PromptUpdate,
id: str,
- current_user: Annotated[UserInDB, Depends(get_current_active_user)],
+ current_user: Annotated[UserInDB, Depends(get_current_prompt_admin_user)],
db=Depends(get_db),
):
prompt = await prompt_crud.update_and_fetch(db, id, prompt_patch, current_user)
diff --git a/server/src/endpoints/status.py b/server/src/endpoints/status.py
index f4035ba..6708c97 100644
--- a/server/src/endpoints/status.py
+++ b/server/src/endpoints/status.py
@@ -3,7 +3,6 @@
from src.core.settings import settings
from src.core.database import get_db
from src.schemas import apiStatus
-from src.core.database import get_db
router = APIRouter()
diff --git a/server/src/endpoints/token_login.py b/server/src/endpoints/token_login.py
index 9b59808..ebeec19 100644
--- a/server/src/endpoints/token_login.py
+++ b/server/src/endpoints/token_login.py
@@ -1,5 +1,5 @@
from typing import Annotated
-from fastapi import APIRouter, Depends, Form
+from fastapi import APIRouter, Depends
from fastapi.security import OAuth2PasswordRequestForm
diff --git a/server/src/endpoints/users.py b/server/src/endpoints/users.py
index b5bf8a1..c40830c 100644
--- a/server/src/endpoints/users.py
+++ b/server/src/endpoints/users.py
@@ -7,6 +7,7 @@
EmailAlreadyExistsError,
PermissionValidationError,
)
+from src.schemas.base import DefaultPostResponse
from src.schemas.user import UserInDB, UserRoles
from src.core.user import (
get_current_active_user,
@@ -66,14 +67,14 @@ async def get_user_by_id(
@router.post(
"/users",
tags=["users"],
- responses={**ReqResponses.POST_RESPONSES},
+ responses={**ReqResponses.POST_RESPONSES, **ReqResponses.EMAIL_ALREADY_EXISTS},
status_code=status.HTTP_201_CREATED,
)
async def add_new_user(
user_to_add: UserCreate,
current_user: Annotated[UserInDB, Depends(get_current_org_admin_user)],
db=Depends(get_db),
-):
+) -> DefaultPostResponse:
if (
current_user.role != UserRoles.SUPER_ADMIN
and user_to_add.org_id != current_user.org_id
@@ -94,7 +95,7 @@ async def add_new_user(
except DuplicateKeyError:
raise EmailAlreadyExistsError(email=user_to_add.email)
- return {"id": str(insert_res.inserted_id)}
+ return DefaultPostResponse(id=str(insert_res.inserted_id))
# TODO: update user (password, email, org?, role, disabled)
diff --git a/server/src/routers.py b/server/src/routers.py
index b624bc5..f62ceea 100644
--- a/server/src/routers.py
+++ b/server/src/routers.py
@@ -8,6 +8,7 @@
from src.endpoints.token_login import router as tokenRouter
from src.endpoints.orgs import router as orgsRouter
from src.endpoints.users import router as usersRouter
+from src.endpoints.feedbacks import router as feedbackRouter
def use_route_names_as_operation_ids(app: FastAPI) -> None:
@@ -21,7 +22,7 @@ def use_route_names_as_operation_ids(app: FastAPI) -> None:
"""
for route in app.routes:
if isinstance(route, APIRoute):
- route.operation_id = route.name # in this case, 'read_items'
+ route.operation_id = route.name
all_routers = APIRouter()
@@ -32,3 +33,4 @@ def use_route_names_as_operation_ids(app: FastAPI) -> None:
all_routers.include_router(inferencesRouter)
all_routers.include_router(orgsRouter)
all_routers.include_router(usersRouter)
+all_routers.include_router(feedbackRouter)
diff --git a/server/src/schemas/base.py b/server/src/schemas/base.py
index cd35cf9..0cf7900 100644
--- a/server/src/schemas/base.py
+++ b/server/src/schemas/base.py
@@ -13,6 +13,12 @@ class NonEmptyStrField(ConstrainedStr):
NameField = NonEmptyStrField
+class DefaultPostResponse(BaseModel):
+ """Standard response for POST requests. Contains the id of the created item."""
+
+ id: str = Field(..., description="The id of the created item")
+
+
class MyBaseModel(BaseModel):
class Config:
extra = Extra.forbid
@@ -37,13 +43,26 @@ def __modify_schema__(cls, field_schema):
field_schema.update(type="string")
-class MongoBase(MyBaseModel):
+class MongoBaseCreate(MyBaseModel):
+ """Base model for creating a record in MongoDB. Populates `id` and `created_at` when not passed.
+ `created_by_user_id` and `created_by_org_id` fields should be populated by base CRUD class
+ """
+
id: PyObjectId = Field(default_factory=PyObjectId, alias="_id")
created_at: datetime = Field(default_factory=datetime.utcnow)
created_by_user_id: Optional[PyObjectId] = None
created_by_org_id: Optional[PyObjectId] = None
+class MongoBaseRead(MyBaseModel):
+ """Base model for reading from MongoDB. Same as MongoBaseCreate but assumes all DB base fields are populated so generated clients doesn't requrie None checks"""
+
+ id: PyObjectId = Field(alias="_id")
+ created_at: datetime
+ created_by_user_id: PyObjectId
+ created_by_org_id: PyObjectId
+
+
class AllOptional(pydantic.main.ModelMetaclass):
"""Make all fields optional on class but keep validators. Using it PATCH schema can be based on Base/Create schema
`class PromptUpdate(AllOptional, PromptBase):`
diff --git a/server/src/schemas/feedback.py b/server/src/schemas/feedback.py
new file mode 100644
index 0000000..b2f513e
--- /dev/null
+++ b/server/src/schemas/feedback.py
@@ -0,0 +1,56 @@
+from typing import Any, Optional
+from pydantic import Extra, Field, root_validator
+from src.schemas.base import (
+ MongoBaseCreate,
+ MongoBaseRead,
+ MyBaseModel,
+ PyObjectId,
+)
+
+
+class FeedbackBase(MyBaseModel):
+ inference_id: PyObjectId = Field(..., description="The inference being rated")
+ end_user_id: Optional[str] = Field(
+ None,
+ description="API consumers' end user id If feedback from end user otherwise null",
+ )
+ feedback_for_part: Optional[str] = Field(
+ None,
+ description="Specifies which part of the output the feedback is about. Can be used when the inference has multiple sections which require separate feedback",
+ )
+ score: Optional[int] = Field(
+ None,
+ description="Any integer score. Rules are up to the API consumer. Can be null if it was flagging or note only",
+ )
+ flag: Optional[str] = Field(
+ None,
+ description="Any string when inference was flagged. Can be null if it is scoring or note only",
+ )
+ note: Optional[str] = Field(None)
+ metadata: Optional[dict[str, Any]] = Field(None)
+
+
+class FeedbackCreate(FeedbackBase, extra=Extra.forbid):
+ @root_validator
+ def mandatory_field_validation(cls, values):
+ """Check if either `score`, `flag` or `note` is provided"""
+ if not (values.get("score") or values.get("flag") or values.get("note")):
+ raise ValueError(
+ "At least one of `score`, `flag` or `note` must be provided"
+ )
+ return values
+
+
+class FeedbackUpdate(FeedbackBase, extra=Extra.forbid):
+ """Only placeholder for now as no feedback update feature"""
+
+ # TODO: decide what we allow to update with FeedbackUpdate and by whom (if need it at all)
+ pass
+
+
+class FeedbackInDB(FeedbackBase, MongoBaseCreate, extra=Extra.allow):
+ prompt_version_id: PyObjectId
+
+
+class FeedbackRead(FeedbackBase, MongoBaseRead, extra=Extra.ignore):
+ prompt_version_id: Optional[PyObjectId] = None
diff --git a/server/src/schemas/inference.py b/server/src/schemas/inference.py
index bfc838b..0c68e0f 100644
--- a/server/src/schemas/inference.py
+++ b/server/src/schemas/inference.py
@@ -1,20 +1,14 @@
from datetime import datetime
from enum import Enum
-from typing import Any, Optional
+from typing import Any, Dict, List, Optional
from pydantic import Extra, Field
from src.schemas.openAI import (
ChatGPTChatCompletitionRequest,
ChatGPTChatCompletitionResponse,
- ChatGPTMessage,
ChatGPTTokenUsage,
)
-from src.schemas.base import (
- MongoBase,
- MyBaseModel,
- NonEmptyStrField,
- PyObjectId,
-)
+from src.schemas.base import MongoBaseCreate, MongoBaseRead, MyBaseModel, PyObjectId
from src.schemas.promptVersion import PromptVersionProviders
@@ -28,16 +22,37 @@ class InferenceResponseStatus(str, Enum):
# TODO: num_samples
# TODO: streaming
class InferenceBase(MyBaseModel):
- end_user_id: NonEmptyStrField
- source: NonEmptyStrField
- template_args: Optional[dict[str, str]] = Field(None)
+ end_user_id: str | None = Field(
+ None,
+ description="The API consumer's internal user reference for metrics. It is also relayed to the provider as part of the request if the provider supports it (eg. OpenAI's user field).",
+ )
+ source: str | None = Field(
+ None,
+ description="The API consumer's source for metrics (e.g. AndroidApp etc).",
+ )
+ client_ref_id: str | None = Field(
+ None,
+ description="The API consumer's internal reference id to able to link references to their sessions.",
+ )
+ template_args: Optional[dict[str, str]] = Field({})
metadata: Optional[dict[str, Any]] = Field(None)
- request_timeout: Optional[float] = Field(None)
+ request_timeout: Optional[float] = Field(
+ None,
+ description="Provider request timout in seconds. If not provided, then Prompton API's default timeout for the provider will be used (90sec or `DEFAULT_OPENAI_REQUEST_TIMEOUT_SECONDS` env var if provided).",
+ )
+
+
+class InferenceCreateByPromptVersionId(InferenceBase, extra=Extra.forbid):
prompt_version_id: PyObjectId
-class InferenceCreate(InferenceBase, extra=Extra.forbid):
- pass
+class InferenceCreateByPromptId(InferenceBase, extra=Extra.forbid):
+ """Create inference by `prompt_id`. It can only be used if there is at least one 'Live' status prompt version for the provided `prompt_id`.
+ If there are multiple prompt versions in Live status it will pick one randomly. Useful for split testing prompt versions.
+ It stores all other `prompt_version_id`s in Live status at the time of the inference in `prompt_version_ids_considered` field.
+ """
+
+ prompt_id: PyObjectId
class InferenceResponseBase(MyBaseModel):
@@ -46,15 +61,20 @@ class InferenceResponseBase(MyBaseModel):
is_client_connected_at_finish: Optional[bool] = None
+class InferenceError(MyBaseModel, extra=Extra.allow):
+ error_class: str
+ message: str
+ details: Any
+
+
class InferenceResponseError(InferenceResponseBase):
isError: bool = True
- error: Any
+ error: InferenceError
class InferenceResponseData(InferenceResponseBase):
isError: bool = False
# time_to_first: int = Field(None) # if streaming
- first_message: ChatGPTMessage
token_usage: ChatGPTTokenUsage
raw_response: ChatGPTChatCompletitionResponse
@@ -69,17 +89,29 @@ class InferenceUpdate(MyBaseModel, extra=Extra.forbid):
response: InferenceResponseData | InferenceResponseError
-class InferenceInDB(InferenceBase, MongoBase, extra=Extra.allow):
- prompt_id: PyObjectId
- prompt_version_name: str = Field(None)
- status: Optional[InferenceResponseStatus] = Field(
- default=InferenceResponseStatus.REQUEST_RECEIVED
+class InferenceInDBBase(InferenceBase, extra=Extra.allow):
+ prompt_version_id: PyObjectId
+ prompt_version_ids_considered: List[PyObjectId] = Field(
+ ...,
+ description="If inference was by prompt_id then a list of all other prompt versions considered for this inference. I.e. all prompt versions in Live status at the time of the inference",
)
- request: InferenceRequestData = Field(None)
+ prompt_id: PyObjectId
+ prompt_version_name: str
+ status: InferenceResponseStatus
+ request: InferenceRequestData
response: Optional[InferenceResponseData | InferenceResponseError] = Field(None)
-class InferenceRead(InferenceInDB, extra=Extra.ignore):
+class InferenceInDB(InferenceInDBBase, MongoBaseCreate, extra=Extra.allow):
+ """Same as InferenceRead but status and base DB fields are not mandatory to be populated by pydantic defaults"""
+
+ pass
+
+
+class InferenceRead(InferenceInDBBase, MongoBaseRead, extra=Extra.ignore):
+ # Same as InferenceInDB but fields with default values are mandatory so clients don't need to check None values
+ prompt_version_ids_considered: List[PyObjectId]
+ template_args: Dict[str, str]
pass
diff --git a/server/src/schemas/org.py b/server/src/schemas/org.py
index ab72c54..e3981a4 100644
--- a/server/src/schemas/org.py
+++ b/server/src/schemas/org.py
@@ -1,8 +1,9 @@
-from typing import Dict, List
-from pydantic import Extra, SecretStr
+from typing import Dict
+from pydantic import Extra, Field, SecretStr
from src.schemas.base import (
AllOptional,
- MongoBase,
+ MongoBaseCreate,
+ MongoBaseRead,
MyBaseModel,
NonEmptyStrField,
)
@@ -11,18 +12,26 @@
class OrgBase(MyBaseModel):
name: NonEmptyStrField
access_keys: Dict[str, str] | None = None
+ oauth_domain: str | None = Field(
+ None,
+ description="APEX domain for oauth single sign on. Anyone with an email address ending in this domain will be able to register to the org after google account sign in. Only Google OAuth is supported for now.",
+ )
class OrgCreate(OrgBase, extra=Extra.forbid):
pass
-class OrgInDB(OrgBase, MongoBase, extra=Extra.allow):
+class OrgInDB(OrgBase, MongoBaseCreate, extra=Extra.allow):
pass
-class OrgRead(MongoBase, extra=Extra.ignore):
+class OrgRead(MongoBaseRead, extra=Extra.ignore):
name: str
+ oauth_domain: str | None = Field(
+ None,
+ description="APEX domain for oauth single sign on. Anyone with an email address ending in this domain will be able to register to the org after google account sign in. Only Google OAuth is supported for now.",
+ )
access_keys: Dict[str, SecretStr] | None = None
diff --git a/server/src/schemas/prompt.py b/server/src/schemas/prompt.py
index c0b83cb..23b68db 100644
--- a/server/src/schemas/prompt.py
+++ b/server/src/schemas/prompt.py
@@ -2,7 +2,13 @@
from typing import Optional
from pydantic import Extra, Field
-from src.schemas.base import AllOptional, MongoBase, MyBaseModel, NameField
+from src.schemas.base import (
+ AllOptional,
+ MongoBaseCreate,
+ MongoBaseRead,
+ MyBaseModel,
+ NameField,
+)
class PromptStatus(str, Enum):
@@ -11,17 +17,21 @@ class PromptStatus(str, Enum):
class PromptCreate(MyBaseModel, extra=Extra.forbid):
- status: PromptStatus = Field(default=PromptStatus.ACTIVE)
+ status: PromptStatus = Field(
+ default=PromptStatus.ACTIVE,
+ description="Prompt status for client consideration only, currently not used in server logic.",
+ )
name: NameField
description: Optional[str] = Field(None)
-class PromptInDB(PromptCreate, MongoBase, extra=Extra.allow):
+class PromptInDB(PromptCreate, MongoBaseCreate, extra=Extra.allow):
pass
-class PromptRead(PromptCreate, MongoBase, extra=Extra.ignore):
- pass
+class PromptRead(PromptCreate, MongoBaseRead, extra=Extra.ignore):
+ # override status to be mandatory so clients don't need to check None values
+ status: PromptStatus
class PromptUpdate(PromptCreate, metaclass=AllOptional):
diff --git a/server/src/schemas/promptVersion.py b/server/src/schemas/promptVersion.py
index 95c0476..07adea7 100644
--- a/server/src/schemas/promptVersion.py
+++ b/server/src/schemas/promptVersion.py
@@ -2,12 +2,12 @@
from typing import List, Optional
from pydantic import Extra, Field, root_validator, validator
-from src.schemas.base import AllOptional, PyObjectId
+from src.schemas.base import AllOptional, MongoBaseRead, PyObjectId
from src.schemas.openAI import (
ChatGPTChatCompletitionConfig,
ChatGPTMessageTemplate,
)
-from src.schemas.base import MongoBase, MyBaseModel, NameField
+from src.schemas.base import MongoBaseCreate, MyBaseModel, NameField
class PromptVersionProviders(str, Enum):
@@ -29,7 +29,7 @@ class PromptVersionBase(MyBaseModel):
name: NameField
description: Optional[str] = Field(None)
prompt_id: PyObjectId
- template: ChatGPTMessageTemplate = Field(None)
+ template: ChatGPTMessageTemplate = Field([])
model_config: ChatGPTChatCompletitionConfig = Field(None)
@@ -58,14 +58,22 @@ def nondraft_check_mandatory_fields(cls, values):
return values
-class PromptVersionInDB(PromptVersionBase, MongoBase, extra=Extra.allow):
- # list of args in the template - calculated at patch and post
+class PromptVersionInDB(PromptVersionBase, MongoBaseCreate, extra=Extra.allow):
# NB: pydantic 2.0alpha has computed fields https://github.com/pydantic/pydantic/blob/48f6842c7808807e076a69065f60a40b57f5fc5a/docs/usage/computed_fields.md#L4
- template_arg_names: Optional[List[str]] = Field([])
-
-
-class PromptVersionRead(PromptVersionInDB, extra=Extra.ignore):
- pass
+ template_arg_names: List[str] = Field(
+ default=[],
+ )
+
+
+class PromptVersionRead(PromptVersionBase, MongoBaseRead, extra=Extra.ignore):
+ # just overriding so all fields are mandatory so clients don't need to check None values
+ provider: PromptVersionProviders
+ status: PromptVersionStatus
+ template: ChatGPTMessageTemplate
+ template_arg_names: List[str] = Field(
+ ...,
+ description="List of args in the template - populated by server at PATHC and POST",
+ )
class PromptVersionUpdate(PromptVersionBase, metaclass=AllOptional, extra=Extra.forbid):
diff --git a/server/src/schemas/user.py b/server/src/schemas/user.py
index f8829f1..1591f4d 100644
--- a/server/src/schemas/user.py
+++ b/server/src/schemas/user.py
@@ -1,9 +1,10 @@
from enum import Enum
-from pydantic import EmailStr, Extra, Field, SecretStr
+from pydantic import EmailStr, Extra, SecretStr
from src.schemas.base import (
AllOptional,
- MongoBase,
+ MongoBaseCreate,
+ MongoBaseRead,
MyBaseModel,
NonEmptyStrField,
PyObjectId,
@@ -21,6 +22,7 @@ class TokenData(MyBaseModel):
class UserRoles(str, Enum):
BASIC = "Basic"
+ PROMPT_ADMIN = "PromptAdmin"
ORG_ADMIN = "OrgAdmin"
SUPER_ADMIN = "SuperAdmin"
@@ -38,14 +40,16 @@ class UserCreate(User, extra=Extra.forbid):
pass
-class UserInDB(User, MongoBase, extra=Extra.allow):
+class UserInDB(User, MongoBaseCreate, extra=Extra.allow):
email: str
hashed_password: str
-class UserRead(User, MongoBase, extra=Extra.ignore):
+class UserRead(User, MongoBaseRead, extra=Extra.ignore):
# we ignore extra fields to prevent hashed_password to be returned
+ # override all fields with default values as mandatory so clients don't need to check None values
email: str
+ disabled: bool
pass
@@ -56,3 +60,8 @@ class UserUpdate(UserCreate, metaclass=AllOptional):
class LoginCredentialsPost(MyBaseModel):
username: EmailStr
password: SecretStr
+
+
+class OauthUserInfo(MyBaseModel, extra=Extra.allow):
+ email: EmailStr
+ name: str
diff --git a/server/tests/conftest.py b/server/tests/conftest.py
index f0713d5..112f095 100644
--- a/server/tests/conftest.py
+++ b/server/tests/conftest.py
@@ -1,4 +1,3 @@
-from bson import ObjectId
import pytest
from httpx import AsyncClient
@@ -8,7 +7,6 @@
from .conftest_mock_db import *
from .conftest_mock_openai import *
from .conftest_mock_auth import *
-from src.core.settings import settings
@pytest.fixture(scope="session")
diff --git a/server/tests/conftest_mock_auth.py b/server/tests/conftest_mock_auth.py
index 8370fc3..c792842 100644
--- a/server/tests/conftest_mock_auth.py
+++ b/server/tests/conftest_mock_auth.py
@@ -1,4 +1,3 @@
-from functools import partial
import pytest
from src.asgi import app
diff --git a/server/tests/conftest_mock_db.py b/server/tests/conftest_mock_db.py
index 629894d..ed56538 100644
--- a/server/tests/conftest_mock_db.py
+++ b/server/tests/conftest_mock_db.py
@@ -1,14 +1,11 @@
-import json
import pytest
from bson import ObjectId
from mongomock_motor import AsyncMongoMockClient
-from pymongo import ASCENDING
from copy import deepcopy
from datetime import datetime
from src.asgi import app
from src.core.database import get_db
-from tests.utils import bson_to_json
@pytest.fixture
diff --git a/server/tests/core/inferenceProcessing_test_data.py b/server/tests/core/inferenceProcessing_test_data.py
index 985686a..89f3225 100644
--- a/server/tests/core/inferenceProcessing_test_data.py
+++ b/server/tests/core/inferenceProcessing_test_data.py
@@ -31,7 +31,6 @@
"isError": False,
"completition_duration_seconds": 66.6, # ignored in test
"is_client_connected_at_finish": None,
- "first_message": mock_completition_data["choices"][0]["message"], # type: ignore[index]
"token_usage": mock_completition_data["usage"],
"raw_response": mock_completition_data,
}
@@ -43,7 +42,6 @@
"isError": True,
"error": {
"error_class": "builtins.Exception",
- "error": None,
"message": "mocked error",
"details": {},
},
diff --git a/server/tests/core/test_auth.py b/server/tests/core/test_auth.py
index df810f0..9f0ab0c 100644
--- a/server/tests/core/test_auth.py
+++ b/server/tests/core/test_auth.py
@@ -2,7 +2,6 @@
import pytest
from src.core.auth import get_hashed_password, verify_password
-from src.schemas.user import UserInDB
PASSWORD_HASH_foo = "$2b$12$4MvKPux4R8AWrA/FFTW5muiVrYKqS.7NlQOA6N81U0lATUoijV4NK"
PASSWORD_HASH_bar = "$2b$12$ZYZMqs2CsDA./fueQkwQceorkm1xOLm5j6yGLF206.Glfwncbo2PG"
diff --git a/server/tests/core/test_inferenceProcessing.py b/server/tests/core/test_inferenceProcessing.py
index 6edf73a..f6e6b89 100644
--- a/server/tests/core/test_inferenceProcessing.py
+++ b/server/tests/core/test_inferenceProcessing.py
@@ -5,7 +5,6 @@
from src.core.completition import get_openai_chat_completition
-from src.schemas.inference import InferenceCreate
from src.schemas.openAI import ChatGPTChatCompletitionRequest
from tests.core.inferenceProcessing_test_data import (
expected_error_response,
@@ -13,7 +12,7 @@
test_raw_request,
expected_response,
)
-from tests.shared_test_data import DEFAULT_RAW_COMPLETITION_REQUEST
+
from tests.utils import bson_to_json
diff --git a/server/tests/core/test_pydantic_bases.py b/server/tests/core/test_pydantic_bases.py
new file mode 100644
index 0000000..77be8d6
--- /dev/null
+++ b/server/tests/core/test_pydantic_bases.py
@@ -0,0 +1,77 @@
+from bson import ObjectId
+from pydantic import BaseModel, Extra, ValidationError
+import pytest
+
+from src.schemas.base import AllOptional
+
+
+class MyBaseModel(BaseModel):
+ class Config:
+ extra = Extra.forbid
+ # TODO: orjson or ujson for better performance https://github.com/zhanymkanov/fastapi-best-practices#8-custom-base-model-from-day-0
+
+ json_encoders = {ObjectId: str}
+
+
+class FooNest(MyBaseModel):
+ boo: int
+
+
+class FooBase(MyBaseModel):
+ root: int
+ nest: FooNest
+
+
+class FooCreate(FooBase, extra=Extra.forbid):
+ pass
+
+
+class FooInDB(FooCreate, MyBaseModel, extra=Extra.allow):
+ pass
+
+
+class FooPatch(FooCreate, metaclass=AllOptional):
+ pass
+
+
+class FooRead(FooCreate, MyBaseModel, extra=Extra.ignore):
+ pass
+
+
+@pytest.mark.anyio
+async def test_pydantic_allow_extra():
+ test_no_extra = {"root": 2, "nest": {"boo": 2}}
+ test_root_extra = {"root": 2, "nest": {"boo": 2}, "extra": "extra val"}
+
+ test_nested_extra = {"root": 2, "nest": {"boo": 2, "extra": "xxx"}}
+
+ # all should work with without extra
+ for obj in [FooInDB, FooRead, FooPatch]:
+ parsed = obj.parse_obj(test_no_extra)
+ assert parsed.dict() == test_no_extra
+
+ # FooInDB should allow extra
+ parsed = FooInDB.parse_obj(test_root_extra)
+ assert parsed.dict() == test_root_extra
+
+ # THIS RAISES: ValidationError
+ # See: https://stackoverflow.com/questions/76481931/how-to-set-pydantic-extra-allow-extra-ignore-on-nested-class-fields
+ # parsed = FooInDB.parse_obj(test_nested_extra)
+ # assert parsed.dict() == test_nested_extra
+
+ # FooRead should ignore extra
+ parsed = FooRead.parse_obj(test_root_extra)
+ assert parsed.dict() == test_no_extra
+
+ # THIS RAISES: ValidationError
+ # parsed = FooRead.parse_obj(test_nested_extra)
+ # assert parsed.dict() == test_no_extra
+
+ # FooPatch should forbid extra
+ with pytest.raises(ValidationError):
+ FooPatch.parse_obj(test_root_extra)
+
+ with pytest.raises(ValidationError):
+ FooPatch.parse_obj(test_nested_extra)
+
+ print(parsed)
diff --git a/server/tests/crud/test_crud_get_multi.py b/server/tests/crud/test_crud_get_multi.py
new file mode 100644
index 0000000..bd6cb77
--- /dev/null
+++ b/server/tests/crud/test_crud_get_multi.py
@@ -0,0 +1,62 @@
+import json
+from bson import ObjectId
+
+import pytest
+
+from src.crud.prompt import prompt_crud
+from src.schemas.base import PyObjectId
+from src.schemas.user import UserInDB, UserRoles
+from tests.utils import bson_to_json
+
+
+PROMPT_BASE = {
+ "created_by_user_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaaa1"),
+ "created_by_org_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaaa1"),
+ "status": "Active",
+ "name": "UC t2 None description",
+ "description": None,
+}
+PROMPT1 = {
+ **PROMPT_BASE,
+ "id": PyObjectId("648886d7f38b7183b2a97897"),
+ "created_at": "2023-06-13T15:10:15.363000+00:00",
+}
+PROMPT2 = {
+ "id": PyObjectId("648c7d1c6baa7a4759f6647c"),
+ "created_at": "2023-06-16T15:17:48.531000+00:00",
+ **PROMPT_BASE,
+}
+
+PROMPT3 = {
+ "id": PyObjectId("648e9e68aaa77b3ed5c09e73"),
+ "created_at": "2023-06-18T06:04:24.939000+00:00",
+ **PROMPT_BASE,
+}
+
+
+test_db_data = {"prompts": [PROMPT1, PROMPT2, PROMPT3]}
+
+mock_user = UserInDB(
+ email="test@test.co",
+ org_id=PyObjectId("aaaaaaaaaaaaaaaaaaaaaaa1"),
+ role=UserRoles.SUPER_ADMIN,
+ hashed_password="test",
+)
+
+
+@pytest.mark.parametrize("mock_db", [test_db_data], indirect=True)
+@pytest.mark.anyio
+async def test_get_multi_sort(mock_db):
+ expected_default_sort = bson_to_json([PROMPT3, PROMPT2, PROMPT1])
+ expected_reverse_sort = bson_to_json([PROMPT1, PROMPT2, PROMPT3])
+
+ actual_prompts = await prompt_crud.get_multi(mock_db, mock_user)
+ actual_prompts_json = [bson_to_json(p.dict()) for p in actual_prompts]
+ print(f" <--- actual_prompts_json: {json.dumps(actual_prompts_json, indent=4)}")
+
+ assert actual_prompts_json == expected_default_sort
+
+ actual_prompts = await prompt_crud.get_multi(mock_db, mock_user, sort=("_id", 1))
+ actual_prompts_json = [bson_to_json(p.dict()) for p in actual_prompts]
+
+ assert actual_prompts_json == expected_reverse_sort
diff --git a/server/tests/endpoints/feedbacks/feedback_get_test_spec.py b/server/tests/endpoints/feedbacks/feedback_get_test_spec.py
new file mode 100644
index 0000000..b0d4a0d
--- /dev/null
+++ b/server/tests/endpoints/feedbacks/feedback_get_test_spec.py
@@ -0,0 +1,170 @@
+from bson import ObjectId
+from tests.shared_test_data import USER_BASIC, USER_ORG_ADMIN, USER_BASIC_ORG2
+from tests.utils import TestSpecList, remove_props
+
+INF_ID1 = ObjectId("aa0000000000000000000000")
+INF_ID2 = ObjectId("aa0000000000000000000001")
+
+PV_ID1 = ObjectId("bb0000000000000000000000")
+PV_ID2 = ObjectId("bb0000000000000000000001")
+
+FEEDBACK_MIN_FIELDS = {
+ "_id": ObjectId("000000000000000000000000"),
+ "created_at": "2023-06-23T11:09:02.187618",
+ "created_by_user_id": USER_BASIC["_id"],
+ "created_by_org_id": USER_BASIC["org_id"],
+ "inference_id": INF_ID1,
+ "prompt_version_id": PV_ID1,
+ "score": 1,
+ "flag": None,
+ "end_user_id": None,
+ "feedback_for_part": None,
+ "note": None,
+ "metadata": None,
+}
+
+FEEDBACK_ALL_FIELDS = {
+ **FEEDBACK_MIN_FIELDS,
+ "_id": ObjectId("000000000000000000000001"),
+ "flag": "flag",
+ "note": "note",
+ "end_user_id": "mrbean",
+ "feedback_for_part": "scoring",
+ "metadata": {"meta1": "v1"},
+}
+
+
+FEEDBACK_EXTRA_FIELD = {
+ **FEEDBACK_MIN_FIELDS,
+ "_id": ObjectId("000000000000000000000002"),
+ "extra_field": "extra ",
+}
+
+FEEDBACK_INF_2 = {
+ **FEEDBACK_MIN_FIELDS,
+ "_id": ObjectId("000000000000000000000003"),
+ "inference_id": INF_ID2,
+}
+
+FEEDBACK_USER_2 = {
+ **FEEDBACK_MIN_FIELDS,
+ "_id": ObjectId("000000000000000000000004"),
+ "created_by_user_id": USER_ORG_ADMIN["_id"],
+}
+FEEDBACK_PV_2 = {
+ **FEEDBACK_MIN_FIELDS,
+ "_id": ObjectId("000000000000000000000005"),
+ "prompt_version_id": PV_ID2,
+}
+
+FEEBACK_ORG2 = {
+ **FEEDBACK_MIN_FIELDS,
+ "_id": ObjectId("000000000000000000000006"),
+ "created_by_user_id": USER_BASIC_ORG2["_id"],
+ "created_by_org_id": USER_BASIC_ORG2["org_id"],
+}
+
+
+test_db_data = {
+ "feedbacks": [
+ FEEDBACK_ALL_FIELDS,
+ FEEDBACK_MIN_FIELDS,
+ FEEDBACK_EXTRA_FIELD,
+ FEEDBACK_INF_2,
+ FEEDBACK_USER_2,
+ FEEDBACK_PV_2,
+ FEEBACK_ORG2,
+ ]
+}
+
+expected_with_no_filter = [
+ FEEDBACK_ALL_FIELDS,
+ FEEDBACK_MIN_FIELDS,
+ remove_props(FEEDBACK_EXTRA_FIELD, "extra_field"),
+ FEEDBACK_INF_2,
+ FEEDBACK_USER_2,
+ FEEDBACK_PV_2,
+]
+
+feedbacks_get_test_spec: TestSpecList = [
+ #
+ # list & filters
+ #
+ {
+ "spec_id": "Basic list no filter should show own org only",
+ "mock_user": USER_BASIC,
+ "input": {},
+ "expected": expected_with_no_filter,
+ },
+ {
+ "spec_id": "filter by inference_id",
+ "mock_user": USER_BASIC,
+ "input": {"params": {"inference_id": str(INF_ID2)}},
+ "expected": [FEEDBACK_INF_2],
+ },
+ {
+ "spec_id": "filter by prompton_user_id",
+ "mock_user": USER_BASIC,
+ "input": {
+ "params": {"prompton_user_id": str(FEEDBACK_USER_2["created_by_user_id"])}
+ },
+ "expected": [FEEDBACK_USER_2],
+ },
+ {
+ "spec_id": "filter by prompt_version_id",
+ "mock_user": USER_BASIC,
+ "input": {
+ "params": {"prompt_version_id": str(FEEDBACK_PV_2["prompt_version_id"])}
+ },
+ "expected": [FEEDBACK_PV_2],
+ },
+ {
+ "spec_id": "combined filter",
+ "mock_user": USER_BASIC,
+ "input": {
+ "params": {
+ "prompt_version_id": str(FEEDBACK_MIN_FIELDS["prompt_version_id"]),
+ "inference_id": str(FEEDBACK_MIN_FIELDS["inference_id"]),
+ "prompton_user_id": str(FEEDBACK_MIN_FIELDS["created_by_user_id"]),
+ }
+ },
+ "expected": [
+ FEEDBACK_ALL_FIELDS,
+ FEEDBACK_MIN_FIELDS,
+ remove_props(FEEDBACK_EXTRA_FIELD, "extra_field"),
+ ],
+ },
+ #
+ # get feedback by id
+ #
+ {
+ "spec_id": "get by feedback_id",
+ "mock_user": USER_BASIC,
+ "input": {"id": str(FEEDBACK_MIN_FIELDS["_id"])},
+ "expected": FEEDBACK_MIN_FIELDS,
+ },
+ #
+ # Permission tests
+ #
+ {
+ "spec_id": "Basic shouldn't get other org's",
+ "mock_user": USER_BASIC,
+ "input": {"id": FEEBACK_ORG2["_id"]},
+ "expected": 404,
+ },
+ {
+ "spec_id": "OrgAdmin shouldn't get other org's",
+ "mock_user": USER_ORG_ADMIN,
+ "input": {"id": FEEBACK_ORG2["_id"]},
+ "expected": 404,
+ },
+ #
+ # Invalid requests
+ #
+ {
+ "spec_id": "malformed prompt_version_id",
+ "mock_user": USER_BASIC,
+ "input": {"params": {"prompt_version_id": "xxx"}},
+ "expected": 422,
+ },
+]
diff --git a/server/tests/endpoints/feedbacks/feedback_post_test_spec.py b/server/tests/endpoints/feedbacks/feedback_post_test_spec.py
new file mode 100644
index 0000000..7d3708f
--- /dev/null
+++ b/server/tests/endpoints/feedbacks/feedback_post_test_spec.py
@@ -0,0 +1,133 @@
+from tests.shared_test_data import USER_BASIC
+from tests.utils import TestSpecList
+from tests.endpoints.inferences.inference_test_records import (
+ PROCESSED_INFERENCE,
+ PROCESSED_INFERENCE_ORG2,
+)
+
+test_db_data = {"inferences": [PROCESSED_INFERENCE, PROCESSED_INFERENCE_ORG2]}
+
+
+test_specs_post: TestSpecList = [
+ {
+ "spec_id": "all fields",
+ "mock_user": USER_BASIC,
+ "input": {
+ "request_body": {
+ "inference_id": str(PROCESSED_INFERENCE["_id"]),
+ "end_user_id": "mrbean",
+ "feedback_for_part": "scoring",
+ "score": -1,
+ "flag": "Inappropriate",
+ "note": "this is a note",
+ "metadata": {"meta1": "v1"},
+ }
+ },
+ "expected": {
+ "created_by_user_id": str(USER_BASIC["_id"]),
+ "created_by_org_id": str(USER_BASIC["org_id"]),
+ "end_user_id": "mrbean",
+ "inference_id": str(PROCESSED_INFERENCE["_id"]),
+ "prompt_version_id": str(PROCESSED_INFERENCE["prompt_version_id"]),
+ "feedback_for_part": "scoring",
+ "score": -1,
+ "flag": "Inappropriate",
+ "note": "this is a note",
+ "metadata": {"meta1": "v1"},
+ },
+ },
+ {
+ "spec_id": "score only",
+ "mock_user": USER_BASIC,
+ "input": {
+ "request_body": {
+ "inference_id": str(PROCESSED_INFERENCE["_id"]),
+ "score": -1,
+ }
+ },
+ "expected": {
+ "created_by_user_id": str(USER_BASIC["_id"]),
+ "created_by_org_id": str(USER_BASIC["org_id"]),
+ "end_user_id": None,
+ "inference_id": str(PROCESSED_INFERENCE["_id"]),
+ "prompt_version_id": str(PROCESSED_INFERENCE["prompt_version_id"]),
+ "feedback_for_part": None,
+ "score": -1,
+ "flag": None,
+ "note": None,
+ "metadata": None,
+ },
+ },
+ {
+ "spec_id": "flag only",
+ "mock_user": USER_BASIC,
+ "input": {
+ "request_body": {
+ "inference_id": str(PROCESSED_INFERENCE["_id"]),
+ "flag": "boring",
+ }
+ },
+ "expected": {
+ "created_by_user_id": str(USER_BASIC["_id"]),
+ "created_by_org_id": str(USER_BASIC["org_id"]),
+ "end_user_id": None,
+ "inference_id": str(PROCESSED_INFERENCE["_id"]),
+ "prompt_version_id": str(PROCESSED_INFERENCE["prompt_version_id"]),
+ "feedback_for_part": None,
+ "score": None,
+ "flag": "boring",
+ "note": None,
+ "metadata": None,
+ },
+ },
+ {
+ "spec_id": "note only",
+ "mock_user": USER_BASIC,
+ "input": {
+ "request_body": {
+ "inference_id": str(PROCESSED_INFERENCE["_id"]),
+ "note": "I like this",
+ }
+ },
+ "expected": {
+ "created_by_user_id": str(USER_BASIC["_id"]),
+ "created_by_org_id": str(USER_BASIC["org_id"]),
+ "end_user_id": None,
+ "inference_id": str(PROCESSED_INFERENCE["_id"]),
+ "prompt_version_id": str(PROCESSED_INFERENCE["prompt_version_id"]),
+ "feedback_for_part": None,
+ "score": None,
+ "flag": None,
+ "note": "I like this",
+ "metadata": None,
+ },
+ },
+ {
+ "spec_id": "Non existent inference",
+ "mock_user": USER_BASIC,
+ "input": {
+ "request_body": {
+ "inference_id": "ffffffffffffffffffffffff",
+ "score": -1,
+ }
+ },
+ "expected": 404,
+ },
+ {
+ "spec_id": "Other orgs inference",
+ "mock_user": USER_BASIC,
+ "input": {
+ "request_body": {
+ "inference_id": str(PROCESSED_INFERENCE_ORG2["_id"]),
+ "score": -1,
+ }
+ },
+ "expected": 404,
+ },
+ {
+ "spec_id": "missing mandatory fields",
+ "mock_user": USER_BASIC,
+ "input": {"request_body": {"inference_id": str(PROCESSED_INFERENCE["_id"])}},
+ "expected": 422,
+ },
+]
diff --git a/server/tests/endpoints/feedbacks/test_feedback_get_gen.py b/server/tests/endpoints/feedbacks/test_feedback_get_gen.py
new file mode 100644
index 0000000..6ccf3d4
--- /dev/null
+++ b/server/tests/endpoints/feedbacks/test_feedback_get_gen.py
@@ -0,0 +1,16 @@
+from tests.endpoints.feedbacks.feedback_get_test_spec import (
+ test_db_data,
+ feedbacks_get_test_spec,
+)
+
+from tests.endpoints.test_generators.get_test_genarator import (
+ generate_pytest_get,
+ generate_pytest_get_empty,
+)
+
+
+test_promptVersions_get = generate_pytest_get(
+ "/feedbacks", test_db_data, feedbacks_get_test_spec
+)
+
+test_pronptVersions_get_empty = generate_pytest_get_empty("/feedbacks")
diff --git a/server/tests/endpoints/feedbacks/test_feedback_post_gen.py b/server/tests/endpoints/feedbacks/test_feedback_post_gen.py
new file mode 100644
index 0000000..914b1ce
--- /dev/null
+++ b/server/tests/endpoints/feedbacks/test_feedback_post_gen.py
@@ -0,0 +1,10 @@
+from tests.endpoints.feedbacks.feedback_post_test_spec import (
+ test_specs_post,
+ test_db_data,
+)
+from tests.endpoints.test_generators.post_test_genarator import generate_pytest_post
+
+
+test_prompts_post = generate_pytest_post(
+ "/feedbacks", test_db_data, "feedbacks", test_specs_post
+)
diff --git a/server/tests/endpoints/inferences/inference_test_records.py b/server/tests/endpoints/inferences/inference_test_records.py
index b8c912d..c6b3f88 100644
--- a/server/tests/endpoints/inferences/inference_test_records.py
+++ b/server/tests/endpoints/inferences/inference_test_records.py
@@ -16,7 +16,6 @@
PROMPT_ID3 = ObjectId("6468b05c1e5a374588560000")
PROMPT_VERSION_ID3 = ObjectId("646bae490e5a374588511111")
-
LIVE_PROMPT_VERSION_DB: Dict[str, Any] = {
"_id": ObjectId("645d786f180786983c9eede6"),
"created_at": "2023-05-15T15:46:02.051309",
@@ -32,6 +31,7 @@
"template_arg_names": ["arg1", "arg2"],
}
+
DRAFT_PROMPT_VERSION_DB = {
**LIVE_PROMPT_VERSION_DB,
"_id": ObjectId("645d786f180786983c9eede7"),
@@ -43,6 +43,7 @@
"created_at": "2023-05-24T15:17:07.799000",
"created_by_user_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaaa1"),
"created_by_org_id": ORG_ID1,
+ "client_ref_id": "xxx",
"end_user_id": "mock_me_softly",
"source": "openaidocs",
"template_args": {"arg1": "v1", "arg2": "v2"},
@@ -51,6 +52,10 @@
"prompt_id": PROMPT_ID1,
"prompt_version_id": PROMPT_VERSION_ID1,
"prompt_version_name": "random number v1",
+ "prompt_version_ids_considered": [
+ ObjectId("ffffffffffffffffffffffff"),
+ ObjectId("eeeeeeeeeeeeeeeeeeeeeeee"),
+ ],
"status": "Processed",
"request": {
"provider": "OpenAI",
@@ -80,7 +85,6 @@
"completition_duration_seconds": 1.1,
"is_client_connected_at_finish": True,
"isError": False,
- "first_message": {"role": "assistant", "content": "71", "name": None},
"token_usage": {
"prompt_tokens": 25,
"completion_tokens": 1,
@@ -126,13 +130,15 @@
"created_by_user_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaaa1"),
"created_by_org_id": ORG_ID1,
"end_user_id": "fail_me_softly",
+ "client_ref_id": None,
"source": "openaidocs",
- "template_args": None,
+ "template_args": {},
"metadata": None,
"request_timeout": None,
"prompt_id": PROMPT_ID2,
"prompt_version_id": PROMPT_VERSION_ID2,
"prompt_version_name": "random number v1",
+ "prompt_version_ids_considered": [],
"status": "CompletitionError",
"request": {
"provider": "OpenAI",
@@ -161,10 +167,11 @@
"completed_at": "2023-05-24T15:18:45.531000",
"completition_duration_seconds": 1.1,
"is_client_connected_at_finish": True,
+ # TODO: ignore extra fields in nested schemas. see core/test_pydantic_bases.py
+ # "extra_field2": "nested extra field should be ignoreded too",
"isError": True,
"error": {
"error_class": "openai.error.APIError",
- "error": None,
"message": "mocking error",
"details": {
"_message": "mocking error",
@@ -186,14 +193,16 @@
"created_at": "2023-05-24T15:22:48.248000",
"created_by_user_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaaa1"),
"created_by_org_id": ORG_ID1,
- "end_user_id": "timeout_me_softly",
- "source": "openaidocs",
- "template_args": None,
+ "client_ref_id": None,
+ "end_user_id": None,
+ "source": None,
+ "template_args": {},
"metadata": None,
"request_timeout": None,
"prompt_id": PROMPT_ID2,
"prompt_version_id": PROMPT_VERSION_ID2,
"prompt_version_name": "random number v1",
+ "prompt_version_ids_considered": [],
"status": "CompletitionTimeout",
"request": {
"provider": "OpenAI",
@@ -225,7 +234,6 @@
"isError": True,
"error": {
"error_class": "openai.error.Timeout",
- "error": None,
"message": "timeout error",
"details": {
"_message": "timeout error",
diff --git a/server/tests/endpoints/inferences/inferences_get_test_spec.py b/server/tests/endpoints/inferences/inferences_get_test_spec.py
index 6fca1c2..4320e43 100644
--- a/server/tests/endpoints/inferences/inferences_get_test_spec.py
+++ b/server/tests/endpoints/inferences/inferences_get_test_spec.py
@@ -1,4 +1,3 @@
-from typing import Any, Dict, List
from tests.endpoints.inferences.inference_test_records import (
ERROR_INFERENCE,
PROCESSED_INFERENCE,
diff --git a/server/tests/endpoints/inferences/inferences_post_test_spec.py b/server/tests/endpoints/inferences/inferences_post_test_spec.py
index 8652aea..904b916 100644
--- a/server/tests/endpoints/inferences/inferences_post_test_spec.py
+++ b/server/tests/endpoints/inferences/inferences_post_test_spec.py
@@ -1,3 +1,4 @@
+from typing import Any, Dict
from bson import ObjectId
import openai
from tests.conftest_mock_openai import mock_completition_data
@@ -7,15 +8,11 @@
PROMPT_ID1,
VALID_TEMPLATE,
)
-
-from tests.shared_test_data import (
- DEFAULT_RAW_COMPLETITION_REQUEST,
- ORG1,
- USER_BASIC,
- USER_SUPER_ADMIN,
-)
+from tests.shared_test_data import DEFAULT_RAW_COMPLETITION_REQUEST, ORG1, USER_BASIC
from tests.utils import TestInput, TestSpecList
+PROMPT_ID2_NO_LIVE_VERSION = ObjectId("6468b05c1e5a37458856d10c")
+
FILLED_TEMPLATE = {
"role": "system",
@@ -43,27 +40,49 @@
"org_id": ORG2_NONE_ACCESS_KEYS["_id"],
}
-LIVE_PROMPT_VERSION_DB_ORG2 = {
+LIVE_PROMPT_VERSION_DB2_ORG2 = {
**LIVE_PROMPT_VERSION_DB,
"_id": ObjectId("cccccccccccccccccccccccf"),
"created_by_org_id": ORG2_NONE_ACCESS_KEYS["_id"],
}
+# to test inference post by prompt id with multuple LIVE prompt versions
+LIVE_PROMPT_VERSION_DB3_ORG1 = {
+ **LIVE_PROMPT_VERSION_DB,
+ "_id": ObjectId("aa6bae490e5a37458856aaaa"),
+}
+
+# to test inference post by prompt id with multuple LIVE prompt versions
+LIVE_PROMPT_VERSION_DB4_ARCHIVED_ORG1 = {
+ **LIVE_PROMPT_VERSION_DB,
+ "prompt_id": PROMPT_ID2_NO_LIVE_VERSION,
+ "status": "Archived",
+ "_id": ObjectId("cc6bae490e5a37458856bbbb"),
+}
+
+LIVE_PROMPT_VERSION_DB5_TESTING_ORG1 = {
+ **LIVE_PROMPT_VERSION_DB,
+ "prompt_id": PROMPT_ID2_NO_LIVE_VERSION,
+ "status": "Testing",
+ "_id": ObjectId("cc6bae490e5a37458856cccc"),
+}
+
test_db_data = {
"users": [USER_BASIC, USER_BASIC_ORG2_NO_ACCESS_KEY],
"orgs": [ORG1, ORG2_NONE_ACCESS_KEYS],
"promptVersions": [
LIVE_PROMPT_VERSION_DB,
DRAFT_PROMPT_VERSION_DB,
- LIVE_PROMPT_VERSION_DB_ORG2,
+ LIVE_PROMPT_VERSION_DB2_ORG2,
+ LIVE_PROMPT_VERSION_DB3_ORG1,
+ LIVE_PROMPT_VERSION_DB4_ARCHIVED_ORG1,
+ LIVE_PROMPT_VERSION_DB5_TESTING_ORG1,
],
}
min_input: TestInput = {
"request_body": {
"prompt_version_id": str(LIVE_PROMPT_VERSION_DB["_id"]),
- "end_user_id": "u1",
- "source": "s1",
}
}
@@ -72,23 +91,24 @@
"prompt_version_id": str(LIVE_PROMPT_VERSION_DB["_id"]),
"end_user_id": "u1",
"source": "s1",
+ "client_ref_id": "u1-11",
"request_timeout": 120.1,
"template_args": {"arg1": "v1", "arg2": "v2"},
"metadata": {"meta1": "m1"},
}
}
-
expected_all_fields_head = {
"created_by_user_id": USER_BASIC["_id"],
"created_by_org_id": ORG1["_id"],
"end_user_id": "u1",
"source": "s1",
+ "client_ref_id": "u1-11",
"template_args": {"arg1": "v1", "arg2": "v2"},
- "metadata": {"meta1": "m1"},
"prompt_id": PROMPT_ID1,
"prompt_version_id": LIVE_PROMPT_VERSION_DB["_id"],
"prompt_version_name": "prompt v1",
+ "prompt_version_ids_considered": [],
"status": "Processed",
"metadata": {"meta1": "m1"},
"request_timeout": 120.1,
@@ -106,12 +126,13 @@
expected_min_fields_head = {
"created_by_user_id": USER_BASIC["_id"],
"created_by_org_id": ORG1["_id"],
- "end_user_id": "u1",
- "source": "s1",
- "template_args": None,
- "metadata": None,
+ "template_args": {},
+ "end_user_id": None,
+ "source": None,
+ "client_ref_id": None,
"prompt_id": PROMPT_ID1,
"prompt_version_id": LIVE_PROMPT_VERSION_DB["_id"],
+ "prompt_version_ids_considered": [],
"prompt_version_name": "prompt v1",
"status": "Processed",
"metadata": None,
@@ -122,13 +143,37 @@
**DEFAULT_RAW_COMPLETITION_REQUEST, # type: ignore[arg-type]
**LIVE_PROMPT_VERSION_DB["model_config"],
"messages": [VALID_TEMPLATE],
- "user": "u1",
},
},
}
+def custom_db_validator_for_post_by_prompt_id(actual_db: Dict[str, Any]) -> bool:
+ print(
+ "\n custom_db_validator_for_post_by_prompt_id: \n"
+ + f'<---- actual_db[prompt_version_id]: {actual_db["prompt_version_id"]} \n'
+ + f' actual_db[prompt_version_ids_considered]: {actual_db["prompt_version_ids_considered"]}\n'
+ + f' LIVE_PROMPT_VERSION_DB: {LIVE_PROMPT_VERSION_DB["_id"]}\n'
+ + f' LIVE_PROMPT_VERSION_DB3_ORG1: {LIVE_PROMPT_VERSION_DB3_ORG1["_id"]}\n'
+ )
+ assert len(actual_db["prompt_version_ids_considered"]) == 1
+ assert actual_db["prompt_version_ids_considered"][0] in [
+ LIVE_PROMPT_VERSION_DB["_id"],
+ LIVE_PROMPT_VERSION_DB3_ORG1["_id"],
+ ]
+
+ assert actual_db["prompt_version_id"] in [
+ LIVE_PROMPT_VERSION_DB["_id"],
+ LIVE_PROMPT_VERSION_DB3_ORG1["_id"],
+ ]
+
+ return True
+
+
test_specs_post: TestSpecList = [
+ #
+ # Post by prompt_version_id
+ #
{
"spec_id": "all input params",
"mock_user": USER_BASIC,
@@ -139,7 +184,6 @@
"isError": False,
"completition_duration_seconds": 6.6, # value ignored in tests
"is_client_connected_at_finish": True,
- "first_message": {"name": None, **mock_completition_data["choices"][0]["message"]}, # type: ignore[index]
"token_usage": mock_completition_data["usage"],
"raw_response": mock_completition_data,
},
@@ -151,17 +195,35 @@
"input": min_input,
"expected": {
**expected_min_fields_head,
+ "prompt_version_ids_considered": [],
"response": {
"isError": False,
"completition_duration_seconds": 6.6, # value ignored in tests
"is_client_connected_at_finish": True,
- "first_message": {"name": None, **mock_completition_data["choices"][0]["message"]}, # type: ignore[index]
"token_usage": mock_completition_data["usage"],
"raw_response": mock_completition_data,
},
},
},
#
+ # Post by prompt_id
+ #
+ {
+ "spec_id": "post by prompt id",
+ "mock_user": USER_BASIC,
+ "input": {"request_body": {"prompt_id": str(PROMPT_ID1)}},
+ "expected": {
+ "this_is": "ignored by post test generator currently bc of custom db validator fn in expected_db "
+ },
+ "expected_db": custom_db_validator_for_post_by_prompt_id,
+ },
+ {
+ "spec_id": "no live prompt_version for post by prompt_id",
+ "mock_user": USER_BASIC,
+ "input": {"request_body": {"prompt_id": str(PROMPT_ID2_NO_LIVE_VERSION)}},
+ "expected": 404,
+ },
+ #
# Permission tests
#
{
@@ -169,27 +231,27 @@
"mock_user": USER_BASIC,
"input": {
"request_body": {
- "prompt_version_id": str(LIVE_PROMPT_VERSION_DB_ORG2["_id"]),
- "end_user_id": "u1",
- "source": "s1",
+ "prompt_version_id": str(LIVE_PROMPT_VERSION_DB2_ORG2["_id"])
}
},
"expected": 404,
},
- # request validations
- #
{
"spec_id": "no org token",
"mock_user": USER_BASIC_ORG2_NO_ACCESS_KEY,
"input": {
- "request_body": {
- "prompt_version_id": str(LIVE_PROMPT_VERSION_DB_ORG2["_id"]),
- "end_user_id": "u1",
- "source": "s1",
- }
+ "request_body": {"prompt_version_id": str(PROMPT_ID2_NO_LIVE_VERSION)}
},
"expected": 400,
},
+ # request validations
+ #
+ {
+ "spec_id": "both prompt_version_id and prompt_id",
+ "mock_user": USER_BASIC,
+ "input": {"request_body": {**VALID_REQ, "prompt_id": str(PROMPT_ID1)}},
+ "expected": 422,
+ },
{
"spec_id": "invalid prompt_version_id",
"mock_user": USER_BASIC,
@@ -218,30 +280,6 @@
},
"expected": 422,
},
- {
- "spec_id": "empty source field",
- "mock_user": USER_BASIC,
- "input": {"request_body": {**VALID_REQ, "source": " "}},
- "expected": 422,
- },
- {
- "spec_id": "None source field",
- "mock_user": USER_BASIC,
- "input": {"request_body": {**VALID_REQ, "source": None}},
- "expected": 422,
- },
- {
- "spec_id": "empty end_user_id field",
- "mock_user": USER_BASIC,
- "input": {"request_body": {**VALID_REQ, "end_user_id": " "}},
- "expected": 422,
- },
- {
- "spec_id": "None end_user_id field",
- "mock_user": USER_BASIC,
- "input": {"request_body": {**VALID_REQ, "end_user_id": None}},
- "expected": 422,
- },
{
"spec_id": "invalid extra field",
"mock_user": USER_BASIC,
@@ -273,7 +311,6 @@
"is_client_connected_at_finish": True,
"error": {
"error_class": "openai.error.APIError",
- "error": None,
"message": "mocked error",
},
},
@@ -303,7 +340,6 @@
"is_client_connected_at_finish": True,
"error": {
"error_class": "openai.error.Timeout",
- "error": None,
"message": "mocked timeout",
},
},
diff --git a/server/tests/endpoints/inferences/test_inferences_get_gen.py b/server/tests/endpoints/inferences/test_inferences_get_gen.py
index 2ff890a..95a2ecb 100644
--- a/server/tests/endpoints/inferences/test_inferences_get_gen.py
+++ b/server/tests/endpoints/inferences/test_inferences_get_gen.py
@@ -1,6 +1,6 @@
from tests.endpoints.inferences.inferences_get_test_spec import (
inferences_get_test_db,
- test_spec_get as inferences_test_spec_get,
+ test_spec_get,
)
from tests.endpoints.test_generators.get_test_genarator import (
generate_pytest_get,
@@ -9,7 +9,7 @@
test_inferences_get = generate_pytest_get(
- "/inferences", inferences_get_test_db, inferences_test_spec_get
+ "/inferences", inferences_get_test_db, test_spec_get
)
test_inferences_get_empty = generate_pytest_get_empty("/inferences")
diff --git a/server/tests/endpoints/inferences/test_inferences_post_gen.py b/server/tests/endpoints/inferences/test_inferences_post_gen.py
index 8d0fc73..c8cd660 100644
--- a/server/tests/endpoints/inferences/test_inferences_post_gen.py
+++ b/server/tests/endpoints/inferences/test_inferences_post_gen.py
@@ -1,4 +1,4 @@
-from inferences_post_test_spec import (
+from tests.endpoints.inferences.inferences_post_test_spec import (
test_specs_post,
test_db_data,
)
diff --git a/server/tests/endpoints/inferences/test_inferences_post_gw_errors.py b/server/tests/endpoints/inferences/test_inferences_post_gw_errors.py
index b6a835d..5ae0626 100644
--- a/server/tests/endpoints/inferences/test_inferences_post_gw_errors.py
+++ b/server/tests/endpoints/inferences/test_inferences_post_gw_errors.py
@@ -28,7 +28,9 @@ async def test_inference_post_openai_errors(
input = test_spec.get("input", {})
request_body = bson_to_json(input.get("request_body", {}))
expected_response = bson_to_json(test_spec["expected"])
+ print(" --> expected response:", json.dumps(expected_response, indent=4))
expected_db = bson_to_json(test_spec.get("expected_db", expected_response))
+ print(" --> expected db:", json.dumps(expected_db, indent=4))
input_id = input.get("id")
url = f"/inferences/{input_id}" if input_id else "/inferences"
@@ -55,7 +57,10 @@ async def test_inference_post_openai_errors(
expected_response,
response_data,
ignore_order=True,
- exclude_paths=["root['detail']['inference_id']"],
+ exclude_paths=[
+ "root['detail']['inference_id']",
+ "root['detail']['openAI_error']",
+ ],
)
print(" *** response vs expected diff:\n", diff.pretty())
assert diff == {}, "response data should be as expected"
diff --git a/server/tests/endpoints/orgs/orgs_get_test_spec.py b/server/tests/endpoints/orgs/orgs_get_test_spec.py
index 12f06ec..9d761d3 100644
--- a/server/tests/endpoints/orgs/orgs_get_test_spec.py
+++ b/server/tests/endpoints/orgs/orgs_get_test_spec.py
@@ -1,4 +1,3 @@
-from typing import List, Dict, Any
from tests.shared_test_data import (
ORG1,
ORG2,
diff --git a/server/tests/endpoints/orgs/orgs_patch_test_spec.py b/server/tests/endpoints/orgs/orgs_patch_test_spec.py
index 0e17b90..58a45a3 100644
--- a/server/tests/endpoints/orgs/orgs_patch_test_spec.py
+++ b/server/tests/endpoints/orgs/orgs_patch_test_spec.py
@@ -1,5 +1,3 @@
-import pytest
-
from tests.shared_test_data import (
ORG1,
ORG2,
@@ -21,17 +19,20 @@
"id": str(ORG1["_id"]),
"request_body": {
"name": "Hoo Inc",
+ "oauth_domain": "you.ai",
"access_keys": {"ClosedAI": "666"},
},
},
"expected": {
**ORG1,
"name": "Hoo Inc",
+ "oauth_domain": "you.ai",
"access_keys": {"openai_api_key": "**********", "ClosedAI": "**********"},
},
"expected_db": {
**ORG1,
"name": "Hoo Inc",
+ "oauth_domain": "you.ai",
"access_keys": {**ORG1["access_keys"], "ClosedAI": "666"},
},
},
diff --git a/server/tests/endpoints/orgs/orgs_post_test_spec.py b/server/tests/endpoints/orgs/orgs_post_test_spec.py
index be07f3e..9aec3bb 100644
--- a/server/tests/endpoints/orgs/orgs_post_test_spec.py
+++ b/server/tests/endpoints/orgs/orgs_post_test_spec.py
@@ -1,5 +1,3 @@
-import pytest
-
from tests.shared_test_data import (
USER_BASIC,
USER_ORG_ADMIN,
@@ -15,6 +13,7 @@
"input": {
"request_body": {
"name": " org name ",
+ "oauth_domain": "prompton.ai",
"access_keys": {"OpenAI": "1234567890"},
}
},
@@ -22,6 +21,7 @@
"created_by_user_id": USER_SUPER_ADMIN["_id"],
"created_by_org_id": USER_SUPER_ADMIN["org_id"],
"name": "org name",
+ "oauth_domain": "prompton.ai",
"access_keys": {"OpenAI": "1234567890"},
},
},
@@ -33,6 +33,7 @@
"created_by_user_id": USER_SUPER_ADMIN["_id"],
"created_by_org_id": USER_SUPER_ADMIN["org_id"],
"name": "org x",
+ "oauth_domain": None,
"access_keys": None,
},
},
diff --git a/server/tests/endpoints/orgs/test_orgs_get_gen.py b/server/tests/endpoints/orgs/test_orgs_get_gen.py
index 326cc99..b4ace4f 100644
--- a/server/tests/endpoints/orgs/test_orgs_get_gen.py
+++ b/server/tests/endpoints/orgs/test_orgs_get_gen.py
@@ -8,7 +8,6 @@
generate_pytest_get,
generate_pytest_get_empty,
)
-from tests.shared_test_data import USER_SUPER_ADMIN
test_orgs_get = generate_pytest_get("/orgs", test_db_data, test_specs_get)
diff --git a/server/tests/endpoints/promptVersions/promptVersions_patch_test_spec.py b/server/tests/endpoints/promptVersions/promptVersions_patch_test_spec.py
index 5206fd7..064dfa0 100644
--- a/server/tests/endpoints/promptVersions/promptVersions_patch_test_spec.py
+++ b/server/tests/endpoints/promptVersions/promptVersions_patch_test_spec.py
@@ -1,7 +1,8 @@
from tests.shared_test_data import (
DEFAULT_MODEL_CONFIG,
USER_BASIC,
- USER_BASIC_ORG2,
+ USER_PROMPT_ADMIN,
+ USER_PROMPT_ADMIN_ORG2,
)
from tests.endpoints.promptVersions.promptVersions_test_records import (
PROMPT_WITH_2_VER,
@@ -31,7 +32,7 @@
test_specs_patch: TestSpecList = [
{
"spec_id": "all fields on Draft",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": str(PROMPT_VER_DRAFT["_id"]),
"request_body": {
@@ -66,7 +67,7 @@
},
{
"spec_id": "description on Live",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": str(PROMPT_VER_LIVE["_id"]),
"request_body": {"description": "hah"},
@@ -75,7 +76,7 @@
},
{
"spec_id": "Live to Archived",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": str(PROMPT_VER_LIVE["_id"]),
"request_body": {"status": "Archived"},
@@ -84,7 +85,7 @@
},
{
"spec_id": "Draft to Live",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": str(PROMPT_VER_DRAFT["_id"]),
"request_body": {
@@ -112,7 +113,7 @@
# status change validations:
{
"spec_id": "no Live to Draft",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": str(PROMPT_VER_LIVE["_id"]),
"request_body": {"status": "Draft"},
@@ -121,7 +122,7 @@
},
{
"spec_id": "no Testing to Draft",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": str(PROMPT_VER_TESTING_EXTRA_FIELD["_id"]),
"request_body": {"status": "Draft"},
@@ -130,7 +131,7 @@
},
{
"spec_id": "no Archived to Draft",
- "mock_user": USER_BASIC_ORG2,
+ "mock_user": USER_PROMPT_ADMIN_ORG2,
"input": {
"id": str(PROMPT_VER_ARCHIVED_ORG2["_id"]),
"request_body": {"status": "Draft"},
@@ -139,7 +140,7 @@
},
{
"spec_id": "Live need template",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": PV_DRAFT_ID,
"request_body": {"status": "Live", "template": None, "model": "GPT-4"},
@@ -148,7 +149,7 @@
},
{
"spec_id": "Live need model",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": PV_DRAFT_ID,
"request_body": {"status": "Live", "model_config": {"model": None}},
@@ -160,7 +161,7 @@
#
{
"spec_id": "Live no model update",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": str(PROMPT_VER_LIVE["_id"]),
"request_body": {"model": "GPT-5"},
@@ -169,7 +170,7 @@
},
{
"spec_id": "Live no model_config update",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": str(PROMPT_VER_LIVE["_id"]),
"request_body": {"model_config": VALID_MODEL_CONFIG},
@@ -178,7 +179,7 @@
},
{
"spec_id": "Live no model_config None",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": str(PROMPT_VER_LIVE["_id"]),
"request_body": {"model_config": None},
@@ -187,7 +188,7 @@
},
{
"spec_id": "Live no template update",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": str(PROMPT_VER_LIVE["_id"]),
"request_body": {"template": [VALID_TEMPLATE]},
@@ -196,7 +197,7 @@
},
{
"spec_id": "Live no prompt_id update",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": str(PROMPT_VER_LIVE["_id"]),
"request_body": {"prompt_id": PROMPT_WITH_2_VER["_id"]},
@@ -205,7 +206,7 @@
},
{
"spec_id": "Live no name update",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"id": str(PROMPT_VER_LIVE["_id"]), "request_body": {"name": "oi"}},
"expected": 422,
},
@@ -214,7 +215,7 @@
#
{
"spec_id": "Archived no template update",
- "mock_user": USER_BASIC_ORG2,
+ "mock_user": USER_PROMPT_ADMIN_ORG2,
"input": {
"id": str(PROMPT_VER_ARCHIVED_ORG2["_id"]),
"request_body": {"template": [VALID_TEMPLATE]},
@@ -223,7 +224,7 @@
},
{
"spec_id": "Testing no template update",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": str(PROMPT_VER_TESTING_EXTRA_FIELD["_id"]),
"request_body": {"template": [VALID_TEMPLATE]},
@@ -235,25 +236,34 @@
#
{
"spec_id": "shouldn't update other org's prompt_version",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": str(PROMPT_VER_ARCHIVED_ORG2["_id"]),
"request_body": {"description": "x"},
},
"expected": 404,
},
+ {
+ "spec_id": "shouldn't update other org's prompt_version",
+ "mock_user": USER_BASIC,
+ "input": {
+ "id": str(PROMPT_VER_LIVE["_id"]),
+ "request_body": {"description": "hah"},
+ },
+ "expected": 403,
+ },
#
# test basic validations:
#
{
"spec_id": "invalid prompt_id",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"id": PV_DRAFT_ID, "request_body": {"prompt_id": "invalid"}},
"expected": 422,
},
{
"spec_id": "non existent prompt_id",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": PV_DRAFT_ID,
"request_body": {"prompt_id": "ffffffffffffffffffffffff"},
@@ -262,31 +272,31 @@
},
{
"spec_id": "invalid status",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"id": PV_DRAFT_ID, "request_body": {"status": "foo", "name": "blah"}},
"expected": 422,
},
{
"spec_id": "invalid extra field",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"id": PV_DRAFT_ID, "request_body": {"foo": "moo", "name": "blah"}},
"expected": 422,
},
{
"spec_id": "empty name",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"id": PV_DRAFT_ID, "request_body": {"name": ""}},
"expected": 422,
},
{
"spec_id": "name only whitespaces",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"id": PV_DRAFT_ID, "request_body": {"name": " \t \n "}},
"expected": 422,
},
{
"spec_id": "created_at non-editable",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": PV_DRAFT_ID,
"request_body": {"created_at": "2023-05-12T10:12:35.995000", "name": "b"},
@@ -295,19 +305,19 @@
},
{
"spec_id": "_id non-editable",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"id": PV_DRAFT_ID, "request_body": {"_id": "foo", "name": "blah"}},
"expected": 422,
},
{
"spec_id": "Template need one msg",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"id": PV_DRAFT_ID, "request_body": {"template": []}},
"expected": 422,
},
{
"spec_id": "Invalid model_config",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"id": PV_DRAFT_ID, "request_body": {"model_config": {"foo": "bar"}}},
"expected": 422,
},
diff --git a/server/tests/endpoints/promptVersions/promptVersions_post_test_spec.py b/server/tests/endpoints/promptVersions/promptVersions_post_test_spec.py
index ffa4991..23ab86d 100644
--- a/server/tests/endpoints/promptVersions/promptVersions_post_test_spec.py
+++ b/server/tests/endpoints/promptVersions/promptVersions_post_test_spec.py
@@ -2,7 +2,7 @@
PROMPT_WITH_1_VER,
PROMPT_WITH_1_VER_ORG2,
)
-from tests.shared_test_data import DEFAULT_MODEL_CONFIG, USER_BASIC
+from tests.shared_test_data import DEFAULT_MODEL_CONFIG, USER_BASIC, USER_PROMPT_ADMIN
from tests.utils import TestSpecList
test_db_data = {"prompts": [PROMPT_WITH_1_VER, PROMPT_WITH_1_VER_ORG2]}
@@ -20,7 +20,7 @@
"model_config": VALID_CONFIG,
}
-MIN_VALID_TESTING = {**MIN_VALID_LIVE, "status": "Testing"} # type: ignore[arg-type]
+MIN_VALID_TESTING = {**MIN_VALID_LIVE, "status": "Testing"}
DRAFT_FULL_PROMPT_VER = {
"status": "Draft",
@@ -33,14 +33,14 @@
}
EXPECTED_CREATED_BY = {
- "created_by_user_id": "aaaaaaaaaaaaaaaaaaaaaaa1",
- "created_by_org_id": "bbbbbbbbbbbbbbbbbbbbbbb1",
+ "created_by_user_id": USER_PROMPT_ADMIN["_id"],
+ "created_by_org_id": USER_PROMPT_ADMIN["org_id"],
}
test_specs_post: TestSpecList = [
{
"spec_id": "draft all fields",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": DRAFT_FULL_PROMPT_VER},
"expected": {
**DRAFT_FULL_PROMPT_VER,
@@ -51,7 +51,7 @@
},
{
"spec_id": "draft min fields",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {"name": " t2 ", "prompt_id": VALID_PROMPT_ID}},
"expected": {
**EXPECTED_CREATED_BY,
@@ -60,21 +60,20 @@
"description": None,
"prompt_id": VALID_PROMPT_ID,
"provider": "OpenAI",
- "template": None,
+ "template": [],
"model_config": None,
"template_arg_names": [],
},
},
{
"spec_id": "Testing no model_config",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": MIN_VALID_TESTING},
"expected": {
**EXPECTED_CREATED_BY,
**MIN_VALID_TESTING,
"provider": "OpenAI",
"description": None,
- "model_config": VALID_CONFIG,
"template": [{**VALID_TEMPLATE, "name": None}],
"model_config": {**DEFAULT_MODEL_CONFIG, **VALID_CONFIG},
"template_arg_names": ["var"],
@@ -82,7 +81,7 @@
},
{
"spec_id": "Live",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": MIN_VALID_LIVE},
"expected": {
**EXPECTED_CREATED_BY,
@@ -99,7 +98,7 @@
#
{
"spec_id": "shouldn't create prompt_version for other org's prompt",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"request_body": {
**DRAFT_FULL_PROMPT_VER,
@@ -108,17 +107,23 @@
},
"expected": 404,
},
+ {
+ "spec_id": "basic role shouldn't create prompt_version",
+ "mock_user": USER_BASIC,
+ "input": {"request_body": {"name": " t2 ", "prompt_id": VALID_PROMPT_ID}},
+ "expected": 403,
+ },
# requests validations
#
{
"spec_id": "missing prompt_id field",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {"name": "x"}},
"expected": 422,
},
{
"spec_id": "non existing prompt_id",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"request_body": {**MIN_VALID, "prompt_id": "ffffffffffffffffffffffff"}
},
@@ -126,13 +131,13 @@
},
{
"spec_id": "invalid prompt_id",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {**MIN_VALID, "prompt_id": "x"}},
"expected": 422,
},
{
"spec_id": "missing name field",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"request_body": {**MIN_VALID, "name": None, "prompt_id": VALID_PROMPT_ID}
},
@@ -140,7 +145,7 @@
},
{
"spec_id": "empty name field",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"request_body": {**MIN_VALID, "name": " ", "prompt_id": VALID_PROMPT_ID}
},
@@ -148,31 +153,31 @@
},
{
"spec_id": "created_at non-editable",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {**MIN_VALID, "created_at": "2023-05-12T10:12:35"}},
"expected": 422,
},
{
"spec_id": "_id non-editable",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {**MIN_VALID, "_id": "ffffffffffffffffffffffff"}},
"expected": 422,
},
{
"spec_id": "model_config string",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {**MIN_VALID, "model_config": "x"}},
"expected": 422,
},
{
"spec_id": "invalid extra field",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {**MIN_VALID, "foo": "moo"}},
"expected": 422,
},
{
"spec_id": "invalid provider",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {**MIN_VALID, "provider": "ClosedAI"}},
"expected": 422,
},
@@ -181,7 +186,7 @@
#
{
"spec_id": "Live missing model",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"request_body": {**MIN_VALID_LIVE, "model_config": {"temperature": 1}}
},
@@ -189,25 +194,25 @@
},
{
"spec_id": "Live none model",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {**MIN_VALID_LIVE, "model_config": {"model": None}}},
"expected": 422,
},
{
"spec_id": "Live empty model",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {**MIN_VALID_LIVE, "model_config": {"model": ""}}},
"expected": 422,
},
{
"spec_id": "Live none template",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {**MIN_VALID_LIVE, "template": None}},
"expected": 422,
},
{
"spec_id": "Testing template update",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {**MIN_VALID_TESTING, "template": None}},
"expected": 422,
},
@@ -216,7 +221,7 @@
#
{
"spec_id": "template missing role",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"request_body": {**MIN_VALID, "template": [{"content": "x", "name": "y"}]}
},
@@ -224,7 +229,7 @@
},
{
"spec_id": "template missing content",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"request_body": {**MIN_VALID, "template": [{"role": "user", "name": "y"}]}
},
@@ -232,7 +237,7 @@
},
{
"spec_id": "template invalid role",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"request_body": {**MIN_VALID, "template": [{"role": "x", "content": "y"}]}
},
@@ -240,7 +245,7 @@
},
{
"spec_id": "template extra field",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"request_body": {**MIN_VALID, "template": [{**VALID_TEMPLATE, "foo": 1}]}
},
@@ -248,13 +253,13 @@
},
{
"spec_id": "template empty array",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {**MIN_VALID, "template": []}},
"expected": 422,
},
{
"spec_id": "template empty json",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {**MIN_VALID, "template": [{}]}},
"expected": 422,
},
@@ -263,19 +268,19 @@
#
{
"spec_id": "empty json",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {}},
"expected": 422,
},
{
"spec_id": "empty body",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": ""},
"expected": 422,
},
{
"spec_id": "None body",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": None},
"expected": 422,
},
diff --git a/server/tests/endpoints/promptVersions/promptVersions_test_records.py b/server/tests/endpoints/promptVersions/promptVersions_test_records.py
index b6517c6..d80811a 100644
--- a/server/tests/endpoints/promptVersions/promptVersions_test_records.py
+++ b/server/tests/endpoints/promptVersions/promptVersions_test_records.py
@@ -82,7 +82,7 @@
"description": None,
"prompt_id": PROMPT_WITH_1_VER["_id"],
"provider": "OpenAI",
- "template": None,
+ "template": [],
"model_config": None,
"template_arg_names": [],
}
diff --git a/server/tests/endpoints/prompts/prompts_get_test_spec.py b/server/tests/endpoints/prompts/prompts_get_test_spec.py
index 558ac4f..eb074ae 100644
--- a/server/tests/endpoints/prompts/prompts_get_test_spec.py
+++ b/server/tests/endpoints/prompts/prompts_get_test_spec.py
@@ -9,7 +9,7 @@
USER_ORG_ADMIN,
USER_SUPER_ADMIN,
)
-from tests.utils import MockDBData, TestSpecList, remove_props
+from tests.utils import TestSpecList, remove_props
test_db_data = {
"prompts": [
diff --git a/server/tests/endpoints/prompts/prompts_patch_test_spec.py b/server/tests/endpoints/prompts/prompts_patch_test_spec.py
index 37dd6b4..3f08856 100644
--- a/server/tests/endpoints/prompts/prompts_patch_test_spec.py
+++ b/server/tests/endpoints/prompts/prompts_patch_test_spec.py
@@ -1,4 +1,4 @@
-from tests.shared_test_data import USER_BASIC
+from tests.shared_test_data import USER_BASIC, USER_PROMPT_ADMIN
from tests.endpoints.prompts.prompts_test_records import (
PROMPT_MIN_FIELDS,
PROMPT_ARCHIVED_ORG2,
@@ -11,7 +11,7 @@
test_specs_patch: TestSpecList = [
{
"spec_id": "all fields",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": PROMPT_MIN_FIELDS["_id"],
"request_body": {"status": "Archived", "name": "n", "description": "de"},
@@ -25,7 +25,7 @@
},
{
"spec_id": "no description",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": PROMPT_MIN_FIELDS["_id"],
"request_body": {"description": None},
@@ -34,7 +34,7 @@
},
{
"spec_id": "archive status",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": PROMPT_MIN_FIELDS["_id"],
"request_body": {"status": "Archived", "name": "archive item"},
@@ -43,7 +43,7 @@
},
{
"spec_id": "no status",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"id": PROMPT_MIN_FIELDS["_id"], "request_body": {"name": "no stat"}},
"expected": {**PROMPT_MIN_FIELDS, "name": "no stat"},
},
@@ -52,25 +52,34 @@
#
{
"spec_id": "shouldn't update other org's prompt",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": PROMPT_ARCHIVED_ORG2["_id"],
"request_body": {"description": "x"},
},
"expected": 404,
},
+ {
+ "spec_id": "basic shouln't update other org's prompt",
+ "mock_user": USER_BASIC,
+ "input": {
+ "id": PROMPT_MIN_FIELDS["_id"],
+ "request_body": {"description": "x"},
+ },
+ "expected": 403,
+ },
#
# Invalid requests
#
{
"spec_id": "invalid status",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"id": PROMPT_MIN_FIELDS["_id"], "request_body": {"status": "x"}},
"expected": 422,
},
{
"spec_id": "invalid extra field",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": PROMPT_MIN_FIELDS["_id"],
"request_body": {"foo": "x", "name": "x"},
@@ -79,7 +88,7 @@
},
{
"spec_id": "created_at non-editable",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": PROMPT_MIN_FIELDS["_id"],
"request_body": {"created_at": "2023-05-12T10:12:35.995000", "name": "b"},
@@ -88,7 +97,7 @@
},
{
"spec_id": "_id non-editable",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"id": PROMPT_MIN_FIELDS["_id"],
"request_body": {"_id": "foo", "name": "b"},
@@ -97,7 +106,7 @@
},
{
"spec_id": "none name fielde",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"id": PROMPT_MIN_FIELDS["_id"], "request_body": {"name": None}},
"expected": 422,
},
diff --git a/server/tests/endpoints/prompts/prompts_post_test_spec.py b/server/tests/endpoints/prompts/prompts_post_test_spec.py
index bf7769d..4224014 100644
--- a/server/tests/endpoints/prompts/prompts_post_test_spec.py
+++ b/server/tests/endpoints/prompts/prompts_post_test_spec.py
@@ -1,15 +1,13 @@
-from typing import Any, Dict, List
from bson import ObjectId
-import pytest
-from tests.shared_test_data import USER_BASIC
+from tests.shared_test_data import USER_BASIC, USER_PROMPT_ADMIN
from tests.utils import TestSpecList
test_specs_post: TestSpecList = [
{
"spec_id": "all fields",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {
"request_body": {
"status": "Active",
@@ -18,8 +16,8 @@
}
},
"expected": {
- "created_by_user_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaaa1"),
- "created_by_org_id": ObjectId("bbbbbbbbbbbbbbbbbbbbbbb1"),
+ "created_by_user_id": USER_PROMPT_ADMIN["_id"],
+ "created_by_org_id": USER_PROMPT_ADMIN["org_id"],
"status": "Active",
"name": "all fields",
"description": "descri",
@@ -27,11 +25,11 @@
},
{
"spec_id": "no description",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {"status": "Active", "name": "no description"}},
"expected": {
- "created_by_user_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaaa1"),
- "created_by_org_id": ObjectId("bbbbbbbbbbbbbbbbbbbbbbb1"),
+ "created_by_user_id": USER_PROMPT_ADMIN["_id"],
+ "created_by_org_id": USER_PROMPT_ADMIN["org_id"],
"status": "Active",
"name": "no description",
"description": None,
@@ -39,11 +37,11 @@
},
{
"spec_id": "archive status",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {"status": "Archived", "name": "archive item"}},
"expected": {
- "created_by_user_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaaa1"),
- "created_by_org_id": ObjectId("bbbbbbbbbbbbbbbbbbbbbbb1"),
+ "created_by_user_id": USER_PROMPT_ADMIN["_id"],
+ "created_by_org_id": USER_PROMPT_ADMIN["org_id"],
"status": "Archived",
"name": "archive item",
"description": None,
@@ -51,76 +49,85 @@
},
{
"spec_id": "no status",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {"name": "no status item"}},
"expected": {
- "created_by_user_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaaa1"),
- "created_by_org_id": ObjectId("bbbbbbbbbbbbbbbbbbbbbbb1"),
+ "created_by_user_id": USER_PROMPT_ADMIN["_id"],
+ "created_by_org_id": USER_PROMPT_ADMIN["org_id"],
"status": "Active",
"name": "no status item",
"description": None,
},
},
#
+ # Permissions check
+ #
+ {
+ "spec_id": "BASIC role shouldn't add prompts",
+ "mock_user": USER_BASIC,
+ "input": {"request_body": {"status": "Active", "name": "no description"}},
+ "expected": 403,
+ },
+ #
# Invalid requests
#
{
"spec_id": "invalid status",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {"status": "foo", "name": "blah"}},
"expected": 422,
},
{
"spec_id": "missing name field",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {"status": "Active"}},
"expected": 422,
},
{
"spec_id": "none name field",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {"status": "Active", "name": None}},
"expected": 422,
},
{
"spec_id": "empty name field",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {"name": " "}},
"expected": 422,
},
{
"spec_id": "invalid extra field",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {"foo": "moo", "name": "blah"}},
"expected": 422,
},
{
"spec_id": "created_at non-editable",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {"created_at": "2023-05-12T10:12:35", "name": "b"}},
"expected": 422,
},
{
"spec_id": "_id non-editable",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {"_id": "ffffffffffffffffffffffff", "name": "blah"}},
"expected": 422,
},
{
"spec_id": "empty json",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": {}},
"expected": 422,
},
{
"spec_id": "empty string",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": ""},
"expected": 422,
},
{
"spec_id": "None",
- "mock_user": USER_BASIC,
+ "mock_user": USER_PROMPT_ADMIN,
"input": {"request_body": None},
"expected": 422,
},
diff --git a/server/tests/endpoints/root/test_root.py b/server/tests/endpoints/root/test_root.py
index 30d1ac1..2bd3eca 100644
--- a/server/tests/endpoints/root/test_root.py
+++ b/server/tests/endpoints/root/test_root.py
@@ -1,6 +1,5 @@
import pytest
from httpx import AsyncClient
-from deepdiff import DeepDiff
@pytest.mark.anyio
diff --git a/server/tests/endpoints/test_generators/post_test_genarator.py b/server/tests/endpoints/test_generators/post_test_genarator.py
index 1373bfb..6719124 100644
--- a/server/tests/endpoints/test_generators/post_test_genarator.py
+++ b/server/tests/endpoints/test_generators/post_test_genarator.py
@@ -27,14 +27,19 @@ def generate_pytest_post(
0. calls each fixture in `additional_fixture_names` param if provided (mostly for extra mocks eg. `mock_get_hashed_password`)
1. mocks db data using `mock_db_data` if None passed it mocks with an empty DB
2. mocks user based on `test_specs_post[].mock_user`
- 3. calls endpoint PATCH with url param `test_specs_post[].input.id`,
+ 3. calls endpoint POST with url param `test_specs_post[].input.id`,
uses request body defined in `test_specs_post[].input.request_body`
- 4. compares response to expected data (DeepDiff)
- If expected is int then it only validates response_code against it (used for testing validation errors)
+ 4. If expected is int then it only validates response_code against it (used for testing validation errors)
+ DOES NOT compare response data to expected data
5. If `collection_name` is not None it Reads db record from `collection_name` by `test_specs_post[].input.id`
6. Compares db data vs. `test_specs_post[].expected` .
if `test_specs_post[].expected_db` is provided then it compares against that instead of `test_specs_post[].expected`.
+ Custom DB validation:
+ Set `test_specs_post[x].expected_db` in `TestSpec` to a `CustomValidatorFn` type.
+ This function will be called with the `actual_db` .
+ It should return True or False but better to do assert within the function so easier to find where test failed.
+
Test name is generated from `endpoint_path` if not provided.
"""
if not test_name:
@@ -48,7 +53,7 @@ def generate_pytest_post(
@pytest.mark.parametrize("mock_db", [mock_db_data], indirect=True)
@pytest.mark.anyio
async def test_func(endpoint: AsyncClient, mock_db, mock_user, test_spec, request):
- # TODO: clean this up: refactor TestSpec into expected.response, expected.status_code, expected.db structure & test only against which is provided
+ # TODO: clean this up: refactor TestSpec into expected.response, expected.status_code, expected.db structure & test only against which is provided. Or try to find a framework? PyRest-Python or similar?
#
# Prepare
#
@@ -63,7 +68,7 @@ async def test_func(endpoint: AsyncClient, mock_db, mock_user, test_spec, reques
expected_response = bson_to_json(test_spec["expected"])
print(" --> expected response:", json.dumps(expected_response, indent=4))
- expected_db = bson_to_json(test_spec.get("expected_db", expected_response))
+ expected_db_json = bson_to_json(test_spec.get("expected_db", expected_response))
input_id = input.get("id")
url = f"{endpoint_path}/{input_id}" if input_id else endpoint_path
@@ -86,7 +91,9 @@ async def test_func(endpoint: AsyncClient, mock_db, mock_user, test_spec, reques
f" <-- Response status code: {response.status_code}\n Response data:\n{json.dumps(response_data, indent=4)}"
)
- # TODO: test expected response data vs. actual response data - ignore values for DeepDiff which are passed as type and only do typecheck
+ # TODO: test expected response data vs. actual response data - ignore values for DeepDiff which are passed as type and only do typecheck.
+ if callable(expected_response):
+ assert expected_response(expected_response, response_data)
#
# EXPECTED status_code vs actual
@@ -109,28 +116,30 @@ async def test_func(endpoint: AsyncClient, mock_db, mock_user, test_spec, reques
actual_db = await mock_db[collection_name].find_one(
{"_id": ObjectId(resp_id)}
)
- actual_db = bson_to_json(actual_db)
- print(" <-- DB data: ", json.dumps(actual_db, indent=4))
- if isinstance(actual_db, dict) and isinstance(expected_db, dict):
+ actual_db_json = bson_to_json(actual_db)
+ print(" <-- DB data: ", json.dumps(actual_db_json, indent=4))
+
+ if callable(test_spec.get("expected_db", None)):
+ custom_db_validator = test_spec["expected_db"]
print(
- " !!!***",
- type(actual_db.get("role")),
- type(expected_db.get("role")),
+ " <--- calling CustomValidatorFn specified in TestSpec with actual_db"
)
-
- assert_base_db_records(resp_id, actual_db)
- diff = DeepDiff(
- expected_db,
- actual_db,
- ignore_order=True,
- exclude_paths=[
- "created_at",
- "_id",
- "root['response']['completition_duration_seconds']", # khmm...
- ],
- )
- print(" *** db data vs. expected diff: \n", diff.pretty())
- assert diff == {}, "response data and db should match"
+ assert custom_db_validator(actual_db)
+
+ else:
+ assert_base_db_records(resp_id, actual_db_json)
+ diff = DeepDiff(
+ expected_db_json,
+ actual_db_json,
+ ignore_order=True,
+ exclude_paths=[
+ "created_at",
+ "_id",
+ "root['response']['completition_duration_seconds']", # khmm...
+ ],
+ )
+ print(" *** db data vs. expected diff: \n", diff.pretty())
+ assert diff == {}, "response data and db should match"
test_func.__name__ = f"test_{test_name}_post"
return test_func
diff --git a/server/tests/endpoints/test_invalid_item_ids.py b/server/tests/endpoints/test_invalid_item_ids.py
index 7e12cab..86752a2 100644
--- a/server/tests/endpoints/test_invalid_item_ids.py
+++ b/server/tests/endpoints/test_invalid_item_ids.py
@@ -33,7 +33,14 @@
]
endpoints = {
- "GET": ["/prompts", "/promptVersions", "/inferences", "/orgs", "/users"],
+ "GET": [
+ "/prompts",
+ "/promptVersions",
+ "/inferences",
+ "/orgs",
+ "/users",
+ "/feedbacks",
+ ],
"PATCH": ["/promptVersions", "/prompts", "/orgs"]
# TODO: add "/users" when user's PATCH implemented
# "DELETE": ["/prompts", "/promptVersions"]
diff --git a/server/tests/endpoints/users/user_get_test_spec.py b/server/tests/endpoints/users/user_get_test_spec.py
index 1da4444..ec41304 100644
--- a/server/tests/endpoints/users/user_get_test_spec.py
+++ b/server/tests/endpoints/users/user_get_test_spec.py
@@ -1,6 +1,4 @@
-import copy
-import json
-from typing import Any, Dict, List
+from typing import Any, Dict
from bson import ObjectId
from tests.shared_test_data import (
diff --git a/server/tests/endpoints/users/user_post_test_spec.py b/server/tests/endpoints/users/user_post_test_spec.py
index cd23904..78b3776 100644
--- a/server/tests/endpoints/users/user_post_test_spec.py
+++ b/server/tests/endpoints/users/user_post_test_spec.py
@@ -1,6 +1,4 @@
-from typing import Any, Dict, List
-from bson import ObjectId
-import pytest
+from typing import Any, Dict
from tests.shared_test_data import (
ORG1,
@@ -127,7 +125,7 @@
"spec_id": "Duplicate email",
"mock_user": USER_ORG_ADMIN,
"input": {"request_body": {**MIN_VALID, "email": " basic@me.ai "}},
- "expected": 422,
+ "expected": 409,
},
#
# Format validations
diff --git a/server/tests/shared_test_data.py b/server/tests/shared_test_data.py
index 31fa6f4..918f272 100644
--- a/server/tests/shared_test_data.py
+++ b/server/tests/shared_test_data.py
@@ -14,7 +14,12 @@
"logit_bias": None,
}
-DEFAULT_RAW_COMPLETITION_REQUEST = {**DEFAULT_MODEL_CONFIG, "n": 1, "stream": False} # type: ignore[arg-type]
+DEFAULT_RAW_COMPLETITION_REQUEST = {
+ **DEFAULT_MODEL_CONFIG,
+ "n": 1,
+ "stream": False,
+ "user": None,
+}
ORG_ID1 = ObjectId("bbbbbbbbbbbbbbbbbbbbbbb1")
@@ -26,6 +31,7 @@
"created_by_user_id": ObjectId("645d786f180786983c9eede6"),
"created_by_org_id": ObjectId("ffffffffffffffffffffffff"),
"name": "org1",
+ "oauth_domain": "me.ai",
"access_keys": {"openai_api_key": "1234567890"},
}
@@ -36,17 +42,32 @@
"created_by_user_id": ObjectId("645d786f180786983c9eede6"),
"created_by_org_id": ObjectId("ffffffffffffffffffffffff"),
"name": "org2",
+ "oauth_domain": None,
"access_keys": None,
}
USER_BASIC: Dict[str, Any] = {
"_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaaa1"),
+ "created_at": "2021-05-15T15:46:02.051309",
"org_id": ORG_ID1,
"created_by_user_id": ObjectId("645d786f180786983c9eede6"),
"created_by_org_id": ObjectId("ccccccccccccccccccccccc1"),
"email": "basic@me.ai",
"role": "Basic",
+ "disabled": False,
+ "hashed_password": "$2b$12$JhlMpZQbm09aYUqpgz4gjOBD9k/vOE0QfgzXBMCwpbRbINDEScCY6",
+}
+
+USER_PROMPT_ADMIN: Dict[str, Any] = {
+ "_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaaa2"),
+ "created_at": "2021-05-15T15:46:02.051309",
+ "org_id": ORG_ID1,
+ "created_by_user_id": ObjectId("645d786f180786983c9eede6"),
+ "created_by_org_id": ObjectId("ccccccccccccccccccccccc1"),
+ "email": "promptadmin@me.ai",
+ "role": "PromptAdmin",
+ "disabled": False,
"hashed_password": "$2b$12$JhlMpZQbm09aYUqpgz4gjOBD9k/vOE0QfgzXBMCwpbRbINDEScCY6",
}
@@ -54,7 +75,8 @@
DEFAULT_MOCKED_USER = USER_BASIC
USER_BASIC_ORG2 = {
- "_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaaa2"),
+ "_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaaa3"),
+ "created_at": "2021-05-15T15:46:02.051309",
"org_id": ORG_ID2,
"created_by_user_id": ObjectId("645d786f180786983c9eede6"),
"created_by_org_id": ObjectId("ccccccccccccccccccccccc1"),
@@ -62,8 +84,19 @@
"role": "Basic",
}
+USER_PROMPT_ADMIN_ORG2 = {
+ "_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaaa4"),
+ "created_at": "2021-05-15T15:46:02.051309",
+ "org_id": ORG_ID2,
+ "created_by_user_id": ObjectId("645d786f180786983c9eede6"),
+ "created_by_org_id": ObjectId("ccccccccccccccccccccccc1"),
+ "email": "promptadmin2@me.ai",
+ "role": "PromptAdmin",
+}
+
USER_ORG_ADMIN = {
- "_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaaa3"),
+ "_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaaa5"),
+ "created_at": "2021-05-15T15:46:02.051309",
"org_id": ORG_ID1,
"created_by_user_id": ObjectId("645d786f180786983c9eede6"),
"created_by_org_id": ObjectId("ccccccccccccccccccccccc1"),
@@ -73,7 +106,8 @@
}
USER_ORG_ADMIN_ORG2 = {
- "_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaaa4"),
+ "_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaaa6"),
+ "created_at": "2021-05-15T15:46:02.051309",
"org_id": ORG_ID2,
"created_by_user_id": ObjectId("645d786f180786983c9eede6"),
"created_by_org_id": ObjectId("ccccccccccccccccccccccc1"),
@@ -83,7 +117,8 @@
}
USER_SUPER_ADMIN = {
- "_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaaa5"),
+ "_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaaa7"),
+ "created_at": "2021-05-15T15:46:02.051309",
"org_id": ObjectId("ccccccccccccccccccccccc1"),
"created_by_user_id": ObjectId("645d786f180786983c9eede6"),
"created_by_org_id": ObjectId("ccccccccccccccccccccccc1"),
diff --git a/server/tests/utils.py b/server/tests/utils.py
index 97b3258..d1e065d 100644
--- a/server/tests/utils.py
+++ b/server/tests/utils.py
@@ -2,18 +2,13 @@
import copy
from enum import Enum
-import enum
-import json
import re
from types import NoneType
-from typing import Any, Callable, Coroutine, Dict, List, Optional, TypeVar, TypedDict
+from typing import Any, Callable, Coroutine, Dict, List, TypeVar, TypedDict
import bson
-from httpx import AsyncClient
-from datetime import datetime
-
from httpx import AsyncClient, Response as HttpxResponse
+from datetime import datetime
-from tests.shared_test_data import ORG2
MockDBData = Dict[str, List[Dict[str, Any]]]
@@ -25,16 +20,19 @@ class TestInput(TypedDict, total=False):
id: str
+CustomValidatorFn = Callable[[dict[str, Any]], bool]
+
+
class TestSpecMin(TypedDict):
spec_id: str
mock_user: Dict[str, Any] | None
input: TestInput
- expected: Dict[str, Any] | List[Any] | int
+ expected: Dict[str, Any] | List[Any] | int | CustomValidatorFn
class TestSpec(TestSpecMin, total=False):
mock_exception: Exception
- expected_db: Dict[str, Any] | List[Any]
+ expected_db: Dict[str, Any] | List[Any] | CustomValidatorFn
expected_status_code: int
@@ -125,11 +123,13 @@ def bson_obj_to_json(data):
return str(data)
-def bson_to_json(bson_dict: Dict[str, Any]) -> Dict[str, Any]:
+def bson_to_json(bson_dict: TListOrDict) -> TListOrDict:
"""convert ObjectIds and timestamps to str. Mostly used to prep data read from db for comparison with DeepDiff"""
- res: Dict[str, Any] = bson_obj_to_json(bson_dict) # pyright: ignore
- return res
- # return json.loads(json.dumps(bson_dict, default=lambda o: str(o)))
+ if isinstance(bson_dict, list):
+ return [bson_to_json(item) for item in bson_dict]
+ else:
+ res: Dict[str, Any] = bson_obj_to_json(bson_dict) # pyright: ignore
+ return res
def assert_base_db_records(expected_id, record):
diff --git a/tos.md b/tos.md
new file mode 100644
index 0000000..a10297a
--- /dev/null
+++ b/tos.md
@@ -0,0 +1,108 @@
+# PROMPTON TERMS OF SERVICE
+
+Last Updated: **27/Jun/2023**
+
+These terms of service ("Terms") apply to your access and use of **PromptOn** (the "Service"). Please read them carefully.
+
+## Accepting these Terms
+
+If you access or use the Service, it means you agree to be bound by all of the terms below. So, before you use the Service, please read all of the terms. If you don't agree to all of the terms below, please do not use the Service. Also, if a term does not make sense to you, please let us know by e-mailing **hello@prompton.ai**.
+
+## Changes to these Terms
+
+We reserve the right to modify these Terms at any time. For instance, we may need to change these Terms if we come out with a new feature or for some other reason.
+
+Whenever we make changes to these Terms, the changes are effective **5 days** after we post such revised Terms (indicated by revising the date at the top of these Terms) or upon your acceptance if we provide a mechanism for your immediate acceptance of the revised Terms (such as a click-through confirmation or acceptance button). It is your responsibility to check **PromptOn** for changes to these Terms.
+
+If you continue to use the Service after the revised Terms go into effect, then you have accepted the changes to these Terms.
+
+## Privacy Policy
+
+For information about how we collect and use information about users of the Service, please check out our privacy policy available at **http://www.prompton.ai/privacy_policy**.
+
+## Third-Party Services
+
+From time to time, we may provide you with links to third party websites or services that we do not own or control. Your use of the Service may also include the use of applications that are developed or owned by a third party. Your use of such third party applications, websites, and services is governed by that party's own terms of service or privacy policies. We encourage you to read the terms and conditions and privacy policy of any third party application, website or service that you visit or use.
+
+## Creating Accounts
+
+When you create an account or use another service to log in to the Service, you agree to maintain the security of your password and accept all risks of unauthorized access to any data or other information you provide to the Service.
+
+If you discover or suspect any Service security breaches, please let us know as soon as possible.
+
+## Your Content & Conduct
+
+Our Service allows you and other users to post, link and otherwise make available content. You are responsible for the content that you make available to the Service, including its legality, reliability, and appropriateness.
+
+When you post, link or otherwise make available content to the Service, you grant us the right and license to use, reproduce, modify, publicly perform, publicly display and distribute your content on or through the Service. We may format your content for display throughout the Service, but we will not edit or revise the substance of your content itself.
+
+Aside from our limited right to your content, you retain all of your rights to the content you post, link and otherwise make available on or through the Service.
+
+You can remove the content that you posted by deleting it. Once you delete your content, it will not appear on the Service, but copies of your deleted content may remain in our system or backups for some period of time. We will retain web server access logs for a maximum of five years and then delete them.
+
+You may not post, link and otherwise make available on or through the Service any of the following:
+
+* Content that is libelous, defamatory, bigoted, fraudulent or deceptive;
+* Content that is illegal or unlawful, that would otherwise create liability;
+* Content that may infringe or violate any patent, trademark, trade secret, copyright, right of privacy, right of publicity or other intellectual or other right of any party;
+* Mass or repeated promotions, political campaigning or commercial messages directed at users who do not follow you (SPAM);
+* Private information of any third party (e.g., addresses, phone numbers, email addresses, Social Security numbers and credit card numbers); and
+* Viruses, corrupted data or other harmful, disruptive or destructive files or code.
+
+Also, you agree that you will not do any of the following in connection with the Service or other users:
+
+* Use the Service in any manner that could interfere with, disrupt, negatively affect or inhibit other users from fully enjoying the Service or that could damage, disable, overburden or impair the functioning of the Service;
+* Impersonate or post on behalf of any person or entity or otherwise misrepresent your affiliation with a person or entity;
+* Collect any personal information about other users, or intimidate, threaten, stalk or otherwise harass other users of the Service;
+* Create an account or post any content if you are not over 13 years of age years of age; and
+* Circumvent or attempt to circumvent any filtering, security measures, rate limits or other features designed to protect the Service, users of the Service, or third parties.
+
+## **PromptOn** Materials
+
+We put a lot of effort into creating the Service including, the logo and all designs, text, graphics, pictures, information and other content (excluding your content). This property is owned by us or our licensors and it is protected by U.S. and international copyright laws. We grant you the right to use it.
+
+However, unless we expressly state otherwise, your rights do not include: (i) publicly performing or publicly displaying the Service; (ii) modifying or otherwise making any derivative uses of the Service or any portion thereof; (iii) using any data mining, robots or similar data gathering or extraction methods; (iv) downloading (other than page caching) of any portion of the Service or any information contained therein; (v) reverse engineering or accessing the Service in order to build a competitive product or service; or (vi) using the Service other than for its intended purposes. If you do any of this stuff, we may terminate your use of the Service.
+
+## Hyperlinks and Third Party Content
+
+You may create a hyperlink to the Service. But, you may not use, frame or utilize framing techniques to enclose any of our trademarks, logos or other proprietary information without our express written consent.
+
+**PromptOn** makes no claim or representation regarding, and accepts no responsibility for third party websites accessible by hyperlink from the Service or websites linking to the Service. When you leave the Service, you should be aware that these Terms and our policies no longer govern.
+
+If there is any content on the Service from you and others, we don't review, verify or authenticate it, and it may include inaccuracies or false information. We make no representations, warranties, or guarantees relating to the quality, suitability, truth, accuracy or completeness of any content contained in the Service. You acknowledge sole responsibility for and assume all risk arising from your use of or reliance on any content.
+
+## Unavoidable Legal Stuff
+
+THE SERVICE AND ANY OTHER SERVICE AND CONTENT INCLUDED ON OR OTHERWISE MADE AVAILABLE TO YOU THROUGH THE SERVICE ARE PROVIDED TO YOU ON AN AS IS OR AS AVAILABLE BASIS WITHOUT ANY REPRESENTATIONS OR WARRANTIES OF ANY KIND. WE DISCLAIM ANY AND ALL WARRANTIES AND REPRESENTATIONS (EXPRESS OR IMPLIED, ORAL OR WRITTEN) WITH RESPECT TO THE SERVICE AND CONTENT INCLUDED ON OR OTHERWISE MADE AVAILABLE TO YOU THROUGH THE SERVICE WHETHER ALLEGED TO ARISE BY OPERATION OF LAW, BY REASON OF CUSTOM OR USAGE IN THE TRADE, BY COURSE OF DEALING OR OTHERWISE.
+
+IN NO EVENT WILL **PROMPTON** BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY SPECIAL, INDIRECT, INCIDENTAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES OF ANY KIND ARISING OUT OF OR IN CONNECTION WITH THE SERVICE OR ANY OTHER SERVICE AND/OR CONTENT INCLUDED ON OR OTHERWISE MADE AVAILABLE TO YOU THROUGH THE SERVICE, REGARDLESS OF THE FORM OF ACTION, WHETHER IN CONTRACT, TORT, STRICT LIABILITY OR OTHERWISE, EVEN IF WE HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES OR ARE AWARE OF THE POSSIBILITY OF SUCH DAMAGES. OUR TOTAL LIABILITY FOR ALL CAUSES OF ACTION AND UNDER ALL THEORIES OF LIABILITY WILL BE LIMITED TO THE AMOUNT YOU PAID TO **PROMPTON**. THIS SECTION WILL BE GIVEN FULL EFFECT EVEN IF ANY REMEDY SPECIFIED IN THIS AGREEMENT IS DEEMED TO HAVE FAILED OF ITS ESSENTIAL PURPOSE.
+
+You agree to defend, indemnify and hold us harmless from and against any and all costs, damages, liabilities, and expenses (including attorneys' fees, costs, penalties, interest and disbursements) we incur in relation to, arising from, or for the purpose of avoiding, any claim or demand from a third party relating to your use of the Service or the use of the Service by any person using your account, including any claim that your use of the Service violates any applicable law or regulation, or the rights of any third party, and/or your violation of these Terms.
+
+## Copyright Complaints
+
+We take intellectual property rights seriously. In accordance with the Digital Millennium Copyright Act ("DMCA") and other applicable law, we have adopted a policy of terminating, in appropriate circumstances and, at our sole discretion, access to the service for users who are deemed to be repeat infringers.
+
+## Governing Law
+
+The validity of these Terms and the rights, obligations, and relations of the parties under these Terms will be construed and determined under and in accordance with the laws of the **[U.S. STATE NAME OR OTHER JURISDICTION]**, without regard to conflicts of law principles.
+
+## Jurisdiction
+
+You expressly agree that exclusive jurisdiction for any dispute with the Service or relating to your use of it, resides in the courts of the **United Kingdom** and you further agree and expressly consent to the exercise of personal jurisdiction in the courts of the **United Kingdom** located in **London, UK** in connection with any such dispute including any claim involving Service. You further agree that you and Service will not commence against the other a class action, class arbitration or other representative action or proceeding.
+
+## Termination
+
+If you breach any of these Terms, we have the right to suspend or disable your access to or use of the Service.
+
+## Entire Agreement
+
+These Terms constitute the entire agreement between you and **PromptOn** regarding the use of the Service, superseding any prior agreements between you and **PromptOn** relating to your use of the Service.
+
+## Feedback
+
+Please let us know what you think of the Service, these Terms and, in general, **PromptOn**. When you provide us with any feedback, comments or suggestions about the Service, these Terms and, in general, **PromptOn**, you irrevocably assign to us all of your right, title and interest in and to your feedback, comments and suggestions.
+
+## Questions & Contact Information
+
+Questions or comments about the Service may be directed to us at the email address **hello@prompton.ai*.
diff --git a/ui-examples/streamlit/justfile b/ui-examples/streamlit/justfile
deleted file mode 100644
index 8390f20..0000000
--- a/ui-examples/streamlit/justfile
+++ /dev/null
@@ -1,10 +0,0 @@
-# Scripts for Prompton Streamlit UI example
-
-default:
- just --list
-
-install:
- poetry install
-
-run:
- poetry run streamlit run main.py
\ No newline at end of file
diff --git a/ui-examples/streamlit/main.py b/ui-examples/streamlit/main.py
deleted file mode 100644
index 5c77f33..0000000
--- a/ui-examples/streamlit/main.py
+++ /dev/null
@@ -1,71 +0,0 @@
-import streamlit as st
-
-
-from prompton import client as prompton_client
-from prompton import errors as prompton_errors
-
-
-prompton_env = "http://127.0.0.1:8000/"
-# prompton_env = "https://staging.api.prompton.ai/"
-
-st.set_page_config(layout="wide", page_title="Prompton API Example")
-prompton = prompton_client.PromptonApi(environment=prompton_env)
-
-if "auth_token" not in st.session_state:
- st.session_state["auth_token"] = None
-
-if st.button("Click me"):
- st.success("Success message!")
-
-if not st.session_state["auth_token"]:
- with st.form("Login"):
- st.write("## Prompton Login ")
- st.write(prompton_env)
- email = st.text_input("email", key="email")
- password = st.text_input("Password", type="password", key="password")
-
- submitted = st.form_submit_button("Login")
-
- if submitted:
- try:
- with st.spinner("Authenticating..."):
- token = prompton.authentication.get_access_token(
- username=email, password=password
- )
-
- st.session_state["auth_token"] = token.access_token
-
- st.experimental_rerun()
-
- except prompton_errors.UnauthorizedError as e:
- st.error("😕 Login failed: " + str(e.body["detail"]))
- except prompton_errors.BadRequestError as e:
- st.error("😕 Bad request: " + str(e.body))
- except prompton_errors.UnprocessableEntityError as e:
- st.error("😕 Unprocessable entity: " + str(e.body))
-
- except Exception as e:
- st.error("😕 Error while trying to login: " + str(e))
-
-if st.session_state["auth_token"]:
- prompton = prompton_client.PromptonApi(
- environment=prompton_env, token=st.session_state["auth_token"]
- )
-
- my_org = prompton.orgs.get_current_user_org()
- my_user = prompton.users.get_current_user()
- my_role = my_user.role.value if my_user.role else "No role"
-
- st.write("# Prompton UI")
-
- st.write(f"{my_user.email} @ {my_org.name} ( { my_role} )")
-
- st.write("## My Prompts")
- with st.spinner("Loading prompts..."):
- my_prompts = prompton.prompts.get_prompt_list()
- st.write(my_prompts)
-
- st.write("## My Prompt Versions")
- with st.spinner("Loading versions..."):
- my_prompt_versions = prompton.prompt_versions.get_prompt_versions_list()
- st.write(my_prompt_versions)
diff --git a/ui-examples/streamlit/poetry.lock b/ui-examples/streamlit/poetry.lock
deleted file mode 100644
index c76355f..0000000
--- a/ui-examples/streamlit/poetry.lock
+++ /dev/null
@@ -1,1313 +0,0 @@
-# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand.
-
-[[package]]
-name = "altair"
-version = "5.0.1"
-description = "Vega-Altair: A declarative statistical visualization library for Python."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "altair-5.0.1-py3-none-any.whl", hash = "sha256:9f3552ed5497d4dfc14cf48a76141d8c29ee56eae2873481b4b28134268c9bbe"},
- {file = "altair-5.0.1.tar.gz", hash = "sha256:087d7033cb2d6c228493a053e12613058a5d47faf6a36aea3ff60305fd8b4cb0"},
-]
-
-[package.dependencies]
-jinja2 = "*"
-jsonschema = ">=3.0"
-numpy = "*"
-pandas = ">=0.18"
-toolz = "*"
-typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""}
-
-[package.extras]
-dev = ["black (<24)", "hatch", "ipython", "m2r", "mypy", "pandas-stubs", "pytest", "pytest-cov", "ruff", "types-jsonschema", "types-setuptools", "vega-datasets", "vl-convert-python"]
-doc = ["docutils", "geopandas", "jinja2", "myst-parser", "numpydoc", "pillow", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinxext-altair"]
-
-[[package]]
-name = "anyio"
-version = "3.7.0"
-description = "High level compatibility layer for multiple asynchronous event loop implementations"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "anyio-3.7.0-py3-none-any.whl", hash = "sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0"},
- {file = "anyio-3.7.0.tar.gz", hash = "sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce"},
-]
-
-[package.dependencies]
-exceptiongroup = {version = "*", markers = "python_version < \"3.11\""}
-idna = ">=2.8"
-sniffio = ">=1.1"
-
-[package.extras]
-doc = ["Sphinx (>=6.1.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme", "sphinxcontrib-jquery"]
-test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"]
-trio = ["trio (<0.22)"]
-
-[[package]]
-name = "attrs"
-version = "23.1.0"
-description = "Classes Without Boilerplate"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"},
- {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"},
-]
-
-[package.extras]
-cov = ["attrs[tests]", "coverage[toml] (>=5.3)"]
-dev = ["attrs[docs,tests]", "pre-commit"]
-docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"]
-tests = ["attrs[tests-no-zope]", "zope-interface"]
-tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"]
-
-[[package]]
-name = "blinker"
-version = "1.6.2"
-description = "Fast, simple object-to-object and broadcast signaling"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "blinker-1.6.2-py3-none-any.whl", hash = "sha256:c3d739772abb7bc2860abf5f2ec284223d9ad5c76da018234f6f50d6f31ab1f0"},
- {file = "blinker-1.6.2.tar.gz", hash = "sha256:4afd3de66ef3a9f8067559fb7a1cbe555c17dcbe15971b05d1b625c3e7abe213"},
-]
-
-[[package]]
-name = "cachetools"
-version = "5.3.1"
-description = "Extensible memoizing collections and decorators"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"},
- {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"},
-]
-
-[[package]]
-name = "certifi"
-version = "2023.5.7"
-description = "Python package for providing Mozilla's CA Bundle."
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"},
- {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"},
-]
-
-[[package]]
-name = "charset-normalizer"
-version = "3.1.0"
-description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
-optional = false
-python-versions = ">=3.7.0"
-files = [
- {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"},
- {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"},
-]
-
-[[package]]
-name = "click"
-version = "8.1.3"
-description = "Composable command line interface toolkit"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"},
- {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"},
-]
-
-[package.dependencies]
-colorama = {version = "*", markers = "platform_system == \"Windows\""}
-
-[[package]]
-name = "colorama"
-version = "0.4.6"
-description = "Cross-platform colored terminal text."
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
-files = [
- {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
- {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
-]
-
-[[package]]
-name = "decorator"
-version = "5.1.1"
-description = "Decorators for Humans"
-optional = false
-python-versions = ">=3.5"
-files = [
- {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"},
- {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"},
-]
-
-[[package]]
-name = "dnspython"
-version = "2.1.0"
-description = "DNS toolkit"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "dnspython-2.1.0-py3-none-any.whl", hash = "sha256:95d12f6ef0317118d2a1a6fc49aac65ffec7eb8087474158f42f26a639135216"},
- {file = "dnspython-2.1.0.zip", hash = "sha256:e4a87f0b573201a0f3727fa18a516b055fd1107e0e5477cded4a2de497df1dd4"},
-]
-
-[package.extras]
-curio = ["curio (>=1.2)", "sniffio (>=1.1)"]
-dnssec = ["cryptography (>=2.6)"]
-doh = ["requests", "requests-toolbelt"]
-idna = ["idna (>=2.1)"]
-trio = ["sniffio (>=1.1)", "trio (>=0.14.0)"]
-
-[[package]]
-name = "email-validator"
-version = "2.0.0.post2"
-description = "A robust email address syntax and deliverability validation library."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "email_validator-2.0.0.post2-py3-none-any.whl", hash = "sha256:2466ba57cda361fb7309fd3d5a225723c788ca4bbad32a0ebd5373b99730285c"},
- {file = "email_validator-2.0.0.post2.tar.gz", hash = "sha256:1ff6e86044200c56ae23595695c54e9614f4a9551e0e393614f764860b3d7900"},
-]
-
-[package.dependencies]
-dnspython = ">=2.0.0"
-idna = ">=2.0.0"
-
-[[package]]
-name = "exceptiongroup"
-version = "1.1.1"
-description = "Backport of PEP 654 (exception groups)"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"},
- {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"},
-]
-
-[package.extras]
-test = ["pytest (>=6)"]
-
-[[package]]
-name = "gitdb"
-version = "4.0.10"
-description = "Git Object Database"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"},
- {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"},
-]
-
-[package.dependencies]
-smmap = ">=3.0.1,<6"
-
-[[package]]
-name = "gitpython"
-version = "3.1.31"
-description = "GitPython is a Python library used to interact with Git repositories"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "GitPython-3.1.31-py3-none-any.whl", hash = "sha256:f04893614f6aa713a60cbbe1e6a97403ef633103cdd0ef5eb6efe0deb98dbe8d"},
- {file = "GitPython-3.1.31.tar.gz", hash = "sha256:8ce3bcf69adfdf7c7d503e78fd3b1c492af782d58893b650adb2ac8912ddd573"},
-]
-
-[package.dependencies]
-gitdb = ">=4.0.1,<5"
-
-[[package]]
-name = "h11"
-version = "0.14.0"
-description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"},
- {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
-]
-
-[[package]]
-name = "httpcore"
-version = "0.17.2"
-description = "A minimal low-level HTTP client."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "httpcore-0.17.2-py3-none-any.whl", hash = "sha256:5581b9c12379c4288fe70f43c710d16060c10080617001e6b22a3b6dbcbefd36"},
- {file = "httpcore-0.17.2.tar.gz", hash = "sha256:125f8375ab60036db632f34f4b627a9ad085048eef7cb7d2616fea0f739f98af"},
-]
-
-[package.dependencies]
-anyio = ">=3.0,<5.0"
-certifi = "*"
-h11 = ">=0.13,<0.15"
-sniffio = "==1.*"
-
-[package.extras]
-http2 = ["h2 (>=3,<5)"]
-socks = ["socksio (==1.*)"]
-
-[[package]]
-name = "httpx"
-version = "0.24.1"
-description = "The next generation HTTP client."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "httpx-0.24.1-py3-none-any.whl", hash = "sha256:06781eb9ac53cde990577af654bd990a4949de37a28bdb4a230d434f3a30b9bd"},
- {file = "httpx-0.24.1.tar.gz", hash = "sha256:5853a43053df830c20f8110c5e69fe44d035d850b2dfe795e196f00fdb774bdd"},
-]
-
-[package.dependencies]
-certifi = "*"
-httpcore = ">=0.15.0,<0.18.0"
-idna = "*"
-sniffio = "*"
-
-[package.extras]
-brotli = ["brotli", "brotlicffi"]
-cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"]
-http2 = ["h2 (>=3,<5)"]
-socks = ["socksio (==1.*)"]
-
-[[package]]
-name = "idna"
-version = "3.4"
-description = "Internationalized Domain Names in Applications (IDNA)"
-optional = false
-python-versions = ">=3.5"
-files = [
- {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"},
- {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"},
-]
-
-[[package]]
-name = "importlib-metadata"
-version = "6.6.0"
-description = "Read metadata from Python packages"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"},
- {file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"},
-]
-
-[package.dependencies]
-zipp = ">=0.5"
-
-[package.extras]
-docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
-perf = ["ipython"]
-testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"]
-
-[[package]]
-name = "jinja2"
-version = "3.1.2"
-description = "A very fast and expressive template engine."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"},
- {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"},
-]
-
-[package.dependencies]
-MarkupSafe = ">=2.0"
-
-[package.extras]
-i18n = ["Babel (>=2.7)"]
-
-[[package]]
-name = "jsonschema"
-version = "4.17.3"
-description = "An implementation of JSON Schema validation for Python"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"},
- {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"},
-]
-
-[package.dependencies]
-attrs = ">=17.4.0"
-pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2"
-
-[package.extras]
-format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"]
-format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"]
-
-[[package]]
-name = "markdown-it-py"
-version = "2.2.0"
-description = "Python port of markdown-it. Markdown parsing, done right!"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"},
- {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"},
-]
-
-[package.dependencies]
-mdurl = ">=0.1,<1.0"
-
-[package.extras]
-benchmarking = ["psutil", "pytest", "pytest-benchmark"]
-code-style = ["pre-commit (>=3.0,<4.0)"]
-compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"]
-linkify = ["linkify-it-py (>=1,<3)"]
-plugins = ["mdit-py-plugins"]
-profiling = ["gprof2dot"]
-rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"]
-testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
-
-[[package]]
-name = "markupsafe"
-version = "2.1.3"
-description = "Safely add untrusted strings to HTML/XML markup."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"},
- {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"},
- {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"},
- {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"},
- {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"},
- {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"},
- {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"},
- {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"},
- {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"},
- {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"},
- {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"},
- {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"},
- {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"},
- {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"},
- {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"},
- {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"},
- {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"},
- {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"},
- {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"},
- {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"},
- {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"},
- {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"},
- {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"},
- {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"},
- {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"},
- {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"},
- {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"},
- {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"},
- {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"},
- {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"},
- {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"},
- {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"},
- {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"},
- {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"},
- {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"},
- {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"},
- {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"},
- {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"},
- {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"},
- {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"},
- {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"},
- {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"},
- {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"},
- {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"},
- {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"},
- {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"},
- {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"},
- {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"},
- {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"},
- {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"},
-]
-
-[[package]]
-name = "mdurl"
-version = "0.1.2"
-description = "Markdown URL utilities"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"},
- {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
-]
-
-[[package]]
-name = "mypy"
-version = "1.3.0"
-description = "Optional static typing for Python"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "mypy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c1eb485cea53f4f5284e5baf92902cd0088b24984f4209e25981cc359d64448d"},
- {file = "mypy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4c99c3ecf223cf2952638da9cd82793d8f3c0c5fa8b6ae2b2d9ed1e1ff51ba85"},
- {file = "mypy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:550a8b3a19bb6589679a7c3c31f64312e7ff482a816c96e0cecec9ad3a7564dd"},
- {file = "mypy-1.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cbc07246253b9e3d7d74c9ff948cd0fd7a71afcc2b77c7f0a59c26e9395cb152"},
- {file = "mypy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:a22435632710a4fcf8acf86cbd0d69f68ac389a3892cb23fbad176d1cddaf228"},
- {file = "mypy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6e33bb8b2613614a33dff70565f4c803f889ebd2f859466e42b46e1df76018dd"},
- {file = "mypy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7d23370d2a6b7a71dc65d1266f9a34e4cde9e8e21511322415db4b26f46f6b8c"},
- {file = "mypy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:658fe7b674769a0770d4b26cb4d6f005e88a442fe82446f020be8e5f5efb2fae"},
- {file = "mypy-1.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e42d29e324cdda61daaec2336c42512e59c7c375340bd202efa1fe0f7b8f8ca"},
- {file = "mypy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:d0b6c62206e04061e27009481cb0ec966f7d6172b5b936f3ead3d74f29fe3dcf"},
- {file = "mypy-1.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:76ec771e2342f1b558c36d49900dfe81d140361dd0d2df6cd71b3db1be155409"},
- {file = "mypy-1.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebc95f8386314272bbc817026f8ce8f4f0d2ef7ae44f947c4664efac9adec929"},
- {file = "mypy-1.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:faff86aa10c1aa4a10e1a301de160f3d8fc8703b88c7e98de46b531ff1276a9a"},
- {file = "mypy-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:8c5979d0deb27e0f4479bee18ea0f83732a893e81b78e62e2dda3e7e518c92ee"},
- {file = "mypy-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c5d2cc54175bab47011b09688b418db71403aefad07cbcd62d44010543fc143f"},
- {file = "mypy-1.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:87df44954c31d86df96c8bd6e80dfcd773473e877ac6176a8e29898bfb3501cb"},
- {file = "mypy-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:473117e310febe632ddf10e745a355714e771ffe534f06db40702775056614c4"},
- {file = "mypy-1.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:74bc9b6e0e79808bf8678d7678b2ae3736ea72d56eede3820bd3849823e7f305"},
- {file = "mypy-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:44797d031a41516fcf5cbfa652265bb994e53e51994c1bd649ffcd0c3a7eccbf"},
- {file = "mypy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ddae0f39ca146972ff6bb4399f3b2943884a774b8771ea0a8f50e971f5ea5ba8"},
- {file = "mypy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c4c42c60a8103ead4c1c060ac3cdd3ff01e18fddce6f1016e08939647a0e703"},
- {file = "mypy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e86c2c6852f62f8f2b24cb7a613ebe8e0c7dc1402c61d36a609174f63e0ff017"},
- {file = "mypy-1.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f9dca1e257d4cc129517779226753dbefb4f2266c4eaad610fc15c6a7e14283e"},
- {file = "mypy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:95d8d31a7713510685b05fbb18d6ac287a56c8f6554d88c19e73f724a445448a"},
- {file = "mypy-1.3.0-py3-none-any.whl", hash = "sha256:a8763e72d5d9574d45ce5881962bc8e9046bf7b375b0abf031f3e6811732a897"},
- {file = "mypy-1.3.0.tar.gz", hash = "sha256:e1f4d16e296f5135624b34e8fb741eb0eadedca90862405b1f1fde2040b9bd11"},
-]
-
-[package.dependencies]
-mypy-extensions = ">=1.0.0"
-tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
-typing-extensions = ">=3.10"
-
-[package.extras]
-dmypy = ["psutil (>=4.0)"]
-install-types = ["pip"]
-python2 = ["typed-ast (>=1.4.0,<2)"]
-reports = ["lxml"]
-
-[[package]]
-name = "mypy-extensions"
-version = "1.0.0"
-description = "Type system extensions for programs checked with the mypy type checker."
-optional = false
-python-versions = ">=3.5"
-files = [
- {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
- {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
-]
-
-[[package]]
-name = "numpy"
-version = "1.24.3"
-description = "Fundamental package for array computing in Python"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"},
- {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"},
- {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"},
- {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"},
- {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"},
- {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"},
- {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"},
- {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"},
- {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"},
- {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"},
- {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"},
- {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"},
- {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"},
- {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"},
- {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"},
- {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"},
- {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"},
- {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"},
- {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"},
- {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"},
- {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"},
- {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"},
- {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"},
- {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"},
- {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"},
- {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"},
- {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"},
- {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"},
-]
-
-[[package]]
-name = "packaging"
-version = "23.1"
-description = "Core utilities for Python packages"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"},
- {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"},
-]
-
-[[package]]
-name = "pandas"
-version = "2.0.2"
-description = "Powerful data structures for data analysis, time series, and statistics"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pandas-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ebb9f1c22ddb828e7fd017ea265a59d80461d5a79154b49a4207bd17514d122"},
- {file = "pandas-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1eb09a242184092f424b2edd06eb2b99d06dc07eeddff9929e8667d4ed44e181"},
- {file = "pandas-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7319b6e68de14e6209460f72a8d1ef13c09fb3d3ef6c37c1e65b35d50b5c145"},
- {file = "pandas-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd46bde7309088481b1cf9c58e3f0e204b9ff9e3244f441accd220dd3365ce7c"},
- {file = "pandas-2.0.2-cp310-cp310-win32.whl", hash = "sha256:51a93d422fbb1bd04b67639ba4b5368dffc26923f3ea32a275d2cc450f1d1c86"},
- {file = "pandas-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:66d00300f188fa5de73f92d5725ced162488f6dc6ad4cecfe4144ca29debe3b8"},
- {file = "pandas-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02755de164da6827764ceb3bbc5f64b35cb12394b1024fdf88704d0fa06e0e2f"},
- {file = "pandas-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0a1e0576611641acde15c2322228d138258f236d14b749ad9af498ab69089e2d"},
- {file = "pandas-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6b5f14cd24a2ed06e14255ff40fe2ea0cfaef79a8dd68069b7ace74bd6acbba"},
- {file = "pandas-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50e451932b3011b61d2961b4185382c92cc8c6ee4658dcd4f320687bb2d000ee"},
- {file = "pandas-2.0.2-cp311-cp311-win32.whl", hash = "sha256:7b21cb72958fc49ad757685db1919021d99650d7aaba676576c9e88d3889d456"},
- {file = "pandas-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:c4af689352c4fe3d75b2834933ee9d0ccdbf5d7a8a7264f0ce9524e877820c08"},
- {file = "pandas-2.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:69167693cb8f9b3fc060956a5d0a0a8dbfed5f980d9fd2c306fb5b9c855c814c"},
- {file = "pandas-2.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:30a89d0fec4263ccbf96f68592fd668939481854d2ff9da709d32a047689393b"},
- {file = "pandas-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a18e5c72b989ff0f7197707ceddc99828320d0ca22ab50dd1b9e37db45b010c0"},
- {file = "pandas-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7376e13d28eb16752c398ca1d36ccfe52bf7e887067af9a0474de6331dd948d2"},
- {file = "pandas-2.0.2-cp38-cp38-win32.whl", hash = "sha256:6d6d10c2142d11d40d6e6c0a190b1f89f525bcf85564707e31b0a39e3b398e08"},
- {file = "pandas-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:e69140bc2d29a8556f55445c15f5794490852af3de0f609a24003ef174528b79"},
- {file = "pandas-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b42b120458636a981077cfcfa8568c031b3e8709701315e2bfa866324a83efa8"},
- {file = "pandas-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f908a77cbeef9bbd646bd4b81214cbef9ac3dda4181d5092a4aa9797d1bc7774"},
- {file = "pandas-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:713f2f70abcdade1ddd68fc91577cb090b3544b07ceba78a12f799355a13ee44"},
- {file = "pandas-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf3f0c361a4270185baa89ec7ab92ecaa355fe783791457077473f974f654df5"},
- {file = "pandas-2.0.2-cp39-cp39-win32.whl", hash = "sha256:598e9020d85a8cdbaa1815eb325a91cfff2bb2b23c1442549b8a3668e36f0f77"},
- {file = "pandas-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:77550c8909ebc23e56a89f91b40ad01b50c42cfbfab49b3393694a50549295ea"},
- {file = "pandas-2.0.2.tar.gz", hash = "sha256:dd5476b6c3fe410ee95926873f377b856dbc4e81a9c605a0dc05aaccc6a7c6c6"},
-]
-
-[package.dependencies]
-numpy = [
- {version = ">=1.21.0", markers = "python_version >= \"3.10\""},
- {version = ">=1.23.2", markers = "python_version >= \"3.11\""},
-]
-python-dateutil = ">=2.8.2"
-pytz = ">=2020.1"
-tzdata = ">=2022.1"
-
-[package.extras]
-all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"]
-aws = ["s3fs (>=2021.08.0)"]
-clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"]
-compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"]
-computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"]
-excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"]
-feather = ["pyarrow (>=7.0.0)"]
-fss = ["fsspec (>=2021.07.0)"]
-gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"]
-hdf5 = ["tables (>=3.6.1)"]
-html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"]
-mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"]
-output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"]
-parquet = ["pyarrow (>=7.0.0)"]
-performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"]
-plot = ["matplotlib (>=3.6.1)"]
-postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"]
-spss = ["pyreadstat (>=1.1.2)"]
-sql-other = ["SQLAlchemy (>=1.4.16)"]
-test = ["hypothesis (>=6.34.2)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"]
-xml = ["lxml (>=4.6.3)"]
-
-[[package]]
-name = "pillow"
-version = "9.5.0"
-description = "Python Imaging Library (Fork)"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"},
- {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"},
- {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"},
- {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"},
- {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"},
- {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"},
- {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"},
- {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"},
- {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"},
- {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"},
- {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"},
- {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"},
- {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"},
- {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"},
- {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"},
- {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"},
- {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"},
- {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"},
- {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"},
- {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"},
- {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"},
- {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"},
- {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"},
- {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"},
- {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"},
- {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"},
- {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"},
- {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"},
- {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"},
- {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"},
- {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"},
- {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"},
- {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"},
- {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"},
- {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"},
- {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"},
- {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"},
- {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"},
- {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"},
- {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"},
- {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"},
- {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"},
- {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"},
- {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"},
- {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"},
- {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"},
- {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"},
- {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"},
- {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"},
- {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"},
- {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"},
- {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"},
- {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"},
- {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"},
- {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"},
- {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"},
- {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"},
- {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"},
- {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"},
- {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"},
- {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"},
- {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"},
- {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"},
- {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"},
- {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"},
- {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"},
-]
-
-[package.extras]
-docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"]
-tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"]
-
-[[package]]
-name = "prompton"
-version = "0.0.2"
-description = "Chat prompt template evaluation and inference monitoring"
-optional = false
-python-versions = ">=3.10"
-files = [
- {file = "prompton-0.0.2-py3-none-any.whl", hash = "sha256:2260470392510d6203ce3d493c2f5ae7ed87610e7cfdecac7b1b9d9688d4ffed"},
- {file = "prompton-0.0.2.tar.gz", hash = "sha256:bd64fe301e1d2a663c5ae7a1da60961f69837c5e294a3b025021044f21b12905"},
-]
-
-[package.dependencies]
-httpx = ">=0.24.1,<0.25.0"
-pydantic = {version = ">=1.10.8,<2.0.0", extras = ["email"]}
-
-[[package]]
-name = "protobuf"
-version = "4.23.2"
-description = ""
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "protobuf-4.23.2-cp310-abi3-win32.whl", hash = "sha256:384dd44cb4c43f2ccddd3645389a23ae61aeb8cfa15ca3a0f60e7c3ea09b28b3"},
- {file = "protobuf-4.23.2-cp310-abi3-win_amd64.whl", hash = "sha256:09310bce43353b46d73ba7e3bca78273b9bc50349509b9698e64d288c6372c2a"},
- {file = "protobuf-4.23.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:b2cfab63a230b39ae603834718db74ac11e52bccaaf19bf20f5cce1a84cf76df"},
- {file = "protobuf-4.23.2-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:c52cfcbfba8eb791255edd675c1fe6056f723bf832fa67f0442218f8817c076e"},
- {file = "protobuf-4.23.2-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:86df87016d290143c7ce3be3ad52d055714ebaebb57cc659c387e76cfacd81aa"},
- {file = "protobuf-4.23.2-cp37-cp37m-win32.whl", hash = "sha256:281342ea5eb631c86697e1e048cb7e73b8a4e85f3299a128c116f05f5c668f8f"},
- {file = "protobuf-4.23.2-cp37-cp37m-win_amd64.whl", hash = "sha256:ce744938406de1e64b91410f473736e815f28c3b71201302612a68bf01517fea"},
- {file = "protobuf-4.23.2-cp38-cp38-win32.whl", hash = "sha256:6c081863c379bb1741be8f8193e893511312b1d7329b4a75445d1ea9955be69e"},
- {file = "protobuf-4.23.2-cp38-cp38-win_amd64.whl", hash = "sha256:25e3370eda26469b58b602e29dff069cfaae8eaa0ef4550039cc5ef8dc004511"},
- {file = "protobuf-4.23.2-cp39-cp39-win32.whl", hash = "sha256:efabbbbac1ab519a514579ba9ec52f006c28ae19d97915951f69fa70da2c9e91"},
- {file = "protobuf-4.23.2-cp39-cp39-win_amd64.whl", hash = "sha256:54a533b971288af3b9926e53850c7eb186886c0c84e61daa8444385a4720297f"},
- {file = "protobuf-4.23.2-py3-none-any.whl", hash = "sha256:8da6070310d634c99c0db7df48f10da495cc283fd9e9234877f0cd182d43ab7f"},
- {file = "protobuf-4.23.2.tar.gz", hash = "sha256:20874e7ca4436f683b64ebdbee2129a5a2c301579a67d1a7dda2cdf62fb7f5f7"},
-]
-
-[[package]]
-name = "pyarrow"
-version = "12.0.0"
-description = "Python library for Apache Arrow"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "pyarrow-12.0.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:3b97649c8a9a09e1d8dc76513054f1331bd9ece78ee39365e6bf6bc7503c1e94"},
- {file = "pyarrow-12.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bc4ea634dacb03936f50fcf59574a8e727f90c17c24527e488d8ceb52ae284de"},
- {file = "pyarrow-12.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d568acfca3faa565d663e53ee34173be8e23a95f78f2abfdad198010ec8f745"},
- {file = "pyarrow-12.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b50bb9a82dca38a002d7cbd802a16b1af0f8c50ed2ec94a319f5f2afc047ee9"},
- {file = "pyarrow-12.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:3d1733b1ea086b3c101427d0e57e2be3eb964686e83c2363862a887bb5c41fa8"},
- {file = "pyarrow-12.0.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:a7cd32fe77f967fe08228bc100433273020e58dd6caced12627bcc0a7675a513"},
- {file = "pyarrow-12.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:92fb031e6777847f5c9b01eaa5aa0c9033e853ee80117dce895f116d8b0c3ca3"},
- {file = "pyarrow-12.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:280289ebfd4ac3570f6b776515baa01e4dcbf17122c401e4b7170a27c4be63fd"},
- {file = "pyarrow-12.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:272f147d4f8387bec95f17bb58dcfc7bc7278bb93e01cb7b08a0e93a8921e18e"},
- {file = "pyarrow-12.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:0846ace49998825eda4722f8d7f83fa05601c832549c9087ea49d6d5397d8cec"},
- {file = "pyarrow-12.0.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:993287136369aca60005ee7d64130f9466489c4f7425f5c284315b0a5401ccd9"},
- {file = "pyarrow-12.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a7b6a765ee4f88efd7d8348d9a1f804487d60799d0428b6ddf3344eaef37282"},
- {file = "pyarrow-12.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1c4fce253d5bdc8d62f11cfa3da5b0b34b562c04ce84abb8bd7447e63c2b327"},
- {file = "pyarrow-12.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e6be4d85707fc8e7a221c8ab86a40449ce62559ce25c94321df7c8500245888f"},
- {file = "pyarrow-12.0.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:ea830d9f66bfb82d30b5794642f83dd0e4a718846462d22328981e9eb149cba8"},
- {file = "pyarrow-12.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7b5b9f60d9ef756db59bec8d90e4576b7df57861e6a3d6a8bf99538f68ca15b3"},
- {file = "pyarrow-12.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b99e559d27db36ad3a33868a475f03e3129430fc065accc839ef4daa12c6dab6"},
- {file = "pyarrow-12.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b0810864a593b89877120972d1f7af1d1c9389876dbed92b962ed81492d3ffc"},
- {file = "pyarrow-12.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:23a77d97f4d101ddfe81b9c2ee03a177f0e590a7e68af15eafa06e8f3cf05976"},
- {file = "pyarrow-12.0.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2cc63e746221cddb9001f7281dee95fd658085dd5b717b076950e1ccc607059c"},
- {file = "pyarrow-12.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d8c26912607e26c2991826bbaf3cf2b9c8c3e17566598c193b492f058b40d3a4"},
- {file = "pyarrow-12.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d8b90efc290e99a81d06015f3a46601c259ecc81ffb6d8ce288c91bd1b868c9"},
- {file = "pyarrow-12.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2466be046b81863be24db370dffd30a2e7894b4f9823fb60ef0a733c31ac6256"},
- {file = "pyarrow-12.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:0e36425b1c1cbf5447718b3f1751bf86c58f2b3ad299f996cd9b1aa040967656"},
- {file = "pyarrow-12.0.0.tar.gz", hash = "sha256:19c812d303610ab5d664b7b1de4051ae23565f9f94d04cbea9e50569746ae1ee"},
-]
-
-[package.dependencies]
-numpy = ">=1.16.6"
-
-[[package]]
-name = "pydantic"
-version = "1.10.9"
-description = "Data validation and settings management using python type hints"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "pydantic-1.10.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e692dec4a40bfb40ca530e07805b1208c1de071a18d26af4a2a0d79015b352ca"},
- {file = "pydantic-1.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c52eb595db83e189419bf337b59154bdcca642ee4b2a09e5d7797e41ace783f"},
- {file = "pydantic-1.10.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:939328fd539b8d0edf244327398a667b6b140afd3bf7e347cf9813c736211896"},
- {file = "pydantic-1.10.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b48d3d634bca23b172f47f2335c617d3fcb4b3ba18481c96b7943a4c634f5c8d"},
- {file = "pydantic-1.10.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f0b7628fb8efe60fe66fd4adadd7ad2304014770cdc1f4934db41fe46cc8825f"},
- {file = "pydantic-1.10.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e1aa5c2410769ca28aa9a7841b80d9d9a1c5f223928ca8bec7e7c9a34d26b1d4"},
- {file = "pydantic-1.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:eec39224b2b2e861259d6f3c8b6290d4e0fbdce147adb797484a42278a1a486f"},
- {file = "pydantic-1.10.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d111a21bbbfd85c17248130deac02bbd9b5e20b303338e0dbe0faa78330e37e0"},
- {file = "pydantic-1.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e9aec8627a1a6823fc62fb96480abe3eb10168fd0d859ee3d3b395105ae19a7"},
- {file = "pydantic-1.10.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07293ab08e7b4d3c9d7de4949a0ea571f11e4557d19ea24dd3ae0c524c0c334d"},
- {file = "pydantic-1.10.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ee829b86ce984261d99ff2fd6e88f2230068d96c2a582f29583ed602ef3fc2c"},
- {file = "pydantic-1.10.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4b466a23009ff5cdd7076eb56aca537c745ca491293cc38e72bf1e0e00de5b91"},
- {file = "pydantic-1.10.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7847ca62e581e6088d9000f3c497267868ca2fa89432714e21a4fb33a04d52e8"},
- {file = "pydantic-1.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:7845b31959468bc5b78d7b95ec52fe5be32b55d0d09983a877cca6aedc51068f"},
- {file = "pydantic-1.10.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:517a681919bf880ce1dac7e5bc0c3af1e58ba118fd774da2ffcd93c5f96eaece"},
- {file = "pydantic-1.10.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67195274fd27780f15c4c372f4ba9a5c02dad6d50647b917b6a92bf00b3d301a"},
- {file = "pydantic-1.10.9-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2196c06484da2b3fded1ab6dbe182bdabeb09f6318b7fdc412609ee2b564c49a"},
- {file = "pydantic-1.10.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6257bb45ad78abacda13f15bde5886efd6bf549dd71085e64b8dcf9919c38b60"},
- {file = "pydantic-1.10.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3283b574b01e8dbc982080d8287c968489d25329a463b29a90d4157de4f2baaf"},
- {file = "pydantic-1.10.9-cp37-cp37m-win_amd64.whl", hash = "sha256:5f8bbaf4013b9a50e8100333cc4e3fa2f81214033e05ac5aa44fa24a98670a29"},
- {file = "pydantic-1.10.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9cd67fb763248cbe38f0593cd8611bfe4b8ad82acb3bdf2b0898c23415a1f82"},
- {file = "pydantic-1.10.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f50e1764ce9353be67267e7fd0da08349397c7db17a562ad036aa7c8f4adfdb6"},
- {file = "pydantic-1.10.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73ef93e5e1d3c8e83f1ff2e7fdd026d9e063c7e089394869a6e2985696693766"},
- {file = "pydantic-1.10.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:128d9453d92e6e81e881dd7e2484e08d8b164da5507f62d06ceecf84bf2e21d3"},
- {file = "pydantic-1.10.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ad428e92ab68798d9326bb3e5515bc927444a3d71a93b4a2ca02a8a5d795c572"},
- {file = "pydantic-1.10.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fab81a92f42d6d525dd47ced310b0c3e10c416bbfae5d59523e63ea22f82b31e"},
- {file = "pydantic-1.10.9-cp38-cp38-win_amd64.whl", hash = "sha256:963671eda0b6ba6926d8fc759e3e10335e1dc1b71ff2a43ed2efd6996634dafb"},
- {file = "pydantic-1.10.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:970b1bdc6243ef663ba5c7e36ac9ab1f2bfecb8ad297c9824b542d41a750b298"},
- {file = "pydantic-1.10.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7e1d5290044f620f80cf1c969c542a5468f3656de47b41aa78100c5baa2b8276"},
- {file = "pydantic-1.10.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83fcff3c7df7adff880622a98022626f4f6dbce6639a88a15a3ce0f96466cb60"},
- {file = "pydantic-1.10.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0da48717dc9495d3a8f215e0d012599db6b8092db02acac5e0d58a65248ec5bc"},
- {file = "pydantic-1.10.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0a2aabdc73c2a5960e87c3ffebca6ccde88665616d1fd6d3db3178ef427b267a"},
- {file = "pydantic-1.10.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9863b9420d99dfa9c064042304868e8ba08e89081428a1c471858aa2af6f57c4"},
- {file = "pydantic-1.10.9-cp39-cp39-win_amd64.whl", hash = "sha256:e7c9900b43ac14110efa977be3da28931ffc74c27e96ee89fbcaaf0b0fe338e1"},
- {file = "pydantic-1.10.9-py3-none-any.whl", hash = "sha256:6cafde02f6699ce4ff643417d1a9223716ec25e228ddc3b436fe7e2d25a1f305"},
- {file = "pydantic-1.10.9.tar.gz", hash = "sha256:95c70da2cd3b6ddf3b9645ecaa8d98f3d80c606624b6d245558d202cd23ea3be"},
-]
-
-[package.dependencies]
-email-validator = {version = ">=1.0.3", optional = true, markers = "extra == \"email\""}
-typing-extensions = ">=4.2.0"
-
-[package.extras]
-dotenv = ["python-dotenv (>=0.10.4)"]
-email = ["email-validator (>=1.0.3)"]
-
-[[package]]
-name = "pydeck"
-version = "0.8.0"
-description = "Widget for deck.gl maps"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "pydeck-0.8.0-py2.py3-none-any.whl", hash = "sha256:a8fa7757c6f24bba033af39db3147cb020eef44012ba7e60d954de187f9ed4d5"},
- {file = "pydeck-0.8.0.tar.gz", hash = "sha256:07edde833f7cfcef6749124351195aa7dcd24663d4909fd7898dbd0b6fbc01ec"},
-]
-
-[package.dependencies]
-jinja2 = ">=2.10.1"
-numpy = ">=1.16.4"
-
-[package.extras]
-carto = ["pydeck-carto"]
-jupyter = ["ipykernel (>=5.1.2)", "ipython (>=5.8.0)", "ipywidgets (>=7,<8)", "traitlets (>=4.3.2)"]
-
-[[package]]
-name = "pygments"
-version = "2.15.1"
-description = "Pygments is a syntax highlighting package written in Python."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"},
- {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"},
-]
-
-[package.extras]
-plugins = ["importlib-metadata"]
-
-[[package]]
-name = "pympler"
-version = "1.0.1"
-description = "A development tool to measure, monitor and analyze the memory behavior of Python objects."
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "Pympler-1.0.1-py3-none-any.whl", hash = "sha256:d260dda9ae781e1eab6ea15bacb84015849833ba5555f141d2d9b7b7473b307d"},
- {file = "Pympler-1.0.1.tar.gz", hash = "sha256:993f1a3599ca3f4fcd7160c7545ad06310c9e12f70174ae7ae8d4e25f6c5d3fa"},
-]
-
-[[package]]
-name = "pyrsistent"
-version = "0.19.3"
-description = "Persistent/Functional/Immutable data structures"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"},
- {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"},
- {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"},
- {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"},
- {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"},
- {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"},
- {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"},
- {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"},
- {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"},
- {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"},
- {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"},
- {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"},
- {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"},
- {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"},
- {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"},
- {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"},
- {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"},
- {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"},
- {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"},
- {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"},
- {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"},
- {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"},
- {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"},
- {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"},
- {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"},
- {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"},
- {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"},
-]
-
-[[package]]
-name = "python-dateutil"
-version = "2.8.2"
-description = "Extensions to the standard Python datetime module"
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
-files = [
- {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
- {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
-]
-
-[package.dependencies]
-six = ">=1.5"
-
-[[package]]
-name = "pytz"
-version = "2023.3"
-description = "World timezone definitions, modern and historical"
-optional = false
-python-versions = "*"
-files = [
- {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"},
- {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"},
-]
-
-[[package]]
-name = "pytz-deprecation-shim"
-version = "0.1.0.post0"
-description = "Shims to make deprecation of pytz easier"
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
-files = [
- {file = "pytz_deprecation_shim-0.1.0.post0-py2.py3-none-any.whl", hash = "sha256:8314c9692a636c8eb3bda879b9f119e350e93223ae83e70e80c31675a0fdc1a6"},
- {file = "pytz_deprecation_shim-0.1.0.post0.tar.gz", hash = "sha256:af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d"},
-]
-
-[package.dependencies]
-tzdata = {version = "*", markers = "python_version >= \"3.6\""}
-
-[[package]]
-name = "requests"
-version = "2.31.0"
-description = "Python HTTP for Humans."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"},
- {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"},
-]
-
-[package.dependencies]
-certifi = ">=2017.4.17"
-charset-normalizer = ">=2,<4"
-idna = ">=2.5,<4"
-urllib3 = ">=1.21.1,<3"
-
-[package.extras]
-socks = ["PySocks (>=1.5.6,!=1.5.7)"]
-use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
-
-[[package]]
-name = "rich"
-version = "13.4.1"
-description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
-optional = false
-python-versions = ">=3.7.0"
-files = [
- {file = "rich-13.4.1-py3-none-any.whl", hash = "sha256:d204aadb50b936bf6b1a695385429d192bc1fdaf3e8b907e8e26f4c4e4b5bf75"},
- {file = "rich-13.4.1.tar.gz", hash = "sha256:76f6b65ea7e5c5d924ba80e322231d7cb5b5981aa60bfc1e694f1bc097fe6fe1"},
-]
-
-[package.dependencies]
-markdown-it-py = ">=2.2.0,<3.0.0"
-pygments = ">=2.13.0,<3.0.0"
-
-[package.extras]
-jupyter = ["ipywidgets (>=7.5.1,<9)"]
-
-[[package]]
-name = "six"
-version = "1.16.0"
-description = "Python 2 and 3 compatibility utilities"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
-files = [
- {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
- {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
-]
-
-[[package]]
-name = "smmap"
-version = "5.0.0"
-description = "A pure Python implementation of a sliding window memory map manager"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"},
- {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"},
-]
-
-[[package]]
-name = "sniffio"
-version = "1.3.0"
-description = "Sniff out which async library your code is running under"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"},
- {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"},
-]
-
-[[package]]
-name = "streamlit"
-version = "1.23.1"
-description = "A faster way to build and share data apps"
-optional = false
-python-versions = ">=3.7, !=3.9.7"
-files = [
- {file = "streamlit-1.23.1-py2.py3-none-any.whl", hash = "sha256:02cd55a95acd20d73ff03866956ba6e98d71041ee4728dbfef05cf17069d1bb9"},
- {file = "streamlit-1.23.1.tar.gz", hash = "sha256:af95a78f9d291f12f779cf66a2bdadfafd8a46fe4fcc6ed281492640ed37bf1e"},
-]
-
-[package.dependencies]
-altair = ">=4.0,<6"
-blinker = ">=1.0.0,<2"
-cachetools = ">=4.0,<6"
-click = ">=7.0,<9"
-gitpython = ">=3,<3.1.19 || >3.1.19,<4"
-importlib-metadata = ">=1.4,<7"
-numpy = ">=1,<2"
-packaging = ">=14.1,<24"
-pandas = ">=0.25,<3"
-pillow = ">=6.2.0,<10"
-protobuf = ">=3.20,<5"
-pyarrow = ">=4.0"
-pydeck = ">=0.1.dev5,<1"
-pympler = ">=0.9,<2"
-python-dateutil = ">=2,<3"
-requests = ">=2.4,<3"
-rich = ">=10.11.0,<14"
-tenacity = ">=8.0.0,<9"
-toml = "<2"
-tornado = ">=6.0.3,<7"
-typing-extensions = ">=4.0.1,<5"
-tzlocal = ">=1.1,<5"
-validators = ">=0.2,<1"
-watchdog = {version = "*", markers = "platform_system != \"Darwin\""}
-
-[package.extras]
-snowflake = ["snowflake-snowpark-python"]
-
-[[package]]
-name = "tenacity"
-version = "8.2.2"
-description = "Retry code until it succeeds"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"},
- {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"},
-]
-
-[package.extras]
-doc = ["reno", "sphinx", "tornado (>=4.5)"]
-
-[[package]]
-name = "toml"
-version = "0.10.2"
-description = "Python Library for Tom's Obvious, Minimal Language"
-optional = false
-python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
-files = [
- {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
- {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
-]
-
-[[package]]
-name = "tomli"
-version = "2.0.1"
-description = "A lil' TOML parser"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
- {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
-]
-
-[[package]]
-name = "toolz"
-version = "0.12.0"
-description = "List processing tools and functional utilities"
-optional = false
-python-versions = ">=3.5"
-files = [
- {file = "toolz-0.12.0-py3-none-any.whl", hash = "sha256:2059bd4148deb1884bb0eb770a3cde70e7f954cfbbdc2285f1f2de01fd21eb6f"},
- {file = "toolz-0.12.0.tar.gz", hash = "sha256:88c570861c440ee3f2f6037c4654613228ff40c93a6c25e0eba70d17282c6194"},
-]
-
-[[package]]
-name = "tornado"
-version = "6.3.2"
-description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed."
-optional = false
-python-versions = ">= 3.8"
-files = [
- {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"},
- {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"},
- {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"},
- {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4"},
- {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe"},
- {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d"},
- {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0"},
- {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411"},
- {file = "tornado-6.3.2-cp38-abi3-win32.whl", hash = "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2"},
- {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"},
- {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"},
-]
-
-[[package]]
-name = "typing-extensions"
-version = "4.6.3"
-description = "Backported and Experimental Type Hints for Python 3.7+"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "typing_extensions-4.6.3-py3-none-any.whl", hash = "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26"},
- {file = "typing_extensions-4.6.3.tar.gz", hash = "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"},
-]
-
-[[package]]
-name = "tzdata"
-version = "2023.3"
-description = "Provider of IANA time zone data"
-optional = false
-python-versions = ">=2"
-files = [
- {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"},
- {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"},
-]
-
-[[package]]
-name = "tzlocal"
-version = "4.3"
-description = "tzinfo object for the local timezone"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "tzlocal-4.3-py3-none-any.whl", hash = "sha256:b44c4388f3d34f25862cfbb387578a4d70fec417649da694a132f628a23367e2"},
- {file = "tzlocal-4.3.tar.gz", hash = "sha256:3f21d09e1b2aa9f2dacca12da240ca37de3ba5237a93addfd6d593afe9073355"},
-]
-
-[package.dependencies]
-pytz-deprecation-shim = "*"
-tzdata = {version = "*", markers = "platform_system == \"Windows\""}
-
-[package.extras]
-devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"]
-
-[[package]]
-name = "urllib3"
-version = "2.0.3"
-description = "HTTP library with thread-safe connection pooling, file post, and more."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"},
- {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"},
-]
-
-[package.extras]
-brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"]
-secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"]
-socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
-zstd = ["zstandard (>=0.18.0)"]
-
-[[package]]
-name = "validators"
-version = "0.20.0"
-description = "Python Data Validation for Humans™."
-optional = false
-python-versions = ">=3.4"
-files = [
- {file = "validators-0.20.0.tar.gz", hash = "sha256:24148ce4e64100a2d5e267233e23e7afeb55316b47d30faae7eb6e7292bc226a"},
-]
-
-[package.dependencies]
-decorator = ">=3.4.0"
-
-[package.extras]
-test = ["flake8 (>=2.4.0)", "isort (>=4.2.2)", "pytest (>=2.2.3)"]
-
-[[package]]
-name = "watchdog"
-version = "3.0.0"
-description = "Filesystem events monitoring"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"},
- {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"},
- {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"},
- {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"},
- {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"},
- {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"},
- {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"},
- {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"},
- {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"},
- {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"},
- {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"},
- {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"},
- {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"},
- {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"},
- {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"},
- {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"},
- {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"},
- {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"},
- {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"},
- {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"},
- {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"},
- {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"},
- {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"},
- {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"},
- {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"},
- {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"},
- {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"},
-]
-
-[package.extras]
-watchmedo = ["PyYAML (>=3.10)"]
-
-[[package]]
-name = "zipp"
-version = "3.15.0"
-description = "Backport of pathlib-compatible object wrapper for zip files"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"},
- {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"},
-]
-
-[package.extras]
-docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
-testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"]
-
-[metadata]
-lock-version = "2.0"
-python-versions = ">=3.10"
-content-hash = "56991ae7c0efc0b67283d8f04b9b6cb45c6be9b4f7387fcab2b9324c018fb045"
diff --git a/ui-examples/streamlit/pyproject.toml b/ui-examples/streamlit/pyproject.toml
deleted file mode 100644
index 6f5c7a2..0000000
--- a/ui-examples/streamlit/pyproject.toml
+++ /dev/null
@@ -1,20 +0,0 @@
-[tool.poetry]
-name = "prompton-ui-streamlit"
-version = "0.1.0"
-description = "Example UI for prompton API using prompton Python SDK and Streamit"
-authors = ["PromptOn "]
-license = "MIT"
-readme = "README.md"
-
-[tool.poetry.dependencies]
-python = ">=3.10"
-streamlit = "^1.23.1"
-prompton = "^0.0.2"
-
-
-[build-system]
-requires = ["poetry-core"]
-build-backend = "poetry.core.masonry.api"
-
-[tool.poetry.group.dev.dependencies]
-mypy = "^1.3.0"