@nirmos/sdk 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 (136) hide show
  1. package/README.md +62 -0
  2. package/dist/cjs/client.js +61 -0
  3. package/dist/cjs/client.js.map +1 -0
  4. package/dist/cjs/core/errors.js +143 -0
  5. package/dist/cjs/core/errors.js.map +1 -0
  6. package/dist/cjs/core/metadata.js +104 -0
  7. package/dist/cjs/core/metadata.js.map +1 -0
  8. package/dist/cjs/core/transport.js +276 -0
  9. package/dist/cjs/core/transport.js.map +1 -0
  10. package/dist/cjs/core/types.js +3 -0
  11. package/dist/cjs/core/types.js.map +1 -0
  12. package/dist/cjs/gateway/chat-stream.js +262 -0
  13. package/dist/cjs/gateway/chat-stream.js.map +1 -0
  14. package/dist/cjs/gateway/chat.js +102 -0
  15. package/dist/cjs/gateway/chat.js.map +1 -0
  16. package/dist/cjs/gateway/embeddings.js +33 -0
  17. package/dist/cjs/gateway/embeddings.js.map +1 -0
  18. package/dist/cjs/gateway/gateway.js +18 -0
  19. package/dist/cjs/gateway/gateway.js.map +1 -0
  20. package/dist/cjs/gateway/images.js +36 -0
  21. package/dist/cjs/gateway/images.js.map +1 -0
  22. package/dist/cjs/gateway/mappers.js +184 -0
  23. package/dist/cjs/gateway/mappers.js.map +1 -0
  24. package/dist/cjs/gateway/types.js +3 -0
  25. package/dist/cjs/gateway/types.js.map +1 -0
  26. package/dist/cjs/index.js +25 -0
  27. package/dist/cjs/index.js.map +1 -0
  28. package/dist/cjs/package.json +3 -0
  29. package/dist/cjs/prompts/cache.js +48 -0
  30. package/dist/cjs/prompts/cache.js.map +1 -0
  31. package/dist/cjs/prompts/mappers.js +242 -0
  32. package/dist/cjs/prompts/mappers.js.map +1 -0
  33. package/dist/cjs/prompts/prompts.js +121 -0
  34. package/dist/cjs/prompts/prompts.js.map +1 -0
  35. package/dist/cjs/prompts/render.js +86 -0
  36. package/dist/cjs/prompts/render.js.map +1 -0
  37. package/dist/cjs/prompts/types.js +3 -0
  38. package/dist/cjs/prompts/types.js.map +1 -0
  39. package/dist/cjs/prompts/versions.js +51 -0
  40. package/dist/cjs/prompts/versions.js.map +1 -0
  41. package/dist/esm/client.d.ts +28 -0
  42. package/dist/esm/client.d.ts.map +1 -0
  43. package/dist/esm/client.js +58 -0
  44. package/dist/esm/client.js.map +1 -0
  45. package/dist/esm/core/errors.d.ts +72 -0
  46. package/dist/esm/core/errors.d.ts.map +1 -0
  47. package/dist/esm/core/errors.js +125 -0
  48. package/dist/esm/core/errors.js.map +1 -0
  49. package/dist/esm/core/metadata.d.ts +11 -0
  50. package/dist/esm/core/metadata.d.ts.map +1 -0
  51. package/dist/esm/core/metadata.js +95 -0
  52. package/dist/esm/core/metadata.js.map +1 -0
  53. package/dist/esm/core/transport.d.ts +28 -0
  54. package/dist/esm/core/transport.d.ts.map +1 -0
  55. package/dist/esm/core/transport.js +272 -0
  56. package/dist/esm/core/transport.js.map +1 -0
  57. package/dist/esm/core/types.d.ts +43 -0
  58. package/dist/esm/core/types.d.ts.map +1 -0
  59. package/dist/esm/core/types.js +2 -0
  60. package/dist/esm/core/types.js.map +1 -0
  61. package/dist/esm/gateway/chat-stream.d.ts +9 -0
  62. package/dist/esm/gateway/chat-stream.d.ts.map +1 -0
  63. package/dist/esm/gateway/chat-stream.js +258 -0
  64. package/dist/esm/gateway/chat-stream.js.map +1 -0
  65. package/dist/esm/gateway/chat.d.ts +12 -0
  66. package/dist/esm/gateway/chat.d.ts.map +1 -0
  67. package/dist/esm/gateway/chat.js +98 -0
  68. package/dist/esm/gateway/chat.js.map +1 -0
  69. package/dist/esm/gateway/embeddings.d.ts +9 -0
  70. package/dist/esm/gateway/embeddings.d.ts.map +1 -0
  71. package/dist/esm/gateway/embeddings.js +29 -0
  72. package/dist/esm/gateway/embeddings.js.map +1 -0
  73. package/dist/esm/gateway/gateway.d.ts +12 -0
  74. package/dist/esm/gateway/gateway.d.ts.map +1 -0
  75. package/dist/esm/gateway/gateway.js +14 -0
  76. package/dist/esm/gateway/gateway.js.map +1 -0
  77. package/dist/esm/gateway/images.d.ts +9 -0
  78. package/dist/esm/gateway/images.d.ts.map +1 -0
  79. package/dist/esm/gateway/images.js +32 -0
  80. package/dist/esm/gateway/images.js.map +1 -0
  81. package/dist/esm/gateway/mappers.d.ts +11 -0
  82. package/dist/esm/gateway/mappers.d.ts.map +1 -0
  83. package/dist/esm/gateway/mappers.js +174 -0
  84. package/dist/esm/gateway/mappers.js.map +1 -0
  85. package/dist/esm/gateway/types.d.ts +168 -0
  86. package/dist/esm/gateway/types.d.ts.map +1 -0
  87. package/dist/esm/gateway/types.js +2 -0
  88. package/dist/esm/gateway/types.js.map +1 -0
  89. package/dist/esm/index.d.ts +8 -0
  90. package/dist/esm/index.d.ts.map +1 -0
  91. package/dist/esm/index.js +4 -0
  92. package/dist/esm/index.js.map +1 -0
  93. package/dist/esm/prompts/cache.d.ts +13 -0
  94. package/dist/esm/prompts/cache.d.ts.map +1 -0
  95. package/dist/esm/prompts/cache.js +44 -0
  96. package/dist/esm/prompts/cache.js.map +1 -0
  97. package/dist/esm/prompts/mappers.d.ts +8 -0
  98. package/dist/esm/prompts/mappers.d.ts.map +1 -0
  99. package/dist/esm/prompts/mappers.js +235 -0
  100. package/dist/esm/prompts/mappers.js.map +1 -0
  101. package/dist/esm/prompts/prompts.d.ts +17 -0
  102. package/dist/esm/prompts/prompts.d.ts.map +1 -0
  103. package/dist/esm/prompts/prompts.js +117 -0
  104. package/dist/esm/prompts/prompts.js.map +1 -0
  105. package/dist/esm/prompts/render.d.ts +3 -0
  106. package/dist/esm/prompts/render.d.ts.map +1 -0
  107. package/dist/esm/prompts/render.js +83 -0
  108. package/dist/esm/prompts/render.js.map +1 -0
  109. package/dist/esm/prompts/types.d.ts +119 -0
  110. package/dist/esm/prompts/types.d.ts.map +1 -0
  111. package/dist/esm/prompts/types.js +2 -0
  112. package/dist/esm/prompts/types.js.map +1 -0
  113. package/dist/esm/prompts/versions.d.ts +12 -0
  114. package/dist/esm/prompts/versions.d.ts.map +1 -0
  115. package/dist/esm/prompts/versions.js +47 -0
  116. package/dist/esm/prompts/versions.js.map +1 -0
  117. package/package.json +50 -0
  118. package/src/client.ts +89 -0
  119. package/src/core/errors.ts +160 -0
  120. package/src/core/metadata.ts +141 -0
  121. package/src/core/transport.ts +331 -0
  122. package/src/core/types.ts +51 -0
  123. package/src/gateway/chat-stream.ts +307 -0
  124. package/src/gateway/chat.ts +134 -0
  125. package/src/gateway/embeddings.ts +44 -0
  126. package/src/gateway/gateway.ts +17 -0
  127. package/src/gateway/images.ts +41 -0
  128. package/src/gateway/mappers.ts +234 -0
  129. package/src/gateway/types.ts +206 -0
  130. package/src/index.ts +83 -0
  131. package/src/prompts/cache.ts +50 -0
  132. package/src/prompts/mappers.ts +318 -0
  133. package/src/prompts/prompts.ts +188 -0
  134. package/src/prompts/render.ts +117 -0
  135. package/src/prompts/types.ts +148 -0
  136. package/src/prompts/versions.ts +80 -0
