@effect/ai-openai 0.1.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 (51) hide show
  1. package/Generated/package.json +6 -0
  2. package/LICENSE +21 -0
  3. package/OpenAiClient/package.json +6 -0
  4. package/OpenAiCompletions/package.json +6 -0
  5. package/OpenAiConfig/package.json +6 -0
  6. package/OpenAiTokenizer/package.json +6 -0
  7. package/README.md +1 -0
  8. package/dist/cjs/Generated.js +2702 -0
  9. package/dist/cjs/Generated.js.map +1 -0
  10. package/dist/cjs/OpenAiClient.js +153 -0
  11. package/dist/cjs/OpenAiClient.js.map +1 -0
  12. package/dist/cjs/OpenAiCompletions.js +208 -0
  13. package/dist/cjs/OpenAiCompletions.js.map +1 -0
  14. package/dist/cjs/OpenAiConfig.js +26 -0
  15. package/dist/cjs/OpenAiConfig.js.map +1 -0
  16. package/dist/cjs/OpenAiTokenizer.js +50 -0
  17. package/dist/cjs/OpenAiTokenizer.js.map +1 -0
  18. package/dist/cjs/index.js +19 -0
  19. package/dist/cjs/index.js.map +1 -0
  20. package/dist/dts/Generated.d.ts +5759 -0
  21. package/dist/dts/Generated.d.ts.map +1 -0
  22. package/dist/dts/OpenAiClient.d.ts +113 -0
  23. package/dist/dts/OpenAiClient.d.ts.map +1 -0
  24. package/dist/dts/OpenAiCompletions.d.ts +19 -0
  25. package/dist/dts/OpenAiCompletions.d.ts.map +1 -0
  26. package/dist/dts/OpenAiConfig.d.ts +55 -0
  27. package/dist/dts/OpenAiConfig.d.ts.map +1 -0
  28. package/dist/dts/OpenAiTokenizer.d.ts +10 -0
  29. package/dist/dts/OpenAiTokenizer.d.ts.map +1 -0
  30. package/dist/dts/index.d.ts +21 -0
  31. package/dist/dts/index.d.ts.map +1 -0
  32. package/dist/esm/Generated.js +2493 -0
  33. package/dist/esm/Generated.js.map +1 -0
  34. package/dist/esm/OpenAiClient.js +139 -0
  35. package/dist/esm/OpenAiClient.js.map +1 -0
  36. package/dist/esm/OpenAiCompletions.js +197 -0
  37. package/dist/esm/OpenAiCompletions.js.map +1 -0
  38. package/dist/esm/OpenAiConfig.js +16 -0
  39. package/dist/esm/OpenAiConfig.js.map +1 -0
  40. package/dist/esm/OpenAiTokenizer.js +40 -0
  41. package/dist/esm/OpenAiTokenizer.js.map +1 -0
  42. package/dist/esm/index.js +21 -0
  43. package/dist/esm/index.js.map +1 -0
  44. package/dist/esm/package.json +4 -0
  45. package/package.json +80 -0
  46. package/src/Generated.ts +3936 -0
  47. package/src/OpenAiClient.ts +291 -0
  48. package/src/OpenAiCompletions.ts +260 -0
  49. package/src/OpenAiConfig.ts +31 -0
  50. package/src/OpenAiTokenizer.ts +59 -0
  51. package/src/index.ts +24 -0
