pinecall 0.0.6 → 0.0.8

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e3afca7edf6bc33bb5b6fc9ebed23d76eecac2bb6039fb243d252d379e509e50
4
- data.tar.gz: f3a39bb373fa2565bc6f49f04429d8f560dcc5cd8d01f9cc8d874f3ae452808d
3
+ metadata.gz: d385aad2e86c89ef8639d736478845f8eb2299d6eda64fb0dfbfa14ffd6ea15a
4
+ data.tar.gz: 04d630be1150261ec88676d98b120744f0c5b6ae5242145071e94d470b9da580
5
5
  SHA512:
6
- metadata.gz: bd6ea499f8cdbe11a9faf6e25715848c470755e8318705beee191db517446096866e79bd830c32ba77ed4c38c7da134ccdacf90ae973c7169d18baa5a58abd93
7
- data.tar.gz: 9ee25075169e9581cafd1c58a67eee8b47705cc82bbd3d6aa8568b1a35db6ac20039089bb72de8004bbd973772679725208c3fdca5d469a8b292b2de53badd63
6
+ metadata.gz: 5f84b1700e9b536be0b573bc7f6a41ae5e63fb8803e5c586adec62c7928958b82e54e154dfaf9a23a6d2f47591782040557f57f9f521d13415d99fae204ab9c8
7
+ data.tar.gz: b9b958f3c8ee08bc72f02c5f9fb1edd04a6e6e20520db20a3d85fa01d69471c0ddfe2589cbfe2aefd0126bb769918a3d512ec15344112cfe838ef5a848899082
data/CHANGELOG.md CHANGED
@@ -6,6 +6,22 @@ version number is the human's call.
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.0.8] — The wire reads evals.spent, call.started.expects and call.summary.run (2026-10-11)
10
+
11
+ - The wire reads `evals.spent` (what the harness asked a model — a judge tried, personas
12
+ written, a case group diagnosed — its evals counted), `call.started.expects` (what a simulated
13
+ caller expects, replacing `accepts_when`/`declines_when`), a
14
+ `call.summary`'s `run`, and `credits.exhausted` for every quota the runtime refuses for —
15
+ `hosted_apps`, `evals`, `simulations` and `budget_usd` were missing. Needs runtime 0.1.46.
16
+
17
+ ## [0.0.7] — Every judge is a model's answer, and the class names the judge's model (2026-10-10)
18
+
19
+ - `judge "<vendor>/<model>", builds:, options:`: the model the agent's calls are judged on, over
20
+ the org's choice and Pinecall's. On a key of the org's own — a local model through
21
+ `options: { base_url: "…" }` among them — its evals are never billed.
22
+ - The wire reads what the runtime now writes: a judge's `na` and `classified` answers with their
23
+ `choice` or `score`, `call.score`'s `evals` and `own_key`, and `call.summary`'s `simulated`.
24
+
9
25
  ## [0.0.6] — A greeting is words or :improvise, a hangup is words or true, and the ears choose who ends the turn (2026-10-10)
10
26
 
11
27
  - `greeting "…"` (said as written), `greeting :improvise` (the model opens on its prompt) and
@@ -13,7 +13,7 @@ module Pinecall
13
13
  AS_WRITTEN = %i[phone whatsapp web channel_rules].freeze
14
14
 
15
15
  # The settings a class may declare. Must match the TypeScript package's `ENVIRONMENT`.
16
- ENVIRONMENT = %i[language voice llm stt greeting hangup turn says hears knowledge docs memory record].freeze
16
+ ENVIRONMENT = %i[language voice llm stt judge greeting hangup turn says hears knowledge docs memory record].freeze
17
17
 
18
18
  # The ones written as the wire's own fields, keyword by keyword: `greeting say: "…"`.
19
19
  AS_KEYWORDS = %i[turn knowledge docs memory].freeze
@@ -90,6 +90,16 @@ module Pinecall
90
90
  environment[:stt] = { **Config.model_of(model), builds:, options:, end_of_turn: ends }.compact
91
91
  end
92
92
 
93
+ # The model the agent's calls are judged on, over the org's choice and the platform's:
94
+ # `judge "openai/qwen3-32b", options: { base_url: "http://gpu:8000/v1" }`. On a key of the
95
+ # org's own, a local model's server among them, its evals are never billed; `builds` and
96
+ # `options` run on the org's own key alone.
97
+ def judge(model = NOTHING, builds: nil, options: nil)
98
+ return environment[:judge] if model.equal?(NOTHING)
99
+
100
+ environment[:judge] = { **Config.model_of(model), builds:, options: }.compact
101
+ end
102
+
93
103
  # How a call opens: the words, said as written, or :improvise for the model's own. The
94
104
  # caller cannot cut it short unless `interruptible: true`.
