plugin-ai-api 1.0.28 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/97.1bc5103fd9d995a8.js +10 -0
- package/dist/client/index.js +1 -1
- package/dist/client-v2/97.96da323832251796.js +10 -0
- package/dist/client-v2/index.js +1 -1
- package/dist/externalVersion.js +8 -8
- package/dist/locale/en-US.json +139 -138
- package/dist/locale/vi-VN.json +139 -138
- package/dist/locale/zh-CN.json +139 -138
- package/dist/server/billing.js +17 -9
- package/dist/server/collections/ai-api-model-prices.js +8 -0
- package/dist/server/collections/ai-api-usage-records.js +1 -0
- package/dist/server/migrations/20260827000000-add-cache-input-price.js +66 -0
- package/dist/server/routes/auth.js +16 -0
- package/dist/server/routes/embeddings.js +11 -1
- package/dist/server/usage.js +1 -0
- package/dist/server/utils/direct-llm-context.js +9 -8
- package/dist/server/validation.js +1 -0
- package/package.json +1 -1
- package/src/client/index.tsx +10 -10
- package/src/client/models/index.ts +12 -12
- package/src/client-v2/pages/ModelPricingPage.tsx +15 -0
- package/src/index.ts +11 -11
- package/src/locale/en-US.json +139 -138
- package/src/locale/vi-VN.json +139 -138
- package/src/locale/zh-CN.json +139 -138
- package/src/server/__tests__/billing-quota.test.ts +8 -2
- package/src/server/__tests__/billing.test.ts +13 -0
- package/src/server/__tests__/usage.test.ts +1 -0
- package/src/server/billing.ts +29 -6
- package/src/server/collections/ai-api-model-prices.ts +8 -0
- package/src/server/collections/ai-api-usage-records.ts +1 -0
- package/src/server/migrations/20260827000000-add-cache-input-price.ts +49 -0
- package/src/server/routes/auth.ts +21 -1
- package/src/server/routes/embeddings.ts +17 -3
- package/src/server/usage.ts +1 -0
- package/src/server/utils/direct-llm-context.ts +21 -11
- package/src/server/validation.ts +1 -0
- package/dist/client/97.9b6b2d2b01a4c060.js +0 -10
- package/dist/client-v2/97.36a42eff36bb3d8a.js +0 -10
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Context } from '@nocobase/actions';
|
|
2
|
-
import { resolveRequestUserGroup } from './request-cache';
|
|
2
|
+
import { getAiApiConfig, resolveRequestUserGroup } from './request-cache';
|
|
3
3
|
|
|
4
4
|
export type ContextOverflowBehavior = 'reject' | 'truncate';
|
|
5
5
|
|
|
@@ -39,8 +39,7 @@ export class DirectLlmContextError extends Error {
|
|
|
39
39
|
readonly code:
|
|
40
40
|
| 'context_length_exceeded'
|
|
41
41
|
| 'context_estimation_unsupported'
|
|
42
|
-
| 'max_completion_tokens_exceeds_model_limit'
|
|
43
|
-
| 'model_context_metadata_not_configured',
|
|
42
|
+
| 'max_completion_tokens_exceeds_model_limit',
|
|
44
43
|
message: string,
|
|
45
44
|
) {
|
|
46
45
|
super(message);
|
|
@@ -297,18 +296,29 @@ function messagesWithTurns(messages: OpenAIMessage[], turns: OpenAIMessage[][]):
|
|
|
297
296
|
return messages.filter((message) => isInstruction(message) || retainedMessages.has(message));
|
|
298
297
|
}
|
|
299
298
|
|
|
299
|
+
/**
|
|
300
|
+
* Gateway-wide context budget used when a model has no metadata override (or a
|
|
301
|
+
* partial one). Direct LLM mode must work out of the box for every model; the
|
|
302
|
+
* metadata table is an override mechanism, not a prerequisite. Providers still
|
|
303
|
+
* reject requests that exceed their real window, and admins can tighten the
|
|
304
|
+
* budget per model by adding a metadata row.
|
|
305
|
+
*/
|
|
306
|
+
export const DEFAULT_CONTEXT_WINDOW = 128_000;
|
|
307
|
+
export const DEFAULT_MAX_COMPLETION_TOKENS = 8_192;
|
|
308
|
+
|
|
300
309
|
async function loadModelMetadata(ctx: Context, serviceName: string, modelId: string): Promise<ModelMetadata> {
|
|
301
310
|
const row = await ctx.db.getRepository('aiApiModelMetadata').findOne({
|
|
302
311
|
filter: { llmService: serviceName, model: modelId, enabled: true },
|
|
303
312
|
});
|
|
304
|
-
const
|
|
305
|
-
const
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
)
|
|
311
|
-
|
|
313
|
+
const config = await getAiApiConfig(ctx);
|
|
314
|
+
const contextWindow =
|
|
315
|
+
positiveInteger(getValue<unknown>(row, 'contextWindow')) ??
|
|
316
|
+
positiveInteger(getValue<unknown>(config, 'defaultContextWindow')) ??
|
|
317
|
+
DEFAULT_CONTEXT_WINDOW;
|
|
318
|
+
const maxCompletionTokens =
|
|
319
|
+
positiveInteger(getValue<unknown>(row, 'maxCompletionTokens')) ??
|
|
320
|
+
positiveInteger(getValue<unknown>(config, 'defaultMaxCompletionTokens')) ??
|
|
321
|
+
DEFAULT_MAX_COMPLETION_TOKENS;
|
|
312
322
|
const systemPromptValue = getValue<unknown>(row, 'systemPrompt');
|
|
313
323
|
const systemPrompt = typeof systemPromptValue === 'string' ? systemPromptValue.trim() : '';
|
|
314
324
|
return { contextWindow, maxCompletionTokens, ...(systemPrompt ? { systemPrompt } : {}) };
|
package/src/server/validation.ts
CHANGED
|
@@ -16,6 +16,7 @@ function requireNonNegativeIntegerOrNull(value: unknown, field: string): void {
|
|
|
16
16
|
|
|
17
17
|
export async function validateModelPrice(db: Database, model: Model): Promise<void> {
|
|
18
18
|
requireNonNegativeDecimal(model.get('inputPricePerMillionTokens'), 'inputPricePerMillionTokens');
|
|
19
|
+
requireNonNegativeDecimal(model.get('cacheInputPricePerMillionTokens') ?? 0, 'cacheInputPricePerMillionTokens');
|
|
19
20
|
requireNonNegativeDecimal(model.get('outputPricePerMillionTokens'), 'outputPricePerMillionTokens');
|
|
20
21
|
requireNonNegativeDecimal(model.get('fixedCostPerRequest') ?? 0, 'fixedCostPerRequest');
|
|
21
22
|
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This file is part of the NocoBase (R) project.
|
|
3
|
-
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
-
* Authors: NocoBase Team.
|
|
5
|
-
*
|
|
6
|
-
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
-
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
"use strict";(self.webpackChunkplugin_ai_api=self.webpackChunkplugin_ai_api||[]).push([["97"],{760:function(e,t,r){r.r(t),r.d(t,{default:function(){return g}});var n=r(155),o=r.n(n),i=r(59),l=r(185),a=r.n(l),u=r(694),c=r(650),s=r(630);function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}function f(e,t,r,n,o,i,l){try{var a=e[i](l),u=a.value}catch(e){r(e);return}a.done?t(u):Promise.resolve(u).then(n,o)}function d(e){return function(){var t=this,r=arguments;return new Promise(function(n,o){var i=e.apply(t,r);function l(e){f(i,n,o,l,a,"next",e)}function a(e){f(i,n,o,l,a,"throw",e)}l(void 0)})}}function p(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}function y(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t.push.apply(t,r)}return t})(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}),e}function b(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r,n,o=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],l=!0,a=!1;try{for(o=o.call(e);!(l=(r=o.next()).done)&&(i.push(r.value),!t||i.length!==t);l=!0);}catch(e){a=!0,n=e}finally{try{l||null==o.return||o.return()}finally{if(a)throw n}}return i}}(e,t)||v(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function v(e,t){if(e){if("string"==typeof e)return m(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);if("Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r)return Array.from(r);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return m(e,t)}}function h(e,t){var r,n,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},l=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),a=Object.defineProperty;return a(l,"next",{value:u(0)}),a(l,"throw",{value:u(1)}),a(l,"return",{value:u(2)}),"function"==typeof Symbol&&a(l,Symbol.iterator,{value:function(){return this}}),l;function u(a){return function(u){var c=[a,u];if(r)throw TypeError("Generator is already executing.");for(;l&&(l=0,c[0]&&(i=0)),i;)try{if(r=1,n&&(o=2&c[0]?n.return:c[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,c[1])).done)return o;switch(n=0,o&&(c=[2&c[0],o.value]),c[0]){case 0:case 1:o=c;break;case 4:return i.label++,{value:c[1],done:!1};case 5:i.label++,n=c[1],c=[0];continue;case 7:c=i.ops.pop(),i.trys.pop();continue;default:if(!(o=(o=i.trys).length>0&&o[o.length-1])&&(6===c[0]||2===c[0])){i=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]<o[3])){i.label=c[1];break}if(6===c[0]&&i.label<o[1]){i.label=o[1],o=c;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(c);break}o[2]&&i.ops.pop(),i.trys.pop();continue}c=t.call(e,i)}catch(e){c=[6,e],n=0}finally{r=o=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}function g(){var e=(0,u.useFlowContext)(),t=(0,c.k)(),r=b(i.Form.useForm(),1)[0],l=i.Form.useWatch("llmService",r),f=b((0,n.useState)([]),2),g=f[0],S=f[1],w=b((0,n.useState)([]),2),E=w[0],P=w[1],I=b((0,n.useState)([]),2),k=I[0],O=I[1],F=b((0,n.useState)(!1),2),M=F[0],x=F[1],j=b((0,n.useState)(!1),2),T=j[0],C=j[1],q=b((0,n.useState)(!1),2),A=q[0],D=q[1],L=b((0,n.useState)(),2),N=L[0],U=L[1],_=b((0,n.useState)(!1),2),B=_[0],R=_[1],V=(0,n.useCallback)(function(){return d(function(){var t,r,n,o;return h(this,function(l){switch(l.label){case 0:C(!0),l.label=1;case 1:return l.trys.push([1,3,4,5]),[4,Promise.all([e.api.request({url:"aiApiModelPrices:list",method:"get",params:{pageSize:200,sort:"-effectiveFrom"}}),e.api.request({url:"ai:listLLMServices",method:"get"})])];case 2:return r=(t=b.apply(void 0,[l.sent(),2]))[0],n=t[1],S((0,s.m)(r,[])),P((0,s.m)(n,[])),[3,5];case 3:return o=l.sent(),i.message.error((0,s.g)(o)),[3,5];case 4:return C(!1),[7];case 5:return[2]}})})()},[e.api]);(0,n.useEffect)(function(){V()},[V]);var z=function(e){U(e),r.setFieldsValue(y(p({},e),{effectiveFrom:a()(e.effectiveFrom),effectiveTo:e.effectiveTo?a()(e.effectiveTo):void 0})),R(!0),G(e.llmService,e.model)},G=function(r,n){return d(function(){var o,l,a;return h(this,function(u){switch(u.label){case 0:x(!0),u.label=1;case 1:return u.trys.push([1,3,4,5]),[4,e.api.request({url:"ai:listModels",method:"get",params:{llmService:r}})];case 2:return o=u.sent(),l=(0,s.m)(o,[]),O(n&&!l.some(function(e){return e.id===n})?[{id:n}].concat(function(e){if(Array.isArray(e))return m(e)}(l)||function(e){if("u">typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(l)||v(l)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()):l),[3,5];case 3:return a=u.sent(),O(n?[{id:n}]:[]),i.message.error("".concat(t("Failed to load models"),": ").concat((0,s.g)(a))),[3,5];case 4:return x(!1),[7];case 5:return[2]}})})()},J=[{title:t("LLM service"),dataIndex:"llmService",key:"llmService",width:180},{title:t("Model"),dataIndex:"model",key:"model",width:180},{title:t("Input price / 1M"),dataIndex:"inputPricePerMillionTokens",key:"inputPrice",width:150},{title:t("Output price / 1M"),dataIndex:"outputPricePerMillionTokens",key:"outputPrice",width:150},{title:t("Fixed request cost"),dataIndex:"fixedCostPerRequest",key:"fixedCost",width:150},{title:t("Currency"),dataIndex:"currency",key:"currency",width:90},{title:t("Status"),dataIndex:"enabled",key:"enabled",width:100,render:function(e){return o().createElement(i.Tag,{color:e?"green":"default"},e?t("Enabled"):t("Disabled"))}},{title:t("Actions"),key:"actions",fixed:"right",width:150,render:function(r,n){return o().createElement(i.Space,null,o().createElement(i.Button,{type:"link",onClick:function(){return z(n)}},t("Edit")),o().createElement(i.Popconfirm,{title:t("Delete this price?"),onConfirm:function(){var r;return r=n.id,d(function(){var n;return h(this,function(o){switch(o.label){case 0:return o.trys.push([0,3,,4]),[4,e.api.request({url:"aiApiModelPrices:destroy/".concat(r),method:"post"})];case 1:return o.sent(),i.message.success(t("Deleted successfully")),[4,V()];case 2:return o.sent(),[3,4];case 3:return n=o.sent(),i.message.error((0,s.g)(n)),[3,4];case 4:return[2]}})})()}},o().createElement(i.Button,{type:"link",danger:!0},t("Delete"))))}}];return o().createElement(i.Card,{title:t("Model pricing"),extra:o().createElement(i.Button,{type:"primary",onClick:function(){U(void 0),O([]),r.setFieldsValue({currency:"USD",inputPricePerMillionTokens:"0",outputPricePerMillionTokens:"0",fixedCostPerRequest:"0",effectiveFrom:a()(),enabled:!0}),R(!0)}},t("Add price"))},o().createElement(i.Table,{rowKey:"id",columns:J,dataSource:g,loading:T,scroll:{x:1200}}),o().createElement(i.Modal,{title:N?t("Edit price"):t("Add price"),open:B,onCancel:function(){return R(!1)},onOk:function(){return d(function(){var n,o,l,a,u,c,m;return h(this,function(f){switch(f.label){case 0:return[4,r.validateFields()];case 1:a=f.sent(),u=E.find(function(e){return e.name===a.llmService}),c=y(p({},a),{provider:null!=(n=null==u?void 0:u.provider)?n:a.provider,effectiveFrom:a.effectiveFrom.toISOString(),effectiveTo:null!=(o=null==(l=a.effectiveTo)?void 0:l.toISOString())?o:null}),D(!0),f.label=2;case 2:return f.trys.push([2,5,6,7]),[4,e.api.request({url:N?"aiApiModelPrices:update/".concat(N.id):"aiApiModelPrices:create",method:"post",data:c})];case 3:return f.sent(),i.message.success(t("Saved successfully")),R(!1),[4,V()];case 4:return f.sent(),[3,7];case 5:return m=f.sent(),i.message.error((0,s.g)(m)),[3,7];case 6:return D(!1),[7];case 7:return[2]}})})()},confirmLoading:A,destroyOnClose:!0},o().createElement(i.Form,{form:r,layout:"vertical",preserve:!1},o().createElement(i.Form.Item,{name:"llmService",label:t("LLM service"),rules:[{required:!0}]},o().createElement(i.Select,{showSearch:!0,optionFilterProp:"label",onChange:function(e){r.setFieldValue("model",void 0),O([]),G(e)},options:E.map(function(e){return{label:e.title||e.name,value:e.name}})})),o().createElement(i.Form.Item,{name:"provider",hidden:!0},o().createElement(i.Input,null)),o().createElement(i.Form.Item,{name:"model",label:t("Model"),rules:[{required:!0}]},o().createElement(i.Select,{showSearch:!0,optionFilterProp:"label",loading:M,disabled:!l,placeholder:t("Select a model"),options:k.map(function(e){return{label:e.id,value:e.id}})})),o().createElement(i.Form.Item,{name:"currency",label:t("Currency"),rules:[{required:!0}]},o().createElement(i.Input,null)),o().createElement(i.Form.Item,{name:"inputPricePerMillionTokens",label:t("Input price / 1M"),rules:[{required:!0}]},o().createElement(i.InputNumber,{min:0,stringMode:!0,style:{width:"100%"}})),o().createElement(i.Form.Item,{name:"outputPricePerMillionTokens",label:t("Output price / 1M"),rules:[{required:!0}]},o().createElement(i.InputNumber,{min:0,stringMode:!0,style:{width:"100%"}})),o().createElement(i.Form.Item,{name:"fixedCostPerRequest",label:t("Fixed request cost"),rules:[{required:!0}]},o().createElement(i.InputNumber,{min:0,stringMode:!0,style:{width:"100%"}})),o().createElement(i.Form.Item,{name:"effectiveFrom",label:t("Effective from"),rules:[{required:!0}]},o().createElement(i.DatePicker,{showTime:!0,style:{width:"100%"}})),o().createElement(i.Form.Item,{name:"effectiveTo",label:t("Effective to")},o().createElement(i.DatePicker,{showTime:!0,style:{width:"100%"}})),o().createElement(i.Form.Item,{name:"enabled",label:t("Enabled"),valuePropName:"checked"},o().createElement(i.Switch,null)),o().createElement(i.Form.Item,{name:"notes",label:t("Notes")},o().createElement(i.Input.TextArea,{rows:3})))))}},650:function(e,t,r){r.d(t,{k:function(){return l}});var n=r(155),o=r(694),i=JSON.parse('{"UU":"plugin-ai-api"}');function l(){var e=(0,o.useFlowEngine)();return(0,n.useCallback)(function(t){return e.context.t(t,{ns:[i.UU,"client"]})},[e])}},630:function(e,t,r){function n(e,t){var r,n;return e&&(void 0===e?"undefined":e&&"u">typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)=="object"?null!=(r=null==(n=e.data)?void 0:n.data)?r:t:t}function o(e){var t;return(null!=(t=Error)&&"u">typeof Symbol&&t[Symbol.hasInstance]?!!t[Symbol.hasInstance](e):e instanceof t)?e.message:String(e)}r.d(t,{g:function(){return o},m:function(){return n}})}}]);
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This file is part of the NocoBase (R) project.
|
|
3
|
-
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
-
* Authors: NocoBase Team.
|
|
5
|
-
*
|
|
6
|
-
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
-
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
"use strict";(self.webpackChunkplugin_ai_api_client_v2=self.webpackChunkplugin_ai_api_client_v2||[]).push([["97"],{760:function(e,t,r){r.r(t),r.d(t,{default:function(){return g}});var n=r(155),o=r.n(n),i=r(59),l=r(185),a=r.n(l),u=r(694),c=r(650),s=r(630);function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}function f(e,t,r,n,o,i,l){try{var a=e[i](l),u=a.value}catch(e){r(e);return}a.done?t(u):Promise.resolve(u).then(n,o)}function d(e){return function(){var t=this,r=arguments;return new Promise(function(n,o){var i=e.apply(t,r);function l(e){f(i,n,o,l,a,"next",e)}function a(e){f(i,n,o,l,a,"throw",e)}l(void 0)})}}function p(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}function y(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t.push.apply(t,r)}return t})(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}),e}function b(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r,n,o=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],l=!0,a=!1;try{for(o=o.call(e);!(l=(r=o.next()).done)&&(i.push(r.value),!t||i.length!==t);l=!0);}catch(e){a=!0,n=e}finally{try{l||null==o.return||o.return()}finally{if(a)throw n}}return i}}(e,t)||v(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function v(e,t){if(e){if("string"==typeof e)return m(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);if("Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r)return Array.from(r);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return m(e,t)}}function h(e,t){var r,n,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},l=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),a=Object.defineProperty;return a(l,"next",{value:u(0)}),a(l,"throw",{value:u(1)}),a(l,"return",{value:u(2)}),"function"==typeof Symbol&&a(l,Symbol.iterator,{value:function(){return this}}),l;function u(a){return function(u){var c=[a,u];if(r)throw TypeError("Generator is already executing.");for(;l&&(l=0,c[0]&&(i=0)),i;)try{if(r=1,n&&(o=2&c[0]?n.return:c[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,c[1])).done)return o;switch(n=0,o&&(c=[2&c[0],o.value]),c[0]){case 0:case 1:o=c;break;case 4:return i.label++,{value:c[1],done:!1};case 5:i.label++,n=c[1],c=[0];continue;case 7:c=i.ops.pop(),i.trys.pop();continue;default:if(!(o=(o=i.trys).length>0&&o[o.length-1])&&(6===c[0]||2===c[0])){i=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]<o[3])){i.label=c[1];break}if(6===c[0]&&i.label<o[1]){i.label=o[1],o=c;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(c);break}o[2]&&i.ops.pop(),i.trys.pop();continue}c=t.call(e,i)}catch(e){c=[6,e],n=0}finally{r=o=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}function g(){var e=(0,u.useFlowContext)(),t=(0,c.k)(),r=b(i.Form.useForm(),1)[0],l=i.Form.useWatch("llmService",r),f=b((0,n.useState)([]),2),g=f[0],S=f[1],w=b((0,n.useState)([]),2),E=w[0],P=w[1],I=b((0,n.useState)([]),2),k=I[0],O=I[1],F=b((0,n.useState)(!1),2),M=F[0],x=F[1],j=b((0,n.useState)(!1),2),T=j[0],C=j[1],q=b((0,n.useState)(!1),2),A=q[0],D=q[1],_=b((0,n.useState)(),2),L=_[0],N=_[1],U=b((0,n.useState)(!1),2),B=U[0],R=U[1],V=(0,n.useCallback)(function(){return d(function(){var t,r,n,o;return h(this,function(l){switch(l.label){case 0:C(!0),l.label=1;case 1:return l.trys.push([1,3,4,5]),[4,Promise.all([e.api.request({url:"aiApiModelPrices:list",method:"get",params:{pageSize:200,sort:"-effectiveFrom"}}),e.api.request({url:"ai:listLLMServices",method:"get"})])];case 2:return r=(t=b.apply(void 0,[l.sent(),2]))[0],n=t[1],S((0,s.m)(r,[])),P((0,s.m)(n,[])),[3,5];case 3:return o=l.sent(),i.message.error((0,s.g)(o)),[3,5];case 4:return C(!1),[7];case 5:return[2]}})})()},[e.api]);(0,n.useEffect)(function(){V()},[V]);var z=function(e){N(e),r.setFieldsValue(y(p({},e),{effectiveFrom:a()(e.effectiveFrom),effectiveTo:e.effectiveTo?a()(e.effectiveTo):void 0})),R(!0),G(e.llmService,e.model)},G=function(r,n){return d(function(){var o,l,a;return h(this,function(u){switch(u.label){case 0:x(!0),u.label=1;case 1:return u.trys.push([1,3,4,5]),[4,e.api.request({url:"ai:listModels",method:"get",params:{llmService:r}})];case 2:return o=u.sent(),l=(0,s.m)(o,[]),O(n&&!l.some(function(e){return e.id===n})?[{id:n}].concat(function(e){if(Array.isArray(e))return m(e)}(l)||function(e){if("u">typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(l)||v(l)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()):l),[3,5];case 3:return a=u.sent(),O(n?[{id:n}]:[]),i.message.error("".concat(t("Failed to load models"),": ").concat((0,s.g)(a))),[3,5];case 4:return x(!1),[7];case 5:return[2]}})})()},J=[{title:t("LLM service"),dataIndex:"llmService",key:"llmService",width:180},{title:t("Model"),dataIndex:"model",key:"model",width:180},{title:t("Input price / 1M"),dataIndex:"inputPricePerMillionTokens",key:"inputPrice",width:150},{title:t("Output price / 1M"),dataIndex:"outputPricePerMillionTokens",key:"outputPrice",width:150},{title:t("Fixed request cost"),dataIndex:"fixedCostPerRequest",key:"fixedCost",width:150},{title:t("Currency"),dataIndex:"currency",key:"currency",width:90},{title:t("Status"),dataIndex:"enabled",key:"enabled",width:100,render:function(e){return o().createElement(i.Tag,{color:e?"green":"default"},e?t("Enabled"):t("Disabled"))}},{title:t("Actions"),key:"actions",fixed:"right",width:150,render:function(r,n){return o().createElement(i.Space,null,o().createElement(i.Button,{type:"link",onClick:function(){return z(n)}},t("Edit")),o().createElement(i.Popconfirm,{title:t("Delete this price?"),onConfirm:function(){var r;return r=n.id,d(function(){var n;return h(this,function(o){switch(o.label){case 0:return o.trys.push([0,3,,4]),[4,e.api.request({url:"aiApiModelPrices:destroy/".concat(r),method:"post"})];case 1:return o.sent(),i.message.success(t("Deleted successfully")),[4,V()];case 2:return o.sent(),[3,4];case 3:return n=o.sent(),i.message.error((0,s.g)(n)),[3,4];case 4:return[2]}})})()}},o().createElement(i.Button,{type:"link",danger:!0},t("Delete"))))}}];return o().createElement(i.Card,{title:t("Model pricing"),extra:o().createElement(i.Button,{type:"primary",onClick:function(){N(void 0),O([]),r.setFieldsValue({currency:"USD",inputPricePerMillionTokens:"0",outputPricePerMillionTokens:"0",fixedCostPerRequest:"0",effectiveFrom:a()(),enabled:!0}),R(!0)}},t("Add price"))},o().createElement(i.Table,{rowKey:"id",columns:J,dataSource:g,loading:T,scroll:{x:1200}}),o().createElement(i.Modal,{title:L?t("Edit price"):t("Add price"),open:B,onCancel:function(){return R(!1)},onOk:function(){return d(function(){var n,o,l,a,u,c,m;return h(this,function(f){switch(f.label){case 0:return[4,r.validateFields()];case 1:a=f.sent(),u=E.find(function(e){return e.name===a.llmService}),c=y(p({},a),{provider:null!=(n=null==u?void 0:u.provider)?n:a.provider,effectiveFrom:a.effectiveFrom.toISOString(),effectiveTo:null!=(o=null==(l=a.effectiveTo)?void 0:l.toISOString())?o:null}),D(!0),f.label=2;case 2:return f.trys.push([2,5,6,7]),[4,e.api.request({url:L?"aiApiModelPrices:update/".concat(L.id):"aiApiModelPrices:create",method:"post",data:c})];case 3:return f.sent(),i.message.success(t("Saved successfully")),R(!1),[4,V()];case 4:return f.sent(),[3,7];case 5:return m=f.sent(),i.message.error((0,s.g)(m)),[3,7];case 6:return D(!1),[7];case 7:return[2]}})})()},confirmLoading:A,destroyOnClose:!0},o().createElement(i.Form,{form:r,layout:"vertical",preserve:!1},o().createElement(i.Form.Item,{name:"llmService",label:t("LLM service"),rules:[{required:!0}]},o().createElement(i.Select,{showSearch:!0,optionFilterProp:"label",onChange:function(e){r.setFieldValue("model",void 0),O([]),G(e)},options:E.map(function(e){return{label:e.title||e.name,value:e.name}})})),o().createElement(i.Form.Item,{name:"provider",hidden:!0},o().createElement(i.Input,null)),o().createElement(i.Form.Item,{name:"model",label:t("Model"),rules:[{required:!0}]},o().createElement(i.Select,{showSearch:!0,optionFilterProp:"label",loading:M,disabled:!l,placeholder:t("Select a model"),options:k.map(function(e){return{label:e.id,value:e.id}})})),o().createElement(i.Form.Item,{name:"currency",label:t("Currency"),rules:[{required:!0}]},o().createElement(i.Input,null)),o().createElement(i.Form.Item,{name:"inputPricePerMillionTokens",label:t("Input price / 1M"),rules:[{required:!0}]},o().createElement(i.InputNumber,{min:0,stringMode:!0,style:{width:"100%"}})),o().createElement(i.Form.Item,{name:"outputPricePerMillionTokens",label:t("Output price / 1M"),rules:[{required:!0}]},o().createElement(i.InputNumber,{min:0,stringMode:!0,style:{width:"100%"}})),o().createElement(i.Form.Item,{name:"fixedCostPerRequest",label:t("Fixed request cost"),rules:[{required:!0}]},o().createElement(i.InputNumber,{min:0,stringMode:!0,style:{width:"100%"}})),o().createElement(i.Form.Item,{name:"effectiveFrom",label:t("Effective from"),rules:[{required:!0}]},o().createElement(i.DatePicker,{showTime:!0,style:{width:"100%"}})),o().createElement(i.Form.Item,{name:"effectiveTo",label:t("Effective to")},o().createElement(i.DatePicker,{showTime:!0,style:{width:"100%"}})),o().createElement(i.Form.Item,{name:"enabled",label:t("Enabled"),valuePropName:"checked"},o().createElement(i.Switch,null)),o().createElement(i.Form.Item,{name:"notes",label:t("Notes")},o().createElement(i.Input.TextArea,{rows:3})))))}},650:function(e,t,r){r.d(t,{k:function(){return l}});var n=r(155),o=r(694),i=JSON.parse('{"UU":"plugin-ai-api"}');function l(){var e=(0,o.useFlowEngine)();return(0,n.useCallback)(function(t){return e.context.t(t,{ns:[i.UU,"client"]})},[e])}},630:function(e,t,r){function n(e,t){var r,n;return e&&(void 0===e?"undefined":e&&"u">typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)=="object"?null!=(r=null==(n=e.data)?void 0:n.data)?r:t:t}function o(e){var t;return(null!=(t=Error)&&"u">typeof Symbol&&t[Symbol.hasInstance]?!!t[Symbol.hasInstance](e):e instanceof t)?e.message:String(e)}r.d(t,{g:function(){return o},m:function(){return n}})}}]);
|