Oleg Lavrovsky commited on
Commit
c53337b
·
unverified ·
1 Parent(s): 3edc85c

Xielu support

Browse files
Files changed (5) hide show
  1. LICENSE +203 -286
  2. README.md +5 -7
  3. app.py +24 -15
  4. pyproject.toml +5 -0
  5. uv.lock +2 -0
LICENSE CHANGED
@@ -1,287 +1,204 @@
1
- EUROPEAN UNION PUBLIC LICENCE v. 1.2
2
- EUPL © the European Union 2007, 2016
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
 
4
- This European Union Public Licence (the ‘EUPL’) applies to the Work (as defined
5
- below) which is provided under the terms of this Licence. Any use of the Work,
6
- other than as authorised under this Licence is prohibited (to the extent such
7
- use is covered by a right of the copyright holder of the Work).
8
-
9
- The Work is provided under the terms of this Licence when the Licensor (as
10
- defined below) has placed the following notice immediately following the
11
- copyright notice for the Work:
12
-
13
- Licensed under the EUPL
14
-
15
- or has expressed by any other means his willingness to license under the EUPL.
16
-
17
- 1. Definitions
18
-
19
- In this Licence, the following terms have the following meaning:
20
-
21
- - ‘The Licence’: this Licence.
22
-
23
- - ‘The Original Work’: the work or software distributed or communicated by the
24
- Licensor under this Licence, available as Source Code and also as Executable
25
- Code as the case may be.
26
-
27
- - ‘Derivative Works’: the works or software that could be created by the
28
- Licensee, based upon the Original Work or modifications thereof. This Licence
29
- does not define the extent of modification or dependence on the Original Work
30
- required in order to classify a work as a Derivative Work; this extent is
31
- determined by copyright law applicable in the country mentioned in Article 15.
32
-
33
- - ‘The Work’: the Original Work or its Derivative Works.
34
-
35
- - ‘The Source Code’: the human-readable form of the Work which is the most
36
- convenient for people to study and modify.
37
-
38
- - ‘The Executable Code’: any code which has generally been compiled and which is
39
- meant to be interpreted by a computer as a program.
40
-
41
- - ‘The Licensor’: the natural or legal person that distributes or communicates
42
- the Work under the Licence.
43
-
44
- - ‘Contributor(s)’: any natural or legal person who modifies the Work under the
45
- Licence, or otherwise contributes to the creation of a Derivative Work.
46
-
47
- - ‘The Licensee’ or ‘You’: any natural or legal person who makes any usage of
48
- the Work under the terms of the Licence.
49
-
50
- - ‘Distribution’ or ‘Communication’: any act of selling, giving, lending,
51
- renting, distributing, communicating, transmitting, or otherwise making
52
- available, online or offline, copies of the Work or providing access to its
53
- essential functionalities at the disposal of any other natural or legal
54
- person.
55
-
56
- 2. Scope of the rights granted by the Licence
57
-
58
- The Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
59
- sublicensable licence to do the following, for the duration of copyright vested
60
- in the Original Work:
61
-
62
- - use the Work in any circumstance and for all usage,
63
- - reproduce the Work,
64
- - modify the Work, and make Derivative Works based upon the Work,
65
- - communicate to the public, including the right to make available or display
66
- the Work or copies thereof to the public and perform publicly, as the case may
67
- be, the Work,
68
- - distribute the Work or copies thereof,
69
- - lend and rent the Work or copies thereof,
70
- - sublicense rights in the Work or copies thereof.
71
-
72
- Those rights can be exercised on any media, supports and formats, whether now
73
- known or later invented, as far as the applicable law permits so.
74
-
75
- In the countries where moral rights apply, the Licensor waives his right to
76
- exercise his moral right to the extent allowed by law in order to make effective
77
- the licence of the economic rights here above listed.
78
-
79
- The Licensor grants to the Licensee royalty-free, non-exclusive usage rights to
80
- any patents held by the Licensor, to the extent necessary to make use of the
81
- rights granted on the Work under this Licence.
82
-
83
- 3. Communication of the Source Code
84
-
85
- The Licensor may provide the Work either in its Source Code form, or as
86
- Executable Code. If the Work is provided as Executable Code, the Licensor
87
- provides in addition a machine-readable copy of the Source Code of the Work
88
- along with each copy of the Work that the Licensor distributes or indicates, in
89
- a notice following the copyright notice attached to the Work, a repository where
90
- the Source Code is easily and freely accessible for as long as the Licensor
91
- continues to distribute or communicate the Work.
92
-
93
- 4. Limitations on copyright
94
-
95
- Nothing in this Licence is intended to deprive the Licensee of the benefits from
96
- any exception or limitation to the exclusive rights of the rights owners in the
97
- Work, of the exhaustion of those rights or of other applicable limitations
98
- thereto.
99
-
100
- 5. Obligations of the Licensee
101
-
102
- The grant of the rights mentioned above is subject to some restrictions and
103
- obligations imposed on the Licensee. Those obligations are the following:
104
-
105
- Attribution right: The Licensee shall keep intact all copyright, patent or
106
- trademarks notices and all notices that refer to the Licence and to the
107
- disclaimer of warranties. The Licensee must include a copy of such notices and a
108
- copy of the Licence with every copy of the Work he/she distributes or
109
- communicates. The Licensee must cause any Derivative Work to carry prominent
110
- notices stating that the Work has been modified and the date of modification.
111
-
112
- Copyleft clause: If the Licensee distributes or communicates copies of the
113
- Original Works or Derivative Works, this Distribution or Communication will be
114
- done under the terms of this Licence or of a later version of this Licence
115
- unless the Original Work is expressly distributed only under this version of the
116
- Licence — for example by communicating ‘EUPL v. 1.2 only’. The Licensee
117
- (becoming Licensor) cannot offer or impose any additional terms or conditions on
118
- the Work or Derivative Work that alter or restrict the terms of the Licence.
119
-
120
- Compatibility clause: If the Licensee Distributes or Communicates Derivative
121
- Works or copies thereof based upon both the Work and another work licensed under
122
- a Compatible Licence, this Distribution or Communication can be done under the
123
- terms of this Compatible Licence. For the sake of this clause, ‘Compatible
124
- Licence’ refers to the licences listed in the appendix attached to this Licence.
125
- Should the Licensee's obligations under the Compatible Licence conflict with
126
- his/her obligations under this Licence, the obligations of the Compatible
127
- Licence shall prevail.
128
-
129
- Provision of Source Code: When distributing or communicating copies of the Work,
130
- the Licensee will provide a machine-readable copy of the Source Code or indicate
131
- a repository where this Source will be easily and freely available for as long
132
- as the Licensee continues to distribute or communicate the Work.
133
-
134
- Legal Protection: This Licence does not grant permission to use the trade names,
135
- trademarks, service marks, or names of the Licensor, except as required for
136
- reasonable and customary use in describing the origin of the Work and
137
- reproducing the content of the copyright notice.
138
-
139
- 6. Chain of Authorship
140
-
141
- The original Licensor warrants that the copyright in the Original Work granted
142
- hereunder is owned by him/her or licensed to him/her and that he/she has the
143
- power and authority to grant the Licence.
144
-
145
- Each Contributor warrants that the copyright in the modifications he/she brings
146
- to the Work are owned by him/her or licensed to him/her and that he/she has the
147
- power and authority to grant the Licence.
148
-
149
- Each time You accept the Licence, the original Licensor and subsequent
150
- Contributors grant You a licence to their contributions to the Work, under the
151
- terms of this Licence.
152
-
153
- 7. Disclaimer of Warranty
154
-
155
- The Work is a work in progress, which is continuously improved by numerous
156
- Contributors. It is not a finished work and may therefore contain defects or
157
- ‘bugs’ inherent to this type of development.
158
-
159
- For the above reason, the Work is provided under the Licence on an ‘as is’ basis
160
- and without warranties of any kind concerning the Work, including without
161
- limitation merchantability, fitness for a particular purpose, absence of defects
162
- or errors, accuracy, non-infringement of intellectual property rights other than
163
- copyright as stated in Article 6 of this Licence.
164
-
165
- This disclaimer of warranty is an essential part of the Licence and a condition
166
- for the grant of any rights to the Work.
167
-
168
- 8. Disclaimer of Liability
169
-
170
- Except in the cases of wilful misconduct or damages directly caused to natural
171
- persons, the Licensor will in no event be liable for any direct or indirect,
172
- material or moral, damages of any kind, arising out of the Licence or of the use
173
- of the Work, including without limitation, damages for loss of goodwill, work
174
- stoppage, computer failure or malfunction, loss of data or any commercial
175
- damage, even if the Licensor has been advised of the possibility of such damage.
176
- However, the Licensor will be liable under statutory product liability laws as
177
- far such laws apply to the Work.
178
-
179
- 9. Additional agreements
180
-
181
- While distributing the Work, You may choose to conclude an additional agreement,
182
- defining obligations or services consistent with this Licence. However, if
183
- accepting obligations, You may act only on your own behalf and on your sole
184
- responsibility, not on behalf of the original Licensor or any other Contributor,
185
- and only if You agree to indemnify, defend, and hold each Contributor harmless
186
- for any liability incurred by, or claims asserted against such Contributor by
187
- the fact You have accepted any warranty or additional liability.
188
-
189
- 10. Acceptance of the Licence
190
-
191
- The provisions of this Licence can be accepted by clicking on an icon ‘I agree’
192
- placed under the bottom of a window displaying the text of this Licence or by
193
- affirming consent in any other similar way, in accordance with the rules of
194
- applicable law. Clicking on that icon indicates your clear and irrevocable
195
- acceptance of this Licence and all of its terms and conditions.
196
-
197
- Similarly, you irrevocably accept this Licence and all of its terms and
198
- conditions by exercising any rights granted to You by Article 2 of this Licence,
199
- such as the use of the Work, the creation by You of a Derivative Work or the
200
- Distribution or Communication by You of the Work or copies thereof.
201
-
202
- 11. Information to the public
203
-
204
- In case of any Distribution or Communication of the Work by means of electronic
205
- communication by You (for example, by offering to download the Work from a
206
- remote location) the distribution channel or media (for example, a website) must
207
- at least provide to the public the information requested by the applicable law
208
- regarding the Licensor, the Licence and the way it may be accessible, concluded,
209
- stored and reproduced by the Licensee.
210
-
211
- 12. Termination of the Licence
212
-
213
- The Licence and the rights granted hereunder will terminate automatically upon
214
- any breach by the Licensee of the terms of the Licence.
215
-
216
- Such a termination will not terminate the licences of any person who has
217
- received the Work from the Licensee under the Licence, provided such persons
218
- remain in full compliance with the Licence.
219
-
220
- 13. Miscellaneous
221
-
222
- Without prejudice of Article 9 above, the Licence represents the complete
223
- agreement between the Parties as to the Work.
224
-
225
- If any provision of the Licence is invalid or unenforceable under applicable
226
- law, this will not affect the validity or enforceability of the Licence as a
227
- whole. Such provision will be construed or reformed so as necessary to make it
228
- valid and enforceable.
229
-
230
- The European Commission may publish other linguistic versions or new versions of
231
- this Licence or updated versions of the Appendix, so far this is required and
232
- reasonable, without reducing the scope of the rights granted by the Licence. New
233
- versions of the Licence will be published with a unique version number.
234
-
235
- All linguistic versions of this Licence, approved by the European Commission,
236
- have identical value. Parties can take advantage of the linguistic version of
237
- their choice.
238
-
239
- 14. Jurisdiction
240
-
241
- Without prejudice to specific agreement between parties,
242
-
243
- - any litigation resulting from the interpretation of this License, arising
244
- between the European Union institutions, bodies, offices or agencies, as a
245
- Licensor, and any Licensee, will be subject to the jurisdiction of the Court
246
- of Justice of the European Union, as laid down in article 272 of the Treaty on
247
- the Functioning of the European Union,
248
-
249
- - any litigation arising between other parties and resulting from the
250
- interpretation of this License, will be subject to the exclusive jurisdiction
251
- of the competent court where the Licensor resides or conducts its primary
252
- business.
253
-
254
- 15. Applicable Law
255
-
256
- Without prejudice to specific agreement between parties,
257
-
258
- - this Licence shall be governed by the law of the European Union Member State
259
- where the Licensor has his seat, resides or has his registered office,
260
-
261
- - this licence shall be governed by Belgian law if the Licensor has no seat,
262
- residence or registered office inside a European Union Member State.
263
-
264
- Appendix
265
-
266
- ‘Compatible Licences’ according to Article 5 EUPL are:
267
-
268
- - GNU General Public License (GPL) v. 2, v. 3
269
- - GNU Affero General Public License (AGPL) v. 3
270
- - Open Software License (OSL) v. 2.1, v. 3.0
271
- - Eclipse Public License (EPL) v. 1.0
272
- - CeCILL v. 2.0, v. 2.1
273
- - Mozilla Public Licence (MPL) v. 2
274
- - GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3
275
- - Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for
276
- works other than software
277
- - European Union Public Licence (EUPL) v. 1.1, v. 1.2
278
- - Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or Strong
279
- Reciprocity (LiLiQ-R+).
280
-
281
- The European Commission may update this Appendix to later versions of the above
282
- licences without producing a new version of the EUPL, as long as they provide
283
- the rights granted in Article 2 of this Licence and protect the covered Source
284
- Code from exclusive appropriation.
285
-
286
- All other changes or additions to this Appendix require the production of a new
287
- EUPL version.
 
