commit 758615813f874ddd8f94bc2cf0ce1ab96cd2859c
Author: cogwheel0 <172976095+cogwheel0@users.noreply.github.com>
Date: Sun Aug 10 01:20:45 2025 +0530
chore: initial release
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..6430202
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,15 @@
+# These are supported funding model platforms
+
+github: cogwheel0
+# patreon: # Replace with a single Patreon username
+# open_collective: # Replace with a single Open Collective username
+# ko_fi: # Replace with a single Ko-fi username
+# tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
+# community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+# liberapay: # Replace with a single Liberapay username
+# issuehunt: # Replace with a single IssueHunt username
+# lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
+# polar: # Replace with a single Polar username
+# buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
+# thanks_dev: # Replace with a single thanks.dev username
+# custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..eee83bf
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,68 @@
+name: Release
+
+on:
+ push:
+ tags:
+ - 'v*'
+
+jobs:
+ build-android:
+ name: Build Android
+ runs-on: ubuntu-latest
+
+ steps:
+ #1 Checkout Repository
+ - name: Checkout Repository
+ uses: actions/checkout@v3
+
+ #2 Setup Java
+ - name: Set Up Java
+ uses: actions/setup-java@v3
+ with:
+ distribution: 'zulu'
+ java-version: '21'
+
+ #3 Setup Flutter
+ - name: Set Up Flutter
+ uses: subosito/flutter-action@v2
+ with:
+ flutter-version: '3.32.5'
+ channel: 'stable'
+
+ #4 Install Dependencies
+ - name: Install Dependencies
+ run: flutter pub get
+
+ - name: Generate Freezed Classes
+ run: flutter pub run build_runner build --delete-conflicting-outputs
+
+ #5 Setup Keystore
+ - name: Create Keystore
+ run: |
+ echo "${{ secrets.ANDROID_KEYSTORE_BASE64 }}" | base64 --decode > app/conduit-keystore.jks
+ echo "${{ secrets.ANDROID_KEY_PROPERTIES_BASE64 }}" | base64 --decode > key.properties
+ env:
+ ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
+ ANDROID_KEY_PROPERTIES_BASE64: ${{ secrets.ANDROID_KEY_PROPERTIES_BASE64 }}
+ working-directory: android
+
+ - name: Build APK
+ run: flutter build apk --release
+
+ - name: Build appBundle
+ run: flutter build appbundle --release
+
+ - name: Upload Artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: Releases
+ path: |
+ build/app/outputs/flutter-apk/app-release.apk
+ build/app/outputs/bundle/release/app-release.aab
+
+ - name: Create Release
+ uses: ncipollo/release-action@v1
+ with:
+ artifacts: "build/app/outputs/flutter-apk/app-release.apk,build/app/outputs/bundle/release/app-release.aab"
+ tag: ${{ github.ref_name }}
+ token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7f0c7b7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,142 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.build/
+.buildlog/
+.history
+.svn/
+.swiftpm/
+migrate_working_dir/
+.github/copilot-instructions.md
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+#.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+**/ios/Flutter/.last_build_id
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.pub-cache/
+.pub/
+/build/
+
+# Symbolication related
+app.*.symbols
+
+# Obfuscation related
+app.*.map.json
+
+# Android Studio will place build artifacts here
+/android/app/debug
+/android/app/profile
+/android/app/release
+
+# iOS related
+**/ios/**/*.mode1v3
+**/ios/**/*.mode2v3
+**/ios/**/*.moved-aside
+**/ios/**/*.pbxuser
+**/ios/**/*.perspectivev3
+**/ios/**/*sync/
+**/ios/**/.sconsign.dblite
+**/ios/**/.tags*
+**/ios/**/.vagrant/
+**/ios/**/DerivedData/
+**/ios/**/Icon?
+**/ios/**/Pods/
+**/ios/**/.symlinks/
+**/ios/**/profile
+**/ios/**/xcuserdata
+**/ios/.generated/
+**/ios/Flutter/App.framework
+**/ios/Flutter/Flutter.framework
+**/ios/Flutter/Flutter.podspec
+**/ios/Flutter/Generated.xcconfig
+**/ios/Flutter/app.flx
+**/ios/Flutter/app.zip
+**/ios/Flutter/flutter_assets/
+**/ios/Flutter/flutter_export_environment.sh
+**/ios/ServiceDefinitions.json
+**/ios/Runner/GeneratedPluginRegistrant.*
+
+# macOS
+**/macos/Flutter/GeneratedPluginRegistrant.swift
+**/macos/Flutter/ephemeral
+
+# Coverage
+coverage/
+
+# Temporary files
+*.tmp
+*.temp
+*.bak
+*.orig
+
+# Environment files
+.env
+.env.local
+.env.production
+
+# Generated files
+*.g.dart
+*.freezed.dart
+
+# FVM (Flutter Version Management)
+.fvm/
+
+# Fastlane
+**/fastlane/report.xml
+**/fastlane/Preview.html
+**/fastlane/screenshots
+**/fastlane/test_output
+
+# Firebase
+google-services.json
+GoogleService-Info.plist
+
+# Keystore files
+*.keystore
+*.jks
+
+# Gradle files
+.gradle/
+**/android/gradle-wrapper.jar
+**/android/.gradle
+**/android/captures/
+**/android/gradlew
+**/android/gradlew.bat
+**/android/local.properties
+**/android/**/GeneratedPluginRegistrant.java
+**/android/key.properties
+*.hprof
+
+# CMake
+**/android/CMakeLists.txt
+
+# NDK
+**/android/.cxx/
+**/android/local.properties
+
+# Generated files
+**/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java
+
+# Exceptions to above rules
+!**/ios/**/default.mode1v3
+!**/ios/**/default.mode2v3
+!**/ios/**/default.pbxuser
+!**/ios/**/default.perspectivev3
+!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
\ No newline at end of file
diff --git a/.metadata b/.metadata
new file mode 100644
index 0000000..bbb2321
--- /dev/null
+++ b/.metadata
@@ -0,0 +1,33 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled and should not be manually edited.
+
+version:
+ revision: "edada7c56edf4a183c1735310e123c7f923584f1"
+ channel: "stable"
+
+project_type: app
+
+# Tracks metadata for the flutter migrate command
+migration:
+ platforms:
+ - platform: root
+ create_revision: edada7c56edf4a183c1735310e123c7f923584f1
+ base_revision: edada7c56edf4a183c1735310e123c7f923584f1
+ - platform: android
+ create_revision: edada7c56edf4a183c1735310e123c7f923584f1
+ base_revision: edada7c56edf4a183c1735310e123c7f923584f1
+ - platform: ios
+ create_revision: edada7c56edf4a183c1735310e123c7f923584f1
+ base_revision: edada7c56edf4a183c1735310e123c7f923584f1
+
+ # User provided section
+
+ # List of Local paths (relative to this file) that should be
+ # ignored by the migrate tool.
+ #
+ # Files that are not part of the templates will be ignored by default.
+ unmanaged_files:
+ - 'lib/main.dart'
+ - 'ios/Runner.xcodeproj/project.pbxproj'
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..f288702
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 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 General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is 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. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ 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.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ 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 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. Use with the GNU Affero General Public License.
+
+ 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 Affero 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 special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU 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 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 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 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 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ 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 GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/PRIVACY_POLICY.md b/PRIVACY_POLICY.md
new file mode 100644
index 0000000..f82a7a2
--- /dev/null
+++ b/PRIVACY_POLICY.md
@@ -0,0 +1,51 @@
+# Conduit Privacy Policy
+
+Effective date: 2025-08-09
+
+Conduit is an open‑source mobile client for Open‑WebUI. This app acts as a client to a server you choose and configure. This policy describes how the app itself handles data on your device. Your configured server may collect, process, and store data under its own policies; please review your server's privacy terms separately.
+
+## Information We Collect
+- Device-stored data: minimal settings and preferences (e.g., theme, UI options) saved locally on your device.
+- Authentication tokens: stored securely on your device using platform secure storage when you sign in to your chosen server.
+- User-provided content: messages, files, and voice input you choose to send are transmitted directly from your device to your configured server. The app does not operate its own backend.
+- Diagnostic information: transient error logs in memory for troubleshooting within a session. The app does not include third‑party analytics.
+
+## How We Use Information
+- Operate core features such as chat, file uploads, and voice input.
+- Remember your preferences and sign‑in state on this device.
+- Improve reliability (e.g., displaying error information to you).
+
+## Data Storage and Transfer
+- Local storage: preferences and credentials are stored on your device. Access tokens are stored using secure storage where available.
+- Network transfer: when you interact with the app, your data is sent to the server you configured. The app does not send your data to any developer‑controlled servers.
+
+## Permissions
+Depending on how you use Conduit, the app may request:
+- Microphone: to capture voice input when you opt in.
+- Photos/Files: to let you pick and upload attachments.
+- Network access: to connect to your configured server.
+
+## Third‑Party Services
+The app does not include third‑party analytics or advertising SDKs. Your configured server or extensions you use may rely on third‑party services subject to their own terms.
+
+## Security
+We use platform‑provided secure storage for sensitive credentials where supported. No security can be guaranteed; protect access to your device and server credentials.
+
+## Data Retention
+- On device: preferences and cached media may persist until you clear app data or uninstall. You can revoke sign‑in by logging out.
+- On server: retention is determined by the server you use; consult that server’s policy.
+
+## Your Choices
+- You can change servers, log out, or clear app data in your device settings.
+- You can choose not to grant optional permissions; some features may not work without them.
+
+## Children’s Privacy
+Conduit is not directed to children under 13 (or the minimum age required in your jurisdiction). Do not use the app if you do not meet the applicable age requirements.
+
+## Changes to This Policy
+We may update this policy to reflect improvements or legal requirements. Material changes will be reflected in the app bundle and version notes.
+
+## Contact
+For questions or requests about this policy, please contact the app maintainer(s) through the project repository.
+
+
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..b66daf3
--- /dev/null
+++ b/README.md
@@ -0,0 +1,133 @@
+# Conduit - Open-WebUI Mobile Client
+
+Conduit is an open-source, cross-platform mobile application for Open-WebUI, providing a native mobile experience for interacting with your self-hosted AI infrastructure.
+
+## Features
+
+### Core Features
+- ✅ **Real-time Chat**: Stream responses from AI models in real-time
+- ✅ **Model Selection**: Choose from available models on your server
+- ✅ **Conversation Management**: Create, search, and manage chat histories
+- ✅ **Markdown Rendering**: Full markdown support with syntax highlighting
+- ✅ **Theme Support**: Light, Dark, and System themes
+
+### Advanced Features
+- ✅ **Voice Input**: Use speech-to-text for hands-free interaction
+- ✅ **File Uploads**: Support for images and documents (RAG)
+- ✅ **Multi-modal Support**: Work with vision models
+- ✅ **Secure Storage**: Credentials stored securely using platform keychains
+
+## Requirements
+
+- Flutter SDK 3.0.0 or higher
+- Android 6.0 (API 23) or higher
+- iOS 12.0 or higher
+- A running Open-WebUI instance
+
+## Installation
+
+1. Clone the repository:
+```bash
+git clone https://github.com/yourusername/conduit.git
+cd conduit
+```
+
+2. Install dependencies:
+```bash
+flutter pub get
+```
+
+3. Generate code:
+```bash
+flutter pub run build_runner build --delete-conflicting-outputs
+```
+
+4. Run the app:
+```bash
+# For iOS
+flutter run -d ios
+
+# For Android
+flutter run -d android
+```
+
+## Building for Release
+
+### Android
+```bash
+flutter build apk --release
+# or for App Bundle
+flutter build appbundle --release
+```
+
+### iOS
+```bash
+flutter build ios --release
+```
+
+## Configuration
+
+### Android
+The app requires the following permissions:
+- Internet access
+- Microphone (for voice input)
+- Camera (for taking photos)
+- Storage (for file selection)
+
+### iOS
+The app will request permissions for:
+- Microphone access (voice input)
+- Speech recognition
+- Camera access
+- Photo library access
+
+## Architecture
+
+The app follows a clean architecture pattern with:
+- **Riverpod** for state management
+- **Dio** for HTTP networking
+- **WebSocket** for real-time streaming
+- **Flutter Secure Storage** for credential management
+
+### Project Structure
+```
+lib/
+├── core/
+│ ├── models/ # Data models
+│ ├── services/ # API and storage services
+│ ├── providers/ # Global state providers
+│ └── utils/ # Utility functions
+├── features/
+│ ├── auth/ # Authentication feature
+│ ├── chat/ # Chat interface feature
+│ ├── server/ # Server connection feature
+│ └── settings/ # Settings feature
+└── shared/
+ ├── theme/ # App theming
+ ├── widgets/ # Shared widgets
+ └── utils/ # Shared utilities
+```
+
+## Contributing
+
+Contributions are welcome! Please feel free to submit a Pull Request.
+
+1. Fork the project
+2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
+3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
+4. Push to the branch (`git push origin feature/AmazingFeature`)
+5. Open a Pull Request
+
+## License
+
+This project is licensed under the GPL3 License - see the LICENSE file for details.
+
+## Acknowledgments
+
+- Open-WebUI team for creating an amazing self-hosted AI interface
+- Flutter team for the excellent mobile framework
+- All contributors and users of Conduit
+
+## Support
+
+For issues and feature requests, please use the [GitHub Issues](https://github.com/cogwheel0/conduit/issues) page.
\ No newline at end of file
diff --git a/analysis_options.yaml b/analysis_options.yaml
new file mode 100644
index 0000000..98bce5f
--- /dev/null
+++ b/analysis_options.yaml
@@ -0,0 +1,32 @@
+# This file configures the analyzer, which statically analyzes Dart code to
+# check for errors, warnings, and lints.
+#
+# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
+# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
+# invoked from the command line by running `flutter analyze`.
+
+# The following line activates a set of recommended lints for Flutter apps,
+# packages, and plugins designed to encourage good coding practices.
+include: package:flutter_lints/flutter.yaml
+
+linter:
+ # The lint rules applied to this project can be customized in the
+ # section below to disable rules from the `package:flutter_lints/flutter.yaml`
+ # included above or to enable additional rules. A list of all available lints
+ # and their documentation is published at https://dart.dev/lints.
+ #
+ # Instead of disabling a lint rule for the entire project in the
+ # section below, it can also be suppressed for a single line of code
+ # or a specific dart file by using the `// ignore: name_of_lint` and
+ # `// ignore_for_file: name_of_lint` syntax on the line or in the file
+ # producing the lint.
+ rules:
+ # avoid_print: false # Uncomment to disable the `avoid_print` rule
+ # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
+
+ # Production-ready rules
+ avoid_print: true # Avoid print statements in production
+ # avoid_web_libraries_in_flutter: true # Avoid web-only libraries
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options
diff --git a/android/.gitignore b/android/.gitignore
new file mode 100644
index 0000000..be3943c
--- /dev/null
+++ b/android/.gitignore
@@ -0,0 +1,14 @@
+gradle-wrapper.jar
+/.gradle
+/captures/
+/gradlew
+/gradlew.bat
+/local.properties
+GeneratedPluginRegistrant.java
+.cxx/
+
+# Remember to never publicly share your keystore.
+# See https://flutter.dev/to/reference-keystore
+key.properties
+**/*.keystore
+**/*.jks
diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts
new file mode 100644
index 0000000..c746461
--- /dev/null
+++ b/android/app/build.gradle.kts
@@ -0,0 +1,70 @@
+import java.util.Properties
+import java.io.FileInputStream
+
+plugins {
+ id("com.android.application")
+ id("kotlin-android")
+ // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
+ id("dev.flutter.flutter-gradle-plugin")
+}
+
+val keystoreProperties = Properties()
+val keystorePropertiesFile = rootProject.file("key.properties")
+if (keystorePropertiesFile.exists()) {
+ keystoreProperties.load(FileInputStream(keystorePropertiesFile))
+}
+
+android {
+ namespace = "app.cogwheel.conduit"
+ compileSdk = flutter.compileSdkVersion
+ ndkVersion = "27.0.12077973"
+
+ defaultConfig {
+ applicationId = "app.cogwheel.conduit"
+ minSdk = 23
+ targetSdk = flutter.targetSdkVersion
+ versionCode = flutter.versionCode
+ versionName = flutter.versionName
+ }
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ }
+
+ kotlinOptions {
+ jvmTarget = JavaVersion.VERSION_11.toString()
+ }
+
+ signingConfigs {
+ if (keystorePropertiesFile.exists()) {
+ create("release") {
+ storeFile = file(keystoreProperties["storeFile"] as String)
+ storePassword = keystoreProperties["storePassword"] as String
+ keyAlias = keystoreProperties["keyAlias"] as String
+ keyPassword = keystoreProperties["keyPassword"] as String
+ }
+ }
+ }
+
+ buildTypes {
+ getByName("release") {
+ if (keystorePropertiesFile.exists()) {
+ signingConfig = signingConfigs.getByName("release")
+ }
+ isMinifyEnabled = true
+ isShrinkResources = true
+ proguardFiles(
+ getDefaultProguardFile("proguard-android-optimize.txt"),
+ "proguard-rules.pro"
+ )
+ }
+ getByName("debug") {
+ // signingConfig = signingConfigs.getByName("debug")
+ }
+ }
+}
+
+flutter {
+ source = "../.."
+}
diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro
new file mode 100644
index 0000000..6553110
--- /dev/null
+++ b/android/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Flutter ProGuard rules
+-keep class io.flutter.app.** { *; }
+-keep class io.flutter.plugin.** { *; }
+-keep class io.flutter.util.** { *; }
+-keep class io.flutter.view.** { *; }
+-keep class io.flutter.** { *; }
+-keep class io.flutter.plugins.** { *; }
+-dontwarn io.flutter.embedding.**
+
+# Keep your app's classes
+-keep class app.cogwheel.conduit.** { *; }
+
+# Keep Gson and JSON serialization
+-keepattributes Signature
+-keepattributes *Annotation*
+-keep class sun.misc.Unsafe { *; }
+-keep class com.google.gson.stream.** { *; }
+
+# Keep WebSocket functionality
+-keep class org.java_websocket.** { *; }
+-dontwarn org.java_websocket.**
\ No newline at end of file
diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml
new file mode 100644
index 0000000..399f698
--- /dev/null
+++ b/android/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..b0cf869
--- /dev/null
+++ b/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/app/cogwheel/conduit/MainActivity.kt b/android/app/src/main/kotlin/app/cogwheel/conduit/MainActivity.kt
new file mode 100644
index 0000000..96845da
--- /dev/null
+++ b/android/app/src/main/kotlin/app/cogwheel/conduit/MainActivity.kt
@@ -0,0 +1,6 @@
+package app.cogwheel.conduit
+
+import io.flutter.embedding.android.FlutterActivity
+
+class MainActivity : FlutterActivity() {
+}
\ No newline at end of file
diff --git a/android/app/src/main/res/drawable-hdpi/splash.png b/android/app/src/main/res/drawable-hdpi/splash.png
new file mode 100644
index 0000000..c754196
Binary files /dev/null and b/android/app/src/main/res/drawable-hdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-mdpi/splash.png b/android/app/src/main/res/drawable-mdpi/splash.png
new file mode 100644
index 0000000..a1f6a19
Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-v21/background.png b/android/app/src/main/res/drawable-v21/background.png
new file mode 100644
index 0000000..e815fd6
Binary files /dev/null and b/android/app/src/main/res/drawable-v21/background.png differ
diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml
new file mode 100644
index 0000000..3cc4948
--- /dev/null
+++ b/android/app/src/main/res/drawable-v21/launch_background.xml
@@ -0,0 +1,9 @@
+
+
+ -
+
+
+ -
+
+
+
diff --git a/android/app/src/main/res/drawable-xhdpi/splash.png b/android/app/src/main/res/drawable-xhdpi/splash.png
new file mode 100644
index 0000000..578245c
Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-xxhdpi/splash.png b/android/app/src/main/res/drawable-xxhdpi/splash.png
new file mode 100644
index 0000000..f32c57b
Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-xxxhdpi/splash.png b/android/app/src/main/res/drawable-xxxhdpi/splash.png
new file mode 100644
index 0000000..b7926e8
Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable/background.png b/android/app/src/main/res/drawable/background.png
new file mode 100644
index 0000000..e815fd6
Binary files /dev/null and b/android/app/src/main/res/drawable/background.png differ
diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml
new file mode 100644
index 0000000..3cc4948
--- /dev/null
+++ b/android/app/src/main/res/drawable/launch_background.xml
@@ -0,0 +1,9 @@
+
+
+ -
+
+
+ -
+
+
+
diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..345888d
--- /dev/null
+++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..540e42b
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png
new file mode 100644
index 0000000..5104457
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..558b310
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png
new file mode 100644
index 0000000..ad45de0
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..80910f8
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png
new file mode 100644
index 0000000..35bcb6f
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..36cd22c
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png
new file mode 100644
index 0000000..54e5739
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..777873d
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png
new file mode 100644
index 0000000..fdbaff9
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..2204658
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png
new file mode 100644
index 0000000..bb2d4b2
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..29f93b2
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png
new file mode 100644
index 0000000..b88d0be
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..6fd9e81
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png
new file mode 100644
index 0000000..d602bb1
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..6e6be10
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png
new file mode 100644
index 0000000..e813402
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..717f3b5
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png
new file mode 100644
index 0000000..66dad69
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png differ
diff --git a/android/app/src/main/res/values-night-v31/styles.xml b/android/app/src/main/res/values-night-v31/styles.xml
new file mode 100644
index 0000000..52d1073
--- /dev/null
+++ b/android/app/src/main/res/values-night-v31/styles.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml
new file mode 100644
index 0000000..dbc9ea9
--- /dev/null
+++ b/android/app/src/main/res/values-night/styles.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/values-v31/styles.xml b/android/app/src/main/res/values-v31/styles.xml
new file mode 100644
index 0000000..a6497f8
--- /dev/null
+++ b/android/app/src/main/res/values-v31/styles.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..0d1fa8f
--- /dev/null
+++ b/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml
new file mode 100644
index 0000000..399f698
--- /dev/null
+++ b/android/app/src/profile/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/android/build.gradle.kts b/android/build.gradle.kts
new file mode 100644
index 0000000..89176ef
--- /dev/null
+++ b/android/build.gradle.kts
@@ -0,0 +1,21 @@
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get()
+rootProject.layout.buildDirectory.value(newBuildDir)
+
+subprojects {
+ val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
+ project.layout.buildDirectory.value(newSubprojectBuildDir)
+}
+subprojects {
+ project.evaluationDependsOn(":app")
+}
+
+tasks.register("clean") {
+ delete(rootProject.layout.buildDirectory)
+}
diff --git a/android/gradle.properties b/android/gradle.properties
new file mode 100644
index 0000000..f018a61
--- /dev/null
+++ b/android/gradle.properties
@@ -0,0 +1,3 @@
+org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
+android.useAndroidX=true
+android.enableJetifier=true
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..ac3b479
--- /dev/null
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip
diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts
new file mode 100644
index 0000000..ab39a10
--- /dev/null
+++ b/android/settings.gradle.kts
@@ -0,0 +1,25 @@
+pluginManagement {
+ val flutterSdkPath = run {
+ val properties = java.util.Properties()
+ file("local.properties").inputStream().use { properties.load(it) }
+ val flutterSdkPath = properties.getProperty("flutter.sdk")
+ require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
+ flutterSdkPath
+ }
+
+ includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
+
+ repositories {
+ google()
+ mavenCentral()
+ gradlePluginPortal()
+ }
+}
+
+plugins {
+ id("dev.flutter.flutter-plugin-loader") version "1.0.0"
+ id("com.android.application") version "8.7.3" apply false
+ id("org.jetbrains.kotlin.android") version "2.1.0" apply false
+}
+
+include(":app")
diff --git a/assets/icons/icon.png b/assets/icons/icon.png
new file mode 100644
index 0000000..3f1eeb9
Binary files /dev/null and b/assets/icons/icon.png differ
diff --git a/assets/openapi.json b/assets/openapi.json
new file mode 100644
index 0000000..4eea14e
--- /dev/null
+++ b/assets/openapi.json
@@ -0,0 +1,22618 @@
+{
+ "openapi": "3.1.0",
+ "info": {
+ "title": "Open WebUI",
+ "version": "0.1.0"
+ },
+ "paths": {
+ "/ollama/": {
+ "get": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Get Status",
+ "operationId": "get_status_ollama__get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Get Status",
+ "operationId": "get_status_ollama__head",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/verify": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Verify Connection",
+ "operationId": "verify_connection_ollama_verify_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/open_webui__routers__ollama__ConnectionVerificationForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/ollama/config": {
+ "get": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Get Config",
+ "operationId": "get_config_ollama_config_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/ollama/config/update": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Update Config",
+ "operationId": "update_config_ollama_config_update_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/open_webui__routers__ollama__OllamaConfigForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/ollama/api/tags/{url_idx}": {
+ "get": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Get Ollama Tags",
+ "operationId": "get_ollama_tags_ollama_api_tags__url_idx__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/api/tags": {
+ "get": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Get Ollama Tags",
+ "operationId": "get_ollama_tags_ollama_api_tags_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/api/ps": {
+ "get": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Get Ollama Loaded Models",
+ "description": "List models that are currently loaded into Ollama memory, and which node they are loaded on.",
+ "operationId": "get_ollama_loaded_models_ollama_api_ps_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/ollama/api/version/{url_idx}": {
+ "get": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Get Ollama Versions",
+ "operationId": "get_ollama_versions_ollama_api_version__url_idx__get",
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/api/version": {
+ "get": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Get Ollama Versions",
+ "operationId": "get_ollama_versions_ollama_api_version_get",
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/api/unload": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Unload Model",
+ "operationId": "unload_model_ollama_api_unload_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ModelNameForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/ollama/api/pull/{url_idx}": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Pull Model",
+ "operationId": "pull_model_ollama_api_pull__url_idx__post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ModelNameForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/api/pull": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Pull Model",
+ "operationId": "pull_model_ollama_api_pull_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer",
+ "default": 0,
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ModelNameForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/api/push/{url_idx}": {
+ "delete": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Push Model",
+ "operationId": "push_model_ollama_api_push__url_idx__delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/PushModelForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/api/push": {
+ "delete": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Push Model",
+ "operationId": "push_model_ollama_api_push_delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/PushModelForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/api/create/{url_idx}": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Create Model",
+ "operationId": "create_model_ollama_api_create__url_idx__post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CreateModelForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/api/create": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Create Model",
+ "operationId": "create_model_ollama_api_create_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer",
+ "default": 0,
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CreateModelForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/api/copy/{url_idx}": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Copy Model",
+ "operationId": "copy_model_ollama_api_copy__url_idx__post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CopyModelForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/api/copy": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Copy Model",
+ "operationId": "copy_model_ollama_api_copy_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CopyModelForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/api/delete/{url_idx}": {
+ "delete": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Delete Model",
+ "operationId": "delete_model_ollama_api_delete__url_idx__delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ModelNameForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/api/delete": {
+ "delete": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Delete Model",
+ "operationId": "delete_model_ollama_api_delete_delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ModelNameForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/api/show": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Show Model Info",
+ "operationId": "show_model_info_ollama_api_show_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ModelNameForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/ollama/api/embed/{url_idx}": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Embed",
+ "operationId": "embed_ollama_api_embed__url_idx__post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/GenerateEmbedForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/api/embed": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Embed",
+ "operationId": "embed_ollama_api_embed_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/GenerateEmbedForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/api/embeddings/{url_idx}": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Embeddings",
+ "operationId": "embeddings_ollama_api_embeddings__url_idx__post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/GenerateEmbeddingsForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/api/embeddings": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Embeddings",
+ "operationId": "embeddings_ollama_api_embeddings_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/GenerateEmbeddingsForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/api/generate/{url_idx}": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Generate Completion",
+ "operationId": "generate_completion_ollama_api_generate__url_idx__post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/GenerateCompletionForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/api/generate": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Generate Completion",
+ "operationId": "generate_completion_ollama_api_generate_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/GenerateCompletionForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/api/chat/{url_idx}": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Generate Chat Completion",
+ "operationId": "generate_chat_completion_ollama_api_chat__url_idx__post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ },
+ {
+ "name": "bypass_filter",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": false,
+ "title": "Bypass Filter"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "additionalProperties": true,
+ "title": "Form Data"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/api/chat": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Generate Chat Completion",
+ "operationId": "generate_chat_completion_ollama_api_chat_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ },
+ {
+ "name": "bypass_filter",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": false,
+ "title": "Bypass Filter"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "additionalProperties": true,
+ "title": "Form Data"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/v1/completions/{url_idx}": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Generate Openai Completion",
+ "operationId": "generate_openai_completion_ollama_v1_completions__url_idx__post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "additionalProperties": true,
+ "title": "Form Data"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/v1/completions": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Generate Openai Completion",
+ "operationId": "generate_openai_completion_ollama_v1_completions_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "additionalProperties": true,
+ "title": "Form Data"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/v1/chat/completions/{url_idx}": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Generate Openai Chat Completion",
+ "operationId": "generate_openai_chat_completion_ollama_v1_chat_completions__url_idx__post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "additionalProperties": true,
+ "title": "Form Data"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/v1/chat/completions": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Generate Openai Chat Completion",
+ "operationId": "generate_openai_chat_completion_ollama_v1_chat_completions_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "additionalProperties": true,
+ "title": "Form Data"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/v1/models/{url_idx}": {
+ "get": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Get Openai Models",
+ "operationId": "get_openai_models_ollama_v1_models__url_idx__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/v1/models": {
+ "get": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Get Openai Models",
+ "operationId": "get_openai_models_ollama_v1_models_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/models/download/{url_idx}": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Download Model",
+ "operationId": "download_model_ollama_models_download__url_idx__post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/UrlForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/models/download": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Download Model",
+ "operationId": "download_model_ollama_models_download_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/UrlForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/models/upload/{url_idx}": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Upload Model",
+ "operationId": "upload_model_ollama_models_upload__url_idx__post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "$ref": "#/components/schemas/Body_upload_model_ollama_models_upload__url_idx__post"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ollama/models/upload": {
+ "post": {
+ "tags": [
+ "ollama"
+ ],
+ "summary": "Upload Model",
+ "operationId": "upload_model_ollama_models_upload_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "$ref": "#/components/schemas/Body_upload_model_ollama_models_upload_post"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/openai/config": {
+ "get": {
+ "tags": [
+ "openai"
+ ],
+ "summary": "Get Config",
+ "operationId": "get_config_openai_config_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/openai/config/update": {
+ "post": {
+ "tags": [
+ "openai"
+ ],
+ "summary": "Update Config",
+ "operationId": "update_config_openai_config_update_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/open_webui__routers__openai__OpenAIConfigForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/openai/audio/speech": {
+ "post": {
+ "tags": [
+ "openai"
+ ],
+ "summary": "Speech",
+ "operationId": "speech_openai_audio_speech_post",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/openai/models/{url_idx}": {
+ "get": {
+ "tags": [
+ "openai"
+ ],
+ "summary": "Get Models",
+ "operationId": "get_models_openai_models__url_idx__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/openai/models": {
+ "get": {
+ "tags": [
+ "openai"
+ ],
+ "summary": "Get Models",
+ "operationId": "get_models_openai_models_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "url_idx",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Url Idx"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/openai/verify": {
+ "post": {
+ "tags": [
+ "openai"
+ ],
+ "summary": "Verify Connection",
+ "operationId": "verify_connection_openai_verify_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/open_webui__routers__openai__ConnectionVerificationForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/openai/chat/completions": {
+ "post": {
+ "tags": [
+ "openai"
+ ],
+ "summary": "Generate Chat Completion",
+ "operationId": "generate_chat_completion_openai_chat_completions_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "bypass_filter",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": false,
+ "title": "Bypass Filter"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "additionalProperties": true,
+ "title": "Form Data"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/openai/{path}": {
+ "post": {
+ "tags": [
+ "openai"
+ ],
+ "summary": "Proxy",
+ "description": "Deprecated: proxy all requests to OpenAI API",
+ "operationId": "proxy_openai__path__post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "path",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Path"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ },
+ "get": {
+ "tags": [
+ "openai"
+ ],
+ "summary": "Proxy",
+ "description": "Deprecated: proxy all requests to OpenAI API",
+ "operationId": "proxy_openai__path__post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "path",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Path"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "openai"
+ ],
+ "summary": "Proxy",
+ "description": "Deprecated: proxy all requests to OpenAI API",
+ "operationId": "proxy_openai__path__post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "path",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Path"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ },
+ "put": {
+ "tags": [
+ "openai"
+ ],
+ "summary": "Proxy",
+ "description": "Deprecated: proxy all requests to OpenAI API",
+ "operationId": "proxy_openai__path__post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "path",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Path"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/pipelines/list": {
+ "get": {
+ "tags": [
+ "pipelines"
+ ],
+ "summary": "Get Pipelines List",
+ "operationId": "get_pipelines_list_api_v1_pipelines_list_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/pipelines/upload": {
+ "post": {
+ "tags": [
+ "pipelines"
+ ],
+ "summary": "Upload Pipeline",
+ "operationId": "upload_pipeline_api_v1_pipelines_upload_post",
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "$ref": "#/components/schemas/Body_upload_pipeline_api_v1_pipelines_upload_post"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/pipelines/add": {
+ "post": {
+ "tags": [
+ "pipelines"
+ ],
+ "summary": "Add Pipeline",
+ "operationId": "add_pipeline_api_v1_pipelines_add_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AddPipelineForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/pipelines/delete": {
+ "delete": {
+ "tags": [
+ "pipelines"
+ ],
+ "summary": "Delete Pipeline",
+ "operationId": "delete_pipeline_api_v1_pipelines_delete_delete",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DeletePipelineForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/pipelines/": {
+ "get": {
+ "tags": [
+ "pipelines"
+ ],
+ "summary": "Get Pipelines",
+ "operationId": "get_pipelines_api_v1_pipelines__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "urlIdx",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Urlidx"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/pipelines/{pipeline_id}/valves": {
+ "get": {
+ "tags": [
+ "pipelines"
+ ],
+ "summary": "Get Pipeline Valves",
+ "operationId": "get_pipeline_valves_api_v1_pipelines__pipeline_id__valves_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "pipeline_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Pipeline Id"
+ }
+ },
+ {
+ "name": "urlIdx",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Urlidx"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/pipelines/{pipeline_id}/valves/spec": {
+ "get": {
+ "tags": [
+ "pipelines"
+ ],
+ "summary": "Get Pipeline Valves Spec",
+ "operationId": "get_pipeline_valves_spec_api_v1_pipelines__pipeline_id__valves_spec_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "pipeline_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Pipeline Id"
+ }
+ },
+ {
+ "name": "urlIdx",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Urlidx"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/pipelines/{pipeline_id}/valves/update": {
+ "post": {
+ "tags": [
+ "pipelines"
+ ],
+ "summary": "Update Pipeline Valves",
+ "operationId": "update_pipeline_valves_api_v1_pipelines__pipeline_id__valves_update_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "pipeline_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Pipeline Id"
+ }
+ },
+ {
+ "name": "urlIdx",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Urlidx"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "additionalProperties": true,
+ "title": "Form Data"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/tasks/config": {
+ "get": {
+ "tags": [
+ "tasks"
+ ],
+ "summary": "Get Task Config",
+ "operationId": "get_task_config_api_v1_tasks_config_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/tasks/config/update": {
+ "post": {
+ "tags": [
+ "tasks"
+ ],
+ "summary": "Update Task Config",
+ "operationId": "update_task_config_api_v1_tasks_config_update_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/TaskConfigForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/tasks/title/completions": {
+ "post": {
+ "tags": [
+ "tasks"
+ ],
+ "summary": "Generate Title",
+ "operationId": "generate_title_api_v1_tasks_title_completions_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Form Data"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/tasks/follow_up/completions": {
+ "post": {
+ "tags": [
+ "tasks"
+ ],
+ "summary": "Generate Follow Ups",
+ "operationId": "generate_follow_ups_api_v1_tasks_follow_up_completions_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Form Data"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/tasks/tags/completions": {
+ "post": {
+ "tags": [
+ "tasks"
+ ],
+ "summary": "Generate Chat Tags",
+ "operationId": "generate_chat_tags_api_v1_tasks_tags_completions_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Form Data"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/tasks/image_prompt/completions": {
+ "post": {
+ "tags": [
+ "tasks"
+ ],
+ "summary": "Generate Image Prompt",
+ "operationId": "generate_image_prompt_api_v1_tasks_image_prompt_completions_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Form Data"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/tasks/queries/completions": {
+ "post": {
+ "tags": [
+ "tasks"
+ ],
+ "summary": "Generate Queries",
+ "operationId": "generate_queries_api_v1_tasks_queries_completions_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Form Data"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/tasks/auto/completions": {
+ "post": {
+ "tags": [
+ "tasks"
+ ],
+ "summary": "Generate Autocompletion",
+ "operationId": "generate_autocompletion_api_v1_tasks_auto_completions_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Form Data"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/tasks/emoji/completions": {
+ "post": {
+ "tags": [
+ "tasks"
+ ],
+ "summary": "Generate Emoji",
+ "operationId": "generate_emoji_api_v1_tasks_emoji_completions_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Form Data"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/tasks/moa/completions": {
+ "post": {
+ "tags": [
+ "tasks"
+ ],
+ "summary": "Generate Moa Response",
+ "operationId": "generate_moa_response_api_v1_tasks_moa_completions_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Form Data"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/images/config": {
+ "get": {
+ "tags": [
+ "images"
+ ],
+ "summary": "Get Config",
+ "operationId": "get_config_api_v1_images_config_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/images/config/update": {
+ "post": {
+ "tags": [
+ "images"
+ ],
+ "summary": "Update Config",
+ "operationId": "update_config_api_v1_images_config_update_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/open_webui__routers__images__ConfigForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/images/config/url/verify": {
+ "get": {
+ "tags": [
+ "images"
+ ],
+ "summary": "Verify Url",
+ "operationId": "verify_url_api_v1_images_config_url_verify_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/images/image/config": {
+ "get": {
+ "tags": [
+ "images"
+ ],
+ "summary": "Get Image Config",
+ "operationId": "get_image_config_api_v1_images_image_config_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/images/image/config/update": {
+ "post": {
+ "tags": [
+ "images"
+ ],
+ "summary": "Update Image Config",
+ "operationId": "update_image_config_api_v1_images_image_config_update_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ImageConfigForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/images/models": {
+ "get": {
+ "tags": [
+ "images"
+ ],
+ "summary": "Get Models",
+ "operationId": "get_models_api_v1_images_models_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/images/generations": {
+ "post": {
+ "tags": [
+ "images"
+ ],
+ "summary": "Image Generations",
+ "operationId": "image_generations_api_v1_images_generations_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/GenerateImageForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/audio/config": {
+ "get": {
+ "tags": [
+ "audio"
+ ],
+ "summary": "Get Audio Config",
+ "operationId": "get_audio_config_api_v1_audio_config_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/audio/config/update": {
+ "post": {
+ "tags": [
+ "audio"
+ ],
+ "summary": "Update Audio Config",
+ "operationId": "update_audio_config_api_v1_audio_config_update_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AudioConfigUpdateForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/audio/speech": {
+ "post": {
+ "tags": [
+ "audio"
+ ],
+ "summary": "Speech",
+ "operationId": "speech_api_v1_audio_speech_post",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/audio/transcriptions": {
+ "post": {
+ "tags": [
+ "audio"
+ ],
+ "summary": "Transcription",
+ "operationId": "transcription_api_v1_audio_transcriptions_post",
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "$ref": "#/components/schemas/Body_transcription_api_v1_audio_transcriptions_post"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/audio/models": {
+ "get": {
+ "tags": [
+ "audio"
+ ],
+ "summary": "Get Models",
+ "operationId": "get_models_api_v1_audio_models_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/audio/voices": {
+ "get": {
+ "tags": [
+ "audio"
+ ],
+ "summary": "Get Voices",
+ "operationId": "get_voices_api_v1_audio_voices_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/retrieval/": {
+ "get": {
+ "tags": [
+ "retrieval"
+ ],
+ "summary": "Get Status",
+ "operationId": "get_status_api_v1_retrieval__get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/retrieval/embedding": {
+ "get": {
+ "tags": [
+ "retrieval"
+ ],
+ "summary": "Get Embedding Config",
+ "operationId": "get_embedding_config_api_v1_retrieval_embedding_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/retrieval/embedding/update": {
+ "post": {
+ "tags": [
+ "retrieval"
+ ],
+ "summary": "Update Embedding Config",
+ "operationId": "update_embedding_config_api_v1_retrieval_embedding_update_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/EmbeddingModelUpdateForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/retrieval/config": {
+ "get": {
+ "tags": [
+ "retrieval"
+ ],
+ "summary": "Get Rag Config",
+ "operationId": "get_rag_config_api_v1_retrieval_config_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/retrieval/config/update": {
+ "post": {
+ "tags": [
+ "retrieval"
+ ],
+ "summary": "Update Rag Config",
+ "operationId": "update_rag_config_api_v1_retrieval_config_update_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/open_webui__routers__retrieval__ConfigForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/retrieval/process/file": {
+ "post": {
+ "tags": [
+ "retrieval"
+ ],
+ "summary": "Process File",
+ "operationId": "process_file_api_v1_retrieval_process_file_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ProcessFileForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/retrieval/process/text": {
+ "post": {
+ "tags": [
+ "retrieval"
+ ],
+ "summary": "Process Text",
+ "operationId": "process_text_api_v1_retrieval_process_text_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ProcessTextForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/retrieval/process/youtube": {
+ "post": {
+ "tags": [
+ "retrieval"
+ ],
+ "summary": "Process Youtube Video",
+ "operationId": "process_youtube_video_api_v1_retrieval_process_youtube_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ProcessUrlForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/retrieval/process/web": {
+ "post": {
+ "tags": [
+ "retrieval"
+ ],
+ "summary": "Process Web",
+ "operationId": "process_web_api_v1_retrieval_process_web_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ProcessUrlForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/retrieval/process/web/search": {
+ "post": {
+ "tags": [
+ "retrieval"
+ ],
+ "summary": "Process Web Search",
+ "operationId": "process_web_search_api_v1_retrieval_process_web_search_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SearchForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/retrieval/query/doc": {
+ "post": {
+ "tags": [
+ "retrieval"
+ ],
+ "summary": "Query Doc Handler",
+ "operationId": "query_doc_handler_api_v1_retrieval_query_doc_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/QueryDocForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/retrieval/query/collection": {
+ "post": {
+ "tags": [
+ "retrieval"
+ ],
+ "summary": "Query Collection Handler",
+ "operationId": "query_collection_handler_api_v1_retrieval_query_collection_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/QueryCollectionsForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/retrieval/delete": {
+ "post": {
+ "tags": [
+ "retrieval"
+ ],
+ "summary": "Delete Entries From Collection",
+ "operationId": "delete_entries_from_collection_api_v1_retrieval_delete_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DeleteForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/retrieval/reset/db": {
+ "post": {
+ "tags": [
+ "retrieval"
+ ],
+ "summary": "Reset Vector Db",
+ "operationId": "reset_vector_db_api_v1_retrieval_reset_db_post",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/retrieval/reset/uploads": {
+ "post": {
+ "tags": [
+ "retrieval"
+ ],
+ "summary": "Reset Upload Dir",
+ "operationId": "reset_upload_dir_api_v1_retrieval_reset_uploads_post",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Reset Upload Dir Api V1 Retrieval Reset Uploads Post"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/retrieval/ef/{text}": {
+ "get": {
+ "tags": [
+ "retrieval"
+ ],
+ "summary": "Get Embeddings",
+ "operationId": "get_embeddings_api_v1_retrieval_ef__text__get",
+ "parameters": [
+ {
+ "name": "text",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Text"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/retrieval/process/files/batch": {
+ "post": {
+ "tags": [
+ "retrieval"
+ ],
+ "summary": "Process Files Batch",
+ "description": "Process a batch of files and save them to the vector database.",
+ "operationId": "process_files_batch_api_v1_retrieval_process_files_batch_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BatchProcessFilesForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BatchProcessFilesResponse"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/configs/import": {
+ "post": {
+ "tags": [
+ "configs"
+ ],
+ "summary": "Import Config",
+ "operationId": "import_config_api_v1_configs_import_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ImportConfigForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Response Import Config Api V1 Configs Import Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/configs/export": {
+ "get": {
+ "tags": [
+ "configs"
+ ],
+ "summary": "Export Config",
+ "operationId": "export_config_api_v1_configs_export_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Response Export Config Api V1 Configs Export Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/configs/connections": {
+ "get": {
+ "tags": [
+ "configs"
+ ],
+ "summary": "Get Connections Config",
+ "operationId": "get_connections_config_api_v1_configs_connections_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ConnectionsConfigForm"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ },
+ "post": {
+ "tags": [
+ "configs"
+ ],
+ "summary": "Set Connections Config",
+ "operationId": "set_connections_config_api_v1_configs_connections_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ConnectionsConfigForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ConnectionsConfigForm"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/configs/tool_servers": {
+ "get": {
+ "tags": [
+ "configs"
+ ],
+ "summary": "Get Tool Servers Config",
+ "operationId": "get_tool_servers_config_api_v1_configs_tool_servers_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ToolServersConfigForm"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ },
+ "post": {
+ "tags": [
+ "configs"
+ ],
+ "summary": "Set Tool Servers Config",
+ "operationId": "set_tool_servers_config_api_v1_configs_tool_servers_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ToolServersConfigForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ToolServersConfigForm"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/configs/tool_servers/verify": {
+ "post": {
+ "tags": [
+ "configs"
+ ],
+ "summary": "Verify Tool Servers Config",
+ "description": "Verify the connection to the tool server.",
+ "operationId": "verify_tool_servers_config_api_v1_configs_tool_servers_verify_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ToolServerConnection"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/configs/code_execution": {
+ "get": {
+ "tags": [
+ "configs"
+ ],
+ "summary": "Get Code Execution Config",
+ "operationId": "get_code_execution_config_api_v1_configs_code_execution_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CodeInterpreterConfigForm"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ },
+ "post": {
+ "tags": [
+ "configs"
+ ],
+ "summary": "Set Code Execution Config",
+ "operationId": "set_code_execution_config_api_v1_configs_code_execution_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CodeInterpreterConfigForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CodeInterpreterConfigForm"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/configs/models": {
+ "get": {
+ "tags": [
+ "configs"
+ ],
+ "summary": "Get Models Config",
+ "operationId": "get_models_config_api_v1_configs_models_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ModelsConfigForm"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ },
+ "post": {
+ "tags": [
+ "configs"
+ ],
+ "summary": "Set Models Config",
+ "operationId": "set_models_config_api_v1_configs_models_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ModelsConfigForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ModelsConfigForm"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/configs/suggestions": {
+ "post": {
+ "tags": [
+ "configs"
+ ],
+ "summary": "Set Default Suggestions",
+ "operationId": "set_default_suggestions_api_v1_configs_suggestions_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SetDefaultSuggestionsForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/PromptSuggestion"
+ },
+ "type": "array",
+ "title": "Response Set Default Suggestions Api V1 Configs Suggestions Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/configs/banners": {
+ "get": {
+ "tags": [
+ "configs"
+ ],
+ "summary": "Get Banners",
+ "operationId": "get_banners_api_v1_configs_banners_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/BannerModel"
+ },
+ "type": "array",
+ "title": "Response Get Banners Api V1 Configs Banners Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ },
+ "post": {
+ "tags": [
+ "configs"
+ ],
+ "summary": "Set Banners",
+ "operationId": "set_banners_api_v1_configs_banners_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SetBannersForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/BannerModel"
+ },
+ "type": "array",
+ "title": "Response Set Banners Api V1 Configs Banners Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/auths/": {
+ "get": {
+ "tags": [
+ "auths"
+ ],
+ "summary": "Get Session User",
+ "operationId": "get_session_user_api_v1_auths__get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SessionUserResponse"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/auths/update/profile": {
+ "post": {
+ "tags": [
+ "auths"
+ ],
+ "summary": "Update Profile",
+ "operationId": "update_profile_api_v1_auths_update_profile_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/UpdateProfileForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/open_webui__models__auths__UserResponse"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/auths/update/password": {
+ "post": {
+ "tags": [
+ "auths"
+ ],
+ "summary": "Update Password",
+ "operationId": "update_password_api_v1_auths_update_password_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/UpdatePasswordForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Update Password Api V1 Auths Update Password Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/auths/ldap": {
+ "post": {
+ "tags": [
+ "auths"
+ ],
+ "summary": "Ldap Auth",
+ "operationId": "ldap_auth_api_v1_auths_ldap_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LdapForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SessionUserResponse"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/auths/signin": {
+ "post": {
+ "tags": [
+ "auths"
+ ],
+ "summary": "Signin",
+ "operationId": "signin_api_v1_auths_signin_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SigninForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SessionUserResponse"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/auths/signup": {
+ "post": {
+ "tags": [
+ "auths"
+ ],
+ "summary": "Signup",
+ "operationId": "signup_api_v1_auths_signup_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SignupForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SessionUserResponse"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/auths/signout": {
+ "get": {
+ "tags": [
+ "auths"
+ ],
+ "summary": "Signout",
+ "operationId": "signout_api_v1_auths_signout_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/auths/add": {
+ "post": {
+ "tags": [
+ "auths"
+ ],
+ "summary": "Add User",
+ "operationId": "add_user_api_v1_auths_add_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AddUserForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SigninResponse"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/auths/admin/details": {
+ "get": {
+ "tags": [
+ "auths"
+ ],
+ "summary": "Get Admin Details",
+ "operationId": "get_admin_details_api_v1_auths_admin_details_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/auths/admin/config": {
+ "get": {
+ "tags": [
+ "auths"
+ ],
+ "summary": "Get Admin Config",
+ "operationId": "get_admin_config_api_v1_auths_admin_config_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ },
+ "post": {
+ "tags": [
+ "auths"
+ ],
+ "summary": "Update Admin Config",
+ "operationId": "update_admin_config_api_v1_auths_admin_config_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AdminConfig"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/auths/admin/config/ldap/server": {
+ "get": {
+ "tags": [
+ "auths"
+ ],
+ "summary": "Get Ldap Server",
+ "operationId": "get_ldap_server_api_v1_auths_admin_config_ldap_server_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LdapServerConfig"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ },
+ "post": {
+ "tags": [
+ "auths"
+ ],
+ "summary": "Update Ldap Server",
+ "operationId": "update_ldap_server_api_v1_auths_admin_config_ldap_server_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LdapServerConfig"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/auths/admin/config/ldap": {
+ "get": {
+ "tags": [
+ "auths"
+ ],
+ "summary": "Get Ldap Config",
+ "operationId": "get_ldap_config_api_v1_auths_admin_config_ldap_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ },
+ "post": {
+ "tags": [
+ "auths"
+ ],
+ "summary": "Update Ldap Config",
+ "operationId": "update_ldap_config_api_v1_auths_admin_config_ldap_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LdapConfigForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/auths/api_key": {
+ "get": {
+ "tags": [
+ "auths"
+ ],
+ "summary": "Get Api Key",
+ "operationId": "get_api_key_api_v1_auths_api_key_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ApiKey"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ },
+ "post": {
+ "tags": [
+ "auths"
+ ],
+ "summary": "Generate Api Key",
+ "operationId": "generate_api_key_api_v1_auths_api_key_post",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ApiKey"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ },
+ "delete": {
+ "tags": [
+ "auths"
+ ],
+ "summary": "Delete Api Key",
+ "operationId": "delete_api_key_api_v1_auths_api_key_delete",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Delete Api Key Api V1 Auths Api Key Delete"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/users/active": {
+ "get": {
+ "tags": [
+ "users"
+ ],
+ "summary": "Get Active Users",
+ "description": "Get a list of active users.",
+ "operationId": "get_active_users_api_v1_users_active_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/users/": {
+ "get": {
+ "tags": [
+ "users"
+ ],
+ "summary": "Get Users",
+ "operationId": "get_users_api_v1_users__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "query",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Query"
+ }
+ },
+ {
+ "name": "order_by",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Order By"
+ }
+ },
+ {
+ "name": "direction",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Direction"
+ }
+ },
+ {
+ "name": "page",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": 1,
+ "title": "Page"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/UserListResponse"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/users/all": {
+ "get": {
+ "tags": [
+ "users"
+ ],
+ "summary": "Get All Users",
+ "operationId": "get_all_users_api_v1_users_all_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/UserInfoListResponse"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/users/groups": {
+ "get": {
+ "tags": [
+ "users"
+ ],
+ "summary": "Get User Groups",
+ "operationId": "get_user_groups_api_v1_users_groups_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/users/permissions": {
+ "get": {
+ "tags": [
+ "users"
+ ],
+ "summary": "Get User Permissisions",
+ "operationId": "get_user_permissisions_api_v1_users_permissions_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/users/default/permissions": {
+ "get": {
+ "tags": [
+ "users"
+ ],
+ "summary": "Get Default User Permissions",
+ "operationId": "get_default_user_permissions_api_v1_users_default_permissions_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/UserPermissions"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ },
+ "post": {
+ "tags": [
+ "users"
+ ],
+ "summary": "Update Default User Permissions",
+ "operationId": "update_default_user_permissions_api_v1_users_default_permissions_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/UserPermissions"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/users/user/settings": {
+ "get": {
+ "tags": [
+ "users"
+ ],
+ "summary": "Get User Settings By Session User",
+ "operationId": "get_user_settings_by_session_user_api_v1_users_user_settings_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/UserSettings"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get User Settings By Session User Api V1 Users User Settings Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/users/user/settings/update": {
+ "post": {
+ "tags": [
+ "users"
+ ],
+ "summary": "Update User Settings By Session User",
+ "operationId": "update_user_settings_by_session_user_api_v1_users_user_settings_update_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/UserSettings"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/UserSettings"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/users/user/info": {
+ "get": {
+ "tags": [
+ "users"
+ ],
+ "summary": "Get User Info By Session User",
+ "operationId": "get_user_info_by_session_user_api_v1_users_user_info_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get User Info By Session User Api V1 Users User Info Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/users/user/info/update": {
+ "post": {
+ "tags": [
+ "users"
+ ],
+ "summary": "Update User Info By Session User",
+ "operationId": "update_user_info_by_session_user_api_v1_users_user_info_update_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Form Data"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Update User Info By Session User Api V1 Users User Info Update Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/users/{user_id}": {
+ "get": {
+ "tags": [
+ "users"
+ ],
+ "summary": "Get User By Id",
+ "operationId": "get_user_by_id_api_v1_users__user_id__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "user_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "User Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/open_webui__routers__users__UserResponse"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "users"
+ ],
+ "summary": "Delete User By Id",
+ "operationId": "delete_user_by_id_api_v1_users__user_id__delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "user_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "User Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Delete User By Id Api V1 Users User Id Delete"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/users/{user_id}/active": {
+ "get": {
+ "tags": [
+ "users"
+ ],
+ "summary": "Get User Active Status By Id",
+ "operationId": "get_user_active_status_by_id_api_v1_users__user_id__active_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "user_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "User Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "additionalProperties": true,
+ "title": "Response Get User Active Status By Id Api V1 Users User Id Active Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/users/{user_id}/update": {
+ "post": {
+ "tags": [
+ "users"
+ ],
+ "summary": "Update User By Id",
+ "operationId": "update_user_by_id_api_v1_users__user_id__update_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "user_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "User Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/UserUpdateForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/UserModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Update User By Id Api V1 Users User Id Update Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/channels/": {
+ "get": {
+ "tags": [
+ "channels"
+ ],
+ "summary": "Get Channels",
+ "operationId": "get_channels_api_v1_channels__get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/ChannelModel"
+ },
+ "type": "array",
+ "title": "Response Get Channels Api V1 Channels Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/channels/list": {
+ "get": {
+ "tags": [
+ "channels"
+ ],
+ "summary": "Get All Channels",
+ "operationId": "get_all_channels_api_v1_channels_list_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/ChannelModel"
+ },
+ "type": "array",
+ "title": "Response Get All Channels Api V1 Channels List Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/channels/create": {
+ "post": {
+ "tags": [
+ "channels"
+ ],
+ "summary": "Create New Channel",
+ "operationId": "create_new_channel_api_v1_channels_create_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ChannelForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ChannelModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Create New Channel Api V1 Channels Create Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/channels/{id}": {
+ "get": {
+ "tags": [
+ "channels"
+ ],
+ "summary": "Get Channel By Id",
+ "operationId": "get_channel_by_id_api_v1_channels__id__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ChannelModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get Channel By Id Api V1 Channels Id Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/channels/{id}/update": {
+ "post": {
+ "tags": [
+ "channels"
+ ],
+ "summary": "Update Channel By Id",
+ "operationId": "update_channel_by_id_api_v1_channels__id__update_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ChannelForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ChannelModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Update Channel By Id Api V1 Channels Id Update Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/channels/{id}/delete": {
+ "delete": {
+ "tags": [
+ "channels"
+ ],
+ "summary": "Delete Channel By Id",
+ "operationId": "delete_channel_by_id_api_v1_channels__id__delete_delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Delete Channel By Id Api V1 Channels Id Delete Delete"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/channels/{id}/messages": {
+ "get": {
+ "tags": [
+ "channels"
+ ],
+ "summary": "Get Channel Messages",
+ "operationId": "get_channel_messages_api_v1_channels__id__messages_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ },
+ {
+ "name": "skip",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer",
+ "default": 0,
+ "title": "Skip"
+ }
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer",
+ "default": 50,
+ "title": "Limit"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/MessageUserResponse"
+ },
+ "title": "Response Get Channel Messages Api V1 Channels Id Messages Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/channels/{id}/messages/post": {
+ "post": {
+ "tags": [
+ "channels"
+ ],
+ "summary": "Post New Message",
+ "operationId": "post_new_message_api_v1_channels__id__messages_post_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/open_webui__models__messages__MessageForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/MessageModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Post New Message Api V1 Channels Id Messages Post Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/channels/{id}/messages/{message_id}": {
+ "get": {
+ "tags": [
+ "channels"
+ ],
+ "summary": "Get Channel Message",
+ "operationId": "get_channel_message_api_v1_channels__id__messages__message_id__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ },
+ {
+ "name": "message_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Message Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/MessageUserResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get Channel Message Api V1 Channels Id Messages Message Id Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/channels/{id}/messages/{message_id}/thread": {
+ "get": {
+ "tags": [
+ "channels"
+ ],
+ "summary": "Get Channel Thread Messages",
+ "operationId": "get_channel_thread_messages_api_v1_channels__id__messages__message_id__thread_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ },
+ {
+ "name": "message_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Message Id"
+ }
+ },
+ {
+ "name": "skip",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer",
+ "default": 0,
+ "title": "Skip"
+ }
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer",
+ "default": 50,
+ "title": "Limit"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/MessageUserResponse"
+ },
+ "title": "Response Get Channel Thread Messages Api V1 Channels Id Messages Message Id Thread Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/channels/{id}/messages/{message_id}/update": {
+ "post": {
+ "tags": [
+ "channels"
+ ],
+ "summary": "Update Message By Id",
+ "operationId": "update_message_by_id_api_v1_channels__id__messages__message_id__update_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ },
+ {
+ "name": "message_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Message Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/open_webui__models__messages__MessageForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/MessageModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Update Message By Id Api V1 Channels Id Messages Message Id Update Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/channels/{id}/messages/{message_id}/reactions/add": {
+ "post": {
+ "tags": [
+ "channels"
+ ],
+ "summary": "Add Reaction To Message",
+ "operationId": "add_reaction_to_message_api_v1_channels__id__messages__message_id__reactions_add_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ },
+ {
+ "name": "message_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Message Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ReactionForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Add Reaction To Message Api V1 Channels Id Messages Message Id Reactions Add Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/channels/{id}/messages/{message_id}/reactions/remove": {
+ "post": {
+ "tags": [
+ "channels"
+ ],
+ "summary": "Remove Reaction By Id And User Id And Name",
+ "operationId": "remove_reaction_by_id_and_user_id_and_name_api_v1_channels__id__messages__message_id__reactions_remove_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ },
+ {
+ "name": "message_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Message Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ReactionForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Remove Reaction By Id And User Id And Name Api V1 Channels Id Messages Message Id Reactions Remove Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/channels/{id}/messages/{message_id}/delete": {
+ "delete": {
+ "tags": [
+ "channels"
+ ],
+ "summary": "Delete Message By Id",
+ "operationId": "delete_message_by_id_api_v1_channels__id__messages__message_id__delete_delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ },
+ {
+ "name": "message_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Message Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Delete Message By Id Api V1 Channels Id Messages Message Id Delete Delete"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/chats/list": {
+ "get": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Get Session User Chat List",
+ "operationId": "get_session_user_chat_list_api_v1_chats_list_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "page",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Page"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ChatTitleIdResponse"
+ },
+ "title": "Response Get Session User Chat List Api V1 Chats List Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/chats/": {
+ "get": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Get Session User Chat List",
+ "operationId": "get_session_user_chat_list_api_v1_chats__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "page",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Page"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ChatTitleIdResponse"
+ },
+ "title": "Response Get Session User Chat List Api V1 Chats Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Delete All User Chats",
+ "operationId": "delete_all_user_chats_api_v1_chats__delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Delete All User Chats Api V1 Chats Delete"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/chats/list/user/{user_id}": {
+ "get": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Get User Chat List By User Id",
+ "operationId": "get_user_chat_list_by_user_id_api_v1_chats_list_user__user_id__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "user_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "User Id"
+ }
+ },
+ {
+ "name": "page",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Page"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Query"
+ }
+ },
+ {
+ "name": "order_by",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Order By"
+ }
+ },
+ {
+ "name": "direction",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Direction"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ChatTitleIdResponse"
+ },
+ "title": "Response Get User Chat List By User Id Api V1 Chats List User User Id Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/chats/new": {
+ "post": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Create New Chat",
+ "operationId": "create_new_chat_api_v1_chats_new_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ChatForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ChatResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Create New Chat Api V1 Chats New Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/chats/import": {
+ "post": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Import Chat",
+ "operationId": "import_chat_api_v1_chats_import_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ChatImportForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ChatResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Import Chat Api V1 Chats Import Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/chats/search": {
+ "get": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Search User Chats",
+ "operationId": "search_user_chats_api_v1_chats_search_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "text",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Text"
+ }
+ },
+ {
+ "name": "page",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Page"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ChatTitleIdResponse"
+ },
+ "title": "Response Search User Chats Api V1 Chats Search Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/chats/folder/{folder_id}": {
+ "get": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Get Chats By Folder Id",
+ "operationId": "get_chats_by_folder_id_api_v1_chats_folder__folder_id__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "folder_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Folder Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ChatResponse"
+ },
+ "title": "Response Get Chats By Folder Id Api V1 Chats Folder Folder Id Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/chats/pinned": {
+ "get": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Get User Pinned Chats",
+ "operationId": "get_user_pinned_chats_api_v1_chats_pinned_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/ChatTitleIdResponse"
+ },
+ "type": "array",
+ "title": "Response Get User Pinned Chats Api V1 Chats Pinned Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/chats/all": {
+ "get": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Get User Chats",
+ "operationId": "get_user_chats_api_v1_chats_all_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/ChatResponse"
+ },
+ "type": "array",
+ "title": "Response Get User Chats Api V1 Chats All Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/chats/all/archived": {
+ "get": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Get User Archived Chats",
+ "operationId": "get_user_archived_chats_api_v1_chats_all_archived_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/ChatResponse"
+ },
+ "type": "array",
+ "title": "Response Get User Archived Chats Api V1 Chats All Archived Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/chats/all/tags": {
+ "get": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Get All User Tags",
+ "operationId": "get_all_user_tags_api_v1_chats_all_tags_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/TagModel"
+ },
+ "type": "array",
+ "title": "Response Get All User Tags Api V1 Chats All Tags Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/chats/all/db": {
+ "get": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Get All User Chats In Db",
+ "operationId": "get_all_user_chats_in_db_api_v1_chats_all_db_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/ChatResponse"
+ },
+ "type": "array",
+ "title": "Response Get All User Chats In Db Api V1 Chats All Db Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/chats/archived": {
+ "get": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Get Archived Session User Chat List",
+ "operationId": "get_archived_session_user_chat_list_api_v1_chats_archived_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "page",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Page"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Query"
+ }
+ },
+ {
+ "name": "order_by",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Order By"
+ }
+ },
+ {
+ "name": "direction",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Direction"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ChatTitleIdResponse"
+ },
+ "title": "Response Get Archived Session User Chat List Api V1 Chats Archived Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/chats/archive/all": {
+ "post": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Archive All Chats",
+ "operationId": "archive_all_chats_api_v1_chats_archive_all_post",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Archive All Chats Api V1 Chats Archive All Post"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/chats/share/{share_id}": {
+ "get": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Get Shared Chat By Id",
+ "operationId": "get_shared_chat_by_id_api_v1_chats_share__share_id__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "share_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Share Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ChatResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get Shared Chat By Id Api V1 Chats Share Share Id Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/chats/tags": {
+ "post": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Get User Chat List By Tag Name",
+ "operationId": "get_user_chat_list_by_tag_name_api_v1_chats_tags_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/TagFilterForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/ChatTitleIdResponse"
+ },
+ "type": "array",
+ "title": "Response Get User Chat List By Tag Name Api V1 Chats Tags Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/chats/{id}": {
+ "get": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Get Chat By Id",
+ "operationId": "get_chat_by_id_api_v1_chats__id__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ChatResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get Chat By Id Api V1 Chats Id Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Update Chat By Id",
+ "operationId": "update_chat_by_id_api_v1_chats__id__post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ChatForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ChatResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Update Chat By Id Api V1 Chats Id Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Delete Chat By Id",
+ "operationId": "delete_chat_by_id_api_v1_chats__id__delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Delete Chat By Id Api V1 Chats Id Delete"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/chats/{id}/messages/{message_id}": {
+ "post": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Update Chat Message By Id",
+ "operationId": "update_chat_message_by_id_api_v1_chats__id__messages__message_id__post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ },
+ {
+ "name": "message_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Message Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/open_webui__routers__chats__MessageForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ChatResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Update Chat Message By Id Api V1 Chats Id Messages Message Id Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/chats/{id}/messages/{message_id}/event": {
+ "post": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Send Chat Message Event By Id",
+ "operationId": "send_chat_message_event_by_id_api_v1_chats__id__messages__message_id__event_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ },
+ {
+ "name": "message_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Message Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/EventForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Send Chat Message Event By Id Api V1 Chats Id Messages Message Id Event Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/chats/{id}/pinned": {
+ "get": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Get Pinned Status By Id",
+ "operationId": "get_pinned_status_by_id_api_v1_chats__id__pinned_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get Pinned Status By Id Api V1 Chats Id Pinned Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/chats/{id}/pin": {
+ "post": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Pin Chat By Id",
+ "operationId": "pin_chat_by_id_api_v1_chats__id__pin_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ChatResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Pin Chat By Id Api V1 Chats Id Pin Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/chats/{id}/clone": {
+ "post": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Clone Chat By Id",
+ "operationId": "clone_chat_by_id_api_v1_chats__id__clone_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CloneForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ChatResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Clone Chat By Id Api V1 Chats Id Clone Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/chats/{id}/clone/shared": {
+ "post": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Clone Shared Chat By Id",
+ "operationId": "clone_shared_chat_by_id_api_v1_chats__id__clone_shared_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ChatResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Clone Shared Chat By Id Api V1 Chats Id Clone Shared Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/chats/{id}/archive": {
+ "post": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Archive Chat By Id",
+ "operationId": "archive_chat_by_id_api_v1_chats__id__archive_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ChatResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Archive Chat By Id Api V1 Chats Id Archive Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/chats/{id}/share": {
+ "post": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Share Chat By Id",
+ "operationId": "share_chat_by_id_api_v1_chats__id__share_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ChatResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Share Chat By Id Api V1 Chats Id Share Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Delete Shared Chat By Id",
+ "operationId": "delete_shared_chat_by_id_api_v1_chats__id__share_delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Delete Shared Chat By Id Api V1 Chats Id Share Delete"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/chats/{id}/folder": {
+ "post": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Update Chat Folder Id By Id",
+ "operationId": "update_chat_folder_id_by_id_api_v1_chats__id__folder_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ChatFolderIdForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ChatResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Update Chat Folder Id By Id Api V1 Chats Id Folder Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/chats/{id}/tags": {
+ "get": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Get Chat Tags By Id",
+ "operationId": "get_chat_tags_by_id_api_v1_chats__id__tags_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/TagModel"
+ },
+ "title": "Response Get Chat Tags By Id Api V1 Chats Id Tags Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Add Tag By Id And Tag Name",
+ "operationId": "add_tag_by_id_and_tag_name_api_v1_chats__id__tags_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/TagForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/TagModel"
+ },
+ "title": "Response Add Tag By Id And Tag Name Api V1 Chats Id Tags Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Delete Tag By Id And Tag Name",
+ "operationId": "delete_tag_by_id_and_tag_name_api_v1_chats__id__tags_delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/TagForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/TagModel"
+ },
+ "title": "Response Delete Tag By Id And Tag Name Api V1 Chats Id Tags Delete"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/chats/{id}/tags/all": {
+ "delete": {
+ "tags": [
+ "chats"
+ ],
+ "summary": "Delete All Tags By Id",
+ "operationId": "delete_all_tags_by_id_api_v1_chats__id__tags_all_delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Delete All Tags By Id Api V1 Chats Id Tags All Delete"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/notes/": {
+ "get": {
+ "tags": [
+ "notes"
+ ],
+ "summary": "Get Notes",
+ "operationId": "get_notes_api_v1_notes__get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/NoteUserResponse"
+ },
+ "type": "array",
+ "title": "Response Get Notes Api V1 Notes Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/notes/list": {
+ "get": {
+ "tags": [
+ "notes"
+ ],
+ "summary": "Get Note List",
+ "operationId": "get_note_list_api_v1_notes_list_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/NoteTitleIdResponse"
+ },
+ "type": "array",
+ "title": "Response Get Note List Api V1 Notes List Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/notes/create": {
+ "post": {
+ "tags": [
+ "notes"
+ ],
+ "summary": "Create New Note",
+ "operationId": "create_new_note_api_v1_notes_create_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NoteForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/NoteModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Create New Note Api V1 Notes Create Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/notes/{id}": {
+ "get": {
+ "tags": [
+ "notes"
+ ],
+ "summary": "Get Note By Id",
+ "operationId": "get_note_by_id_api_v1_notes__id__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/NoteModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get Note By Id Api V1 Notes Id Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/notes/{id}/update": {
+ "post": {
+ "tags": [
+ "notes"
+ ],
+ "summary": "Update Note By Id",
+ "operationId": "update_note_by_id_api_v1_notes__id__update_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NoteForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/NoteModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Update Note By Id Api V1 Notes Id Update Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/notes/{id}/delete": {
+ "delete": {
+ "tags": [
+ "notes"
+ ],
+ "summary": "Delete Note By Id",
+ "operationId": "delete_note_by_id_api_v1_notes__id__delete_delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Delete Note By Id Api V1 Notes Id Delete Delete"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/models/": {
+ "get": {
+ "tags": [
+ "models"
+ ],
+ "summary": "Get Models",
+ "operationId": "get_models_api_v1_models__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ModelUserResponse"
+ },
+ "title": "Response Get Models Api V1 Models Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/models/base": {
+ "get": {
+ "tags": [
+ "models"
+ ],
+ "summary": "Get Base Models",
+ "operationId": "get_base_models_api_v1_models_base_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/ModelResponse"
+ },
+ "type": "array",
+ "title": "Response Get Base Models Api V1 Models Base Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/models/create": {
+ "post": {
+ "tags": [
+ "models"
+ ],
+ "summary": "Create New Model",
+ "operationId": "create_new_model_api_v1_models_create_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ModelForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ModelModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Create New Model Api V1 Models Create Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/models/model": {
+ "get": {
+ "tags": [
+ "models"
+ ],
+ "summary": "Get Model By Id",
+ "operationId": "get_model_by_id_api_v1_models_model_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ModelResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get Model By Id Api V1 Models Model Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/models/model/toggle": {
+ "post": {
+ "tags": [
+ "models"
+ ],
+ "summary": "Toggle Model By Id",
+ "operationId": "toggle_model_by_id_api_v1_models_model_toggle_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ModelResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Toggle Model By Id Api V1 Models Model Toggle Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/models/model/update": {
+ "post": {
+ "tags": [
+ "models"
+ ],
+ "summary": "Update Model By Id",
+ "operationId": "update_model_by_id_api_v1_models_model_update_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ModelForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ModelModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Update Model By Id Api V1 Models Model Update Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/models/model/delete": {
+ "delete": {
+ "tags": [
+ "models"
+ ],
+ "summary": "Delete Model By Id",
+ "operationId": "delete_model_by_id_api_v1_models_model_delete_delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Delete Model By Id Api V1 Models Model Delete Delete"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/models/delete/all": {
+ "delete": {
+ "tags": [
+ "models"
+ ],
+ "summary": "Delete All Models",
+ "operationId": "delete_all_models_api_v1_models_delete_all_delete",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Delete All Models Api V1 Models Delete All Delete"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/knowledge/": {
+ "get": {
+ "tags": [
+ "knowledge"
+ ],
+ "summary": "Get Knowledge",
+ "operationId": "get_knowledge_api_v1_knowledge__get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/KnowledgeUserResponse"
+ },
+ "type": "array",
+ "title": "Response Get Knowledge Api V1 Knowledge Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/knowledge/list": {
+ "get": {
+ "tags": [
+ "knowledge"
+ ],
+ "summary": "Get Knowledge List",
+ "operationId": "get_knowledge_list_api_v1_knowledge_list_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/KnowledgeUserResponse"
+ },
+ "type": "array",
+ "title": "Response Get Knowledge List Api V1 Knowledge List Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/knowledge/create": {
+ "post": {
+ "tags": [
+ "knowledge"
+ ],
+ "summary": "Create New Knowledge",
+ "operationId": "create_new_knowledge_api_v1_knowledge_create_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/KnowledgeForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/KnowledgeResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Create New Knowledge Api V1 Knowledge Create Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/knowledge/reindex": {
+ "post": {
+ "tags": [
+ "knowledge"
+ ],
+ "summary": "Reindex Knowledge Files",
+ "operationId": "reindex_knowledge_files_api_v1_knowledge_reindex_post",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Reindex Knowledge Files Api V1 Knowledge Reindex Post"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/knowledge/{id}": {
+ "get": {
+ "tags": [
+ "knowledge"
+ ],
+ "summary": "Get Knowledge By Id",
+ "operationId": "get_knowledge_by_id_api_v1_knowledge__id__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/KnowledgeFilesResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get Knowledge By Id Api V1 Knowledge Id Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/knowledge/{id}/update": {
+ "post": {
+ "tags": [
+ "knowledge"
+ ],
+ "summary": "Update Knowledge By Id",
+ "operationId": "update_knowledge_by_id_api_v1_knowledge__id__update_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/KnowledgeForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/KnowledgeFilesResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Update Knowledge By Id Api V1 Knowledge Id Update Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/knowledge/{id}/file/add": {
+ "post": {
+ "tags": [
+ "knowledge"
+ ],
+ "summary": "Add File To Knowledge By Id",
+ "operationId": "add_file_to_knowledge_by_id_api_v1_knowledge__id__file_add_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/KnowledgeFileIdForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/KnowledgeFilesResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Add File To Knowledge By Id Api V1 Knowledge Id File Add Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/knowledge/{id}/file/update": {
+ "post": {
+ "tags": [
+ "knowledge"
+ ],
+ "summary": "Update File From Knowledge By Id",
+ "operationId": "update_file_from_knowledge_by_id_api_v1_knowledge__id__file_update_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/KnowledgeFileIdForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/KnowledgeFilesResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Update File From Knowledge By Id Api V1 Knowledge Id File Update Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/knowledge/{id}/file/remove": {
+ "post": {
+ "tags": [
+ "knowledge"
+ ],
+ "summary": "Remove File From Knowledge By Id",
+ "operationId": "remove_file_from_knowledge_by_id_api_v1_knowledge__id__file_remove_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/KnowledgeFileIdForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/KnowledgeFilesResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Remove File From Knowledge By Id Api V1 Knowledge Id File Remove Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/knowledge/{id}/delete": {
+ "delete": {
+ "tags": [
+ "knowledge"
+ ],
+ "summary": "Delete Knowledge By Id",
+ "operationId": "delete_knowledge_by_id_api_v1_knowledge__id__delete_delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Delete Knowledge By Id Api V1 Knowledge Id Delete Delete"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/knowledge/{id}/reset": {
+ "post": {
+ "tags": [
+ "knowledge"
+ ],
+ "summary": "Reset Knowledge By Id",
+ "operationId": "reset_knowledge_by_id_api_v1_knowledge__id__reset_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/KnowledgeResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Reset Knowledge By Id Api V1 Knowledge Id Reset Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/knowledge/{id}/files/batch/add": {
+ "post": {
+ "tags": [
+ "knowledge"
+ ],
+ "summary": "Add Files To Knowledge Batch",
+ "description": "Add multiple files to a knowledge base",
+ "operationId": "add_files_to_knowledge_batch_api_v1_knowledge__id__files_batch_add_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/KnowledgeFileIdForm"
+ },
+ "title": "Form Data"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/KnowledgeFilesResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Add Files To Knowledge Batch Api V1 Knowledge Id Files Batch Add Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/prompts/": {
+ "get": {
+ "tags": [
+ "prompts"
+ ],
+ "summary": "Get Prompts",
+ "operationId": "get_prompts_api_v1_prompts__get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/PromptModel"
+ },
+ "type": "array",
+ "title": "Response Get Prompts Api V1 Prompts Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/prompts/list": {
+ "get": {
+ "tags": [
+ "prompts"
+ ],
+ "summary": "Get Prompt List",
+ "operationId": "get_prompt_list_api_v1_prompts_list_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/PromptUserResponse"
+ },
+ "type": "array",
+ "title": "Response Get Prompt List Api V1 Prompts List Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/prompts/create": {
+ "post": {
+ "tags": [
+ "prompts"
+ ],
+ "summary": "Create New Prompt",
+ "operationId": "create_new_prompt_api_v1_prompts_create_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/PromptForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/PromptModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Create New Prompt Api V1 Prompts Create Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/prompts/command/{command}": {
+ "get": {
+ "tags": [
+ "prompts"
+ ],
+ "summary": "Get Prompt By Command",
+ "operationId": "get_prompt_by_command_api_v1_prompts_command__command__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "command",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Command"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/PromptModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get Prompt By Command Api V1 Prompts Command Command Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/prompts/command/{command}/update": {
+ "post": {
+ "tags": [
+ "prompts"
+ ],
+ "summary": "Update Prompt By Command",
+ "operationId": "update_prompt_by_command_api_v1_prompts_command__command__update_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "command",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Command"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/PromptForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/PromptModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Update Prompt By Command Api V1 Prompts Command Command Update Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/prompts/command/{command}/delete": {
+ "delete": {
+ "tags": [
+ "prompts"
+ ],
+ "summary": "Delete Prompt By Command",
+ "operationId": "delete_prompt_by_command_api_v1_prompts_command__command__delete_delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "command",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Command"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Delete Prompt By Command Api V1 Prompts Command Command Delete Delete"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/tools/": {
+ "get": {
+ "tags": [
+ "tools"
+ ],
+ "summary": "Get Tools",
+ "operationId": "get_tools_api_v1_tools__get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/ToolUserResponse"
+ },
+ "type": "array",
+ "title": "Response Get Tools Api V1 Tools Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/tools/list": {
+ "get": {
+ "tags": [
+ "tools"
+ ],
+ "summary": "Get Tool List",
+ "operationId": "get_tool_list_api_v1_tools_list_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/ToolUserResponse"
+ },
+ "type": "array",
+ "title": "Response Get Tool List Api V1 Tools List Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/tools/load/url": {
+ "post": {
+ "tags": [
+ "tools"
+ ],
+ "summary": "Load Tool From Url",
+ "operationId": "load_tool_from_url_api_v1_tools_load_url_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LoadUrlForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Load Tool From Url Api V1 Tools Load Url Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/tools/export": {
+ "get": {
+ "tags": [
+ "tools"
+ ],
+ "summary": "Export Tools",
+ "operationId": "export_tools_api_v1_tools_export_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/ToolModel"
+ },
+ "type": "array",
+ "title": "Response Export Tools Api V1 Tools Export Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/tools/create": {
+ "post": {
+ "tags": [
+ "tools"
+ ],
+ "summary": "Create New Tools",
+ "operationId": "create_new_tools_api_v1_tools_create_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ToolForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ToolResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Create New Tools Api V1 Tools Create Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/tools/id/{id}": {
+ "get": {
+ "tags": [
+ "tools"
+ ],
+ "summary": "Get Tools By Id",
+ "operationId": "get_tools_by_id_api_v1_tools_id__id__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ToolModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get Tools By Id Api V1 Tools Id Id Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/tools/id/{id}/update": {
+ "post": {
+ "tags": [
+ "tools"
+ ],
+ "summary": "Update Tools By Id",
+ "operationId": "update_tools_by_id_api_v1_tools_id__id__update_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ToolForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ToolModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Update Tools By Id Api V1 Tools Id Id Update Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/tools/id/{id}/delete": {
+ "delete": {
+ "tags": [
+ "tools"
+ ],
+ "summary": "Delete Tools By Id",
+ "operationId": "delete_tools_by_id_api_v1_tools_id__id__delete_delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Delete Tools By Id Api V1 Tools Id Id Delete Delete"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/tools/id/{id}/valves": {
+ "get": {
+ "tags": [
+ "tools"
+ ],
+ "summary": "Get Tools Valves By Id",
+ "operationId": "get_tools_valves_by_id_api_v1_tools_id__id__valves_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "type": "object",
+ "additionalProperties": true
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get Tools Valves By Id Api V1 Tools Id Id Valves Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/tools/id/{id}/valves/spec": {
+ "get": {
+ "tags": [
+ "tools"
+ ],
+ "summary": "Get Tools Valves Spec By Id",
+ "operationId": "get_tools_valves_spec_by_id_api_v1_tools_id__id__valves_spec_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "type": "object",
+ "additionalProperties": true
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get Tools Valves Spec By Id Api V1 Tools Id Id Valves Spec Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/tools/id/{id}/valves/update": {
+ "post": {
+ "tags": [
+ "tools"
+ ],
+ "summary": "Update Tools Valves By Id",
+ "operationId": "update_tools_valves_by_id_api_v1_tools_id__id__valves_update_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "additionalProperties": true,
+ "title": "Form Data"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "type": "object",
+ "additionalProperties": true
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Update Tools Valves By Id Api V1 Tools Id Id Valves Update Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/tools/id/{id}/valves/user": {
+ "get": {
+ "tags": [
+ "tools"
+ ],
+ "summary": "Get Tools User Valves By Id",
+ "operationId": "get_tools_user_valves_by_id_api_v1_tools_id__id__valves_user_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "type": "object",
+ "additionalProperties": true
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get Tools User Valves By Id Api V1 Tools Id Id Valves User Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/tools/id/{id}/valves/user/spec": {
+ "get": {
+ "tags": [
+ "tools"
+ ],
+ "summary": "Get Tools User Valves Spec By Id",
+ "operationId": "get_tools_user_valves_spec_by_id_api_v1_tools_id__id__valves_user_spec_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "type": "object",
+ "additionalProperties": true
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get Tools User Valves Spec By Id Api V1 Tools Id Id Valves User Spec Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/tools/id/{id}/valves/user/update": {
+ "post": {
+ "tags": [
+ "tools"
+ ],
+ "summary": "Update Tools User Valves By Id",
+ "operationId": "update_tools_user_valves_by_id_api_v1_tools_id__id__valves_user_update_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "additionalProperties": true,
+ "title": "Form Data"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "type": "object",
+ "additionalProperties": true
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Update Tools User Valves By Id Api V1 Tools Id Id Valves User Update Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/memories/ef": {
+ "get": {
+ "tags": [
+ "memories"
+ ],
+ "summary": "Get Embeddings",
+ "operationId": "get_embeddings_api_v1_memories_ef_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/memories/": {
+ "get": {
+ "tags": [
+ "memories"
+ ],
+ "summary": "Get Memories",
+ "operationId": "get_memories_api_v1_memories__get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/MemoryModel"
+ },
+ "type": "array",
+ "title": "Response Get Memories Api V1 Memories Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/memories/add": {
+ "post": {
+ "tags": [
+ "memories"
+ ],
+ "summary": "Add Memory",
+ "operationId": "add_memory_api_v1_memories_add_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AddMemoryForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/MemoryModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Add Memory Api V1 Memories Add Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/memories/query": {
+ "post": {
+ "tags": [
+ "memories"
+ ],
+ "summary": "Query Memory",
+ "operationId": "query_memory_api_v1_memories_query_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/QueryMemoryForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/memories/reset": {
+ "post": {
+ "tags": [
+ "memories"
+ ],
+ "summary": "Reset Memory From Vector Db",
+ "operationId": "reset_memory_from_vector_db_api_v1_memories_reset_post",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Reset Memory From Vector Db Api V1 Memories Reset Post"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/memories/delete/user": {
+ "delete": {
+ "tags": [
+ "memories"
+ ],
+ "summary": "Delete Memory By User Id",
+ "operationId": "delete_memory_by_user_id_api_v1_memories_delete_user_delete",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Delete Memory By User Id Api V1 Memories Delete User Delete"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/memories/{memory_id}/update": {
+ "post": {
+ "tags": [
+ "memories"
+ ],
+ "summary": "Update Memory By Id",
+ "operationId": "update_memory_by_id_api_v1_memories__memory_id__update_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "memory_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Memory Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/MemoryUpdateModel"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/MemoryModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Update Memory By Id Api V1 Memories Memory Id Update Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/memories/{memory_id}": {
+ "delete": {
+ "tags": [
+ "memories"
+ ],
+ "summary": "Delete Memory By Id",
+ "operationId": "delete_memory_by_id_api_v1_memories__memory_id__delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "memory_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Memory Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Delete Memory By Id Api V1 Memories Memory Id Delete"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/folders/": {
+ "get": {
+ "tags": [
+ "folders"
+ ],
+ "summary": "Get Folders",
+ "operationId": "get_folders_api_v1_folders__get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/FolderModel"
+ },
+ "type": "array",
+ "title": "Response Get Folders Api V1 Folders Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ },
+ "post": {
+ "tags": [
+ "folders"
+ ],
+ "summary": "Create Folder",
+ "operationId": "create_folder_api_v1_folders__post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FolderForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/folders/{id}": {
+ "get": {
+ "tags": [
+ "folders"
+ ],
+ "summary": "Get Folder By Id",
+ "operationId": "get_folder_by_id_api_v1_folders__id__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/FolderModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get Folder By Id Api V1 Folders Id Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "folders"
+ ],
+ "summary": "Delete Folder By Id",
+ "operationId": "delete_folder_by_id_api_v1_folders__id__delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/folders/{id}/update": {
+ "post": {
+ "tags": [
+ "folders"
+ ],
+ "summary": "Update Folder Name By Id",
+ "operationId": "update_folder_name_by_id_api_v1_folders__id__update_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FolderForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/folders/{id}/update/parent": {
+ "post": {
+ "tags": [
+ "folders"
+ ],
+ "summary": "Update Folder Parent Id By Id",
+ "operationId": "update_folder_parent_id_by_id_api_v1_folders__id__update_parent_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FolderParentIdForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/folders/{id}/update/expanded": {
+ "post": {
+ "tags": [
+ "folders"
+ ],
+ "summary": "Update Folder Is Expanded By Id",
+ "operationId": "update_folder_is_expanded_by_id_api_v1_folders__id__update_expanded_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FolderIsExpandedForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/groups/": {
+ "get": {
+ "tags": [
+ "groups"
+ ],
+ "summary": "Get Groups",
+ "operationId": "get_groups_api_v1_groups__get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/GroupResponse"
+ },
+ "type": "array",
+ "title": "Response Get Groups Api V1 Groups Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/groups/create": {
+ "post": {
+ "tags": [
+ "groups"
+ ],
+ "summary": "Create New Group",
+ "operationId": "create_new_group_api_v1_groups_create_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/GroupForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/GroupResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Create New Group Api V1 Groups Create Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/groups/id/{id}": {
+ "get": {
+ "tags": [
+ "groups"
+ ],
+ "summary": "Get Group By Id",
+ "operationId": "get_group_by_id_api_v1_groups_id__id__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/GroupResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get Group By Id Api V1 Groups Id Id Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/groups/id/{id}/update": {
+ "post": {
+ "tags": [
+ "groups"
+ ],
+ "summary": "Update Group By Id",
+ "operationId": "update_group_by_id_api_v1_groups_id__id__update_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/GroupUpdateForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/GroupResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Update Group By Id Api V1 Groups Id Id Update Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/groups/id/{id}/users/add": {
+ "post": {
+ "tags": [
+ "groups"
+ ],
+ "summary": "Add User To Group",
+ "operationId": "add_user_to_group_api_v1_groups_id__id__users_add_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/UserIdsForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/GroupResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Add User To Group Api V1 Groups Id Id Users Add Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/groups/id/{id}/users/remove": {
+ "post": {
+ "tags": [
+ "groups"
+ ],
+ "summary": "Remove Users From Group",
+ "operationId": "remove_users_from_group_api_v1_groups_id__id__users_remove_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/UserIdsForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/GroupResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Remove Users From Group Api V1 Groups Id Id Users Remove Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/groups/id/{id}/delete": {
+ "delete": {
+ "tags": [
+ "groups"
+ ],
+ "summary": "Delete Group By Id",
+ "operationId": "delete_group_by_id_api_v1_groups_id__id__delete_delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Delete Group By Id Api V1 Groups Id Id Delete Delete"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/files/": {
+ "post": {
+ "tags": [
+ "files"
+ ],
+ "summary": "Upload File",
+ "operationId": "upload_file_api_v1_files__post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "process",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "default": true,
+ "title": "Process"
+ }
+ },
+ {
+ "name": "internal",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "default": false,
+ "title": "Internal"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "$ref": "#/components/schemas/Body_upload_file_api_v1_files__post"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FileModelResponse"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ },
+ "get": {
+ "tags": [
+ "files"
+ ],
+ "summary": "List Files",
+ "operationId": "list_files_api_v1_files__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "content",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "default": true,
+ "title": "Content"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/FileModelResponse"
+ },
+ "title": "Response List Files Api V1 Files Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/files/search": {
+ "get": {
+ "tags": [
+ "files"
+ ],
+ "summary": "Search Files",
+ "description": "Search for files by filename with support for wildcard patterns.",
+ "operationId": "search_files_api_v1_files_search_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "filename",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "description": "Filename pattern to search for. Supports wildcards such as '*.txt'",
+ "title": "Filename"
+ },
+ "description": "Filename pattern to search for. Supports wildcards such as '*.txt'"
+ },
+ {
+ "name": "content",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "default": true,
+ "title": "Content"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/FileModelResponse"
+ },
+ "title": "Response Search Files Api V1 Files Search Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/files/all": {
+ "delete": {
+ "tags": [
+ "files"
+ ],
+ "summary": "Delete All Files",
+ "operationId": "delete_all_files_api_v1_files_all_delete",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/files/{id}": {
+ "get": {
+ "tags": [
+ "files"
+ ],
+ "summary": "Get File By Id",
+ "operationId": "get_file_by_id_api_v1_files__id__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/FileModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get File By Id Api V1 Files Id Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "files"
+ ],
+ "summary": "Delete File By Id",
+ "operationId": "delete_file_by_id_api_v1_files__id__delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/files/{id}/data/content": {
+ "get": {
+ "tags": [
+ "files"
+ ],
+ "summary": "Get File Data Content By Id",
+ "operationId": "get_file_data_content_by_id_api_v1_files__id__data_content_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/files/{id}/data/content/update": {
+ "post": {
+ "tags": [
+ "files"
+ ],
+ "summary": "Update File Data Content By Id",
+ "operationId": "update_file_data_content_by_id_api_v1_files__id__data_content_update_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ContentForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/files/{id}/content": {
+ "get": {
+ "tags": [
+ "files"
+ ],
+ "summary": "Get File Content By Id",
+ "operationId": "get_file_content_by_id_api_v1_files__id__content_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ },
+ {
+ "name": "attachment",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "default": false,
+ "title": "Attachment"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/files/{id}/content/html": {
+ "get": {
+ "tags": [
+ "files"
+ ],
+ "summary": "Get Html File Content By Id",
+ "operationId": "get_html_file_content_by_id_api_v1_files__id__content_html_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/files/{id}/content/{file_name}": {
+ "get": {
+ "tags": [
+ "files"
+ ],
+ "summary": "Get File Content By Id",
+ "operationId": "get_file_content_by_id_api_v1_files__id__content__file_name__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/functions/": {
+ "get": {
+ "tags": [
+ "functions"
+ ],
+ "summary": "Get Functions",
+ "operationId": "get_functions_api_v1_functions__get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/FunctionResponse"
+ },
+ "type": "array",
+ "title": "Response Get Functions Api V1 Functions Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/functions/export": {
+ "get": {
+ "tags": [
+ "functions"
+ ],
+ "summary": "Get Functions",
+ "operationId": "get_functions_api_v1_functions_export_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/FunctionModel"
+ },
+ "type": "array",
+ "title": "Response Get Functions Api V1 Functions Export Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/functions/load/url": {
+ "post": {
+ "tags": [
+ "functions"
+ ],
+ "summary": "Load Function From Url",
+ "operationId": "load_function_from_url_api_v1_functions_load_url_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LoadUrlForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Load Function From Url Api V1 Functions Load Url Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/functions/sync": {
+ "post": {
+ "tags": [
+ "functions"
+ ],
+ "summary": "Sync Functions",
+ "operationId": "sync_functions_api_v1_functions_sync_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SyncFunctionsForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/FunctionModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Sync Functions Api V1 Functions Sync Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/functions/create": {
+ "post": {
+ "tags": [
+ "functions"
+ ],
+ "summary": "Create New Function",
+ "operationId": "create_new_function_api_v1_functions_create_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FunctionForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/FunctionResponse"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Create New Function Api V1 Functions Create Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/functions/id/{id}": {
+ "get": {
+ "tags": [
+ "functions"
+ ],
+ "summary": "Get Function By Id",
+ "operationId": "get_function_by_id_api_v1_functions_id__id__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/FunctionModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get Function By Id Api V1 Functions Id Id Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/functions/id/{id}/toggle": {
+ "post": {
+ "tags": [
+ "functions"
+ ],
+ "summary": "Toggle Function By Id",
+ "operationId": "toggle_function_by_id_api_v1_functions_id__id__toggle_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/FunctionModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Toggle Function By Id Api V1 Functions Id Id Toggle Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/functions/id/{id}/toggle/global": {
+ "post": {
+ "tags": [
+ "functions"
+ ],
+ "summary": "Toggle Global By Id",
+ "operationId": "toggle_global_by_id_api_v1_functions_id__id__toggle_global_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/FunctionModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Toggle Global By Id Api V1 Functions Id Id Toggle Global Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/functions/id/{id}/update": {
+ "post": {
+ "tags": [
+ "functions"
+ ],
+ "summary": "Update Function By Id",
+ "operationId": "update_function_by_id_api_v1_functions_id__id__update_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FunctionForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/FunctionModel"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Update Function By Id Api V1 Functions Id Id Update Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/functions/id/{id}/delete": {
+ "delete": {
+ "tags": [
+ "functions"
+ ],
+ "summary": "Delete Function By Id",
+ "operationId": "delete_function_by_id_api_v1_functions_id__id__delete_delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Delete Function By Id Api V1 Functions Id Id Delete Delete"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/functions/id/{id}/valves": {
+ "get": {
+ "tags": [
+ "functions"
+ ],
+ "summary": "Get Function Valves By Id",
+ "operationId": "get_function_valves_by_id_api_v1_functions_id__id__valves_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "type": "object",
+ "additionalProperties": true
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get Function Valves By Id Api V1 Functions Id Id Valves Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/functions/id/{id}/valves/spec": {
+ "get": {
+ "tags": [
+ "functions"
+ ],
+ "summary": "Get Function Valves Spec By Id",
+ "operationId": "get_function_valves_spec_by_id_api_v1_functions_id__id__valves_spec_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "type": "object",
+ "additionalProperties": true
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get Function Valves Spec By Id Api V1 Functions Id Id Valves Spec Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/functions/id/{id}/valves/update": {
+ "post": {
+ "tags": [
+ "functions"
+ ],
+ "summary": "Update Function Valves By Id",
+ "operationId": "update_function_valves_by_id_api_v1_functions_id__id__valves_update_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "additionalProperties": true,
+ "title": "Form Data"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "type": "object",
+ "additionalProperties": true
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Update Function Valves By Id Api V1 Functions Id Id Valves Update Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/functions/id/{id}/valves/user": {
+ "get": {
+ "tags": [
+ "functions"
+ ],
+ "summary": "Get Function User Valves By Id",
+ "operationId": "get_function_user_valves_by_id_api_v1_functions_id__id__valves_user_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "type": "object",
+ "additionalProperties": true
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get Function User Valves By Id Api V1 Functions Id Id Valves User Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/functions/id/{id}/valves/user/spec": {
+ "get": {
+ "tags": [
+ "functions"
+ ],
+ "summary": "Get Function User Valves Spec By Id",
+ "operationId": "get_function_user_valves_spec_by_id_api_v1_functions_id__id__valves_user_spec_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "type": "object",
+ "additionalProperties": true
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Get Function User Valves Spec By Id Api V1 Functions Id Id Valves User Spec Get"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/functions/id/{id}/valves/user/update": {
+ "post": {
+ "tags": [
+ "functions"
+ ],
+ "summary": "Update Function User Valves By Id",
+ "operationId": "update_function_user_valves_by_id_api_v1_functions_id__id__valves_user_update_post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "additionalProperties": true,
+ "title": "Form Data"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "anyOf": [
+ {
+ "type": "object",
+ "additionalProperties": true
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Update Function User Valves By Id Api V1 Functions Id Id Valves User Update Post"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/evaluations/config": {
+ "get": {
+ "tags": [
+ "evaluations"
+ ],
+ "summary": "Get Config",
+ "operationId": "get_config_api_v1_evaluations_config_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ },
+ "post": {
+ "tags": [
+ "evaluations"
+ ],
+ "summary": "Update Config",
+ "operationId": "update_config_api_v1_evaluations_config_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/UpdateConfigForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/evaluations/feedbacks/all": {
+ "get": {
+ "tags": [
+ "evaluations"
+ ],
+ "summary": "Get All Feedbacks",
+ "operationId": "get_all_feedbacks_api_v1_evaluations_feedbacks_all_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/FeedbackUserResponse"
+ },
+ "type": "array",
+ "title": "Response Get All Feedbacks Api V1 Evaluations Feedbacks All Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ },
+ "delete": {
+ "tags": [
+ "evaluations"
+ ],
+ "summary": "Delete All Feedbacks",
+ "operationId": "delete_all_feedbacks_api_v1_evaluations_feedbacks_all_delete",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/evaluations/feedbacks/all/export": {
+ "get": {
+ "tags": [
+ "evaluations"
+ ],
+ "summary": "Get All Feedbacks",
+ "operationId": "get_all_feedbacks_api_v1_evaluations_feedbacks_all_export_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/FeedbackModel"
+ },
+ "type": "array",
+ "title": "Response Get All Feedbacks Api V1 Evaluations Feedbacks All Export Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/evaluations/feedbacks/user": {
+ "get": {
+ "tags": [
+ "evaluations"
+ ],
+ "summary": "Get Feedbacks",
+ "operationId": "get_feedbacks_api_v1_evaluations_feedbacks_user_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/FeedbackUserResponse"
+ },
+ "type": "array",
+ "title": "Response Get Feedbacks Api V1 Evaluations Feedbacks User Get"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/evaluations/feedbacks": {
+ "delete": {
+ "tags": [
+ "evaluations"
+ ],
+ "summary": "Delete Feedbacks",
+ "operationId": "delete_feedbacks_api_v1_evaluations_feedbacks_delete",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean",
+ "title": "Response Delete Feedbacks Api V1 Evaluations Feedbacks Delete"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/evaluations/feedback": {
+ "post": {
+ "tags": [
+ "evaluations"
+ ],
+ "summary": "Create Feedback",
+ "operationId": "create_feedback_api_v1_evaluations_feedback_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FeedbackForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FeedbackModel"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/evaluations/feedback/{id}": {
+ "get": {
+ "tags": [
+ "evaluations"
+ ],
+ "summary": "Get Feedback By Id",
+ "operationId": "get_feedback_by_id_api_v1_evaluations_feedback__id__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FeedbackModel"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "tags": [
+ "evaluations"
+ ],
+ "summary": "Update Feedback By Id",
+ "operationId": "update_feedback_by_id_api_v1_evaluations_feedback__id__post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FeedbackForm"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FeedbackModel"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "evaluations"
+ ],
+ "summary": "Delete Feedback By Id",
+ "operationId": "delete_feedback_by_id_api_v1_evaluations_feedback__id__delete",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/utils/gravatar": {
+ "get": {
+ "tags": [
+ "utils"
+ ],
+ "summary": "Get Gravatar",
+ "operationId": "get_gravatar_api_v1_utils_gravatar_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "email",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Email"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/utils/code/format": {
+ "post": {
+ "tags": [
+ "utils"
+ ],
+ "summary": "Format Code",
+ "operationId": "format_code_api_v1_utils_code_format_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CodeForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/utils/code/execute": {
+ "post": {
+ "tags": [
+ "utils"
+ ],
+ "summary": "Execute Code",
+ "operationId": "execute_code_api_v1_utils_code_execute_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CodeForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/utils/markdown": {
+ "post": {
+ "tags": [
+ "utils"
+ ],
+ "summary": "Get Html From Markdown",
+ "operationId": "get_html_from_markdown_api_v1_utils_markdown_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/MarkdownForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/utils/pdf": {
+ "post": {
+ "tags": [
+ "utils"
+ ],
+ "summary": "Download Chat As Pdf",
+ "operationId": "download_chat_as_pdf_api_v1_utils_pdf_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ChatTitleMessagesForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/utils/db/download": {
+ "get": {
+ "tags": [
+ "utils"
+ ],
+ "summary": "Download Db",
+ "operationId": "download_db_api_v1_utils_db_download_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/v1/utils/litellm/config": {
+ "get": {
+ "tags": [
+ "utils"
+ ],
+ "summary": "Download Litellm Config Yaml",
+ "operationId": "download_litellm_config_yaml_api_v1_utils_litellm_config_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/models": {
+ "get": {
+ "summary": "Get Models",
+ "operationId": "get_models_api_models_get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "refresh",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "default": false,
+ "title": "Refresh"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/models/base": {
+ "get": {
+ "summary": "Get Base Models",
+ "operationId": "get_base_models_api_models_base_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/embeddings": {
+ "post": {
+ "summary": "Embeddings",
+ "description": "OpenAI-compatible embeddings endpoint.\n\nThis handler:\n - Performs user/model checks and dispatches to the correct backend.\n - Supports OpenAI, Ollama, arena models, pipelines, and any compatible provider.\n\nArgs:\n request (Request): Request context.\n form_data (dict): OpenAI-like payload (e.g., {\"model\": \"...\", \"input\": [...]})\n user (UserModel): Authenticated user.\n\nReturns:\n dict: OpenAI-compatible embeddings response.",
+ "operationId": "embeddings_api_embeddings_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Form Data"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/chat/completions": {
+ "post": {
+ "summary": "Chat Completion",
+ "operationId": "chat_completion_api_chat_completions_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Form Data"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/chat/completed": {
+ "post": {
+ "summary": "Chat Completed",
+ "operationId": "chat_completed_api_chat_completed_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Form Data"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/chat/actions/{action_id}": {
+ "post": {
+ "summary": "Chat Action",
+ "operationId": "chat_action_api_chat_actions__action_id__post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "action_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Action Id"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "additionalProperties": true,
+ "title": "Form Data"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/tasks/stop/{task_id}": {
+ "post": {
+ "summary": "Stop Task Endpoint",
+ "operationId": "stop_task_endpoint_api_tasks_stop__task_id__post",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "task_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Task Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/tasks": {
+ "get": {
+ "summary": "List Tasks Endpoint",
+ "operationId": "list_tasks_endpoint_api_tasks_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/tasks/chat/{chat_id}": {
+ "get": {
+ "summary": "List Tasks By Chat Id Endpoint",
+ "operationId": "list_tasks_by_chat_id_endpoint_api_tasks_chat__chat_id__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "chat_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Chat Id"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/config": {
+ "get": {
+ "summary": "Get App Config",
+ "operationId": "get_app_config_api_config_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/webhook": {
+ "get": {
+ "summary": "Get Webhook Url",
+ "operationId": "get_webhook_url_api_webhook_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ },
+ "post": {
+ "summary": "Update Webhook Url",
+ "operationId": "update_webhook_url_api_webhook_post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/UrlForm"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/version": {
+ "get": {
+ "summary": "Get App Version",
+ "operationId": "get_app_version_api_version_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/version/updates": {
+ "get": {
+ "summary": "Get App Latest Release Version",
+ "operationId": "get_app_latest_release_version_api_version_updates_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/api/changelog": {
+ "get": {
+ "summary": "Get App Changelog",
+ "operationId": "get_app_changelog_api_changelog_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/usage": {
+ "get": {
+ "summary": "Get Current Usage",
+ "description": "Get current usage statistics for Open WebUI.\nThis is an experimental endpoint and subject to change.",
+ "operationId": "get_current_usage_api_usage_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ]
+ }
+ },
+ "/oauth/{provider}/login": {
+ "get": {
+ "summary": "Oauth Login",
+ "operationId": "oauth_login_oauth__provider__login_get",
+ "parameters": [
+ {
+ "name": "provider",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Provider"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/oauth/{provider}/callback": {
+ "get": {
+ "summary": "Oauth Callback",
+ "operationId": "oauth_callback_oauth__provider__callback_get",
+ "parameters": [
+ {
+ "name": "provider",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Provider"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/manifest.json": {
+ "get": {
+ "summary": "Get Manifest Json",
+ "operationId": "get_manifest_json_manifest_json_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ }
+ }
+ },
+ "/opensearch.xml": {
+ "get": {
+ "summary": "Get Opensearch Xml",
+ "operationId": "get_opensearch_xml_opensearch_xml_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ }
+ }
+ },
+ "/health": {
+ "get": {
+ "summary": "Healthcheck",
+ "operationId": "healthcheck_health_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ }
+ }
+ },
+ "/health/db": {
+ "get": {
+ "summary": "Healthcheck With Db",
+ "operationId": "healthcheck_with_db_health_db_get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ }
+ }
+ },
+ "/cache/{path}": {
+ "get": {
+ "summary": "Serve Cache File",
+ "operationId": "serve_cache_file_cache__path__get",
+ "security": [
+ {
+ "HTTPBearer": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "path",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "title": "Path"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "AddMemoryForm": {
+ "properties": {
+ "content": {
+ "type": "string",
+ "title": "Content"
+ }
+ },
+ "type": "object",
+ "required": [
+ "content"
+ ],
+ "title": "AddMemoryForm"
+ },
+ "AddPipelineForm": {
+ "properties": {
+ "url": {
+ "type": "string",
+ "title": "Url"
+ },
+ "urlIdx": {
+ "type": "integer",
+ "title": "Urlidx"
+ }
+ },
+ "type": "object",
+ "required": [
+ "url",
+ "urlIdx"
+ ],
+ "title": "AddPipelineForm"
+ },
+ "AddUserForm": {
+ "properties": {
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "email": {
+ "type": "string",
+ "title": "Email"
+ },
+ "password": {
+ "type": "string",
+ "title": "Password"
+ },
+ "profile_image_url": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Profile Image Url",
+ "default": "/user.png"
+ },
+ "role": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Role",
+ "default": "pending"
+ }
+ },
+ "type": "object",
+ "required": [
+ "name",
+ "email",
+ "password"
+ ],
+ "title": "AddUserForm"
+ },
+ "AdminConfig": {
+ "properties": {
+ "SHOW_ADMIN_DETAILS": {
+ "type": "boolean",
+ "title": "Show Admin Details"
+ },
+ "WEBUI_URL": {
+ "type": "string",
+ "title": "Webui Url"
+ },
+ "ENABLE_SIGNUP": {
+ "type": "boolean",
+ "title": "Enable Signup"
+ },
+ "ENABLE_API_KEY": {
+ "type": "boolean",
+ "title": "Enable Api Key"
+ },
+ "ENABLE_API_KEY_ENDPOINT_RESTRICTIONS": {
+ "type": "boolean",
+ "title": "Enable Api Key Endpoint Restrictions"
+ },
+ "API_KEY_ALLOWED_ENDPOINTS": {
+ "type": "string",
+ "title": "Api Key Allowed Endpoints"
+ },
+ "DEFAULT_USER_ROLE": {
+ "type": "string",
+ "title": "Default User Role"
+ },
+ "JWT_EXPIRES_IN": {
+ "type": "string",
+ "title": "Jwt Expires In"
+ },
+ "ENABLE_COMMUNITY_SHARING": {
+ "type": "boolean",
+ "title": "Enable Community Sharing"
+ },
+ "ENABLE_MESSAGE_RATING": {
+ "type": "boolean",
+ "title": "Enable Message Rating"
+ },
+ "ENABLE_CHANNELS": {
+ "type": "boolean",
+ "title": "Enable Channels"
+ },
+ "ENABLE_NOTES": {
+ "type": "boolean",
+ "title": "Enable Notes"
+ },
+ "ENABLE_USER_WEBHOOKS": {
+ "type": "boolean",
+ "title": "Enable User Webhooks"
+ },
+ "PENDING_USER_OVERLAY_TITLE": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Pending User Overlay Title"
+ },
+ "PENDING_USER_OVERLAY_CONTENT": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Pending User Overlay Content"
+ },
+ "RESPONSE_WATERMARK": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Response Watermark"
+ }
+ },
+ "type": "object",
+ "required": [
+ "SHOW_ADMIN_DETAILS",
+ "WEBUI_URL",
+ "ENABLE_SIGNUP",
+ "ENABLE_API_KEY",
+ "ENABLE_API_KEY_ENDPOINT_RESTRICTIONS",
+ "API_KEY_ALLOWED_ENDPOINTS",
+ "DEFAULT_USER_ROLE",
+ "JWT_EXPIRES_IN",
+ "ENABLE_COMMUNITY_SHARING",
+ "ENABLE_MESSAGE_RATING",
+ "ENABLE_CHANNELS",
+ "ENABLE_NOTES",
+ "ENABLE_USER_WEBHOOKS"
+ ],
+ "title": "AdminConfig"
+ },
+ "ApiKey": {
+ "properties": {
+ "api_key": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Api Key"
+ }
+ },
+ "type": "object",
+ "title": "ApiKey"
+ },
+ "AudioConfigUpdateForm": {
+ "properties": {
+ "tts": {
+ "$ref": "#/components/schemas/TTSConfigForm"
+ },
+ "stt": {
+ "$ref": "#/components/schemas/STTConfigForm"
+ }
+ },
+ "type": "object",
+ "required": [
+ "tts",
+ "stt"
+ ],
+ "title": "AudioConfigUpdateForm"
+ },
+ "Automatic1111ConfigForm": {
+ "properties": {
+ "AUTOMATIC1111_BASE_URL": {
+ "type": "string",
+ "title": "Automatic1111 Base Url"
+ },
+ "AUTOMATIC1111_API_AUTH": {
+ "type": "string",
+ "title": "Automatic1111 Api Auth"
+ },
+ "AUTOMATIC1111_CFG_SCALE": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Automatic1111 Cfg Scale"
+ },
+ "AUTOMATIC1111_SAMPLER": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Automatic1111 Sampler"
+ },
+ "AUTOMATIC1111_SCHEDULER": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Automatic1111 Scheduler"
+ }
+ },
+ "type": "object",
+ "required": [
+ "AUTOMATIC1111_BASE_URL",
+ "AUTOMATIC1111_API_AUTH",
+ "AUTOMATIC1111_CFG_SCALE",
+ "AUTOMATIC1111_SAMPLER",
+ "AUTOMATIC1111_SCHEDULER"
+ ],
+ "title": "Automatic1111ConfigForm"
+ },
+ "AzureOpenAIConfigForm": {
+ "properties": {
+ "url": {
+ "type": "string",
+ "title": "Url"
+ },
+ "key": {
+ "type": "string",
+ "title": "Key"
+ },
+ "version": {
+ "type": "string",
+ "title": "Version"
+ }
+ },
+ "type": "object",
+ "required": [
+ "url",
+ "key",
+ "version"
+ ],
+ "title": "AzureOpenAIConfigForm"
+ },
+ "BannerModel": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "type": {
+ "type": "string",
+ "title": "Type"
+ },
+ "title": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Title"
+ },
+ "content": {
+ "type": "string",
+ "title": "Content"
+ },
+ "dismissible": {
+ "type": "boolean",
+ "title": "Dismissible"
+ },
+ "timestamp": {
+ "type": "integer",
+ "title": "Timestamp"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "type",
+ "content",
+ "dismissible",
+ "timestamp"
+ ],
+ "title": "BannerModel"
+ },
+ "BatchProcessFilesForm": {
+ "properties": {
+ "files": {
+ "items": {
+ "$ref": "#/components/schemas/FileModel"
+ },
+ "type": "array",
+ "title": "Files"
+ },
+ "collection_name": {
+ "type": "string",
+ "title": "Collection Name"
+ }
+ },
+ "type": "object",
+ "required": [
+ "files",
+ "collection_name"
+ ],
+ "title": "BatchProcessFilesForm"
+ },
+ "BatchProcessFilesResponse": {
+ "properties": {
+ "results": {
+ "items": {
+ "$ref": "#/components/schemas/BatchProcessFilesResult"
+ },
+ "type": "array",
+ "title": "Results"
+ },
+ "errors": {
+ "items": {
+ "$ref": "#/components/schemas/BatchProcessFilesResult"
+ },
+ "type": "array",
+ "title": "Errors"
+ }
+ },
+ "type": "object",
+ "required": [
+ "results",
+ "errors"
+ ],
+ "title": "BatchProcessFilesResponse"
+ },
+ "BatchProcessFilesResult": {
+ "properties": {
+ "file_id": {
+ "type": "string",
+ "title": "File Id"
+ },
+ "status": {
+ "type": "string",
+ "title": "Status"
+ },
+ "error": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Error"
+ }
+ },
+ "type": "object",
+ "required": [
+ "file_id",
+ "status"
+ ],
+ "title": "BatchProcessFilesResult"
+ },
+ "Body_transcription_api_v1_audio_transcriptions_post": {
+ "properties": {
+ "file": {
+ "type": "string",
+ "format": "binary",
+ "title": "File"
+ },
+ "language": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Language"
+ }
+ },
+ "type": "object",
+ "required": [
+ "file"
+ ],
+ "title": "Body_transcription_api_v1_audio_transcriptions_post"
+ },
+ "Body_upload_file_api_v1_files__post": {
+ "properties": {
+ "file": {
+ "type": "string",
+ "format": "binary",
+ "title": "File"
+ },
+ "metadata": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Metadata"
+ }
+ },
+ "type": "object",
+ "required": [
+ "file"
+ ],
+ "title": "Body_upload_file_api_v1_files__post"
+ },
+ "Body_upload_model_ollama_models_upload__url_idx__post": {
+ "properties": {
+ "file": {
+ "type": "string",
+ "format": "binary",
+ "title": "File"
+ }
+ },
+ "type": "object",
+ "required": [
+ "file"
+ ],
+ "title": "Body_upload_model_ollama_models_upload__url_idx__post"
+ },
+ "Body_upload_model_ollama_models_upload_post": {
+ "properties": {
+ "file": {
+ "type": "string",
+ "format": "binary",
+ "title": "File"
+ }
+ },
+ "type": "object",
+ "required": [
+ "file"
+ ],
+ "title": "Body_upload_model_ollama_models_upload_post"
+ },
+ "Body_upload_pipeline_api_v1_pipelines_upload_post": {
+ "properties": {
+ "urlIdx": {
+ "type": "integer",
+ "title": "Urlidx"
+ },
+ "file": {
+ "type": "string",
+ "format": "binary",
+ "title": "File"
+ }
+ },
+ "type": "object",
+ "required": [
+ "urlIdx",
+ "file"
+ ],
+ "title": "Body_upload_pipeline_api_v1_pipelines_upload_post"
+ },
+ "ChannelForm": {
+ "properties": {
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "description": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Description"
+ },
+ "data": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Data"
+ },
+ "meta": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Meta"
+ },
+ "access_control": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Access Control"
+ }
+ },
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "title": "ChannelForm"
+ },
+ "ChannelModel": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "type": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Type"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "description": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Description"
+ },
+ "data": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Data"
+ },
+ "meta": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Meta"
+ },
+ "access_control": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Access Control"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "name",
+ "created_at",
+ "updated_at"
+ ],
+ "title": "ChannelModel"
+ },
+ "ChatFolderIdForm": {
+ "properties": {
+ "folder_id": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Folder Id"
+ }
+ },
+ "type": "object",
+ "title": "ChatFolderIdForm"
+ },
+ "ChatForm": {
+ "properties": {
+ "chat": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Chat"
+ },
+ "folder_id": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Folder Id"
+ }
+ },
+ "type": "object",
+ "required": [
+ "chat"
+ ],
+ "title": "ChatForm"
+ },
+ "ChatImportForm": {
+ "properties": {
+ "chat": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Chat"
+ },
+ "folder_id": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Folder Id"
+ },
+ "meta": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Meta",
+ "default": {}
+ },
+ "pinned": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Pinned",
+ "default": false
+ },
+ "created_at": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Created At"
+ },
+ "updated_at": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Updated At"
+ }
+ },
+ "type": "object",
+ "required": [
+ "chat"
+ ],
+ "title": "ChatImportForm"
+ },
+ "ChatPermissions": {
+ "properties": {
+ "controls": {
+ "type": "boolean",
+ "title": "Controls",
+ "default": true
+ },
+ "system_prompt": {
+ "type": "boolean",
+ "title": "System Prompt",
+ "default": true
+ },
+ "file_upload": {
+ "type": "boolean",
+ "title": "File Upload",
+ "default": true
+ },
+ "delete": {
+ "type": "boolean",
+ "title": "Delete",
+ "default": true
+ },
+ "edit": {
+ "type": "boolean",
+ "title": "Edit",
+ "default": true
+ },
+ "share": {
+ "type": "boolean",
+ "title": "Share",
+ "default": true
+ },
+ "export": {
+ "type": "boolean",
+ "title": "Export",
+ "default": true
+ },
+ "stt": {
+ "type": "boolean",
+ "title": "Stt",
+ "default": true
+ },
+ "tts": {
+ "type": "boolean",
+ "title": "Tts",
+ "default": true
+ },
+ "call": {
+ "type": "boolean",
+ "title": "Call",
+ "default": true
+ },
+ "multiple_models": {
+ "type": "boolean",
+ "title": "Multiple Models",
+ "default": true
+ },
+ "temporary": {
+ "type": "boolean",
+ "title": "Temporary",
+ "default": true
+ },
+ "temporary_enforced": {
+ "type": "boolean",
+ "title": "Temporary Enforced",
+ "default": false
+ }
+ },
+ "type": "object",
+ "title": "ChatPermissions"
+ },
+ "ChatResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "title": {
+ "type": "string",
+ "title": "Title"
+ },
+ "chat": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Chat"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ },
+ "share_id": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Share Id"
+ },
+ "archived": {
+ "type": "boolean",
+ "title": "Archived"
+ },
+ "pinned": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Pinned",
+ "default": false
+ },
+ "meta": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Meta",
+ "default": {}
+ },
+ "folder_id": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Folder Id"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "title",
+ "chat",
+ "updated_at",
+ "created_at",
+ "archived"
+ ],
+ "title": "ChatResponse"
+ },
+ "ChatTitleIdResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "title": {
+ "type": "string",
+ "title": "Title"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "title",
+ "updated_at",
+ "created_at"
+ ],
+ "title": "ChatTitleIdResponse"
+ },
+ "ChatTitleMessagesForm": {
+ "properties": {
+ "title": {
+ "type": "string",
+ "title": "Title"
+ },
+ "messages": {
+ "items": {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ "type": "array",
+ "title": "Messages"
+ }
+ },
+ "type": "object",
+ "required": [
+ "title",
+ "messages"
+ ],
+ "title": "ChatTitleMessagesForm"
+ },
+ "CloneForm": {
+ "properties": {
+ "title": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Title"
+ }
+ },
+ "type": "object",
+ "title": "CloneForm"
+ },
+ "CodeForm": {
+ "properties": {
+ "code": {
+ "type": "string",
+ "title": "Code"
+ }
+ },
+ "type": "object",
+ "required": [
+ "code"
+ ],
+ "title": "CodeForm"
+ },
+ "CodeInterpreterConfigForm": {
+ "properties": {
+ "ENABLE_CODE_EXECUTION": {
+ "type": "boolean",
+ "title": "Enable Code Execution"
+ },
+ "CODE_EXECUTION_ENGINE": {
+ "type": "string",
+ "title": "Code Execution Engine"
+ },
+ "CODE_EXECUTION_JUPYTER_URL": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Code Execution Jupyter Url"
+ },
+ "CODE_EXECUTION_JUPYTER_AUTH": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Code Execution Jupyter Auth"
+ },
+ "CODE_EXECUTION_JUPYTER_AUTH_TOKEN": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Code Execution Jupyter Auth Token"
+ },
+ "CODE_EXECUTION_JUPYTER_AUTH_PASSWORD": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Code Execution Jupyter Auth Password"
+ },
+ "CODE_EXECUTION_JUPYTER_TIMEOUT": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Code Execution Jupyter Timeout"
+ },
+ "ENABLE_CODE_INTERPRETER": {
+ "type": "boolean",
+ "title": "Enable Code Interpreter"
+ },
+ "CODE_INTERPRETER_ENGINE": {
+ "type": "string",
+ "title": "Code Interpreter Engine"
+ },
+ "CODE_INTERPRETER_PROMPT_TEMPLATE": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Code Interpreter Prompt Template"
+ },
+ "CODE_INTERPRETER_JUPYTER_URL": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Code Interpreter Jupyter Url"
+ },
+ "CODE_INTERPRETER_JUPYTER_AUTH": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Code Interpreter Jupyter Auth"
+ },
+ "CODE_INTERPRETER_JUPYTER_AUTH_TOKEN": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Code Interpreter Jupyter Auth Token"
+ },
+ "CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Code Interpreter Jupyter Auth Password"
+ },
+ "CODE_INTERPRETER_JUPYTER_TIMEOUT": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Code Interpreter Jupyter Timeout"
+ }
+ },
+ "type": "object",
+ "required": [
+ "ENABLE_CODE_EXECUTION",
+ "CODE_EXECUTION_ENGINE",
+ "CODE_EXECUTION_JUPYTER_URL",
+ "CODE_EXECUTION_JUPYTER_AUTH",
+ "CODE_EXECUTION_JUPYTER_AUTH_TOKEN",
+ "CODE_EXECUTION_JUPYTER_AUTH_PASSWORD",
+ "CODE_EXECUTION_JUPYTER_TIMEOUT",
+ "ENABLE_CODE_INTERPRETER",
+ "CODE_INTERPRETER_ENGINE",
+ "CODE_INTERPRETER_PROMPT_TEMPLATE",
+ "CODE_INTERPRETER_JUPYTER_URL",
+ "CODE_INTERPRETER_JUPYTER_AUTH",
+ "CODE_INTERPRETER_JUPYTER_AUTH_TOKEN",
+ "CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD",
+ "CODE_INTERPRETER_JUPYTER_TIMEOUT"
+ ],
+ "title": "CodeInterpreterConfigForm"
+ },
+ "ComfyUIConfigForm": {
+ "properties": {
+ "COMFYUI_BASE_URL": {
+ "type": "string",
+ "title": "Comfyui Base Url"
+ },
+ "COMFYUI_API_KEY": {
+ "type": "string",
+ "title": "Comfyui Api Key"
+ },
+ "COMFYUI_WORKFLOW": {
+ "type": "string",
+ "title": "Comfyui Workflow"
+ },
+ "COMFYUI_WORKFLOW_NODES": {
+ "items": {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ "type": "array",
+ "title": "Comfyui Workflow Nodes"
+ }
+ },
+ "type": "object",
+ "required": [
+ "COMFYUI_BASE_URL",
+ "COMFYUI_API_KEY",
+ "COMFYUI_WORKFLOW",
+ "COMFYUI_WORKFLOW_NODES"
+ ],
+ "title": "ComfyUIConfigForm"
+ },
+ "ConnectionsConfigForm": {
+ "properties": {
+ "ENABLE_DIRECT_CONNECTIONS": {
+ "type": "boolean",
+ "title": "Enable Direct Connections"
+ },
+ "ENABLE_BASE_MODELS_CACHE": {
+ "type": "boolean",
+ "title": "Enable Base Models Cache"
+ }
+ },
+ "type": "object",
+ "required": [
+ "ENABLE_DIRECT_CONNECTIONS",
+ "ENABLE_BASE_MODELS_CACHE"
+ ],
+ "title": "ConnectionsConfigForm"
+ },
+ "ContentForm": {
+ "properties": {
+ "content": {
+ "type": "string",
+ "title": "Content"
+ }
+ },
+ "type": "object",
+ "required": [
+ "content"
+ ],
+ "title": "ContentForm"
+ },
+ "CopyModelForm": {
+ "properties": {
+ "source": {
+ "type": "string",
+ "title": "Source"
+ },
+ "destination": {
+ "type": "string",
+ "title": "Destination"
+ }
+ },
+ "type": "object",
+ "required": [
+ "source",
+ "destination"
+ ],
+ "title": "CopyModelForm"
+ },
+ "CreateModelForm": {
+ "properties": {
+ "model": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Model"
+ },
+ "stream": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Stream"
+ },
+ "path": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Path"
+ }
+ },
+ "additionalProperties": true,
+ "type": "object",
+ "title": "CreateModelForm"
+ },
+ "DeleteForm": {
+ "properties": {
+ "collection_name": {
+ "type": "string",
+ "title": "Collection Name"
+ },
+ "file_id": {
+ "type": "string",
+ "title": "File Id"
+ }
+ },
+ "type": "object",
+ "required": [
+ "collection_name",
+ "file_id"
+ ],
+ "title": "DeleteForm"
+ },
+ "DeletePipelineForm": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "urlIdx": {
+ "type": "integer",
+ "title": "Urlidx"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "urlIdx"
+ ],
+ "title": "DeletePipelineForm"
+ },
+ "EmbeddingModelUpdateForm": {
+ "properties": {
+ "openai_config": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/open_webui__routers__retrieval__OpenAIConfigForm"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "ollama_config": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/open_webui__routers__retrieval__OllamaConfigForm"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "azure_openai_config": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/AzureOpenAIConfigForm"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "embedding_engine": {
+ "type": "string",
+ "title": "Embedding Engine"
+ },
+ "embedding_model": {
+ "type": "string",
+ "title": "Embedding Model"
+ },
+ "embedding_batch_size": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Embedding Batch Size",
+ "default": 1
+ }
+ },
+ "type": "object",
+ "required": [
+ "embedding_engine",
+ "embedding_model"
+ ],
+ "title": "EmbeddingModelUpdateForm"
+ },
+ "EventForm": {
+ "properties": {
+ "type": {
+ "type": "string",
+ "title": "Type"
+ },
+ "data": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Data"
+ }
+ },
+ "type": "object",
+ "required": [
+ "type",
+ "data"
+ ],
+ "title": "EventForm"
+ },
+ "FeaturesPermissions": {
+ "properties": {
+ "direct_tool_servers": {
+ "type": "boolean",
+ "title": "Direct Tool Servers",
+ "default": false
+ },
+ "web_search": {
+ "type": "boolean",
+ "title": "Web Search",
+ "default": true
+ },
+ "image_generation": {
+ "type": "boolean",
+ "title": "Image Generation",
+ "default": true
+ },
+ "code_interpreter": {
+ "type": "boolean",
+ "title": "Code Interpreter",
+ "default": true
+ },
+ "notes": {
+ "type": "boolean",
+ "title": "Notes",
+ "default": true
+ }
+ },
+ "type": "object",
+ "title": "FeaturesPermissions"
+ },
+ "FeedbackForm": {
+ "properties": {
+ "type": {
+ "type": "string",
+ "title": "Type"
+ },
+ "data": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/RatingData"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "meta": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Meta"
+ },
+ "snapshot": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/SnapshotData"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "additionalProperties": true,
+ "type": "object",
+ "required": [
+ "type"
+ ],
+ "title": "FeedbackForm"
+ },
+ "FeedbackModel": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "version": {
+ "type": "integer",
+ "title": "Version"
+ },
+ "type": {
+ "type": "string",
+ "title": "Type"
+ },
+ "data": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Data"
+ },
+ "meta": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Meta"
+ },
+ "snapshot": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Snapshot"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "version",
+ "type",
+ "created_at",
+ "updated_at"
+ ],
+ "title": "FeedbackModel"
+ },
+ "FeedbackUserResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "version": {
+ "type": "integer",
+ "title": "Version"
+ },
+ "type": {
+ "type": "string",
+ "title": "Type"
+ },
+ "data": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Data"
+ },
+ "meta": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Meta"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ },
+ "user": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/open_webui__routers__evaluations__UserResponse"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "version",
+ "type",
+ "created_at",
+ "updated_at"
+ ],
+ "title": "FeedbackUserResponse"
+ },
+ "FileMeta": {
+ "properties": {
+ "name": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Name"
+ },
+ "content_type": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Content Type"
+ },
+ "size": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Size"
+ }
+ },
+ "additionalProperties": true,
+ "type": "object",
+ "title": "FileMeta"
+ },
+ "FileMetadataResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "meta": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Meta"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "meta",
+ "created_at",
+ "updated_at"
+ ],
+ "title": "FileMetadataResponse"
+ },
+ "FileModel": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "hash": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Hash"
+ },
+ "filename": {
+ "type": "string",
+ "title": "Filename"
+ },
+ "path": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Path"
+ },
+ "data": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Data"
+ },
+ "meta": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Meta"
+ },
+ "access_control": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Access Control"
+ },
+ "created_at": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Created At"
+ },
+ "updated_at": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Updated At"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "filename",
+ "created_at",
+ "updated_at"
+ ],
+ "title": "FileModel"
+ },
+ "FileModelResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "hash": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Hash"
+ },
+ "filename": {
+ "type": "string",
+ "title": "Filename"
+ },
+ "data": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Data"
+ },
+ "meta": {
+ "$ref": "#/components/schemas/FileMeta"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ }
+ },
+ "additionalProperties": true,
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "filename",
+ "meta",
+ "created_at",
+ "updated_at"
+ ],
+ "title": "FileModelResponse"
+ },
+ "FolderForm": {
+ "properties": {
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "data": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Data"
+ }
+ },
+ "additionalProperties": true,
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "title": "FolderForm"
+ },
+ "FolderIsExpandedForm": {
+ "properties": {
+ "is_expanded": {
+ "type": "boolean",
+ "title": "Is Expanded"
+ }
+ },
+ "type": "object",
+ "required": [
+ "is_expanded"
+ ],
+ "title": "FolderIsExpandedForm"
+ },
+ "FolderModel": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "parent_id": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Parent Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "items": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Items"
+ },
+ "meta": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Meta"
+ },
+ "data": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Data"
+ },
+ "is_expanded": {
+ "type": "boolean",
+ "title": "Is Expanded",
+ "default": false
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "name",
+ "created_at",
+ "updated_at"
+ ],
+ "title": "FolderModel"
+ },
+ "FolderParentIdForm": {
+ "properties": {
+ "parent_id": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Parent Id"
+ }
+ },
+ "type": "object",
+ "title": "FolderParentIdForm"
+ },
+ "FunctionForm": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "content": {
+ "type": "string",
+ "title": "Content"
+ },
+ "meta": {
+ "$ref": "#/components/schemas/FunctionMeta"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "content",
+ "meta"
+ ],
+ "title": "FunctionForm"
+ },
+ "FunctionMeta": {
+ "properties": {
+ "description": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Description"
+ },
+ "manifest": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Manifest",
+ "default": {}
+ }
+ },
+ "type": "object",
+ "title": "FunctionMeta"
+ },
+ "FunctionModel": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "type": {
+ "type": "string",
+ "title": "Type"
+ },
+ "content": {
+ "type": "string",
+ "title": "Content"
+ },
+ "meta": {
+ "$ref": "#/components/schemas/FunctionMeta"
+ },
+ "is_active": {
+ "type": "boolean",
+ "title": "Is Active",
+ "default": false
+ },
+ "is_global": {
+ "type": "boolean",
+ "title": "Is Global",
+ "default": false
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "name",
+ "type",
+ "content",
+ "meta",
+ "updated_at",
+ "created_at"
+ ],
+ "title": "FunctionModel"
+ },
+ "FunctionResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "type": {
+ "type": "string",
+ "title": "Type"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "meta": {
+ "$ref": "#/components/schemas/FunctionMeta"
+ },
+ "is_active": {
+ "type": "boolean",
+ "title": "Is Active"
+ },
+ "is_global": {
+ "type": "boolean",
+ "title": "Is Global"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "type",
+ "name",
+ "meta",
+ "is_active",
+ "is_global",
+ "updated_at",
+ "created_at"
+ ],
+ "title": "FunctionResponse"
+ },
+ "GeminiConfigForm": {
+ "properties": {
+ "GEMINI_API_BASE_URL": {
+ "type": "string",
+ "title": "Gemini Api Base Url"
+ },
+ "GEMINI_API_KEY": {
+ "type": "string",
+ "title": "Gemini Api Key"
+ }
+ },
+ "type": "object",
+ "required": [
+ "GEMINI_API_BASE_URL",
+ "GEMINI_API_KEY"
+ ],
+ "title": "GeminiConfigForm"
+ },
+ "GenerateCompletionForm": {
+ "properties": {
+ "model": {
+ "type": "string",
+ "title": "Model"
+ },
+ "prompt": {
+ "type": "string",
+ "title": "Prompt"
+ },
+ "suffix": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Suffix"
+ },
+ "images": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Images"
+ },
+ "format": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Format"
+ },
+ "options": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Options"
+ },
+ "system": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "System"
+ },
+ "template": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Template"
+ },
+ "context": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "integer"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Context"
+ },
+ "stream": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Stream",
+ "default": true
+ },
+ "raw": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Raw"
+ },
+ "keep_alive": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Keep Alive"
+ }
+ },
+ "type": "object",
+ "required": [
+ "model",
+ "prompt"
+ ],
+ "title": "GenerateCompletionForm"
+ },
+ "GenerateEmbedForm": {
+ "properties": {
+ "model": {
+ "type": "string",
+ "title": "Model"
+ },
+ "input": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "title": "Input"
+ },
+ "truncate": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Truncate"
+ },
+ "options": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Options"
+ },
+ "keep_alive": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Keep Alive"
+ }
+ },
+ "type": "object",
+ "required": [
+ "model",
+ "input"
+ ],
+ "title": "GenerateEmbedForm"
+ },
+ "GenerateEmbeddingsForm": {
+ "properties": {
+ "model": {
+ "type": "string",
+ "title": "Model"
+ },
+ "prompt": {
+ "type": "string",
+ "title": "Prompt"
+ },
+ "options": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Options"
+ },
+ "keep_alive": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Keep Alive"
+ }
+ },
+ "type": "object",
+ "required": [
+ "model",
+ "prompt"
+ ],
+ "title": "GenerateEmbeddingsForm"
+ },
+ "GenerateImageForm": {
+ "properties": {
+ "model": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Model"
+ },
+ "prompt": {
+ "type": "string",
+ "title": "Prompt"
+ },
+ "size": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Size"
+ },
+ "n": {
+ "type": "integer",
+ "title": "N",
+ "default": 1
+ },
+ "negative_prompt": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Negative Prompt"
+ }
+ },
+ "type": "object",
+ "required": [
+ "prompt"
+ ],
+ "title": "GenerateImageForm"
+ },
+ "GroupForm": {
+ "properties": {
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "description": {
+ "type": "string",
+ "title": "Description"
+ },
+ "permissions": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Permissions"
+ }
+ },
+ "type": "object",
+ "required": [
+ "name",
+ "description"
+ ],
+ "title": "GroupForm"
+ },
+ "GroupResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "description": {
+ "type": "string",
+ "title": "Description"
+ },
+ "permissions": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Permissions"
+ },
+ "data": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Data"
+ },
+ "meta": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Meta"
+ },
+ "user_ids": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "title": "User Ids",
+ "default": []
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "name",
+ "description",
+ "created_at",
+ "updated_at"
+ ],
+ "title": "GroupResponse"
+ },
+ "GroupUpdateForm": {
+ "properties": {
+ "user_ids": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "User Ids"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "description": {
+ "type": "string",
+ "title": "Description"
+ },
+ "permissions": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Permissions"
+ }
+ },
+ "type": "object",
+ "required": [
+ "name",
+ "description"
+ ],
+ "title": "GroupUpdateForm"
+ },
+ "HTTPValidationError": {
+ "properties": {
+ "detail": {
+ "items": {
+ "$ref": "#/components/schemas/ValidationError"
+ },
+ "type": "array",
+ "title": "Detail"
+ }
+ },
+ "type": "object",
+ "title": "HTTPValidationError"
+ },
+ "ImageConfigForm": {
+ "properties": {
+ "MODEL": {
+ "type": "string",
+ "title": "Model"
+ },
+ "IMAGE_SIZE": {
+ "type": "string",
+ "title": "Image Size"
+ },
+ "IMAGE_STEPS": {
+ "type": "integer",
+ "title": "Image Steps"
+ }
+ },
+ "type": "object",
+ "required": [
+ "MODEL",
+ "IMAGE_SIZE",
+ "IMAGE_STEPS"
+ ],
+ "title": "ImageConfigForm"
+ },
+ "ImportConfigForm": {
+ "properties": {
+ "config": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Config"
+ }
+ },
+ "type": "object",
+ "required": [
+ "config"
+ ],
+ "title": "ImportConfigForm"
+ },
+ "KnowledgeFileIdForm": {
+ "properties": {
+ "file_id": {
+ "type": "string",
+ "title": "File Id"
+ }
+ },
+ "type": "object",
+ "required": [
+ "file_id"
+ ],
+ "title": "KnowledgeFileIdForm"
+ },
+ "KnowledgeFilesResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "description": {
+ "type": "string",
+ "title": "Description"
+ },
+ "data": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Data"
+ },
+ "meta": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Meta"
+ },
+ "access_control": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Access Control"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ },
+ "files": {
+ "items": {
+ "$ref": "#/components/schemas/FileMetadataResponse"
+ },
+ "type": "array",
+ "title": "Files"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "name",
+ "description",
+ "created_at",
+ "updated_at",
+ "files"
+ ],
+ "title": "KnowledgeFilesResponse"
+ },
+ "KnowledgeForm": {
+ "properties": {
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "description": {
+ "type": "string",
+ "title": "Description"
+ },
+ "data": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Data"
+ },
+ "access_control": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Access Control"
+ }
+ },
+ "type": "object",
+ "required": [
+ "name",
+ "description"
+ ],
+ "title": "KnowledgeForm"
+ },
+ "KnowledgeResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "description": {
+ "type": "string",
+ "title": "Description"
+ },
+ "data": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Data"
+ },
+ "meta": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Meta"
+ },
+ "access_control": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Access Control"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ },
+ "files": {
+ "anyOf": [
+ {
+ "items": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/FileMetadataResponse"
+ },
+ {
+ "additionalProperties": true,
+ "type": "object"
+ }
+ ]
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Files"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "name",
+ "description",
+ "created_at",
+ "updated_at"
+ ],
+ "title": "KnowledgeResponse"
+ },
+ "KnowledgeUserResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "description": {
+ "type": "string",
+ "title": "Description"
+ },
+ "data": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Data"
+ },
+ "meta": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Meta"
+ },
+ "access_control": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Access Control"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ },
+ "user": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/open_webui__models__users__UserResponse"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "files": {
+ "anyOf": [
+ {
+ "items": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/FileMetadataResponse"
+ },
+ {
+ "additionalProperties": true,
+ "type": "object"
+ }
+ ]
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Files"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "name",
+ "description",
+ "created_at",
+ "updated_at"
+ ],
+ "title": "KnowledgeUserResponse"
+ },
+ "LdapConfigForm": {
+ "properties": {
+ "enable_ldap": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Enable Ldap"
+ }
+ },
+ "type": "object",
+ "title": "LdapConfigForm"
+ },
+ "LdapForm": {
+ "properties": {
+ "user": {
+ "type": "string",
+ "title": "User"
+ },
+ "password": {
+ "type": "string",
+ "title": "Password"
+ }
+ },
+ "type": "object",
+ "required": [
+ "user",
+ "password"
+ ],
+ "title": "LdapForm"
+ },
+ "LdapServerConfig": {
+ "properties": {
+ "label": {
+ "type": "string",
+ "title": "Label"
+ },
+ "host": {
+ "type": "string",
+ "title": "Host"
+ },
+ "port": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Port"
+ },
+ "attribute_for_mail": {
+ "type": "string",
+ "title": "Attribute For Mail",
+ "default": "mail"
+ },
+ "attribute_for_username": {
+ "type": "string",
+ "title": "Attribute For Username",
+ "default": "uid"
+ },
+ "app_dn": {
+ "type": "string",
+ "title": "App Dn"
+ },
+ "app_dn_password": {
+ "type": "string",
+ "title": "App Dn Password"
+ },
+ "search_base": {
+ "type": "string",
+ "title": "Search Base"
+ },
+ "search_filters": {
+ "type": "string",
+ "title": "Search Filters",
+ "default": ""
+ },
+ "use_tls": {
+ "type": "boolean",
+ "title": "Use Tls",
+ "default": true
+ },
+ "certificate_path": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Certificate Path"
+ },
+ "validate_cert": {
+ "type": "boolean",
+ "title": "Validate Cert",
+ "default": true
+ },
+ "ciphers": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Ciphers",
+ "default": "ALL"
+ }
+ },
+ "type": "object",
+ "required": [
+ "label",
+ "host",
+ "app_dn",
+ "app_dn_password",
+ "search_base"
+ ],
+ "title": "LdapServerConfig"
+ },
+ "LoadUrlForm": {
+ "properties": {
+ "url": {
+ "type": "string",
+ "maxLength": 2083,
+ "minLength": 1,
+ "format": "uri",
+ "title": "Url"
+ }
+ },
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "title": "LoadUrlForm"
+ },
+ "MarkdownForm": {
+ "properties": {
+ "md": {
+ "type": "string",
+ "title": "Md"
+ }
+ },
+ "type": "object",
+ "required": [
+ "md"
+ ],
+ "title": "MarkdownForm"
+ },
+ "MemoryModel": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "content": {
+ "type": "string",
+ "title": "Content"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "content",
+ "updated_at",
+ "created_at"
+ ],
+ "title": "MemoryModel"
+ },
+ "MemoryUpdateModel": {
+ "properties": {
+ "content": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Content"
+ }
+ },
+ "type": "object",
+ "title": "MemoryUpdateModel"
+ },
+ "MessageModel": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "channel_id": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Channel Id"
+ },
+ "parent_id": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Parent Id"
+ },
+ "content": {
+ "type": "string",
+ "title": "Content"
+ },
+ "data": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Data"
+ },
+ "meta": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Meta"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "content",
+ "created_at",
+ "updated_at"
+ ],
+ "title": "MessageModel"
+ },
+ "MessageUserResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "channel_id": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Channel Id"
+ },
+ "parent_id": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Parent Id"
+ },
+ "content": {
+ "type": "string",
+ "title": "Content"
+ },
+ "data": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Data"
+ },
+ "meta": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Meta"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ },
+ "latest_reply_at": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Latest Reply At"
+ },
+ "reply_count": {
+ "type": "integer",
+ "title": "Reply Count"
+ },
+ "reactions": {
+ "items": {
+ "$ref": "#/components/schemas/Reactions"
+ },
+ "type": "array",
+ "title": "Reactions"
+ },
+ "user": {
+ "$ref": "#/components/schemas/UserNameResponse"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "content",
+ "created_at",
+ "updated_at",
+ "latest_reply_at",
+ "reply_count",
+ "reactions",
+ "user"
+ ],
+ "title": "MessageUserResponse"
+ },
+ "ModelForm": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "base_model_id": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Base Model Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "meta": {
+ "$ref": "#/components/schemas/ModelMeta"
+ },
+ "params": {
+ "$ref": "#/components/schemas/ModelParams"
+ },
+ "access_control": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Access Control"
+ },
+ "is_active": {
+ "type": "boolean",
+ "title": "Is Active",
+ "default": true
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "meta",
+ "params"
+ ],
+ "title": "ModelForm"
+ },
+ "ModelMeta": {
+ "properties": {
+ "profile_image_url": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Profile Image Url",
+ "default": "/static/favicon.png"
+ },
+ "description": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Description"
+ },
+ "capabilities": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Capabilities"
+ }
+ },
+ "additionalProperties": true,
+ "type": "object",
+ "title": "ModelMeta"
+ },
+ "ModelModel": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "base_model_id": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Base Model Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "params": {
+ "$ref": "#/components/schemas/ModelParams"
+ },
+ "meta": {
+ "$ref": "#/components/schemas/ModelMeta"
+ },
+ "access_control": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Access Control"
+ },
+ "is_active": {
+ "type": "boolean",
+ "title": "Is Active"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "name",
+ "params",
+ "meta",
+ "is_active",
+ "updated_at",
+ "created_at"
+ ],
+ "title": "ModelModel"
+ },
+ "ModelNameForm": {
+ "properties": {
+ "model": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Model"
+ }
+ },
+ "additionalProperties": true,
+ "type": "object",
+ "title": "ModelNameForm"
+ },
+ "ModelParams": {
+ "properties": {},
+ "additionalProperties": true,
+ "type": "object",
+ "title": "ModelParams"
+ },
+ "ModelResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "base_model_id": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Base Model Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "params": {
+ "$ref": "#/components/schemas/ModelParams"
+ },
+ "meta": {
+ "$ref": "#/components/schemas/ModelMeta"
+ },
+ "access_control": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Access Control"
+ },
+ "is_active": {
+ "type": "boolean",
+ "title": "Is Active"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "name",
+ "params",
+ "meta",
+ "is_active",
+ "updated_at",
+ "created_at"
+ ],
+ "title": "ModelResponse"
+ },
+ "ModelUserResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "base_model_id": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Base Model Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "params": {
+ "$ref": "#/components/schemas/ModelParams"
+ },
+ "meta": {
+ "$ref": "#/components/schemas/ModelMeta"
+ },
+ "access_control": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Access Control"
+ },
+ "is_active": {
+ "type": "boolean",
+ "title": "Is Active"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ },
+ "user": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/open_webui__models__users__UserResponse"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "name",
+ "params",
+ "meta",
+ "is_active",
+ "updated_at",
+ "created_at"
+ ],
+ "title": "ModelUserResponse"
+ },
+ "ModelsConfigForm": {
+ "properties": {
+ "DEFAULT_MODELS": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Default Models"
+ },
+ "MODEL_ORDER_LIST": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Model Order List"
+ }
+ },
+ "type": "object",
+ "required": [
+ "DEFAULT_MODELS",
+ "MODEL_ORDER_LIST"
+ ],
+ "title": "ModelsConfigForm"
+ },
+ "NoteForm": {
+ "properties": {
+ "title": {
+ "type": "string",
+ "title": "Title"
+ },
+ "data": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Data"
+ },
+ "meta": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Meta"
+ },
+ "access_control": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Access Control"
+ }
+ },
+ "type": "object",
+ "required": [
+ "title"
+ ],
+ "title": "NoteForm"
+ },
+ "NoteModel": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "title": {
+ "type": "string",
+ "title": "Title"
+ },
+ "data": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Data"
+ },
+ "meta": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Meta"
+ },
+ "access_control": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Access Control"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "title",
+ "created_at",
+ "updated_at"
+ ],
+ "title": "NoteModel"
+ },
+ "NoteTitleIdResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "title": {
+ "type": "string",
+ "title": "Title"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "title",
+ "updated_at",
+ "created_at"
+ ],
+ "title": "NoteTitleIdResponse"
+ },
+ "NoteUserResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "title": {
+ "type": "string",
+ "title": "Title"
+ },
+ "data": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Data"
+ },
+ "meta": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Meta"
+ },
+ "access_control": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Access Control"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ },
+ "user": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/open_webui__models__users__UserResponse"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "title",
+ "created_at",
+ "updated_at"
+ ],
+ "title": "NoteUserResponse"
+ },
+ "ProcessFileForm": {
+ "properties": {
+ "file_id": {
+ "type": "string",
+ "title": "File Id"
+ },
+ "content": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Content"
+ },
+ "collection_name": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Collection Name"
+ }
+ },
+ "type": "object",
+ "required": [
+ "file_id"
+ ],
+ "title": "ProcessFileForm"
+ },
+ "ProcessTextForm": {
+ "properties": {
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "content": {
+ "type": "string",
+ "title": "Content"
+ },
+ "collection_name": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Collection Name"
+ }
+ },
+ "type": "object",
+ "required": [
+ "name",
+ "content"
+ ],
+ "title": "ProcessTextForm"
+ },
+ "ProcessUrlForm": {
+ "properties": {
+ "collection_name": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Collection Name"
+ },
+ "url": {
+ "type": "string",
+ "title": "Url"
+ }
+ },
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "title": "ProcessUrlForm"
+ },
+ "PromptForm": {
+ "properties": {
+ "command": {
+ "type": "string",
+ "title": "Command"
+ },
+ "title": {
+ "type": "string",
+ "title": "Title"
+ },
+ "content": {
+ "type": "string",
+ "title": "Content"
+ },
+ "access_control": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Access Control"
+ }
+ },
+ "type": "object",
+ "required": [
+ "command",
+ "title",
+ "content"
+ ],
+ "title": "PromptForm"
+ },
+ "PromptModel": {
+ "properties": {
+ "command": {
+ "type": "string",
+ "title": "Command"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "title": {
+ "type": "string",
+ "title": "Title"
+ },
+ "content": {
+ "type": "string",
+ "title": "Content"
+ },
+ "timestamp": {
+ "type": "integer",
+ "title": "Timestamp"
+ },
+ "access_control": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Access Control"
+ }
+ },
+ "type": "object",
+ "required": [
+ "command",
+ "user_id",
+ "title",
+ "content",
+ "timestamp"
+ ],
+ "title": "PromptModel"
+ },
+ "PromptSuggestion": {
+ "properties": {
+ "title": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "title": "Title"
+ },
+ "content": {
+ "type": "string",
+ "title": "Content"
+ }
+ },
+ "type": "object",
+ "required": [
+ "title",
+ "content"
+ ],
+ "title": "PromptSuggestion"
+ },
+ "PromptUserResponse": {
+ "properties": {
+ "command": {
+ "type": "string",
+ "title": "Command"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "title": {
+ "type": "string",
+ "title": "Title"
+ },
+ "content": {
+ "type": "string",
+ "title": "Content"
+ },
+ "timestamp": {
+ "type": "integer",
+ "title": "Timestamp"
+ },
+ "access_control": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Access Control"
+ },
+ "user": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/open_webui__models__users__UserResponse"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "type": "object",
+ "required": [
+ "command",
+ "user_id",
+ "title",
+ "content",
+ "timestamp"
+ ],
+ "title": "PromptUserResponse"
+ },
+ "PushModelForm": {
+ "properties": {
+ "model": {
+ "type": "string",
+ "title": "Model"
+ },
+ "insecure": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Insecure"
+ },
+ "stream": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Stream"
+ }
+ },
+ "type": "object",
+ "required": [
+ "model"
+ ],
+ "title": "PushModelForm"
+ },
+ "QueryCollectionsForm": {
+ "properties": {
+ "collection_names": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "title": "Collection Names"
+ },
+ "query": {
+ "type": "string",
+ "title": "Query"
+ },
+ "k": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "K"
+ },
+ "k_reranker": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "K Reranker"
+ },
+ "r": {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "R"
+ },
+ "hybrid": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Hybrid"
+ },
+ "hybrid_bm25_weight": {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Hybrid Bm25 Weight"
+ }
+ },
+ "type": "object",
+ "required": [
+ "collection_names",
+ "query"
+ ],
+ "title": "QueryCollectionsForm"
+ },
+ "QueryDocForm": {
+ "properties": {
+ "collection_name": {
+ "type": "string",
+ "title": "Collection Name"
+ },
+ "query": {
+ "type": "string",
+ "title": "Query"
+ },
+ "k": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "K"
+ },
+ "k_reranker": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "K Reranker"
+ },
+ "r": {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "R"
+ },
+ "hybrid": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Hybrid"
+ }
+ },
+ "type": "object",
+ "required": [
+ "collection_name",
+ "query"
+ ],
+ "title": "QueryDocForm"
+ },
+ "QueryMemoryForm": {
+ "properties": {
+ "content": {
+ "type": "string",
+ "title": "Content"
+ },
+ "k": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "K",
+ "default": 1
+ }
+ },
+ "type": "object",
+ "required": [
+ "content"
+ ],
+ "title": "QueryMemoryForm"
+ },
+ "RatingData": {
+ "properties": {
+ "rating": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Rating"
+ },
+ "model_id": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Model Id"
+ },
+ "sibling_model_ids": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Sibling Model Ids"
+ },
+ "reason": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Reason"
+ },
+ "comment": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Comment"
+ }
+ },
+ "additionalProperties": true,
+ "type": "object",
+ "title": "RatingData"
+ },
+ "ReactionForm": {
+ "properties": {
+ "name": {
+ "type": "string",
+ "title": "Name"
+ }
+ },
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "title": "ReactionForm"
+ },
+ "Reactions": {
+ "properties": {
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "user_ids": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "title": "User Ids"
+ },
+ "count": {
+ "type": "integer",
+ "title": "Count"
+ }
+ },
+ "type": "object",
+ "required": [
+ "name",
+ "user_ids",
+ "count"
+ ],
+ "title": "Reactions"
+ },
+ "STTConfigForm": {
+ "properties": {
+ "OPENAI_API_BASE_URL": {
+ "type": "string",
+ "title": "Openai Api Base Url"
+ },
+ "OPENAI_API_KEY": {
+ "type": "string",
+ "title": "Openai Api Key"
+ },
+ "ENGINE": {
+ "type": "string",
+ "title": "Engine"
+ },
+ "MODEL": {
+ "type": "string",
+ "title": "Model"
+ },
+ "SUPPORTED_CONTENT_TYPES": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "title": "Supported Content Types",
+ "default": []
+ },
+ "WHISPER_MODEL": {
+ "type": "string",
+ "title": "Whisper Model"
+ },
+ "DEEPGRAM_API_KEY": {
+ "type": "string",
+ "title": "Deepgram Api Key"
+ },
+ "AZURE_API_KEY": {
+ "type": "string",
+ "title": "Azure Api Key"
+ },
+ "AZURE_REGION": {
+ "type": "string",
+ "title": "Azure Region"
+ },
+ "AZURE_LOCALES": {
+ "type": "string",
+ "title": "Azure Locales"
+ },
+ "AZURE_BASE_URL": {
+ "type": "string",
+ "title": "Azure Base Url"
+ },
+ "AZURE_MAX_SPEAKERS": {
+ "type": "string",
+ "title": "Azure Max Speakers"
+ }
+ },
+ "type": "object",
+ "required": [
+ "OPENAI_API_BASE_URL",
+ "OPENAI_API_KEY",
+ "ENGINE",
+ "MODEL",
+ "WHISPER_MODEL",
+ "DEEPGRAM_API_KEY",
+ "AZURE_API_KEY",
+ "AZURE_REGION",
+ "AZURE_LOCALES",
+ "AZURE_BASE_URL",
+ "AZURE_MAX_SPEAKERS"
+ ],
+ "title": "STTConfigForm"
+ },
+ "SearchForm": {
+ "properties": {
+ "queries": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "title": "Queries"
+ }
+ },
+ "type": "object",
+ "required": [
+ "queries"
+ ],
+ "title": "SearchForm"
+ },
+ "SessionUserResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "email": {
+ "type": "string",
+ "title": "Email"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "role": {
+ "type": "string",
+ "title": "Role"
+ },
+ "profile_image_url": {
+ "type": "string",
+ "title": "Profile Image Url"
+ },
+ "token": {
+ "type": "string",
+ "title": "Token"
+ },
+ "token_type": {
+ "type": "string",
+ "title": "Token Type"
+ },
+ "expires_at": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Expires At"
+ },
+ "permissions": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Permissions"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "email",
+ "name",
+ "role",
+ "profile_image_url",
+ "token",
+ "token_type"
+ ],
+ "title": "SessionUserResponse"
+ },
+ "SetBannersForm": {
+ "properties": {
+ "banners": {
+ "items": {
+ "$ref": "#/components/schemas/BannerModel"
+ },
+ "type": "array",
+ "title": "Banners"
+ }
+ },
+ "type": "object",
+ "required": [
+ "banners"
+ ],
+ "title": "SetBannersForm"
+ },
+ "SetDefaultSuggestionsForm": {
+ "properties": {
+ "suggestions": {
+ "items": {
+ "$ref": "#/components/schemas/PromptSuggestion"
+ },
+ "type": "array",
+ "title": "Suggestions"
+ }
+ },
+ "type": "object",
+ "required": [
+ "suggestions"
+ ],
+ "title": "SetDefaultSuggestionsForm"
+ },
+ "SharingPermissions": {
+ "properties": {
+ "public_models": {
+ "type": "boolean",
+ "title": "Public Models",
+ "default": true
+ },
+ "public_knowledge": {
+ "type": "boolean",
+ "title": "Public Knowledge",
+ "default": true
+ },
+ "public_prompts": {
+ "type": "boolean",
+ "title": "Public Prompts",
+ "default": true
+ },
+ "public_tools": {
+ "type": "boolean",
+ "title": "Public Tools",
+ "default": true
+ }
+ },
+ "type": "object",
+ "title": "SharingPermissions"
+ },
+ "SigninForm": {
+ "properties": {
+ "email": {
+ "type": "string",
+ "title": "Email"
+ },
+ "password": {
+ "type": "string",
+ "title": "Password"
+ }
+ },
+ "type": "object",
+ "required": [
+ "email",
+ "password"
+ ],
+ "title": "SigninForm"
+ },
+ "SigninResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "email": {
+ "type": "string",
+ "title": "Email"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "role": {
+ "type": "string",
+ "title": "Role"
+ },
+ "profile_image_url": {
+ "type": "string",
+ "title": "Profile Image Url"
+ },
+ "token": {
+ "type": "string",
+ "title": "Token"
+ },
+ "token_type": {
+ "type": "string",
+ "title": "Token Type"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "email",
+ "name",
+ "role",
+ "profile_image_url",
+ "token",
+ "token_type"
+ ],
+ "title": "SigninResponse"
+ },
+ "SignupForm": {
+ "properties": {
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "email": {
+ "type": "string",
+ "title": "Email"
+ },
+ "password": {
+ "type": "string",
+ "title": "Password"
+ },
+ "profile_image_url": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Profile Image Url",
+ "default": "/user.png"
+ }
+ },
+ "type": "object",
+ "required": [
+ "name",
+ "email",
+ "password"
+ ],
+ "title": "SignupForm"
+ },
+ "SnapshotData": {
+ "properties": {
+ "chat": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Chat"
+ }
+ },
+ "additionalProperties": true,
+ "type": "object",
+ "title": "SnapshotData"
+ },
+ "SyncFunctionsForm": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "content": {
+ "type": "string",
+ "title": "Content"
+ },
+ "meta": {
+ "$ref": "#/components/schemas/FunctionMeta"
+ },
+ "functions": {
+ "items": {
+ "$ref": "#/components/schemas/FunctionModel"
+ },
+ "type": "array",
+ "title": "Functions",
+ "default": []
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "content",
+ "meta"
+ ],
+ "title": "SyncFunctionsForm"
+ },
+ "TTSConfigForm": {
+ "properties": {
+ "OPENAI_API_BASE_URL": {
+ "type": "string",
+ "title": "Openai Api Base Url"
+ },
+ "OPENAI_API_KEY": {
+ "type": "string",
+ "title": "Openai Api Key"
+ },
+ "API_KEY": {
+ "type": "string",
+ "title": "Api Key"
+ },
+ "ENGINE": {
+ "type": "string",
+ "title": "Engine"
+ },
+ "MODEL": {
+ "type": "string",
+ "title": "Model"
+ },
+ "VOICE": {
+ "type": "string",
+ "title": "Voice"
+ },
+ "SPLIT_ON": {
+ "type": "string",
+ "title": "Split On"
+ },
+ "AZURE_SPEECH_REGION": {
+ "type": "string",
+ "title": "Azure Speech Region"
+ },
+ "AZURE_SPEECH_BASE_URL": {
+ "type": "string",
+ "title": "Azure Speech Base Url"
+ },
+ "AZURE_SPEECH_OUTPUT_FORMAT": {
+ "type": "string",
+ "title": "Azure Speech Output Format"
+ }
+ },
+ "type": "object",
+ "required": [
+ "OPENAI_API_BASE_URL",
+ "OPENAI_API_KEY",
+ "API_KEY",
+ "ENGINE",
+ "MODEL",
+ "VOICE",
+ "SPLIT_ON",
+ "AZURE_SPEECH_REGION",
+ "AZURE_SPEECH_BASE_URL",
+ "AZURE_SPEECH_OUTPUT_FORMAT"
+ ],
+ "title": "TTSConfigForm"
+ },
+ "TagFilterForm": {
+ "properties": {
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "skip": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Skip",
+ "default": 0
+ },
+ "limit": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Limit",
+ "default": 50
+ }
+ },
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "title": "TagFilterForm"
+ },
+ "TagForm": {
+ "properties": {
+ "name": {
+ "type": "string",
+ "title": "Name"
+ }
+ },
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "title": "TagForm"
+ },
+ "TagModel": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "meta": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Meta"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "user_id"
+ ],
+ "title": "TagModel"
+ },
+ "TaskConfigForm": {
+ "properties": {
+ "TASK_MODEL": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Task Model"
+ },
+ "TASK_MODEL_EXTERNAL": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Task Model External"
+ },
+ "ENABLE_TITLE_GENERATION": {
+ "type": "boolean",
+ "title": "Enable Title Generation"
+ },
+ "TITLE_GENERATION_PROMPT_TEMPLATE": {
+ "type": "string",
+ "title": "Title Generation Prompt Template"
+ },
+ "IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE": {
+ "type": "string",
+ "title": "Image Prompt Generation Prompt Template"
+ },
+ "ENABLE_AUTOCOMPLETE_GENERATION": {
+ "type": "boolean",
+ "title": "Enable Autocomplete Generation"
+ },
+ "AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH": {
+ "type": "integer",
+ "title": "Autocomplete Generation Input Max Length"
+ },
+ "TAGS_GENERATION_PROMPT_TEMPLATE": {
+ "type": "string",
+ "title": "Tags Generation Prompt Template"
+ },
+ "FOLLOW_UP_GENERATION_PROMPT_TEMPLATE": {
+ "type": "string",
+ "title": "Follow Up Generation Prompt Template"
+ },
+ "ENABLE_FOLLOW_UP_GENERATION": {
+ "type": "boolean",
+ "title": "Enable Follow Up Generation"
+ },
+ "ENABLE_TAGS_GENERATION": {
+ "type": "boolean",
+ "title": "Enable Tags Generation"
+ },
+ "ENABLE_SEARCH_QUERY_GENERATION": {
+ "type": "boolean",
+ "title": "Enable Search Query Generation"
+ },
+ "ENABLE_RETRIEVAL_QUERY_GENERATION": {
+ "type": "boolean",
+ "title": "Enable Retrieval Query Generation"
+ },
+ "QUERY_GENERATION_PROMPT_TEMPLATE": {
+ "type": "string",
+ "title": "Query Generation Prompt Template"
+ },
+ "TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE": {
+ "type": "string",
+ "title": "Tools Function Calling Prompt Template"
+ }
+ },
+ "type": "object",
+ "required": [
+ "TASK_MODEL",
+ "TASK_MODEL_EXTERNAL",
+ "ENABLE_TITLE_GENERATION",
+ "TITLE_GENERATION_PROMPT_TEMPLATE",
+ "IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE",
+ "ENABLE_AUTOCOMPLETE_GENERATION",
+ "AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH",
+ "TAGS_GENERATION_PROMPT_TEMPLATE",
+ "FOLLOW_UP_GENERATION_PROMPT_TEMPLATE",
+ "ENABLE_FOLLOW_UP_GENERATION",
+ "ENABLE_TAGS_GENERATION",
+ "ENABLE_SEARCH_QUERY_GENERATION",
+ "ENABLE_RETRIEVAL_QUERY_GENERATION",
+ "QUERY_GENERATION_PROMPT_TEMPLATE",
+ "TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE"
+ ],
+ "title": "TaskConfigForm"
+ },
+ "ToolForm": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "content": {
+ "type": "string",
+ "title": "Content"
+ },
+ "meta": {
+ "$ref": "#/components/schemas/ToolMeta"
+ },
+ "access_control": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Access Control"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "content",
+ "meta"
+ ],
+ "title": "ToolForm"
+ },
+ "ToolMeta": {
+ "properties": {
+ "description": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Description"
+ },
+ "manifest": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Manifest",
+ "default": {}
+ }
+ },
+ "type": "object",
+ "title": "ToolMeta"
+ },
+ "ToolModel": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "content": {
+ "type": "string",
+ "title": "Content"
+ },
+ "specs": {
+ "items": {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ "type": "array",
+ "title": "Specs"
+ },
+ "meta": {
+ "$ref": "#/components/schemas/ToolMeta"
+ },
+ "access_control": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Access Control"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "name",
+ "content",
+ "specs",
+ "meta",
+ "updated_at",
+ "created_at"
+ ],
+ "title": "ToolModel"
+ },
+ "ToolResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "meta": {
+ "$ref": "#/components/schemas/ToolMeta"
+ },
+ "access_control": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Access Control"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "name",
+ "meta",
+ "updated_at",
+ "created_at"
+ ],
+ "title": "ToolResponse"
+ },
+ "ToolServerConnection": {
+ "properties": {
+ "url": {
+ "type": "string",
+ "title": "Url"
+ },
+ "path": {
+ "type": "string",
+ "title": "Path"
+ },
+ "auth_type": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Auth Type"
+ },
+ "key": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Key"
+ },
+ "config": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Config"
+ }
+ },
+ "additionalProperties": true,
+ "type": "object",
+ "required": [
+ "url",
+ "path",
+ "auth_type",
+ "key",
+ "config"
+ ],
+ "title": "ToolServerConnection"
+ },
+ "ToolServersConfigForm": {
+ "properties": {
+ "TOOL_SERVER_CONNECTIONS": {
+ "items": {
+ "$ref": "#/components/schemas/ToolServerConnection"
+ },
+ "type": "array",
+ "title": "Tool Server Connections"
+ }
+ },
+ "type": "object",
+ "required": [
+ "TOOL_SERVER_CONNECTIONS"
+ ],
+ "title": "ToolServersConfigForm"
+ },
+ "ToolUserResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "user_id": {
+ "type": "string",
+ "title": "User Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "meta": {
+ "$ref": "#/components/schemas/ToolMeta"
+ },
+ "access_control": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Access Control"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ },
+ "user": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/open_webui__models__users__UserResponse"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "user_id",
+ "name",
+ "meta",
+ "updated_at",
+ "created_at"
+ ],
+ "title": "ToolUserResponse"
+ },
+ "UpdateConfigForm": {
+ "properties": {
+ "ENABLE_EVALUATION_ARENA_MODELS": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Enable Evaluation Arena Models"
+ },
+ "EVALUATION_ARENA_MODELS": {
+ "anyOf": [
+ {
+ "items": {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Evaluation Arena Models"
+ }
+ },
+ "type": "object",
+ "title": "UpdateConfigForm"
+ },
+ "UpdatePasswordForm": {
+ "properties": {
+ "password": {
+ "type": "string",
+ "title": "Password"
+ },
+ "new_password": {
+ "type": "string",
+ "title": "New Password"
+ }
+ },
+ "type": "object",
+ "required": [
+ "password",
+ "new_password"
+ ],
+ "title": "UpdatePasswordForm"
+ },
+ "UpdateProfileForm": {
+ "properties": {
+ "profile_image_url": {
+ "type": "string",
+ "title": "Profile Image Url"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ }
+ },
+ "type": "object",
+ "required": [
+ "profile_image_url",
+ "name"
+ ],
+ "title": "UpdateProfileForm"
+ },
+ "UrlForm": {
+ "properties": {
+ "url": {
+ "type": "string",
+ "title": "Url"
+ }
+ },
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "title": "UrlForm"
+ },
+ "UserIdsForm": {
+ "properties": {
+ "user_ids": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "User Ids"
+ }
+ },
+ "type": "object",
+ "title": "UserIdsForm"
+ },
+ "UserInfoListResponse": {
+ "properties": {
+ "users": {
+ "items": {
+ "$ref": "#/components/schemas/UserInfoResponse"
+ },
+ "type": "array",
+ "title": "Users"
+ },
+ "total": {
+ "type": "integer",
+ "title": "Total"
+ }
+ },
+ "type": "object",
+ "required": [
+ "users",
+ "total"
+ ],
+ "title": "UserInfoListResponse"
+ },
+ "UserInfoResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "email": {
+ "type": "string",
+ "title": "Email"
+ },
+ "role": {
+ "type": "string",
+ "title": "Role"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "email",
+ "role"
+ ],
+ "title": "UserInfoResponse"
+ },
+ "UserListResponse": {
+ "properties": {
+ "users": {
+ "items": {
+ "$ref": "#/components/schemas/UserModel"
+ },
+ "type": "array",
+ "title": "Users"
+ },
+ "total": {
+ "type": "integer",
+ "title": "Total"
+ }
+ },
+ "type": "object",
+ "required": [
+ "users",
+ "total"
+ ],
+ "title": "UserListResponse"
+ },
+ "UserModel": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "email": {
+ "type": "string",
+ "title": "Email"
+ },
+ "role": {
+ "type": "string",
+ "title": "Role",
+ "default": "pending"
+ },
+ "profile_image_url": {
+ "type": "string",
+ "title": "Profile Image Url"
+ },
+ "last_active_at": {
+ "type": "integer",
+ "title": "Last Active At"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ },
+ "api_key": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Api Key"
+ },
+ "settings": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/UserSettings"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "info": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Info"
+ },
+ "oauth_sub": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Oauth Sub"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "email",
+ "profile_image_url",
+ "last_active_at",
+ "updated_at",
+ "created_at"
+ ],
+ "title": "UserModel"
+ },
+ "UserNameResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "role": {
+ "type": "string",
+ "title": "Role"
+ },
+ "profile_image_url": {
+ "type": "string",
+ "title": "Profile Image Url"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "role",
+ "profile_image_url"
+ ],
+ "title": "UserNameResponse"
+ },
+ "UserPermissions": {
+ "properties": {
+ "workspace": {
+ "$ref": "#/components/schemas/WorkspacePermissions"
+ },
+ "sharing": {
+ "$ref": "#/components/schemas/SharingPermissions"
+ },
+ "chat": {
+ "$ref": "#/components/schemas/ChatPermissions"
+ },
+ "features": {
+ "$ref": "#/components/schemas/FeaturesPermissions"
+ }
+ },
+ "type": "object",
+ "required": [
+ "workspace",
+ "sharing",
+ "chat",
+ "features"
+ ],
+ "title": "UserPermissions"
+ },
+ "UserSettings": {
+ "properties": {
+ "ui": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Ui",
+ "default": {}
+ }
+ },
+ "additionalProperties": true,
+ "type": "object",
+ "title": "UserSettings"
+ },
+ "UserUpdateForm": {
+ "properties": {
+ "role": {
+ "type": "string",
+ "title": "Role"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "email": {
+ "type": "string",
+ "title": "Email"
+ },
+ "profile_image_url": {
+ "type": "string",
+ "title": "Profile Image Url"
+ },
+ "password": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Password"
+ }
+ },
+ "type": "object",
+ "required": [
+ "role",
+ "name",
+ "email",
+ "profile_image_url"
+ ],
+ "title": "UserUpdateForm"
+ },
+ "ValidationError": {
+ "properties": {
+ "loc": {
+ "items": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "integer"
+ }
+ ]
+ },
+ "type": "array",
+ "title": "Location"
+ },
+ "msg": {
+ "type": "string",
+ "title": "Message"
+ },
+ "type": {
+ "type": "string",
+ "title": "Error Type"
+ }
+ },
+ "type": "object",
+ "required": [
+ "loc",
+ "msg",
+ "type"
+ ],
+ "title": "ValidationError"
+ },
+ "WebConfig": {
+ "properties": {
+ "ENABLE_WEB_SEARCH": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Enable Web Search"
+ },
+ "WEB_SEARCH_ENGINE": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Web Search Engine"
+ },
+ "WEB_SEARCH_TRUST_ENV": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Web Search Trust Env"
+ },
+ "WEB_SEARCH_RESULT_COUNT": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Web Search Result Count"
+ },
+ "WEB_SEARCH_CONCURRENT_REQUESTS": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Web Search Concurrent Requests"
+ },
+ "WEB_SEARCH_DOMAIN_FILTER_LIST": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Web Search Domain Filter List",
+ "default": []
+ },
+ "BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Bypass Web Search Embedding And Retrieval"
+ },
+ "BYPASS_WEB_SEARCH_WEB_LOADER": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Bypass Web Search Web Loader"
+ },
+ "SEARXNG_QUERY_URL": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Searxng Query Url"
+ },
+ "YACY_QUERY_URL": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Yacy Query Url"
+ },
+ "YACY_USERNAME": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Yacy Username"
+ },
+ "YACY_PASSWORD": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Yacy Password"
+ },
+ "GOOGLE_PSE_API_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Google Pse Api Key"
+ },
+ "GOOGLE_PSE_ENGINE_ID": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Google Pse Engine Id"
+ },
+ "BRAVE_SEARCH_API_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Brave Search Api Key"
+ },
+ "KAGI_SEARCH_API_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Kagi Search Api Key"
+ },
+ "MOJEEK_SEARCH_API_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Mojeek Search Api Key"
+ },
+ "BOCHA_SEARCH_API_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Bocha Search Api Key"
+ },
+ "SERPSTACK_API_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Serpstack Api Key"
+ },
+ "SERPSTACK_HTTPS": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Serpstack Https"
+ },
+ "SERPER_API_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Serper Api Key"
+ },
+ "SERPLY_API_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Serply Api Key"
+ },
+ "TAVILY_API_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Tavily Api Key"
+ },
+ "SEARCHAPI_API_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Searchapi Api Key"
+ },
+ "SEARCHAPI_ENGINE": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Searchapi Engine"
+ },
+ "SERPAPI_API_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Serpapi Api Key"
+ },
+ "SERPAPI_ENGINE": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Serpapi Engine"
+ },
+ "JINA_API_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Jina Api Key"
+ },
+ "BING_SEARCH_V7_ENDPOINT": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Bing Search V7 Endpoint"
+ },
+ "BING_SEARCH_V7_SUBSCRIPTION_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Bing Search V7 Subscription Key"
+ },
+ "EXA_API_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Exa Api Key"
+ },
+ "PERPLEXITY_API_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Perplexity Api Key"
+ },
+ "PERPLEXITY_MODEL": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Perplexity Model"
+ },
+ "PERPLEXITY_SEARCH_CONTEXT_USAGE": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Perplexity Search Context Usage"
+ },
+ "SOUGOU_API_SID": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Sougou Api Sid"
+ },
+ "SOUGOU_API_SK": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Sougou Api Sk"
+ },
+ "WEB_LOADER_ENGINE": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Web Loader Engine"
+ },
+ "ENABLE_WEB_LOADER_SSL_VERIFICATION": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Enable Web Loader Ssl Verification"
+ },
+ "PLAYWRIGHT_WS_URL": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Playwright Ws Url"
+ },
+ "PLAYWRIGHT_TIMEOUT": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Playwright Timeout"
+ },
+ "FIRECRAWL_API_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Firecrawl Api Key"
+ },
+ "FIRECRAWL_API_BASE_URL": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Firecrawl Api Base Url"
+ },
+ "TAVILY_EXTRACT_DEPTH": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Tavily Extract Depth"
+ },
+ "EXTERNAL_WEB_SEARCH_URL": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "External Web Search Url"
+ },
+ "EXTERNAL_WEB_SEARCH_API_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "External Web Search Api Key"
+ },
+ "EXTERNAL_WEB_LOADER_URL": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "External Web Loader Url"
+ },
+ "EXTERNAL_WEB_LOADER_API_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "External Web Loader Api Key"
+ },
+ "YOUTUBE_LOADER_LANGUAGE": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Youtube Loader Language"
+ },
+ "YOUTUBE_LOADER_PROXY_URL": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Youtube Loader Proxy Url"
+ },
+ "YOUTUBE_LOADER_TRANSLATION": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Youtube Loader Translation"
+ }
+ },
+ "type": "object",
+ "title": "WebConfig"
+ },
+ "WorkspacePermissions": {
+ "properties": {
+ "models": {
+ "type": "boolean",
+ "title": "Models",
+ "default": false
+ },
+ "knowledge": {
+ "type": "boolean",
+ "title": "Knowledge",
+ "default": false
+ },
+ "prompts": {
+ "type": "boolean",
+ "title": "Prompts",
+ "default": false
+ },
+ "tools": {
+ "type": "boolean",
+ "title": "Tools",
+ "default": false
+ }
+ },
+ "type": "object",
+ "title": "WorkspacePermissions"
+ },
+ "open_webui__models__auths__UserResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "email": {
+ "type": "string",
+ "title": "Email"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "role": {
+ "type": "string",
+ "title": "Role"
+ },
+ "profile_image_url": {
+ "type": "string",
+ "title": "Profile Image Url"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "email",
+ "name",
+ "role",
+ "profile_image_url"
+ ],
+ "title": "UserResponse"
+ },
+ "open_webui__models__messages__MessageForm": {
+ "properties": {
+ "content": {
+ "type": "string",
+ "title": "Content"
+ },
+ "parent_id": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Parent Id"
+ },
+ "data": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Data"
+ },
+ "meta": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Meta"
+ }
+ },
+ "type": "object",
+ "required": [
+ "content"
+ ],
+ "title": "MessageForm"
+ },
+ "open_webui__models__users__UserResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "email": {
+ "type": "string",
+ "title": "Email"
+ },
+ "role": {
+ "type": "string",
+ "title": "Role"
+ },
+ "profile_image_url": {
+ "type": "string",
+ "title": "Profile Image Url"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "email",
+ "role",
+ "profile_image_url"
+ ],
+ "title": "UserResponse"
+ },
+ "open_webui__routers__chats__MessageForm": {
+ "properties": {
+ "content": {
+ "type": "string",
+ "title": "Content"
+ }
+ },
+ "type": "object",
+ "required": [
+ "content"
+ ],
+ "title": "MessageForm"
+ },
+ "open_webui__routers__evaluations__UserResponse": {
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "Id"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "email": {
+ "type": "string",
+ "title": "Email"
+ },
+ "role": {
+ "type": "string",
+ "title": "Role",
+ "default": "pending"
+ },
+ "last_active_at": {
+ "type": "integer",
+ "title": "Last Active At"
+ },
+ "updated_at": {
+ "type": "integer",
+ "title": "Updated At"
+ },
+ "created_at": {
+ "type": "integer",
+ "title": "Created At"
+ }
+ },
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "email",
+ "last_active_at",
+ "updated_at",
+ "created_at"
+ ],
+ "title": "UserResponse"
+ },
+ "open_webui__routers__images__ConfigForm": {
+ "properties": {
+ "enabled": {
+ "type": "boolean",
+ "title": "Enabled"
+ },
+ "engine": {
+ "type": "string",
+ "title": "Engine"
+ },
+ "prompt_generation": {
+ "type": "boolean",
+ "title": "Prompt Generation"
+ },
+ "openai": {
+ "$ref": "#/components/schemas/open_webui__routers__images__OpenAIConfigForm"
+ },
+ "automatic1111": {
+ "$ref": "#/components/schemas/Automatic1111ConfigForm"
+ },
+ "comfyui": {
+ "$ref": "#/components/schemas/ComfyUIConfigForm"
+ },
+ "gemini": {
+ "$ref": "#/components/schemas/GeminiConfigForm"
+ }
+ },
+ "type": "object",
+ "required": [
+ "enabled",
+ "engine",
+ "prompt_generation",
+ "openai",
+ "automatic1111",
+ "comfyui",
+ "gemini"
+ ],
+ "title": "ConfigForm"
+ },
+ "open_webui__routers__images__OpenAIConfigForm": {
+ "properties": {
+ "OPENAI_API_BASE_URL": {
+ "type": "string",
+ "title": "Openai Api Base Url"
+ },
+ "OPENAI_API_KEY": {
+ "type": "string",
+ "title": "Openai Api Key"
+ }
+ },
+ "type": "object",
+ "required": [
+ "OPENAI_API_BASE_URL",
+ "OPENAI_API_KEY"
+ ],
+ "title": "OpenAIConfigForm"
+ },
+ "open_webui__routers__ollama__ConnectionVerificationForm": {
+ "properties": {
+ "url": {
+ "type": "string",
+ "title": "Url"
+ },
+ "key": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Key"
+ }
+ },
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "title": "ConnectionVerificationForm"
+ },
+ "open_webui__routers__ollama__OllamaConfigForm": {
+ "properties": {
+ "ENABLE_OLLAMA_API": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Enable Ollama Api"
+ },
+ "OLLAMA_BASE_URLS": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "title": "Ollama Base Urls"
+ },
+ "OLLAMA_API_CONFIGS": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Ollama Api Configs"
+ }
+ },
+ "type": "object",
+ "required": [
+ "OLLAMA_BASE_URLS",
+ "OLLAMA_API_CONFIGS"
+ ],
+ "title": "OllamaConfigForm"
+ },
+ "open_webui__routers__openai__ConnectionVerificationForm": {
+ "properties": {
+ "url": {
+ "type": "string",
+ "title": "Url"
+ },
+ "key": {
+ "type": "string",
+ "title": "Key"
+ },
+ "config": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Config"
+ }
+ },
+ "type": "object",
+ "required": [
+ "url",
+ "key"
+ ],
+ "title": "ConnectionVerificationForm"
+ },
+ "open_webui__routers__openai__OpenAIConfigForm": {
+ "properties": {
+ "ENABLE_OPENAI_API": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Enable Openai Api"
+ },
+ "OPENAI_API_BASE_URLS": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "title": "Openai Api Base Urls"
+ },
+ "OPENAI_API_KEYS": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "title": "Openai Api Keys"
+ },
+ "OPENAI_API_CONFIGS": {
+ "additionalProperties": true,
+ "type": "object",
+ "title": "Openai Api Configs"
+ }
+ },
+ "type": "object",
+ "required": [
+ "OPENAI_API_BASE_URLS",
+ "OPENAI_API_KEYS",
+ "OPENAI_API_CONFIGS"
+ ],
+ "title": "OpenAIConfigForm"
+ },
+ "open_webui__routers__retrieval__ConfigForm": {
+ "properties": {
+ "RAG_TEMPLATE": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Rag Template"
+ },
+ "TOP_K": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Top K"
+ },
+ "BYPASS_EMBEDDING_AND_RETRIEVAL": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Bypass Embedding And Retrieval"
+ },
+ "RAG_FULL_CONTEXT": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Rag Full Context"
+ },
+ "ENABLE_RAG_HYBRID_SEARCH": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Enable Rag Hybrid Search"
+ },
+ "TOP_K_RERANKER": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Top K Reranker"
+ },
+ "RELEVANCE_THRESHOLD": {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Relevance Threshold"
+ },
+ "HYBRID_BM25_WEIGHT": {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Hybrid Bm25 Weight"
+ },
+ "CONTENT_EXTRACTION_ENGINE": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Content Extraction Engine"
+ },
+ "PDF_EXTRACT_IMAGES": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Pdf Extract Images"
+ },
+ "DATALAB_MARKER_API_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Datalab Marker Api Key"
+ },
+ "DATALAB_MARKER_LANGS": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Datalab Marker Langs"
+ },
+ "DATALAB_MARKER_SKIP_CACHE": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Datalab Marker Skip Cache"
+ },
+ "DATALAB_MARKER_FORCE_OCR": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Datalab Marker Force Ocr"
+ },
+ "DATALAB_MARKER_PAGINATE": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Datalab Marker Paginate"
+ },
+ "DATALAB_MARKER_STRIP_EXISTING_OCR": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Datalab Marker Strip Existing Ocr"
+ },
+ "DATALAB_MARKER_DISABLE_IMAGE_EXTRACTION": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Datalab Marker Disable Image Extraction"
+ },
+ "DATALAB_MARKER_USE_LLM": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Datalab Marker Use Llm"
+ },
+ "DATALAB_MARKER_OUTPUT_FORMAT": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Datalab Marker Output Format"
+ },
+ "EXTERNAL_DOCUMENT_LOADER_URL": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "External Document Loader Url"
+ },
+ "EXTERNAL_DOCUMENT_LOADER_API_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "External Document Loader Api Key"
+ },
+ "TIKA_SERVER_URL": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Tika Server Url"
+ },
+ "DOCLING_SERVER_URL": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Docling Server Url"
+ },
+ "DOCLING_OCR_ENGINE": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Docling Ocr Engine"
+ },
+ "DOCLING_OCR_LANG": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Docling Ocr Lang"
+ },
+ "DOCLING_DO_PICTURE_DESCRIPTION": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Docling Do Picture Description"
+ },
+ "DOCLING_PICTURE_DESCRIPTION_MODE": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Docling Picture Description Mode"
+ },
+ "DOCLING_PICTURE_DESCRIPTION_LOCAL": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Docling Picture Description Local"
+ },
+ "DOCLING_PICTURE_DESCRIPTION_API": {
+ "anyOf": [
+ {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Docling Picture Description Api"
+ },
+ "DOCUMENT_INTELLIGENCE_ENDPOINT": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Document Intelligence Endpoint"
+ },
+ "DOCUMENT_INTELLIGENCE_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Document Intelligence Key"
+ },
+ "MISTRAL_OCR_API_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Mistral Ocr Api Key"
+ },
+ "RAG_RERANKING_MODEL": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Rag Reranking Model"
+ },
+ "RAG_RERANKING_ENGINE": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Rag Reranking Engine"
+ },
+ "RAG_EXTERNAL_RERANKER_URL": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Rag External Reranker Url"
+ },
+ "RAG_EXTERNAL_RERANKER_API_KEY": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Rag External Reranker Api Key"
+ },
+ "TEXT_SPLITTER": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Text Splitter"
+ },
+ "CHUNK_SIZE": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Chunk Size"
+ },
+ "CHUNK_OVERLAP": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Chunk Overlap"
+ },
+ "FILE_MAX_SIZE": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "File Max Size"
+ },
+ "FILE_MAX_COUNT": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "File Max Count"
+ },
+ "FILE_IMAGE_COMPRESSION_WIDTH": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "File Image Compression Width"
+ },
+ "FILE_IMAGE_COMPRESSION_HEIGHT": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "File Image Compression Height"
+ },
+ "ALLOWED_FILE_EXTENSIONS": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Allowed File Extensions"
+ },
+ "ENABLE_GOOGLE_DRIVE_INTEGRATION": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Enable Google Drive Integration"
+ },
+ "ENABLE_ONEDRIVE_INTEGRATION": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Enable Onedrive Integration"
+ },
+ "web": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/WebConfig"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "type": "object",
+ "title": "ConfigForm"
+ },
+ "open_webui__routers__retrieval__OllamaConfigForm": {
+ "properties": {
+ "url": {
+ "type": "string",
+ "title": "Url"
+ },
+ "key": {
+ "type": "string",
+ "title": "Key"
+ }
+ },
+ "type": "object",
+ "required": [
+ "url",
+ "key"
+ ],
+ "title": "OllamaConfigForm"
+ },
+ "open_webui__routers__retrieval__OpenAIConfigForm": {
+ "properties": {
+ "url": {
+ "type": "string",
+ "title": "Url"
+ },
+ "key": {
+ "type": "string",
+ "title": "Key"
+ }
+ },
+ "type": "object",
+ "required": [
+ "url",
+ "key"
+ ],
+ "title": "OpenAIConfigForm"
+ },
+ "open_webui__routers__users__UserResponse": {
+ "properties": {
+ "name": {
+ "type": "string",
+ "title": "Name"
+ },
+ "profile_image_url": {
+ "type": "string",
+ "title": "Profile Image Url"
+ },
+ "active": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Active"
+ }
+ },
+ "type": "object",
+ "required": [
+ "name",
+ "profile_image_url"
+ ],
+ "title": "UserResponse"
+ }
+ },
+ "securitySchemes": {
+ "HTTPBearer": {
+ "type": "http",
+ "scheme": "bearer"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt
new file mode 100644
index 0000000..90c9f1a
--- /dev/null
+++ b/fastlane/metadata/android/en-US/full_description.txt
@@ -0,0 +1,35 @@
+Conduit is an open-source, native mobile client for Open‑WebUI. Connect to your own server to chat with AI models, manage conversations, and take your self‑hosted AI with you—securely and on the go.
+
+Features
+- Real-time streaming chat
+- Model selection
+- Conversation search and management
+- Voice input (speech-to-text)
+- File and image uploads for retrieval-augmented generation (RAG)
+- Vision and multi‑modal support
+- Markdown rendering with syntax highlighting
+- Light, dark, and system themes
+- Secure credential storage (Keychain/Keystore)
+- Offline-aware experience
+
+Requirements
+- Requires an existing Open‑WebUI server. Conduit does not host or provide AI models.
+- No data is sent to third-party services by default; everything stays with your configured server.
+
+Permissions
+- Microphone: Voice input
+- Camera and Photos/Storage: Image/file attachments
+- Network: Connect to your Open‑WebUI server
+
+Support & Source Code:
+
+LuCI Mobile is an open-source project. For support, to report issues, or to view the source code, please visit our GitHub repository:
+
+https://github.com/cogwheel0/conduit
+
+Email: cogwheel@cogwheel.app
+
+-----
+
+Disclaimer: This is an independent, third-party application licensed under the GNU General Public License v3.0 (GPLv3) and is not officially affiliated with the Open WebUI project.
+
diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png
new file mode 100644
index 0000000..3f1eeb9
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/icon.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/flutter_01.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/flutter_01.png
new file mode 100644
index 0000000..b3ed8b3
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/flutter_01.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/flutter_02.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/flutter_02.png
new file mode 100644
index 0000000..0a99fc1
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/flutter_02.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/flutter_03.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/flutter_03.png
new file mode 100644
index 0000000..4e9593d
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/flutter_03.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/flutter_04.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/flutter_04.png
new file mode 100644
index 0000000..a03cdd8
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/flutter_04.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/flutter_05.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/flutter_05.png
new file mode 100644
index 0000000..1a3cd42
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/flutter_05.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/flutter_06.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/flutter_06.png
new file mode 100644
index 0000000..3e6a21c
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/flutter_06.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/flutter_07.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/flutter_07.png
new file mode 100644
index 0000000..e39477e
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/flutter_07.png differ
diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt
new file mode 100644
index 0000000..f2f30ef
--- /dev/null
+++ b/fastlane/metadata/android/en-US/short_description.txt
@@ -0,0 +1,2 @@
+Native mobile client for Open‑WebUI. Chat with your self‑hosted AI.
+
diff --git a/fastlane/metadata/android/en-US/title.txt b/fastlane/metadata/android/en-US/title.txt
new file mode 100644
index 0000000..a454a94
--- /dev/null
+++ b/fastlane/metadata/android/en-US/title.txt
@@ -0,0 +1,2 @@
+Conduit
+
diff --git a/fastlane/metadata/en-US/description.txt b/fastlane/metadata/en-US/description.txt
new file mode 100644
index 0000000..f8ae6dc
--- /dev/null
+++ b/fastlane/metadata/en-US/description.txt
@@ -0,0 +1,24 @@
+Conduit is an open-source, native mobile client for Open‑WebUI. Connect to your own server to chat with AI models, manage conversations, and take your self‑hosted AI with you—securely and on the go.
+
+Key Features
+- Real-time streaming chat
+- Model selection
+- Conversation search and management
+- Voice input (speech-to-text)
+- File and image uploads for retrieval-augmented generation (RAG)
+- Vision and multi‑modal support
+- Markdown rendering with syntax highlighting
+- Light, dark, and system themes
+- Secure credential storage
+
+Requirements
+- An existing Open‑WebUI server (Conduit does not host or provide AI models).
+
+Privacy & Permissions
+- Microphone: For voice input
+- Camera and Photos: For image/file attachments
+- Network: To connect to your Open‑WebUI server
+
+Open Source
+Built with Flutter and maintained by the community. Contributions are welcome.
+
diff --git a/fastlane/metadata/en-US/images/icon.png b/fastlane/metadata/en-US/images/icon.png
new file mode 100644
index 0000000..72600be
Binary files /dev/null and b/fastlane/metadata/en-US/images/icon.png differ
diff --git a/fastlane/metadata/en-US/images/phoneScreenshots/flutter_01.png b/fastlane/metadata/en-US/images/phoneScreenshots/flutter_01.png
new file mode 100644
index 0000000..82baa03
Binary files /dev/null and b/fastlane/metadata/en-US/images/phoneScreenshots/flutter_01.png differ
diff --git a/fastlane/metadata/en-US/images/phoneScreenshots/flutter_02.png b/fastlane/metadata/en-US/images/phoneScreenshots/flutter_02.png
new file mode 100644
index 0000000..1bf2ec7
Binary files /dev/null and b/fastlane/metadata/en-US/images/phoneScreenshots/flutter_02.png differ
diff --git a/fastlane/metadata/en-US/images/phoneScreenshots/flutter_03.png b/fastlane/metadata/en-US/images/phoneScreenshots/flutter_03.png
new file mode 100644
index 0000000..d933a39
Binary files /dev/null and b/fastlane/metadata/en-US/images/phoneScreenshots/flutter_03.png differ
diff --git a/fastlane/metadata/en-US/images/phoneScreenshots/flutter_04.png b/fastlane/metadata/en-US/images/phoneScreenshots/flutter_04.png
new file mode 100644
index 0000000..497eae2
Binary files /dev/null and b/fastlane/metadata/en-US/images/phoneScreenshots/flutter_04.png differ
diff --git a/fastlane/metadata/en-US/images/phoneScreenshots/flutter_05.png b/fastlane/metadata/en-US/images/phoneScreenshots/flutter_05.png
new file mode 100644
index 0000000..ccac460
Binary files /dev/null and b/fastlane/metadata/en-US/images/phoneScreenshots/flutter_05.png differ
diff --git a/fastlane/metadata/en-US/images/phoneScreenshots/flutter_06.png b/fastlane/metadata/en-US/images/phoneScreenshots/flutter_06.png
new file mode 100644
index 0000000..c3a4675
Binary files /dev/null and b/fastlane/metadata/en-US/images/phoneScreenshots/flutter_06.png differ
diff --git a/fastlane/metadata/en-US/images/phoneScreenshots/flutter_07.png b/fastlane/metadata/en-US/images/phoneScreenshots/flutter_07.png
new file mode 100644
index 0000000..56a9ad9
Binary files /dev/null and b/fastlane/metadata/en-US/images/phoneScreenshots/flutter_07.png differ
diff --git a/fastlane/metadata/en-US/name.txt b/fastlane/metadata/en-US/name.txt
new file mode 100644
index 0000000..a454a94
--- /dev/null
+++ b/fastlane/metadata/en-US/name.txt
@@ -0,0 +1,2 @@
+Conduit
+
diff --git a/fastlane/metadata/en-US/subtitle.txt b/fastlane/metadata/en-US/subtitle.txt
new file mode 100644
index 0000000..f8cd883
--- /dev/null
+++ b/fastlane/metadata/en-US/subtitle.txt
@@ -0,0 +1,2 @@
+Chat with your self‑hosted AI
+
diff --git a/ios/.gitignore b/ios/.gitignore
new file mode 100644
index 0000000..7a7f987
--- /dev/null
+++ b/ios/.gitignore
@@ -0,0 +1,34 @@
+**/dgph
+*.mode1v3
+*.mode2v3
+*.moved-aside
+*.pbxuser
+*.perspectivev3
+**/*sync/
+.sconsign.dblite
+.tags*
+**/.vagrant/
+**/DerivedData/
+Icon?
+**/Pods/
+**/.symlinks/
+profile
+xcuserdata
+**/.generated/
+Flutter/App.framework
+Flutter/Flutter.framework
+Flutter/Flutter.podspec
+Flutter/Generated.xcconfig
+Flutter/ephemeral/
+Flutter/app.flx
+Flutter/app.zip
+Flutter/flutter_assets/
+Flutter/flutter_export_environment.sh
+ServiceDefinitions.json
+Runner/GeneratedPluginRegistrant.*
+
+# Exceptions to above rules.
+!default.mode1v3
+!default.mode2v3
+!default.pbxuser
+!default.perspectivev3
diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist
new file mode 100644
index 0000000..7c56964
--- /dev/null
+++ b/ios/Flutter/AppFrameworkInfo.plist
@@ -0,0 +1,26 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ App
+ CFBundleIdentifier
+ io.flutter.flutter.app
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ App
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1.0
+ MinimumOSVersion
+ 12.0
+
+
diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig
new file mode 100644
index 0000000..592ceee
--- /dev/null
+++ b/ios/Flutter/Debug.xcconfig
@@ -0,0 +1 @@
+#include "Generated.xcconfig"
diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig
new file mode 100644
index 0000000..592ceee
--- /dev/null
+++ b/ios/Flutter/Release.xcconfig
@@ -0,0 +1 @@
+#include "Generated.xcconfig"
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..6c8fdc7
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,616 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 54;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+ 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 97C146E61CF9000F007C117D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 97C146ED1CF9000F007C117D;
+ remoteInfo = Runner;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
+ 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
+ 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
+ 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 97C146EB1CF9000F007C117D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 331C8082294A63A400263BE5 /* RunnerTests */ = {
+ isa = PBXGroup;
+ children = (
+ 331C807B294A618700263BE5 /* RunnerTests.swift */,
+ );
+ path = RunnerTests;
+ sourceTree = "";
+ };
+ 9740EEB11CF90186004384FC /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */,
+ );
+ name = Flutter;
+ sourceTree = "";
+ };
+ 97C146E51CF9000F007C117D = {
+ isa = PBXGroup;
+ children = (
+ 9740EEB11CF90186004384FC /* Flutter */,
+ 97C146F01CF9000F007C117D /* Runner */,
+ 97C146EF1CF9000F007C117D /* Products */,
+ 331C8082294A63A400263BE5 /* RunnerTests */,
+ );
+ sourceTree = "";
+ };
+ 97C146EF1CF9000F007C117D /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146EE1CF9000F007C117D /* Runner.app */,
+ 331C8081294A63A400263BE5 /* RunnerTests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 97C146F01CF9000F007C117D /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146FA1CF9000F007C117D /* Main.storyboard */,
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */,
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
+ 97C147021CF9000F007C117D /* Info.plist */,
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 331C8080294A63A400263BE5 /* RunnerTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
+ buildPhases = (
+ 331C807D294A63A400263BE5 /* Sources */,
+ 331C807F294A63A400263BE5 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 331C8086294A63A400263BE5 /* PBXTargetDependency */,
+ );
+ name = RunnerTests;
+ productName = RunnerTests;
+ productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ 97C146ED1CF9000F007C117D /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ 9740EEB61CF901F6004384FC /* Run Script */,
+ 97C146EA1CF9000F007C117D /* Sources */,
+ 97C146EB1CF9000F007C117D /* Frameworks */,
+ 97C146EC1CF9000F007C117D /* Resources */,
+ 9705A1C41CF9048500538489 /* Embed Frameworks */,
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Runner;
+ productName = Runner;
+ productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 97C146E61CF9000F007C117D /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = YES;
+ LastUpgradeCheck = 1510;
+ ORGANIZATIONNAME = "";
+ TargetAttributes = {
+ 331C8080294A63A400263BE5 = {
+ CreatedOnToolsVersion = 14.0;
+ TestTargetID = 97C146ED1CF9000F007C117D;
+ };
+ 97C146ED1CF9000F007C117D = {
+ CreatedOnToolsVersion = 7.3.1;
+ LastSwiftMigration = 1100;
+ };
+ };
+ };
+ buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 97C146E51CF9000F007C117D;
+ productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 97C146ED1CF9000F007C117D /* Runner */,
+ 331C8080294A63A400263BE5 /* RunnerTests */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 331C807F294A63A400263BE5 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 97C146EC1CF9000F007C117D /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
+ );
+ name = "Thin Binary";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
+ };
+ 9740EEB61CF901F6004384FC /* Run Script */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Script";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 331C807D294A63A400263BE5 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 97C146EA1CF9000F007C117D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 97C146ED1CF9000F007C117D /* Runner */;
+ targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C146FB1CF9000F007C117D /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C147001CF9000F007C117D /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 249021D3217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Profile;
+ };
+ 249021D4217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = app.cogwheel.conduit;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Profile;
+ };
+ 331C8088294A63A400263BE5 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = app.cogwheel.conduit.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Debug;
+ };
+ 331C8089294A63A400263BE5 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = app.cogwheel.conduit.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Release;
+ };
+ 331C808A294A63A400263BE5 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = app.cogwheel.conduit.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Profile;
+ };
+ 97C147031CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 97C147041CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 97C147061CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = app.cogwheel.conduit;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Debug;
+ };
+ 97C147071CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = app.cogwheel.conduit;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 331C8088294A63A400263BE5 /* Debug */,
+ 331C8089294A63A400263BE5 /* Release */,
+ 331C808A294A63A400263BE5 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147031CF9000F007C117D /* Debug */,
+ 97C147041CF9000F007C117D /* Release */,
+ 249021D3217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147061CF9000F007C117D /* Debug */,
+ 97C147071CF9000F007C117D /* Release */,
+ 249021D4217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 97C146E61CF9000F007C117D /* Project object */;
+}
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..919434a
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000..f9b0d7c
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 0000000..e3773d4
--- /dev/null
+++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..1d526a1
--- /dev/null
+++ b/ios/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000..f9b0d7c
--- /dev/null
+++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift
new file mode 100644
index 0000000..6266644
--- /dev/null
+++ b/ios/Runner/AppDelegate.swift
@@ -0,0 +1,13 @@
+import Flutter
+import UIKit
+
+@main
+@objc class AppDelegate: FlutterAppDelegate {
+ override func application(
+ _ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
+ ) -> Bool {
+ GeneratedPluginRegistrant.register(with: self)
+ return super.application(application, didFinishLaunchingWithOptions: launchOptions)
+ }
+}
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png
new file mode 100644
index 0000000..c91bdc8
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x~ipad.png
new file mode 100644
index 0000000..c91bdc8
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x~ipad.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png
new file mode 100644
index 0000000..fac8f98
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20~ipad.png
new file mode 100644
index 0000000..bdab698
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20~ipad.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29.png
new file mode 100644
index 0000000..129a717
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png
new file mode 100644
index 0000000..cdb7f2f
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x~ipad.png
new file mode 100644
index 0000000..cdb7f2f
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x~ipad.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png
new file mode 100644
index 0000000..f8c4ac4
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29~ipad.png
new file mode 100644
index 0000000..129a717
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29~ipad.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png
new file mode 100644
index 0000000..efcb9c5
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x~ipad.png
new file mode 100644
index 0000000..efcb9c5
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x~ipad.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png
new file mode 100644
index 0000000..6f93a9b
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40~ipad.png
new file mode 100644
index 0000000..c91bdc8
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40~ipad.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x~car.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x~car.png
new file mode 100644
index 0000000..6f93a9b
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x~car.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x~car.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x~car.png
new file mode 100644
index 0000000..33d73cb
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x~car.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x~ipad.png
new file mode 100644
index 0000000..f8ff3ea
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x~ipad.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x.png
new file mode 100644
index 0000000..6f93a9b
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x~ipad.png
new file mode 100644
index 0000000..a2140ff
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x~ipad.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@3x.png
new file mode 100644
index 0000000..33d73cb
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ios-marketing.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ios-marketing.png
new file mode 100644
index 0000000..406302f
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ios-marketing.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ipad.png
new file mode 100644
index 0000000..a5aa2d7
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ipad.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..bd04914
--- /dev/null
+++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,134 @@
+{
+ "images": [
+ {
+ "filename": "AppIcon@2x.png",
+ "idiom": "iphone",
+ "scale": "2x",
+ "size": "60x60"
+ },
+ {
+ "filename": "AppIcon@3x.png",
+ "idiom": "iphone",
+ "scale": "3x",
+ "size": "60x60"
+ },
+ {
+ "filename": "AppIcon~ipad.png",
+ "idiom": "ipad",
+ "scale": "1x",
+ "size": "76x76"
+ },
+ {
+ "filename": "AppIcon@2x~ipad.png",
+ "idiom": "ipad",
+ "scale": "2x",
+ "size": "76x76"
+ },
+ {
+ "filename": "AppIcon-83.5@2x~ipad.png",
+ "idiom": "ipad",
+ "scale": "2x",
+ "size": "83.5x83.5"
+ },
+ {
+ "filename": "AppIcon-40@2x.png",
+ "idiom": "iphone",
+ "scale": "2x",
+ "size": "40x40"
+ },
+ {
+ "filename": "AppIcon-40@3x.png",
+ "idiom": "iphone",
+ "scale": "3x",
+ "size": "40x40"
+ },
+ {
+ "filename": "AppIcon-40~ipad.png",
+ "idiom": "ipad",
+ "scale": "1x",
+ "size": "40x40"
+ },
+ {
+ "filename": "AppIcon-40@2x~ipad.png",
+ "idiom": "ipad",
+ "scale": "2x",
+ "size": "40x40"
+ },
+ {
+ "filename": "AppIcon-20@2x.png",
+ "idiom": "iphone",
+ "scale": "2x",
+ "size": "20x20"
+ },
+ {
+ "filename": "AppIcon-20@3x.png",
+ "idiom": "iphone",
+ "scale": "3x",
+ "size": "20x20"
+ },
+ {
+ "filename": "AppIcon-20~ipad.png",
+ "idiom": "ipad",
+ "scale": "1x",
+ "size": "20x20"
+ },
+ {
+ "filename": "AppIcon-20@2x~ipad.png",
+ "idiom": "ipad",
+ "scale": "2x",
+ "size": "20x20"
+ },
+ {
+ "filename": "AppIcon-29.png",
+ "idiom": "iphone",
+ "scale": "1x",
+ "size": "29x29"
+ },
+ {
+ "filename": "AppIcon-29@2x.png",
+ "idiom": "iphone",
+ "scale": "2x",
+ "size": "29x29"
+ },
+ {
+ "filename": "AppIcon-29@3x.png",
+ "idiom": "iphone",
+ "scale": "3x",
+ "size": "29x29"
+ },
+ {
+ "filename": "AppIcon-29~ipad.png",
+ "idiom": "ipad",
+ "scale": "1x",
+ "size": "29x29"
+ },
+ {
+ "filename": "AppIcon-29@2x~ipad.png",
+ "idiom": "ipad",
+ "scale": "2x",
+ "size": "29x29"
+ },
+ {
+ "filename": "AppIcon-60@2x~car.png",
+ "idiom": "car",
+ "scale": "2x",
+ "size": "60x60"
+ },
+ {
+ "filename": "AppIcon-60@3x~car.png",
+ "idiom": "car",
+ "scale": "3x",
+ "size": "60x60"
+ },
+ {
+ "filename": "AppIcon~ios-marketing.png",
+ "idiom": "ios-marketing",
+ "scale": "1x",
+ "size": "1024x1024"
+ }
+ ],
+ "info": {
+ "author": "iconkitchen",
+ "version": 1
+ }
+}
\ No newline at end of file
diff --git a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json
new file mode 100644
index 0000000..9f447e1
--- /dev/null
+++ b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "background.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png
new file mode 100644
index 0000000..e815fd6
Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
new file mode 100644
index 0000000..00cabce
--- /dev/null
+++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "LaunchImage.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "LaunchImage@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "LaunchImage@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
new file mode 100644
index 0000000..a1f6a19
Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
new file mode 100644
index 0000000..578245c
Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
new file mode 100644
index 0000000..f32c57b
Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
new file mode 100644
index 0000000..89c2725
--- /dev/null
+++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
@@ -0,0 +1,5 @@
+# Launch Screen Assets
+
+You can customize the launch screen with your own desired assets by replacing the image files in this directory.
+
+You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000..7aa6dfb
--- /dev/null
+++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard
new file mode 100644
index 0000000..f3c2851
--- /dev/null
+++ b/ios/Runner/Base.lproj/Main.storyboard
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
new file mode 100644
index 0000000..c5e4936
--- /dev/null
+++ b/ios/Runner/Info.plist
@@ -0,0 +1,68 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Conduit
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ conduit
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSRequiresIPhoneOS
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+
+ NSAppTransportSecurity
+
+ NSAllowsArbitraryLoads
+
+ NSAllowsLocalNetworking
+
+
+
+ NSMicrophoneUsageDescription
+ Conduit needs access to your microphone for voice input
+ NSCameraUsageDescription
+ Conduit needs access to your camera to take photos for chat
+ NSPhotoLibraryUsageDescription
+ Conduit needs access to your photo library to select images for chat
+ CADisableMinimumFrameDurationOnPhone
+
+ UIApplicationSupportsIndirectInputEvents
+
+ UIStatusBarHidden
+
+
+
diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h
new file mode 100644
index 0000000..308a2a5
--- /dev/null
+++ b/ios/Runner/Runner-Bridging-Header.h
@@ -0,0 +1 @@
+#import "GeneratedPluginRegistrant.h"
diff --git a/ios/RunnerTests/RunnerTests.swift b/ios/RunnerTests/RunnerTests.swift
new file mode 100644
index 0000000..86a7c3b
--- /dev/null
+++ b/ios/RunnerTests/RunnerTests.swift
@@ -0,0 +1,12 @@
+import Flutter
+import UIKit
+import XCTest
+
+class RunnerTests: XCTestCase {
+
+ func testExample() {
+ // If you add code to the Runner application, consider adding tests here.
+ // See https://developer.apple.com/documentation/xctest for more information about using XCTest.
+ }
+
+}
diff --git a/lib/core/auth/api_auth_interceptor.dart b/lib/core/auth/api_auth_interceptor.dart
new file mode 100644
index 0000000..6765eb1
--- /dev/null
+++ b/lib/core/auth/api_auth_interceptor.dart
@@ -0,0 +1,146 @@
+import 'package:dio/dio.dart';
+import 'package:flutter/foundation.dart';
+
+/// Consistent authentication interceptor for all API requests
+/// Implements security requirements from OpenAPI specification
+class ApiAuthInterceptor extends Interceptor {
+ String? _authToken;
+
+ // Callbacks for auth events
+ void Function()? onAuthTokenInvalid;
+ Future Function()? onTokenInvalidated;
+
+ // Public endpoints that don't require authentication
+ static const Set _publicEndpoints = {
+ '/health',
+ '/api/v1/auths/signin',
+ '/api/v1/auths/signup',
+ '/api/v1/auths/signup/enabled',
+ '/api/v1/auths/trusted-header-auth',
+ '/ollama/api/ps',
+ '/ollama/api/version',
+ '/docs',
+ '/openapi.json',
+ '/swagger',
+ '/api/docs',
+ };
+
+ // Endpoints that have optional authentication (work without but better with)
+ static const Set _optionalAuthEndpoints = {
+ '/api/models',
+ '/api/v1/configs/models',
+ };
+
+ ApiAuthInterceptor({
+ String? authToken,
+ this.onAuthTokenInvalid,
+ this.onTokenInvalidated,
+ }) : _authToken = authToken;
+
+ void updateAuthToken(String? token) {
+ _authToken = token;
+ }
+
+ String? get authToken => _authToken;
+
+ /// Check if endpoint requires authentication based on OpenAPI spec
+ bool _requiresAuth(String path) {
+ // Direct public endpoint match
+ if (_publicEndpoints.contains(path)) {
+ return false;
+ }
+
+ // Check for partial matches (e.g., /ollama/* endpoints)
+ for (final publicPattern in _publicEndpoints) {
+ if (publicPattern.endsWith('*') &&
+ path.startsWith(
+ publicPattern.substring(0, publicPattern.length - 1),
+ )) {
+ return false;
+ }
+ }
+
+ // All other endpoints require authentication per OpenAPI spec
+ return true;
+ }
+
+ /// Check if endpoint is better with auth but works without
+ bool _hasOptionalAuth(String path) {
+ return _optionalAuthEndpoints.contains(path);
+ }
+
+ @override
+ void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
+ final path = options.path;
+ final requiresAuth = _requiresAuth(path);
+ final hasOptionalAuth = _hasOptionalAuth(path);
+
+ debugPrint(
+ 'DEBUG: Auth interceptor for $path - requires: $requiresAuth, optional: $hasOptionalAuth, token present: ${_authToken != null}',
+ );
+
+ if (requiresAuth) {
+ // Strictly required authentication
+ if (_authToken == null || _authToken!.isEmpty) {
+ final error = DioException(
+ requestOptions: options,
+ response: Response(
+ requestOptions: options,
+ statusCode: 401,
+ data: {'detail': 'Authentication required for this endpoint'},
+ ),
+ type: DioExceptionType.badResponse,
+ );
+ handler.reject(error);
+ return;
+ }
+ options.headers['Authorization'] = 'Bearer $_authToken';
+ } else if (hasOptionalAuth &&
+ _authToken != null &&
+ _authToken!.isNotEmpty) {
+ // Optional authentication - add if available
+ options.headers['Authorization'] = 'Bearer $_authToken';
+ }
+
+ // Add other common headers for API consistency
+ options.headers['Content-Type'] ??= 'application/json';
+ options.headers['Accept'] ??= 'application/json';
+
+ handler.next(options);
+ }
+
+ @override
+ void onError(DioException err, ErrorInterceptorHandler handler) {
+ final statusCode = err.response?.statusCode;
+ final path = err.requestOptions.path;
+
+ // Handle authentication errors consistently
+ if (statusCode == 401) {
+ // 401 always indicates invalid/expired auth token
+ debugPrint('DEBUG: 401 Unauthorized on $path - clearing auth token');
+ _clearAuthToken();
+ } else if (statusCode == 403) {
+ // 403 on protected endpoints indicates insufficient permissions or invalid token
+ final requiresAuth = _requiresAuth(path);
+ final optionalAuth = _hasOptionalAuth(path);
+ if (requiresAuth && !optionalAuth) {
+ debugPrint(
+ 'DEBUG: 403 Forbidden on protected endpoint $path - clearing auth token',
+ );
+ _clearAuthToken();
+ } else {
+ debugPrint(
+ 'DEBUG: 403 Forbidden on public/optional endpoint $path - keeping auth token',
+ );
+ }
+ }
+
+ handler.next(err);
+ }
+
+ void _clearAuthToken() {
+ _authToken = null;
+ onAuthTokenInvalid?.call();
+ onTokenInvalidated?.call();
+ }
+}
diff --git a/lib/core/auth/auth_cache_manager.dart b/lib/core/auth/auth_cache_manager.dart
new file mode 100644
index 0000000..2eaa324
--- /dev/null
+++ b/lib/core/auth/auth_cache_manager.dart
@@ -0,0 +1,194 @@
+import 'package:flutter/foundation.dart';
+import 'auth_state_manager.dart';
+
+/// Comprehensive caching manager for auth-related operations
+/// Reduces redundant operations and improves app performance
+class AuthCacheManager {
+ static final AuthCacheManager _instance = AuthCacheManager._internal();
+ factory AuthCacheManager() => _instance;
+ AuthCacheManager._internal();
+
+ // Cache for various auth-related operations
+ final Map _cache = {};
+ final Map _cacheTimestamps = {};
+
+ // Cache timeouts for different types of data
+ static const Duration _shortCache = Duration(
+ minutes: 2,
+ ); // For frequently changing data
+ static const Duration _mediumCache = Duration(
+ minutes: 5,
+ ); // For moderately stable data
+ static const Duration _longCache = Duration(minutes: 15); // For stable data
+
+ // Cache keys
+ static const String _userDataKey = 'user_data';
+ static const String _serverConnectionKey = 'server_connection';
+ static const String _credentialsExistKey = 'credentials_exist';
+ static const String _serverConfigsKey = 'server_configs';
+
+ /// Cache user data with medium timeout
+ void cacheUserData(dynamic userData) {
+ _cache[_userDataKey] = userData;
+ _cacheTimestamps[_userDataKey] = DateTime.now();
+ debugPrint('DEBUG: User data cached');
+ }
+
+ /// Get cached user data
+ dynamic getCachedUserData() {
+ if (_isCacheValid(_userDataKey, _mediumCache)) {
+ debugPrint('DEBUG: Using cached user data');
+ return _cache[_userDataKey];
+ }
+ return null;
+ }
+
+ /// Cache server connection status with short timeout
+ void cacheServerConnection(bool isConnected) {
+ _cache[_serverConnectionKey] = isConnected;
+ _cacheTimestamps[_serverConnectionKey] = DateTime.now();
+ }
+
+ /// Get cached server connection status
+ bool? getCachedServerConnection() {
+ if (_isCacheValid(_serverConnectionKey, _shortCache)) {
+ return _cache[_serverConnectionKey] as bool?;
+ }
+ return null;
+ }
+
+ /// Cache credentials existence with medium timeout
+ void cacheCredentialsExist(bool exist) {
+ _cache[_credentialsExistKey] = exist;
+ _cacheTimestamps[_credentialsExistKey] = DateTime.now();
+ }
+
+ /// Get cached credentials existence
+ bool? getCachedCredentialsExist() {
+ if (_isCacheValid(_credentialsExistKey, _mediumCache)) {
+ return _cache[_credentialsExistKey] as bool?;
+ }
+ return null;
+ }
+
+ /// Cache server configurations with long timeout
+ void cacheServerConfigs(List configs) {
+ _cache[_serverConfigsKey] = configs;
+ _cacheTimestamps[_serverConfigsKey] = DateTime.now();
+ }
+
+ /// Get cached server configurations
+ List? getCachedServerConfigs() {
+ if (_isCacheValid(_serverConfigsKey, _longCache)) {
+ return _cache[_serverConfigsKey] as List?;
+ }
+ return null;
+ }
+
+ /// Check if cache entry is valid
+ bool _isCacheValid(String key, Duration timeout) {
+ final timestamp = _cacheTimestamps[key];
+ if (timestamp == null) return false;
+
+ return DateTime.now().difference(timestamp) < timeout;
+ }
+
+ /// Clear specific cache entry
+ void clearCacheEntry(String key) {
+ _cache.remove(key);
+ _cacheTimestamps.remove(key);
+ debugPrint('DEBUG: Cache entry cleared: $key');
+ }
+
+ /// Clear all auth-related cache
+ void clearAuthCache() {
+ _cache.clear();
+ _cacheTimestamps.clear();
+ debugPrint('DEBUG: All auth cache cleared');
+ }
+
+ /// Clear expired cache entries
+ void cleanExpiredCache() {
+ final now = DateTime.now();
+ final expiredKeys = [];
+
+ for (final entry in _cacheTimestamps.entries) {
+ // Use the longest timeout for cleanup to be conservative
+ if (now.difference(entry.value) > _longCache) {
+ expiredKeys.add(entry.key);
+ }
+ }
+
+ for (final key in expiredKeys) {
+ _cache.remove(key);
+ _cacheTimestamps.remove(key);
+ }
+
+ if (expiredKeys.isNotEmpty) {
+ debugPrint('DEBUG: Cleaned ${expiredKeys.length} expired cache entries');
+ }
+ }
+
+ /// Get cache statistics for monitoring
+ Map getCacheStats() {
+ final now = DateTime.now();
+ final stats = {};
+
+ stats['totalEntries'] = _cache.length;
+ stats['entries'] = >{};
+
+ for (final key in _cache.keys) {
+ final timestamp = _cacheTimestamps[key];
+ if (timestamp != null) {
+ stats['entries'][key] = {
+ 'age': now.difference(timestamp).inSeconds,
+ 'hasData': _cache[key] != null,
+ };
+ }
+ }
+
+ return stats;
+ }
+
+ /// Optimize cache by removing least recently used entries if cache gets too large
+ void optimizeCache() {
+ const maxCacheSize = 20; // Reasonable limit for auth cache
+
+ if (_cache.length <= maxCacheSize) return;
+
+ // Sort by timestamp (oldest first)
+ final sortedEntries = _cacheTimestamps.entries.toList()
+ ..sort((a, b) => a.value.compareTo(b.value));
+
+ // Remove oldest entries
+ final entriesToRemove = sortedEntries.length - maxCacheSize;
+ for (int i = 0; i < entriesToRemove; i++) {
+ final key = sortedEntries[i].key;
+ _cache.remove(key);
+ _cacheTimestamps.remove(key);
+ }
+
+ debugPrint('DEBUG: Cache optimized, removed $entriesToRemove old entries');
+ }
+
+ /// Cache state from AuthState for quick access
+ void cacheAuthState(AuthState authState) {
+ if (authState.user != null) {
+ cacheUserData(authState.user);
+ }
+
+ // Don't cache loading or error states
+ if (authState.status == AuthStatus.authenticated) {
+ _cache['auth_status'] = authState.status;
+ _cacheTimestamps['auth_status'] = DateTime.now();
+ }
+ }
+
+ /// Get cached auth status
+ AuthStatus? getCachedAuthStatus() {
+ if (_isCacheValid('auth_status', _shortCache)) {
+ return _cache['auth_status'] as AuthStatus?;
+ }
+ return null;
+ }
+}
diff --git a/lib/core/auth/auth_state_manager.dart b/lib/core/auth/auth_state_manager.dart
new file mode 100644
index 0000000..03be868
--- /dev/null
+++ b/lib/core/auth/auth_state_manager.dart
@@ -0,0 +1,562 @@
+import 'package:flutter/foundation.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+// Types are used through app_providers.dart
+import '../providers/app_providers.dart';
+import '../models/user.dart';
+import 'token_validator.dart';
+import 'auth_cache_manager.dart';
+
+/// Comprehensive auth state representation
+@immutable
+class AuthState {
+ const AuthState({
+ required this.status,
+ this.token,
+ this.user,
+ this.error,
+ this.isLoading = false,
+ });
+
+ final AuthStatus status;
+ final String? token;
+ final dynamic user; // Replace with proper User type
+ final String? error;
+ final bool isLoading;
+
+ bool get isAuthenticated =>
+ status == AuthStatus.authenticated && token != null;
+ bool get hasValidToken => token != null && token!.isNotEmpty;
+ bool get needsLogin =>
+ status == AuthStatus.unauthenticated || status == AuthStatus.tokenExpired;
+
+ AuthState copyWith({
+ AuthStatus? status,
+ String? token,
+ dynamic user,
+ String? error,
+ bool? isLoading,
+ bool clearToken = false,
+ bool clearUser = false,
+ bool clearError = false,
+ }) {
+ return AuthState(
+ status: status ?? this.status,
+ token: clearToken ? null : (token ?? this.token),
+ user: clearUser ? null : (user ?? this.user),
+ error: clearError ? null : (error ?? this.error),
+ isLoading: isLoading ?? this.isLoading,
+ );
+ }
+
+ @override
+ bool operator ==(Object other) {
+ if (identical(this, other)) return true;
+ return other is AuthState &&
+ other.status == status &&
+ other.token == token &&
+ other.user == user &&
+ other.error == error &&
+ other.isLoading == isLoading;
+ }
+
+ @override
+ int get hashCode => Object.hash(status, token, user, error, isLoading);
+
+ @override
+ String toString() =>
+ 'AuthState(status: $status, hasToken: ${token != null}, hasUser: ${user != null}, error: $error, isLoading: $isLoading)';
+}
+
+enum AuthStatus {
+ initial,
+ loading,
+ authenticated,
+ unauthenticated,
+ tokenExpired,
+ error,
+}
+
+/// Unified auth state manager - single source of truth for all auth operations
+class AuthStateManager extends StateNotifier {
+ AuthStateManager(this._ref)
+ : super(const AuthState(status: AuthStatus.initial)) {
+ _initialize();
+ }
+
+ final Ref _ref;
+ final AuthCacheManager _cacheManager = AuthCacheManager();
+
+ /// Initialize auth state from storage
+ Future _initialize() async {
+ state = state.copyWith(status: AuthStatus.loading, isLoading: true);
+
+ try {
+ final storage = _ref.read(optimizedStorageServiceProvider);
+ final token = await storage.getAuthToken();
+
+ if (token != null && token.isNotEmpty) {
+ // Validate token before setting authenticated state
+ final isValid = await _validateToken(token);
+ if (isValid) {
+ state = state.copyWith(
+ status: AuthStatus.authenticated,
+ token: token,
+ isLoading: false,
+ clearError: true,
+ );
+
+ // Update API service with token
+ _updateApiServiceToken(token);
+
+ // Load user data in background
+ _loadUserData();
+ } else {
+ // Token is invalid, clear it
+ await storage.deleteAuthToken();
+ state = state.copyWith(
+ status: AuthStatus.unauthenticated,
+ isLoading: false,
+ clearToken: true,
+ clearError: true,
+ );
+ }
+ } else {
+ state = state.copyWith(
+ status: AuthStatus.unauthenticated,
+ isLoading: false,
+ clearToken: true,
+ clearError: true,
+ );
+ }
+ } catch (e) {
+ debugPrint('ERROR: Auth initialization failed: $e');
+ state = state.copyWith(
+ status: AuthStatus.error,
+ error: 'Failed to initialize auth: $e',
+ isLoading: false,
+ );
+ }
+ }
+
+ /// Perform login with credentials
+ Future login(
+ String username,
+ String password, {
+ bool rememberCredentials = false,
+ }) async {
+ state = state.copyWith(
+ status: AuthStatus.loading,
+ isLoading: true,
+ clearError: true,
+ );
+
+ try {
+ // Ensure API service is available (active server/provider rebuild race)
+ await _ensureApiServiceAvailable();
+ final api = _ref.read(apiServiceProvider);
+ if (api == null) {
+ throw Exception('No server connection available');
+ }
+
+ // Perform login API call
+ final response = await api.login(username, password);
+
+ // Extract and validate token
+ final token = response['token'] ?? response['access_token'];
+ if (token == null || token.toString().trim().isEmpty) {
+ throw Exception('No authentication token received');
+ }
+
+ final tokenStr = token.toString();
+ if (!_isValidTokenFormat(tokenStr)) {
+ throw Exception('Invalid authentication token format');
+ }
+
+ // Save token to storage
+ final storage = _ref.read(optimizedStorageServiceProvider);
+ await storage.saveAuthToken(tokenStr);
+
+ // Save credentials if requested
+ if (rememberCredentials) {
+ final activeServer = await _ref.read(activeServerProvider.future);
+ if (activeServer != null) {
+ await storage.saveCredentials(
+ serverId: activeServer.id,
+ username: username,
+ password: password,
+ );
+ await storage.setRememberCredentials(true);
+ }
+ }
+
+ // Update state and API service
+ state = state.copyWith(
+ status: AuthStatus.authenticated,
+ token: tokenStr,
+ isLoading: false,
+ clearError: true,
+ );
+
+ _updateApiServiceToken(tokenStr);
+
+ // Cache the successful auth state
+ _cacheManager.cacheAuthState(state);
+
+ // Load user data in background
+ _loadUserData();
+
+ debugPrint('DEBUG: Login successful');
+ return true;
+ } catch (e) {
+ debugPrint('ERROR: Login failed: $e');
+ state = state.copyWith(
+ status: AuthStatus.error,
+ error: e.toString(),
+ isLoading: false,
+ clearToken: true,
+ );
+ return false;
+ }
+ }
+
+ /// Wait briefly until the API service becomes available
+ Future _ensureApiServiceAvailable({
+ Duration timeout = const Duration(seconds: 2),
+ }) async {
+ final end = DateTime.now().add(timeout);
+ while (DateTime.now().isBefore(end)) {
+ final api = _ref.read(apiServiceProvider);
+ if (api != null) return;
+ await Future.delayed(const Duration(milliseconds: 50));
+ }
+ }
+
+ /// Perform silent auto-login with saved credentials
+ Future silentLogin() async {
+ state = state.copyWith(
+ status: AuthStatus.loading,
+ isLoading: true,
+ clearError: true,
+ );
+
+ try {
+ final storage = _ref.read(optimizedStorageServiceProvider);
+ final savedCredentials = await storage.getSavedCredentials();
+
+ if (savedCredentials == null) {
+ state = state.copyWith(
+ status: AuthStatus.unauthenticated,
+ isLoading: false,
+ clearError: true,
+ );
+ return false;
+ }
+
+ final serverId = savedCredentials['serverId']!;
+ final username = savedCredentials['username']!;
+ final password = savedCredentials['password']!;
+
+ // Set active server if needed
+ await storage.setActiveServerId(serverId);
+ _ref.invalidate(activeServerProvider);
+
+ // Wait for server connection
+ final activeServer = await _ref.read(activeServerProvider.future);
+ if (activeServer == null) {
+ await storage.setActiveServerId(null);
+ state = state.copyWith(
+ status: AuthStatus.error,
+ error: 'Server configuration not found',
+ isLoading: false,
+ );
+ return false;
+ }
+
+ // Attempt login
+ return await login(username, password, rememberCredentials: false);
+ } catch (e) {
+ debugPrint('ERROR: Silent login failed: $e');
+
+ // Clear invalid credentials on auth errors
+ if (e.toString().contains('401') ||
+ e.toString().contains('403') ||
+ e.toString().contains('authentication') ||
+ e.toString().contains('unauthorized')) {
+ final storage = _ref.read(optimizedStorageServiceProvider);
+ await storage.deleteSavedCredentials();
+ }
+
+ state = state.copyWith(
+ status: AuthStatus.unauthenticated,
+ error: e.toString(),
+ isLoading: false,
+ clearToken: true,
+ );
+ return false;
+ }
+ }
+
+ /// Handle token invalidation (called by API service)
+ Future onTokenInvalidated() async {
+ debugPrint('DEBUG: Auth token invalidated');
+
+ // Clear token from storage
+ final storage = _ref.read(optimizedStorageServiceProvider);
+ await storage.deleteAuthToken();
+
+ // Update state
+ state = state.copyWith(
+ status: AuthStatus.tokenExpired,
+ clearToken: true,
+ clearUser: true,
+ clearError: true,
+ );
+
+ // Attempt silent re-login if credentials are available
+ final hasCredentials = await storage.getSavedCredentials() != null;
+ if (hasCredentials) {
+ debugPrint('DEBUG: Attempting silent re-login after token invalidation');
+ await silentLogin();
+ }
+ }
+
+ /// Logout user
+ Future logout() async {
+ state = state.copyWith(status: AuthStatus.loading, isLoading: true);
+
+ try {
+ // Call server logout if possible
+ final api = _ref.read(apiServiceProvider);
+ if (api != null) {
+ try {
+ await api.logout();
+ } catch (e) {
+ debugPrint('Warning: Server logout failed: $e');
+ }
+ }
+
+ // Clear all local auth data
+ final storage = _ref.read(optimizedStorageServiceProvider);
+ await storage.clearAuthData();
+
+ // Update state
+ state = state.copyWith(
+ status: AuthStatus.unauthenticated,
+ isLoading: false,
+ clearToken: true,
+ clearUser: true,
+ clearError: true,
+ );
+
+ debugPrint('DEBUG: Logout complete');
+ } catch (e) {
+ debugPrint('ERROR: Logout failed: $e');
+ // Even if logout fails, clear local state
+ state = state.copyWith(
+ status: AuthStatus.unauthenticated,
+ isLoading: false,
+ clearToken: true,
+ clearUser: true,
+ error: 'Logout error: $e',
+ );
+ }
+ }
+
+ /// Load user data in background with JWT extraction fallback
+ Future _loadUserData() async {
+ try {
+ // First try to extract user info from JWT token if available
+ if (state.token != null) {
+ final jwtUserInfo = TokenValidator.extractUserInfo(state.token!);
+ if (jwtUserInfo != null) {
+ debugPrint('DEBUG: Extracted user info from JWT token');
+ state = state.copyWith(user: jwtUserInfo);
+
+ // Still try to load from server in background for complete data
+ Future.microtask(() => _loadServerUserData());
+ return;
+ }
+ }
+
+ // Fall back to server data loading
+ await _loadServerUserData();
+ } catch (e) {
+ debugPrint('Warning: Failed to load user data: $e');
+ // Don't update state on user data load failure
+ }
+ }
+
+ /// Load complete user data from server
+ Future _loadServerUserData() async {
+ try {
+ final api = _ref.read(apiServiceProvider);
+ if (api != null && state.isAuthenticated) {
+ // Check if we already have user data from token validation
+ if (state.user != null) {
+ debugPrint(
+ 'DEBUG: User data already available from token validation',
+ );
+ return;
+ }
+
+ final user = await api.getCurrentUser();
+ state = state.copyWith(user: user);
+ debugPrint('DEBUG: Loaded complete user data from server');
+ }
+ } catch (e) {
+ debugPrint('Warning: Failed to load server user data: $e');
+ // Don't update state on server data load failure - keep JWT data if available
+ }
+ }
+
+ /// Update API service with current token
+ void _updateApiServiceToken(String token) {
+ final api = _ref.read(apiServiceProvider);
+ api?.updateAuthToken(token);
+ }
+
+ /// Validate token format using advanced validation
+ bool _isValidTokenFormat(String token) {
+ final result = TokenValidator.validateTokenFormat(token);
+ return result.isValid;
+ }
+
+ /// Validate token with comprehensive validation (format + server)
+ Future _validateToken(String token) async {
+ // Check cache first
+ final cachedResult = TokenValidationCache.getCachedResult(token);
+ if (cachedResult != null) {
+ debugPrint(
+ 'DEBUG: Using cached token validation result: ${cachedResult.isValid}',
+ );
+ return cachedResult.isValid;
+ }
+
+ // Fast format validation first
+ final formatResult = TokenValidator.validateTokenFormat(token);
+ if (!formatResult.isValid) {
+ debugPrint('DEBUG: Token format invalid: ${formatResult.message}');
+ TokenValidationCache.cacheResult(token, formatResult);
+ return false;
+ }
+
+ // If format is valid but token is expiring soon, try server validation
+ if (formatResult.isExpiringSoon) {
+ debugPrint('DEBUG: Token expiring soon, validating with server');
+ }
+
+ // Server validation (async with timeout)
+ try {
+ final api = _ref.read(apiServiceProvider);
+ if (api == null) {
+ debugPrint('DEBUG: No API service available for token validation');
+ return formatResult.isValid; // Fall back to format validation
+ }
+
+ User? validationUser;
+ final serverResult = await TokenValidator.validateTokenWithServer(
+ token,
+ () async {
+ // Update API with token for validation
+ api.updateAuthToken(token);
+ // Try to fetch user data as validation
+ validationUser = await api.getCurrentUser();
+ return validationUser!;
+ },
+ );
+
+ // Store the user data if validation was successful
+ if (serverResult.isValid &&
+ validationUser != null &&
+ state.isAuthenticated) {
+ state = state.copyWith(user: validationUser);
+ debugPrint('DEBUG: Cached user data from token validation');
+ }
+
+ TokenValidationCache.cacheResult(token, serverResult);
+
+ debugPrint(
+ 'DEBUG: Server token validation: ${serverResult.isValid} - ${serverResult.message}',
+ );
+ return serverResult.isValid;
+ } catch (e) {
+ debugPrint('DEBUG: Token server validation failed: $e');
+ // On network error, fall back to format validation if it was valid
+ return formatResult.isValid;
+ }
+ }
+
+ /// Check if user has saved credentials (with caching)
+ Future hasSavedCredentials() async {
+ // Check cache first
+ final cachedResult = _cacheManager.getCachedCredentialsExist();
+ if (cachedResult != null) {
+ return cachedResult;
+ }
+
+ try {
+ final storage = _ref.read(optimizedStorageServiceProvider);
+ final hasCredentials = await storage.hasCredentials();
+
+ // Cache the result
+ _cacheManager.cacheCredentialsExist(hasCredentials);
+
+ return hasCredentials;
+ } catch (e) {
+ return false;
+ }
+ }
+
+ /// Refresh current auth state
+ Future refresh() async {
+ // Clear cache before refresh to ensure fresh data
+ _cacheManager.clearAuthCache();
+ TokenValidationCache.clearCache();
+
+ await _initialize();
+ }
+
+ /// Clean up expired caches (called periodically)
+ void cleanupCaches() {
+ _cacheManager.cleanExpiredCache();
+ _cacheManager.optimizeCache();
+ }
+
+ /// Get performance statistics
+ Map getPerformanceStats() {
+ return {
+ 'authCache': _cacheManager.getCacheStats(),
+ 'tokenValidationCache': 'Managed by TokenValidationCache',
+ 'storageCache': 'Managed by OptimizedStorageService',
+ };
+ }
+}
+
+/// Provider for the unified auth state manager
+final authStateManagerProvider =
+ StateNotifierProvider((ref) {
+ return AuthStateManager(ref);
+ });
+
+/// Computed providers for common auth state queries
+final isAuthenticatedProvider = Provider((ref) {
+ return ref.watch(
+ authStateManagerProvider.select((state) => state.isAuthenticated),
+ );
+});
+
+final authTokenProvider2 = Provider((ref) {
+ return ref.watch(authStateManagerProvider.select((state) => state.token));
+});
+
+final authUserProvider = Provider((ref) {
+ return ref.watch(authStateManagerProvider.select((state) => state.user));
+});
+
+final authErrorProvider2 = Provider((ref) {
+ return ref.watch(authStateManagerProvider.select((state) => state.error));
+});
+
+final isAuthLoadingProvider = Provider((ref) {
+ return ref.watch(authStateManagerProvider.select((state) => state.isLoading));
+});
diff --git a/lib/core/auth/token_validator.dart b/lib/core/auth/token_validator.dart
new file mode 100644
index 0000000..e9ad101
--- /dev/null
+++ b/lib/core/auth/token_validator.dart
@@ -0,0 +1,259 @@
+import 'dart:convert';
+import 'package:flutter/foundation.dart';
+import 'package:crypto/crypto.dart';
+
+/// JWT token validation utilities
+class TokenValidator {
+ static const Duration _validationTimeout = Duration(seconds: 5);
+
+ /// Validate JWT token format and expiry without network call
+ static TokenValidationResult validateTokenFormat(String token) {
+ try {
+ // Basic format check
+ if (token.isEmpty || token.length < 10) {
+ return TokenValidationResult.invalid('Token too short');
+ }
+
+ // Check if it looks like a JWT (has at least 2 dots)
+ final parts = token.split('.');
+ if (parts.length < 3) {
+ return TokenValidationResult.invalid('Invalid JWT format');
+ }
+
+ // Try to decode the payload to check expiry
+ try {
+ final payload = _decodeJWTPayload(parts[1]);
+ final exp = payload['exp'] as int?;
+
+ if (exp != null) {
+ final expiryTime = DateTime.fromMillisecondsSinceEpoch(exp * 1000);
+ final now = DateTime.now();
+
+ if (expiryTime.isBefore(now)) {
+ return TokenValidationResult.expired('Token expired');
+ }
+
+ // Check if token expires soon (within 5 minutes)
+ final fiveMinutesFromNow = now.add(const Duration(minutes: 5));
+ if (expiryTime.isBefore(fiveMinutesFromNow)) {
+ return TokenValidationResult.expiringSoon(
+ 'Token expires soon',
+ expiryTime,
+ );
+ }
+ }
+
+ return TokenValidationResult.valid(
+ 'Token format valid',
+ expiryData: exp != null
+ ? DateTime.fromMillisecondsSinceEpoch(exp * 1000)
+ : null,
+ );
+ } catch (e) {
+ // If we can't decode JWT, treat as opaque token
+ debugPrint(
+ 'DEBUG: Could not decode JWT payload, treating as opaque token: $e',
+ );
+ return TokenValidationResult.valid('Opaque token format valid');
+ }
+ } catch (e) {
+ return TokenValidationResult.invalid('Token validation error: $e');
+ }
+ }
+
+ /// Validate token with server (async with timeout)
+ static Future validateTokenWithServer(
+ String token,
+ Future Function() serverValidationCall,
+ ) async {
+ try {
+ // First check format
+ final formatResult = validateTokenFormat(token);
+ if (!formatResult.isValid) {
+ return formatResult;
+ }
+
+ // If format is good, try server validation with timeout
+ final validationFuture = serverValidationCall();
+
+ final result = await validationFuture.timeout(
+ _validationTimeout,
+ onTimeout: () => throw Exception('Token validation timeout'),
+ );
+
+ return TokenValidationResult.valid(
+ 'Server validation successful',
+ serverData: result,
+ );
+ } catch (e) {
+ if (e.toString().contains('timeout')) {
+ return TokenValidationResult.networkError(
+ 'Validation timeout - using cached result',
+ );
+ } else if (e.toString().contains('401') || e.toString().contains('403')) {
+ return TokenValidationResult.invalid('Server rejected token');
+ } else {
+ return TokenValidationResult.networkError(
+ 'Network error during validation: $e',
+ );
+ }
+ }
+ }
+
+ /// Decode JWT payload (without signature verification)
+ static Map _decodeJWTPayload(String base64Payload) {
+ // Add padding if needed
+ String padded = base64Payload;
+ while (padded.length % 4 != 0) {
+ padded += '=';
+ }
+
+ // Decode base64
+ final decoded = base64Url.decode(padded);
+ final jsonString = utf8.decode(decoded);
+
+ return jsonDecode(jsonString) as Map;
+ }
+
+ /// Extract user information from JWT token (if available)
+ static Map? extractUserInfo(String token) {
+ try {
+ final parts = token.split('.');
+ if (parts.length < 3) return null;
+
+ final payload = _decodeJWTPayload(parts[1]);
+
+ // Extract common user fields
+ return {
+ 'sub': payload['sub'], // Subject (user ID)
+ 'username':
+ payload['username'] ??
+ payload['name'] ??
+ payload['preferred_username'],
+ 'email': payload['email'],
+ 'roles': payload['roles'] ?? payload['groups'],
+ 'exp': payload['exp'],
+ 'iat': payload['iat'], // Issued at
+ };
+ } catch (e) {
+ debugPrint('DEBUG: Could not extract user info from token: $e');
+ return null;
+ }
+ }
+
+ /// Generate a cache key for token validation results
+ static String generateCacheKey(String token) {
+ final bytes = utf8.encode(token);
+ final digest = sha256.convert(bytes);
+ return digest.toString().substring(
+ 0,
+ 16,
+ ); // Use first 16 chars as cache key
+ }
+}
+
+/// Result of token validation
+class TokenValidationResult {
+ const TokenValidationResult._(
+ this.isValid,
+ this.status,
+ this.message, {
+ this.expiryData,
+ this.serverData,
+ });
+
+ const TokenValidationResult.valid(
+ String message, {
+ DateTime? expiryData,
+ dynamic serverData,
+ }) : this._(
+ true,
+ TokenValidationStatus.valid,
+ message,
+ expiryData: expiryData,
+ serverData: serverData,
+ );
+
+ const TokenValidationResult.invalid(String message)
+ : this._(false, TokenValidationStatus.invalid, message);
+
+ const TokenValidationResult.expired(String message)
+ : this._(false, TokenValidationStatus.expired, message);
+
+ const TokenValidationResult.expiringSoon(String message, DateTime expiryTime)
+ : this._(
+ true,
+ TokenValidationStatus.expiringSoon,
+ message,
+ expiryData: expiryTime,
+ );
+
+ const TokenValidationResult.networkError(String message)
+ : this._(false, TokenValidationStatus.networkError, message);
+
+ final bool isValid;
+ final TokenValidationStatus status;
+ final String message;
+ final DateTime? expiryData;
+ final dynamic serverData;
+
+ bool get isExpired => status == TokenValidationStatus.expired;
+ bool get isExpiringSoon => status == TokenValidationStatus.expiringSoon;
+ bool get hasNetworkError => status == TokenValidationStatus.networkError;
+
+ @override
+ String toString() =>
+ 'TokenValidationResult(isValid: $isValid, status: $status, message: $message)';
+}
+
+enum TokenValidationStatus {
+ valid,
+ invalid,
+ expired,
+ expiringSoon,
+ networkError,
+}
+
+/// Cache for token validation results
+class TokenValidationCache {
+ static final Map _cache = {};
+ static const Duration _cacheTimeout = Duration(minutes: 5);
+
+ static void cacheResult(String token, TokenValidationResult result) {
+ final key = TokenValidator.generateCacheKey(token);
+ _cache[key] = _CacheEntry(result, DateTime.now());
+
+ // Clean old entries
+ _cleanCache();
+ }
+
+ static TokenValidationResult? getCachedResult(String token) {
+ final key = TokenValidator.generateCacheKey(token);
+ final entry = _cache[key];
+
+ if (entry != null &&
+ DateTime.now().difference(entry.timestamp) < _cacheTimeout) {
+ return entry.result;
+ }
+
+ return null;
+ }
+
+ static void clearCache() {
+ _cache.clear();
+ }
+
+ static void _cleanCache() {
+ final now = DateTime.now();
+ _cache.removeWhere(
+ (key, entry) => now.difference(entry.timestamp) > _cacheTimeout,
+ );
+ }
+}
+
+class _CacheEntry {
+ const _CacheEntry(this.result, this.timestamp);
+
+ final TokenValidationResult result;
+ final DateTime timestamp;
+}
diff --git a/lib/core/error/api_error.dart b/lib/core/error/api_error.dart
new file mode 100644
index 0000000..4785dd5
--- /dev/null
+++ b/lib/core/error/api_error.dart
@@ -0,0 +1,397 @@
+import 'package:flutter/foundation.dart';
+
+/// Standardized API error representation
+/// Provides consistent error information across all API operations
+@immutable
+class ApiError implements Exception {
+ const ApiError._({
+ required this.type,
+ required this.message,
+ this.endpoint,
+ this.method,
+ this.statusCode,
+ this.details,
+ this.fieldErrors = const {},
+ this.originalError,
+ this.technical,
+ this.retryAfter,
+ this.timeoutDuration,
+ });
+
+ // Factory constructors for different error types
+ const ApiError.network({
+ required String message,
+ String? endpoint,
+ String? method,
+ dynamic originalError,
+ String? technical,
+ }) : this._(
+ type: ApiErrorType.network,
+ message: message,
+ endpoint: endpoint,
+ method: method,
+ originalError: originalError,
+ technical: technical,
+ );
+
+ const ApiError.timeout({
+ required String message,
+ String? endpoint,
+ String? method,
+ Duration? timeoutDuration,
+ }) : this._(
+ type: ApiErrorType.timeout,
+ message: message,
+ endpoint: endpoint,
+ method: method,
+ timeoutDuration: timeoutDuration,
+ );
+
+ const ApiError.authentication({
+ required String message,
+ String? endpoint,
+ String? method,
+ int? statusCode,
+ }) : this._(
+ type: ApiErrorType.authentication,
+ message: message,
+ endpoint: endpoint,
+ method: method,
+ statusCode: statusCode,
+ );
+
+ const ApiError.authorization({
+ required String message,
+ String? endpoint,
+ String? method,
+ int? statusCode,
+ }) : this._(
+ type: ApiErrorType.authorization,
+ message: message,
+ endpoint: endpoint,
+ method: method,
+ statusCode: statusCode,
+ );
+
+ const ApiError.validation({
+ required String message,
+ String? endpoint,
+ String? method,
+ Map> fieldErrors = const {},
+ ParsedErrorResponse? details,
+ }) : this._(
+ type: ApiErrorType.validation,
+ message: message,
+ endpoint: endpoint,
+ method: method,
+ statusCode: 422,
+ fieldErrors: fieldErrors,
+ details: details,
+ );
+
+ const ApiError.badRequest({
+ required String message,
+ String? endpoint,
+ String? method,
+ ParsedErrorResponse? details,
+ }) : this._(
+ type: ApiErrorType.badRequest,
+ message: message,
+ endpoint: endpoint,
+ method: method,
+ statusCode: 400,
+ details: details,
+ );
+
+ const ApiError.notFound({
+ required String message,
+ String? endpoint,
+ String? method,
+ int? statusCode,
+ }) : this._(
+ type: ApiErrorType.notFound,
+ message: message,
+ endpoint: endpoint,
+ method: method,
+ statusCode: statusCode ?? 404,
+ );
+
+ const ApiError.server({
+ required String message,
+ String? endpoint,
+ String? method,
+ int? statusCode,
+ ParsedErrorResponse? details,
+ }) : this._(
+ type: ApiErrorType.server,
+ message: message,
+ endpoint: endpoint,
+ method: method,
+ statusCode: statusCode,
+ details: details,
+ );
+
+ const ApiError.rateLimit({
+ required String message,
+ String? endpoint,
+ String? method,
+ int? statusCode,
+ Duration? retryAfter,
+ }) : this._(
+ type: ApiErrorType.rateLimit,
+ message: message,
+ endpoint: endpoint,
+ method: method,
+ statusCode: statusCode ?? 429,
+ retryAfter: retryAfter,
+ );
+
+ const ApiError.cancelled({
+ required String message,
+ String? endpoint,
+ String? method,
+ }) : this._(
+ type: ApiErrorType.cancelled,
+ message: message,
+ endpoint: endpoint,
+ method: method,
+ );
+
+ const ApiError.security({
+ required String message,
+ String? endpoint,
+ String? method,
+ }) : this._(
+ type: ApiErrorType.security,
+ message: message,
+ endpoint: endpoint,
+ method: method,
+ );
+
+ const ApiError.unknown({
+ required String message,
+ String? endpoint,
+ String? method,
+ dynamic originalError,
+ String? technical,
+ }) : this._(
+ type: ApiErrorType.unknown,
+ message: message,
+ endpoint: endpoint,
+ method: method,
+ originalError: originalError,
+ technical: technical,
+ );
+
+ const ApiError.client({
+ required String message,
+ String? endpoint,
+ String? method,
+ int? statusCode,
+ ParsedErrorResponse? details,
+ }) : this._(
+ type: ApiErrorType.badRequest,
+ message: message,
+ endpoint: endpoint,
+ method: method,
+ statusCode: statusCode,
+ details: details,
+ );
+
+ final ApiErrorType type;
+ final String message;
+ final String? endpoint;
+ final String? method;
+ final int? statusCode;
+ final ParsedErrorResponse? details;
+ final Map> fieldErrors;
+ final dynamic originalError;
+ final String? technical;
+ final Duration? retryAfter;
+ final Duration? timeoutDuration;
+
+ /// Check if this error has field-specific validation errors
+ bool get hasFieldErrors => fieldErrors.isNotEmpty;
+
+ /// Check if this error is retryable
+ bool get isRetryable {
+ switch (type) {
+ case ApiErrorType.network:
+ case ApiErrorType.timeout:
+ case ApiErrorType.server:
+ case ApiErrorType.rateLimit:
+ return true;
+ case ApiErrorType.authentication:
+ case ApiErrorType.authorization:
+ case ApiErrorType.validation:
+ case ApiErrorType.badRequest:
+ case ApiErrorType.notFound:
+ case ApiErrorType.cancelled:
+ case ApiErrorType.security:
+ case ApiErrorType.unknown:
+ return false;
+ }
+ }
+
+ /// Get all field error messages as a flattened list
+ List get allFieldErrorMessages {
+ final messages = [];
+ for (final entry in fieldErrors.entries) {
+ final field = entry.key;
+ final errors = entry.value;
+ for (final error in errors) {
+ messages.add('$field: $error');
+ }
+ }
+ return messages;
+ }
+
+ /// Get first field error message for quick display
+ String? get firstFieldError {
+ if (fieldErrors.isEmpty) return null;
+ final firstEntry = fieldErrors.entries.first;
+ final field = firstEntry.key;
+ final firstError = firstEntry.value.first;
+ return '$field: $firstError';
+ }
+
+ /// Create a copy with updated fields
+ ApiError copyWith({
+ ApiErrorType? type,
+ String? message,
+ String? endpoint,
+ String? method,
+ int? statusCode,
+ ParsedErrorResponse? details,
+ Map>? fieldErrors,
+ dynamic originalError,
+ String? technical,
+ Duration? retryAfter,
+ Duration? timeoutDuration,
+ }) {
+ return ApiError._(
+ type: type ?? this.type,
+ message: message ?? this.message,
+ endpoint: endpoint ?? this.endpoint,
+ method: method ?? this.method,
+ statusCode: statusCode ?? this.statusCode,
+ details: details ?? this.details,
+ fieldErrors: fieldErrors ?? this.fieldErrors,
+ originalError: originalError ?? this.originalError,
+ technical: technical ?? this.technical,
+ retryAfter: retryAfter ?? this.retryAfter,
+ timeoutDuration: timeoutDuration ?? this.timeoutDuration,
+ );
+ }
+
+ /// Convert to map for logging and debugging
+ Map toMap() {
+ return {
+ 'type': type.name,
+ 'message': message,
+ 'endpoint': endpoint,
+ 'method': method,
+ 'statusCode': statusCode,
+ 'fieldErrors': fieldErrors,
+ 'technical': technical,
+ 'retryAfter': retryAfter?.inSeconds,
+ 'timeoutDuration': timeoutDuration?.inSeconds,
+ 'isRetryable': isRetryable,
+ 'hasFieldErrors': hasFieldErrors,
+ };
+ }
+
+ @override
+ String toString() {
+ final buffer = StringBuffer();
+ buffer.write('ApiError(');
+ buffer.write('type: ${type.name}, ');
+ buffer.write('message: $message');
+
+ if (endpoint != null) {
+ buffer.write(', endpoint: $endpoint');
+ }
+
+ if (method != null) {
+ buffer.write(', method: $method');
+ }
+
+ if (statusCode != null) {
+ buffer.write(', statusCode: $statusCode');
+ }
+
+ if (hasFieldErrors) {
+ buffer.write(', fieldErrors: ${fieldErrors.length}');
+ }
+
+ buffer.write(')');
+ return buffer.toString();
+ }
+
+ @override
+ bool operator ==(Object other) {
+ if (identical(this, other)) return true;
+
+ return other is ApiError &&
+ other.type == type &&
+ other.message == message &&
+ other.endpoint == endpoint &&
+ other.method == method &&
+ other.statusCode == statusCode &&
+ mapEquals(other.fieldErrors, fieldErrors);
+ }
+
+ @override
+ int get hashCode {
+ return Object.hash(
+ type,
+ message,
+ endpoint,
+ method,
+ statusCode,
+ fieldErrors,
+ );
+ }
+}
+
+/// Types of API errors for categorization and handling
+enum ApiErrorType {
+ network, // Connection issues, DNS resolution, etc.
+ timeout, // Request timeout (send, receive, connection)
+ authentication, // 401, invalid credentials, expired tokens
+ authorization, // 403, insufficient permissions
+ validation, // 422, field validation errors
+ badRequest, // 400, malformed request
+ notFound, // 404, resource not found
+ server, // 5xx server errors
+ rateLimit, // 429, too many requests
+ cancelled, // Request was cancelled
+ security, // Certificate, SSL/TLS issues
+ unknown, // Unexpected or unhandled errors
+}
+
+/// Parsed error response from API
+/// Contains structured error information from server responses
+class ParsedErrorResponse {
+ const ParsedErrorResponse({
+ this.message,
+ this.code,
+ this.errors = const [],
+ this.fieldErrors = const {},
+ this.metadata = const {},
+ });
+
+ final String? message;
+ final String? code;
+ final List errors;
+ final Map> fieldErrors;
+ final Map metadata;
+
+ bool get hasFieldErrors => fieldErrors.isNotEmpty;
+ bool get hasGeneralErrors => errors.isNotEmpty;
+
+ @override
+ String toString() {
+ return 'ParsedErrorResponse(message: $message, errors: ${errors.length}, fieldErrors: ${fieldErrors.length})';
+ }
+}
diff --git a/lib/core/error/api_error_handler.dart b/lib/core/error/api_error_handler.dart
new file mode 100644
index 0000000..223f0f3
--- /dev/null
+++ b/lib/core/error/api_error_handler.dart
@@ -0,0 +1,408 @@
+import 'package:dio/dio.dart';
+import 'package:flutter/foundation.dart';
+import 'api_error.dart';
+import 'error_parser.dart';
+
+/// Comprehensive API error handler with structured error parsing
+/// Handles all types of API errors and converts them to standardized format
+class ApiErrorHandler {
+ static final ApiErrorHandler _instance = ApiErrorHandler._internal();
+ factory ApiErrorHandler() => _instance;
+ ApiErrorHandler._internal();
+
+ final ErrorParser _errorParser = ErrorParser();
+
+ /// Transform any exception into standardized ApiError
+ ApiError transformError(
+ dynamic error, {
+ String? endpoint,
+ String? method,
+ Map? requestData,
+ }) {
+ try {
+ if (error is DioException) {
+ return _handleDioException(error, endpoint: endpoint, method: method);
+ } else if (error is ApiError) {
+ return error;
+ } else {
+ return ApiError.unknown(
+ message: 'An unexpected error occurred',
+ originalError: error,
+ technical: error.toString(),
+ );
+ }
+ } catch (e) {
+ // Fallback error if transformation itself fails
+ debugPrint('ApiErrorHandler: Error transforming exception: $e');
+ return ApiError.unknown(
+ message: 'A system error occurred',
+ originalError: error,
+ technical: 'Error transformation failed: $e',
+ );
+ }
+ }
+
+ /// Handle DioException with detailed error parsing
+ ApiError _handleDioException(
+ DioException dioError, {
+ String? endpoint,
+ String? method,
+ }) {
+ final statusCode = dioError.response?.statusCode;
+ final responseData = dioError.response?.data;
+ final requestPath = endpoint ?? dioError.requestOptions.path;
+ final httpMethod = method ?? dioError.requestOptions.method;
+
+ // Log error details for debugging
+ _logErrorDetails(dioError, requestPath, httpMethod);
+
+ switch (dioError.type) {
+ case DioExceptionType.connectionTimeout:
+ return ApiError.timeout(
+ message: 'Connection timeout - please check your internet connection',
+ endpoint: requestPath,
+ method: httpMethod,
+ timeoutDuration: dioError.requestOptions.connectTimeout,
+ );
+
+ case DioExceptionType.sendTimeout:
+ return ApiError.timeout(
+ message: 'Request send timeout - the upload took too long',
+ endpoint: requestPath,
+ method: httpMethod,
+ timeoutDuration: dioError.requestOptions.sendTimeout,
+ );
+
+ case DioExceptionType.receiveTimeout:
+ return ApiError.timeout(
+ message: 'Response timeout - the server took too long to respond',
+ endpoint: requestPath,
+ method: httpMethod,
+ timeoutDuration: dioError.requestOptions.receiveTimeout,
+ );
+
+ case DioExceptionType.badCertificate:
+ return ApiError.security(
+ message:
+ 'Security certificate error - unable to verify server identity',
+ endpoint: requestPath,
+ method: httpMethod,
+ );
+
+ case DioExceptionType.connectionError:
+ return ApiError.network(
+ message:
+ 'Network connection error - please check your internet connection',
+ endpoint: requestPath,
+ method: httpMethod,
+ originalError: dioError,
+ );
+
+ case DioExceptionType.cancel:
+ return ApiError.cancelled(
+ message: 'Request was cancelled',
+ endpoint: requestPath,
+ method: httpMethod,
+ );
+
+ case DioExceptionType.badResponse:
+ return _handleBadResponse(
+ dioError,
+ requestPath,
+ httpMethod,
+ statusCode,
+ responseData,
+ );
+
+ case DioExceptionType.unknown:
+ return ApiError.unknown(
+ message: 'An unexpected network error occurred',
+ endpoint: requestPath,
+ method: httpMethod,
+ originalError: dioError,
+ technical: dioError.message,
+ );
+ }
+ }
+
+ /// Handle bad response errors with detailed status code analysis
+ ApiError _handleBadResponse(
+ DioException dioError,
+ String requestPath,
+ String httpMethod,
+ int? statusCode,
+ dynamic responseData,
+ ) {
+ if (statusCode == null) {
+ return ApiError.server(
+ message: 'Invalid server response',
+ endpoint: requestPath,
+ method: httpMethod,
+ statusCode: null,
+ );
+ }
+
+ switch (statusCode) {
+ case 400:
+ return _handleBadRequest(
+ dioError,
+ requestPath,
+ httpMethod,
+ responseData,
+ );
+
+ case 401:
+ return ApiError.authentication(
+ message: 'Authentication failed - please sign in again',
+ endpoint: requestPath,
+ method: httpMethod,
+ statusCode: statusCode,
+ );
+
+ case 403:
+ return ApiError.authorization(
+ message: 'Access denied - you don\'t have permission for this action',
+ endpoint: requestPath,
+ method: httpMethod,
+ statusCode: statusCode,
+ );
+
+ case 404:
+ return ApiError.notFound(
+ message: 'The requested resource was not found',
+ endpoint: requestPath,
+ method: httpMethod,
+ statusCode: statusCode,
+ );
+
+ case 422:
+ return _handleValidationError(
+ dioError,
+ requestPath,
+ httpMethod,
+ responseData,
+ );
+
+ case 429:
+ return ApiError.rateLimit(
+ message: 'Too many requests - please wait before trying again',
+ endpoint: requestPath,
+ method: httpMethod,
+ statusCode: statusCode,
+ retryAfter: _extractRetryAfter(dioError.response?.headers),
+ );
+
+ default:
+ if (statusCode >= 500) {
+ return _handleServerError(
+ dioError,
+ requestPath,
+ httpMethod,
+ statusCode,
+ responseData,
+ );
+ } else {
+ return ApiError.client(
+ message: 'Client error occurred',
+ endpoint: requestPath,
+ method: httpMethod,
+ statusCode: statusCode,
+ details: _errorParser.parseErrorResponse(responseData),
+ );
+ }
+ }
+ }
+
+ /// Handle 400 Bad Request with detailed parsing
+ ApiError _handleBadRequest(
+ DioException dioError,
+ String requestPath,
+ String httpMethod,
+ dynamic responseData,
+ ) {
+ final parsedError = _errorParser.parseErrorResponse(responseData);
+
+ return ApiError.badRequest(
+ message:
+ parsedError.message ?? 'Invalid request - please check your input',
+ endpoint: requestPath,
+ method: httpMethod,
+ details: parsedError,
+ );
+ }
+
+ /// Handle 422 Validation Error with field-specific parsing
+ ApiError _handleValidationError(
+ DioException dioError,
+ String requestPath,
+ String httpMethod,
+ dynamic responseData,
+ ) {
+ final parsedError = _errorParser.parseValidationError(responseData);
+
+ return ApiError.validation(
+ message: 'Validation failed - please check your input',
+ endpoint: requestPath,
+ method: httpMethod,
+ fieldErrors: parsedError.fieldErrors,
+ details: parsedError,
+ );
+ }
+
+ /// Handle server errors (5xx)
+ ApiError _handleServerError(
+ DioException dioError,
+ String requestPath,
+ String httpMethod,
+ int statusCode,
+ dynamic responseData,
+ ) {
+ final parsedError = _errorParser.parseErrorResponse(responseData);
+
+ String message;
+ switch (statusCode) {
+ case 500:
+ message = 'Internal server error - please try again later';
+ break;
+ case 502:
+ message = 'Bad gateway - the server is temporarily unavailable';
+ break;
+ case 503:
+ message = 'Service unavailable - the server is temporarily down';
+ break;
+ case 504:
+ message = 'Gateway timeout - the server took too long to respond';
+ break;
+ default:
+ message = 'Server error occurred - please try again later';
+ }
+
+ return ApiError.server(
+ message: message,
+ endpoint: requestPath,
+ method: httpMethod,
+ statusCode: statusCode,
+ details: parsedError,
+ );
+ }
+
+ /// Extract retry-after header for rate limiting
+ Duration? _extractRetryAfter(Headers? headers) {
+ if (headers == null) return null;
+
+ final retryAfterHeader =
+ headers.value('retry-after') ??
+ headers.value('Retry-After') ??
+ headers.value('X-RateLimit-Reset-After');
+
+ if (retryAfterHeader != null) {
+ final seconds = int.tryParse(retryAfterHeader);
+ if (seconds != null) {
+ return Duration(seconds: seconds);
+ }
+ }
+
+ return null;
+ }
+
+ /// Log error details for debugging and monitoring
+ void _logErrorDetails(
+ DioException dioError,
+ String requestPath,
+ String httpMethod,
+ ) {
+ if (kDebugMode) {
+ debugPrint('🔴 API Error Details:');
+ debugPrint(' Method: ${httpMethod.toUpperCase()}');
+ debugPrint(' Endpoint: $requestPath');
+ debugPrint(' Type: ${dioError.type}');
+ debugPrint(' Status: ${dioError.response?.statusCode}');
+
+ if (dioError.response?.data != null) {
+ debugPrint(' Response: ${dioError.response?.data}');
+ }
+
+ if (dioError.requestOptions.data != null) {
+ debugPrint(' Request Data: ${dioError.requestOptions.data}');
+ }
+
+ debugPrint(' Error: ${dioError.message}');
+ }
+
+ // In production, you would send this to your error tracking service
+ // FirebaseCrashlytics.instance.recordError(dioError, stackTrace);
+ // Sentry.captureException(dioError);
+ }
+
+ /// Check if error is retryable
+ bool isRetryable(ApiError error) {
+ switch (error.type) {
+ case ApiErrorType.timeout:
+ case ApiErrorType.network:
+ case ApiErrorType.server:
+ return true;
+ case ApiErrorType.rateLimit:
+ return true; // Can retry after waiting
+ case ApiErrorType.authentication:
+ return false; // Need new token
+ case ApiErrorType.authorization:
+ case ApiErrorType.notFound:
+ case ApiErrorType.validation:
+ case ApiErrorType.badRequest:
+ return false; // Client errors aren't retryable
+ case ApiErrorType.cancelled:
+ case ApiErrorType.security:
+ case ApiErrorType.unknown:
+ return false;
+ }
+ }
+
+ /// Get suggested retry delay for retryable errors
+ Duration? getRetryDelay(ApiError error) {
+ if (!isRetryable(error)) return null;
+
+ switch (error.type) {
+ case ApiErrorType.rateLimit:
+ return error.retryAfter ?? const Duration(minutes: 1);
+ case ApiErrorType.timeout:
+ return const Duration(seconds: 5);
+ case ApiErrorType.network:
+ return const Duration(seconds: 3);
+ case ApiErrorType.server:
+ return const Duration(seconds: 10);
+ default:
+ return const Duration(seconds: 5);
+ }
+ }
+
+ /// Get user-friendly error message with actionable advice
+ String getUserMessage(ApiError error) {
+ final baseMessage = error.message;
+
+ // Add actionable advice based on error type
+ switch (error.type) {
+ case ApiErrorType.network:
+ return '$baseMessage\n\nPlease check your internet connection and try again.';
+ case ApiErrorType.timeout:
+ return '$baseMessage\n\nThis might be due to a slow connection. Try again in a moment.';
+ case ApiErrorType.authentication:
+ return '$baseMessage\n\nPlease sign in again to continue.';
+ case ApiErrorType.authorization:
+ return '$baseMessage\n\nContact support if you believe this is an error.';
+ case ApiErrorType.validation:
+ return '$baseMessage\n\nPlease correct the highlighted fields and try again.';
+ case ApiErrorType.rateLimit:
+ final delay = error.retryAfter;
+ if (delay != null) {
+ final minutes = delay.inMinutes;
+ final seconds = delay.inSeconds % 60;
+ return '$baseMessage\n\nPlease wait ${minutes > 0 ? '${minutes}m ' : ''}${seconds}s before trying again.';
+ }
+ return '$baseMessage\n\nPlease wait a moment before trying again.';
+ case ApiErrorType.server:
+ return '$baseMessage\n\nOur servers are experiencing issues. Please try again in a few minutes.';
+ default:
+ return baseMessage;
+ }
+ }
+}
diff --git a/lib/core/error/api_error_interceptor.dart b/lib/core/error/api_error_interceptor.dart
new file mode 100644
index 0000000..c147b51
--- /dev/null
+++ b/lib/core/error/api_error_interceptor.dart
@@ -0,0 +1,239 @@
+import 'package:dio/dio.dart';
+import 'package:flutter/foundation.dart';
+import 'api_error_handler.dart';
+import 'api_error.dart';
+
+/// Dio interceptor for automatic error handling and transformation
+/// Converts all HTTP errors into standardized ApiError format
+class ApiErrorInterceptor extends Interceptor {
+ final ApiErrorHandler _errorHandler = ApiErrorHandler();
+ final bool logErrors;
+ final bool throwApiErrors;
+
+ ApiErrorInterceptor({this.logErrors = true, this.throwApiErrors = true});
+
+ @override
+ void onError(DioException err, ErrorInterceptorHandler handler) {
+ try {
+ // Transform the error into our standardized format
+ final apiError = _errorHandler.transformError(
+ err,
+ endpoint: err.requestOptions.path,
+ method: err.requestOptions.method,
+ );
+
+ if (logErrors) {
+ _logApiError(apiError, err);
+ }
+
+ if (throwApiErrors) {
+ // Replace the DioException with our ApiError
+ final enhancedError = DioException(
+ requestOptions: err.requestOptions,
+ response: err.response,
+ type: err.type,
+ error: apiError,
+ message: apiError.message,
+ );
+ handler.reject(enhancedError);
+ } else {
+ // Store the ApiError in the response extra data
+ if (err.response != null) {
+ err.response!.extra['apiError'] = apiError;
+ }
+ handler.next(err);
+ }
+ } catch (e) {
+ // Fallback if error transformation fails
+ debugPrint('ApiErrorInterceptor: Failed to transform error: $e');
+ handler.next(err);
+ }
+ }
+
+ @override
+ void onResponse(Response response, ResponseInterceptorHandler handler) {
+ // Check for errors in successful responses (some APIs return errors with 200 status)
+ if (response.statusCode == 200 && response.data is Map) {
+ final data = response.data as Map;
+
+ // Check for error indicators in successful responses
+ if (_isErrorResponse(data)) {
+ final apiError = _errorHandler.transformError(
+ data,
+ endpoint: response.requestOptions.path,
+ method: response.requestOptions.method,
+ );
+
+ if (logErrors) {
+ debugPrint('🟡 API Error in successful response: $apiError');
+ }
+
+ // Store the error for later handling
+ response.extra['apiError'] = apiError;
+ }
+ }
+
+ handler.next(response);
+ }
+
+ /// Check if a successful response actually contains an error
+ bool _isErrorResponse(Map data) {
+ // Common error indicators in successful responses
+ const errorIndicators = [
+ 'error',
+ 'errors',
+ 'error_message',
+ 'errorMessage',
+ 'success',
+ ];
+
+ for (final indicator in errorIndicators) {
+ if (data.containsKey(indicator)) {
+ final value = data[indicator];
+
+ // Check for explicit error indicators
+ if (indicator == 'success' && value == false) {
+ return true;
+ }
+
+ // Check for error messages or arrays
+ if (indicator != 'success' && value != null) {
+ if (value is String && value.isNotEmpty) {
+ return true;
+ } else if (value is List && value.isNotEmpty) {
+ return true;
+ } else if (value is Map && value.isNotEmpty) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /// Log API error with structured information
+ void _logApiError(ApiError apiError, DioException originalError) {
+ if (!kDebugMode) return;
+
+ final typeIcon = _getErrorTypeIcon(apiError.type);
+ debugPrint('$typeIcon API Error [${apiError.type.name.toUpperCase()}]');
+ debugPrint(' Method: ${apiError.method?.toUpperCase() ?? 'UNKNOWN'}');
+ debugPrint(' Endpoint: ${apiError.endpoint ?? 'unknown'}');
+ debugPrint(' Status: ${apiError.statusCode ?? 'N/A'}');
+ debugPrint(' Message: ${apiError.message}');
+
+ if (apiError.hasFieldErrors) {
+ debugPrint(' Field Errors:');
+ for (final entry in apiError.fieldErrors.entries) {
+ final field = entry.key;
+ final errors = entry.value;
+ debugPrint(' $field: ${errors.join(', ')}');
+ }
+ }
+
+ if (apiError.technical != null) {
+ debugPrint(' Technical: ${apiError.technical}');
+ }
+
+ if (apiError.retryAfter != null) {
+ debugPrint(' Retry After: ${apiError.retryAfter!.inSeconds}s');
+ }
+
+ // Log original error type for debugging
+ debugPrint(' Original Type: ${originalError.type}');
+
+ // Log request details if available
+ final requestData = originalError.requestOptions.data;
+ if (requestData != null && requestData.toString().length < 500) {
+ debugPrint(' Request: $requestData');
+ }
+
+ // Log response data if available and not too large
+ final responseData = originalError.response?.data;
+ if (responseData != null && responseData.toString().length < 1000) {
+ debugPrint(' Response: $responseData');
+ }
+ }
+
+ /// Get emoji icon for error type
+ String _getErrorTypeIcon(ApiErrorType type) {
+ switch (type) {
+ case ApiErrorType.network:
+ return '🌐';
+ case ApiErrorType.timeout:
+ return '⏱️';
+ case ApiErrorType.authentication:
+ return '🔐';
+ case ApiErrorType.authorization:
+ return '🚫';
+ case ApiErrorType.validation:
+ return '✏️';
+ case ApiErrorType.badRequest:
+ return '❌';
+ case ApiErrorType.notFound:
+ return '🔍';
+ case ApiErrorType.server:
+ return '🔥';
+ case ApiErrorType.rateLimit:
+ return '🐌';
+ case ApiErrorType.cancelled:
+ return '🛑';
+ case ApiErrorType.security:
+ return '🔒';
+ case ApiErrorType.unknown:
+ return '❓';
+ }
+ }
+
+ /// Extract ApiError from DioException if available
+ static ApiError? extractApiError(DioException error) {
+ return error.error is ApiError ? error.error as ApiError : null;
+ }
+
+ /// Extract ApiError from Response if available
+ static ApiError? extractApiErrorFromResponse(Response response) {
+ return response.extra['apiError'] as ApiError?;
+ }
+
+ /// Check if DioException contains an ApiError
+ static bool hasApiError(DioException error) {
+ return extractApiError(error) != null;
+ }
+
+ /// Get user-friendly message from DioException
+ static String getUserMessage(DioException error) {
+ final apiError = extractApiError(error);
+ if (apiError != null) {
+ return ApiErrorHandler().getUserMessage(apiError);
+ }
+
+ // Fallback to basic DioException handling
+ switch (error.type) {
+ case DioExceptionType.connectionTimeout:
+ case DioExceptionType.sendTimeout:
+ case DioExceptionType.receiveTimeout:
+ return 'Connection timeout - please check your internet connection';
+ case DioExceptionType.connectionError:
+ return 'Network connection error - please check your internet connection';
+ case DioExceptionType.badResponse:
+ final statusCode = error.response?.statusCode;
+ if (statusCode == 401) {
+ return 'Authentication failed - please sign in again';
+ } else if (statusCode == 403) {
+ return 'Access denied - you don\'t have permission for this action';
+ } else if (statusCode == 404) {
+ return 'The requested resource was not found';
+ } else if (statusCode != null && statusCode >= 500) {
+ return 'Server error occurred - please try again later';
+ }
+ return 'An error occurred with your request';
+ case DioExceptionType.cancel:
+ return 'Request was cancelled';
+ case DioExceptionType.badCertificate:
+ return 'Security certificate error - unable to verify server identity';
+ case DioExceptionType.unknown:
+ return 'An unexpected error occurred - please try again';
+ }
+ }
+}
diff --git a/lib/core/error/enhanced_error_service.dart b/lib/core/error/enhanced_error_service.dart
new file mode 100644
index 0000000..bdbe646
--- /dev/null
+++ b/lib/core/error/enhanced_error_service.dart
@@ -0,0 +1,467 @@
+import 'package:dio/dio.dart';
+import 'package:flutter/foundation.dart';
+import 'package:flutter/material.dart';
+import 'api_error.dart';
+import 'api_error_handler.dart';
+import 'api_error_interceptor.dart';
+import '../../shared/theme/app_theme.dart';
+import '../../shared/theme/theme_extensions.dart';
+
+/// Enhanced error service with comprehensive error handling capabilities
+/// Provides unified error management across the application
+class EnhancedErrorService {
+ static final EnhancedErrorService _instance =
+ EnhancedErrorService._internal();
+ factory EnhancedErrorService() => _instance;
+ EnhancedErrorService._internal();
+
+ final ApiErrorHandler _errorHandler = ApiErrorHandler();
+
+ /// Transform any error into ApiError format
+ ApiError transformError(
+ dynamic error, {
+ String? endpoint,
+ String? method,
+ Map? requestData,
+ }) {
+ return _errorHandler.transformError(
+ error,
+ endpoint: endpoint,
+ method: method,
+ requestData: requestData,
+ );
+ }
+
+ /// Get user-friendly error message
+ String getUserMessage(dynamic error) {
+ if (error is ApiError) {
+ return _errorHandler.getUserMessage(error);
+ } else if (error is DioException) {
+ return ApiErrorInterceptor.getUserMessage(error);
+ } else {
+ return _getGenericErrorMessage(error);
+ }
+ }
+
+ /// Get technical error details for debugging
+ String getTechnicalDetails(dynamic error) {
+ if (error is ApiError) {
+ return error.technical ?? error.toString();
+ } else if (error is DioException) {
+ final apiError = ApiErrorInterceptor.extractApiError(error);
+ if (apiError != null) {
+ return apiError.technical ?? apiError.toString();
+ }
+ return '${error.type}: ${error.message}';
+ } else {
+ return error.toString();
+ }
+ }
+
+ /// Check if error is retryable
+ bool isRetryable(dynamic error) {
+ if (error is ApiError) {
+ return _errorHandler.isRetryable(error);
+ } else if (error is DioException) {
+ final apiError = ApiErrorInterceptor.extractApiError(error);
+ if (apiError != null) {
+ return _errorHandler.isRetryable(apiError);
+ }
+ return _isDioErrorRetryable(error);
+ }
+ return false;
+ }
+
+ /// Get suggested retry delay
+ Duration? getRetryDelay(dynamic error) {
+ if (error is ApiError) {
+ return _errorHandler.getRetryDelay(error);
+ } else if (error is DioException) {
+ final apiError = ApiErrorInterceptor.extractApiError(error);
+ if (apiError != null) {
+ return _errorHandler.getRetryDelay(apiError);
+ }
+ return _getDioRetryDelay(error);
+ }
+ return null;
+ }
+
+ /// Show error snackbar with appropriate styling and actions
+ void showErrorSnackbar(
+ BuildContext context,
+ dynamic error, {
+ VoidCallback? onRetry,
+ Duration? duration,
+ bool showTechnicalDetails = false,
+ }) {
+ final message = getUserMessage(error);
+ final isRetryableError = isRetryable(error);
+ final retryDelay = getRetryDelay(error);
+
+ final snackBar = SnackBar(
+ content: Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ children: [
+ Icon(
+ _getErrorIcon(error),
+ color: AppTheme.neutral50,
+ size: IconSize.md,
+ ),
+ const SizedBox(width: Spacing.sm),
+ Expanded(
+ child: Text(
+ message,
+ style: const TextStyle(color: AppTheme.neutral50),
+ ),
+ ),
+ ],
+ ),
+ if (showTechnicalDetails) ...[
+ const SizedBox(height: Spacing.sm),
+ Text(
+ getTechnicalDetails(error),
+ style: TextStyle(
+ color: AppTheme.neutral50.withValues(alpha: Alpha.strong),
+ fontSize: AppTypography.labelMedium,
+ ),
+ ),
+ ],
+ ],
+ ),
+ backgroundColor: _getErrorColor(error),
+ duration: duration ?? _getSnackbarDuration(error),
+ action: isRetryableError && onRetry != null
+ ? SnackBarAction(
+ label: retryDelay != null && retryDelay.inSeconds > 5
+ ? 'Retry (${retryDelay.inSeconds}s)'
+ : 'Retry',
+ textColor: AppTheme.neutral50,
+ onPressed: onRetry,
+ )
+ : null,
+ );
+
+ ScaffoldMessenger.of(context).showSnackBar(snackBar);
+ }
+
+ /// Show error dialog with detailed information and recovery options
+ Future showErrorDialog(
+ BuildContext context,
+ dynamic error, {
+ String? title,
+ VoidCallback? onRetry,
+ VoidCallback? onDismiss,
+ bool showTechnicalDetails = false,
+ }) async {
+ final message = getUserMessage(error);
+ final technicalDetails = getTechnicalDetails(error);
+ final isRetryableError = isRetryable(error);
+
+ return showDialog(
+ context: context,
+ barrierDismissible: true,
+ builder: (BuildContext context) {
+ return AlertDialog(
+ title: Row(
+ children: [
+ Icon(_getErrorIcon(error), color: _getErrorColor(error)),
+ const SizedBox(width: Spacing.sm),
+ Expanded(child: Text(title ?? _getErrorTitle(error))),
+ ],
+ ),
+ content: Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(message),
+ if (showTechnicalDetails) ...[
+ const SizedBox(height: Spacing.md),
+ const Text(
+ 'Technical Details:',
+ style: TextStyle(fontWeight: FontWeight.bold),
+ ),
+ const SizedBox(height: Spacing.xs),
+ Container(
+ padding: const EdgeInsets.all(Spacing.sm),
+ decoration: BoxDecoration(
+ color: AppTheme.neutral100,
+ borderRadius: BorderRadius.circular(AppBorderRadius.xs),
+ ),
+ child: Text(
+ technicalDetails,
+ style: const TextStyle(
+ fontFamily: AppTypography.monospaceFontFamily,
+ fontSize: AppTypography.labelMedium,
+ ),
+ ),
+ ),
+ ],
+ ],
+ ),
+ actions: [
+ if (isRetryableError && onRetry != null)
+ TextButton(
+ onPressed: () {
+ Navigator.of(context).pop();
+ onRetry();
+ },
+ child: const Text('Retry'),
+ ),
+ TextButton(
+ onPressed: () {
+ Navigator.of(context).pop();
+ onDismiss?.call();
+ },
+ child: const Text('OK'),
+ ),
+ ],
+ );
+ },
+ );
+ }
+
+ /// Build error widget for displaying in UI
+ Widget buildErrorWidget(
+ dynamic error, {
+ VoidCallback? onRetry,
+ bool showTechnicalDetails = false,
+ EdgeInsets? padding,
+ }) {
+ final message = getUserMessage(error);
+ final technicalDetails = getTechnicalDetails(error);
+ final isRetryableError = isRetryable(error);
+
+ return Container(
+ padding: padding ?? const EdgeInsets.all(Spacing.md),
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Icon(
+ _getErrorIcon(error),
+ size: IconSize.xxl,
+ color: _getErrorColor(error),
+ ),
+ const SizedBox(height: Spacing.md),
+ Text(
+ _getErrorTitle(error),
+ style: const TextStyle(
+ fontSize: AppTypography.headlineSmall,
+ fontWeight: FontWeight.bold,
+ ),
+ textAlign: TextAlign.center,
+ ),
+ const SizedBox(height: Spacing.sm),
+ Text(
+ message,
+ textAlign: TextAlign.center,
+ style: TextStyle(color: AppTheme.neutral600),
+ ),
+ if (showTechnicalDetails) ...[
+ const SizedBox(height: Spacing.md),
+ Container(
+ padding: const EdgeInsets.all(Spacing.xs),
+ decoration: BoxDecoration(
+ color: AppTheme.neutral100,
+ borderRadius: BorderRadius.circular(AppBorderRadius.sm),
+ ),
+ child: Text(
+ technicalDetails,
+ style: const TextStyle(
+ fontFamily: AppTypography.monospaceFontFamily,
+ fontSize: AppTypography.labelMedium,
+ ),
+ ),
+ ),
+ ],
+ if (isRetryableError && onRetry != null) ...[
+ const SizedBox(height: Spacing.md),
+ ElevatedButton.icon(
+ onPressed: onRetry,
+ icon: const Icon(Icons.refresh),
+ label: const Text('Try Again'),
+ ),
+ ],
+ ],
+ ),
+ );
+ }
+
+ /// Log error with structured information
+ void logError(
+ dynamic error, {
+ String? context,
+ Map? additionalData,
+ StackTrace? stackTrace,
+ }) {
+ if (kDebugMode) {
+ final timestamp = DateTime.now().toIso8601String();
+ debugPrint('🔴 ERROR [$timestamp] ${context ?? 'Unknown Context'}');
+ debugPrint(' Message: ${getUserMessage(error)}');
+ debugPrint(' Technical: ${getTechnicalDetails(error)}');
+
+ if (additionalData != null && additionalData.isNotEmpty) {
+ debugPrint(' Additional Data: $additionalData');
+ }
+
+ if (stackTrace != null) {
+ debugPrint(' Stack Trace: $stackTrace');
+ }
+ }
+
+ // In production, send to error tracking service
+ // FirebaseCrashlytics.instance.recordError(error, stackTrace, context: context);
+ // Sentry.captureException(error, stackTrace: stackTrace);
+ }
+
+ // Private helper methods
+
+ String _getGenericErrorMessage(dynamic error) {
+ if (error is Exception) {
+ return 'An error occurred: ${error.toString()}';
+ }
+ return 'An unexpected error occurred';
+ }
+
+ bool _isDioErrorRetryable(DioException error) {
+ switch (error.type) {
+ case DioExceptionType.connectionTimeout:
+ case DioExceptionType.sendTimeout:
+ case DioExceptionType.receiveTimeout:
+ case DioExceptionType.connectionError:
+ return true;
+ case DioExceptionType.badResponse:
+ final statusCode = error.response?.statusCode;
+ return statusCode != null && statusCode >= 500;
+ default:
+ return false;
+ }
+ }
+
+ Duration? _getDioRetryDelay(DioException error) {
+ switch (error.type) {
+ case DioExceptionType.connectionTimeout:
+ case DioExceptionType.sendTimeout:
+ case DioExceptionType.receiveTimeout:
+ return const Duration(seconds: 5);
+ case DioExceptionType.connectionError:
+ return const Duration(seconds: 3);
+ case DioExceptionType.badResponse:
+ final statusCode = error.response?.statusCode;
+ if (statusCode != null && statusCode >= 500) {
+ return const Duration(seconds: 10);
+ }
+ break;
+ default:
+ break;
+ }
+ return null;
+ }
+
+ IconData _getErrorIcon(dynamic error) {
+ if (error is ApiError) {
+ switch (error.type) {
+ case ApiErrorType.network:
+ return Icons.wifi_off;
+ case ApiErrorType.timeout:
+ return Icons.timer_off;
+ case ApiErrorType.authentication:
+ return Icons.lock;
+ case ApiErrorType.authorization:
+ return Icons.block;
+ case ApiErrorType.validation:
+ return Icons.edit_off;
+ case ApiErrorType.badRequest:
+ return Icons.error_outline;
+ case ApiErrorType.notFound:
+ return Icons.search_off;
+ case ApiErrorType.server:
+ return Icons.dns;
+ case ApiErrorType.rateLimit:
+ return Icons.speed;
+ case ApiErrorType.cancelled:
+ return Icons.cancel;
+ case ApiErrorType.security:
+ return Icons.security;
+ case ApiErrorType.unknown:
+ return Icons.help_outline;
+ }
+ }
+ return Icons.error_outline;
+ }
+
+ Color _getErrorColor(dynamic error) {
+ if (error is ApiError) {
+ switch (error.type) {
+ case ApiErrorType.network:
+ case ApiErrorType.timeout:
+ return AppTheme.warning;
+ case ApiErrorType.authentication:
+ case ApiErrorType.authorization:
+ return AppTheme.error;
+ case ApiErrorType.validation:
+ case ApiErrorType.badRequest:
+ return AppTheme.warning;
+ case ApiErrorType.server:
+ return AppTheme.error;
+ case ApiErrorType.rateLimit:
+ return AppTheme.info;
+ default:
+ return AppTheme.error;
+ }
+ }
+ return AppTheme.error;
+ }
+
+ String _getErrorTitle(dynamic error) {
+ if (error is ApiError) {
+ switch (error.type) {
+ case ApiErrorType.network:
+ return 'Connection Problem';
+ case ApiErrorType.timeout:
+ return 'Request Timeout';
+ case ApiErrorType.authentication:
+ return 'Authentication Required';
+ case ApiErrorType.authorization:
+ return 'Access Denied';
+ case ApiErrorType.validation:
+ return 'Invalid Input';
+ case ApiErrorType.badRequest:
+ return 'Bad Request';
+ case ApiErrorType.notFound:
+ return 'Not Found';
+ case ApiErrorType.server:
+ return 'Server Error';
+ case ApiErrorType.rateLimit:
+ return 'Rate Limited';
+ case ApiErrorType.cancelled:
+ return 'Request Cancelled';
+ case ApiErrorType.security:
+ return 'Security Error';
+ case ApiErrorType.unknown:
+ return 'Unknown Error';
+ }
+ }
+ return 'Error';
+ }
+
+ Duration _getSnackbarDuration(dynamic error) {
+ if (error is ApiError) {
+ switch (error.type) {
+ case ApiErrorType.validation:
+ case ApiErrorType.badRequest:
+ return const Duration(seconds: 6); // Longer for validation errors
+ case ApiErrorType.rateLimit:
+ return const Duration(seconds: 8); // Longer for rate limits
+ default:
+ return const Duration(seconds: 4);
+ }
+ }
+ return const Duration(seconds: 4);
+ }
+}
+
+/// Global instance for easy access
+final enhancedErrorService = EnhancedErrorService();
diff --git a/lib/core/error/error_parser.dart b/lib/core/error/error_parser.dart
new file mode 100644
index 0000000..6c0ab8f
--- /dev/null
+++ b/lib/core/error/error_parser.dart
@@ -0,0 +1,405 @@
+import 'package:flutter/foundation.dart';
+import 'api_error.dart';
+
+/// Comprehensive error response parser
+/// Handles various API error response formats and extracts structured information
+class ErrorParser {
+ /// Parse general error response from API
+ ParsedErrorResponse parseErrorResponse(dynamic responseData) {
+ if (responseData == null) {
+ return const ParsedErrorResponse();
+ }
+
+ try {
+ if (responseData is Map) {
+ return _parseErrorMap(responseData);
+ } else if (responseData is String) {
+ return _parseErrorString(responseData);
+ } else if (responseData is List) {
+ return _parseErrorList(responseData);
+ } else {
+ return ParsedErrorResponse(
+ message: 'Unexpected error format',
+ metadata: {'rawData': responseData.toString()},
+ );
+ }
+ } catch (e) {
+ debugPrint('ErrorParser: Error parsing response: $e');
+ return ParsedErrorResponse(
+ message: 'Failed to parse error response',
+ metadata: {
+ 'parseError': e.toString(),
+ 'rawData': responseData.toString(),
+ },
+ );
+ }
+ }
+
+ /// Parse validation error (422) with field-specific errors
+ ParsedErrorResponse parseValidationError(dynamic responseData) {
+ final baseResult = parseErrorResponse(responseData);
+
+ if (responseData is Map) {
+ final fieldErrors = _extractFieldErrors(responseData);
+
+ return ParsedErrorResponse(
+ message: baseResult.message ?? 'Validation failed',
+ code: baseResult.code,
+ errors: baseResult.errors,
+ fieldErrors: fieldErrors,
+ metadata: baseResult.metadata,
+ );
+ }
+
+ return baseResult;
+ }
+
+ /// Parse error response from a Map (most common format)
+ ParsedErrorResponse _parseErrorMap(Map data) {
+ final message = _extractMessage(data);
+ final code = _extractCode(data);
+ final errors = _extractGeneralErrors(data);
+ final fieldErrors = _extractFieldErrors(data);
+ final metadata = _extractMetadata(data);
+
+ return ParsedErrorResponse(
+ message: message,
+ code: code,
+ errors: errors,
+ fieldErrors: fieldErrors,
+ metadata: metadata,
+ );
+ }
+
+ /// Parse error response from a String
+ ParsedErrorResponse _parseErrorString(String data) {
+ return ParsedErrorResponse(message: data, metadata: {'format': 'string'});
+ }
+
+ /// Parse error response from a List
+ ParsedErrorResponse _parseErrorList(List data) {
+ final errors = [];
+
+ for (final item in data) {
+ if (item is String) {
+ errors.add(item);
+ } else if (item is Map) {
+ final message = _extractMessage(item);
+ if (message != null) {
+ errors.add(message);
+ }
+ } else {
+ errors.add(item.toString());
+ }
+ }
+
+ return ParsedErrorResponse(
+ message: errors.isNotEmpty ? errors.first : 'Multiple errors occurred',
+ errors: errors,
+ metadata: {'format': 'list', 'count': data.length},
+ );
+ }
+
+ /// Extract error message from various possible fields
+ String? _extractMessage(Map data) {
+ // Common error message fields in order of preference
+ const messageFields = [
+ 'message',
+ 'error',
+ 'detail',
+ 'description',
+ 'msg',
+ 'error_description',
+ 'title',
+ 'summary',
+ ];
+
+ for (final field in messageFields) {
+ final value = data[field];
+ if (value is String && value.isNotEmpty) {
+ return value;
+ }
+ }
+
+ return null;
+ }
+
+ /// Extract error code from response
+ String? _extractCode(Map data) {
+ const codeFields = [
+ 'code',
+ 'error_code',
+ 'errorCode',
+ 'type',
+ 'error_type',
+ 'errorType',
+ ];
+
+ for (final field in codeFields) {
+ final value = data[field];
+ if (value is String && value.isNotEmpty) {
+ return value;
+ } else if (value is int) {
+ return value.toString();
+ }
+ }
+
+ return null;
+ }
+
+ /// Extract general error messages (non-field-specific)
+ List _extractGeneralErrors(Map data) {
+ final errors = [];
+
+ // Check for error arrays
+ const errorArrayFields = ['errors', 'messages', 'details', 'issues'];
+
+ for (final field in errorArrayFields) {
+ final value = data[field];
+ if (value is List) {
+ for (final item in value) {
+ if (item is String && item.isNotEmpty) {
+ errors.add(item);
+ } else if (item is Map) {
+ final message = _extractMessage(item);
+ if (message != null) {
+ errors.add(message);
+ }
+ }
+ }
+ }
+ }
+
+ return errors;
+ }
+
+ /// Extract field-specific validation errors
+ Map> _extractFieldErrors(Map data) {
+ final fieldErrors = >{};
+
+ // Common patterns for field errors
+ _extractFromFieldErrorsObject(data, fieldErrors);
+ _extractFromValidationErrorsArray(data, fieldErrors);
+ _extractFromDetailsObject(data, fieldErrors);
+ _extractFromOpenAPIFormat(data, fieldErrors);
+
+ return fieldErrors;
+ }
+
+ /// Extract from 'field_errors' or 'fieldErrors' object
+ void _extractFromFieldErrorsObject(
+ Map data,
+ Map> fieldErrors,
+ ) {
+ const fieldErrorFields = [
+ 'field_errors',
+ 'fieldErrors',
+ 'validation_errors',
+ 'validationErrors',
+ 'field_messages',
+ 'fieldMessages',
+ ];
+
+ for (final field in fieldErrorFields) {
+ final value = data[field];
+ if (value is Map) {
+ for (final entry in value.entries) {
+ final fieldName = entry.key;
+ final fieldValue = entry.value;
+
+ final errors = [];
+ if (fieldValue is String) {
+ errors.add(fieldValue);
+ } else if (fieldValue is List) {
+ for (final item in fieldValue) {
+ if (item is String) {
+ errors.add(item);
+ } else {
+ errors.add(item.toString());
+ }
+ }
+ }
+
+ if (errors.isNotEmpty) {
+ fieldErrors[fieldName] = errors;
+ }
+ }
+ }
+ }
+ }
+
+ /// Extract from validation errors array format
+ void _extractFromValidationErrorsArray(
+ Map data,
+ Map> fieldErrors,
+ ) {
+ const arrayFields = ['errors', 'details', 'issues'];
+
+ for (final field in arrayFields) {
+ final value = data[field];
+ if (value is List) {
+ for (final item in value) {
+ if (item is Map) {
+ final field =
+ item['field'] as String? ??
+ item['property'] as String? ??
+ item['path'] as String?;
+ final message = _extractMessage(item);
+
+ if (field != null && message != null) {
+ fieldErrors.putIfAbsent(field, () => []).add(message);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /// Extract from 'details' object (common in some APIs)
+ void _extractFromDetailsObject(
+ Map data,
+ Map> fieldErrors,
+ ) {
+ final details = data['details'];
+ if (details is Map) {
+ for (final entry in details.entries) {
+ final fieldName = entry.key;
+ final fieldValue = entry.value;
+
+ if (fieldValue is String) {
+ fieldErrors.putIfAbsent(fieldName, () => []).add(fieldValue);
+ } else if (fieldValue is List) {
+ final errors = fieldValue
+ .map((e) => e.toString())
+ .where((s) => s.isNotEmpty)
+ .toList();
+ if (errors.isNotEmpty) {
+ fieldErrors[fieldName] = errors;
+ }
+ }
+ }
+ }
+ }
+
+ /// Extract from OpenAPI specification error format
+ void _extractFromOpenAPIFormat(
+ Map data,
+ Map> fieldErrors,
+ ) {
+ // OpenAPI validation errors often come in this format
+ final detail = data['detail'];
+ if (detail is List) {
+ for (final item in detail) {
+ if (item is Map) {
+ final loc = item['loc'];
+ final msg = item['msg'] as String?;
+
+ if (loc is List && loc.isNotEmpty && msg != null) {
+ // Location can be like ['body', 'fieldName'] or ['fieldName']
+ final fieldName = loc.last.toString();
+ fieldErrors.putIfAbsent(fieldName, () => []).add(msg);
+ }
+ }
+ }
+ }
+ }
+
+ /// Extract additional metadata from error response
+ Map _extractMetadata(Map data) {
+ final metadata = {};
+
+ // Common metadata fields
+ const metadataFields = [
+ 'timestamp',
+ 'request_id',
+ 'requestId',
+ 'trace_id',
+ 'traceId',
+ 'correlation_id',
+ 'correlationId',
+ 'instance',
+ 'path',
+ 'method',
+ 'status',
+ 'documentation',
+ 'help',
+ 'support',
+ ];
+
+ for (final field in metadataFields) {
+ final value = data[field];
+ if (value != null) {
+ metadata[field] = value;
+ }
+ }
+
+ // Include any unrecognized fields as metadata
+ final recognizedFields = {
+ 'message',
+ 'error',
+ 'detail',
+ 'description',
+ 'msg',
+ 'error_description',
+ 'title',
+ 'summary',
+ 'code',
+ 'error_code',
+ 'errorCode',
+ 'type',
+ 'error_type',
+ 'errorType',
+ 'errors',
+ 'messages',
+ 'details',
+ 'issues',
+ 'field_errors',
+ 'fieldErrors',
+ 'validation_errors',
+ 'validationErrors',
+ 'field_messages',
+ 'fieldMessages',
+ ...metadataFields,
+ };
+
+ for (final entry in data.entries) {
+ if (!recognizedFields.contains(entry.key)) {
+ metadata[entry.key] = entry.value;
+ }
+ }
+
+ return metadata;
+ }
+
+ /// Convert field name from API format to user-friendly format
+ String formatFieldName(String fieldName) {
+ // Convert snake_case to human readable
+ if (fieldName.contains('_')) {
+ return fieldName
+ .split('_')
+ .map(
+ (word) =>
+ word.isEmpty ? word : word[0].toUpperCase() + word.substring(1),
+ )
+ .join(' ');
+ }
+
+ // Convert camelCase to human readable
+ return fieldName
+ .replaceAllMapped(RegExp(r'([A-Z])'), (match) => ' ${match.group(1)}')
+ .trim();
+ }
+
+ /// Get user-friendly error message for a field
+ String formatFieldError(String fieldName, String error) {
+ final friendlyFieldName = formatFieldName(fieldName);
+
+ // If error already mentions the field, don't duplicate it
+ if (error.toLowerCase().contains(fieldName.toLowerCase()) ||
+ error.toLowerCase().contains(friendlyFieldName.toLowerCase())) {
+ return error;
+ }
+
+ return '$friendlyFieldName: $error';
+ }
+}
diff --git a/lib/core/models/chat_message.dart b/lib/core/models/chat_message.dart
new file mode 100644
index 0000000..92eed78
--- /dev/null
+++ b/lib/core/models/chat_message.dart
@@ -0,0 +1,23 @@
+import 'package:freezed_annotation/freezed_annotation.dart';
+
+part 'chat_message.freezed.dart';
+part 'chat_message.g.dart';
+
+@freezed
+sealed class ChatMessage with _$ChatMessage {
+ const factory ChatMessage({
+ required String id,
+ required String role, // 'user', 'assistant', 'system'
+ required String content,
+ required DateTime timestamp,
+ String? model,
+ @Default(false) bool isStreaming,
+ List? attachmentIds,
+ Map? metadata,
+ List