95
105
  def greeting(opening = NOTHING, interruptible: nil)
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Pinecall
4
4
  # Set by the maintainer at release time.
5
- VERSION = "0.0.6"
5
+ VERSION = "0.0.8"
6
6
  end
@@ -34,9 +34,10 @@ module Pinecall
34
34
  # Whose action ended the call. platform covers timeouts, errors and a drained worker.
35
35
  ENDED_BY = %w[caller agent supervisor platform].freeze
36
36
  # What one judge answered about a finished call. Held: the rule held. Broken: it did not,
37
- # and the reason names the evidence. Deferred: the judge was asked and could not settle it.
38
- # Skipped: nobody asked it — no model was reachable inside the call's judging budget.
39
- SCORE_VERDICT = %w[held broken deferred skipped].freeze
37
+ # and the reason names the evidence. Classified: a choice or a score was answered. N/A: the
38
+ # question did not apply. Deferred: the judge was asked and could not settle it. Skipped:
39
+ # nobody asked it — no model, the ceiling reached, or the org's evals used up.
40
+ SCORE_VERDICT = %w[held broken classified na deferred skipped].freeze
40
41
  # Cold: the caller is sent on with a REFER on their SIP leg and the call ends here. Warm:
41
42
  # the number is dialled into the call's own room, the agent stays on the line until the
42
43
  # other side answers and then falls silent; the call ends when either of them hangs up.
@@ -34,6 +34,7 @@ module Pinecall
34
34
  "confirm.granted" => "ConfirmGranted",
35
35
  "confirm.request" => "ConfirmRequest",
36
36
  "credits.exhausted" => "CreditsExhausted",
37
+ "evals.spent" => "EvalsSpent",
37
38
  "custom" => "Custom",
38
39
  "dev.request" => "DevRequest",
39
40
  "docs.sources" => "DocsSources",
@@ -118,7 +119,7 @@ module Pinecall
118
119
  }.freeze
119
120
 
120
121
  # Every event this protocol declares, in the schema's own order.
121
- EVENT_TYPES = %w[agent.configured agent.detached agent.draining agent.registered agent.state agent.transcript attention.answered attention.requested call.attached call.claimed call.dialing call.ended call.line call.ringing call.score call.started call.summary call.transferred callback.requested code.claimed code.issued confirm.declined confirm.granted confirm.request credits.exhausted custom dev.request docs.sources dtmf.received error event.received fleet.full log.caught_up log.gap memory.ops message.taken message.waiting metrics.avatar metrics.eot metrics.eou metrics.interruption metrics.llm metrics.realtime metrics.stt metrics.tts metrics.vad participant.joined participant.left participant.speaking pong prompt.changed room.opened room.sent spend.unusual state.changed supervisor.ended supervisor.released supervisor.said supervisor.took_over supervisor.transferred supervisor.whispered tool.call tool.result tools.changed track.published track.unpublished turn.agent turn.user user.state user.transcript vendor.switched].freeze
122
+ EVENT_TYPES = %w[agent.configured agent.detached agent.draining agent.registered agent.state agent.transcript attention.answered attention.requested call.attached call.claimed call.dialing call.ended call.line call.ringing call.score call.started call.summary call.transferred callback.requested code.claimed code.issued confirm.declined confirm.granted confirm.request credits.exhausted custom dev.request docs.sources dtmf.received error evals.spent event.received fleet.full log.caught_up log.gap memory.ops message.taken message.waiting metrics.avatar metrics.eot metrics.eou metrics.interruption metrics.llm metrics.realtime metrics.stt metrics.tts metrics.vad participant.joined participant.left participant.speaking pong prompt.changed room.opened room.sent spend.unusual state.changed supervisor.ended supervisor.released supervisor.said supervisor.took_over supervisor.transferred supervisor.whispered tool.call tool.result tools.changed track.published track.unpublished turn.agent turn.user user.state user.transcript vendor.switched].freeze
122
123
 
123
124
  # Every command an app may send.
124
125
  COMMAND_TYPES = %w[agent.configure agent.drain agent.register agent.reply agent.say call.attention call.callback call.claim call.dial call.dtmf call.event call.hangup call.hold call.log call.mute call.opt_out call.transfer call.unhold call.unmute dev.answer participant.mute participant.remove ping prompt.set room.invite room.send session.configure state.set supervisor.verb tool.result tools.set].freeze
@@ -81,6 +81,8 @@ module Pinecall
81
81
  judges: { kind: :list, items: { kind: :ref, ref: "Judgment" }, required: true },
82
82
  panel: { kind: :list, items: { kind: :str } },
83
83
  judge_calls: { kind: :int, required: true },
84
+ evals: { kind: :int },
85
+ own_key: { kind: :bool },
84
86
  judge_cost_usd: { kind: :float },
