@planet-matrix/mobius-model 0.6.0 → 0.10.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/CHANGELOG.md +50 -0
- package/oxlint.config.ts +1 -2
- package/package.json +29 -17
- package/scripts/build.ts +2 -52
- package/src/ai/README.md +1 -0
- package/src/ai/ai.ts +107 -0
- package/src/ai/chat-completion-ai/aihubmix-chat-completion.ts +78 -0
- package/src/ai/chat-completion-ai/chat-completion-ai.ts +270 -0
- package/src/ai/chat-completion-ai/chat-completion.ts +189 -0
- package/src/ai/chat-completion-ai/index.ts +7 -0
- package/src/ai/chat-completion-ai/lingyiwanwu-chat-completion.ts +78 -0
- package/src/ai/chat-completion-ai/ohmygpt-chat-completion.ts +78 -0
- package/src/ai/chat-completion-ai/openai-next-chat-completion.ts +78 -0
- package/src/ai/embedding-ai/embedding-ai.ts +63 -0
- package/src/ai/embedding-ai/embedding.ts +50 -0
- package/src/ai/embedding-ai/index.ts +4 -0
- package/src/ai/embedding-ai/openai-next-embedding.ts +23 -0
- package/src/ai/index.ts +4 -0
- package/src/aio/README.md +100 -0
- package/src/aio/content.ts +141 -0
- package/src/aio/index.ts +3 -0
- package/src/aio/json.ts +127 -0
- package/src/aio/prompt.ts +246 -0
- package/src/basic/README.md +20 -15
- package/src/basic/error.ts +19 -5
- package/src/basic/function.ts +2 -2
- package/src/basic/index.ts +1 -0
- package/src/basic/promise.ts +141 -71
- package/src/basic/schedule.ts +111 -0
- package/src/basic/stream.ts +135 -25
- package/src/credential/README.md +107 -0
- package/src/credential/api-key.ts +158 -0
- package/src/credential/bearer.ts +73 -0
- package/src/credential/index.ts +4 -0
- package/src/credential/json-web-token.ts +96 -0
- package/src/credential/password.ts +170 -0
- package/src/cron/README.md +86 -0
- package/src/cron/cron.ts +87 -0
- package/src/cron/index.ts +1 -0
- package/src/drizzle/README.md +1 -0
- package/src/drizzle/drizzle.ts +1 -0
- package/src/drizzle/helper.ts +47 -0
- package/src/drizzle/index.ts +5 -0
- package/src/drizzle/infer.ts +52 -0
- package/src/drizzle/kysely.ts +8 -0
- package/src/drizzle/pagination.ts +198 -0
- package/src/email/README.md +1 -0
- package/src/email/index.ts +1 -0
- package/src/email/resend.ts +25 -0
- package/src/event/class-event-proxy.ts +5 -6
- package/src/event/common.ts +13 -3
- package/src/event/event-manager.ts +3 -3
- package/src/event/instance-event-proxy.ts +5 -6
- package/src/event/internal.ts +4 -4
- package/src/exception/README.md +28 -19
- package/src/exception/error/error.ts +123 -0
- package/src/exception/error/index.ts +2 -0
- package/src/exception/error/match.ts +38 -0
- package/src/exception/error/must-fix.ts +17 -0
- package/src/exception/index.ts +2 -0
- package/src/file-system/find.ts +53 -0
- package/src/file-system/index.ts +2 -0
- package/src/file-system/path.ts +76 -0
- package/src/file-system/resolve.ts +22 -0
- package/src/form/README.md +25 -0
- package/src/form/index.ts +1 -0
- package/src/form/inputor-controller/base.ts +861 -0
- package/src/form/inputor-controller/boolean.ts +39 -0
- package/src/form/inputor-controller/file.ts +39 -0
- package/src/form/inputor-controller/form.ts +179 -0
- package/src/form/inputor-controller/helper.ts +117 -0
- package/src/form/inputor-controller/index.ts +17 -0
- package/src/form/inputor-controller/multi-select.ts +99 -0
- package/src/form/inputor-controller/number.ts +116 -0
- package/src/form/inputor-controller/select.ts +109 -0
- package/src/form/inputor-controller/text.ts +82 -0
- package/src/http/READMD.md +1 -0
- package/src/http/api/api-core.ts +84 -0
- package/src/http/api/api-handler.ts +79 -0
- package/src/http/api/api-host.ts +47 -0
- package/src/http/api/api-result.ts +56 -0
- package/src/http/api/api-schema.ts +154 -0
- package/src/http/api/api-server.ts +130 -0
- package/src/http/api/api-test.ts +142 -0
- package/src/http/api/api-type.ts +34 -0
- package/src/http/api/api.ts +81 -0
- package/src/http/api/index.ts +11 -0
- package/src/http/api-adapter/api-core-node-http.ts +260 -0
- package/src/http/api-adapter/api-host-node-http.ts +156 -0
- package/src/http/api-adapter/api-result-arktype.ts +294 -0
- package/src/http/api-adapter/api-result-zod.ts +286 -0
- package/src/http/api-adapter/index.ts +5 -0
- package/src/http/bin/gen-api-list/gen-api-list.ts +126 -0
- package/src/http/bin/gen-api-list/index.ts +1 -0
- package/src/http/bin/gen-api-test/gen-api-test.ts +136 -0
- package/src/http/bin/gen-api-test/index.ts +1 -0
- package/src/http/bin/gen-api-type/calc-code.ts +25 -0
- package/src/http/bin/gen-api-type/gen-api-type.ts +127 -0
- package/src/http/bin/gen-api-type/index.ts +2 -0
- package/src/http/bin/index.ts +2 -0
- package/src/http/index.ts +3 -0
- package/src/huawei/README.md +1 -0
- package/src/huawei/index.ts +2 -0
- package/src/huawei/moderation/index.ts +1 -0
- package/src/huawei/moderation/moderation.ts +355 -0
- package/src/huawei/obs/esdk-obs-nodejs.d.ts +87 -0
- package/src/huawei/obs/index.ts +1 -0
- package/src/huawei/obs/obs.ts +42 -0
- package/src/index.ts +21 -2
- package/src/json/README.md +92 -0
- package/src/json/index.ts +1 -0
- package/src/json/repair.ts +18 -0
- package/src/log/logger.ts +15 -4
- package/src/openai/README.md +1 -0
- package/src/openai/index.ts +1 -0
- package/src/openai/openai.ts +509 -0
- package/src/orchestration/README.md +9 -7
- package/src/orchestration/dispatching/dispatcher.ts +83 -0
- package/src/orchestration/dispatching/index.ts +2 -0
- package/src/orchestration/dispatching/selector/base-selector.ts +39 -0
- package/src/orchestration/dispatching/selector/down-count-selector.ts +119 -0
- package/src/orchestration/dispatching/selector/index.ts +2 -0
- package/src/orchestration/index.ts +2 -0
- package/src/orchestration/scheduling/index.ts +2 -0
- package/src/orchestration/scheduling/scheduler.ts +103 -0
- package/src/orchestration/scheduling/task.ts +32 -0
- package/src/random/README.md +8 -7
- package/src/random/base.ts +66 -0
- package/src/random/index.ts +5 -1
- package/src/random/random-boolean.ts +40 -0
- package/src/random/random-integer.ts +60 -0
- package/src/random/random-number.ts +72 -0
- package/src/random/random-string.ts +66 -0
- package/src/request/README.md +108 -0
- package/src/request/fetch/base.ts +108 -0
- package/src/request/fetch/browser.ts +280 -0
- package/src/request/fetch/general.ts +20 -0
- package/src/request/fetch/index.ts +4 -0
- package/src/request/fetch/nodejs.ts +280 -0
- package/src/request/index.ts +2 -0
- package/src/request/request/base.ts +246 -0
- package/src/request/request/general.ts +63 -0
- package/src/request/request/index.ts +3 -0
- package/src/request/request/resource.ts +68 -0
- package/src/result/README.md +4 -0
- package/src/result/controller.ts +58 -0
- package/src/result/either.ts +363 -0
- package/src/result/generator.ts +168 -0
- package/src/result/index.ts +3 -0
- package/src/route/README.md +105 -0
- package/src/route/adapter/browser.ts +122 -0
- package/src/route/adapter/driver.ts +56 -0
- package/src/route/adapter/index.ts +2 -0
- package/src/route/index.ts +3 -0
- package/src/route/router/index.ts +2 -0
- package/src/route/router/route.ts +630 -0
- package/src/route/router/router.ts +1641 -0
- package/src/route/uri/hash.ts +307 -0
- package/src/route/uri/index.ts +7 -0
- package/src/route/uri/pathname.ts +376 -0
- package/src/route/uri/search.ts +412 -0
- package/src/service/README.md +1 -0
- package/src/service/index.ts +1 -0
- package/src/service/service.ts +110 -0
- package/src/socket/README.md +105 -0
- package/src/socket/client/index.ts +2 -0
- package/src/socket/client/socket-unit.ts +658 -0
- package/src/socket/client/socket.ts +203 -0
- package/src/socket/common/index.ts +2 -0
- package/src/socket/common/socket-unit-common.ts +23 -0
- package/src/socket/common/socket-unit-heartbeat.ts +427 -0
- package/src/socket/index.ts +3 -0
- package/src/socket/server/index.ts +3 -0
- package/src/socket/server/server.ts +183 -0
- package/src/socket/server/socket-unit.ts +448 -0
- package/src/socket/server/socket.ts +264 -0
- package/src/storage/table.ts +3 -3
- package/src/timer/expiration/expiration-manager.ts +3 -3
- package/src/timer/expiration/remaining-manager.ts +3 -3
- package/src/tube/README.md +99 -0
- package/src/tube/helper.ts +137 -0
- package/src/tube/index.ts +2 -0
- package/src/tube/tube.ts +880 -0
- package/src/weixin/README.md +1 -0
- package/src/weixin/index.ts +2 -0
- package/src/weixin/official-account/authorization.ts +157 -0
- package/src/weixin/official-account/index.ts +2 -0
- package/src/weixin/official-account/js-api.ts +132 -0
- package/src/weixin/open/index.ts +1 -0
- package/src/weixin/open/oauth2.ts +131 -0
- package/tests/unit/ai/ai.spec.ts +85 -0
- package/tests/unit/aio/content.spec.ts +105 -0
- package/tests/unit/aio/json.spec.ts +146 -0
- package/tests/unit/aio/prompt.spec.ts +111 -0
- package/tests/unit/basic/error.spec.ts +16 -4
- package/tests/unit/basic/promise.spec.ts +158 -50
- package/tests/unit/basic/schedule.spec.ts +74 -0
- package/tests/unit/basic/stream.spec.ts +90 -37
- package/tests/unit/credential/api-key.spec.ts +36 -0
- package/tests/unit/credential/bearer.spec.ts +23 -0
- package/tests/unit/credential/json-web-token.spec.ts +23 -0
- package/tests/unit/credential/password.spec.ts +40 -0
- package/tests/unit/cron/cron.spec.ts +84 -0
- package/tests/unit/event/class-event-proxy.spec.ts +3 -3
- package/tests/unit/event/event-manager.spec.ts +3 -3
- package/tests/unit/event/instance-event-proxy.spec.ts +3 -3
- package/tests/unit/exception/error/error.spec.ts +83 -0
- package/tests/unit/exception/error/match.spec.ts +81 -0
- package/tests/unit/form/inputor-controller/base.spec.ts +458 -0
- package/tests/unit/form/inputor-controller/boolean.spec.ts +30 -0
- package/tests/unit/form/inputor-controller/file.spec.ts +27 -0
- package/tests/unit/form/inputor-controller/form.spec.ts +120 -0
- package/tests/unit/form/inputor-controller/helper.spec.ts +67 -0
- package/tests/unit/form/inputor-controller/multi-select.spec.ts +34 -0
- package/tests/unit/form/inputor-controller/number.spec.ts +36 -0
- package/tests/unit/form/inputor-controller/select.spec.ts +49 -0
- package/tests/unit/form/inputor-controller/text.spec.ts +34 -0
- package/tests/unit/http/api/api-core-host.spec.ts +207 -0
- package/tests/unit/http/api/api-schema.spec.ts +120 -0
- package/tests/unit/http/api/api-server.spec.ts +363 -0
- package/tests/unit/http/api/api-test.spec.ts +117 -0
- package/tests/unit/http/api/api.spec.ts +121 -0
- package/tests/unit/http/api-adapter/node-http.spec.ts +187 -0
- package/tests/unit/identifier/uuid.spec.ts +0 -1
- package/tests/unit/json/repair.spec.ts +11 -0
- package/tests/unit/log/logger.spec.ts +19 -4
- package/tests/unit/openai/openai.spec.ts +64 -0
- package/tests/unit/orchestration/dispatching/dispatcher.spec.ts +41 -0
- package/tests/unit/orchestration/dispatching/selector/down-count-selector.spec.ts +81 -0
- package/tests/unit/orchestration/scheduling/scheduler.spec.ts +103 -0
- package/tests/unit/random/base.spec.ts +58 -0
- package/tests/unit/random/random-boolean.spec.ts +25 -0
- package/tests/unit/random/random-integer.spec.ts +32 -0
- package/tests/unit/random/random-number.spec.ts +33 -0
- package/tests/unit/random/random-string.spec.ts +22 -0
- package/tests/unit/request/fetch/browser.spec.ts +222 -0
- package/tests/unit/request/fetch/general.spec.ts +43 -0
- package/tests/unit/request/fetch/nodejs.spec.ts +225 -0
- package/tests/unit/request/request/base.spec.ts +382 -0
- package/tests/unit/request/request/general.spec.ts +160 -0
- package/tests/unit/result/controller.spec.ts +82 -0
- package/tests/unit/result/either.spec.ts +377 -0
- package/tests/unit/result/generator.spec.ts +273 -0
- package/tests/unit/route/router/route.spec.ts +430 -0
- package/tests/unit/route/router/router.spec.ts +407 -0
- package/tests/unit/route/uri/hash.spec.ts +72 -0
- package/tests/unit/route/uri/pathname.spec.ts +146 -0
- package/tests/unit/route/uri/search.spec.ts +107 -0
- package/tests/unit/socket/client.spec.ts +208 -0
- package/tests/unit/socket/server.spec.ts +133 -0
- package/tests/unit/socket/socket-unit-heartbeat.spec.ts +214 -0
- package/tests/unit/tube/helper.spec.ts +139 -0
- package/tests/unit/tube/tube.spec.ts +501 -0
- package/vite.config.ts +2 -1
- package/dist/index.js +0 -50
- package/dist/index.js.map +0 -209
- package/src/random/string.ts +0 -35
- package/tests/unit/random/string.spec.ts +0 -11
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import type * as Aio from "#Source/aio/index.ts"
|
|
2
|
+
import type { WithAbortSignal } from "#Source/abort/index.ts"
|
|
3
|
+
import type { Either } from "#Source/result/index.ts"
|
|
4
|
+
import type { Tube } from "#Source/tube/index.ts"
|
|
5
|
+
import type { StringWithAutoCompleteOptions } from "#Source/type/index.ts"
|
|
6
|
+
import type { LoggerFriendly, LoggerFriendlyOptions } from "#Source/log/index.ts"
|
|
7
|
+
import { Logger } from "#Source/log/index.ts"
|
|
8
|
+
|
|
9
|
+
export interface ChatCompletionContentPartText {
|
|
10
|
+
/**
|
|
11
|
+
* The text content.
|
|
12
|
+
*/
|
|
13
|
+
text: string
|
|
14
|
+
/**
|
|
15
|
+
* The type of the content part.
|
|
16
|
+
*/
|
|
17
|
+
type: "text"
|
|
18
|
+
}
|
|
19
|
+
export interface ChatCompletionContentPartRefusal {
|
|
20
|
+
/**
|
|
21
|
+
* The refusal message generated by the model.
|
|
22
|
+
*/
|
|
23
|
+
refusal: string
|
|
24
|
+
/**
|
|
25
|
+
* The type of the content part.
|
|
26
|
+
*/
|
|
27
|
+
type: "refusal"
|
|
28
|
+
}
|
|
29
|
+
export interface ChatCompletionContentPartImage {
|
|
30
|
+
imageUrl: {
|
|
31
|
+
/**
|
|
32
|
+
* Either a URL of the image or the base64 encoded image data.
|
|
33
|
+
*/
|
|
34
|
+
url: string
|
|
35
|
+
/**
|
|
36
|
+
* Specifies the detail level of the image. Learn more in the
|
|
37
|
+
* [Vision guide](https://platform.openai.com/docs/guides/vision/low-or-high-fidelity-image-understanding).
|
|
38
|
+
*/
|
|
39
|
+
detail?: "auto" | "low" | "high"
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The type of the content part.
|
|
43
|
+
*/
|
|
44
|
+
type: "image_url"
|
|
45
|
+
}
|
|
46
|
+
export interface ChatCompletionSystemMessage {
|
|
47
|
+
/**
|
|
48
|
+
* The contents of the system message.
|
|
49
|
+
*/
|
|
50
|
+
content: string | ChatCompletionContentPartText[]
|
|
51
|
+
/**
|
|
52
|
+
* The role of the messages author, in this case `system`.
|
|
53
|
+
*/
|
|
54
|
+
role: "system"
|
|
55
|
+
}
|
|
56
|
+
export interface ChatCompletionUserMessage {
|
|
57
|
+
/**
|
|
58
|
+
* The contents of the user message.
|
|
59
|
+
*/
|
|
60
|
+
content: string | Array<ChatCompletionContentPartText | ChatCompletionContentPartImage>
|
|
61
|
+
/**
|
|
62
|
+
* The role of the messages author, in this case `user`.
|
|
63
|
+
*/
|
|
64
|
+
role: "user"
|
|
65
|
+
}
|
|
66
|
+
export interface ChatCompletionAssistantMessage {
|
|
67
|
+
/**
|
|
68
|
+
* The contents of the assistant message. Required unless `tool_calls` or
|
|
69
|
+
* `function_call` is specified.
|
|
70
|
+
*/
|
|
71
|
+
content: string | Array<ChatCompletionContentPartText | ChatCompletionContentPartRefusal>
|
|
72
|
+
/**
|
|
73
|
+
* The role of the messages author, in this case `assistant`.
|
|
74
|
+
*/
|
|
75
|
+
role: "assistant"
|
|
76
|
+
}
|
|
77
|
+
export type ChatCompletionMessage =
|
|
78
|
+
| ChatCompletionSystemMessage
|
|
79
|
+
| ChatCompletionUserMessage
|
|
80
|
+
| ChatCompletionAssistantMessage
|
|
81
|
+
const CHAT_COMPLETION_MODEL_LIST = [
|
|
82
|
+
"o1-preview",
|
|
83
|
+
"o1-preview-2024-09-12",
|
|
84
|
+
"o1-mini",
|
|
85
|
+
"o1-mini-2024-09-12",
|
|
86
|
+
"gpt-4o",
|
|
87
|
+
"gpt-4o-2024-08-06",
|
|
88
|
+
"gpt-4o-2024-05-13",
|
|
89
|
+
"gpt-4o-realtime-preview-2024-10-01",
|
|
90
|
+
"chatgpt-4o-latest",
|
|
91
|
+
"gpt-4o-mini",
|
|
92
|
+
"gpt-4o-mini-2024-07-18",
|
|
93
|
+
"gpt-4-turbo",
|
|
94
|
+
"gpt-4-turbo-2024-04-09",
|
|
95
|
+
"gpt-4-0125-preview",
|
|
96
|
+
"gpt-4-turbo-preview",
|
|
97
|
+
"gpt-4-1106-preview",
|
|
98
|
+
"gpt-4-vision-preview",
|
|
99
|
+
"gpt-4",
|
|
100
|
+
"gpt-4-0314",
|
|
101
|
+
"gpt-4-0613",
|
|
102
|
+
"gpt-4-32k",
|
|
103
|
+
"gpt-4-32k-0314",
|
|
104
|
+
"gpt-4-32k-0613",
|
|
105
|
+
"gpt-3.5-turbo",
|
|
106
|
+
"gpt-3.5-turbo-16k",
|
|
107
|
+
"gpt-3.5-turbo-0301",
|
|
108
|
+
"gpt-3.5-turbo-0613",
|
|
109
|
+
"gpt-3.5-turbo-1106",
|
|
110
|
+
"gpt-3.5-turbo-0125",
|
|
111
|
+
"gpt-3.5-turbo-16k-0613",
|
|
112
|
+
"yi-lightning",
|
|
113
|
+
"hunyuan-standard",
|
|
114
|
+
"grok-3",
|
|
115
|
+
"gemini-2.0-flash-lite-preview-02-05",
|
|
116
|
+
"deepseek-r1",
|
|
117
|
+
"deepseek-v3",
|
|
118
|
+
] as const
|
|
119
|
+
export type ChatCompletionModel = typeof CHAT_COMPLETION_MODEL_LIST[number]
|
|
120
|
+
export interface ResponseFormatText {
|
|
121
|
+
/**
|
|
122
|
+
* The type of response format being defined: `text`
|
|
123
|
+
*/
|
|
124
|
+
type: "text"
|
|
125
|
+
}
|
|
126
|
+
export interface ResponseFormatJSONObject {
|
|
127
|
+
/**
|
|
128
|
+
* The type of response format being defined: `json_object`
|
|
129
|
+
*/
|
|
130
|
+
type: "json_object"
|
|
131
|
+
}
|
|
132
|
+
export type ResponseFormat = ResponseFormatText | ResponseFormatJSONObject
|
|
133
|
+
export interface ChatCompletionOptions extends WithAbortSignal {
|
|
134
|
+
messages: ChatCompletionMessage[]
|
|
135
|
+
model: ChatCompletionModel
|
|
136
|
+
frequencyPenalty?: number | null
|
|
137
|
+
logitBias?: Record<string, number> | null
|
|
138
|
+
logprobs?: boolean | null
|
|
139
|
+
maxCompletionTokens?: number | null
|
|
140
|
+
maxTokens?: number | null
|
|
141
|
+
presencePenalty?: number | null
|
|
142
|
+
responseFormat?: ResponseFormat
|
|
143
|
+
temperature?: number | null
|
|
144
|
+
topLogprobs?: number | null
|
|
145
|
+
topP?: number | null
|
|
146
|
+
/**
|
|
147
|
+
* The timeout for the first chunk of data to be received, in milliseconds.
|
|
148
|
+
*/
|
|
149
|
+
timeoutFirstChunk?: number | undefined
|
|
150
|
+
/**
|
|
151
|
+
* The timeout for each chunk of data to be received, in milliseconds.
|
|
152
|
+
*/
|
|
153
|
+
timeoutPerChunk?: number | undefined
|
|
154
|
+
/**
|
|
155
|
+
* The maximum number of tries for the request.
|
|
156
|
+
*/
|
|
157
|
+
maxTries?: number | undefined
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export interface ChatCompletionLeft {
|
|
161
|
+
code: StringWithAutoCompleteOptions<never>
|
|
162
|
+
}
|
|
163
|
+
export interface Completion {
|
|
164
|
+
content: Aio.TextContent
|
|
165
|
+
token: Aio.NumberContent
|
|
166
|
+
}
|
|
167
|
+
export interface ChatCompletionRight {
|
|
168
|
+
completionTube: Tube<Completion>
|
|
169
|
+
}
|
|
170
|
+
export type ChatCompletionResult = Either<ChatCompletionLeft, ChatCompletionRight>
|
|
171
|
+
|
|
172
|
+
export interface BaseChatCompletionOptions extends LoggerFriendlyOptions {
|
|
173
|
+
}
|
|
174
|
+
export abstract class BaseChatCompletion implements LoggerFriendly {
|
|
175
|
+
readonly logger: Logger
|
|
176
|
+
private readonly supportedModelList: ChatCompletionModel[]
|
|
177
|
+
|
|
178
|
+
constructor(options: BaseChatCompletionOptions) {
|
|
179
|
+
this.logger = Logger.fromOptions(options).setDefaultName("BaseChatCompletion")
|
|
180
|
+
|
|
181
|
+
this.supportedModelList = [...CHAT_COMPLETION_MODEL_LIST]
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
isSupportModel(model: ChatCompletionModel): boolean {
|
|
185
|
+
return this.supportedModelList.includes(model)
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
abstract chatCompletion(options: ChatCompletionOptions): Promise<ChatCompletionResult>
|
|
189
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * as ChatCompletionAi from "./chat-completion-ai.ts"
|
|
2
|
+
|
|
3
|
+
export * as ChatCompletion from "./chat-completion.ts"
|
|
4
|
+
export * as OpenaiNextChatCompletion from "./openai-next-chat-completion.ts"
|
|
5
|
+
export * as OhmygptChatCompletion from "./ohmygpt-chat-completion.ts"
|
|
6
|
+
export * as LingyiwanwuChatCompletion from "./lingyiwanwu-chat-completion.ts"
|
|
7
|
+
export * as AihubmixChatCompletion from "./aihubmix-chat-completion.ts"
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type * as Openai from "#Source/openai/index.ts"
|
|
2
|
+
|
|
3
|
+
import type { BaseChatCompletionOptions, ChatCompletionOptions, ChatCompletionResult } from "./chat-completion.ts"
|
|
4
|
+
import { BaseChatCompletion } from "./chat-completion.ts"
|
|
5
|
+
|
|
6
|
+
export interface LingyiwanwuChatCompletionOptions extends BaseChatCompletionOptions {
|
|
7
|
+
openai: Openai.Openai
|
|
8
|
+
}
|
|
9
|
+
export class LingyiwanwuChatCompletion extends BaseChatCompletion {
|
|
10
|
+
protected readonly openai: Openai.Openai
|
|
11
|
+
|
|
12
|
+
constructor(options: LingyiwanwuChatCompletionOptions) {
|
|
13
|
+
super(options)
|
|
14
|
+
this.logger.setDefaultName("LingyiwanwuChatCompletion")
|
|
15
|
+
|
|
16
|
+
this.openai = options.openai
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
protected transformOptions(options: ChatCompletionOptions): Openai.CustomChatCompletionOptions {
|
|
20
|
+
const transformedOptions: Openai.CustomChatCompletionOptions = {
|
|
21
|
+
messages: options.messages.map((message) => {
|
|
22
|
+
const { role, content } = message
|
|
23
|
+
if (role === "system") {
|
|
24
|
+
return message
|
|
25
|
+
}
|
|
26
|
+
if (role === "user") {
|
|
27
|
+
if (typeof content === "string") {
|
|
28
|
+
return {
|
|
29
|
+
role,
|
|
30
|
+
content,
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (Array.isArray(content)) {
|
|
34
|
+
return {
|
|
35
|
+
role,
|
|
36
|
+
content: content.map((item) => {
|
|
37
|
+
if (item.type === "image_url") {
|
|
38
|
+
return {
|
|
39
|
+
type: item.type,
|
|
40
|
+
image_url: item.imageUrl,
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
return item
|
|
45
|
+
}
|
|
46
|
+
}),
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
throw new Error("Invalid content")
|
|
50
|
+
}
|
|
51
|
+
if (role === "assistant") {
|
|
52
|
+
return message
|
|
53
|
+
}
|
|
54
|
+
throw new Error("Invalid role")
|
|
55
|
+
}),
|
|
56
|
+
model: options.model,
|
|
57
|
+
...(options.frequencyPenalty !== undefined ? { frequency_penalty: options.frequencyPenalty } : {}),
|
|
58
|
+
...(options.logitBias !== undefined ? { logit_bias: options.logitBias } : {}),
|
|
59
|
+
...(options.logprobs !== undefined ? { logprobs: options.logprobs } : {}),
|
|
60
|
+
...(options.maxCompletionTokens !== undefined ? { max_completion_tokens: options.maxCompletionTokens } : {}),
|
|
61
|
+
...(options.maxTokens !== undefined ? { max_tokens: options.maxTokens } : {}),
|
|
62
|
+
...(options.presencePenalty !== undefined ? { presence_penalty: options.presencePenalty } : {}),
|
|
63
|
+
...(options.responseFormat !== undefined ? { response_format: options.responseFormat } : {}),
|
|
64
|
+
...(options.temperature !== undefined ? { temperature: options.temperature } : {}),
|
|
65
|
+
...(options.topLogprobs !== undefined ? { top_logprobs: options.topLogprobs } : {}),
|
|
66
|
+
...(options.topP !== undefined ? { top_p: options.topP } : {}),
|
|
67
|
+
timeout: options.timeoutFirstChunk ?? undefined,
|
|
68
|
+
abortSignal: options.abortSignal,
|
|
69
|
+
}
|
|
70
|
+
return transformedOptions
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async chatCompletion(options: ChatCompletionOptions): Promise<ChatCompletionResult> {
|
|
74
|
+
const transformedOptions = this.transformOptions(options)
|
|
75
|
+
const result = await this.openai.customChatCompletionStreaming(transformedOptions)
|
|
76
|
+
return result
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type * as Openai from "#Source/openai/index.ts"
|
|
2
|
+
|
|
3
|
+
import type { BaseChatCompletionOptions, ChatCompletionOptions, ChatCompletionResult } from "./chat-completion.ts"
|
|
4
|
+
import { BaseChatCompletion } from "./chat-completion.ts"
|
|
5
|
+
|
|
6
|
+
export interface OhmygptChatCompletionOptions extends BaseChatCompletionOptions {
|
|
7
|
+
openai: Openai.Openai
|
|
8
|
+
}
|
|
9
|
+
export class OhmygptChatCompletion extends BaseChatCompletion {
|
|
10
|
+
protected readonly openai: Openai.Openai
|
|
11
|
+
|
|
12
|
+
constructor(options: OhmygptChatCompletionOptions) {
|
|
13
|
+
super(options)
|
|
14
|
+
this.logger.setDefaultName("OhmygptChatCompletion")
|
|
15
|
+
|
|
16
|
+
this.openai = options.openai
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
protected transformOptions(options: ChatCompletionOptions): Openai.CustomChatCompletionOptions {
|
|
20
|
+
const transformedOptions: Openai.CustomChatCompletionOptions = {
|
|
21
|
+
messages: options.messages.map((message) => {
|
|
22
|
+
const { role, content } = message
|
|
23
|
+
if (role === "system") {
|
|
24
|
+
return message
|
|
25
|
+
}
|
|
26
|
+
if (role === "user") {
|
|
27
|
+
if (typeof content === "string") {
|
|
28
|
+
return {
|
|
29
|
+
role,
|
|
30
|
+
content,
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (Array.isArray(content)) {
|
|
34
|
+
return {
|
|
35
|
+
role,
|
|
36
|
+
content: content.map((item) => {
|
|
37
|
+
if (item.type === "image_url") {
|
|
38
|
+
return {
|
|
39
|
+
type: item.type,
|
|
40
|
+
image_url: item.imageUrl,
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
return item
|
|
45
|
+
}
|
|
46
|
+
}),
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
throw new Error("Invalid content")
|
|
50
|
+
}
|
|
51
|
+
if (role === "assistant") {
|
|
52
|
+
return message
|
|
53
|
+
}
|
|
54
|
+
throw new Error("Invalid role")
|
|
55
|
+
}),
|
|
56
|
+
model: options.model,
|
|
57
|
+
...(options.frequencyPenalty !== undefined ? { frequency_penalty: options.frequencyPenalty } : {}),
|
|
58
|
+
...(options.logitBias !== undefined ? { logit_bias: options.logitBias } : {}),
|
|
59
|
+
...(options.logprobs !== undefined ? { logprobs: options.logprobs } : {}),
|
|
60
|
+
...(options.maxCompletionTokens !== undefined ? { max_completion_tokens: options.maxCompletionTokens } : {}),
|
|
61
|
+
...(options.maxTokens !== undefined ? { max_tokens: options.maxTokens } : {}),
|
|
62
|
+
...(options.presencePenalty !== undefined ? { presence_penalty: options.presencePenalty } : {}),
|
|
63
|
+
...(options.responseFormat !== undefined ? { response_format: options.responseFormat } : {}),
|
|
64
|
+
...(options.temperature !== undefined ? { temperature: options.temperature } : {}),
|
|
65
|
+
...(options.topLogprobs !== undefined ? { top_logprobs: options.topLogprobs } : {}),
|
|
66
|
+
...(options.topP !== undefined ? { top_p: options.topP } : {}),
|
|
67
|
+
timeout: options.timeoutFirstChunk ?? undefined,
|
|
68
|
+
abortSignal: options.abortSignal,
|
|
69
|
+
}
|
|
70
|
+
return transformedOptions
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async chatCompletion(options: ChatCompletionOptions): Promise<ChatCompletionResult> {
|
|
74
|
+
const transformedOptions = this.transformOptions(options)
|
|
75
|
+
const result = await this.openai.customChatCompletionStreaming(transformedOptions)
|
|
76
|
+
return result
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type * as Openai from "#Source/openai/index.ts"
|
|
2
|
+
|
|
3
|
+
import type { BaseChatCompletionOptions, ChatCompletionOptions, ChatCompletionResult } from "./chat-completion.ts"
|
|
4
|
+
import { BaseChatCompletion } from "./chat-completion.ts"
|
|
5
|
+
|
|
6
|
+
export interface OpenaiNextChatCompletionOptions extends BaseChatCompletionOptions {
|
|
7
|
+
openai: Openai.Openai
|
|
8
|
+
}
|
|
9
|
+
export class OpenaiNextChatCompletion extends BaseChatCompletion {
|
|
10
|
+
protected readonly openai: Openai.Openai
|
|
11
|
+
|
|
12
|
+
constructor(options: OpenaiNextChatCompletionOptions) {
|
|
13
|
+
super(options)
|
|
14
|
+
this.logger.setDefaultName("OpenaiNextChatCompletion")
|
|
15
|
+
|
|
16
|
+
this.openai = options.openai
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
protected transformOptions(options: ChatCompletionOptions): Openai.CustomChatCompletionOptions {
|
|
20
|
+
const transformedOptions: Openai.CustomChatCompletionOptions = {
|
|
21
|
+
messages: options.messages.map((message) => {
|
|
22
|
+
const { role, content } = message
|
|
23
|
+
if (role === "system") {
|
|
24
|
+
return message
|
|
25
|
+
}
|
|
26
|
+
if (role === "user") {
|
|
27
|
+
if (typeof content === "string") {
|
|
28
|
+
return {
|
|
29
|
+
role,
|
|
30
|
+
content,
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (Array.isArray(content)) {
|
|
34
|
+
return {
|
|
35
|
+
role,
|
|
36
|
+
content: content.map((item) => {
|
|
37
|
+
if (item.type === "image_url") {
|
|
38
|
+
return {
|
|
39
|
+
type: item.type,
|
|
40
|
+
image_url: item.imageUrl,
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
return item
|
|
45
|
+
}
|
|
46
|
+
}),
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
throw new Error("Invalid content")
|
|
50
|
+
}
|
|
51
|
+
if (role === "assistant") {
|
|
52
|
+
return message
|
|
53
|
+
}
|
|
54
|
+
throw new Error("Invalid role")
|
|
55
|
+
}),
|
|
56
|
+
model: options.model,
|
|
57
|
+
...(options.frequencyPenalty !== undefined ? { frequency_penalty: options.frequencyPenalty } : {}),
|
|
58
|
+
...(options.logitBias !== undefined ? { logit_bias: options.logitBias } : {}),
|
|
59
|
+
...(options.logprobs !== undefined ? { logprobs: options.logprobs } : {}),
|
|
60
|
+
...(options.maxCompletionTokens !== undefined ? { max_completion_tokens: options.maxCompletionTokens } : {}),
|
|
61
|
+
...(options.maxTokens !== undefined ? { max_tokens: options.maxTokens } : {}),
|
|
62
|
+
...(options.presencePenalty !== undefined ? { presence_penalty: options.presencePenalty } : {}),
|
|
63
|
+
...(options.responseFormat !== undefined ? { response_format: options.responseFormat } : {}),
|
|
64
|
+
...(options.temperature !== undefined ? { temperature: options.temperature } : {}),
|
|
65
|
+
...(options.topLogprobs !== undefined ? { top_logprobs: options.topLogprobs } : {}),
|
|
66
|
+
...(options.topP !== undefined ? { top_p: options.topP } : {}),
|
|
67
|
+
timeout: options.timeoutFirstChunk ?? undefined,
|
|
68
|
+
abortSignal: options.abortSignal,
|
|
69
|
+
}
|
|
70
|
+
return transformedOptions
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async chatCompletion(options: ChatCompletionOptions): Promise<ChatCompletionResult> {
|
|
74
|
+
const transformedOptions = this.transformOptions(options)
|
|
75
|
+
const result = await this.openai.customChatCompletionStreaming(transformedOptions)
|
|
76
|
+
return result
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { LoggerFriendly, LoggerFriendlyOptions } from "#Source/log/index.ts"
|
|
2
|
+
import { Dispatcher } from "#Source/orchestration/index.ts"
|
|
3
|
+
import { Logger } from "#Source/log/index.ts"
|
|
4
|
+
import { controllerFromEitherType, eitherToTuple } from "#Source/result/index.ts"
|
|
5
|
+
|
|
6
|
+
import type { BaseEmbedding, EmbeddingOptions, EmbeddingResult } from "./embedding.ts"
|
|
7
|
+
|
|
8
|
+
export interface EmbeddingAiOptions extends LoggerFriendlyOptions {
|
|
9
|
+
embeddingInstanceList: BaseEmbedding[]
|
|
10
|
+
/**
|
|
11
|
+
* The maximum number of tries for the request.
|
|
12
|
+
*
|
|
13
|
+
* @default 3
|
|
14
|
+
*/
|
|
15
|
+
maxTries?: number | undefined
|
|
16
|
+
}
|
|
17
|
+
interface ResolvedEmbeddingAiOptions {
|
|
18
|
+
embeddingInstanceList: BaseEmbedding[]
|
|
19
|
+
maxTries: number
|
|
20
|
+
}
|
|
21
|
+
export class EmbeddingAi implements LoggerFriendly {
|
|
22
|
+
protected options: ResolvedEmbeddingAiOptions
|
|
23
|
+
|
|
24
|
+
readonly logger: Logger
|
|
25
|
+
private dispatcher: Dispatcher<BaseEmbedding>
|
|
26
|
+
|
|
27
|
+
constructor(options: EmbeddingAiOptions) {
|
|
28
|
+
this.options = {
|
|
29
|
+
embeddingInstanceList: options.embeddingInstanceList,
|
|
30
|
+
maxTries: options.maxTries ?? 3,
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
this.logger = Logger.fromOptions(options).setDefaultName("EmbeddingAi")
|
|
34
|
+
this.dispatcher = new Dispatcher({
|
|
35
|
+
itemList: this.options.embeddingInstanceList,
|
|
36
|
+
logger: Logger.derive(this.logger),
|
|
37
|
+
})
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async embedding(options: EmbeddingOptions): Promise<EmbeddingResult> {
|
|
41
|
+
const controller = controllerFromEitherType<EmbeddingResult>()
|
|
42
|
+
|
|
43
|
+
const { selector, destroy } = this.dispatcher.getSelector({
|
|
44
|
+
filter: (item) => {
|
|
45
|
+
return item.isSupportModel(options.model) === true
|
|
46
|
+
},
|
|
47
|
+
})
|
|
48
|
+
const [getItemLeft, getItemRight] = eitherToTuple(await selector.getItem())
|
|
49
|
+
if (getItemLeft !== undefined) {
|
|
50
|
+
return await controller.returnLeft(getItemLeft)
|
|
51
|
+
}
|
|
52
|
+
const { item } = getItemRight
|
|
53
|
+
|
|
54
|
+
// TODO: 实现重试逻辑
|
|
55
|
+
// const _maxTries = options.maxTries ?? this.options.maxTries
|
|
56
|
+
const embeddingResult = await item.embedding(options)
|
|
57
|
+
|
|
58
|
+
// 运行至此处,说明 embedding 成功,将 selector 销毁
|
|
59
|
+
destroy()
|
|
60
|
+
|
|
61
|
+
return embeddingResult
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { StringWithAutoCompleteOptions } from "#Source/type/index.ts"
|
|
2
|
+
import type { WithAbortSignal } from "#Source/abort/index.ts"
|
|
3
|
+
import type { LoggerFriendly, LoggerFriendlyOptions } from "#Source/log/index.ts"
|
|
4
|
+
import type { Either } from "#Source/result/index.ts"
|
|
5
|
+
|
|
6
|
+
import { Logger } from "#Source/log/index.ts"
|
|
7
|
+
|
|
8
|
+
const EMBEDDING_MODEL_LIST = [
|
|
9
|
+
"text-embedding-ada-002",
|
|
10
|
+
"text-embedding-3-small",
|
|
11
|
+
"text-embedding-3-large",
|
|
12
|
+
] as const
|
|
13
|
+
export type EmbeddingModel = typeof EMBEDDING_MODEL_LIST[number]
|
|
14
|
+
export interface EmbeddingOptions extends WithAbortSignal {
|
|
15
|
+
input: string
|
|
16
|
+
model: EmbeddingModel
|
|
17
|
+
maxTries?: number | undefined
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface EmbeddingLeft {
|
|
21
|
+
code: StringWithAutoCompleteOptions<never>
|
|
22
|
+
}
|
|
23
|
+
export interface EmbeddingRight {
|
|
24
|
+
embedding: number[]
|
|
25
|
+
usage: {
|
|
26
|
+
promptTokens: number
|
|
27
|
+
totalTokens: number
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export type EmbeddingResult = Either<EmbeddingLeft, EmbeddingRight>
|
|
31
|
+
|
|
32
|
+
export interface BaseEmbeddingOptions extends LoggerFriendlyOptions {
|
|
33
|
+
}
|
|
34
|
+
export abstract class BaseEmbedding implements LoggerFriendly {
|
|
35
|
+
readonly logger: Logger
|
|
36
|
+
|
|
37
|
+
private readonly supportedModelList: EmbeddingModel[]
|
|
38
|
+
|
|
39
|
+
constructor(options: BaseEmbeddingOptions) {
|
|
40
|
+
this.logger = Logger.fromOptions(options).setDefaultName("BaseEmbedding")
|
|
41
|
+
|
|
42
|
+
this.supportedModelList = [...EMBEDDING_MODEL_LIST]
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
isSupportModel(model: EmbeddingModel): boolean {
|
|
46
|
+
return this.supportedModelList.includes(model)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
abstract embedding(options: EmbeddingOptions): Promise<EmbeddingResult>
|
|
50
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type * as Openai from "#Source/openai/index.ts"
|
|
2
|
+
import type { BaseEmbeddingOptions, EmbeddingOptions, EmbeddingResult } from "./embedding.ts"
|
|
3
|
+
|
|
4
|
+
import { BaseEmbedding } from "./embedding.ts"
|
|
5
|
+
|
|
6
|
+
export interface OpenaiNextEmbeddingOptions extends BaseEmbeddingOptions {
|
|
7
|
+
openai: Openai.Openai
|
|
8
|
+
}
|
|
9
|
+
export class OpenaiNextEmbedding extends BaseEmbedding {
|
|
10
|
+
protected readonly openai: Openai.Openai
|
|
11
|
+
|
|
12
|
+
constructor(options: OpenaiNextEmbeddingOptions) {
|
|
13
|
+
super(options)
|
|
14
|
+
this.logger.setDefaultName("OpenaiNextEmbedding")
|
|
15
|
+
|
|
16
|
+
this.openai = options.openai
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async embedding(options: EmbeddingOptions): Promise<EmbeddingResult> {
|
|
20
|
+
const result = await this.openai.customEmbedding(options)
|
|
21
|
+
return result
|
|
22
|
+
}
|
|
23
|
+
}
|
package/src/ai/index.ts
ADDED