@planet-matrix/mobius-model 0.6.0 → 0.9.0

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.
Files changed (233) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/index.js +706 -36
  3. package/dist/index.js.map +855 -59
  4. package/package.json +28 -16
  5. package/src/ai/README.md +1 -0
  6. package/src/ai/ai.ts +107 -0
  7. package/src/ai/chat-completion-ai/aihubmix-chat-completion.ts +78 -0
  8. package/src/ai/chat-completion-ai/chat-completion-ai.ts +270 -0
  9. package/src/ai/chat-completion-ai/chat-completion.ts +189 -0
  10. package/src/ai/chat-completion-ai/index.ts +7 -0
  11. package/src/ai/chat-completion-ai/lingyiwanwu-chat-completion.ts +78 -0
  12. package/src/ai/chat-completion-ai/ohmygpt-chat-completion.ts +78 -0
  13. package/src/ai/chat-completion-ai/openai-next-chat-completion.ts +78 -0
  14. package/src/ai/embedding-ai/embedding-ai.ts +63 -0
  15. package/src/ai/embedding-ai/embedding.ts +50 -0
  16. package/src/ai/embedding-ai/index.ts +4 -0
  17. package/src/ai/embedding-ai/openai-next-embedding.ts +23 -0
  18. package/src/ai/index.ts +4 -0
  19. package/src/aio/README.md +100 -0
  20. package/src/aio/content.ts +141 -0
  21. package/src/aio/index.ts +3 -0
  22. package/src/aio/json.ts +127 -0
  23. package/src/aio/prompt.ts +246 -0
  24. package/src/basic/README.md +20 -15
  25. package/src/basic/error.ts +19 -5
  26. package/src/basic/function.ts +2 -2
  27. package/src/basic/index.ts +1 -0
  28. package/src/basic/schedule.ts +111 -0
  29. package/src/basic/stream.ts +135 -25
  30. package/src/credential/README.md +107 -0
  31. package/src/credential/api-key.ts +158 -0
  32. package/src/credential/bearer.ts +73 -0
  33. package/src/credential/index.ts +4 -0
  34. package/src/credential/json-web-token.ts +96 -0
  35. package/src/credential/password.ts +170 -0
  36. package/src/cron/README.md +86 -0
  37. package/src/cron/cron.ts +87 -0
  38. package/src/cron/index.ts +1 -0
  39. package/src/drizzle/README.md +1 -0
  40. package/src/drizzle/drizzle.ts +1 -0
  41. package/src/drizzle/helper.ts +47 -0
  42. package/src/drizzle/index.ts +5 -0
  43. package/src/drizzle/infer.ts +52 -0
  44. package/src/drizzle/kysely.ts +8 -0
  45. package/src/drizzle/pagination.ts +200 -0
  46. package/src/email/README.md +1 -0
  47. package/src/email/index.ts +1 -0
  48. package/src/email/resend.ts +25 -0
  49. package/src/event/class-event-proxy.ts +6 -5
  50. package/src/event/common.ts +13 -3
  51. package/src/event/event-manager.ts +3 -3
  52. package/src/event/instance-event-proxy.ts +6 -5
  53. package/src/event/internal.ts +4 -4
  54. package/src/form/README.md +25 -0
  55. package/src/form/index.ts +1 -0
  56. package/src/form/inputor-controller/base.ts +874 -0
  57. package/src/form/inputor-controller/boolean.ts +39 -0
  58. package/src/form/inputor-controller/file.ts +39 -0
  59. package/src/form/inputor-controller/form.ts +181 -0
  60. package/src/form/inputor-controller/helper.ts +117 -0
  61. package/src/form/inputor-controller/index.ts +17 -0
  62. package/src/form/inputor-controller/multi-select.ts +99 -0
  63. package/src/form/inputor-controller/number.ts +116 -0
  64. package/src/form/inputor-controller/select.ts +109 -0
  65. package/src/form/inputor-controller/text.ts +82 -0
  66. package/src/http/READMD.md +1 -0
  67. package/src/http/api/api-core.ts +84 -0
  68. package/src/http/api/api-handler.ts +79 -0
  69. package/src/http/api/api-host.ts +47 -0
  70. package/src/http/api/api-result.ts +56 -0
  71. package/src/http/api/api-schema.ts +154 -0
  72. package/src/http/api/api-server.ts +130 -0
  73. package/src/http/api/api-test.ts +142 -0
  74. package/src/http/api/api-type.ts +37 -0
  75. package/src/http/api/api.ts +81 -0
  76. package/src/http/api/index.ts +11 -0
  77. package/src/http/api-adapter/api-core-node-http.ts +260 -0
  78. package/src/http/api-adapter/api-host-node-http.ts +156 -0
  79. package/src/http/api-adapter/api-result-arktype.ts +297 -0
  80. package/src/http/api-adapter/api-result-zod.ts +286 -0
  81. package/src/http/api-adapter/index.ts +5 -0
  82. package/src/http/bin/gen-api-list/gen-api-list.ts +126 -0
  83. package/src/http/bin/gen-api-list/index.ts +1 -0
  84. package/src/http/bin/gen-api-test/gen-api-test.ts +136 -0
  85. package/src/http/bin/gen-api-test/index.ts +1 -0
  86. package/src/http/bin/gen-api-type/calc-code.ts +25 -0
  87. package/src/http/bin/gen-api-type/gen-api-type.ts +127 -0
  88. package/src/http/bin/gen-api-type/index.ts +2 -0
  89. package/src/http/bin/index.ts +2 -0
  90. package/src/http/index.ts +3 -0
  91. package/src/huawei/README.md +1 -0
  92. package/src/huawei/index.ts +2 -0
  93. package/src/huawei/moderation/index.ts +1 -0
  94. package/src/huawei/moderation/moderation.ts +355 -0
  95. package/src/huawei/obs/esdk-obs-nodejs.d.ts +87 -0
  96. package/src/huawei/obs/index.ts +1 -0
  97. package/src/huawei/obs/obs.ts +42 -0
  98. package/src/index.ts +19 -2
  99. package/src/json/README.md +92 -0
  100. package/src/json/index.ts +1 -0
  101. package/src/json/repair.ts +18 -0
  102. package/src/log/logger.ts +15 -4
  103. package/src/openai/README.md +1 -0
  104. package/src/openai/index.ts +1 -0
  105. package/src/openai/openai.ts +510 -0
  106. package/src/orchestration/README.md +9 -7
  107. package/src/orchestration/dispatching/dispatcher.ts +83 -0
  108. package/src/orchestration/dispatching/index.ts +2 -0
  109. package/src/orchestration/dispatching/selector/base-selector.ts +39 -0
  110. package/src/orchestration/dispatching/selector/down-count-selector.ts +119 -0
  111. package/src/orchestration/dispatching/selector/index.ts +2 -0
  112. package/src/orchestration/index.ts +2 -0
  113. package/src/orchestration/scheduling/index.ts +2 -0
  114. package/src/orchestration/scheduling/scheduler.ts +103 -0
  115. package/src/orchestration/scheduling/task.ts +32 -0
  116. package/src/random/README.md +8 -7
  117. package/src/random/base.ts +66 -0
  118. package/src/random/index.ts +5 -1
  119. package/src/random/random-boolean.ts +40 -0
  120. package/src/random/random-integer.ts +60 -0
  121. package/src/random/random-number.ts +72 -0
  122. package/src/random/random-string.ts +66 -0
  123. package/src/request/README.md +108 -0
  124. package/src/request/fetch/base.ts +108 -0
  125. package/src/request/fetch/browser.ts +285 -0
  126. package/src/request/fetch/general.ts +20 -0
  127. package/src/request/fetch/index.ts +4 -0
  128. package/src/request/fetch/nodejs.ts +285 -0
  129. package/src/request/index.ts +2 -0
  130. package/src/request/request/base.ts +250 -0
  131. package/src/request/request/general.ts +64 -0
  132. package/src/request/request/index.ts +3 -0
  133. package/src/request/request/resource.ts +68 -0
  134. package/src/result/README.md +4 -0
  135. package/src/result/controller.ts +54 -0
  136. package/src/result/either.ts +193 -0
  137. package/src/result/index.ts +2 -0
  138. package/src/route/README.md +105 -0
  139. package/src/route/adapter/browser.ts +122 -0
  140. package/src/route/adapter/driver.ts +56 -0
  141. package/src/route/adapter/index.ts +2 -0
  142. package/src/route/index.ts +3 -0
  143. package/src/route/router/index.ts +2 -0
  144. package/src/route/router/route.ts +630 -0
  145. package/src/route/router/router.ts +1642 -0
  146. package/src/route/uri/hash.ts +308 -0
  147. package/src/route/uri/index.ts +7 -0
  148. package/src/route/uri/pathname.ts +376 -0
  149. package/src/route/uri/search.ts +413 -0
  150. package/src/socket/README.md +105 -0
  151. package/src/socket/client/index.ts +2 -0
  152. package/src/socket/client/socket-unit.ts +660 -0
  153. package/src/socket/client/socket.ts +203 -0
  154. package/src/socket/common/index.ts +2 -0
  155. package/src/socket/common/socket-unit-common.ts +23 -0
  156. package/src/socket/common/socket-unit-heartbeat.ts +427 -0
  157. package/src/socket/index.ts +3 -0
  158. package/src/socket/server/index.ts +3 -0
  159. package/src/socket/server/server.ts +183 -0
  160. package/src/socket/server/socket-unit.ts +449 -0
  161. package/src/socket/server/socket.ts +264 -0
  162. package/src/storage/table.ts +3 -3
  163. package/src/timer/expiration/expiration-manager.ts +3 -3
  164. package/src/timer/expiration/remaining-manager.ts +3 -3
  165. package/src/tube/README.md +99 -0
  166. package/src/tube/helper.ts +138 -0
  167. package/src/tube/index.ts +2 -0
  168. package/src/tube/tube.ts +880 -0
  169. package/src/weixin/README.md +1 -0
  170. package/src/weixin/index.ts +2 -0
  171. package/src/weixin/official-account/authorization.ts +159 -0
  172. package/src/weixin/official-account/index.ts +2 -0
  173. package/src/weixin/official-account/js-api.ts +134 -0
  174. package/src/weixin/open/index.ts +1 -0
  175. package/src/weixin/open/oauth2.ts +133 -0
  176. package/tests/unit/ai/ai.spec.ts +85 -0
  177. package/tests/unit/aio/content.spec.ts +105 -0
  178. package/tests/unit/aio/json.spec.ts +147 -0
  179. package/tests/unit/aio/prompt.spec.ts +111 -0
  180. package/tests/unit/basic/error.spec.ts +16 -4
  181. package/tests/unit/basic/schedule.spec.ts +74 -0
  182. package/tests/unit/basic/stream.spec.ts +90 -37
  183. package/tests/unit/credential/api-key.spec.ts +37 -0
  184. package/tests/unit/credential/bearer.spec.ts +23 -0
  185. package/tests/unit/credential/json-web-token.spec.ts +23 -0
  186. package/tests/unit/credential/password.spec.ts +41 -0
  187. package/tests/unit/cron/cron.spec.ts +84 -0
  188. package/tests/unit/event/class-event-proxy.spec.ts +3 -3
  189. package/tests/unit/event/event-manager.spec.ts +3 -3
  190. package/tests/unit/event/instance-event-proxy.spec.ts +3 -3
  191. package/tests/unit/form/inputor-controller/base.spec.ts +458 -0
  192. package/tests/unit/form/inputor-controller/boolean.spec.ts +30 -0
  193. package/tests/unit/form/inputor-controller/file.spec.ts +27 -0
  194. package/tests/unit/form/inputor-controller/form.spec.ts +120 -0
  195. package/tests/unit/form/inputor-controller/helper.spec.ts +67 -0
  196. package/tests/unit/form/inputor-controller/multi-select.spec.ts +34 -0
  197. package/tests/unit/form/inputor-controller/number.spec.ts +36 -0
  198. package/tests/unit/form/inputor-controller/select.spec.ts +49 -0
  199. package/tests/unit/form/inputor-controller/text.spec.ts +34 -0
  200. package/tests/unit/http/api/api-core-host.spec.ts +207 -0
  201. package/tests/unit/http/api/api-schema.spec.ts +120 -0
  202. package/tests/unit/http/api/api-server.spec.ts +363 -0
  203. package/tests/unit/http/api/api-test.spec.ts +117 -0
  204. package/tests/unit/http/api/api.spec.ts +121 -0
  205. package/tests/unit/http/api-adapter/node-http.spec.ts +191 -0
  206. package/tests/unit/json/repair.spec.ts +11 -0
  207. package/tests/unit/log/logger.spec.ts +19 -4
  208. package/tests/unit/openai/openai.spec.ts +64 -0
  209. package/tests/unit/orchestration/dispatching/dispatcher.spec.ts +41 -0
  210. package/tests/unit/orchestration/dispatching/selector/down-count-selector.spec.ts +81 -0
  211. package/tests/unit/orchestration/scheduling/scheduler.spec.ts +103 -0
  212. package/tests/unit/random/base.spec.ts +58 -0
  213. package/tests/unit/random/random-boolean.spec.ts +25 -0
  214. package/tests/unit/random/random-integer.spec.ts +32 -0
  215. package/tests/unit/random/random-number.spec.ts +33 -0
  216. package/tests/unit/random/random-string.spec.ts +22 -0
  217. package/tests/unit/request/fetch/browser.spec.ts +222 -0
  218. package/tests/unit/request/fetch/general.spec.ts +43 -0
  219. package/tests/unit/request/fetch/nodejs.spec.ts +225 -0
  220. package/tests/unit/request/request/base.spec.ts +385 -0
  221. package/tests/unit/request/request/general.spec.ts +161 -0
  222. package/tests/unit/route/router/route.spec.ts +431 -0
  223. package/tests/unit/route/router/router.spec.ts +407 -0
  224. package/tests/unit/route/uri/hash.spec.ts +72 -0
  225. package/tests/unit/route/uri/pathname.spec.ts +147 -0
  226. package/tests/unit/route/uri/search.spec.ts +107 -0
  227. package/tests/unit/socket/client.spec.ts +208 -0
  228. package/tests/unit/socket/server.spec.ts +135 -0
  229. package/tests/unit/socket/socket-unit-heartbeat.spec.ts +214 -0
  230. package/tests/unit/tube/helper.spec.ts +139 -0
  231. package/tests/unit/tube/tube.spec.ts +501 -0
  232. package/src/random/string.ts +0 -35
  233. 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,4 @@
1
+ export * as EmbeddingAi from "./embedding-ai.ts"
2
+
3
+ export * as Embedding from "./embedding.ts"
4
+ export * as OpenaiNextEmbedding from "./openai-next-embedding.ts"
@@ -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
+ }
@@ -0,0 +1,4 @@
1
+ export * as EmbeddingAi from "./embedding-ai/index.ts"
2
+ export * as ChatCompletionAi from "./chat-completion-ai/index.ts"
3
+
4
+ export * from "./ai.ts"