1
+ Copyright 2025 - The Swiss AI community.
2
+
3
+ Apache License
4
+ Version 2.0, January 2004
5
+ http://www.apache.org/licenses/
6
+
7
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
8
+
9
+ 1. Definitions.
10
+
11
+ "License" shall mean the terms and conditions for use, reproduction,
12
+ and distribution as defined by Sections 1 through 9 of this document.
13
+
14
+ "Licensor" shall mean the copyright owner or entity authorized by
15
+ the copyright owner that is granting the License.
16
+
17
+ "Legal Entity" shall mean the union of the acting entity and all
18
+ other entities that control, are controlled by, or are under common
19
+ control with that entity. For the purposes of this definition,
20
+ "control" means (i) the power, direct or indirect, to cause the
21
+ direction or management of such entity, whether by contract or
22
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
23
+ outstanding shares, or (iii) beneficial ownership of such entity.
24
+
25
+ "You" (or "Your") shall mean an individual or Legal Entity
26
+ exercising permissions granted by this License.
27
+
28
+ "Source" form shall mean the preferred form for making modifications,
29
+ including but not limited to software source code, documentation
30
+ source, and configuration files.
31
+
32
+ "Object" form shall mean any form resulting from mechanical
33
+ transformation or translation of a Source form, including but
34
+ not limited to compiled object code, generated documentation,
35
+ and conversions to other media types.
36
+
37
+ "Work" shall mean the work of authorship, whether in Source or
38
+ Object form, made available under the License, as indicated by a
39
+ copyright notice that is included in or attached to the work
40
+ (an example is provided in the Appendix below).
41
+
42
+ "Derivative Works" shall mean any work, whether in Source or Object
43
+ form, that is based on (or derived from) the Work and for which the
44
+ editorial revisions, annotations, elaborations, or other modifications
45
+ represent, as a whole, an original work of authorship. For the purposes
46
+ of this License, Derivative Works shall not include works that remain
47
+ separable from, or merely link (or bind by name) to the interfaces of,
48
+ the Work and Derivative Works thereof.
49
+
50
+ "Contribution" shall mean any work of authorship, including
51
+ the original version of the Work and any modifications or additions
52
+ to that Work or Derivative Works thereof, that is intentionally
53
+ submitted to Licensor for inclusion in the Work by the copyright owner
54
+ or by an individual or Legal Entity authorized to submit on behalf of
55
+ the copyright owner. For the purposes of this definition, "submitted"
56
+ means any form of electronic, verbal, or written communication sent
57
+ to the Licensor or its representatives, including but not limited to
58
+ communication on electronic mailing lists, source code control systems,
59
+ and issue tracking systems that are managed by, or on behalf of, the
60
+ Licensor for the purpose of discussing and improving the Work, but
61
+ excluding communication that is conspicuously marked or otherwise
62
+ designated in writing by the copyright owner as "Not a Contribution."
63
+
64
+ "Contributor" shall mean Licensor and any individual or Legal Entity
65
+ on behalf of whom a Contribution has been received by Licensor and
66
+ subsequently incorporated within the Work.
67
+
68
+ 2. Grant of Copyright License. Subject to the terms and conditions of
69
+ this License, each Contributor hereby grants to You a perpetual,
70
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
71
+ copyright license to reproduce, prepare Derivative Works of,
72
+ publicly display, publicly perform, sublicense, and distribute the
73
+ Work and such Derivative Works in Source or Object form.
74
+
75
+ 3. Grant of Patent License. Subject to the terms and conditions of
76
+ this License, each Contributor hereby grants to You a perpetual,
77
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
78
+ (except as stated in this section) patent license to make, have made,
79
+ use, offer to sell, sell, import, and otherwise transfer the Work,
80
+ where such license applies only to those patent claims licensable
81
+ by such Contributor that are necessarily infringed by their
82
+ Contribution(s) alone or by combination of their Contribution(s)
83
+ with the Work to which such Contribution(s) was submitted. If You
84
+ institute patent litigation against any entity (including a
85
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
86
+ or a Contribution incorporated within the Work constitutes direct
87
+ or contributory patent infringement, then any patent licenses
88
+ granted to You under this License for that Work shall terminate
89
+ as of the date such litigation is filed.
90
+
91
+ 4. Redistribution. You may reproduce and distribute copies of the
92
+ Work or Derivative Works thereof in any medium, with or without
93
+ modifications, and in Source or Object form, provided that You
94
+ meet the following conditions:
95
+
96
+ (a) You must give any other recipients of the Work or
97
+ Derivative Works a copy of this License; and
98
+
99
+ (b) You must cause any modified files to carry prominent notices
100
+ stating that You changed the files; and
101
+
102
+ (c) You must retain, in the Source form of any Derivative Works
103
+ that You distribute, all copyright, patent, trademark, and
104
+ attribution notices from the Source form of the Work,
105
+ excluding those notices that do not pertain to any part of
106
+ the Derivative Works; and
107
+
108
+ (d) If the Work includes a "NOTICE" text file as part of its
109
+ distribution, then any Derivative Works that You distribute must
110
+ include a readable copy of the attribution notices contained
111
+ within such NOTICE file, excluding those notices that do not
112
+ pertain to any part of the Derivative Works, in at least one
113
+ of the following places: within a NOTICE text file distributed
114
+ as part of the Derivative Works; within the Source form or
115
+ documentation, if provided along with the Derivative Works; or,
116
+ within a display generated by the Derivative Works, if and
117
+ wherever such third-party notices normally appear. The contents
118
+ of the NOTICE file are for informational purposes only and
119
+ do not modify the License. You may add Your own attribution
120
+ notices within Derivative Works that You distribute, alongside
121
+ or as an addendum to the NOTICE text from the Work, provided
122
+ that such additional attribution notices cannot be construed
123
+ as modifying the License.
124
+
125
+ You may add Your own copyright statement to Your modifications and
126
+ may provide additional or different license terms and conditions
127
+ for use, reproduction, or distribution of Your modifications, or
128
+ for any such Derivative Works as a whole, provided Your use,
129
+ reproduction, and distribution of the Work otherwise complies with
130
+ the conditions stated in this License.
131
+
132
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
133
+ any Contribution intentionally submitted for inclusion in the Work
134
+ by You to the Licensor shall be under the terms and conditions of
135
+ this License, without any additional terms or conditions.
136
+ Notwithstanding the above, nothing herein shall supersede or modify
137
+ the terms of any separate license agreement you may have executed
138
+ with Licensor regarding such Contributions.
139
+
140
+ 6. Trademarks. This License does not grant permission to use the trade
141
+ names, trademarks, service marks, or product names of the Licensor,
142
+ except as required for reasonable and customary use in describing the
143
+ origin of the Work and reproducing the content of the NOTICE file.
144
+
145
+ 7. Disclaimer of Warranty. Unless required by applicable law or
146
+ agreed to in writing, Licensor provides the Work (and each
147
+ Contributor provides its Contributions) on an "AS IS" BASIS,
148
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
149
+ implied, including, without limitation, any warranties or conditions
150
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
151
+ PARTICULAR PURPOSE. You are solely responsible for determining the
152
+ appropriateness of using or redistributing the Work and assume any
153
+ risks associated with Your exercise of permissions under this License.
154
+
155
+ 8. Limitation of Liability. In no event and under no legal theory,
156
+ whether in tort (including negligence), contract, or otherwise,
157
+ unless required by applicable law (such as deliberate and grossly
158
+ negligent acts) or agreed to in writing, shall any Contributor be
159
+ liable to You for damages, including any direct, indirect, special,
160
+ incidental, or consequential damages of any character arising as a
161
+ result of this License or out of the use or inability to use the
162
+ Work (including but not limited to damages for loss of goodwill,
163
+ work stoppage, computer failure or malfunction, or any and all
164
+ other commercial damages or losses), even if such Contributor
165
+ has been advised of the possibility of such damages.
166
+
167
+ 9. Accepting Warranty or Additional Liability. While redistributing
168
+ the Work or Derivative Works thereof, You may choose to offer,
169
+ and charge a fee for, acceptance of support, warranty, indemnity,
170
+ or other liability obligations and/or rights consistent with this
171
+ License. However, in accepting such obligations, You may act only
172
+ on Your own behalf and on Your sole responsibility, not on behalf
173
+ of any other Contributor, and only if You agree to indemnify,
174
+ defend, and hold each Contributor harmless for any liability
175
+ incurred by, or claims asserted against, such Contributor by reason
176
+ of your accepting any such warranty or additional liability.
177
+
178
+ END OF TERMS AND CONDITIONS
179
+
180
+ APPENDIX: How to apply the Apache License to your work.
181
+
182
+ To apply the Apache License to your work, attach the following
183
+ boilerplate notice, with the fields enclosed by brackets "[]"
184
+ replaced with your own identifying information. (Don't include
185
+ the brackets!) The text should be enclosed in the appropriate
186
+ comment syntax for the file format. We also recommend that a
187
+ file or class name and description of purpose be included on the
188
+ same "printed page" as the copyright notice for easier
189
+ identification within third-party archives.
190
+
191
+ Copyright [yyyy] [name of copyright owner]
192
+
193
+ Licensed under the Apache License, Version 2.0 (the "License");
194
+ you may not use this file except in compliance with the License.
195
+ You may obtain a copy of the License at
196
+
197
+ http://www.apache.org/licenses/LICENSE-2.0
198
+
199
+ Unless required by applicable law or agreed to in writing, software
200
+ distributed under the License is distributed on an "AS IS" BASIS,
201
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
202
+ See the License for the specific language governing permissions and
203
+ limitations under the License.
204
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
README.md CHANGED
@@ -19,15 +19,13 @@ Apertus transformer on FastAPI
19
 
20
  A FastAPI-based Python application that provides an API to interface with the Apertus LLM from the Swiss AI Initiative.
21
 
22
- For more information go to https://huggingface.co/swiss-ai
 
23
 
24
- ## TODOs
25
 
26
- - [Apertus Format API](https://github.com/swiss-ai/apertus_format)
27
- - [OpenAI-compatible API](https://medium.com/data-science/how-to-build-an-openai-compatible-api-87c8edea2f06)
28
- - ...?
29
- - Profit!
30
 
31
- Just kidding, this is an open source project under the [European Public Domain License](LICENSE)
32
 
33
  If you have further suggestions please leave them on [Codeberg Issues](https://codeberg.org/loleg/fastapi-apertus/issues)
 
19
 
20
  A FastAPI-based Python application that provides an API to interface with the Apertus LLM from the Swiss AI Initiative.
21
 
22
+ The [OpenAI-compatible API](https://medium.com/data-science/how-to-build-an-openai-compatible-api-87c8edea2f06)
23
+ is inspired by [openai-compatible-fastapi](https://github.com/ritun16/openai-compatible-fastapi).
24
 
25
+ The goal is to use the [Apertus Format API](https://github.com/swiss-ai/apertus_format) in a lightweight service with an efficient, paged attention mechanism.
26
 
27
+ For more information on Apertus, go to https://huggingface.co/swiss-ai
 
 
 
28
 
29
+ This is an open source project under the [Apache 2.0 License](LICENSE)
30
 
31
  If you have further suggestions please leave them on [Codeberg Issues](https://codeberg.org/loleg/fastapi-apertus/issues)
app.py CHANGED
@@ -7,12 +7,15 @@ from typing import List, Optional
7
  from torch import cuda
8
  from transformers import AutoModelForCausalLM, AutoTokenizer
9
 
 
10
  from huggingface_hub import login
11
  from dotenv import load_dotenv
 
12
  import os
13
  import uvicorn
14
-
15
  import logging
 
16
  # Configure logging
17
  logging.basicConfig(level=logging.INFO)
18
  logger = logging.getLogger(__name__)
@@ -26,12 +29,15 @@ if hf_token is not None:
26
  # Configurable model identifier
27
  model_name = os.getenv("HF_MODEL", "swiss-ai/Apertus-8B-Instruct-2509")
28
 
 
 
 
29
  # Keep data in session
30
  model = None
31
  tokenizer = None
32
 
33
  class TextInput(BaseModel):
34
- text: str
35
  min_length: int = 3
36
  # Apertus by default supports a context length up to 65,536 tokens.
37
  max_length: int = 65536
@@ -42,8 +48,8 @@ class ModelResponse(BaseModel):
42
  processing_time: float
43
 
44
  class ChatMessage(BaseModel):
45
- role: str
46
- content: str
47
 
48
  class Completion(BaseModel):
49
  model: str = "apertus"
@@ -117,6 +123,10 @@ def get_completion_text(messages_think: List[ChatMessage]):
117
  return txt
118
 
119
 
 
 
 
 
120
  def get_model_reponse(messages_think: List[ChatMessage]):
121
  """Process the text content."""
122
 
@@ -137,13 +147,13 @@ def get_model_reponse(messages_think: List[ChatMessage]):
137
  # Generate the output
138
  generated_ids = model.generate(
139
  **model_inputs,
140
- max_new_tokens=512
141
  )
142
 
143
  # Get and decode the output
144
  output_ids = generated_ids[0][len(model_inputs.input_ids[0]) :]
145
 
146
- # Return just the text
147
  return tokenizer.decode(output_ids, skip_special_tokens=True)
148
 
149
 
@@ -158,15 +168,15 @@ async def completion(data: Completion):
158
  text = get_completion_text(mt)
159
  result = get_model_reponse(mt)
160
 
 
161
  return {
162
- "choices": [
163
- {
164
- "text": result,
165
- "_index": 0,
166
- "logprobs": None,
167
- "finish_reason": "length"
168
- }
169
- ],
170
  "usage": {
171
  "prompt_tokens": len(text),
172
  "completion_tokens": len(result),
@@ -185,7 +195,6 @@ async def predict(q: str):
185
  raise HTTPException(status_code=503, detail="Model not loaded")
186
 
187
  try:
188
- import time
189
  start_time = time.time()
190
 
191
  input_data = TextInput(text=q)
 
7
  from torch import cuda
8
  from transformers import AutoModelForCausalLM, AutoTokenizer
9
 
10
+ from hashlib import sha256
11
  from huggingface_hub import login
12
  from dotenv import load_dotenv
13
+
14
  import os
15
  import uvicorn
16
+ import time
17
  import logging
18
+
19
  # Configure logging
20
  logging.basicConfig(level=logging.INFO)
21
  logger = logging.getLogger(__name__)
 
29
  # Configurable model identifier
30
  model_name = os.getenv("HF_MODEL", "swiss-ai/Apertus-8B-Instruct-2509")
31
 
32
+ # Configure max tokens
33
+ MAX_NEW_TOKENS = 4096
34
+
35
  # Keep data in session
36
  model = None
37
  tokenizer = None
38
 
39
  class TextInput(BaseModel):
40
+ text: str = ""
41
  min_length: int = 3
42
  # Apertus by default supports a context length up to 65,536 tokens.
43
  max_length: int = 65536
 
48
  processing_time: float
49
 
50
  class ChatMessage(BaseModel):
51
+ role: str = "user"
52
+ content: str = ""
53
 
54
  class Completion(BaseModel):
55
  model: str = "apertus"
 
123
  return txt
124
 
125
 
126
+ def get_message_id(txt: str):
127
+ return sha256(str(txt).encode()).hexdigest()
128
+
129
+
130
  def get_model_reponse(messages_think: List[ChatMessage]):
131
  """Process the text content."""
132
 
 
147
  # Generate the output
148
  generated_ids = model.generate(
149
  **model_inputs,
150
+ max_new_tokens=MAX_NEW_TOKENS
151
  )
152
 
153
  # Get and decode the output
154
  output_ids = generated_ids[0][len(model_inputs.input_ids[0]) :]
155
 
156
+ # Decode the text message
157
  return tokenizer.decode(output_ids, skip_special_tokens=True)
158
 
159
 
 
168
  text = get_completion_text(mt)
169
  result = get_model_reponse(mt)
170
 
171
+ # Standard formatted object
172
  return {
173
+ "id": get_message_id(text),
174
+ "object": "chat.completion",
175
+ "created": time.time(),
176
+ "model": data.model,
177
+ "choices": [{
178
+ "message": ChatMessage(role="assistant", content=result)
179
+ }],
 
180
  "usage": {
181
  "prompt_tokens": len(text),
182
  "completion_tokens": len(result),
 
195
  raise HTTPException(status_code=503, detail="Model not loaded")
196
 
197
  try:
 
198
  start_time = time.time()
199
 
200
  input_data = TextInput(text=q)
pyproject.toml CHANGED
@@ -12,4 +12,9 @@ dependencies = [
12
  "torch>=2.8.0",
13
  "transformers>=4.56.0",
14
  "compressed-tensors>=0.11.0",
 
 
15
  ]
 
 
 
 
12
  "torch>=2.8.0",
13
  "transformers>=4.56.0",
14
  "compressed-tensors>=0.11.0",
15
+ "numpy>=2.3.2",
16
+ "xielu",
17
  ]
18
+
19
+ [tool.uv.sources]
20
+ xielu = { git = "https://github.com/nickjbrowning/XIELU" }
uv.lock CHANGED
@@ -139,6 +139,7 @@ dependencies = [
139
  { name = "accelerate" },
140
  { name = "compressed-tensors" },
141
  { name = "fastapi" },
 
142
  { name = "pydantic" },
143
  { name = "torch" },
144
  { name = "transformers" },
@@ -150,6 +151,7 @@ requires-dist = [
150
  { name = "accelerate", specifier = ">=1.10" },
151
  { name = "compressed-tensors", specifier = ">=0.11.0" },
152
  { name = "fastapi", specifier = ">=0.116" },
 
153
  { name = "pydantic", specifier = ">=2.11" },
154
  { name = "torch", specifier = ">=2.8.0" },
155
  { name = "transformers", specifier = ">=4.56.0" },
 
139
  { name = "accelerate" },
140
  { name = "compressed-tensors" },
141
  { name = "fastapi" },
142
+ { name = "numpy" },
143
  { name = "pydantic" },
144
  { name = "torch" },
145
  { name = "transformers" },
 
151
  { name = "accelerate", specifier = ">=1.10" },
152
  { name = "compressed-tensors", specifier = ">=0.11.0" },
153
  { name = "fastapi", specifier = ">=0.116" },
154
+ { name = "numpy", specifier = ">=2.3.2" },
155
  { name = "pydantic", specifier = ">=2.11" },
156
  { name = "torch", specifier = ">=2.8.0" },
157
  { name = "transformers", specifier = ">=4.56.0" },