@effect/ai-openai 0.11.4 → 0.11.5
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/cjs/Generated.js +284 -334
- package/dist/cjs/Generated.js.map +1 -1
- package/dist/cjs/OpenAiClient.js +4 -1
- package/dist/cjs/OpenAiClient.js.map +1 -1
- package/dist/cjs/OpenAiConfig.js +10 -5
- package/dist/cjs/OpenAiConfig.js.map +1 -1
- package/dist/dts/Generated.d.ts +91 -75
- package/dist/dts/Generated.d.ts.map +1 -1
- package/dist/dts/OpenAiClient.d.ts.map +1 -1
- package/dist/dts/OpenAiConfig.d.ts +22 -58
- package/dist/dts/OpenAiConfig.d.ts.map +1 -1
- package/dist/esm/Generated.js +280 -331
- package/dist/esm/Generated.js.map +1 -1
- package/dist/esm/OpenAiClient.js +4 -1
- package/dist/esm/OpenAiClient.js.map +1 -1
- package/dist/esm/OpenAiConfig.js +9 -3
- package/dist/esm/OpenAiConfig.js.map +1 -1
- package/package.json +3 -3
- package/src/Generated.ts +983 -750
- package/src/OpenAiClient.ts +7 -1
- package/src/OpenAiConfig.ts +53 -8
package/dist/esm/OpenAiClient.js
CHANGED
|
@@ -18,6 +18,7 @@ import * as Option from "effect/Option";
|
|
|
18
18
|
import * as Redacted from "effect/Redacted";
|
|
19
19
|
import * as Stream from "effect/Stream";
|
|
20
20
|
import * as Generated from "./Generated.js";
|
|
21
|
+
import { OpenAiConfig } from "./OpenAiConfig.js";
|
|
21
22
|
/**
|
|
22
23
|
* @since 1.0.0
|
|
23
24
|
* @category tags
|
|
@@ -30,7 +31,9 @@ export class OpenAiClient extends /*#__PURE__*/Context.Tag("@effect/ai-openai/Op
|
|
|
30
31
|
export const make = options => Effect.gen(function* () {
|
|
31
32
|
const httpClient = (yield* HttpClient.HttpClient).pipe(HttpClient.mapRequest(request => request.pipe(HttpClientRequest.prependUrl(options.apiUrl ?? "https://api.openai.com/v1"), options.apiKey ? HttpClientRequest.bearerToken(options.apiKey) : identity, options.organizationId !== undefined ? HttpClientRequest.setHeader("OpenAI-Organization", Redacted.value(options.organizationId)) : identity, options.projectId !== undefined ? HttpClientRequest.setHeader("OpenAI-Project", Redacted.value(options.projectId)) : identity, HttpClientRequest.acceptJson)), options.transformClient ? options.transformClient : identity);
|
|
32
33
|
const httpClientOk = HttpClient.filterStatusOk(httpClient);
|
|
33
|
-
const client = Generated.make(httpClient
|
|
34
|
+
const client = Generated.make(httpClient, {
|
|
35
|
+
transformClient: client => OpenAiConfig.getOrUndefined.pipe(Effect.map(config => config?.transformClient ? config.transformClient(client) : client))
|
|
36
|
+
});
|
|
34
37
|
const streamRequest = request => httpClientOk.execute(request).pipe(Effect.map(r => r.stream), Stream.unwrapScoped, Stream.decodeText(), Stream.pipeThroughChannel(Sse.makeChannel()), Stream.takeWhile(event => event.data !== "[DONE]"), Stream.map(event => JSON.parse(event.data)));
|
|
35
38
|
const stream = request => Stream.suspend(() => {
|
|
36
39
|
const finishReasons = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAiClient.js","names":["AiResponse","AiRole","Sse","HttpBody","HttpClient","HttpClientRequest","Chunk","Config","Context","Data","Effect","identity","Layer","Option","Redacted","Stream","Generated","OpenAiClient","Tag","make","options","gen","httpClient","pipe","mapRequest","request","prependUrl","apiUrl","apiKey","bearerToken","organizationId","undefined","setHeader","value","projectId","acceptJson","transformClient","httpClientOk","filterStatusOk","client","
|
|
1
|
+
{"version":3,"file":"OpenAiClient.js","names":["AiResponse","AiRole","Sse","HttpBody","HttpClient","HttpClientRequest","Chunk","Config","Context","Data","Effect","identity","Layer","Option","Redacted","Stream","Generated","OpenAiConfig","OpenAiClient","Tag","make","options","gen","httpClient","pipe","mapRequest","request","prependUrl","apiUrl","apiKey","bearerToken","organizationId","undefined","setHeader","value","projectId","acceptJson","transformClient","httpClientOk","filterStatusOk","client","getOrUndefined","map","config","streamRequest","execute","r","stream","unwrapScoped","decodeText","pipeThroughChannel","makeChannel","takeWhile","event","data","JSON","parse","suspend","finishReasons","post","body","unsafeJson","stream_options","include_usage","mapAccum","Map","acc","chunk","parts","usage","push","_tag","id","model","inputTokens","prompt_tokens","outputTokens","completion_tokens","systemFingerprint","system_fingerprint","serviceTier","service_tier","i","choices","length","choice","finish_reason","delta","content","part","get","index","set","Array","isArray","tool_calls","toolCall","toolPart","arguments","function","role","toolParts","args","name","none","some","StreamChunk","filterMap","of","layer","effect","layerConfig","unwrap","flatMap","Class","text","asAiResponse","fromText","ToolCallPart","fromUnknown","params","empty"],"sources":["../../src/OpenAiClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/dist/esm/OpenAiConfig.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @since 1.0.0
|
|
3
|
-
*/
|
|
4
1
|
import * as Context from "effect/Context";
|
|
5
2
|
import * as Effect from "effect/Effect";
|
|
3
|
+
import { dual } from "effect/Function";
|
|
6
4
|
/**
|
|
7
5
|
* @since 1.0.0
|
|
8
6
|
* @category tags
|
|
@@ -13,4 +11,12 @@ export class OpenAiConfig extends /*#__PURE__*/Context.Tag("@effect/ai-openai/Op
|
|
|
13
11
|
*/
|
|
14
12
|
static getOrUndefined = /*#__PURE__*/Effect.map( /*#__PURE__*/Effect.context(), context => context.unsafeMap.get(OpenAiConfig.key));
|
|
15
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* @since 1.0.0
|
|
16
|
+
* @category configuration
|
|
17
|
+
*/
|
|
18
|
+
export const withClientTransform = /*#__PURE__*/dual(2, (self, transformClient) => Effect.flatMap(OpenAiConfig.getOrUndefined, config => Effect.provideService(self, OpenAiConfig, {
|
|
19
|
+
...config,
|
|
20
|
+
transformClient
|
|
21
|
+
})));
|
|
16
22
|
//# sourceMappingURL=OpenAiConfig.js.map
|
|
@@ -1 +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":"
|
|
1
|
+
{"version":3,"file":"OpenAiConfig.js","names":["Context","Effect","dual","OpenAiConfig","Tag","getOrUndefined","map","context","unsafeMap","get","key","withClientTransform","self","transformClient","flatMap","config","provideService"],"sources":["../../src/OpenAiConfig.ts"],"sourcesContent":[null],"mappings":"AAIA,OAAO,KAAKA,OAAO,MAAM,gBAAgB;AACzC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,SAASC,IAAI,QAAQ,iBAAiB;AAItC;;;;AAIA,OAAM,MAAOC,YAAa,sBAAQH,OAAO,CAACI,GAAG,CAAC,gCAAgC,CAAC,EAG5E;EACD;;;EAGA,OAAgBC,cAAc,gBAA2DJ,MAAM,CAACK,GAAG,eACjGL,MAAM,CAACM,OAAO,EAAS,EACtBA,OAAO,IAAKA,OAAO,CAACC,SAAS,CAACC,GAAG,CAACN,YAAY,CAACO,GAAG,CAAC,CACrD;;AA0BH;;;;AAIA,OAAO,MAAMC,mBAAmB,gBAAGT,IAAI,CAerC,CAAC,EACD,CAACU,IAAI,EAAEC,eAAe,KACpBZ,MAAM,CAACa,OAAO,CACZX,YAAY,CAACE,cAAc,EAC1BU,MAAM,IAAKd,MAAM,CAACe,cAAc,CAACJ,IAAI,EAAET,YAAY,EAAE;EAAE,GAAGY,MAAM;EAAEF;AAAe,CAAE,CAAC,CACtF,CACJ","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect/ai-openai",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.5",
|
|
4
4
|
"description": "Effect modules for working with AI apis",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
"peerDependencies": {
|
|
16
16
|
"@effect/ai": "^0.8.4",
|
|
17
17
|
"@effect/experimental": "^0.39.4",
|
|
18
|
-
"
|
|
19
|
-
"effect": "^
|
|
18
|
+
"effect": "^3.12.10",
|
|
19
|
+
"@effect/platform": "^0.75.4"
|
|
20
20
|
},
|
|
21
21
|
"publishConfig": {
|
|
22
22
|
"provenance": true
|