@brotu/ai 0.1.0 → 0.2.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.
package/dist/index.js CHANGED
@@ -5,8 +5,11 @@ import {
5
5
  ELEVENLABS_CATALOG,
6
6
  ELEVENLABS_MODELS,
7
7
  ELEVENLABS_OUTPUT_FORMATS,
8
+ GOOGLE_AUDIO_MODELS,
8
9
  GOOGLE_CATALOG,
9
10
  GOOGLE_IMAGE_MODELS,
11
+ GOOGLE_TEXT_MODELS,
12
+ GOOGLE_TTS_VOICES,
10
13
  GOOGLE_VIDEO_MODELS,
11
14
  KLING_AUDIO_MODEL,
12
15
  KLING_CAPABILITIES,
@@ -15,6 +18,7 @@ import {
15
18
  KLING_VOICES,
16
19
  OPENAI_CATALOG,
17
20
  OPENAI_IMAGE_MODELS,
21
+ OPENAI_TEXT_MODELS,
18
22
  QWEN_AUDIO_MODELS,
19
23
  QWEN_CATALOG,
20
24
  QWEN_IMAGE_MODELS,
@@ -31,7 +35,7 @@ import {
31
35
  resetCatalog,
32
36
  resolveProvider,
33
37
  videoPathFor
34
- } from "./chunk-GKLTQ55S.js";
38
+ } from "./chunk-PL534BFN.js";
35
39
 
36
40
  // src/lib/jobs.ts
37
41
  import { AsyncLocalStorage } from "async_hooks";
@@ -582,7 +586,12 @@ var POLL_INTERVAL_MS2 = 1e4;
582
586
  var DEFAULT_MAX_POLL_ATTEMPTS2 = 120;
583
587
  var GoogleAdapter = class {
584
588
  providerName = "google";
585
- supportedTypes = ["image", "video"];
589
+ supportedTypes = [
590
+ "image",
591
+ "video",
592
+ "text",
593
+ "audio"
594
+ ];
586
595
  opts;
587
596
  constructor(opts) {
588
597
  this.opts = opts;
@@ -904,17 +913,143 @@ var GoogleAdapter = class {
904
913
  generateVideo(params) {
905
914
  return this.runVideo(params);
906
915
  }
907
- generateAudio(_params) {
908
- throw new Error("Google has no speech synthesis wired up here.");
916
+ textBody(modelId, params) {
917
+ const input = [
918
+ { type: "text", text: params.prompt }
919
+ ];
920
+ for (const image of params.referenceImages ?? []) {
921
+ const [meta, data] = image.split(",");
922
+ input.push({
923
+ type: "image",
924
+ mime_type: meta?.match(/data:([^;]+)/)?.[1] ?? "image/png",
925
+ data: data ?? image
926
+ });
927
+ }
928
+ return {
929
+ model: modelId,
930
+ input,
931
+ ...params.systemPrompt ? { instructions: params.systemPrompt } : {},
932
+ generation_config: {
933
+ ...params.maxTokens ? { max_output_tokens: params.maxTokens } : {},
934
+ ...params.temperature !== void 0 ? { temperature: params.temperature } : {},
935
+ ...params.topP !== void 0 ? { top_p: params.topP } : {}
936
+ },
937
+ ...params.providerOptions?.google ?? {}
938
+ };
909
939
  }
910
- generateText(_params) {
911
- throw new Error("The Google adapter here covers image and video only.");
940
+ speechBody(modelId, params, voice) {
941
+ return {
942
+ model: modelId,
943
+ input: params.prompt,
944
+ response_format: { type: "audio" },
945
+ generation_config: {
946
+ speech_config: [{ voice }]
947
+ },
948
+ ...params.providerOptions?.google ?? {}
949
+ };
950
+ }
951
+ async generateText(params) {
952
+ const startedAt = Date.now();
953
+ const modelId = params.model ?? "";
954
+ const failure = (error) => ({
955
+ success: false,
956
+ outputs: [],
957
+ creditsUsed: 0,
958
+ provider: this.providerName,
959
+ model: modelId,
960
+ processingTimeMs: Date.now() - startedAt,
961
+ error
962
+ });
963
+ if (!(modelId in GOOGLE_TEXT_MODELS)) {
964
+ return failure(
965
+ `"${modelId}" is not a Gemini text model. Known: ${Object.keys(GOOGLE_TEXT_MODELS).join(", ")}.`
966
+ );
967
+ }
968
+ try {
969
+ const payload = await this.request(
970
+ INTERACTIONS_PATH,
971
+ {
972
+ method: "POST",
973
+ body: this.textBody(modelId, params)
974
+ }
975
+ );
976
+ const text = payload.output_text ?? payload.steps?.flatMap((step) => step.content ?? []).find((part) => part.type === "text" || part.text)?.text;
977
+ if (!text) return failure("Google returned no text.");
978
+ return {
979
+ success: true,
980
+ outputs: [
981
+ {
982
+ url: `data:text/plain;base64,${Buffer.from(text).toString("base64")}`,
983
+ mimeType: "text/plain",
984
+ raw: { text }
985
+ }
986
+ ],
987
+ creditsUsed: 0,
988
+ provider: this.providerName,
989
+ model: modelId,
990
+ processingTimeMs: Date.now() - startedAt
991
+ };
992
+ } catch (error) {
993
+ return failure(error instanceof Error ? error.message : String(error));
994
+ }
995
+ }
996
+ async generateAudio(params) {
997
+ const startedAt = Date.now();
998
+ const modelId = params.model ?? "";
999
+ const failure = (error) => ({
1000
+ success: false,
1001
+ outputs: [],
1002
+ creditsUsed: 0,
1003
+ provider: this.providerName,
1004
+ model: modelId,
1005
+ processingTimeMs: Date.now() - startedAt,
1006
+ error
1007
+ });
1008
+ const binding = GOOGLE_AUDIO_MODELS[modelId];
1009
+ if (!binding) {
1010
+ return failure(
1011
+ `"${modelId}" is not a Gemini speech model. Known: ${Object.keys(GOOGLE_AUDIO_MODELS).join(", ")}.`
1012
+ );
1013
+ }
1014
+ const voice = params.voice ?? "Kore";
1015
+ if (!binding.voices.includes(voice)) {
1016
+ return failure(
1017
+ `Gemini TTS offers ${GOOGLE_TTS_VOICES.join(", ")}, not "${voice}".`
1018
+ );
1019
+ }
1020
+ try {
1021
+ const payload = await this.request(
1022
+ INTERACTIONS_PATH,
1023
+ {
1024
+ method: "POST",
1025
+ body: this.speechBody(modelId, params, voice)
1026
+ }
1027
+ );
1028
+ const data = payload.output_audio?.data;
1029
+ if (!data) return failure("Google returned no audio.");
1030
+ return {
1031
+ success: true,
1032
+ outputs: [
1033
+ {
1034
+ url: `data:audio/wav;base64,${data}`,
1035
+ mimeType: "audio/wav",
1036
+ raw: { inline: true, voice }
1037
+ }
1038
+ ],
1039
+ creditsUsed: 0,
1040
+ provider: this.providerName,
1041
+ model: modelId,
1042
+ processingTimeMs: Date.now() - startedAt
1043
+ };
1044
+ } catch (error) {
1045
+ return failure(error instanceof Error ? error.message : String(error));
1046
+ }
912
1047
  }
913
1048
  async estimateCost(type, params) {
914
1049
  return estimateFor(this.providerName, type, params);
915
1050
  }
916
1051
  supportsModel(model) {
917
- return model in GOOGLE_IMAGE_MODELS || model in GOOGLE_VIDEO_MODELS;
1052
+ return model in GOOGLE_IMAGE_MODELS || model in GOOGLE_VIDEO_MODELS || model in GOOGLE_TEXT_MODELS || model in GOOGLE_AUDIO_MODELS;
918
1053
  }
919
1054
  getAvailableModels() {
920
1055
  return [
@@ -927,6 +1062,16 @@ var GoogleAdapter = class {
927
1062
  id,
928
1063
  name: id,
929
1064
  type: "video"
1065
+ })),
1066
+ ...Object.keys(GOOGLE_TEXT_MODELS).map((id) => ({
1067
+ id,
1068
+ name: id,
1069
+ type: "text"
1070
+ })),
1071
+ ...Object.keys(GOOGLE_AUDIO_MODELS).map((id) => ({
1072
+ id,
1073
+ name: id,
1074
+ type: "audio"
930
1075
  }))
931
1076
  ];
932
1077
  }
@@ -1283,7 +1428,7 @@ var IMAGES_PATH2 = "/v1/images/generations";
1283
1428
  var OpenAIAdapter = class {
1284
1429
  providerName = "openai";
1285
1430
  // No video: the Videos API shuts down on 24 September 2026.
1286
- supportedTypes = ["image"];
1431
+ supportedTypes = ["image", "text"];
1287
1432
  opts;
1288
1433
  constructor(opts) {
1289
1434
  this.opts = opts;
@@ -1398,8 +1543,79 @@ var OpenAIAdapter = class {
1398
1543
  generateAudio(_params) {
1399
1544
  throw new Error("OpenAI has no speech synthesis wired up here.");
1400
1545
  }
1401
- generateText(_params) {
1402
- throw new Error("The OpenAI adapter here covers images only.");
1546
+ textBody(params) {
1547
+ const content = params.referenceImages?.length ? [
1548
+ { type: "input_text", text: params.prompt },
1549
+ ...params.referenceImages.map((url) => ({
1550
+ type: "input_image",
1551
+ image_url: url
1552
+ }))
1553
+ ] : params.prompt;
1554
+ const input = [];
1555
+ if (params.systemPrompt) {
1556
+ input.push({ role: "system", content: params.systemPrompt });
1557
+ }
1558
+ input.push({ role: "user", content });
1559
+ return {
1560
+ model: params.model,
1561
+ input,
1562
+ ...params.maxTokens ? { max_output_tokens: params.maxTokens } : {},
1563
+ ...params.temperature !== void 0 ? { temperature: params.temperature } : {},
1564
+ ...params.topP !== void 0 ? { top_p: params.topP } : {},
1565
+ ...params.providerOptions?.openai ?? {}
1566
+ };
1567
+ }
1568
+ async generateText(params) {
1569
+ const startedAt = Date.now();
1570
+ const modelId = params.model ?? "";
1571
+ const failure = (error) => ({
1572
+ success: false,
1573
+ outputs: [],
1574
+ creditsUsed: 0,
1575
+ provider: this.providerName,
1576
+ model: modelId,
1577
+ processingTimeMs: Date.now() - startedAt,
1578
+ error
1579
+ });
1580
+ if (!(modelId in OPENAI_TEXT_MODELS)) {
1581
+ return failure(
1582
+ `"${modelId}" is not an OpenAI text model. Known: ${Object.keys(OPENAI_TEXT_MODELS).join(", ")}.`
1583
+ );
1584
+ }
1585
+ try {
1586
+ const response = await fetch(`${this.baseUrl}/v1/responses`, {
1587
+ method: "POST",
1588
+ headers: {
1589
+ Authorization: `Bearer ${this.opts.apiKey}`,
1590
+ "Content-Type": "application/json",
1591
+ ...this.opts.organization ? { "OpenAI-Organization": this.opts.organization } : {}
1592
+ },
1593
+ body: JSON.stringify(this.textBody(params))
1594
+ });
1595
+ const payload = await response.json();
1596
+ if (payload.error) throw new Error(payload.error.message);
1597
+ if (!response.ok) {
1598
+ throw new Error(`OpenAI returned ${response.status}.`);
1599
+ }
1600
+ const text = payload.output_text ?? payload.output?.flatMap((item) => item.content ?? []).find((part) => part.type === "output_text" || part.text)?.text;
1601
+ if (!text) return failure("OpenAI returned no text.");
1602
+ return {
1603
+ success: true,
1604
+ outputs: [
1605
+ {
1606
+ url: `data:text/plain;base64,${Buffer.from(text).toString("base64")}`,
1607
+ mimeType: "text/plain",
1608
+ raw: { text, tokens: payload.usage?.output_tokens }
1609
+ }
1610
+ ],
1611
+ creditsUsed: 0,
1612
+ provider: this.providerName,
1613
+ model: modelId,
1614
+ processingTimeMs: Date.now() - startedAt
1615
+ };
1616
+ } catch (error) {
1617
+ return failure(error instanceof Error ? error.message : String(error));
1618
+ }
1403
1619
  }
1404
1620
  /** Synchronous provider: there is never a queued job to come back to. */
1405
1621
  async completeJob(job) {
@@ -1420,14 +1636,21 @@ var OpenAIAdapter = class {
1420
1636
  };
1421
1637
  }
1422
1638
  supportsModel(model) {
1423
- return model in OPENAI_IMAGE_MODELS;
1639
+ return model in OPENAI_IMAGE_MODELS || model in OPENAI_TEXT_MODELS;
1424
1640
  }
1425
1641
  getAvailableModels() {
1426
- return Object.keys(OPENAI_IMAGE_MODELS).map((id) => ({
1427
- id,
1428
- name: id,
1429
- type: "image"
1430
- }));
1642
+ return [
1643
+ ...Object.keys(OPENAI_IMAGE_MODELS).map((id) => ({
1644
+ id,
1645
+ name: id,
1646
+ type: "image"
1647
+ })),
1648
+ ...Object.keys(OPENAI_TEXT_MODELS).map((id) => ({
1649
+ id,
1650
+ name: id,
1651
+ type: "text"
1652
+ }))
1653
+ ];
1431
1654
  }
1432
1655
  };
1433
1656
 
@@ -2351,8 +2574,11 @@ export {
2351
2574
  ELEVENLABS_MODELS,
2352
2575
  ELEVENLABS_OUTPUT_FORMATS,
2353
2576
  ElevenLabsAdapter,
2577
+ GOOGLE_AUDIO_MODELS,
2354
2578
  GOOGLE_CATALOG,
2355
2579
  GOOGLE_IMAGE_MODELS,
2580
+ GOOGLE_TEXT_MODELS,
2581
+ GOOGLE_TTS_VOICES,
2356
2582
  GOOGLE_VIDEO_MODELS,
2357
2583
  GoogleAdapter,
2358
2584
  KLING_CAPABILITIES,
@@ -2361,6 +2587,7 @@ export {
2361
2587
  KlingAdapter,
2362
2588
  OPENAI_CATALOG,
2363
2589
  OPENAI_IMAGE_MODELS,
2590
+ OPENAI_TEXT_MODELS,
2364
2591
  OpenAIAdapter,
2365
2592
  PendingJob,
2366
2593
  QWEN_AUDIO_MODELS,
@@ -38,5 +38,28 @@ export interface GoogleVideoBinding {
38
38
  usdByResolution?: Record<string, number>;
39
39
  }
40
40
  export declare const GOOGLE_VIDEO_MODELS: Record<string, GoogleVideoBinding>;
41
+ /**
42
+ * Gemini text, through the same Interactions API as images. Rates are USD per
43
+ * million output tokens, list price on the Gemini Developer API paid tier.
44
+ * Promotional intro rates (3.6 / 3.7 through 31 Dec 2026) are what the
45
+ * pricing page shows today; a guess at the 2027 step-up would go stale.
46
+ */
47
+ export declare const GOOGLE_TEXT_MODELS: Record<string, {
48
+ usdPerMillionOutput?: number;
49
+ }>;
50
+ /**
51
+ * Official prebuilt voices for Gemini TTS. The Interactions API takes one of
52
+ * these in `generation_config.speech_config[].voice`.
53
+ */
54
+ export declare const GOOGLE_TTS_VOICES: readonly ["Zephyr", "Puck", "Charon", "Kore", "Fenrir", "Leda", "Orus", "Aoede", "Callirrhoe", "Autonoe", "Enceladus", "Iapetus", "Umbriel", "Algieba", "Despina", "Erinome", "Algenib", "Rasalgethi", "Laomedeia", "Achernar", "Alnilam", "Schedar", "Gacrux", "Pulcherrima", "Achird", "Zubenelgenubi", "Vindemiatrix", "Sadachbia", "Sadaltager", "Sulafat"];
55
+ export type GoogleTtsVoice = (typeof GOOGLE_TTS_VOICES)[number];
56
+ /**
57
+ * Gemini TTS. Audio-only in, audio-only out, on the Interactions API.
58
+ * Token rates are not listed next to the model cards the way Veo is, so
59
+ * the catalog leaves them unset rather than guessing.
60
+ */
61
+ export declare const GOOGLE_AUDIO_MODELS: Record<string, {
62
+ voices: readonly string[];
63
+ }>;
41
64
  export declare const GOOGLE_CATALOG: AIModelConfig[];
42
65
  //# sourceMappingURL=google.models.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"google.models.d.ts","sourceRoot":"","sources":["../../src/providers/google.models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,kBAAkB;IAClC,+EAA+E;IAC/E,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAWlE,CAAC;AAEF,MAAM,WAAW,kBAAkB;IAClC;;;;OAIG;IACH,GAAG,EAAE,SAAS,GAAG,cAAc,CAAC;IAChC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,sCAAsC;IACtC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,wEAAwE;IACxE,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CA0ClE,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,aAAa,EA0CzC,CAAC"}
1
+ {"version":3,"file":"google.models.d.ts","sourceRoot":"","sources":["../../src/providers/google.models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,kBAAkB;IAClC,+EAA+E;IAC/E,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAWlE,CAAC;AAEF,MAAM,WAAW,kBAAkB;IAClC;;;;OAIG;IACH,GAAG,EAAE,SAAS,GAAG,cAAc,CAAC;IAChC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,sCAAsC;IACtC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,wEAAwE;IACxE,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CA0ClE,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CACtC,MAAM,EACN;IAAE,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAE,CAYhC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,YAC7B,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,MAAM,EACN,MAAM,EACN,OAAO,EACP,YAAY,EACZ,SAAS,EACT,WAAW,EACX,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,eAAe,EACf,cAAc,EACd,WAAW,EACX,YAAY,EACZ,SAAS,CACA,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CACvC,MAAM,EACN;IAAE,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAK7B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,aAAa,EA4EzC,CAAC"}
@@ -23,5 +23,12 @@ export interface OpenAIImageBinding {
23
23
  };
24
24
  }
25
25
  export declare const OPENAI_IMAGE_MODELS: Record<string, OpenAIImageBinding>;
26
+ /**
27
+ * Current GPT-5.6 text ladder, as published on the Models page. Rates are
28
+ * USD per million output tokens on the standard paid tier.
29
+ */
30
+ export declare const OPENAI_TEXT_MODELS: Record<string, {
31
+ usdPerMillionOutput: number;
32
+ }>;
26
33
  export declare const OPENAI_CATALOG: AIModelConfig[];
27
34
  //# sourceMappingURL=openai.models.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai.models.d.ts","sourceRoot":"","sources":["../../src/providers/openai.models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IAClC,4EAA4E;IAC5E,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACxB,oDAAoD;IACpD,SAAS,EAAE,KAAK,CAAC,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC;IAC5C,8DAA8D;IAC9D,qBAAqB,EAAE,OAAO,CAAC;IAC/B,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,GAAG,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACnD;AAID,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAuBlE,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,aAAa,EAkBvC,CAAC"}
1
+ {"version":3,"file":"openai.models.d.ts","sourceRoot":"","sources":["../../src/providers/openai.models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IAClC,4EAA4E;IAC5E,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACxB,oDAAoD;IACpD,SAAS,EAAE,KAAK,CAAC,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC;IAC5C,8DAA8D;IAC9D,qBAAqB,EAAE,OAAO,CAAC;IAC/B,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,GAAG,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACnD;AAID,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAuBlE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CACtC,MAAM,EACN;IAAE,mBAAmB,EAAE,MAAM,CAAA;CAAE,CAK/B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,aAAa,EAgCzC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brotu/ai",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "exports": {
@@ -66,7 +66,11 @@
66
66
  "module": "./dist/index.js",
67
67
  "repository": {
68
68
  "type": "git",
69
- "url": "git+https://github.com/brotu/brotu-sdk.git",
69
+ "url": "git+https://github.com/Zorbi-Tech/brotu-sdk.git",
70
70
  "directory": "sdks/node"
71
+ },
72
+ "homepage": "https://github.com/Zorbi-Tech/brotu-sdk",
73
+ "bugs": {
74
+ "url": "https://github.com/Zorbi-Tech/brotu-sdk/issues"
71
75
  }
72
76
  }