@yolk-sdk/openai 0.0.1-canary.2 → 0.0.1-canary.4
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/README.md +88 -8
- package/dist/codex-provider.d.mts +72 -0
- package/dist/codex-provider.d.mts.map +1 -0
- package/dist/codex-provider.mjs +481 -0
- package/dist/codex-provider.mjs.map +1 -0
- package/dist/codex.d.mts +2 -1
- package/dist/codex.d.mts.map +1 -1
- package/dist/codex.mjs +2 -1
- package/dist/codex.mjs.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/provider.d.mts +68 -0
- package/dist/provider.d.mts.map +1 -0
- package/dist/provider.mjs +234 -0
- package/dist/provider.mjs.map +1 -0
- package/package.json +18 -2
- package/src/codex-provider.ts +977 -0
- package/src/codex.ts +2 -0
- package/src/index.ts +1 -0
- package/src/provider.ts +501 -0
package/README.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# @yolk-sdk/openai
|
|
2
2
|
|
|
3
|
-
OpenAI-family provider mechanics for
|
|
3
|
+
OpenAI-family OAuth helpers and agent provider mechanics for Yolk hosts.
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
pnpm add @yolk-sdk/openai@canary @yolk-sdk/oauth@canary effect
|
|
8
|
+
pnpm add @yolk-sdk/openai@canary @yolk-sdk/agent@canary @yolk-sdk/oauth@canary effect
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
Canary APIs are unstable. Keep all `@yolk-sdk/*` packages on the same version.
|
|
@@ -14,7 +14,10 @@ Canary APIs are unstable. Keep all `@yolk-sdk/*` packages on the same version.
|
|
|
14
14
|
|
|
15
15
|
| Subpath | Purpose |
|
|
16
16
|
| --- | --- |
|
|
17
|
-
| `@yolk-sdk/openai` |
|
|
17
|
+
| `@yolk-sdk/openai` | Convenience root for Codex OAuth helpers |
|
|
18
|
+
| `@yolk-sdk/openai/codex` | Codex OAuth constants, token schemas, broker helpers, and auth headers |
|
|
19
|
+
| `@yolk-sdk/openai/codex-provider` | Codex `LLMProvider` layer, request lowering, SSE/JSON stream parsing, and usage mapping |
|
|
20
|
+
| `@yolk-sdk/openai/provider` | OpenAI API-key Chat Completions `LLMProvider` layer |
|
|
18
21
|
|
|
19
22
|
## Imports
|
|
20
23
|
|
|
@@ -24,10 +27,85 @@ import {
|
|
|
24
27
|
makeOpenAiCodexTokenBrokerClient,
|
|
25
28
|
openAiCodexAuthorizationHeaders,
|
|
26
29
|
openAiCodexProviderId,
|
|
27
|
-
|
|
28
|
-
} from '@yolk-sdk/openai'
|
|
30
|
+
toOpenAiCodexOAuthAccessToken
|
|
31
|
+
} from '@yolk-sdk/openai/codex'
|
|
32
|
+
|
|
33
|
+
import { makeOpenAiCodexProviderLayer } from '@yolk-sdk/openai/codex-provider'
|
|
34
|
+
import { makeOpenAiProviderLayer } from '@yolk-sdk/openai/provider'
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Codex provider layer
|
|
38
|
+
|
|
39
|
+
Use `makeOpenAiCodexProviderLayer` with `@yolk-sdk/agent/loop` when a host already owns Codex
|
|
40
|
+
OAuth/device-flow credentials.
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import { FetchHttpClient } from 'effect/unstable/http'
|
|
44
|
+
import { Layer, Stream } from 'effect'
|
|
45
|
+
import { makeOpenAiCodexProviderLayer } from '@yolk-sdk/openai/codex-provider'
|
|
46
|
+
import { ContextTransformer, LoopConfig, run } from '@yolk-sdk/agent/loop'
|
|
47
|
+
|
|
48
|
+
const providerLayer = makeOpenAiCodexProviderLayer({
|
|
49
|
+
token,
|
|
50
|
+
defaultReasoningEffort: 'low',
|
|
51
|
+
reasoningSummary: 'auto'
|
|
52
|
+
}).pipe(Layer.provide(FetchHttpClient.layer))
|
|
53
|
+
|
|
54
|
+
const runtimeLayer = Layer.mergeAll(
|
|
55
|
+
ContextTransformer.identity,
|
|
56
|
+
LoopConfig.defaultLayer,
|
|
57
|
+
providerLayer
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
const events = run({
|
|
61
|
+
messages,
|
|
62
|
+
systemPrompt,
|
|
63
|
+
tools,
|
|
64
|
+
model: 'gpt-5.4'
|
|
65
|
+
}).pipe(Stream.provide(runtimeLayer))
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
The Codex provider:
|
|
69
|
+
|
|
70
|
+
- Lowers Yolk `LLMRequest` messages/tools/images to Codex Responses input.
|
|
71
|
+
- Handles Codex JSON and SSE response bodies, including non-`event-stream` SSE bodies.
|
|
72
|
+
- Emits Yolk loop events: text deltas, reasoning deltas, tool calls, done, and usage.
|
|
73
|
+
- Preserves `originator` and optional `ChatGPT-Account-Id` auth headers.
|
|
74
|
+
|
|
75
|
+
Config:
|
|
76
|
+
|
|
77
|
+
| Option | Purpose |
|
|
78
|
+
| --- | --- |
|
|
79
|
+
| `token` | Required `OAuthAccessToken` from `@yolk-sdk/oauth` |
|
|
80
|
+
| `responsesUrl` | Optional Codex Responses URL override for tests/gateways |
|
|
81
|
+
| `defaultReasoningEffort` | Fallback reasoning effort when request omits one |
|
|
82
|
+
| `reasoningSummary` | Codex reasoning summary mode; defaults to `auto` |
|
|
83
|
+
| `extraHeaders` | Optional host/gateway headers |
|
|
84
|
+
|
|
85
|
+
## OpenAI API-key provider layer
|
|
86
|
+
|
|
87
|
+
`makeOpenAiProviderLayer` provides a Chat Completions-compatible `LLMProvider` for hosts with
|
|
88
|
+
an OpenAI API key.
|
|
89
|
+
|
|
90
|
+
```ts
|
|
91
|
+
import { Layer, Redacted } from 'effect'
|
|
92
|
+
import { FetchHttpClient } from 'effect/unstable/http'
|
|
93
|
+
import { makeOpenAiProviderLayer } from '@yolk-sdk/openai/provider'
|
|
94
|
+
|
|
95
|
+
const providerLayer = makeOpenAiProviderLayer({
|
|
96
|
+
apiKey: Redacted.make(process.env.OPENAI_API_KEY ?? '')
|
|
97
|
+
}).pipe(Layer.provide(FetchHttpClient.layer))
|
|
29
98
|
```
|
|
30
99
|
|
|
100
|
+
Config:
|
|
101
|
+
|
|
102
|
+
| Option | Purpose |
|
|
103
|
+
| --- | --- |
|
|
104
|
+
| `apiKey` | Required redacted OpenAI API key |
|
|
105
|
+
| `chatCompletionsUrl` | Optional Chat Completions URL override |
|
|
106
|
+
| `maxCompletionTokens` | Optional output token limit override |
|
|
107
|
+
| `extraHeaders` | Optional host/gateway headers |
|
|
108
|
+
|
|
31
109
|
## Broker request
|
|
32
110
|
|
|
33
111
|
```ts
|
|
@@ -45,7 +123,8 @@ Hosts route this request to an authenticated token broker. The package never sto
|
|
|
45
123
|
const headers = openAiCodexAuthorizationHeaders(token)
|
|
46
124
|
```
|
|
47
125
|
|
|
48
|
-
Use these headers in host-owned Codex request adapters.
|
|
126
|
+
Use these headers in host-owned Codex request adapters. Prefer
|
|
127
|
+
`makeOpenAiCodexProviderLayer` when executing the Yolk agent loop directly.
|
|
49
128
|
|
|
50
129
|
## Exposed constants
|
|
51
130
|
|
|
@@ -58,10 +137,11 @@ Use these headers in host-owned Codex request adapters.
|
|
|
58
137
|
|
|
59
138
|
- Own device flow UI, session mapping, refresh-token storage, and policy.
|
|
60
139
|
- Provide token brokers through `@yolk-sdk/oauth` contracts.
|
|
61
|
-
- Own
|
|
140
|
+
- Own token lookup/refresh, telemetry, error reporting, and product routing.
|
|
62
141
|
|
|
63
142
|
## Boundaries
|
|
64
143
|
|
|
65
144
|
- No app users, sessions, DB, Better Auth, routes, or Durable Objects.
|
|
66
145
|
- No OpenAI SDK dependency.
|
|
67
|
-
-
|
|
146
|
+
- Provider layers depend only on Yolk agent/OAuth contracts plus Effect HTTP.
|
|
147
|
+
- Hosts own token storage, refresh, model routing, app policy, and telemetry.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Effect, Layer, Stream } from "effect";
|
|
2
|
+
import { HttpClient, HttpClientResponse } from "effect/unstable/http";
|
|
3
|
+
import { AgentReasoningEffort } from "@yolk-sdk/agent/protocol";
|
|
4
|
+
import { LLMError, LLMEvent, LLMProvider, LLMRequest } from "@yolk-sdk/agent/loop";
|
|
5
|
+
import { OAuthAccessToken } from "@yolk-sdk/oauth";
|
|
6
|
+
|
|
7
|
+
//#region src/codex-provider.d.ts
|
|
8
|
+
type OpenAiCodexReasoningSummary = 'auto' | 'concise' | 'detailed';
|
|
9
|
+
type OpenAiCodexProviderConfig = {
|
|
10
|
+
readonly token: OAuthAccessToken;
|
|
11
|
+
readonly responsesUrl?: string;
|
|
12
|
+
readonly extraHeaders?: Readonly<Record<string, string>>;
|
|
13
|
+
readonly defaultReasoningEffort?: AgentReasoningEffort;
|
|
14
|
+
readonly reasoningSummary?: OpenAiCodexReasoningSummary;
|
|
15
|
+
};
|
|
16
|
+
type OpenAiCodexMessageInput = {
|
|
17
|
+
readonly role: 'user' | 'assistant';
|
|
18
|
+
readonly content: string | ReadonlyArray<OpenAiCodexInputContentPart>;
|
|
19
|
+
};
|
|
20
|
+
type OpenAiCodexInputTextPart = {
|
|
21
|
+
readonly type: 'input_text';
|
|
22
|
+
readonly text: string;
|
|
23
|
+
};
|
|
24
|
+
type OpenAiCodexInputImagePart = {
|
|
25
|
+
readonly type: 'input_image';
|
|
26
|
+
readonly image_url: string;
|
|
27
|
+
};
|
|
28
|
+
type OpenAiCodexOutputTextPart = {
|
|
29
|
+
readonly type: 'output_text';
|
|
30
|
+
readonly text: string;
|
|
31
|
+
};
|
|
32
|
+
type OpenAiCodexInputContentPart = OpenAiCodexInputTextPart | OpenAiCodexInputImagePart | OpenAiCodexOutputTextPart;
|
|
33
|
+
type OpenAiCodexFunctionCallInput = {
|
|
34
|
+
readonly type: 'function_call';
|
|
35
|
+
readonly call_id: string;
|
|
36
|
+
readonly name: string;
|
|
37
|
+
readonly arguments: string;
|
|
38
|
+
};
|
|
39
|
+
type OpenAiCodexFunctionOutputInput = {
|
|
40
|
+
readonly type: 'function_call_output';
|
|
41
|
+
readonly call_id: string;
|
|
42
|
+
readonly output: string;
|
|
43
|
+
};
|
|
44
|
+
type OpenAiCodexInputItem = OpenAiCodexMessageInput | OpenAiCodexFunctionCallInput | OpenAiCodexFunctionOutputInput;
|
|
45
|
+
type OpenAiCodexTool = {
|
|
46
|
+
readonly type: 'function';
|
|
47
|
+
readonly name: string;
|
|
48
|
+
readonly description: string;
|
|
49
|
+
readonly parameters: unknown;
|
|
50
|
+
};
|
|
51
|
+
type OpenAiCodexRequestBody = {
|
|
52
|
+
readonly model: string;
|
|
53
|
+
readonly instructions: string;
|
|
54
|
+
readonly input: ReadonlyArray<OpenAiCodexInputItem>;
|
|
55
|
+
readonly store: false;
|
|
56
|
+
readonly stream: true;
|
|
57
|
+
readonly reasoning: {
|
|
58
|
+
readonly effort: AgentReasoningEffort;
|
|
59
|
+
readonly summary: OpenAiCodexReasoningSummary;
|
|
60
|
+
};
|
|
61
|
+
readonly tools?: ReadonlyArray<OpenAiCodexTool>;
|
|
62
|
+
readonly parallel_tool_calls?: true;
|
|
63
|
+
};
|
|
64
|
+
declare const toOpenAiCodexRequestBody: (request: LLMRequest, config?: {
|
|
65
|
+
readonly defaultReasoningEffort?: AgentReasoningEffort;
|
|
66
|
+
readonly reasoningSummary?: OpenAiCodexReasoningSummary;
|
|
67
|
+
}) => Effect.Effect<OpenAiCodexRequestBody, LLMError>;
|
|
68
|
+
declare const streamOpenAiCodexResponse: (response: HttpClientResponse.HttpClientResponse) => Stream.Stream<LLMEvent, LLMError>;
|
|
69
|
+
declare const makeOpenAiCodexProviderLayer: (config: OpenAiCodexProviderConfig) => Layer.Layer<LLMProvider, never, HttpClient.HttpClient>;
|
|
70
|
+
//#endregion
|
|
71
|
+
export { OpenAiCodexProviderConfig, OpenAiCodexReasoningSummary, makeOpenAiCodexProviderLayer, streamOpenAiCodexResponse, toOpenAiCodexRequestBody };
|
|
72
|
+
//# sourceMappingURL=codex-provider.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-provider.d.mts","names":[],"sources":["../src/codex-provider.ts"],"mappings":";;;;;;;KAoCY,2BAAA;AAAA,KAEA,yBAAA;EAAA,SACD,KAAA,EAAO,gBAAA;EAAA,SACP,YAAA;EAAA,SACA,YAAA,GAAe,QAAA,CAAS,MAAA;EAAA,SACxB,sBAAA,GAAyB,oBAAA;EAAA,SACzB,gBAAA,GAAmB,2BAAA;AAAA;AAAA,KAGzB,uBAAA;EAAA,SACM,IAAA;EAAA,SACA,OAAA,WAAkB,aAAa,CAAC,2BAAA;AAAA;AAAA,KAGtC,wBAAA;EAAA,SACM,IAAA;EAAA,SACA,IAAI;AAAA;AAAA,KAGV,yBAAA;EAAA,SACM,IAAA;EAAA,SACA,SAAS;AAAA;AAAA,KAGf,yBAAA;EAAA,SACM,IAAA;EAAA,SACA,IAAI;AAAA;AAAA,KAGV,2BAAA,GACD,wBAAA,GACA,yBAAA,GACA,yBAAA;AAAA,KAEC,4BAAA;EAAA,SACM,IAAA;EAAA,SACA,OAAA;EAAA,SACA,IAAA;EAAA,SACA,SAAA;AAAA;AAAA,KAGN,8BAAA;EAAA,SACM,IAAA;EAAA,SACA,OAAA;EAAA,SACA,MAAA;AAAA;AAAA,KAGN,oBAAA,GACD,uBAAA,GACA,4BAAA,GACA,8BAAA;AAAA,KAEC,eAAA;EAAA,SACM,IAAA;EAAA,SACA,IAAA;EAAA,SACA,WAAA;EAAA,SACA,UAAA;AAAA;AAAA,KAGN,sBAAA;EAAA,SACM,KAAA;EAAA,SACA,YAAA;EAAA,SACA,KAAA,EAAO,aAAA,CAAc,oBAAA;EAAA,SACrB,KAAA;EAAA,SACA,MAAA;EAAA,SACA,SAAA;IAAA,SACE,MAAA,EAAQ,oBAAA;IAAA,SACR,OAAA,EAAS,2BAAA;EAAA;EAAA,SAEX,KAAA,GAAQ,aAAA,CAAc,eAAA;EAAA,SACtB,mBAAA;AAAA;AAAA,cA4NE,wBAAA,GACX,OAAA,EAAS,UAAA,EACT,MAAA;EAAA,SACW,sBAAA,GAAyB,oBAAA;EAAA,SACzB,gBAAA,GAAmB,2BAAA;AAAA,MAE7B,MAAA,CAAO,MAAA,CAAO,sBAAA,EAAwB,QAAA;AAAA,cA0iB5B,yBAAA,GACX,QAAA,EAAU,kBAAA,CAAmB,kBAAA,KAC5B,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,QAAA;AAAA,cA2Ed,4BAAA,GAAgC,MAAA,EAAQ,yBAAA,KAAyB,KAAA,CAAA,KAAA,CAAA,WAAA,SAAA,UAAA,CAAA,UAAA"}
|