@@ -0,0 +1,117 @@
1
+ import { PromptRenderError } from "../core/errors.js";
2
+ import type { JsonValue } from "../core/types.js";
3
+ import type { ChatMessage } from "../gateway/types.js";
4
+ import type {
5
+ Prompt,
6
+ PromptRenderOptions,
7
+ PromptVariable,
8
+ PromptVariableValues,
9
+ RenderedPrompt,
10
+ } from "./types.js";
11
+
12
+ const PLACEHOLDER = /\{\{\s*([a-zA-Z][a-zA-Z0-9_.-]*)\s*\}\}/g;
13
+
14
+ export function renderPrompt(
15
+ prompt: Prompt,
16
+ values: PromptVariableValues = {},
17
+ options: PromptRenderOptions = {},
18
+ ): RenderedPrompt {
19
+ const resolved = resolveVariables(prompt.variables, values);
20
+ const sourceMessages: readonly ChatMessage[] =
21
+ prompt.content.type === "chat"
22
+ ? prompt.content.messages
23
+ : [
24
+ {
25
+ role: prompt.content.role ?? "user",
26
+ content: prompt.content.text,
27
+ },
28
+ ];
29
+
30
+ const messages = sourceMessages.map((message) => ({
31
+ ...message,
32
+ content:
33
+ typeof message.content === "string"
34
+ ? interpolate(message.content, resolved, options)
35
+ : message.content.map((part) => {
36
+ if (part.type === "text") {
37
+ return {
38
+ ...part,
39
+ text: interpolate(part.text, resolved, options),
40
+ };
41
+ }
42
+ if (part.type === "image") {
43
+ return {
44
+ ...part,
45
+ url: interpolate(part.url, resolved, options),
46
+ };
47
+ }
48
+ return part;
49
+ }),
50
+ }));
51
+
52
+ return {
53
+ promptId: prompt.id,
54
+ promptVersion: prompt.version.number,
55
+ messages,
56
+ variables: resolved,
57
+ };
58
+ }
59
+
60
+ function resolveVariables(
61
+ definitions: readonly PromptVariable[],
62
+ supplied: PromptVariableValues,
63
+ ): PromptVariableValues {
64
+ const resolved: Record<string, JsonValue | undefined> = { ...supplied };
65
+ const missing: string[] = [];
66
+
67
+ for (const variable of definitions) {
68
+ const value = resolved[variable.name];
69
+ if (value === undefined && variable.default !== undefined) {
70
+ resolved[variable.name] = variable.default;
71
+ } else if (value === undefined && variable.required) {
72
+ missing.push(variable.name);
73
+ }
74
+ }
75
+
76
+ if (missing.length > 0) {
77
+ throw new PromptRenderError(
78
+ `Missing required prompt variables: ${missing.join(", ")}.`,
79
+ missing,
80
+ );
81
+ }
82
+ return resolved;
83
+ }
84
+
85
+ function interpolate(
86
+ template: string,
87
+ values: PromptVariableValues,
88
+ options: PromptRenderOptions,
89
+ ): string {
90
+ const unresolved = new Set<string>();
91
+ const result = template.replace(PLACEHOLDER, (placeholder, name: string) => {
92
+ const value = values[name];
93
+ if (value === undefined) {
94
+ unresolved.add(name);
95
+ return placeholder;
96
+ }
97
+ return stringify(value);
98
+ });
99
+
100
+ if (unresolved.size > 0 && !options.allowUnresolved) {
101
+ const names = [...unresolved];
102
+ throw new PromptRenderError(
103
+ `Unresolved prompt variables: ${names.join(", ")}.`,
104
+ names,
105
+ );
106
+ }
107
+ return result;
108
+ }
109
+
110
+ function stringify(value: JsonValue): string {
111
+ if (value === null) return "null";
112
+ if (typeof value === "string") return value;
113
+ if (typeof value === "number" || typeof value === "boolean") {
114
+ return String(value);
115
+ }
116
+ return JSON.stringify(value);
117
+ }
@@ -0,0 +1,148 @@
1
+ import type { ChatMessage, ChatRole } from "../gateway/types.js";
2
+ import type {
3
+ ExtensibleString,
4
+ JsonValue,
5
+ Page,
6
+ RequestMetadata,
7
+ RequestOptions,
8
+ } from "../core/types.js";
9
+
10
+ export type PromptIdentifier = string;
11
+ export type PromptCacheMode = "default" | "reload" | "no-store";
12
+ export type PromptStatus = ExtensibleString<
13
+ "draft" | "active" | "archived" | "published"
14
+ >;
15
+
16
+ export type PromptVariableType =
17
+ "string" | "number" | "boolean" | "enum" | "array";
18
+
19
+ export interface PromptVariable {
20
+ name: string;
21
+ type: PromptVariableType;
22
+ required?: boolean;
23
+ description?: string;
24
+ default?: JsonValue;
25
+ values?: readonly string[];
26
+ min?: number;
27
+ max?: number;
28
+ minLength?: number;
29
+ maxLength?: number;
30
+ itemType?: PromptVariableType;
31
+ }
32
+
33
+ export type PromptVariableValue = JsonValue | undefined;
34
+ export type PromptVariableValues = Readonly<
35
+ Record<string, PromptVariableValue>
36
+ >;
37
+
38
+ export interface TextPromptContent {
39
+ type: "text";
40
+ text: string;
41
+ role?: Exclude<ChatRole, "tool">;
42
+ }
43
+
44
+ export interface ChatPromptContent {
45
+ type: "chat";
46
+ messages: readonly ChatMessage[];
47
+ }
48
+
49
+ export type PromptContent = TextPromptContent | ChatPromptContent;
50
+
51
+ export interface Prompt {
52
+ id: string;
53
+ name: string;
54
+ slug: string;
55
+ description?: string;
56
+ status: PromptStatus;
57
+ version: PromptVersion;
58
+ content: PromptContent;
59
+ variables: readonly PromptVariable[];
60
+ metadata: Readonly<Record<string, JsonValue>>;
61
+ tags: readonly string[];
62
+ folder?: string;
63
+ createdAt?: string;
64
+ updatedAt?: string;
65
+ requestMetadata: RequestMetadata;
66
+ }
67
+
68
+ export interface PromptVersion {
69
+ id: string;
70
+ number: number;
71
+ status: PromptStatus;
72
+ active: boolean;
73
+ content: PromptContent;
74
+ variables: readonly PromptVariable[];
75
+ metadata: Readonly<Record<string, JsonValue>>;
76
+ commitMessage?: string;
77
+ createdAt?: string;
78
+ updatedAt?: string;
79
+ }
80
+
81
+ export interface PromptCreateParams {
82
+ name: string;
83
+ slug?: string;
84
+ description?: string;
85
+ content: PromptContent;
86
+ variables?: readonly PromptVariable[];
87
+ metadata?: Readonly<Record<string, JsonValue>>;
88
+ tags?: readonly string[];
89
+ folder?: string;
90
+ commitMessage?: string;
91
+ activate?: boolean;
92
+ }
93
+
94
+ export interface PromptUpdateParams {
95
+ name?: string;
96
+ slug?: string;
97
+ description?: string | null;
98
+ metadata?: Readonly<Record<string, JsonValue>>;
99
+ tags?: readonly string[];
100
+ folder?: string | null;
101
+ status?: PromptStatus;
102
+ }
103
+
104
+ export interface PromptVersionCreateParams {
105
+ content: PromptContent;
106
+ variables?: readonly PromptVariable[];
107
+ metadata?: Readonly<Record<string, JsonValue>>;
108
+ commitMessage?: string;
109
+ activate?: boolean;
110
+ }
111
+
112
+ export interface PromptRetrieveOptions extends RequestOptions {
113
+ version?: number | "active" | "latest";
114
+ cache?: PromptCacheMode;
115
+ }
116
+
117
+ export interface PromptVersionListOptions extends RequestOptions {
118
+ limit?: number;
119
+ cursor?: string;
120
+ }
121
+
122
+ export interface PromptRenderReference {
123
+ id: PromptIdentifier;
124
+ version?: number | "active" | "latest";
125
+ cache?: PromptCacheMode;
126
+ }
127
+
128
+ export interface PromptRenderOptions {
129
+ allowUnresolved?: boolean;
130
+ }
131
+
132
+ export interface RenderedPrompt {
133
+ promptId: string;
134
+ promptVersion: number;
135
+ messages: readonly ChatMessage[];
136
+ variables: PromptVariableValues;
137
+ }
138
+
139
+ export interface PromptCacheConfig {
140
+ /** Cache active prompt retrievals in memory. Defaults to true. */
141
+ enabled?: boolean;
142
+ /** Freshness window. Defaults to 60 seconds. */
143
+ ttlMs?: number;
144
+ /** Maximum cached prompt variants per client. Defaults to 100. */
145
+ maxEntries?: number;
146
+ }
147
+
148
+ export type PromptVersionPage = Page<PromptVersion>;
@@ -0,0 +1,80 @@
1
+ import type { HttpTransport } from "../core/transport.js";
2
+ import type { RequestOptions } from "../core/types.js";
3
+ import {
4
+ normalizeVersion,
5
+ normalizeVersionPage,
6
+ toWireVersionCreate,
7
+ } from "./mappers.js";
8
+ import type {
9
+ PromptIdentifier,
10
+ PromptVersion,
11
+ PromptVersionCreateParams,
12
+ PromptVersionListOptions,
13
+ PromptVersionPage,
14
+ } from "./types.js";
15
+
16
+ export class PromptVersions {
17
+ readonly #transport: HttpTransport;
18
+ readonly #invalidate: () => void;
19
+
20
+ constructor(transport: HttpTransport, invalidate: () => void) {
21
+ this.#transport = transport;
22
+ this.#invalidate = invalidate;
23
+ }
24
+
25
+ async create(
26
+ identifier: PromptIdentifier,
27
+ params: PromptVersionCreateParams,
28
+ options?: RequestOptions,
29
+ ): Promise<PromptVersion> {
30
+ const { data } = await this.#transport.request<unknown>({
31
+ method: "POST",
32
+ path: `/v1/prompts/${encodeURIComponent(identifier)}/versions`,
33
+ body: toWireVersionCreate(params),
34
+ options,
35
+ });
36
+ this.#invalidate();
37
+ return normalizeVersion(data);
38
+ }
39
+
40
+ async retrieve(
41
+ identifier: PromptIdentifier,
42
+ version: number,
43
+ options?: RequestOptions,
44
+ ): Promise<PromptVersion> {
45
+ const { data } = await this.#transport.request<unknown>({
46
+ method: "GET",
47
+ path: `/v1/prompts/${encodeURIComponent(identifier)}/versions/${version}`,
48
+ options,
49
+ });
50
+ return normalizeVersion(data);
51
+ }
52
+
53
+ async list(
54
+ identifier: PromptIdentifier,
55
+ options: PromptVersionListOptions = {},
56
+ ): Promise<PromptVersionPage> {
57
+ const { limit, cursor, ...requestOptions } = options;
58
+ const { data } = await this.#transport.request<unknown>({
59
+ method: "GET",
60
+ path: `/v1/prompts/${encodeURIComponent(identifier)}/versions`,
61
+ query: { limit, cursor },
62
+ options: requestOptions,
63
+ });
64
+ return normalizeVersionPage(data);
65
+ }
66
+
67
+ async activate(
68
+ identifier: PromptIdentifier,
69
+ version: number,
70
+ options?: RequestOptions,
71
+ ): Promise<PromptVersion> {
72
+ const { data } = await this.#transport.request<unknown>({
73
+ method: "POST",
74
+ path: `/v1/prompts/${encodeURIComponent(identifier)}/versions/${version}/activate`,
75
+ options,
76
+ });
77
+ this.#invalidate();
78
+ return normalizeVersion(data);
79
+ }
80
+ }