@@ -0,0 +1,197 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import { AiError } from "@effect/ai/AiError";
5
+ import * as AiResponse from "@effect/ai/AiResponse";
6
+ import * as AiRole from "@effect/ai/AiRole";
7
+ import * as Completions from "@effect/ai/Completions";
8
+ import * as Arr from "effect/Array";
9
+ import * as Effect from "effect/Effect";
10
+ import * as Layer from "effect/Layer";
11
+ import * as Stream from "effect/Stream";
12
+ import { OpenAiClient } from "./OpenAiClient.js";
13
+ import { OpenAiConfig } from "./OpenAiConfig.js";
14
+ import * as OpenAiTokenizer from "./OpenAiTokenizer.js";
15
+ const make = options => Effect.gen(function* () {
16
+ const client = yield* OpenAiClient;
17
+ const config = yield* OpenAiConfig.getOrUndefined;
18
+ const makeRequest = ({
19
+ input,
20
+ required,
21
+ system,
22
+ tools
23
+ }) => Effect.map(Effect.context(), context => ({
24
+ model: options.model,
25
+ ...config,
26
+ ...context.unsafeMap.get(OpenAiConfig.key),
27
+ messages: makeMessages(input, system),
28
+ tools: tools.length > 0 ? tools.map(tool => ({
29
+ type: "function",
30
+ function: {
31
+ name: tool.name,
32
+ description: tool.description,
33
+ parameters: tool.parameters,
34
+ strict: true
35
+ }
36
+ })) : undefined,
37
+ tool_choice: tools.length > 0 ? typeof required === "boolean" ? required ? "required" : "auto" : {
38
+ type: "function",
39
+ function: {
40
+ name: required
41
+ }
42
+ } : undefined
43
+ }));
44
+ return yield* Completions.make({
45
+ create(options) {
46
+ return makeRequest(options).pipe(Effect.flatMap(client.client.createChatCompletion), Effect.catchAll(cause => Effect.fail(new AiError({
47
+ module: "OpenAiCompletions",
48
+ method: "create",
49
+ description: "An error occurred",
50
+ cause
51
+ }))), Effect.flatMap(response => makeResponse(response, "create")));
52
+ },
53
+ stream(options) {
54
+ return makeRequest(options).pipe(Effect.map(client.stream), Stream.unwrap, Stream.catchAll(cause => Effect.fail(new AiError({
55
+ module: "OpenAiCompletions",
56
+ method: "stream",
57
+ description: "An error occurred",
58
+ cause
59
+ }))), Stream.map(response => response.asAiResponse));
60
+ }
61
+ });
62
+ });
63
+ /**
64
+ * @since 1.0.0
65
+ * @category layers
66
+ */
67
+ export const layerCompletions = options => Layer.effect(Completions.Completions, make(options));
68
+ /**
69
+ * @since 1.0.0
70
+ * @category layers
71
+ */
72
+ export const layer = options => Layer.merge(layerCompletions(options), OpenAiTokenizer.layer(options));
73
+ const makeMessages = (input, system) => {
74
+ const messages = system._tag === "Some" ? [makeSystemMessage(system.value)] : [];
75
+ for (const message of input) {
76
+ // eslint-disable-next-line no-restricted-syntax
77
+ messages.push(...convertMessage(message));
78
+ }
79
+ return messages;
80
+ };
81
+ const formatRole = role => {
82
+ switch (role._tag) {
83
+ case "UserWithName":
84
+ return {
85
+ role: "user",
86
+ name: safeName(role.name)
87
+ };
88
+ case "User":
89
+ return {
90
+ role: "user"
91
+ };
92
+ case "Model":
93
+ return {
94
+ role: "assistant"
95
+ };
96
+ }
97
+ };
98
+ const convertMessage = message => {
99
+ const messages = [];
100
+ let parts = [];
101
+ let toolCalls = [];
102
+ function flushContent() {
103
+ if (parts.length === 0) return;
104
+ messages.push({
105
+ ...formatRole(message.role),
106
+ content: parts
107
+ });
108
+ parts = [];
109
+ }
110
+ function flushToolCalls() {
111
+ if (toolCalls.length === 0) return;
112
+ messages.push({
113
+ role: "assistant",
114
+ content: null,
115
+ tool_calls: toolCalls
116
+ });
117
+ toolCalls = [];
118
+ }
119
+ for (const part of message.parts) {
120
+ if (part._tag === "ToolCall") {
121
+ flushContent();
122
+ toolCalls.push({
123
+ id: part.id,
124
+ type: "function",
125
+ function: {
126
+ name: part.name,
127
+ arguments: JSON.stringify(part.params)
128
+ }
129
+ });
130
+ } else if (part._tag === "ToolCallResolved") {
131
+ flushContent();
132
+ flushToolCalls();
133
+ messages.push({
134
+ role: "tool",
135
+ tool_call_id: part.toolCallId,
136
+ content: JSON.stringify(part.value)
137
+ });
138
+ } else {
139
+ flushToolCalls();
140
+ parts.push(makeContentPart(part));
141
+ }
142
+ }
143
+ flushContent();
144
+ flushToolCalls();
145
+ return messages;
146
+ };
147
+ const makeContentPart = part => {
148
+ switch (part._tag) {
149
+ case "Image":
150
+ return {
151
+ type: "image_url",
152
+ image_url: {
153
+ url: part.asDataUri,
154
+ detail: part.quality
155
+ }
156
+ };
157
+ case "ImageUrl":
158
+ return {
159
+ type: "image_url",
160
+ image_url: {
161
+ url: part.url,
162
+ detail: part.quality
163
+ }
164
+ };
165
+ case "Text":
166
+ return {
167
+ type: "text",
168
+ text: part.content
169
+ };
170
+ }
171
+ };
172
+ const makeResponse = (response, method) => Arr.head(response.choices).pipe(Effect.mapError(() => new AiError({
173
+ module: "OpenAiCompletions",
174
+ method,
175
+ description: "Could not get response"
176
+ })), Effect.flatMap(choice => {
177
+ const response = typeof choice.message.content === "string" ? AiResponse.AiResponse.fromText({
178
+ role: AiRole.model,
179
+ content: choice.message.content
180
+ }) : AiResponse.AiResponse.empty;
181
+ if (choice.message.tool_calls && choice.message.tool_calls.length > 0) {
182
+ return response.withToolCallsJson(choice.message.tool_calls.map(toolCall => ({
183
+ id: toolCall.id,
184
+ name: toolCall.function.name,
185
+ params: toolCall.function.arguments
186
+ })));
187
+ }
188
+ return Effect.succeed(response);
189
+ }));
190
+ const makeSystemMessage = content => {
191
+ return {
192
+ role: "system",
193
+ content
194
+ };
195
+ };
196
+ const safeName = name => name.replace(/[^a-zA-Z0-9_-]/g, "_").replace(/_+/, "_");
197
+ //# sourceMappingURL=OpenAiCompletions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenAiCompletions.js","names":["AiError","AiResponse","AiRole","Completions","Arr","Effect","Layer","Stream","OpenAiClient","OpenAiConfig","OpenAiTokenizer","make","options","gen","client","config","getOrUndefined","makeRequest","input","required","system","tools","map","context","model","unsafeMap","get","key","messages","makeMessages","length","tool","type","function","name","description","parameters","strict","undefined","tool_choice","create","pipe","flatMap","createChatCompletion","catchAll","cause","fail","module","method","response","makeResponse","stream","unwrap","asAiResponse","layerCompletions","effect","layer","merge","_tag","makeSystemMessage","value","message","push","convertMessage","formatRole","role","safeName","parts","toolCalls","flushContent","content","flushToolCalls","tool_calls","part","id","arguments","JSON","stringify","params","tool_call_id","toolCallId","makeContentPart","image_url","url","asDataUri","detail","quality","text","head","choices","mapError","choice","fromText","empty","withToolCallsJson","toolCall","succeed","replace"],"sources":["../../src/OpenAiCompletions.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as Context from "effect/Context";
5
+ import * as Effect from "effect/Effect";
6
+ /**
7
+ * @since 1.0.0
8
+ * @category tags
9
+ */
10
+ export class OpenAiConfig extends /*#__PURE__*/Context.Tag("@effect/ai-openai/OpenAiConfig")() {
11
+ /**
12
+ * @since 1.0.0
13
+ */
14
+ static getOrUndefined = /*#__PURE__*/Effect.map( /*#__PURE__*/Effect.context(), context => context.unsafeMap.get(OpenAiConfig.key));
15
+ }
16
+ //# sourceMappingURL=OpenAiConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenAiConfig.js","names":["Context","Effect","OpenAiConfig","Tag","getOrUndefined","map","context","unsafeMap","get","key"],"sources":["../../src/OpenAiConfig.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,OAAO,MAAM,gBAAgB;AACzC,OAAO,KAAKC,MAAM,MAAM,eAAe;AAIvC;;;;AAIA,OAAM,MAAOC,YAAa,sBAAQF,OAAO,CAACG,GAAG,CAAC,gCAAgC,CAAC,EAU5E;EACD;;;EAGA,OAAgBC,cAAc,gBAA2DH,MAAM,CAACI,GAAG,eACjGJ,MAAM,CAACK,OAAO,EAAS,EACtBA,OAAO,IAAKA,OAAO,CAACC,SAAS,CAACC,GAAG,CAACN,YAAY,CAACO,GAAG,CAAC,CACrD","ignoreList":[]}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import { AiError } from "@effect/ai/AiError";
5
+ import * as Tokenizer from "@effect/ai/Tokenizer";
6
+ import * as Arr from "effect/Array";
7
+ import * as Chunk from "effect/Chunk";
8
+ import * as Effect from "effect/Effect";
9
+ import * as Layer from "effect/Layer";
10
+ import * as Option from "effect/Option";
11
+ import * as GptTokenizer from "gpt-tokenizer";
12
+ import { OpenAiConfig } from "./OpenAiConfig.js";
13
+ const make = options => Tokenizer.make({
14
+ tokenize(content) {
15
+ return Effect.tryMap(OpenAiConfig.getOrUndefined, {
16
+ try: localConfig => GptTokenizer.encodeChat(content.pipe(Chunk.toReadonlyArray, Arr.flatMap(message => message.parts.pipe(Arr.filterMap(part => {
17
+ if (part._tag === "Image" || part._tag === "ImageUrl") {
18
+ return Option.none();
19
+ }
20
+ return Option.some({
21
+ role: message.role.kind === "user" ? "user" : "assistant",
22
+ name: message.role._tag === "UserWithName" ? message.role.name : undefined,
23
+ content: part._tag === "Text" ? part.content : JSON.stringify(part._tag === "ToolCall" ? part.params : part.value)
24
+ });
25
+ })))), localConfig?.model ?? options.model),
26
+ catch: cause => new AiError({
27
+ module: "OpenAiCompletions",
28
+ method: "tokenize",
29
+ description: "Could not tokenize",
30
+ cause
31
+ })
32
+ });
33
+ }
34
+ });
35
+ /**
36
+ * @since 1.0.0
37
+ * @category layers
38
+ */
39
+ export const layer = options => Layer.succeed(Tokenizer.Tokenizer, make(options));
40
+ //# sourceMappingURL=OpenAiTokenizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenAiTokenizer.js","names":["AiError","Tokenizer","Arr","Chunk","Effect","Layer","Option","GptTokenizer","OpenAiConfig","make","options","tokenize","content","tryMap","getOrUndefined","try","localConfig","encodeChat","pipe","toReadonlyArray","flatMap","message","parts","filterMap","part","_tag","none","some","role","kind","name","undefined","JSON","stringify","params","value","model","catch","cause","module","method","description","layer","succeed"],"sources":["../../src/OpenAiTokenizer.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,SAASA,OAAO,QAAQ,oBAAoB;AAC5C,OAAO,KAAKC,SAAS,MAAM,sBAAsB;AACjD,OAAO,KAAKC,GAAG,MAAM,cAAc;AACnC,OAAO,KAAKC,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,YAAY,MAAM,eAAe;AAC7C,SAASC,YAAY,QAAQ,mBAAmB;AAEhD,MAAMC,IAAI,GAAIC,OAAmC,IAC/CT,SAAS,CAACQ,IAAI,CAAC;EACbE,QAAQA,CAACC,OAAO;IACd,OAAOR,MAAM,CAACS,MAAM,CAACL,YAAY,CAACM,cAAc,EAAE;MAChDC,GAAG,EAAGC,WAAW,IACfT,YAAY,CAACU,UAAU,CACrBL,OAAO,CAACM,IAAI,CACVf,KAAK,CAACgB,eAAe,EACrBjB,GAAG,CAACkB,OAAO,CAAEC,OAAO,IAClBA,OAAO,CAACC,KAAK,CAACJ,IAAI,CAChBhB,GAAG,CAACqB,SAAS,CAAEC,IAAI,IAAI;QACrB,IAAIA,IAAI,CAACC,IAAI,KAAK,OAAO,IAAID,IAAI,CAACC,IAAI,KAAK,UAAU,EAAE;UACrD,OAAOnB,MAAM,CAACoB,IAAI,EAAE;QACtB;QACA,OAAOpB,MAAM,CAACqB,IAAI,CAChB;UACEC,IAAI,EAAEP,OAAO,CAACO,IAAI,CAACC,IAAI,KAAK,MAAM,GAAG,MAAM,GAAG,WAAW;UACzDC,IAAI,EAAET,OAAO,CAACO,IAAI,CAACH,IAAI,KAAK,cAAc,GAAGJ,OAAO,CAACO,IAAI,CAACE,IAAI,GAAGC,SAAS;UAC1EnB,OAAO,EAAEY,IAAI,CAACC,IAAI,KAAK,MAAM,GACzBD,IAAI,CAACZ,OAAO,GACZoB,IAAI,CAACC,SAAS,CAACT,IAAI,CAACC,IAAI,KAAK,UAAU,GAAGD,IAAI,CAACU,MAAM,GAAGV,IAAI,CAACW,KAAK;SAC9D,CACX;MACH,CAAC,CAAC,CACH,CACF,CACF,EACDnB,WAAW,EAAEoB,KAAK,IAAI1B,OAAO,CAAC0B,KAAY,CAC3C;MACHC,KAAK,EAAGC,KAAK,IACX,IAAItC,OAAO,CAAC;QACVuC,MAAM,EAAE,mBAAmB;QAC3BC,MAAM,EAAE,UAAU;QAClBC,WAAW,EAAE,oBAAoB;QACjCH;OACD;KACJ,CAAC;EACJ;CACD,CAAC;AAEJ;;;;AAIA,OAAO,MAAMI,KAAK,GAAIhC,OAAmC,IACvDL,KAAK,CAACsC,OAAO,CAAC1C,SAAS,CAACA,SAAS,EAAEQ,IAAI,CAACC,OAAO,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ export * as Generated from "./Generated.js";
5
+ /**
6
+ * @since 1.0.0
7
+ */
8
+ export * as OpenAiClient from "./OpenAiClient.js";
9
+ /**
10
+ * @since 1.0.0
11
+ */
12
+ export * as OpenAiCompletions from "./OpenAiCompletions.js";
13
+ /**
14
+ * @since 1.0.0
15
+ */
16
+ export * as OpenAiConfig from "./OpenAiConfig.js";
17
+ /**
18
+ * @since 1.0.0
19
+ */
20
+ export * as OpenAiTokenizer from "./OpenAiTokenizer.js";
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["Generated","OpenAiClient","OpenAiCompletions","OpenAiConfig","OpenAiTokenizer"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,SAAS,MAAM,gBAAgB;AAE3C;;;AAGA,OAAO,KAAKC,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAKC,iBAAiB,MAAM,wBAAwB;AAE3D;;;AAGA,OAAO,KAAKC,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAKC,eAAe,MAAM,sBAAsB","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ {
2
+ "type": "module",
3
+ "sideEffects": []
4
+ }
package/package.json ADDED
@@ -0,0 +1,80 @@
1
+ {
2
+ "name": "@effect/ai-openai",
3
+ "version": "0.1.0",
4
+ "description": "Effect modules for working with AI apis",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/Effect-TS/effect.git",
9
+ "directory": "packages/ai/openai"
10
+ },
11
+ "sideEffects": [],
12
+ "dependencies": {
13
+ "gpt-tokenizer": "^2.2.3"
14
+ },
15
+ "peerDependencies": {
16
+ "@effect/ai": "^0.1.0",
17
+ "@effect/experimental": "^0.29.2",
18
+ "@effect/platform": "^0.68.2",
19
+ "@effect/schema": "^0.75.3",
20
+ "effect": "^3.9.1"
21
+ },
22
+ "publishConfig": {
23
+ "provenance": true
24
+ },
25
+ "main": "./dist/cjs/index.js",
26
+ "module": "./dist/esm/index.js",
27
+ "types": "./dist/dts/index.d.ts",
28
+ "exports": {
29
+ "./package.json": "./package.json",
30
+ ".": {
31
+ "types": "./dist/dts/index.d.ts",
32
+ "import": "./dist/esm/index.js",
33
+ "default": "./dist/cjs/index.js"
34
+ },
35
+ "./Generated": {
36
+ "types": "./dist/dts/Generated.d.ts",
37
+ "import": "./dist/esm/Generated.js",
38
+ "default": "./dist/cjs/Generated.js"
39
+ },
40
+ "./OpenAiClient": {
41
+ "types": "./dist/dts/OpenAiClient.d.ts",
42
+ "import": "./dist/esm/OpenAiClient.js",
43
+ "default": "./dist/cjs/OpenAiClient.js"
44
+ },
45
+ "./OpenAiCompletions": {
46
+ "types": "./dist/dts/OpenAiCompletions.d.ts",
47
+ "import": "./dist/esm/OpenAiCompletions.js",
48
+ "default": "./dist/cjs/OpenAiCompletions.js"
49
+ },
50
+ "./OpenAiConfig": {
51
+ "types": "./dist/dts/OpenAiConfig.d.ts",
52
+ "import": "./dist/esm/OpenAiConfig.js",
53
+ "default": "./dist/cjs/OpenAiConfig.js"
54
+ },
55
+ "./OpenAiTokenizer": {
56
+ "types": "./dist/dts/OpenAiTokenizer.d.ts",
57
+ "import": "./dist/esm/OpenAiTokenizer.js",
58
+ "default": "./dist/cjs/OpenAiTokenizer.js"
59
+ }
60
+ },
61
+ "typesVersions": {
62
+ "*": {
63
+ "Generated": [
64
+ "./dist/dts/Generated.d.ts"
65
+ ],
66
+ "OpenAiClient": [
67
+ "./dist/dts/OpenAiClient.d.ts"
68
+ ],
69
+ "OpenAiCompletions": [
70
+ "./dist/dts/OpenAiCompletions.d.ts"
71
+ ],
72
+ "OpenAiConfig": [
73
+ "./dist/dts/OpenAiConfig.d.ts"
74
+ ],
75
+ "OpenAiTokenizer": [
76
+ "./dist/dts/OpenAiTokenizer.d.ts"
77
+ ]
78
+ }
79
+ }
80
+ }