0g-orbit 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 (105) hide show
  1. package/dist/cli/cli.d.ts +3 -0
  2. package/dist/cli/cli.d.ts.map +1 -0
  3. package/dist/cli/cli.js +59 -0
  4. package/dist/cli/cli.js.map +1 -0
  5. package/dist/cli/commands/account.d.ts +6 -0
  6. package/dist/cli/commands/account.d.ts.map +1 -0
  7. package/dist/cli/commands/account.js +23 -0
  8. package/dist/cli/commands/account.js.map +1 -0
  9. package/dist/cli/commands/inference.d.ts +15 -0
  10. package/dist/cli/commands/inference.d.ts.map +1 -0
  11. package/dist/cli/commands/inference.js +70 -0
  12. package/dist/cli/commands/inference.js.map +1 -0
  13. package/dist/cli/commands/init.d.ts +7 -0
  14. package/dist/cli/commands/init.d.ts.map +1 -0
  15. package/dist/cli/commands/init.js +60 -0
  16. package/dist/cli/commands/init.js.map +1 -0
  17. package/dist/cli/commands/storage.d.ts +19 -0
  18. package/dist/cli/commands/storage.d.ts.map +1 -0
  19. package/dist/cli/commands/storage.js +62 -0
  20. package/dist/cli/commands/storage.js.map +1 -0
  21. package/dist/cli/utils.d.ts +4 -0
  22. package/dist/cli/utils.d.ts.map +1 -0
  23. package/dist/cli/utils.js +20 -0
  24. package/dist/cli/utils.js.map +1 -0
  25. package/dist/errors.d.ts +26 -0
  26. package/dist/errors.d.ts.map +1 -0
  27. package/dist/errors.js +51 -0
  28. package/dist/errors.js.map +1 -0
  29. package/dist/index.d.ts +10 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +11 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/inference.d.ts +17 -0
  34. package/dist/inference.d.ts.map +1 -0
  35. package/dist/inference.js +179 -0
  36. package/dist/inference.js.map +1 -0
  37. package/dist/networks.d.ts +16 -0
  38. package/dist/networks.d.ts.map +1 -0
  39. package/dist/networks.js +48 -0
  40. package/dist/networks.js.map +1 -0
  41. package/dist/orbit.d.ts +27 -0
  42. package/dist/orbit.d.ts.map +1 -0
  43. package/dist/orbit.js +108 -0
  44. package/dist/orbit.js.map +1 -0
  45. package/dist/retry.d.ts +23 -0
  46. package/dist/retry.d.ts.map +1 -0
  47. package/dist/retry.js +90 -0
  48. package/dist/retry.js.map +1 -0
  49. package/dist/storage.d.ts +26 -0
  50. package/dist/storage.d.ts.map +1 -0
  51. package/dist/storage.js +121 -0
  52. package/dist/storage.js.map +1 -0
  53. package/dist/types.d.ts +81 -0
  54. package/dist/types.d.ts.map +1 -0
  55. package/dist/types.js +2 -0
  56. package/dist/types.js.map +1 -0
  57. package/examples/ai-chatbot/index.ts +74 -0
  58. package/examples/model-registry/index.ts +137 -0
  59. package/examples/quick-start/index.ts +65 -0
  60. package/package.json +42 -0
  61. package/packages/cli/package.json +30 -0
  62. package/packages/cli/src/cli.ts +69 -0
  63. package/packages/cli/src/commands/account.ts +29 -0
  64. package/packages/cli/src/commands/inference.ts +103 -0
  65. package/packages/cli/src/commands/init.ts +71 -0
  66. package/packages/cli/src/commands/storage.ts +91 -0
  67. package/packages/cli/src/utils.ts +21 -0
  68. package/packages/cli/tsconfig.json +8 -0
  69. package/packages/core/package.json +35 -0
  70. package/packages/core/src/errors.test.ts +99 -0
  71. package/packages/core/src/errors.ts +79 -0
  72. package/packages/core/src/index.ts +37 -0
  73. package/packages/core/src/inference.ts +256 -0
  74. package/packages/core/src/networks.test.ts +62 -0
  75. package/packages/core/src/networks.ts +62 -0
  76. package/packages/core/src/orbit.test.ts +153 -0
  77. package/packages/core/src/orbit.ts +159 -0
  78. package/packages/core/src/retry.test.ts +99 -0
  79. package/packages/core/src/retry.ts +99 -0
  80. package/packages/core/src/storage.test.ts +199 -0
  81. package/packages/core/src/storage.ts +158 -0
  82. package/packages/core/src/types.ts +85 -0
  83. package/packages/core/tsconfig.json +8 -0
  84. package/packages/core/vitest.config.ts +7 -0
  85. package/src/cli/cli.ts +69 -0
  86. package/src/cli/commands/account.ts +29 -0
  87. package/src/cli/commands/inference.ts +103 -0
  88. package/src/cli/commands/init.ts +71 -0
  89. package/src/cli/commands/storage.ts +91 -0
  90. package/src/cli/utils.ts +21 -0
  91. package/src/errors.test.ts +99 -0
  92. package/src/errors.ts +79 -0
  93. package/src/index.ts +37 -0
  94. package/src/inference.ts +256 -0
  95. package/src/networks.test.ts +62 -0
  96. package/src/networks.ts +62 -0
  97. package/src/orbit.test.ts +153 -0
  98. package/src/orbit.ts +159 -0
  99. package/src/retry.test.ts +99 -0
  100. package/src/retry.ts +99 -0
  101. package/src/storage.test.ts +199 -0
  102. package/src/storage.ts +158 -0
  103. package/src/types.ts +85 -0
  104. package/tsconfig.json +20 -0
  105. package/vitest.config.ts +7 -0
