X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/02cdaff8be27f37f44db8892bb12554f2d702323..37d5f21b23da5fbd6b44fed41f653927669571ed:/model.go diff --git a/model.go b/model.go index bd1258b..f15be22 100644 --- a/model.go +++ b/model.go @@ -45,7 +45,7 @@ var errModelCallLimit = errors.New("call limit reached") // OPENAI_API_KEY, and there is no fallback from one to the other. All clients // share the authorizer, so one refresh runs at a time. func modelEndpoint(config Config, dir string) (string, ModelAuthorizer, error) { - if config.Endpoint == endpointAPI { + if config.Endpoint == configEndpointAPI { key := os.Getenv("OPENAI_API_KEY") if key == "" { return "", nil, errors.New("endpoint api needs OPENAI_API_KEY") @@ -54,7 +54,7 @@ func modelEndpoint(config Config, dir string) (string, ModelAuthorizer, error) { return modelAPIURL, ModelAPIKey(key), nil } - return modelChatGPTURL, newChatGPTAuth(filepath.Join(dir, tokenFileName), authIssuer), nil + return modelChatGPTURL, newChatGPTAuth(filepath.Join(dir, chatgptTokenFileName), chatgptIssuer), nil } // newModelClient returns a client for the Responses endpoint at url. It records @@ -202,7 +202,7 @@ func (c *ModelClient) Create(ctx context.Context, request ModelRequest) (ModelRe return ModelResponse{}, fmt.Errorf("authorize model call: %w", err) } - _, chatgpt := c.auth.(*chatgptAuth) + _, chatgpt := c.auth.(*ChatGPTAuth) if chatgpt { httpRequest.Header.Set("session_id", c.cacheKey) } @@ -218,6 +218,7 @@ func (c *ModelClient) Create(ctx context.Context, request ModelRequest) (ModelRe } record.Turn = request.Turn + record.Agent = request.Agent response, err := c.send(httpRequest, &record) if err != nil { record.Error = err.Error() @@ -302,16 +303,18 @@ type ModelOutputItem struct { // ModelRequest is one model call. Input holds the input items in order, such as // modelUserMessage values or output items of an earlier response. Node names // the node that a compaction builds, or is nil. Turn names the request of a -// turn: first or next. Node and Turn go only to the usage file, never to the -// endpoint. +// turn: first or next. Agent names the subagent that makes the call, or is +// empty for a call of the agent itself. Node, Turn, and Agent go only to the +// usage file, never to the endpoint. type ModelRequest struct { Model string Effort string Instructions string Tools []ModelTool Input []any - Node *nodeKey + Node *NodeKey Turn string + Agent string } // ModelResponse is the result of a model call. Output holds the output items as @@ -342,14 +345,16 @@ type ModelReasoning struct { // ModelUsageRecord is one line of usage.jsonl. Date is the start of the call, // and Seconds its length. Node is the node [l, i] of a compaction. Status is // the HTTP status, or 0 when no response came. TextBytes is the size of the -// text of the reply. Turn names the request of a turn. Quota holds the -// x-codex-* headers of the response, without the turn state. +// text of the reply. Turn names the request of a turn. Agent names the subagent +// of the call. Quota holds the x-codex-* headers of the response, without the +// turn state. type ModelUsageRecord struct { Date string `json:"date"` Seconds float64 `json:"seconds"` Model string `json:"model"` Node *[2]int `json:"node,omitempty"` Turn string `json:"turn,omitempty"` + Agent string `json:"agent,omitempty"` Status int `json:"status"` InputTokens int `json:"input_tokens"` CachedTokens int `json:"cached_tokens"`