85
87
  judged_by: { kind: :ref, ref: "JudgedBy" }
86
88
  }.freeze,
@@ -91,8 +93,7 @@ module Pinecall
91
93
  to: { kind: :str, required: true },
92
94
  run: { kind: :str, null: true },
93
95
  persona: { kind: :str, null: true },
94
- accepts_when: { kind: :str, null: true },
95
- declines_when: { kind: :str, null: true },
96
+ expects: { kind: :list, items: { kind: :str }, null: true },
96
97
  caller: { kind: :ref, null: true, ref: "Contact", required: true },
97
98
  started_at: { kind: :float, required: true },
98
99
  env: { kind: :ref, ref: "Env" },
@@ -108,7 +109,9 @@ module Pinecall
108
109
  turns: { kind: :int, required: true },
109
110
  usage: { kind: :list, items: { kind: :ref, ref: "ModelUsage" }, required: true },
110
111
  cost: { kind: :ref, ref: "Cost", required: true },
111
- recording: { kind: :str }
112
+ recording: { kind: :str },
113
+ simulated: { kind: :bool },
114
+ run: { kind: :str, null: true }
112
115
  }.freeze,
113
116
  "CallTransferred" => {
114
117
  to: { kind: :str, required: true },
@@ -23,6 +23,7 @@ module Pinecall
23
23
  voice: { kind: :ref, ref: "VoiceConfig" },
24
24
  llm: { kind: :ref, ref: "ModelConfig" },
25
25
  stt: { kind: :ref, ref: "ModelConfig" },
26
+ judge: { kind: :ref, ref: "ModelConfig" },
26
27
  turn: { kind: :ref, ref: "TurnConfig" },
27
28
  says: { kind: :list, items: { kind: :ref, ref: "Pronunciation" } },
28
29
  hears: { kind: :list, items: { kind: :str } },
@@ -213,10 +213,20 @@ module Pinecall
213
213
  }.freeze,
214
214
  "CreditsExhausted" => {
215
215
  org: { kind: :str, required: true },
216
- quota: { kind: :enum, values: %w[minutes messages agents concurrent_calls memory_facts knowledge_chunks numbers seats llm_tokens], required: true },
216
+ quota: { kind: :enum, values: %w[minutes messages agents concurrent_calls memory_facts knowledge_chunks numbers seats llm_tokens hosted_apps evals simulations budget_usd], required: true },
217
217
  used: { kind: :float, required: true },
218
218
  limit: { kind: :int, required: true }
219
219
  }.freeze,
220
+ "EvalsSpent" => {
221
+ kind: { kind: :enum, values: %w[try generate propose], required: true },
222
+ name: { kind: :str, required: true },
223
+ env: { kind: :ref, ref: "Env", required: true },
224
+ calls: { kind: :list, items: { kind: :str }, required: true },
225
+ evals: { kind: :int, required: true },
226
+ judge_calls: { kind: :int, required: true },
227
+ judge_cost_usd: { kind: :float, null: true },
228
+ own_key: { kind: :bool }
229
+ }.freeze,
220
230
  "Custom" => {
221
231
  name: { kind: :str, required: true },
222
232
  data: { kind: :json, required: true }
@@ -318,7 +318,9 @@ module Pinecall
318
318
  verdict: { kind: :ref, ref: "ScoreVerdict", required: true },
319
319
  criteria: { kind: :str, required: true },
320
320
  reason: { kind: :str, required: true },
321
- evidence: { kind: :ref, ref: "JudgmentEvidence", required: true }
321
+ evidence: { kind: :ref, ref: "JudgmentEvidence", required: true },
322
+ choice: { kind: :str, null: true },
323
+ score: { kind: :int, null: true }
322
324
  }.freeze,
323
325
  "JudgmentEvidence" => {
324
326
  seqs: { kind: :list, items: { kind: :int }, required: true },
data/sig/pinecall.rbs CHANGED
@@ -88,6 +88,7 @@ module Pinecall
88
88
  def self.voice: (?String, ?String?, ?model: String?, ?builds: String?, ?options: Hash[untyped, untyped]?) -> untyped
89
89
  def self.llm: (?String, ?temperature: Float?, ?builds: String?, ?options: Hash[untyped, untyped]?) -> untyped
90
90
  def self.stt: (?String, ?builds: String?, ?options: Hash[untyped, untyped]?, ?end_of_turn: (String | Symbol)?) -> untyped
91
+ def self.judge: (?String, ?builds: String?, ?options: Hash[untyped, untyped]?) -> untyped
91
92
  def self.language: (?String) -> untyped
92
93
  def self.says: (?Array[Hash[Symbol, String]]) -> untyped
93
94
  def self.record: (?bool) -> untyped
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pinecall
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pinecall