@@ -0,0 +1,103 @@
1
+ import ora from 'ora'
2
+ import chalk from 'chalk'
3
+ import { connectOrbit, formatError } from '../utils.js'
4
+
5
+ interface InferOpts {
6
+ network: string
7
+ message?: string
8
+ system?: string
9
+ temperature: string
10
+ maxTokens?: string
11
+ provider?: string
12
+ }
13
+
14
+ export async function inferCommand(model: string, opts: InferOpts) {
15
+ if (!opts.message) {
16
+ console.error(chalk.red('Error: --message is required'))
17
+ console.error(chalk.dim(' orbit infer meta-llama/Llama-3.3-70B -m "Hello!"'))
18
+ process.exit(1)
19
+ }
20
+
21
+ const spinner = ora('Connecting to 0G...').start()
22
+
23
+ try {
24
+ const orbit = await connectOrbit(opts.network)
25
+ spinner.text = `Sending to ${model}...`
26
+
27
+ const messages: Array<{ role: 'system' | 'user'; content: string }> = []
28
+ if (opts.system) {
29
+ messages.push({ role: 'system', content: opts.system })
30
+ }
31
+ messages.push({ role: 'user', content: opts.message })
32
+
33
+ const result = await orbit.infer(model, {
34
+ messages,
35
+ temperature: parseFloat(opts.temperature),
36
+ maxTokens: opts.maxTokens ? parseInt(opts.maxTokens, 10) : undefined,
37
+ provider: opts.provider,
38
+ })
39
+
40
+ spinner.succeed('Response received')
41
+ console.log()
42
+ console.log(result.content)
43
+ console.log()
44
+
45
+ if (result.usage) {
46
+ console.log(
47
+ chalk.dim(
48
+ ` tokens: ${result.usage.promptTokens} in / ${result.usage.completionTokens} out` +
49
+ ` | model: ${result.model}` +
50
+ (result.verified !== null
51
+ ? ` | verified: ${result.verified ? chalk.green('yes') : chalk.red('no')}`
52
+ : '')
53
+ )
54
+ )
55
+ }
56
+ } catch (err) {
57
+ spinner.fail(chalk.red('Inference failed'))
58
+ console.error(chalk.dim(` ${formatError(err)}`))
59
+ process.exit(1)
60
+ }
61
+ }
62
+
63
+ interface ServicesOpts {
64
+ network: string
65
+ }
66
+
67
+ export async function listServicesCommand(opts: ServicesOpts) {
68
+ const spinner = ora('Fetching services...').start()
69
+
70
+ try {
71
+ const orbit = await connectOrbit(opts.network)
72
+ const services = await orbit.listServices()
73
+
74
+ spinner.stop()
75
+
76
+ if (services.length === 0) {
77
+ console.log(chalk.dim('No services found on this network.'))
78
+ return
79
+ }
80
+
81
+ console.log(chalk.bold(`\n ${services.length} services on ${opts.network}\n`))
82
+
83
+ for (const svc of services) {
84
+ const verTag = svc.verifiable
85
+ ? chalk.green(' [TEE]')
86
+ : ''
87
+ console.log(
88
+ ` ${chalk.cyan(svc.model)}${verTag}`
89
+ )
90
+ console.log(
91
+ chalk.dim(
92
+ ` provider: ${svc.provider.slice(0, 10)}...${svc.provider.slice(-6)}` +
93
+ ` | in: ${svc.inputPrice} neuron | out: ${svc.outputPrice} neuron`
94
+ )
95
+ )
96
+ }
97
+ console.log()
98
+ } catch (err) {
99
+ spinner.fail(chalk.red('Failed to list services'))
100
+ console.error(chalk.dim(` ${formatError(err)}`))
101
+ process.exit(1)
102
+ }
103
+ }
@@ -0,0 +1,71 @@
1
+ import chalk from 'chalk'
2
+ import { writeFileSync, mkdirSync, existsSync } from 'node:fs'
3
+ import { join, resolve } from 'node:path'
4
+
5
+ interface InitOpts {
6
+ template: string
7
+ dir: string
8
+ }
9
+
10
+ export async function initCommand(opts: InitOpts) {
11
+ const dir = resolve(opts.dir)
12
+
13
+ if (!existsSync(dir)) {
14
+ mkdirSync(dir, { recursive: true })
15
+ }
16
+
17
+ // Create package.json
18
+ const pkg = {
19
+ name: 'my-0g-app',
20
+ version: '0.1.0',
21
+ type: 'module',
22
+ scripts: {
23
+ start: 'node index.js',
24
+ },
25
+ dependencies: {
26
+ '0g-orbit-core': '^0.1.0',
27
+ },
28
+ }
29
+ writeFileSync(join(dir, 'package.json'), JSON.stringify(pkg, null, 2) + '\n')
30
+
31
+ // Create index.js with example
32
+ const example = `import { Orbit } from '0g-orbit-core'
33
+
34
+ const orbit = await Orbit.connect({
35
+ network: 'testnet',
36
+ privateKey: process.env.PRIVATE_KEY,
37
+ })
38
+
39
+ // Check account status
40
+ const status = await orbit.status()
41
+ console.log(\`Connected: \${status.address} on \${status.network}\`)
42
+ console.log(\`Balance: \${status.balance} OG\`)
43
+
44
+ // Upload a file
45
+ // const { root } = await orbit.store('./my-file.txt')
46
+ // console.log('Stored at:', root)
47
+
48
+ // Run inference
49
+ // const result = await orbit.infer('meta-llama/Llama-3.3-70B', {
50
+ // messages: [{ role: 'user', content: 'What is 0G?' }],
51
+ // })
52
+ // console.log(result.content)
53
+ `
54
+ writeFileSync(join(dir, 'index.js'), example)
55
+
56
+ // Create .env.example
57
+ writeFileSync(join(dir, '.env.example'), 'PRIVATE_KEY=0x...\n')
58
+
59
+ // Create .gitignore
60
+ writeFileSync(join(dir, '.gitignore'), 'node_modules/\n.env\n')
61
+
62
+ console.log()
63
+ console.log(chalk.bold(' 0G Orbit project initialized'))
64
+ console.log()
65
+ console.log(chalk.dim(' Next steps:'))
66
+ console.log(` 1. ${chalk.cyan('cd ' + (opts.dir === '.' ? '.' : opts.dir))}`)
67
+ console.log(` 2. ${chalk.cyan('cp .env.example .env')} and add your private key`)
68
+ console.log(` 3. ${chalk.cyan('npm install')}`)
69
+ console.log(` 4. ${chalk.cyan('node index.js')}`)
70
+ console.log()
71
+ }
@@ -0,0 +1,91 @@
1
+ import ora from 'ora'
2
+ import chalk from 'chalk'
3
+ import { connectOrbit, formatError } from '../utils.js'
4
+
5
+ interface StoreOpts {
6
+ network: string
7
+ tags?: string
8
+ replicas: string
9
+ }
10
+
11
+ export async function storeCommand(file: string, opts: StoreOpts) {
12
+ const spinner = ora('Connecting to 0G...').start()
13
+
14
+ try {
15
+ const orbit = await connectOrbit(opts.network)
16
+ spinner.text = `Uploading ${file}...`
17
+
18
+ const result = await orbit.store(file, {
19
+ tags: opts.tags,
20
+ replicas: parseInt(opts.replicas, 10),
21
+ })
22
+
23
+ spinner.succeed('Upload complete')
24
+ console.log()
25
+ console.log(chalk.bold(' Root hash: ') + chalk.cyan(result.root))
26
+ console.log(chalk.bold(' Tx hash: ') + chalk.dim(result.txHash))
27
+ console.log()
28
+ console.log(chalk.dim(` Retrieve with: orbit retrieve ${result.root} ./output`))
29
+ } catch (err) {
30
+ spinner.fail(chalk.red('Upload failed'))
31
+ console.error(chalk.dim(` ${formatError(err)}`))
32
+ process.exit(1)
33
+ }
34
+ }
35
+
36
+ interface StoreDataOpts {
37
+ network: string
38
+ tags?: string
39
+ replicas: string
40
+ }
41
+
42
+ export async function storeDataCommand(text: string, opts: StoreDataOpts) {
43
+ const spinner = ora('Connecting to 0G...').start()
44
+
45
+ try {
46
+ const orbit = await connectOrbit(opts.network)
47
+ spinner.text = 'Uploading data...'
48
+
49
+ const result = await orbit.storeData(text, {
50
+ tags: opts.tags,
51
+ replicas: parseInt(opts.replicas, 10),
52
+ })
53
+
54
+ spinner.succeed('Upload complete')
55
+ console.log()
56
+ console.log(chalk.bold(' Root hash: ') + chalk.cyan(result.root))
57
+ console.log(chalk.bold(' Tx hash: ') + chalk.dim(result.txHash))
58
+ console.log()
59
+ console.log(chalk.dim(` Retrieve with: orbit retrieve ${result.root} ./output`))
60
+ } catch (err) {
61
+ spinner.fail(chalk.red('Upload failed'))
62
+ console.error(chalk.dim(` ${formatError(err)}`))
63
+ process.exit(1)
64
+ }
65
+ }
66
+
67
+ interface RetrieveOpts {
68
+ network: string
69
+ proof?: boolean
70
+ }
71
+
72
+ export async function retrieveCommand(
73
+ rootHash: string,
74
+ output: string,
75
+ opts: RetrieveOpts
76
+ ) {
77
+ const spinner = ora('Connecting to 0G...').start()
78
+
79
+ try {
80
+ const orbit = await connectOrbit(opts.network)
81
+ spinner.text = `Downloading to ${output}...`
82
+
83
+ await orbit.retrieve(rootHash, output, { proof: opts.proof })
84
+
85
+ spinner.succeed(`Downloaded to ${output}`)
86
+ } catch (err) {
87
+ spinner.fail(chalk.red('Download failed'))
88
+ console.error(chalk.dim(` ${formatError(err)}`))
89
+ process.exit(1)
90
+ }
91
+ }
@@ -0,0 +1,21 @@
1
+ import { Orbit, OrbitError } from '0g-orbit-core'
2
+ import type { NetworkName } from '0g-orbit-core'
3
+ import chalk from 'chalk'
4
+
5
+ export async function connectOrbit(network: string): Promise<Orbit> {
6
+ return Orbit.connect({
7
+ network: network as NetworkName,
8
+ })
9
+ }
10
+
11
+ export function formatError(err: unknown): string {
12
+ if (err instanceof OrbitError) {
13
+ let msg = err.message
14
+ if (err.suggestion) {
15
+ msg += '\n ' + chalk.yellow('Hint: ') + err.suggestion
16
+ }
17
+ return msg
18
+ }
19
+ if (err instanceof Error) return err.message
20
+ return String(err)
21
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "rootDir": "./src"
6
+ },
7
+ "include": ["src/**/*"]
8
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "0g-orbit-core",
3
+ "version": "0.1.0",
4
+ "description": "Unified SDK for 0G — storage, compute, and chain in one interface.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "test": "vitest run",
17
+ "test:watch": "vitest",
18
+ "lint": "tsc --noEmit",
19
+ "clean": "rm -rf dist"
20
+ },
21
+ "dependencies": {
22
+ "@0gfoundation/0g-ts-sdk": "^1.0.1",
23
+ "@0glabs/0g-serving-broker": "^0.7.4",
24
+ "ethers": "^6.13.1"
25
+ },
26
+ "devDependencies": {
27
+ "typescript": "^5.4.0",
28
+ "vitest": "^1.6.0"
29
+ },
30
+ "keywords": ["0g", "blockchain", "ai", "storage", "inference"],
31
+ "license": "MIT",
32
+ "engines": {
33
+ "node": ">=18.0.0"
34
+ }
35
+ }
@@ -0,0 +1,99 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import {
3
+ OrbitError,
4
+ ConnectionError,
5
+ StorageError,
6
+ InferenceError,
7
+ InsufficientBalanceError,
8
+ ProviderNotFoundError,
9
+ TimeoutError,
10
+ } from './errors.js'
11
+
12
+ describe('OrbitError', () => {
13
+ it('has code and suggestion', () => {
14
+ const err = new OrbitError('test', 'TEST_CODE', 'try this')
15
+ expect(err.message).toBe('test')
16
+ expect(err.code).toBe('TEST_CODE')
17
+ expect(err.suggestion).toBe('try this')
18
+ expect(err.name).toBe('OrbitError')
19
+ expect(err).toBeInstanceOf(Error)
20
+ })
21
+
22
+ it('suggestion is optional', () => {
23
+ const err = new OrbitError('test', 'CODE')
24
+ expect(err.suggestion).toBeUndefined()
25
+ })
26
+ })
27
+
28
+ describe('ConnectionError', () => {
29
+ it('has default suggestion', () => {
30
+ const err = new ConnectionError('failed')
31
+ expect(err.code).toBe('CONNECTION_ERROR')
32
+ expect(err.suggestion).toContain('RPC')
33
+ })
34
+
35
+ it('accepts custom suggestion', () => {
36
+ const err = new ConnectionError('failed', 'custom hint')
37
+ expect(err.suggestion).toBe('custom hint')
38
+ })
39
+ })
40
+
41
+ describe('StorageError', () => {
42
+ it('has default suggestion', () => {
43
+ const err = new StorageError('upload broke')
44
+ expect(err.code).toBe('STORAGE_ERROR')
45
+ expect(err.suggestion).toContain('file exists')
46
+ })
47
+ })
48
+
49
+ describe('InferenceError', () => {
50
+ it('has default suggestion', () => {
51
+ const err = new InferenceError('inference broke')
52
+ expect(err.code).toBe('INFERENCE_ERROR')
53
+ expect(err.suggestion).toContain('listServices')
54
+ })
55
+ })
56
+
57
+ describe('InsufficientBalanceError', () => {
58
+ it('includes required and available amounts', () => {
59
+ const err = new InsufficientBalanceError(1.5, 0.1)
60
+ expect(err.required).toBe(1.5)
61
+ expect(err.available).toBe(0.1)
62
+ expect(err.message).toContain('1.5')
63
+ expect(err.message).toContain('0.1')
64
+ expect(err.suggestion).toContain('faucet')
65
+ })
66
+ })
67
+
68
+ describe('ProviderNotFoundError', () => {
69
+ it('has suggestion about listServices', () => {
70
+ const err = new ProviderNotFoundError('No provider for model "gpt-5"')
71
+ expect(err.message).toContain('gpt-5')
72
+ expect(err.suggestion).toContain('listServices')
73
+ })
74
+ })
75
+
76
+ describe('TimeoutError', () => {
77
+ it('has timeout-specific suggestion', () => {
78
+ const err = new TimeoutError('timed out after 30s')
79
+ expect(err.code).toBe('TIMEOUT')
80
+ expect(err.suggestion).toContain('timeout')
81
+ })
82
+ })
83
+
84
+ describe('error hierarchy', () => {
85
+ it('all errors are instanceof OrbitError and Error', () => {
86
+ const errors = [
87
+ new ConnectionError('a'),
88
+ new StorageError('b'),
89
+ new InferenceError('c'),
90
+ new InsufficientBalanceError(1, 0),
91
+ new ProviderNotFoundError('d'),
92
+ new TimeoutError('e'),
93
+ ]
94
+ for (const err of errors) {
95
+ expect(err).toBeInstanceOf(OrbitError)
96
+ expect(err).toBeInstanceOf(Error)
97
+ }
98
+ })
99
+ })
@@ -0,0 +1,79 @@
1
+ export class OrbitError extends Error {
2
+ constructor(
3
+ message: string,
4
+ public readonly code: string,
5
+ public readonly suggestion?: string
6
+ ) {
7
+ super(message)
8
+ this.name = 'OrbitError'
9
+ }
10
+ }
11
+
12
+ export class ConnectionError extends OrbitError {
13
+ constructor(message: string, suggestion?: string) {
14
+ super(
15
+ message,
16
+ 'CONNECTION_ERROR',
17
+ suggestion ?? 'Check your RPC URL and network connection. Try a different RPC endpoint with the rpcUrl option.'
18
+ )
19
+ this.name = 'ConnectionError'
20
+ }
21
+ }
22
+
23
+ export class StorageError extends OrbitError {
24
+ constructor(message: string, suggestion?: string) {
25
+ super(
26
+ message,
27
+ 'STORAGE_ERROR',
28
+ suggestion ?? 'Check that your file exists and you have sufficient OG balance for gas fees.'
29
+ )
30
+ this.name = 'StorageError'
31
+ }
32
+ }
33
+
34
+ export class InferenceError extends OrbitError {
35
+ constructor(message: string, suggestion?: string) {
36
+ super(
37
+ message,
38
+ 'INFERENCE_ERROR',
39
+ suggestion ?? 'Run orbit.listServices() to check available models and provider status.'
40
+ )
41
+ this.name = 'InferenceError'
42
+ }
43
+ }
44
+
45
+ export class InsufficientBalanceError extends OrbitError {
46
+ constructor(
47
+ public readonly required: number,
48
+ public readonly available: number
49
+ ) {
50
+ super(
51
+ `Insufficient balance: need ${required} OG but have ${available} OG`,
52
+ 'INSUFFICIENT_BALANCE',
53
+ 'Get testnet OG from the faucet: https://faucet.0g.ai'
54
+ )
55
+ this.name = 'InsufficientBalanceError'
56
+ }
57
+ }
58
+
59
+ export class ProviderNotFoundError extends OrbitError {
60
+ constructor(message: string) {
61
+ super(
62
+ message,
63
+ 'PROVIDER_NOT_FOUND',
64
+ 'Run orbit.listServices() to see available models and their providers.'
65
+ )
66
+ this.name = 'ProviderNotFoundError'
67
+ }
68
+ }
69
+
70
+ export class TimeoutError extends OrbitError {
71
+ constructor(message: string) {
72
+ super(
73
+ message,
74
+ 'TIMEOUT',
75
+ 'The request timed out. Try increasing the timeout option or check if the provider is responsive.'
76
+ )
77
+ this.name = 'TimeoutError'
78
+ }
79
+ }
@@ -0,0 +1,37 @@
1
+ // Main entry point
2
+ export { Orbit } from './orbit.js'
3
+
4
+ // Clients (for direct access)
5
+ export { StorageClient } from './storage.js'
6
+ export { InferenceClient } from './inference.js'
7
+
8
+ // Types
9
+ export type {
10
+ OrbitConfig,
11
+ StoreResult,
12
+ StoreOptions,
13
+ RetrieveOptions,
14
+ InferResult,
15
+ InferOptions,
16
+ ServiceInfo,
17
+ AccountStatus,
18
+ } from './types.js'
19
+
20
+ // Network config
21
+ export type { NetworkName, NetworkConfig } from './networks.js'
22
+ export { NETWORKS, getNetwork } from './networks.js'
23
+
24
+ // Retry utilities
25
+ export { withRetry, isTransientError } from './retry.js'
26
+ export type { RetryOptions } from './retry.js'
27
+
28
+ // Errors
29
+ export {
30
+ OrbitError,
31
+ ConnectionError,
32
+ StorageError,
33
+ InferenceError,
34
+ InsufficientBalanceError,
35
+ ProviderNotFoundError,
36
+ TimeoutError,
37
+ } from './errors.js'